电力模数计算算法

时间:2015-01-05 06:42:05

标签: c++ algorithm

在一段代码下面计算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;
}

我试图了解代码背后的算法但无法实现。 有人可以帮我向我解释一下吗?这是如何工作的,它背后的算法有一个名字吗?

2 个答案:

答案 0 :(得分:2)

如果没有" 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 名词

这种类型的算法称为"exponentiation by squaring"," square-and-multiply"或"二进制取词"。

发布的算法(在评论中指出的更正后)使用c(即模数运算可以在之前或乘法中应用)这一事实以模(x*y)%z == ((x%z) * (y%z)) % z为模做同样的事情。 。尽管重复平方,但它使用此方法使a小于c

答案 1 :(得分:0)

它使用二元思维。

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

用二进制写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运算。