利用逐次平方法快速求幂
2016-04-28 23:02
260 查看
利用逐次平方法可以快速求幂,这里不局限于数的幂,但以数的幂来举例说明。
要求ak,如果直接用a连乘k次,复杂度比较大。如果把k写成如下形式:
k = u0 + 2u1 + 22u2 + … + 2rur, ui = 0 或 1.
然后制作模a的幂次表:
a1 = A0,
a2 = (a1)2 = A02 = A1,
…
a2r = (a2r-1)2 = Ar-12 = Ar.
于是ak = A0u0A1u1…Arur。
注意到Ai即为Ai-1的平方,这样复杂度就降为O(log(k)),即为O(r)。以下伪码是实现逐次平方法的有效代码:
[c]
b = 1;
while k is positive do
if k is odd
then b = a*b;
a = a*a;
k shift right by 1 bit;
return b;
[/c]
要求ak,如果直接用a连乘k次,复杂度比较大。如果把k写成如下形式:
k = u0 + 2u1 + 22u2 + … + 2rur, ui = 0 或 1.
然后制作模a的幂次表:
a1 = A0,
a2 = (a1)2 = A02 = A1,
…
a2r = (a2r-1)2 = Ar-12 = Ar.
于是ak = A0u0A1u1…Arur。
注意到Ai即为Ai-1的平方,这样复杂度就降为O(log(k)),即为O(r)。以下伪码是实现逐次平方法的有效代码:
[c]
b = 1;
while k is positive do
if k is odd
then b = a*b;
a = a*a;
k shift right by 1 bit;
return b;
[/c]
相关文章推荐
- jsp/java代码中用jdbc驱动代替jdbc-odbc桥连接SQL Server数据库
- 深入浅出ES6(五):不定参数和默认参数
- 网络编程
- 个人冲刺07
- spring
- SSH(基于注解)
- JavaScript知识总结—cookie及其应用
- 180W多路输出式单片精密开关电源电路及分析
- iOS开发UILabel自适应宽度
- 构建之法读后感04
- 水平垂直居中常见解决方案
- 学习笔记 第十周 第一篇
- redis 的使用 (sort set排序集合类型操作)
- eclispse项目导入Android项目 java.lang.UnsatisfiedLinkError: Native method not found:
- Git的基本操作
- 在Matlab中调用ZXing的代码生成QR二维码
- bootstrap 改变模态弹出框的样式
- 深入浅出ES6(四):模板字符串
- 个人冲刺06
- nginx1.8.0和php7.0.4编译安装脚本