快算求幂算法
来源:互联网 发布:阿里云取消实名认证 编辑:程序博客网 时间:2024/06/04 18:40
快速求幂运用平方乘方法是可能的。在传统算法中,只用乘法来模拟求幂,但是,快速求幂算法既运用平方也运用乘法。这种方法的主要想法就是把指数当作 比特 的二进制数来处理,例如 。通常x可以写作:
注意,y是项的乘积。每一项既是1(如果相关的比特是0)也是(如果相关的比特是1)。也就是说,如果比特是1, 这一项包含在乘积当中;如果比特是0(乘以1是没有作用的),就不包含在乘法当中。图9-6给出了写这种算法的一般概念。我们可以对底数连续平方, 。如果相关的比特是0,这一项就不包括在乘法过程中;如果比特是1,就包括在乘法过程中。算法9.7反映的就是这两种观点。
算法9.7 平方乘算法的伪代码
算法9.7运用次迭代。在每次迭代中,它都要检验相应比特的值。如果比特的值是1,它就用前面结果的值乘以当前底数,再把这个底数平方,准备在下一次迭代中使用。注意,在最后一步中是不需要平方的(不用这个结果)。
例9.45
图9-7所示的就是运用算法9.7(为了更简单,没有显示模)计算的过程。在这种情况下, 。指数有5个比特。
在除最后一步的每一步中都要进行平方。只有相关比特是1,才进行乘法。图9-7所示的就是怎样逐渐累积y的值直到 的方法。solid boxes(坚实盒)表明乘法被忽略了并且前面的y值要带入下一步。表9-3所示的就是 值的计算过程,结果是y = 4。
表9-3 的计算
i
xi
乘法 (初始化:y = 1)
平方(初始化:a = 17)
0
0
®
a = 172 mod 21 = 16
1
1
y = 1 ´ 16 mod 21 = 16 ®
a = 162 mod 21 = 4
2
1
y = 16 ´ 4 mod 21 = 1 ®
a = 42 mod 21 = 16
3
0
®
a = 162 mod 21 = 4
4
1
y = 1 ´ 4 mod 21 = 4 ®
复杂度 算法9.7运用 算术运算的最大值,其中 是比特中模的长度,所以算法的比特运算复杂度是 或呈多项式增长。
快速指数算法的比特运算复杂度是多项式的。
参考:http://book.51cto.com/art/200812/102582.htm
- 快算求幂算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 去掉xcode编译warning:ld: warning: directory not found for option '---- iOS开发之最灵异事件之5
- Ajax 进行Post传值和Get传值
- AndroidGUI18:ListView常用技巧
- 汇编—多重循环—矩阵乘法
- AVAudioPlayer连续播放音乐的代码(通到单例)
- 快算求幂算法
- POJ 1094 Sorting It All Out
- 归纳一下:C#线程同步的几种方法
- Spring+Hibernate+Struts2整合所需要的Jar包
- Windows phone 7之页面布局
- *** is not in the sudoers file 问题解决
- 指针
- Struts2.1.6+Spring2.5.6+Hibernate3.3.2+mysql整合+分页模板
- CF 6E Exposition(RMQ | 线段树,二分)