在指数平方中递归的工作

Working of recursion in Exponential squaring?

本文关键字:工作 递归 方中 指数      更新时间:2023-10-16

我在codechef教程中阅读了快速乘法的指数平方法,我对该方法有一些疑问

long long int fast_exp(int base, int exp)
{
if(exp==1)
return base;
else
{
    if(exp%2 == 0)
    {
        long long int base1 = pow(fast_exp(base, exp/2),2);
        if(base1 >= 1000000007)
        return base1%1000000007;
        else
        return base1;
    }
    else
    {
        long long int ans = (base*  pow(fast_exp(base,(exp-1)/2),2));
        if(ans >= 1000000007)
        return ans%1000000007;
        else
        return ans;
    }
  }
} 

我的疑问是这个方法是否在每个递归步骤执行"%"操作,或者在计算实际的基本^exp之后的最后一步执行。我个人认为它在最后一步以及在我针对运行此代码时计算%

base=345 and exp=246;

它给了我垃圾值

我想知道"%"操作发生时,在每一步或最后一步。

您的问题有点令人困惑,所以我实际上不知道您想问什么,但我确实看到您的代码有三个主要问题:

  • pow浮点幂运算,这意味着当数字足够大时会出现舍入错误。当你试图做精确的整数运算时,你不能使用它
  • 您似乎试图对特定的30位模数进行算术模运算,这意味着乘以三个减少的量(例如,将一个数字平方,然后乘以另一个数字)将得到大小高达90位的结果,从而溢出long long,因为它可能只是64位类型
  • 您使用的是带符号的类型,但您的所有代码似乎都假设您的所有数字都是非负的