簡單複習一下尤拉函式
阿新 • • 發佈:2018-12-15
尤拉函式是用來求小於的正整數中與n互質的數的數目,用希臘字母表示。
對於常規求小於的正整數中與互質的數的數目,可以將小於的數全部用掃一遍,但是一次的時間複雜度是,用求的時間複雜度便是,而實際上我們可以實現時間複雜度的做法。
首先給出的通項公式:
顯然,任何一個大於1的正整數n可以分解為: 其中,是的素數因子, 那麼,
接下來我們推導一下。
第一種情況:
如果,顯然: 第二種情況:
如果是質數,顯然:
第三種情況:
如果是一個質數的某一個次方,即(為質數,為大於等於的整數)
那麼:
例如:
第四種情況:
如果可以分解為兩個互質的整數之積,即:(為質數)
則:
也就是素數乘積的尤拉函式等於各個素數的尤拉函式的乘積。
最後,也就得到我們最後的終點,第五種情況:
對於任意大於的正整數,都可以寫成一系列質數的乘積:
那麼根據第四種情況得到:
再根據第三種情況得到:
顯然最後得到我們想要的結果:
以上就是對於尤拉函式通項φ的推導,接下來讓我們看看程式碼的實現:
int euler(int n) {
int ans=n,a=n;
for(int i=2;i*i<=a;i++) if(a%i==0) {
ans=ans/i*(i-1);
while(a%i==0) a/=i;
}
if(a>1) ans=ans/a*(a-1);
return ans;
}