计算euler phi函数

时间:2015-06-05 13:12:41

标签: algorithm math implementation

i*i<=n

我看到 Euler phi函数的上述实现,它是 O(sqrt n)。我没有得到使用{{1在for循环中需要更改n。据说它可以在更小的时间内完成 O(sqrt n)如何? link (in Russian)

3 个答案:

答案 0 :(得分:6)

i*i<=ni<= sqrt(n)相同,您的迭代仅持续sqrt(n)的顺序。

使用Euler totient function的直接定义,您应该找到除n的素数。

答案 1 :(得分:2)

该函数是通过试验除法直接实现整数因子分解,除了在找到它们时不是报告因子,该函数使用因子来计算phi。通过使用更好的算法来找到因子,可以在小于O(sqrt n)的时间内完成phi的计算;最好的方法取决于 n 的大小。

答案 2 :(得分:1)

如果你想要的最大数字(N说)足够小,你可以在内存中有一个大小为N的表,那么你可以在每次评估时做得更好,代价是在任何评估之前建立一个表。

一种方法是首先建立一个素数表,然后不是使用最多sqrt(n)的每个整数的试验除法,而是使用每个素数最多sqrt(n)的试验除法。

你可以通过构建一个表(给每个整数2..N)分配数字的最小素数而不是素数表来改进。通常Sieve of Eratosthenes的简单修改可用于构建这样的表。然后计算一个数字的总数,你使用该表来找到除去数字的最小素数(并将其累积到你的答案中),然后将数字除以表格条目,使用表格找到除以该数字的最小素数,等等。