这里的人是这个算法,用于查找所有人的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];
}
上述公式如何帮助我们实现上述算法?
答案 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
以不同的顺序完成的,因为找到数字的倍数比找到它的除数更快。