尤拉函式(提供1到N中與N互質的數)
阿新 • • 發佈:2019-01-28
當個板子放著,具體是看了這篇部落格:尤拉函式求法與應用
尤拉函式用希臘字母φ表示,φ(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。