这是我的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
答案 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;