首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fast_Modular_Exponentiation递归函数的解释

Fast_Modular_Exponentiation递归函数的解释
EN

Stack Overflow用户
提问于 2020-08-01 18:05:21
回答 2查看 132关注 0票数 0

这是我目前正在学习的udemy课程的代码形式。这段代码是解决(a^n)%b.的递归解决方案。

代码语言:javascript
复制
int fastExpo(int a, long long n, int MOD) {
    if(n == 0)
        return 1;

    /// (a^n) % MOD
    if(n % 2 == 0)
        /// a ^ n = ((a ^ 2) ^ (n/2))
        return fastExpo((1LL * a * a) % MOD, n / 2, MOD);

    /// a ^ n = a * (a ^ (n - 1))
    return (1LL * a * fastExpo(a, n - 1, MOD)) % MOD;
}

在这里,我不理解这一行代码:(1LL * a * a) % MOD。我理解万一(x^n)%MOD = ((x^(n/2))^2)%MOD,是偶数的话,但是我不明白为什么我们要计算(a^2)%MOD,,而我们应该计算((a^2)^(1/2))%MOD。那么,有人能解释一下这个递归步骤是如何正确的吗?在这种情况下,递归是如何工作的呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-01 18:35:56

这里,当n甚至被使用时

代码语言:javascript
复制
(x^n)%MOD = (((x^2)%MOD)^(n/2))%MOD

这也是正确的,并在代码中使用这个。

因为算法上说(a ⋅ b) mod m = [(a mod m) ⋅ (b mod m)] mod m

查找包含投诉的详细信息这里

票数 0
EN

Stack Overflow用户

发布于 2020-08-01 18:31:29

((a^2)^(1/2))%MOD等于a%MOD。因此,如果n是奇数算法,则用a乘以电流值,然后从n中减去1,在下一步得到偶数n

算法的全部解释可以在这里找到:指数化,见右向左二进制方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63208464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档