【问题标题】:Theory Behind Euler's Phi Function's Implemention欧拉 Phi 函数实现背后的理论
【发布时间】:2017-04-12 13:45:12
【问题描述】:

我在 topcoder 上找到了欧拉 phi 函数的实现。代码如下:

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

我想知道这个实现背后的确切理论。我的理解是,如果我得到一个除以 n 的整数,那么我将从结果中减去 result/i(我不知道为什么)。然后代码将 n 除以 i 直到它可以被整除。我不明白的是代码的最后一部分。

if(n > 1) result -= result / n;

我所知道的是,如果在这个阶段 n 大于 1,那么 n 将是一个素数。我想知道,到目前为止我从这段代码中所理解的内容是否正确以及这段代码背后的确切理论。

【问题讨论】:

    标签: math theory


    【解决方案1】:

    查找欧拉函数

    如果一个数n被分解成素数幂的乘积,那么

    phi(p1^m1*...*pk^mk) = (p1-1)*p1^(m1-1)*...*(pk-1)*pk^(mk-1)
    

    算法忠实地计算出来的。

    这是可逆的余数类 mod n。它是费马扩展小定理的指数,如果gcd(a,n)=1 那么

    a ^ b == a ^ (b mod phi(n))  mod n
    

    迭代以升序查找输入n 的素因子。如果发现p 是主要因素,则result = k*p^m 其中m 也是输入中p 的多重性。操作result -= result/p有结果

    result = k*p^m - k*p^(m-1) = k*(p-1)*p^(m-1).
    

    你是对的,n&gt;1 迭代后将发生在最大素数因子具有多重性m=1 时,并且在总值中,该因子发生减少1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      相关资源
      最近更新 更多