一、概念:
在數論,對正整數n,歐拉函數是小於n的正整數中與n互質的數的數目(φ(1)=1)。
例如φ(8)=4,因為1,3,5,7均和8互質。
歐拉函數用希臘字母φ表示,φ(N)表示N的歐拉函數.
對φ(N)的值,我們可以通俗地理解為小於N且與N互質的數的個數(包含1).
(初學者一定注意:此處的歐拉函數與圖論中的歐拉回路不同)
二、通式:
其中p1, p2……pn為x的所有質因數,x是不為0的整數。
φ(1) = 1(唯一和1互質的數(小於等於1)就是1本身)。 (注意:每種質因數只一個。比如 12 = 2*2*3 那么 φ(12) = 12 * (1-1/2) * (1-1/3)=4 )
若 n = p^k ( p為 質數 ),則 φ(n) = p^k-p^(k-1) = (p-1)p^(k-1),( 除 p 的倍數外,其他數均為 p 的互質數 )。
若n = p( p 為質數),則 φ(n) = p-p^(1-1) = p-1。
三、性質:
(1) p^k型歐拉函數:
若N是質數p(即N=p), φ(n)= φ(p)=p-p^(k-1)=p-1。
若N是質數p的k次冪(即N=p^k),φ(n)=p^k-p^(k-1)=(p-1)p^(k-1)。
(2)mn型歐拉函數
設n為正整數,以φ(n)表示不超過n且與n互素的正整數的個數,稱為n的歐拉函數值。若m,n互質,φ(mn)=(m-1)(n-1)=φ(m)φ(n)。
(3)特殊性質:
若n為奇數時,φ(2n)=φ(n)。
對於任何兩個互質 的正整數a,n(n>2)有:a^φ(n)=1 mod n (恆等於)此公式即 歐拉定理
當n=p 且 a與素數p互質(即:gcd(a,p)=1)則上式有: a^(p-1)=1 mod n (恆等於)此公式即 費馬小定理
三、模板
1.直接求小於或等於n,且與n互質的個數:
int eular(int n) { int i,ret=n; for(i=2; i<=sqrt(n); i++) { if(n%i==0) { ret=ret/i*(i-1); while(n%i==0) n/=i; } } if(n>1) ret=ret/n*(n-1); return ret; }
2.篩選模板:求[1,n]之間每個數的質因數的個數
#define size 1000001
int euler[size]; void Init() { euler[1]=1; for(int i=2; i<size; i++) if(!euler[i]) for(int j=i; j<size; j+=i) { if(!euler[j]) euler[j]=j; euler[j]=euler[j]/i*(i-1);//先進行除法是為了防止中間數據的溢出
} }
