【数论】欧拉函数与欧拉定理

本文深入探讨了欧拉函数的定义、性质及计算方法,包括欧拉函数的计算公式、积性函数特性、费马小定理与欧拉定理的应用,并提供了具体的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更新于2021年7月

欧拉函数

对于一个正整数xxx,小于xxx且和xxx互质的正整数的个数,记做φ(x)\varphi(x)φ(x)。其中φ(1)\varphi(1)φ(1)被定义为111

性质1:ppp是质数,则

φ(pa)=pa−pa−1=pa(1−1p)\varphi(p^a)=p^a-p^{a-1}=p^a(1-\dfrac 1p)φ(pa)=papa1=pa(1p1)

特别地,φ(p)=p−1\varphi(p)=p-1φ(p)=p1

证明: 由于大于111的数不可能与它本身互质,所以定义中的“小于”完全可以改成“小于等于”。只需从小于等于pap^apapap^apa个正整数中减去与pap^apa不互质的数,即含有质因数ppp的数,即ppp的倍数。而这样的数有pap=pa−1\dfrac{p^a}p=p^{a-1}ppa=pa1个。

性质2:p,qp,qp,q是质数,则

φ(paqb)=φ(pa)φ(qb)\varphi\left(p^aq^b\right)=\varphi\left(p^a\right)\varphi\left(q^b\right)φ(paqb)=φ(pa)φ(qb)

证明: 小于等于paqbp^aq^bpaqb的正整数中与paqbp^aq^bpaqb不互质的数要么是ppp的倍数(有pa−1qbp^{a-1}q^bpa1qb个),要么是qqq的倍数(有paqb−1p^aq^{b-1}paqb1个),且重复的数是pqpqpq的倍数(有pa−1qb−1p^{a-1}q^{b-1}pa1qb1个),所以

φ(paqb)=paqb−pa−1qb−paqb−1+pa−1qb−1=paqb(1−1p)(1−1q)=φ(pa)φ(qb)\begin{aligned} \varphi\left(p^aq^b\right)&=p^aq^b-p^{a-1}q^b-p^aq^{b-1}+p^{a-1}q^{b-1}\\ &=p^aq^b\left(1-\dfrac 1p\right)\left(1-\dfrac 1q\right)\\ &=\varphi\left(p^a\right)\varphi\left(q^b\right) \end{aligned}φ(paqb)=paqbpa1qbpaqb1+pa1qb1=paqb(1p1)(1q1)=φ(pa)φ(qb)

该性质很容易推广到多个质数的情况。设xxx的质因数分解为x=p1a1p2a2⋯pkakx=p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}x=p1a1p2a2pkak,则

φ(x)=x−∑1⩽i⩽kxpi+∑1⩽i<j⩽kxpipj−⋯+(−1)kxp1p2⋯pk=x(1−∑1⩽i⩽k1pi+∑1⩽i<j⩽k1pipj−⋯+(−1)k1p1p2⋯pk)=x(1−1p1)(1−1p2)⋯(1−1pk)=p1a1p2a2⋯pkak(1−1p1)(1−1p2)⋯(1−1pk)=φ(p1a1)φ(p2a2)⋯φ(pkak)\begin{aligned} \varphi(x)&=x-\sum_{1\leqslant i\leqslant k}\dfrac x{p_i}+\sum_{1\leqslant i<j\leqslant k}\dfrac x{p_ip_j}-\cdots+(-1)^k\dfrac x{p_1p_2\cdots p_k}\\ &=x\left(1-\sum_{1\leqslant i\leqslant k}\dfrac 1{p_i}+\sum_{1\leqslant i<j\leqslant k}\dfrac 1{p_ip_j}-\cdots+(-1)^k\dfrac 1{p_1p_2\cdots p_k}\right)\\ &=x\left(1-\dfrac 1{p_1}\right)\left(1-\dfrac 1{p_2}\right)\cdots\left(1-\dfrac 1{p_k}\right)\\ &=p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}\left(1-\dfrac 1{p_1}\right)\left(1-\dfrac 1{p_2}\right)\cdots\left(1-\dfrac 1{p_k}\right)\\ &=\varphi\left(p_1^{a_1}\right)\varphi\left(p_2^{a_2}\right)\cdots\varphi\left(p_k^{a_k}\right) \end{aligned}φ(x)=x1ikpix+1i<jkpipjx+(1)kp1p2pkx=x11ikpi1+1i<jkpipj1+(1)kp1p2pk1=x(1p11)(1p21)(1pk1)=p1a1p2a2pkak(1p11)(1p21)(1pk1)=φ(p1a1)φ(p2a2)φ(pkak)

由此得到了欧拉函数的计算式:

φ(x)=x∏p∣x(1−1p)\varphi(x)=x\prod_{p\vert x}\left(1-\dfrac 1p\right)φ(x)=xpx(1p1)

由于xxx最多只有一个大于x\sqrt xx的质因数(否则质因数乘积就超过了xxx),因此只需枚举x\sqrt xx以内的质因数,若有大于x\sqrt xx的质因数再特殊处理。每次枚举到一个质因数iii,将xxx中的质因数iii除尽,保证枚举的下一个因数仍是质因数。

int phi(int x){
  int ans=x;
  for(int i=2;i*i<=x;i++)if(!(x%i)){
    ans-=ans/i;
    while(!(x%i))x/=i;
  }
  if(x>1)ans-=ans/x;
  return ans;
}

埃氏筛

先将所有的数标记为质数。从小到大讨论,若iii是质数,则iii的倍数全部标记为合数。

对于一个合数,在讨论其每一个质因数时都会标记到该合数,这就间接实现了枚举质因数的过程,可以据此用来求欧拉函数:先设φ(i)=i\varphi(i)=iφ(i)=i,若iii是质数,根据欧拉函数的计算式,iii的倍数的函数值全部乘以1−1i1-\dfrac 1i1i1

时间复杂度:O(nlog⁡log⁡n)O(n\log\log n)O(nloglogn)

void make_prime(bool*mk,int n){
  memset(mk,0,sizeof(mk));mk[1]=1;
  for(int i=2;i<=n;i++)if(!mk[i])
    for(int j=i+i;j<=n;j+=i)mk[j]=1;
}
void make_phi(int*phi,int n){
  for(int i=1;i<=n;i++)phi[i]=i;
  for(int i=2;i<=n;i++)if(phi[i]==i)
    for(int j=i;j<=n;j+=i)phi[j]=phi[j]/i*(i-1);
}

线性筛

欧拉筛(线性筛)保证每个合数仅被它的最小质因数筛去正好一次。用当前的iii按从小到大的顺序依次乘以已筛出的质数ppp来标记合数,当i mod p=0i\bmod p=0imodp=0时,说明iii中含有质因数ppp,则iii乘以更大的质数p′p'p得到新的合数i⋅p′i\cdot p'ip时,其最小质因数就不是p′p'p而是ppp,这个合数应该在i′=i⋅p′pi'=\dfrac{i\cdot p'}pi=pip时筛去。因此在i mod p=0i\bmod p=0imodp=0时,就不再用当前的iii标记合数,而是进入下一层循环。

线性筛并没有枚举出所有的质因数,因此不能根据计算式求欧拉函数,需要利用欧拉函数的另一些性质。

性质3: 欧拉函数是积性函数。(若x,yx,yx,y互质,则φ(xy)=φ(x)φ(y)\varphi(xy)=\varphi(x)\varphi(y)φ(xy)=φ(x)φ(y)。)

证明: 因为x,yx,yx,y互质,所以x,yx,yx,y没有公共质因数。设x=p1a1p2a2⋯pk1ak1x=p_1^{a_1}p_2^{a_2}\cdots p_{k_1}^{a_{k_1}}x=p1a1p2a2pk1ak1y=pk1+1ak1+1pk1+2ak1+2⋯pk1+k2ak1+k2y=p_{k_1+1}^{a_{k_1+1}}p_{k_1+2}^{a_{k_1+2}}\cdots p_{k_1+k_2}^{a_{k_1+k_2}}y=pk1+1ak1+1pk1+2ak1+2pk1+k2ak1+k2,则

φ(xy)=φ(p1a1p2a2⋯pk1ak1pk1+1ak1+1pk1+2ak1+2⋯pk1+k2ak1+k2)=φ(p1a1)φ(p2a2)⋯φ(pk1ak1)φ(pk1+1ak1+1)φ(pk1+2ak1+2)⋯φ(pk1+k2ak1+k2)=φ(p1a1p2a2⋯pk1ak1)φ(pk1+1ak1+1pk1+2ak1+2⋯pk1+k2ak1+k2)=φ(x)φ(y)\begin{aligned} \varphi(xy)&=\varphi\left(p_1^{a_1}p_2^{a_2}\cdots p_{k_1}^{a_{k_1}}p_{k_1+1}^{a_{k_1+1}}p_{k_1+2}^{a_{k_1+2}}\cdots p_{k_1+k_2}^{a_{k_1+k_2}}\right)\\ &=\varphi\left(p_1^{a_1}\right)\varphi\left(p_2^{a_2}\right)\cdots\varphi\left(p_{k_1}^{a_{k_1}}\right)\varphi\left(p_{k_1+1}^{a_{k_1+1}}\right)\varphi\left(p_{k_1+2}^{a_{k_1+2}}\right)\cdots\varphi\left(p_{k_1+k_2}^{a_{k_1+k_2}}\right)\\ &=\varphi\left(p_1^{a_1}p_2^{a_2}\cdots p_{k_1}^{a_{k_1}}\right)\varphi\left(p_{k_1+1}^{a_{k_1+1}}p_{k_1+2}^{a_{k_1+2}}\cdots p_{k_1+k_2}^{a_{k_1+k_2}}\right)\\ &=\varphi(x)\varphi(y) \end{aligned}φ(xy)=φ(p1a1p2a2pk1ak1pk1+1ak1+1pk1+2ak1+2pk1+k2ak1+k2)=φ(p1a1)φ(p2a2)φ(pk1ak1)φ(pk1+1ak1+1)φ(pk1+2ak1+2)φ(pk1+k2ak1+k2)=φ(p1a1p2a2pk1ak1)φ(pk1+1ak1+1pk1+2ak1+2pk1+k2ak1+k2)=φ(x)φ(y)

性质4:ppp是质数,则

φ(xp)={φ(x)px mod p=0φ(x)(p−1)x mod p≠0\varphi(xp)=\begin{cases} \varphi(x)p&x\bmod p=0\\ \varphi(x)(p-1)&x\bmod p\neq 0 \end{cases}φ(xp)={φ(x)pφ(x)(p1)xmodp=0xmodp=0

证明:

  • x mod p=0x\bmod p=0xmodp=0时,xxx一定可以表示成x=kpax=kp^ax=kpa,其中k,pk,pk,p互质,则

    φ(xp)=φ(k)φ(pa+1)=φ(k)⋅pa+1(1−1p)φ(x)p=φ(k)φ(pa)p=φ(k)⋅pa(1−1p)p\begin{aligned} \varphi(xp)&=\varphi(k)\varphi(p^{a+1})=\varphi(k)\cdot p^{a+1}\left(1-\dfrac 1p\right)\\ \varphi(x)p&=\varphi(k)\varphi(p^a)p=\varphi(k)\cdot p^a\left(1-\dfrac 1p\right)p \end{aligned}φ(xp)φ(x)p=φ(k)φ(pa+1)=φ(k)pa+1(1p1)=φ(k)φ(pa)p=φ(k)pa(1p1)p

    于是φ(xp)=φ(x)p\varphi(xp)=\varphi(x)pφ(xp)=φ(x)p

  • x mod p≠0x\bmod p\neq 0xmodp=0时,x,px,px,p互质,所以

    φ(xp)=φ(x)φ(p)=φ(x)(p−1)\varphi(xp)=\varphi(x)\varphi(p)=\varphi(x)(p-1)φ(xp)=φ(x)φ(p)=φ(x)(p1)

时间复杂度:O(n)O(n)O(n)

void make_prime(bool*mk,int*p,int n){
  memset(mk,0,sizeof(mk));mk[1]=1;
  for(int i=2;i<=n;i++){
    if(!mk[i])p[++tot]=i;
    for(int j=1;j<=tot&&i*p[j]<=n;j++){
      mk[i*p[j]]=1;
      if(!(i%p[j]))break;
    }
  }
}
void make_phi(int*phi,bool*mk,int*p,int n){
  memset(mk,0,sizeof(mk));mk[1]=phi[1]=1;
  for(int i=2;i<=n;i++){
    if(!mk[i])p[++tot]=i,phi[i]=i-1;
    for(int j=1;j<=tot&&i*p[j]<=n;j++){
      mk[i*p[j]]=1;
      if(i%p[j])phi[i*p[j]]=phi[i]*(p[j]-1);
      else{phi[i*p[j]]=phi[i]*p[j];break;}
    }
  }
}

GCD的个数(NKOJ 3684)

问题描述
给定两个正整数nnn,mmm, 求满足下列两个条件的xxx的个数:
条件1:1⩽x⩽n1\leqslant x\leqslant n1xn
条件2:gcd(x,n)⩾mgcd(x,n)\geqslant mgcd(x,n)m

输入格式
一行,两个整数nnnmmm

输出格式
一行,一个整数,表示所求结果

样例输入
10 2

样例输出
6

提示
2⩽n⩽1000000000,1⩽m⩽N2\leqslant n\leqslant 1000000000,1\leqslant m\leqslant N2n1000000000,1mN

先考虑满足x⩽nx\leqslant nxngcd(x,n)=dgcd(x,n)=dgcd(x,n)=dxxx的个数,显然gcd(xd,nd)=1gcd(\frac xd,\frac nd)=1gcd(dx,dn)=1
∴xd\therefore\dfrac xddx⌊nd⌋\left\lfloor\dfrac nd\right\rfloordn内的与⌊nd⌋\left\lfloor\dfrac nd\right\rfloordn互质的数,总共有φ(⌊nd⌋)\varphi\left(\left\lfloor\dfrac nd\right\rfloor\right)φ(dn)个。
于是只需枚举nnn的因数ddd,当d⩾md\geqslant mdm时答案增加φ(⌊nd⌋)\varphi\left(\left\lfloor\dfrac nd\right\rfloor\right)φ(dn)。由于nnn较大,可以把枚举量减少到n\sqrt nn。特殊情况特殊处理。

#include<cstdio>
typedef long long LL;
LL phi(LL x){
  LL ans=x;
  for(LL i=2;i*i<=x;i++)if(!(x%i)){
    ans=ans-ans/i;
  	while(!(x%i))x=x/i;
  }
  if(x>1)ans=ans-ans/x;
  return ans;
}
int main(){
  LL n,m,ans=0;
  scanf("%lld%lld",&n,&m);
  for(LL d=1;d*d<=n;d++){
    if(d>=m&&!(n%d))ans+=phi(n/d);
    if(d*d<n&&!(n%d)&&n/d>=m)ans+=phi(d);
  }
  printf("%lld\n",ans);
  return 0;
}

费马小定理

如果ppp是素数,且a,pa,pa,p互质,那么

ap−1≡1(modp)a^{p-1}\equiv1\pmod pap11(modp)

证明: 假设有这样p−1p-1p1个正整数,其中每个数都小于ppp,且两两不相同。显然这些数为

1,2,…,p−1(1)1,2,\dots,p-1\tag 11,2,,p1(1)

再考虑下面这p−1p-1p1个数:

a mod p,2a mod p,3a mod p,…,(p−1)a mod p(2)a\bmod p,2a\bmod p,3a\bmod p,\dots,(p-1)a\bmod p\tag 2amodp,2amodp,3amodp,,(p1)amodp(2)

1⩽i⩽p−11\leqslant i\leqslant p-11ip1时,a,ia,ia,i都与ppp互质,因此ia mod p≠0ia\bmod p\neq 0iamodp=0(2)(2)(2)中的数都是小于ppp的正整数。

假设存在1⩽i<j⩽p−11\leqslant i<j\leqslant p-11i<jp1,使得ia mod p=ja mod pia\bmod p=ja\bmod piamodp=jamodp,则(j−i)a mod p=0(j-i)a\bmod p=0(ji)amodp=0,而a,j−ia,j-ia,jippp互质,该式不成立。故(2)(2)(2)中的数两两不相同。

于是(1)(2)(1)(2)(1)(2)完全相同,则它们的乘积也相同,即

(p−1)!≡(p−1)!ap−1(modp)ap−1≡1(modp)\begin{aligned} (p-1)!&\equiv(p-1)!a^{p-1}&\pmod p\\ a^{p-1}&\equiv 1&\pmod p \end{aligned}(p1)!ap1(p1)!ap11(modp)(modp)

欧拉定理

费马小定理是欧拉定理的一种特殊情况。
a,na,na,n为正整数,且a,na,na,n互质,那么:

aφ(n)≡1(modn)a^{\varphi(n)}\equiv1\pmod naφ(n)1(modn)

证明: 证明过程与费马小定理类似。假设小于nnn且与nnn互质的正整数为

x1,x2,…,xφ(n)(3)x_1,x_2,\dots,x_{\varphi(n)}\tag 3x1,x2,,xφ(n)(3)

又有

ax1 mod n,ax2 mod n,…,axφ(n) mod n(4)ax_1\bmod n,ax_2\bmod n,\dots,ax_{\varphi(n)}\bmod n\tag 4ax1modn,ax2modn,,axφ(n)modn(4)

因为a,xia,x_ia,xi都与nnn互质,所以axi mod n≠0ax_i\bmod n\neq 0aximodn=0(4)(4)(4)中的数都是小于nnn的正整数。

假设存在1⩽i<j⩽φ(n)1\leqslant i<j\leqslant\varphi(n)1i<jφ(n),使得axi mod n=axj mod nax_i\bmod n=ax_j\bmod naximodn=axjmodn,则a(xj−xi) mod n=0a(x_j-x_i)\bmod n=0a(xjxi)modn=0,而a,xi,xja,x_i,x_ja,xi,xjnnn互质,该式不成立。故(4)(4)(4)中的数两两不相同。

同理将(3)(4)(3)(4)(3)(4)中的数分别相乘得

x1x2⋯xφ(n)≡x1x2⋯xφ(n)aφ(n)(modn)aφ(n)≡1(modn)\begin{aligned} x_1x_2\cdots x_{\varphi(n)}&\equiv x_1x_2\cdots x_{\varphi(n)}a^{\varphi(n)}&\pmod n\\ a^{\varphi(n)}&\equiv 1&\pmod n \end{aligned}x1x2xφ(n)aφ(n)x1x2xφ(n)aφ(n)1(modn)(modn)

a,na,na,n互质时,可用欧拉定理降幂。
ab mod n=ab mod φ(n) mod na^b\bmod n=a^{b\bmod\varphi(n)}\bmod nabmodn=abmodφ(n)modn

一般地,a,na,na,n不互质,且b⩾φ(n)b\geqslant\varphi(n)bφ(n)时:
ab mod n=ab mod φ(n)+φ(n) mod na^b\bmod n=a^{b\bmod\varphi(n)+\varphi(n)}\bmod nabmodn=abmodφ(n)+φ(n)modn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值