What is Euler function
对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。
例如φ(8)=4,因为1,3,5,7均和8互质。
性质:
- 若n是素数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质 。
- 欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)
- phi(p)=p-1(p为质数)
- 当n为奇数时,φ(2n)=φ(n)。因为2必定和所有的奇数互质,故φ(2n)=φ(2)*φ(n)。
- n的所有质因子之和等于φ(n)*n/2(这不算性质,只能算延伸)。
How to calculate Euler function
通式
φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn)
其中p1, p2……pn为x的所有质因数,x是不为0的整数
int getphi(int n){//O(√n)
int rea = n;
for (int i = 2; i * i <= n; i ++) {
if(n % i == 0) {
rea = rea - rea / i;
do{
n /= i;
}while(n % i == 0);
}
}
if(n > 1)
rea = rea - rea / n;
return rea;
}
int phi(int n){//O(n)
int res = n;
for(int i=2;i<=n;i++){
if(n%i == 0){
res = res - res/i;
while(n%i==0) n /= i;
}
if(n == 1) break;
}
return res;
}
欧拉筛求欧拉函数
同时晒出素数
int phi[maxn],pri[maxn],tot;
bool mark[maxn];
void getphi() {
phi[1] = 1;
for(int i=2; i<maxn; i++) {
if(mark[i]==0) {pri[++tot] = i;phi[i] = i-1;}//i is prime
for(int j=1; j<=tot&&pri[j]*i<maxn; j++) {
int x = pri[j];
mark[i*x] = 1;
if(i%x == 0) {phi[i*x] = phi[i]*x;break;}
else phi[i*x] = phi[i]*phi[x];
}
}
}
埃拉托斯特尼筛求欧拉函数
例题
POJ2478 板子题,一开始找规律找错了应该是质数而不是奇数。