- 快速幂算法求模
在计算比较大的数时,比如计算乘方时,通常结果成指数增长,此时计算速度会很慢,因此通常采用快速幂求模。
快速幂算法能帮我们算出指数非常大的幂,传统的求幂算法之所以时间复杂度非常高(为O(指数n)),就是因为当指数n非常大的时候,需要执行的循环操作次数也非常大。所以我们快速幂算法的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算。这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。让我们先来看一个简单的例子:
大概的思想是,以计算3^10=3*3*3*3*3*3*3*3*3*3为例,每次尽量想办法将指数次数变小。
3^10=(3*3)*(3*3)*(3*3)*(3*3)*(3*3)
3^10=(3*3)^5
3^10=9^5
//指数缩小一半,但当指数为基奇数的时候,先分个1次幂出来
9^5=(9^4)*(9^1)
9^5=(81^2)*(9^1)
//把指数缩小一半,底数执行平方操作
9^5=(6561^1)*(9^1)
9^5=(6561^0)*(9^1)*(6561^1)=1*(9^1)*(6561^1)=(9^1)*(6561^1)=9*6561=59049
规律:最后求出的幂结果实际上就是在变化过程中所有当指数为奇数时底数的乘积。
代码:
def FasterPower2(base, power):
'''
base:需要求幂的数
power:幂次数
''' result = 1 while power > 0: if power & 1: # 与1进行与操作,等价于power%2 == 1 result = result * base % 1000 power >>= 1 #右移操作,等价于power = power/2 base = (base * base) % 1000 return result