求斐波那契数列的第n项的最优解---矩阵快速幂

#矩阵快速幂求斐波那契数列的第n项
class matrix2by2:
    def __init__(self, m00, m01, m10, m11):
        self.m_00 = m00
        self.m_01 = m01
        self.m_10 = m10
        self.m_11 = m11

#矩阵乘法
def matrix_multiply(matrix_1, matrix_2):
    m00 = matrix_1.m_00 * matrix_2.m_00 + matrix_1.m_01 * matrix_2.m_10
    m01 = matrix_1.m_00 * matrix_2.m_01 + matrix_1.m_01 * matrix_2.m_11
    m10 = matrix_1.m_10 * matrix_2.m_00 + matrix_1.m_11 * matrix_2.m_10
    m11 = matrix_1.m_10 * matrix_2.m_01 + matrix_1.m_11 * matrix_2.m_11
    return matrix2by2(m00, m01, m10, m11)

#矩阵快速幂运算
def matrix_quick_power(matrix, k):
    res_matrix = matrix2by2(1, 0, 0, 1)
    factor_matrix = matrix
    if k == 0:
        return matrix2by2(1, 0, 0, 1)
    while k != 0:
        if k & 1 == 1:
            res_matrix = matrix_multiply(res_matrix, factor_matrix)
        k >>= 1
        factor_matrix = matrix_multiply(factor_matrix, factor_matrix)
    return res_matrix

def getFibonacci(n):
    if n <= 0:
        return "error, please input a positive number!"
    if n == 1 or n == 2:
        return 1
    a = 1
    b = 1
    matrix = matrix_quick_power(matrix2by2(0, 1, 1, 1), n - 2)
    return a * matrix.m_01 + b * matrix.m_11

num = eval(input("斐波那契数列的第n项:"))
print(getFibonacci(num))

你可能感兴趣的:(python,算法基础)