Euler's Sieve for Totient Calculation

时间:2015-07-21 13:18:27

标签: algorithm math

这里的人是这个算法,用于查找所有人的phi(i)= eulers totient(i) 1< = i< = n。

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

上述公式如何帮助我们实现上述算法?

1 个答案:

答案 0 :(得分:1)

从您给出的公式开始,如果我们从西格玛中取出phi(n),我们得到:

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

因此:

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

这就是算法的作用:对于每个n,它的值为n,并为phi(d)的每个除数d减去n除了n本身。请注意,这是通过迭代外部循环中的d和内部循环中的n以不同的顺序完成的,因为找到数字的倍数比找到它的除数更快。