尤拉函式(總結)
阿新 • • 發佈:2019-01-05
定義
尤拉函式ϕ(n)是不超過n且和n互質的正整數的個數。尤拉函式φ(n)的作用就是轉化,從而簡化運算(小性質:n的所有質因子之和=eular(n)*n/2);
下面直觀地看看尤拉函式:
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
φ(n) | 1 | 1 | 2 | 2 | 4 | 2 | 6 | 4 | 6 | 4 | 10 | 4 | 12 | 6 | 8 |
定理
-
定理1 算術函式f如果滿足對於任意兩個互質的正整數m和n,均有f(mn)=f(m)f(n),就稱f為積性函式(或乘性函式)。如果對於任意兩個正整數m和n,均有f(mn)=f(m)f(n),就稱為完全積性函式。
-
定理2 若m、n互質,ϕ(mn)=ϕ(m)ϕ(n),所以尤拉函式是積性函式。因為mn互質,和m互質的數乘上和n互質的數就會和mn互質。
-
定理3
-
尤拉函式的兩種求法
#include<iostream> using namespace std; int phi[100011]; int eular(int n){//求一個數的尤拉值 int res=n; if(n==1) return 1; for(int i=2;i<=n;i++){ if(n%i==0){ res=res/i*(i-1); while(n%i==0) n/=i; } } return n>1?res/n*(n-1):res; } void eularplus(int n){//求多個數的尤拉值 for(int i=1;i<=n;i++) phi[i]=i; for(int i=2;i<=n;i++){ if(phi[i]==i){ for(int j=i;j<=n;j+=i) phi[j]=phi[j]/i*(i-1); } } } int main() { int n; scanf("%d",&n); printf("%d\n",eular(n)); eularplus(n); for(int i=1;i<=n;i++) printf("%d ",phi[i]); printf("\n"); return 0; } // 15 // 8 // 1 1 2 2 4 2 6 4 6 4 10 4 12 6 8