繁体   English   中英

上电后取模的算法

[英]Algorithm of calculate modulo after power

在一段代码下面,计算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 2 m x 2 n

这种类型的算法称为“平方求幂” ,“平方乘”或“二进制求幂”。

发布的算法(在注释中指出的校正之后)使用c (x*y)%z == ((x%z) * (y%z)) % z (即,模运算可以在运算之前或乘法之前进行。 它使用是为了保持a低于c尽管一再平方。

它使用二元思维。

当b1 + ... + bn = b时a b = a b1 a b2 ... a bn

用二进制写b,您将得到b0 a 2 * b1 a 4 * b2 ... a 2 n bn ,bi表示二进制b中的第i位。 只能是0或1。

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

由于(a b)%c =(a%c) (b%c)%c,因此该算法在乘法时执行mod操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM