python 斐波拉切数列矩阵快速幂的方法 O(logN)

本文介绍了使用矩阵快速幂方法解决斐波那契数列问题,通过矩阵变换将时间复杂度降低到O(logN),具体算法包括矩阵乘法的位运算优化,实现了在较短时间内计算斐波那契数列项的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常规的递归操作时间复杂度O(2^N), 循环操作时间复杂度O(N)
这里介绍一种时间复杂度O(logN)的解法
思路:

将 F(n) = F(n-1) + F(n-2) 变换为矩阵乘法形式:
[F(n),F(n-1)] = [F(1), F(0)] * [[1 1] [1 0]]^(n-1),
其中**[F(1), F(0)]=[1, 0],在矩阵运算时相当于取后面矩阵运算结果第一行**

例如: [F(2), F(1)] = [F(1), F(0)] * [[1 1] [1 0]] = [F(0)+F(1), F(1)]

结果F(n)可以有两种获取方法:

第一种,取矩阵运算结果第一行第一列元素,由[F(n),F(n-1)] = [F(1), F(0)] * [[1 1] [1 0]]^(n-1)得,矩阵运算n-1次

第二种,取矩阵运算结果第一行元素之和得,由[F(n-1),F(n-2)] = [F(1), F(0)] * [[1 1] [1 0]]^(n-2), F(n) = F(n-1)+F(n-2),矩阵运算n-2次,本文写的是第二种方法,见fib函数

在具体进行矩阵乘法时候采用位运算化简乘法过程:

Matrix^9
= Matrix^ 1001(二进制)
= Matrix^8 * Matirx^1
= Matrix^1000 * Matirx^1(二进制)

相当于分解为次幂的二进制位为1的数的乘积来简化计算,具体代码在matrixpower函

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值