1. 程式人生 > >尤拉函式計算

尤拉函式計算

打表和非打表的方法一併給出

int euler_phi(int n){
    int m=sqrt(n+0.5),ans=n;
    for(int i=2;i<=m;i++){
        if(n%i==0){
            ans=ans/i*(i-1);
            while(n%i==0) n/=i;
        }
    }
    if(n>1) ans=ans/n*(n-1);
    return ans;
}
const int maxn=1e9+5;
int euler[maxn];  
void euler_marktable(){
    euler[
1]=1; for(int i=2;i<maxn;i++) euler[i]=i; for(int i=2;i<maxn;i++) if(euler[i]==i)//如果i是質數 for(int j=i;j<maxn;j+=i) euler[j]=euler[j]/i*(i-1);//提一個1/i,先進行除法是為了防止中間資料的溢位 }