C++中的Euler函数



有人能解释一下,这个欧拉函数是什么意思吗:

int phi (int n) {
int result = n;
for (int i=2; i*i<=n; ++i)
if (n % i == 0) {
while (n % i == 0)
n /= i;
result -= result / i;
}
if (n > 1)
result -= result / n;
return result;
}

我试图制定一条标准的路径来解决这项任务,但它已经超过了时间限制。我发现了欧拉函数的这种解释,但我不明白。为什么我们迭代i*i<n而不是i<nwhile循环中发生了什么等等。我知道我们可以把欧拉函数写成f(n) = n * (1-1/p1)(1-1/p2)...(1-1/pk),其中pi是素数,但我搞不懂这个代码是如何工作的。

为了时间性能,我们这样迭代是因为一个数字的所有素数都等于或小于该数字的平方根(如果一个数字没有等于或小于平方根,那么它就是素数(。然后,当我们找到一个素数时,我们用这个因子除以我们的数n,直到我们不能再除以它,所以我们从这个数中提取素数。

r*(1-1/pk) = r - r/pk

这正是result -= result/i所做的。result是到目前为止的乘积,i是下一个素数。

最新更新