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

标签 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将是素数。我想知道,到目前为止我从这段代码中理解的内容是否正确以及这段代码背后的确切理论。

最佳答案

查找欧拉 totient 函数

如果是一个数字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 时,迭代将会发生,并且在 totient 值中,此因子减少 1 .

关于math - 欧拉 Phi 函数实现背后的理论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40851040/

相关文章:

java - 如何使用 Math.random() 获取范围内的随机数

c++ - 生成 "unique"矩阵

algorithm - 大小为 MxN 的矩阵中大小为 AxB 的子矩阵的数量

javascript - 如何最小化数学调用? (JavaScript)

theory - 如何将 CFG 转换为图灵机

math - 比较传统数学符号与 APL/J 符号的示例

java - 对 Java OOP 理论有一些澄清吗?

java - x = (int)(Math.random() * 1) 0 或 1 的概率是多少?

data-structures - 文本编辑器理论

floating-point - 为什么 double 会像他们那样工作