参考:https://blog.csdn.net/u014799564/article/details/97623391; https://blog.csdn.net/bianxia123456/article/details/105167294/
int __pow(int a,int b){
int ans = 1;
while(b--){
ans *= a;
}
return ans;
}
做题的时候都需要处理指数很大运算,例如101000000,这个时候如果用上面的算法来计算的话,就要循环一百万次,程序就会超时。这时就需要用到快速幂运算。
int __poww(int a,int b){
int ans = 1;
while(b){
if(b & 1 != 0){
ans *= a;
}
a *= a;
b >>= 1;
}
return ans;
}
快速幂算法的原理是通过将指数拆分成几个因数相乘的形式,来简化幂运算。在我们计算 313的时候,普通的幂运算算法需要计算13次,但是如果我们将它拆分成 3{8+4+1},再进一步拆分成 3 8 ∗ 3 ∗ 4 ∗ 3 1 3^8*3*4*3^1 38∗3∗4∗31只需要计算4次。
def quickPow(a,n):
res = 1
while(n):
if n%2 != 0:
res *= a
a *= a #翻倍
n >>= 1 #二进制右移一位
return res
a,n = map(int,input().split())
print(quickPow(a,n))
如果要实现矩阵快速幂运算,则将数乘替换为矩阵乘法即可
#以2x2矩阵相乘为例
m = [[1 for i in range(2)]for j in range(2)]
m[1][1] = 0
n = int(input())
def mulMatrix(x,y): #定义二阶矩阵相乘的函数
ans = [[0 for i in range(2)]for j in range(2)]
for i in range(2):
for j in range(2):
for k in range(2):
ans[i][j] += x[i][k] * y[k][j]
return ans
def quickMatrix(m,n):
E = [[0 for i in range(2)]for j in range(2)] #先定义一个单位矩阵
for i in range(2):
E[i][i] = 1
while(n):
if n % 2 != 0:
E = mulMatrix(E,m)
m = mulMatrix(m,m)
n >>= 1
return E
print(quickMatrix(m,n))