快速幂取模算法模板
2010-03-15 12:29
302 查看
快速模取幂算法~
2009-07-07 19:37
2009-07-07 19:37
快速模取幂 数论计算中经常出现的一种运算就是求一个数的幂ab对另外一个数n个模的运算,即计算: ab mod n (a,b,n是正整数) 由于计算机只能表示有限位的整数,所以编程时模取幂的运算要注意值的大小范围,当ab的值超过整数范围时,mod运算便无法进行。 如何解决这个问题,我们引出一个能计算ab mod n的值的有用算法——反复平方法,首先我们必须明确: d=ab mod n=(…((((a mod n)*a)mod n)*a)mod n…*a)mod n {共b个a} 由此可以引出一个迭代式 d:=a; for i:=2 to b do d:=d mod n*a; d:=d mod n; 时间复杂度为O(b),当b很大时,效率很低。我们可以将b转换为二进制数<bk,bk-1,...,b1,b0>,然后从最低位b0开始,由右至左逐位扫描,每次迭代时,用到下面两个恒等式: a2c mod n =(ac)2 mod n bi=0 a2c+1 mod n =a*(ac)2 mod n bi=1 (0<=c<=b) 其中c为b的二进制数的后缀(bi-1...b0)对应的十进制数,当c成倍增加时,算法保持d=ac mod n不变,直至c=b。 程序实现可如下: long long result(long long a,long long b,long long m) { long long d,t; d=1; t=a; while (b>0) { if (b%2==1) d=(d*t)%m; b/=2; t=(t*t)%m; } return d; } |
相关文章推荐
- 快速幂取模算法模板
- 快速幂取模算法证明及实现
- FZU 1649 Prime number or not (米勒拉宾大素数判断+快速幂取模+随机数模板)
- 趣味程序设计_高次方数(快速幂 模板 大数取模用公式)
- 快速幂取模算法【模板】
- 快速开根模板(卡马克算法)
- 矩阵快速幂模板(可以在二重循环或者三重循环的地方取模)
- 趣味程序设计_高次方数(快速幂 模板 大数取模用公式)
- 趣味程序设计_高次方数(快速幂 模板 大数取模用公式)
- 趣味程序设计_高次方数(快速幂 模板 大数取模用公式)
- hdu 1097 A hard puzzle(快速幂取模模板题)
- 分析模板的一段简单快速的算法片段
- hdu5972 Regular Number (bitset应用+快速匹配+shiftAnd匹配算法学习模板)
- 快速幂算法模板
- 51nod 1113 矩阵连乘快速幂模板 (对100000007取模)
- 趣味程序设计_高次方数(快速幂 模板 大数取模用公式)
- 算法模板之快速幂取模
- CodeForces 450B (矩阵快速幂模板题+负数取模)
- 快速幂取模算法【模板】
- 趣味程序设计_高次方数(快速幂 模板 大数取模用公式)