具有大数字的模块化指数

时间:2016-11-19 11:31:12

标签: c++ algorithm c++11 exponentiation modular-arithmetic

我正在尝试实现模幂运算算法。

我有一些课程:

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。:我对使用某些库中的函数不感兴趣,我对算法或至少一些实现正确工作算法的代码感兴趣,所以我可以理解它是如何工作的。

1 个答案:

答案 0 :(得分:0)

问题在于乘法中的整数溢出。