i*i<=n
我看到 Euler phi函数的上述实现,它是 O(sqrt n)。我没有得到使用{{1在for
循环中需要更改n
。据说它可以在更小的时间内完成 O(sqrt n)如何? link (in Russian)
答案 0 :(得分:6)
i*i<=n
与i<= 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的简单修改可用于构建这样的表。然后计算一个数字的总数,你使用该表来找到除去数字的最小素数(并将其累积到你的答案中),然后将数字除以表格条目,使用表格找到除以该数字的最小素数,等等。