【发布时间】:2017-04-03 04:58:15
【问题描述】:
我正在尝试实现模幂算法。
我有一些课:
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.:我对使用某些库中的函数不感兴趣,我对算法或至少一些实现正确工作算法的代码感兴趣,因此我可以理解它是如何工作的。
【问题讨论】:
-
我认为你的一个多重乘法溢出了。您应该使用至少可以容纳模平方的类型。试试 uint64_t
-
你需要阅读整数溢出。
-
哦,非常感谢,帮了大忙。
标签: c++ algorithm c++11 exponentiation modular-arithmetic