首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算n,其中a^n模m= 1?

计算n,其中a^n模m= 1?
EN

Stack Overflow用户
提问于 2013-10-22 18:53:01
回答 2查看 530关注 0票数 0

计算满足方程的第一个n的最快方法是什么?

a^n模m=1

这里a,n,m可以是素模,也可以是复合模,模算子是模算子吗?

EN

回答 2

Stack Overflow用户

发布于 2013-10-22 18:59:06

直接的方式有什么问题:

代码语言:javascript
复制
int mod_order(int m, int a) {
    for(int n = 1, an = a; n != m; n++, an = an * a % m) if(an % m == 1) return n;
    return -1;
}
票数 1
EN

Stack Overflow用户

发布于 2013-10-23 07:21:39

  1. 如果gcd(a,m)>1时,则不存在这样的n (明显)
  2. 否则,如果m是素数,n=m-1。(证明)
  3. 否则(以及更一般的情况),n=ф(m),其中ф是欧拉函数。(证明)

正如您所看到的,计算ф( m )与m的因式分解本质上是一样的,这可以在sqrt(m)时间或更快的时间内完成,这取决于您使用的算法有多复杂。简单的一个:

代码语言:javascript
复制
int phi(m){
  if(m==1) return 1;
  for(int d=2; d*d<m; ++d){
    if(m%d != 0) continue;
    int deg = 1; long acc=1;
    for(; m%(acc*d)==0; ++deg) acc*=d;
    acc /= d;
    return phi(m/acc)*acc*(d-1)/d;
  }
  return m-1;
}

我的错。a^(ф(m)) =1 (mod m),但n的值可能较小(对于a=1,n=1,与m没有差别;对于a=14,m=15,n=2)。N是ф(m)的除数,但有效地计算最小可能的n似乎很棘手。任务可以用定理来划分(极小n是每个剩余数的所有度的最小公倍数)。但是当m是素数或者有足够大的素数除数时,只有一个a(而不是用相同的m计算许多不同的a),我们就没有选择了。你可能想看看12

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

https://stackoverflow.com/questions/19526000

复制
相关文章

相似问题

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