c++ - 为什么递归模幂不等于迭代?

标签 c++ algorithm recursion exponentiation modular-arithmetic

我已经实现了一个非递归模幂运算

typedef long long uii;
uii modularExponentiation(uii base,uii exponent,uii p)
{
    int result= 1;
    base = base % p;
    while( exponent > 0)
    {
        if (exponent % 2 == 1)
           result = (result * base) % p;
        exponent = exponent >> 1;
        base = (base * base) % p;
    }
    return result;
}

还有一个是递归的

uii modularExponentiation(uii base,uii exponent,uii p)
{
    if(exponent == 0)
      return 1;
    int res= modularExponentiation(base,exponent/2,p);
    if(exponent%2 == 0)
        return (res * res)%p;
    else
        return ((res*res)*(base%p))%p;


    return res;
}

但是这两个代码并没有产生正确的结果。来自维基百科的迭代代码给出了正确的结果。我在递归版本中做错了什么,我应该怎么做才能修复它?

最佳答案

我认为使用 int res 而不是 uii res 是有可能溢出的问题。此外,甚至 ((res*res)*base%p)%p 也会导致溢出。

改进代码:-

uii modularExponentiation(uii base,uii exponent,uii p)
{
    if(exponent == 0)
      return 1;
    uii res= modularExponentiation(base,exponent/2,p);
    res = (res*res)%p;
    if(exponent%2 == 0)
        return res;
    else
        return (res*(base%p))%p;

}

关于c++ - 为什么递归模幂不等于迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23116005/

相关文章:

python - 从边缘列表构建所有哈密顿路径

python - 我怎样才能使这个递归爬行函数迭代?

c - 二叉搜索树查找输出

c++ - sprintf 小数点太多/太少

c# - 为什么在创建带参数的构造函数时默认的无参数构造函数消失

使用推导的 C++ 可变参数扩展

java - 如何在 Java 8 中填充 map ?

c++ - 在 C++ 中删除二维动态数组时出现问题(最终存储在 vector 中)

algorithm - Line(x1,y1,x2,y2) 只需要使用 PutPixel(x,y) 示例吗?

java - 给定一个单词,找到字典中最长的单词,该单词可以使用传递的单词组成