快速求幂运用平方乘方法是可能的。在传统算法中,只用乘法来模拟求幂,但是,快速求幂算法既运用平方也运用乘法。这种方法的主要想法就是把指数当作 比特 的二进制数来处理,例如 。通常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。
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