[英]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.