1. 程式人生 > >尤拉函式(提供1到N中與N互質的數)

尤拉函式(提供1到N中與N互質的數)

當個板子放著,具體是看了這篇部落格:尤拉函式求法與應用

尤拉函式用希臘字母φ表示,φ(N)表示N的尤拉函式.

對φ(N)的值,我們可以通俗地理解為小於N且與N互質的數的個數(包含1).

//直接求解尤拉函式  
int euler(int n){ //返回euler(n)   
     int res=n,a=n;  
     for(int i=2;i*i<=a;i++){  
         if(a%i==0){  
             res=res/i*(i-1);//先進行除法是為了防止中間資料的溢位   
             while(a%i==0) a/=i;  
         }  
     }  
     if(a>1) res=res/a*(a-1);  
     return res;  
}

它在O(N)的時間內遍歷了所有的數,並且有很多的附加資訊,

我們可以在篩素數的同時求出所有數的尤拉函式

void Init(){   
     euler[1]=1;  
     for(int i=2;i<Max;i++)  
       euler[i]=i;  
     for(int i=2;i<Max;i++)  
        if(euler[i]==i)  
           for(int j=i;j<Max;j+=i)  
              euler[j]=euler[j]/i*(i-1);//先進行除法是為了防止中間資料的溢位   
}

拓展:

尤拉公式的延伸:對於一個數,與其互質的數的總和是euler(n)*n/2。