欧拉Phi函数实现背后的理论

时间:2016-11-28 18:26:45

标签: math theory

我在topcoder上找到了euler的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将是素数。我想知道,如果到目前为止我从这段代码中理解的是正确的,并且这段代码背后的确切理论。

1 个答案:

答案 0 :(得分:2)

查找 Euler的函数

如果数字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>1在最大素数因子具有多重性m=1后会发生迭代,并且在这个因子中,这个因子会减少1