在一段代码下面计算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;
}
我试图了解代码背后的算法但无法实现。 有人可以帮我向我解释一下吗?这是如何工作的,它背后的算法有一个名字吗?
答案 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运算。