使用模运算来实现乘法运算

时间:2014-06-11 04:52:06

标签: c++

这是我的powmod功能:

int powmod(int b, int e, int m)
{
    int result = 1;
    while(e > 0){
        if(e & 1){
            result *= b;
            result %= m;
        }
        b *= b;
        b %= m;
        e >>= 1;
    }
    return result;
}

所以当我使用这个函数时,我只需插入:

powmod(2,6,11);

这是2 ^ 6 mod 11,如果我想插入(2 ^ 6 * 11)mod p。 我该如何修改或插入值?

与以下内容不同:

powmod(2,6,11) * (11%p); //the result is different from (2^6*11) mod p

2 个答案:

答案 0 :(得分:2)

如果您的意思是(2^(6*11)) mod p,则应插入调用powmod(2, 6 * 11, p)

的结果

如果您的意思是((2^6) * 11) mod p,则可以执行以下操作

long long int a = powmod(2, 6, p);
a *= 11 % p;  /* mod -> % */
a %= p;

(int)a包含您所需的值,因此请将其插入。

作为旁注,函数中的整数可能会溢出。

您应该在更宽的int中捕获乘法结果,或者编写一个不会溢出的自定义乘法函数。

<强> IDEA1

int powmod(int b_, int e, int m)
{
    long long int result = 1LL;
    long long int b = b_;
    while(e > 0){
        if(e & 1){
            result *= b;
            result %= m;
        }
        b *= b;
        b %= m;
        e >>= 1;
    }
    return (int)result;
}

<强> IDEA2

int safe_mul(int m1, int m2, int modulus) {
  /* Useful for competetions where modulus is usually 10^9 + 7 or 10^9 + 9 */
  /* If modulus is larger, this would need more modifications while adding */
  int i = 0, j = m1;
  while(m2) {
    if(m2 % 2) i = (i + j) % modulus;
    j = (2 * j) % modulus;
    m2 /= 2;
  }
  return i % modulus;
}

int powmod(int b, int e, int m)
{
    int result = 1;
    while(e > 0){
        if(e & 1){
            result = safe_mul(result, b, p);
            result %= m;
        }
        b = safe_mul(b, b, p);
        e >>= 1;
    }
    return result;
}

这两个想法只是为了让您了解如何实现这一功能。实际实施可能取决于您的要求。

答案 1 :(得分:1)

Mohit Jain通过减少广义调用来正确回答这个问题,这可能是:

int val = powmod( powmod(2,6,11)*11, 1, 11 );

但我想指出x * y (mod y)始终为零。所以事实上,你的例子简化为:

int val = 0;