欧拉函数
\(updata : 2022.2.2\)
学习原文
求单个欧拉函数
int PHI(int n){
//int ans = 1;
int ans = n //注意初值是 n.
for(int i=2;i*i<=n;++i){
if(n % i == 0){
ans = ans/i*(i-1);//先除后乘.
while( n%i == 0) n /= i;
}
}
if(n > 1) ans = ans/n*(n-1); //参考 2 的例子.
return ans;
}
线性求 1~n 的欧拉函数
int PHI(int n){
memset(is_pri,1,sizeof(is_pri));
is_pri[1] = 0 , phi[1] = 1;
for(int i=2;i<=n;++i){
if(is_pri[i]){
Q[++l] = i;
phi[i] = i-1;
}
for(int j=1;j<=l && Q[j]*i<=n;++j){
if(i % Q[j]){
is_pri[ i*Q[j] ] = 0;
phi[ i*Q[j] ] = phi[i] * Q[j]; //注意积性函数的性质在两者互质时才能用.
}
else{
is_pri[ i*Q[j] ] = 0;
phi[ i*Q[j] ] = Q[j]*phi[i];
break;
}
}
}
}