1. 程式人生 > >尤拉函式初步探尋

尤拉函式初步探尋

一:什麼是尤拉函式?

定義:在數論,對正整數n,尤拉函式是小於或等於n的正整數中與n互質的數的數目。(PS:\varphi (8)=4,在小於等於8的數中與與8互質的數是:1, 3, 5, 7;共四個);

二:尤拉函式有什麼用?

由定義可知,尤拉函式可以求出小於等於n的正整數中與n互質的數的個數;

三:尤拉函式有什麼性質?

1:若n與m互質,則有\varphi (n)\varphi (m)=\varphi (nm)

2:若n為奇數,則有\varphi (2n)=\varphi (n)

3:若p是素數,a是正整數,則有\varphi (p^{a})=p^{a}-p^{a-1}

4:\varphi (n)=n(1-\frac{1}{p1})(1-\frac{1}{p2})(1-\frac{1}{p3})\cdot\cdot \cdot(1-\frac{1}{pk});其中p1, p2, p3, ···,pk是n的所有質因數;

5:對於正整數n有:n=\sum_{d|n}\varphi(d);d為所有能整出n的數,即n的所有正因子;

6:令sum(n)表示小於等於n的數中與n互質的數的和,則有sum(n)=\frac{n\varphi(n)}{2}

四:程式碼如何寫?

1:下邊是直接求\varphi (n)

int oula(int n)
{
    int rea=n;
    for(int i=2; i*i<=n; i++)
        if(n%i==0)//第一次找到的必為素因子
        {
            rea=rea-rea/i;
            do
                n/=i;//把該素因子全部約掉
            while(n%i==0);
        }
    if(n>1)
        rea=rea-rea/n;
    return rea;
}

2:遞推尤拉函式,打表;

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