欧拉函数
欧拉函数详解
对一个正整数N,欧拉函数是小于N且与N互质的数的个数.。
例如φ(24)=8,因为1, 5, 7, 11, 13, 17, 19, 23均和 24 互质。
φ(n) = n*(1-1/p1)*(1-1/p2)*......(1-1/pn) 其中(p1.....pn)为N的素因子
欧拉函数的基本性质:
① N是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)
② 除了N=2,φ(N)都是偶数.
③ 小于N且与N互质的所有数的和是φ(n)*n/2。
④ 欧拉函数是积性函数——若m,n互质,φ(m*n)=φ(m)*φ(n)。
⑤ 当N为奇数时,φ(2*N)=φ(N)
⑥ 若N是质数p的k次幂,φ(N)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟N互质。
⑦ 当N是质数时,φ(N) = N-1
8当b是质数,a%b==0,phi(a*b)=phi(a)*b
算法实现:
1.直接实现
1 int phi(int n) 2 { 3 int rea=n; 4 for(int i=2;i<=n;i++) 5 { 6 if(n%i==0)//第一次找到的必为素因子 7 { 8 rea=rea-rea/i; 9 do{ 10 n/=i;//把素因子全部排除掉 11 }while(n%i==0); 12 } 13 } 14 return rea; 15 }
参照公式
2.素数表实现
bool b[50000]; int p[50000]; void prime() { memset(b,0,sizeof(b)); b[0]=b[1]=1; int k=0; for(int i=2;i<=50000;i++) { if(b[i]==0) { p[k]=i; k++; for(int j=i+i;j<=50000;j+=i) { b[j]=1; } } } } int phi(int n) { int rea=n; for(int i=0;p[i]*p[i]<=n;i++) { if(n%p[i]==0) { rea=rea-rea/i; do{ n/=p[i]; }while(n%p[i]==0); } if(n>1) rea=rea-rea/n;//减去自身的 }return rea; }
3.递推实现
void phi() { for(int i=1;i<=50000;i++) p[i]=i; for(int i=2;i<=50000;i+=2) p[i]/=2;//根据定理φ(2*N)=φ(N) for(int i=3;i<=50000;i+=2) { if(p[i]==i) { for(int j=i;j<=50000;j+=i) { p[j]=p[j]/i*(i-1); } } } }