计算n其中a ^ n mod m = 1?

时间:2013-10-22 18:53:02

标签: c++ number-theory modular-arithmetic

计算满足等式的前n个的最快方法是什么

  

a ^ n mod m = 1

这里a,n,m可以是素数或复合物 mod:是模数运算符

2 个答案:

答案 0 :(得分:1)

直接方式有什么问题:

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 :(得分:-1)

  1. 如果gcd(a,m)> 1,那么就没有这样的n。 (明显)
  2. 否则,如果m为素数,则n = m-1。 (Proof
  3. 否则(和更一般情况一样),n =ф(m),其中ф是欧拉的整数函数。 (Proof
  4. 如您所见,计算ф(m)与m的因子分解基本相同。这可以在sqrt(m)时间内或更快时间内完成,具体取决于您使用的算法的复杂程度。简单的一个:

    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似乎很棘手。通过使用this定理可以划分任务(对于相应的余数,所有度数的最小n是最小公倍数)。但是当m是素数或者具有足够大的素数时,并且只有一个a(而不是计算n对于许多不同的a具有相同的m),我们就没有选择了。您可能需要查看12