【问题标题】:Trouble with modular exponentiation模幂运算的问题
【发布时间】:2020-03-31 11:36:45
【问题描述】:

我正在尝试解决一个问题,我们必须输出给定数字 n^p 的最后一位。

int modularExponentiation(int n, long long p, int m){
    if(p == 0) return 1;
    if(p & 1)
        return (n % m * modularExponentiation((n*n) % m, p / 2, m) % m) % m;//line 4
    return modularExponentiation((n*n) % m, p / 2, m) % m;
}

在这个递归代码中,我们在这里通过在第 4 行应用模数来更改临时结果。这不会对最终答案带来任何变化吗?例如,如果在任何中间阶段答案是 81^4,在 81 处应用 %10 并将其替换为 1,它不会改变最终结果吗?

【问题讨论】:

    标签: c++ number-theory modular-arithmetic


    【解决方案1】:

    不,这不会影响结果,因为(a*b)%m == ((a%m) * (b%m))%m。求幂当然只是重复乘法,所以同样的原理也适用。

    (81^4)%10 足够小,可以手动尝试。来吧,写出来。

    【讨论】:

    • 我正在寻找这个方程的数学术语。你能帮我吗?:D
    • @RoQuOTriX 我认为没有人关心命名这种相等性。当您学习模运算时,您通常会学习它以及如何证明它。
    • 我认为它有一个名字,正如我们在密码学中讨论的那样。但也许只有基于等式​​的加密方法的名称
    • @MSalters 我知道 (a*b)%m == ((a%m) * (b%m))%m。但我的问题是,如果 b 是一个小数,我们使用相同的算法,但在任何地方都没有模数。但是由于我们用它们的模数替换结果,所以 a^b 的最终计算不会受到影响,如果最终结果没有受到影响,您能否提及我们如何选择模数(在这种情况下为 m)(考虑 a %m 和 a>m)。提前致谢。
    • @PranavVenkata:逻辑是我们可以将a 写为(a/m)*m + (a%m)b 也是如此。请记住,在 C++ 中,a/m 向下舍入。现在(a/m)*m 显然是m 的倍数,所以((a/m)*m)%m == 0。所以我们所要做的就是写出a*b 得到(a/m*b/m)*m*m + (a/m*b%m+b/m*a%m)*m + (a%m)*(b%m)。同样,m 的所有倍数都与 0 一致,以 m 为模。
    【解决方案2】:

    对于模加法和乘法,你可以在每一步都取一个mod,它不会影响结果。事实上,这就是您应该进行模幂运算以避免溢出的方式。因此,您的最终函数将如下所示:

    long long modExp(long long n, long long p, long long m) {
        if (p == 0) {
            // m could be 1 you never know
            return 1 % m;
        }
        n %= m;
        return (n * modExp(n, p - 1, m)) % m;
    }
    

    【讨论】:

    • 让我们考虑 (3^3)%10,它可以写成 (3%10*3%10*3%10)%10,结果是 27%10,即 7。如果我们将基数 27 替换为 7(考虑到 27 是递归过程中的中间结果),那不会在解决方案中给我们错误的结果吗?提前谢谢!
    • 我如何考虑上面的 m(modulo)?
    • @PranavVenkata 7 % 10 也是 7。我认为您需要阅读有关模运算的更多信息。
    • @PranavVenkata:模 10、27 和 7 全等。对于兼容的操作,您可以替换全等数字。请注意,并非所有操作都兼容。 √4 是 2,但 √64 = 8。然而 64%10=4,但 8%10 不是 2。但是,乘法是兼容的。
    • 加法、减法和乘法完全适用于模运算。除法确实有效,只是您需要采取一些额外的步骤。
    猜你喜欢
    • 2019-02-06
    • 2014-08-21
    • 2017-04-03
    • 2017-02-02
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多