2015-07-21 79 views
-1

這裏的夥計是這個算法,用於找到所有的phi(i)= eulers totient(i) = i < = n。Euler's Sieve for Totient Calculation

int phi[n + 1]; 
for (int i = 1; i <= n; ++i) phi[i] = i; 
//invariant: phi(x) for all 1 <= x < d is calculated during the 
//start of the dth iteration. 
for (int d = 1; d <= n; ++d) { //divisors 
    for (int j = 2 * d; j <= n; j += d) phi[j] -= phi[d]; 
} 

enter image description here

如何上面的公式幫助我們實現上面的算法?

+0

爲什麼downvote? – user3263245

+1

我沒有downvote,但這聽起來像它可能是家庭作業,這不是一個明確的問題。 –

+0

不,它不是作業,我想了解我在代碼中找到的算法。基本上我已經使用歐拉的產品配方使用素數完成篩分,但我想了解這一點。理解困難。所以請幫助。 – user3263245

回答

1

從你給的公式開始,如果我們拿島(N)出西格瑪,我們得到:

Sigma[d|n,d!=n]phi(d) + phi(n) = n

因此:

phi(n) = n - Sigma[d|n,d!=n]phi(d)

這是什麼該算法確實:對於每個n,其以n的值開始,並且對於的每個除數d減去除n本身。請注意,這是通過在外部循環中迭代d以及在內部循環中迭代n來以不同的順序完成的,因爲找到數字的倍數比找到它的除數要快。

+0

哦,狗屎!我正在考慮從上面的公式中得到phi(n),但沒有將n作爲自身的除數。我的錯 :( – user3263245

相關問題