计算2 ^ n Mod m的最快方法,其中n和m是随机整数

时间:2015-04-04 23:21:35

标签: modular-arithmetic

如果在2 ^ n除以m时有任何可能的有效方法找到余数,我在徘徊,其中n和m是随机整数。是否有任何方程式我将n和m转换为给我剩余的或者我们必须遵循递归方法? 请注意我是初学者,我刚刚开始,所以可能不会理解太复杂的东西。

提前致谢。

4 个答案:

答案 0 :(得分:1)

乘法的模运算如下:

(a * b)%x =((a%x)*(b%x))%x

以下是C ++代码:

#include <cstdio>
#include <cstdlib>

using namespace std;

int powmod(int n, int m) {
  int ret = 1;
  for(int i = 0; i < n; ++i)
    ret = ( (ret % m) * (2 % m) ) % m; // expression from above
  return ret; // returns 2 to the power n modulo m
}

int main() {

  int n, m; scanf("%d%d", &n, &m);
  printf("%d\n", powmod(n, m));

  return 0;
}

答案 1 :(得分:1)

fkdosilovic 答案是正确的但不是最快的。

他的算法在O(n)时间运行,但可以实现O(log(n))。

由于所有数字2 ^ n都可以表示为集合{2 ^ 1,2 ^ 2,2 ^ 4,2 ^ 8 ...,2 ^ floor(lg(n))}的产品,我们只需要计算这些值并将它们相乘。例如。 2 ^ 13 = 2 ^ 1 * 2 ^ 4 * 2 ^ 8。 这是一个python代码。

def fast_powmod(n, m):
    pow2 = 2
    result = 1
    while n > 0:
        if n % 2 == 1:
            result = (result * pow2) % m
        pow2 = (pow2 * pow2) % m
        n >>= 1

    return result

答案 2 :(得分:0)

此javascript代码可以正确处理非常大的n值。

function fastMod(n, m){
var pow2 = 2
var result = 1
while(n > 0){
    if(n&1){
        result = (result * pow2) % m 
    }
   n/=2
    pow2 = (pow2 * pow2) % m   
}
console.log(result)
}
fastMod(77, 100)

答案 3 :(得分:-1)

Fermat's little theorem可以在 m 为素数的情况下为您提供帮助:

  

如果p是素数,则对于任何整数a,数字a^p − ap的整数倍。

     

例如,如果a = 2p = 72^7 = 128128 − 2 = 7 × 187的整数倍。