快速幂

用于自己复习的快速幂算法

快速幂简介

  1. 一般所用快速幂有求数字a的b次方,还有矩阵快速幂:a矩阵的b次方。

  2. 原理简介:假设我们要求8的10次方,如果正常采用O(n)算法,每次循环乘以8。我们总共需要10次运算。

    但是,一个数的幂次可以写成加法的形式。 a k = a^k = ak= a b + c b+c b+c= a b ∗ a c a^b*a^c abac,当k=b+c时。

    我们把10用二进制表示为1010。810 = 88 ∗ * 82.观察其幂次分别为 8 = 2 3 8 = 2^3 8=23,也就是1000; 2 = 2 1 2 = 2^1 2=21,也就是10。我们发现二进制表示的数和幂次对应了起来。后续配合代码一起分析。

代码

def(a,b):
	base = 1
	while b:
		if b&1:
			base*=a
		a*=a
		b>>=1
	return base
本段采用py代码,当使用C++时,需要注意数字大小限制,选择合适的类型。还有本模板未考虑需要对某数取余,但两者代码差别不大,根据需要加上取余就可。

我们从代码中可以看出,每次b右移位时,a采用a*a的方式自增。我们考虑其指数变化,其实就是指数每次乘以2。与b二进制变化是对应的,每次右移一位,末位的对应的数乘以2。

当b&1为True时,代表这个二进制位为1,就将此位对应的数 a k a^k ak与base相乘。最终计算次数仅需要4次,便可以计算出810结果,大大减少了计算次数,O(log n)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值