數論——尤拉函式
阿新 • • 發佈:2018-12-06
在數論中,對正整數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++ codeint 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; }