推導過程略
歐拉公式: n(1-1/p1)(1-1/p2)....
代碼僅供參考:
void euler_phi(int n){
int m=(int)sqrt(n+0.5);
int ans=n;
for(int i=2;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);//如果n本身就爲素數
return ans;
}
//歐拉函數表
void phi_table(int n,int* phi){
for(int i=2;i<=n;i++) phi[i]=0;
phi[i]=1;
for(int i=2;i<=n;i++){
if(!phi[i]){
for(int j=i;j<=n;j+=i){
if(!phi[j]) phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
}
}