为什么递归模幂运算不等于迭代?

时间:2014-04-16 17:15:15

标签: 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;
}

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

1 个答案:

答案 0 :(得分:1)

我认为使用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;

}