二进制幂--求解a^n问题

思考:站在程序的角度看,如何快速计算出这里写图片描述 的值?
1. 第一种方法:写一个for循环,循环13次,每次让前一个值乘以a.即可得出结果.(计算12次)
2. 使用二进制幂算法 , 只需要5次计算过程


二进制幂的计算过程:
首先将13使用二进制表示:1101,然后建立表格,第二行的第一个值为a(不用计算),
后面的每个单元格计算方式:

  • 如果所求单元格对应的二进制位为1,:那该单元格的值=前一单元格的值的平方*a
  • 若所求单元格对应的二进制位为0,那么所求单元格的值=前一单元格的值的平方
    这里写图片描述
程序伪代码:
LeftRightBinaryExponentiation(a,b(n))
//用从左到右二进制幂算法计算a^n
//输入:一个底数a和二进制位bi,...,b0的列表b(n),这些位来自于一个正整数n的二进制展开式
//下面的 <- 表示赋值过程
product <- a
for i <- (I-1) downto 0 do
    product <-  product * product
    if b[i] = 1 product <-  product * a 
return product

从伪代码看,二进制幂算法计算次数M(n)明显减少,
(b-1)<=M(n) <= 2(b-1),其中b代表二进制位的长度.考虑到这里写图片描述,可以知道从左到右二进制幂算法的效率时对数级的.

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值