计算幂后取模的算法
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 2mx 2n。
这种类型的算法被称为"平方求幂"、"平方乘法"或"二进制幂"。
发布的算法(如注释中所述的校正后)使用(x*y)%z == ((x%z) * (y%z)) % z
的事实(即模运算可以在乘法之前或乘法之前应用)做同样的事情模c
)。它使用它来保持a
小于c
,尽管反复平方。
它使用二元思维。
ab = ab1 a b2 ... abn当b1+...+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 运算。
相关文章:
- 如何实现高效的算法来计算大型数据集的多个不同值?
- OpenCV - Python 断言错误:SAD 算法 - 立体相机视差图计算
- 通过指针算法计算数组长度
- 计算数组重复次数的组合的有效算法,加起来达到给定的总和
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- 当比特数不是8的倍数时,使用切片8算法计算CRC
- 使用 Prim 算法计算最小生成树:如何使其简单?
- 计算数组中存在其总和的对数的算法
- 如何计算摘要/将使用哪种算法?
- 通过分而治算法计算数组的最大数量
- 使用位移算法计算平方根始终输出相同的数字
- 使用 Dijkstra 算法计算两个节点之间的最短路径
- openCV的EMD-L1算法计算的距离为零
- 利用OpenGL、c++实现了绕线数算法计算内外部区域
- SSE算法计算矩阵乘积的速度比直接算法慢得多
- 算法:计算单词列表频率的更好方法
- 为我的算法计算每字节的周期
- 有没有快速的算法计算能力乘以1 / 2
- 模块化算法计算错误
- 用Chudnovsky算法计算圆周率