【问题标题】:Calculation of euler phi function欧拉phi函数的计算
【发布时间】:2015-06-05 13:12:41
【问题描述】:
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;
}

我看到了 O(sqrt n)Euler phi 函数 的上述实现。我不知道在for循环和需要更改n。据说可以在更短的时间内完成O (sqrt n) 怎么样? link (in Russian)

【问题讨论】:

    标签: algorithm math implementation


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 什么是更好的算法来寻找因子?.请提及算法的名称
      • rho 和 p-1 算法、SQUFOF、连分数、椭圆曲线算法、二次筛、数域筛,以及许多其他暂时没有想到的算法。请注意,其中一些只有在专家手中才能正常工作。
      • @DCoder 为什么不点击您引用的页面上的链接,因为它说您可以找到“比 O(sqrt(n)) 更快的 phi”?该链接回答了这个问题,这不足为奇,因为它还说“有效的分解算法”。它描述了诸如 Pollard rho 分解之类的东西,它击败了 20 多个数字的试用除法。我不明白你怎么会读到那个页面却不愿意点击上面的链接。
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-12
        • 1970-01-01
        • 2013-09-17
        • 2016-08-13
        • 1970-01-01
        • 1970-01-01
        • 2021-04-17
        • 1970-01-01
        相关资源
        最近更新 更多