计算幂后取模的算法

Algorithm of calculate modulo after power

本文关键字:算法 计算      更新时间:2023-10-16

下面一段代码来计算a^b%c的值,

int powermod(int a,int b,int c)
{
    int ans = 1;
    while(b)
    {
        if(b&1)
            ans=(ans*a)%c;
        a=(a*a)%c;
        b=b>>1;
    }
    return ans;
}

我试图理解代码背后的算法,但无法做到。有人可以帮助我解释一下吗?这是如何工作的,它背后的算法有名字吗?

如果没有"modulo c"部分,更容易看到发生了什么:

int power(int a,int b)
{
    int ans = 1;
    while(b)
    {
        if(b&1)
            ans *= a;
        a=a*a;
        b=b>>1;
    }
    return ans;
}

这是一种标准算法,通过一次考虑一个位来计算b,从最低有效位开始b。对于b的每一位,如果1,则将答案乘以当前值a。然后,要移动到下一个位,a平方并将b向右移动 1 位。该算法的理论是 x 2 m + 2 n = x 2mx 2n

这种类型的算法被称为"平方求幂"、"平方乘法"或"二进制幂"。

发布的算法(如注释中所述的校正后)使用(x*y)%z == ((x%z) * (y%z)) % z的事实(即模运算可以在乘法之前或乘法之前应用)做同样的事情模c)。它使用它来保持a小于c,尽管反复平方。

它使用二元思维。

a

b = ab1 a b2 ... abnb1+...+bn=b 时

用二进制写 b,你会得到一个b0 a 2*b1 a4*b2...a 2nbn,bi 表示二进制 b 中的第 i 位。它只能是 0 或 1。

现在我们发现我们不需要每次都计算 2 n,因为我们可以从2n-1 得到它

由于 (a b)%

c=(a%c)(b%c)%c,此算法在乘法时执行 mod 运算。