【问题标题】:Modular Exponentiation with big numbers大数的模幂运算
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-14
    • 2014-08-21
    • 2016-01-21
    • 2011-01-13
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多