Math 欧拉背后的理论';sφ函数';实施

Math 欧拉背后的理论';sφ函数';实施,math,theory,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; }

我在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大于1,那么n将是一个素数。我想知道,到目前为止,我从这段代码中所理解的是否正确,以及这段代码背后的确切理论。

查找欧拉的toticent函数

如果一个数
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
在迭代之后,当最大的素数因子具有多重性时,就会发生,并且在toticent值中,这个因子会减少
1

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