歐拉函數


歐拉函數

在數論,對正整數n,歐拉函數是小於n的正整數中與n互質的數的數目(φ(1)=1)。

其中p1, p2……pn為x的所有質因數,x是不為0的整數

 

分解n=p1q1 * p2q2 * p3q3 * ……* pkqk

φ(n)= n*(1 - 1/p1) *(1 - 1/p2) *(1 - 1/p3)*……. *(1 - 1/pk)

            = p1q1 * (1 - 1/p1) * p2q2 * (1 - 1/p2) * p3q3 * (1 - 1/p3) *…..* pkqk * (1 - 1/pk)

            = p1q1 * ( (p1 – 1)/p1 ) * p2q2 * ( (p2 – 1)/p2 ) * p3q3 * ( (p3- 1)/p3 ) *…..* pkqk * ( (pk – 1)/pk )

            = p1q1-1 * (p1 – 1) * p2q2-1 * (p2 – 1) * p3q3-1 * (p3- 1) *…..* pkqk-1 * (pk – 1)

 

那么對於一個素數,顯然 φ(p)= p-1 

 

 

 

 

代碼實現利用到了線性篩唉

g[n]表示n的因子個數

求一個數約數的個數,假設把它分解完了,那么g[i]=(1+q1)(1+q2)….(1+qn)

其實就是乘法原理啊,對於每個因子都可以選指數為0次,1次…q1次,一共(q1+1)種情況

 

phi[ ]是歐拉函數,歐拉函數是積性函數

證明: 假設n,m互質,那么他們一定沒有相同的質因子

那么n=p1q1 * p2q2 * p3q3 * ……* pkqk

m=t1l1 * t2l2 * t3l3 * ……* tklk 

假設k=n*m

那么顯然φ(k)=φ(n)*φ(m)

/*歐拉篩

篩數 i 
選取一個素數 p
把 p * i 篩掉
此時會檢查 i 的最小素因子是否是p
所以有兩種可能:
1、i 和 p 互素
    phi[i * p] = phi[i] * phi[p]
2、i 的最小素因子剛好是 p 
    phi[i * p] = phi[i] * p
*/


bool notprime[]
int tot, prime[], e[];
int phi[];// phi 是歐拉函數
int g[]; // g[n]表示n的因子個數
int f[]; // f[n]表示n的最小素因子的次數
         //    f[12] = 2;
         // f[81] = 4;
void sieve(int n) {
    for (int i = 2; i <= n; i++) {
        if (!notprime[i]) {
            prime[tot++] = i;
            e[i] = i;
            phi[i] = i - 1;
            g[i] = 2;
            f[i] = 1;
        }
        for (int j = 0; j < tot && (k = prime[j] * i) < n; j++) {
            e[k] = prime[j];
            notprime[k] = true;
            if (e[i] == prime[j]) {
                phi[k] = phi[i] * prime[j];  //i和prime[j]不互質 
                f[k] = f[i] + 1;
                g[k] = g[i] / (f[i] + 1) * (f[k] + 1);
                break;
            }
            else {
                phi[k] = phi[i] * phi[prime[j]]; //i和prime[j]互質 
                g[k] = g[i] * g[prime[j]];
                f[k] = 1;
            }
        }
    }
}

 

 

歐拉定理

 


免責聲明!

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



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