歐拉函數


定義

歐拉函數ϕ(n)是不超過n且和n互質的正整數的個數。

下面直觀地看看歐拉函數:

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

定理

  • 定理0 算術函數f如果滿足對於任意兩個互質的正整數m和n,均有f(mn)=f(m)f(n),就稱f為積性函數(或乘性函數)。

如果對於任意兩個正整數m和n,均有f(mn)=f(m)f(n),就稱為完全積性函數。

  • 定理1 對於素數p,ϕ(p)=p−1。
  • 定理2 ϕ(pn)=pn−pn−1,因為素數冪pn不互質的只有p的倍數,一共有pn/p=pn−1個。
  • 定理3 若m、n互質,ϕ(mn)=ϕ(m)ϕ(n),所以歐拉函數是積性函數。

因為mn互質,和m互質的數乘上和n互質的數就會和mn互質。

  • 定理4 設n=p1a1p2a2...pkak為正整數n的素數冪分解,那么ϕ(n)=n(1−1/p1)(1−1/p2)...(1−1/pk)。

由定理2,ϕ(pn)=pn−pn−1=pn (1-1/p),又由定理3,ϕ(n)=p1a1p2a2...pkak(1−1/p1)(1−1/p2)...(1−1/pk)=n(1−1/p1)(1−1/p2)...(1−1/pk)

  所以可以方便地求歐拉函數:邊找質因子邊算,res=n,找到一個質因子p,res=res/p*(p-1)。

int euler(int x){
    int res = x;
    for(int i=2; i*i<=x; i++)
        if(x % i == 0){
             res = res / i * (i - 1);
             while(x % i == 0) x /= i;
         }
    if(x > 1) res = res / x * (x - 1);
    return res;
}

 

也可以方便地求出所有數的歐拉函數。過程就是先讓每個phi[i]=i,再對每個質數p,j為它的倍數,phi[j]=phi[j]/p*(p-1)。

for(int i=1; i<=maxn; ++i) phi[i] = i;
for(int i=2; i<=maxn; i+=2) phi[i] /= 2;
for(int i=3; i<=maxn; i+=2)
    if(phi[i] == i){
        for(int j=i; j<=maxn; j+=i)
            phi[j] = phi[j] / i * (i - 1);
    }

 

  • 定理5 設n是一個大於2的正整數,那么ϕ(n)是偶數。


對於素數p,ϕ(p)=p−1,大於2的素數是奇數,那么它的歐拉函數就是偶數。

對於合數n,

  由定理2,ϕ(pk)=pk−pk−1

  p=2時,ϕ(2k)=2k−2k−1=2k−1是偶數,

  對於大於2的素數p,ϕ(pk)=pk−pk−1,p為奇數,p的次方也為奇數,兩個奇數相減為偶數。

  所以ϕ(pk)為偶數。

  又由定理3,ϕ(n)=ϕ(p1a1)ϕ(p2a2)...ϕ(pkak),所以ϕ(n)一定是偶數。

  • 定理6d|nϕ(d)=n。

d|nϕ(d)表示所有n的約數的歐拉函數值求和,Cd是gcd(n,x)==d的x(1≤x≤n)的集合,d不同的Cd集合不相交。

  若m∈Cd,則gcd(n,m)=d,所以gcd(n/d,m/d)=1,由於1≤m≤n,所以1≤m/d≤n/d,所以m/d可以取小於n/d且與n/d互質的所有數,m和m/d個數相同,所以m的個數就是ϕ(n/d),也就是|Cd|=ϕ(n/d)。1到n每個數和n的最大公約數一定是n的約數,那么所有集合Cd的所有元素個數之和就是n,也就是∑d|n|Cd|=n。所以∑d|nϕ(d)=n。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM