defmulti(a, b): # 计算二阶矩阵的相乘 c = [[0, 0], [0, 0]] # 定义一个空的二阶矩阵 for i inrange(2): for j inrange(2): for k inrange(2): # 新二阶矩阵的值计算 c[i][j] = c[i][j] + a[i][k] * b[k][j] return c
defmatrix(n): base = [[1, 1], [1, 0]] # 元矩阵,这里可以把元矩阵看做是2**0=1 ans = [[1, 0], [0, 1]] # 结果矩阵 最开始的结果矩阵也可以看做是1,因为这个矩阵和任意二阶A矩阵相乘结果都是A while n: if n & 1: # 取n的二进制的最后一位和1做与运算,如果最后一位是1,则进入if体内部 ans = multi(ans, base) # 如果在该位置n的二进制为1,则计算ans和base矩阵 base = multi(base, base) # base矩阵相乘,相当于初始base矩阵的幂*2 n >>= 1# n的二进制往右移一位 return ans[0][1] # 最后获取到的二阶矩阵的[0][1]即f(n)的值 n=int(input(">>>")) print("Matrix:",matrix(n))
defext_gcd(a, b): #扩展欧几里得算法 if b == 0: return1, 0, a else: x, y, gcd = ext_gcd(b, a % b) #递归直至余数等于0(需多递归一层用来判断) x, y = y, (x - (a // b) * y) #辗转相除法反向推导每层a、b的因子使得gcd(a,b)=ax+by成立 return x, y, gcd