欧拉函数
什么是欧拉函数
欧拉函数是小于x的整数中与x互质的数的个数,特殊的 φ(1) = 1.
如何计算欧拉函数
其中p1,p2,.....pn为x的所有质因数,x是正整数。
欧拉函数的几个性质
1、对于质数p φ(p)=p-1.
2、若p为质数,n = pk,则 φ(n) = pk - pk-1
3、欧拉函数是积性函数,但不是完全积性函数(不互质也满足等式)。若m,n互质,则φ(m*n)=φ(m)*φ(n).
4、当n>2时,φ(n)* n / 2 (n > 1).
5、小于n且与n互质的数的总和为:φ(n)* n / 2 (n > 1).
6.n = ∑d∣n φ(d),即n的因数(包括1和它自己)的欧拉函数之和等于n
求欧拉函数
1、求单个欧拉函数
int euler(int n) { int ans = n ; for(int i = 2 ; i * i <= n ; i++) { if(n % i == 0) { ans -= ans / i ; // 跟据欧拉函数的通项公式展开一步一步算 while(n % i == 0)//确保i为n的质因数 { n /= i ; } } } if(n > 1) ans -= ans/n ;//最后可能还剩下一个质因数没有除,例如10的欧拉函数 return ans ; }
2、埃拉托斯特尼筛求欧拉函数
void euler(int n)//求1-n的欧拉函数 { for(int i = 2 ; i <= n ; i++) phi[i] = i ; for(int i = 2 ; i*i <= n ; i++) { if(phi[i] == i) // 表示i为质数 { for(int j = i ; j <= n ; j += i) { phi[j] = phi[j] / i * (i-1) ;//将i的倍数更新 } } } }
欧拉筛求欧拉函数
void euler(int n)//求1-n的欧拉函数 { memset(vis , true , sizeof(vis)); int cnt = 0 ; for(int i = 2 ; i <= n ; i++) { if(vis[i]) { prime[cnt++] = i ; phi[i] = i - 1 ; } for(int j = 0 ; j < cnt && prime[j] * i <= n ; j++) { vis[i*prime[j]] = 0 ; if(i % prime[j] == 0)//保证每一个数都被它最小质因数筛去 { phi[i*prime[j]] = phi[i] * prime[j] ; break ; } else{ phi[i*prime[j]] = phi[i] * phi[prime[j]];//i与prime[j]互质可以根据欧拉函数的积性函数性质求 } } } }
参考博客https://blog.csdn.net/liuzibujian/article/details/81086324