首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >欧拉Phi函数实现的理论基础

欧拉Phi函数实现的理论基础
EN

Stack Overflow用户
提问于 2016-11-28 18:26:44
回答 1查看 73关注 0票数 2

我在topcoder上发现了euler的phi函数的一个实现。守则如下:

代码语言:javascript
复制
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 (我不知道为什么),.Then代码除以i,直到它是可除的。我不明白的是代码的最后一部分。

代码语言:javascript
复制
if(n > 1) result -= result / n;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-28 18:55:32

查找欧拉函数

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

代码语言:javascript
复制
phi(p1^m1*...*pk^mk) = (p1-1)*p1^(m1-1)*...*(pk-1)*pk^(mk-1)

算法忠实地计算。

是剩余类mod n的数目是可逆的。它是费马推广的小定理的指数,如果是gcd(a,n)=1,则

代码语言:javascript
复制
a ^ b == a ^ (b mod phi(n))  mod n

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

代码语言:javascript
复制
result = k*p^m - k*p^(m-1) = k*(p-1)*p^(m-1).

你说得对,迭代后的n>1会在最大素数因子具有多重性m=1时发生,而在现有的值中,这个因子会被1还原。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40851040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档