我正在尝试实现模幂运算算法。
我有一些课程:
template< typename T>
class SomeMathFun {
.....
}
它有方法:
static T ModularExp(T base, T exp, T modulo) {
T result(1);
base %= modulo;
while (exp > 0) {
if (exp & 1)
result = (result * base) % modulo;
exp >>= 1;
base = (base * base) % modulo;
}
return result;
}
它适用于像5 ^ 117 mod 19这样的小数字:结果是1.但是当我尝试使用大数字时,它不能正常工作。
例如:
unsigned int a(SomeMathFun<unsigned int>::ModularExp(120, 17, 80223667));
std::cout << a;
结果是: 34313651 。但这不正确。它应该 70781811 。
我做错了什么?错误的实现还是应该使用其他算法?
P.S。:我对使用某些库中的函数不感兴趣,我对算法或至少一些实现正确工作算法的代码感兴趣,所以我可以理解它是如何工作的。
答案 0 :(得分:0)
问题在于乘法中的整数溢出。