1. 程式人生 > >數論——尤拉函式

數論——尤拉函式

數論,對正整數n,尤拉函式是少於或等於n的數中與n互質的數的數目。此函式以其首名研究者尤拉命名,它又稱為Euler's totient function、φ函式、尤拉商數等。 例如φ(8)=4,因為1,3,5,7均和8互質

——百度百科詞條《尤拉函式》

        尤拉函式通式:



    為了方便程式設計通常不用這個通式,而用Φ(x)=p1^(n1-1)*p2^(n2-1)* ... *pk^(nk-1)*(p1-1)*(p2-1)

* ... *(pk-1)計算,其中p1,p2,..pk為正整數x的質因數,n1,n2,...nk對應質因數的次數。

    該式易通過尤拉函式的性質推匯出來。首先將正整數n進行質因數分解(小學數學的即視感

    尤拉函式有如下性質, 若n是質數p的k次冪,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因為在1至p^k這n個數中除了p的倍數外,其他數都跟n互質。而p的倍數共有n/p即p^k/p^1=p^(k-1)個。

    另外

尤拉函式是積性函式——若m,n互質,φ(mn)=φ(m)φ(n)。

        所以有:

C++ code
int Euler(int ans1)
{
    int res=1;
    int ans=ans1;
    for(int i=2;i*i<=ans1;i++)
    {
        if(ans%i==0)
        {
        //如果找到ans的質因數i
        //這裡的i一定是ans的質因數,因為一旦找到一個因數i,
        //下面的語句就會在ans的質因數分解式里約掉這個因數
        //例 ans=36  i=2時 迴圈語句執行完後ans=9 當i=4時就不會進入迴圈體
            ans/=i;
            res*=i-1;  //處理函式式中的 ...*(pk-1)項
            while(ans%i==0)  //處理函式式中的  ...*pk(nk-1)項
            {
                res*=i;
                ans/=i;
            }
        }
    }
    if(ans>1)
    {
        res*=(ans-1);
    }
     
    return res;
}