斐波那契数列-矩阵快速幂

这篇博客介绍了如何利用快速幂和矩阵乘法优化斐波那契数列(Fibonacci sequence)的计算,避免了递归和高时间复杂度的问题。通过初始化单位矩阵和系数矩阵,结合矩阵乘法,实现了在大数情况下快速求解Fn的高效算法。代码示例展示了C++实现的过程。
摘要由CSDN通过智能技术生成

Fn​=1 (n≤2),Fn = Fn−1​+Fn−2​ (n≥3),求给出一个n,求Fn?

分析:显然当n非常大时,使用递推的方法复杂度太高。此时需要考虑快速幂提高速度,以及矩阵乘法进行优化

 ans矩阵用来存放答案,首先应给ans初始化成单位矩阵,即主对角线的值赋值成1。

base矩阵用来存放幂,但应初始化为系数矩阵,本例中为 1   1

                                                                                            1   0

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#define ll long long

const int mod = 1e9+7;

using namespace std;
struct Node
{
	ll s[10][10];
}ans,base;

Node mul(Node x,Node y)
{
	Node temp;
	memset(temp.s,0,sizeof(temp.s));
	
	for(int i=1;i<=2;i++)
	{
		for(int j=1;j<=2;j++)
		{
			for(int k=1;k<=2;k++)
			{
				temp.s[i][j] +=  (x.s[i][k]%mod)*(y.s[k][j]%mod);
				temp.s[i][j] %= mod;
			}
		}
	}
	
	
	return temp;		
}

Node ksm(ll n)
{
	while(n)
	{
		if(n&1) ans = mul(ans,base);
		base = mul(base,base);
		n>>=1;    
	}
}


int main()
{
	memset(ans.s,0,sizeof(ans.s));
	memset(base.s,0,sizeof(base.s));
	
	base.s[1][1] = base.s[1][2] =base.s[2][1] = 1;
	ans.s[1][1] = ans.s[2][2] = 1;
	ll n;
	cin>>n;
	
	if(n<3)
	{
		cout<<1;
		return 0;
	}
	
	ksm(n);
	
	cout<<ans.s[2][1];
	
	
	return 0;
}

 

斐波那契数列矩阵快速幂实现方式如下所示: 首先,我们定义一个2阶矩阵: \[ M = \begin{bmatrix} 1\enspace 1\\ 1\enspace 0 \end{bmatrix} \] 然后,根据斐波那契数列的递推公式\[ F_n = F_{n-1} + F_{n-2} \],我们可以将这个公式抽象成矩阵运算的形式: \[ \begin{bmatrix} F_{n} \\ F_{n-1} \end{bmatrix} = M^{n-1} \cdot \begin{bmatrix} F_1 \\ F_0 \end{bmatrix} \] 其中,\[ F_1 \]和\[ F_0 \]分别表示斐波那契数列的初始值。 通过快速幂运算的思想,我们可以将指数为正整数的幂运算复杂度从\[ O(n) \]降低到\[ O(\log_2 n) \],而且矩阵乘法运算也符合结合律,因此可以使用矩阵快速幂来计算斐波那契数列。 代码实现如下: ```python import numpy as np def fibonacci_matrix_power(n, f1, f0): M = np.array([[1, 1], [1, 0]]) # 定义2阶矩阵M result = np.array([[f1], [f0]]) # 初始值矩阵 power = np.eye(2, dtype=int) # 幂运算的初始值为单位矩阵 while n > 0: if n % 2 == 1: power = np.dot(power, M) # 如果n是奇数,将M乘到结果矩阵上 M = np.dot(M, M) # 将M自乘,n每次右移一位 n //= 2 result = np.dot(power, result) # 最终的结果矩阵 return result # 返回斐波那契数列的第n项 # 测试示例 n = 10 f1 = 1 f0 = 0 fib_n = fibonacci_matrix_power(n, f1, f0) print(fib_n) ``` 这段代码通过矩阵快速幂的方式计算斐波那契数列的第n项,其中参数n为要计算的项数,f1和f0分别为斐波那契数列的初始值。运行结果为斐波那契数列的第n项的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值