如果在2 ^ n除以m时有任何可能的有效方法找到余数,我在徘徊,其中n和m是随机整数。是否有任何方程式我将n和m转换为给我剩余的或者我们必须遵循递归方法? 请注意我是初学者,我刚刚开始,所以可能不会理解太复杂的东西。
提前致谢。
答案 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 − a
是p
的整数倍。例如,如果
a = 2
和p = 7
,2^7 = 128
和128 − 2 = 7 × 18
是7
的整数倍。