矩阵乘法幂

参考: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 383431只需要计算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))

猜你喜欢

转载自blog.csdn.net/qq_39573785/article/details/115252739