线性代数 --- 计算斐波那契数列第n项的快速算法(矩阵的n次幂)

ops/2024/9/23 9:34:34/

 计算斐波那契数列>斐波那契数列第n项的快速算法(矩阵的n次幂)

The n-th term of Fibonacci Numbers:

        斐波那契数列>斐波那契数列的是一个古老而又经典的数学数列,距今已经有800多年了。关于斐波那契数列>斐波那契数列的计算方法不难,只是当我们希望快速求出其数列中的第100,乃至第1000项时,有没有又准又快的方法,一直是一个值得探讨和研究的问题。笔者(松下J27)在这篇文章中,就介绍了一种基于线性代数的快速算法,即,基于矩阵的n次幂找到斐波那契数列>斐波那契数列的第n项。这是我在MIT线性代数的公开课中看到的,并以此文记录下来。

(意大利数学家斐波那契,图片来源于参考文献【1】) 

已知斐波那契数列>斐波那契数列的数学表示方式如下:

<a class=Fibonacci:0,1,1,2,3,5,8,13,21,34......" class="mathcode" src="https://latex.csdn.net/eq?Fibonacci%3A0%2C1%2C1%2C2%2C3%2C5%2C8%2C13%2C21%2C34......" />

他始于数列的前两个初始值0,1,后面所有的项都是前两项的和,依此类推得到:

0+1=11+1=21+2=32+3=53+5=8。。。

        基于上面的计算规律,假设我用F_{i}来表示该数列的第i个数的话,那斐波那契数列>斐波那契数列用代数的方式可写成两个初值和一个递归公式的组合,即:

F_{0}=0,F_{1}=1

F_{i+2}=F_{i}+F_{i+1},\: i=0,1,2...

        现在把上面的公式用矩阵和向量的方式来表示,以便于用线性代数来分析:

1,先把初值用向量u0来表示

u_{0}=\begin{bmatrix} F_{0}\\ F_{1} \end{bmatrix}=\begin{bmatrix} 0\\ 1\end{bmatrix}

2,用向量u_{i}表示数列中的第n项。

 u_{i}=\begin{bmatrix} F_{i}\\ F_{i+1} \end{bmatrix}

3,如此一来根据递归公式就能写出第i+1项u_{i+1}

u_{i+1}=\begin{bmatrix} F_{i+1}\\ F_{i+2} \end{bmatrix}=\begin{bmatrix} F_{i+1}\\ F_{i}+F_{i+1} \end{bmatrix}

4,用矩阵来表示从第i项u_{i}到第i+1项u_{i+1}的过程

u_{i+1}=\begin{bmatrix} F_{i+1}\\ F_{i+2} \end{bmatrix}=\begin{bmatrix} F_{i+1}\\ F_{i}+F_{i+1} \end{bmatrix}=\begin{bmatrix} 0 &1 \\ 1& 1\end{bmatrix}\begin{bmatrix} F_{i}\\ F_{i+1} \end{bmatrix}=\begin{bmatrix} 0 &1 \\ 1& 1\end{bmatrix}u_{i}

其中,参与计算的矩阵A为:

A=\begin{bmatrix} 0& 1\\ 1&1 \end{bmatrix}

         现在,我们知道了初始向量u_{0},也知道如果计算u_{i+1},我们就能通过线性代数中矩阵与向量的计算来计算斐波那契数列>斐波那契数列中的任意一项:

        可以看到,如果你要计算第100项,不出意外,只要把上述步骤继续下去一定能够找到。另外,如果把上述计算中的三次计算合成一部,就是三个矩阵A连续相乘后,再乘以u0。

        这就是说,斐波那契数列>斐波那契数列中第n项的计算公式应该是:

u_{n}=A\cdot A\cdot A\cdot A...\cdot Au0=A^{n}u0

u_{n}=A^{n}u0 (式1) 

这里要注意的是,根据这种方法算出来的是一个向量,而我们需要的结果,即,第n项是该向量中的第一个元素。


引入矩阵的对角化:

        熟悉线性代数的朋友看到A的n次幂时,马上就会想到是否可以通过特征向量矩阵X特征值矩阵\Lambda对A进行对角化。

线性代数 --- 矩阵的对角化以及矩阵的n次幂-CSDN博客文章浏览阅读1k次,点赞15次,收藏9次。本文从矩阵A的对角化开始,一直聊到了对角化的应用,并以一个A的n次幂为例子结尾。https://blog.csdn.net/daduzimama/article/details/138088128

因为,如果方阵A可以被对角化为:

A=X\Lambda X^{-1}

那么上面推导出来的斐波那契数列>斐波那契数列的第n项的计算公式就能简化为:

u_{n}=A\cdot A\cdot A\cdot A...\cdot Au0=A^{n}u0\Rightarrow

u_{n}=(X\Lambda X^{-1})\cdot (X\Lambda X^{-1})\cdot (X\Lambda X^{-1})...\cdot (X\Lambda X^{-1})u0=X\Lambda ^{n}X^{-1}u0

u_{n}=X\Lambda ^{n}X^{-1}u0 , (式2) 

 

现在我们试着用(式2)去计算斐波那契数列>斐波那契数列的第100项:

第一步,计算矩阵A的特征向量与特征值:

\lambda _{1}=-0.61803399,x_{1}=\begin{bmatrix}-0.85065081 \\ 0.52573111\end{bmatrix}

\lambda _{2}=1.61803399,x_{2}=\begin{bmatrix}-0.52573111\\ -0.85065081\end{bmatrix}

 通过计算得出了两个不同的特征值,说明矩阵A可以对角化。

第二步,构建特征向量矩阵X,特征值矩阵\Lambda和特征向量矩阵的逆:

X=\begin{bmatrix} -0.85065081&-0.52573111 \\ 0.52573111&-0.85065081 \end{bmatrix}

\Lambda =\begin{bmatrix} -0.61803399 &0 \\ 0 & 1.61803399 \end{bmatrix}

 X^{-1}=\begin{bmatrix} -0.85065081&0.52573111 \\ -0.52573111&-0.85065081 \end{bmatrix}

第三步,计算特征值矩阵\Lambda的100次幂:

 \Lambda ^{100}=\begin{bmatrix} -0.61803399^{100} &0 \\ 0 & 1.61803399^{100} \end{bmatrix}

=\begin{bmatrix}1.26251334E-21 &0 \\ 0 & 7.92070840E+20 \end{bmatrix}

第四步,基于(式2)去计算第100项的值:

 u_{100}=\begin{bmatrix} 3.54224848E+20\\ 5.73147844E+20 \end{bmatrix}

其中,第100项的值为:

F_{100}=3.54224848E+20

进一步简化:

如果我能把u0表示成所有特征向量的线性组合的话,就能更进一步简化计算:

u_{0}=c_{1}x_{1}+c_{2}x_{2}...+c_{n}x_{n}=Xc (式3) 

其中,权重系数向量c等于:

c=X^{-1}u_{0} (式4) 

如此一来,斐波那契的第n项的计算公式(式1)就变成了:

u_{n}=A^{n}(c_{1}x_{1}+c_{2}x_{2}...+c_{n}x_{n})=c_{1}A^{n}x_{1}+c_{2}A^{n}x_{2}...+c_{n}A^{n}x_{n} (式5) 

 又因为这里的x都是特征向量,根据特征向量的性质,我们有Key Equation:

Ax=\lambda x

对于上式中的第一项c_{1}A^{n}x_{1}有:

c_{1}A^{n}x_{1}=c_{1}A\cdot A...\cdot A\cdot Ax_{1}=c_{1}A\cdot A...\cdot A\cdot \lambda _{1}x_{1}

因为\lambda _{1}是一个系数,所以我们把他提到前面去:

c_{1}A^{n}x_{1}=c_{1}\lambda _{1}A\cdot A...\cdot Ax_{1}

这样一来又出现了一个\lambda _{1},继续:

c_{1}A^{n}x_{1}=c_{1}\lambda _{1}A\cdot A...\cdot \lambda _{1}x_{1}

如此反复,一直到第n个乘法:

c_{1}A^{n}x_{1}=c_{1}\lambda _{1}^{n}A

依此类推,(式5)可改写成:

u_{n}=c_{1}\lambda _{1}^{n}x_{1}+c_{2}\lambda _{2}^{n}x_{2}...+c_{n}\lambda _{n}^{n}x_{n} (式6) 

 (式6) 也可以写成:

u_{n}=c_{1}\lambda ^{n}x_{1}+c_{2}\lambda ^{n}x_{2}...+c_{n}\lambda ^{n}x_{n}=X\Lambda ^{n}c (式7) 

这一点也可以通过把 (式3)代入(式2)得到(式7)

u_{n}=X\Lambda ^{n}X^{-1}u0=X\Lambda ^{n}X^{-1}(Xc)=X\Lambda ^{n}c

这里面最重要的是(式6),因为他把计算分离开了,分成了一个个常数与向量的乘积之和。

现在针对这一简化算法做一个小结,并以求斐波那契的第100项为例:

第一步,优先使用(式4)算出权重向量c

c=X^{-1}u_{0}=\begin{bmatrix} 0.52573111\\ -0.85065081 \end{bmatrix} 

\Rightarrow c_{1}=0.52573111, c_{2}=-0.85065081 

 

第二步,分别计算c_{1}\lambda _{1}^{100}x_{1}c_{2}\lambda_{2} ^{100}x_{2},其中c和\lambda都是常数。

 

第三步,求和。把第二步的结果加在一起,求出最终的结果。在本例中,因为c_{1}\lambda _{1}^{100}x_{1}中的元素几乎为0,所以他们二者的和几乎约等于c_{2}\lambda_{2} ^{100}x_{2}

u_{100}=c_{1}\lambda _{1}^{100}x_{1}+c_{2}\lambda _{2}^{100}x_{2}=\begin{bmatrix} F_{100}\\ F_{101} \end{bmatrix}

最终,得到了同样正确的结果:

F_{100}=3.54224848E+20


 (全文完) 

--- 作者,松下J27

参考文献(鸣谢):

1,https://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91

2, Lec22_对角化和矩阵乘幂_哔哩哔哩_bilibili

(配图与本文无关) 

版权声明:所有的笔记,可能来自很多不同的网站和说明,在此没法一一列出,如有侵权,请告知,立即删除。欢迎大家转载,但是,如果有人引用或者COPY我的文章,必须在你的文章中注明你所使用的图片或者文字来自于我的文章,否则,侵权必究。 ----松下J27


http://www.ppmy.cn/ops/24865.html

相关文章

mySQL商城项目实战 (终)(全部表)(1-88张)

本章无sql语句&#xff0c;直接放转出的sql文件。 88张表结果如图! 资源在已经与文章绑定&#xff0c; 在navicat工具中&#xff0c;执行以下步骤 在新建的数据库中右键,点击【运行sql文件】&#xff0c;运行绑定的资源&#xff0c;之后您就可以在您的navicat中看到我建好的8…

Golang特殊init函数

介绍 init()函数是一个特殊的函数&#xff0c;存在一下特性 不能被其它函数调用&#xff0c;而是子main()函数之前自动调用不能作为参数传入不能有传入参数和返回值 作用&#xff1a; 对变量进行初始化检查/修复程序状态注册运行一次计算 以下是<<the way to go>>…

什么是智慧民航?详解实现智慧民航目标的关键工具与技术

一、 智慧民航是什么&#xff1f; 智慧民航是指运用现代信息技术&#xff0c;特别是互联网、大数据、云计算、物联网和人工智能等&#xff0c;对民航业的各个环节进行优化和革新的一种模式。它致力于实现民航服务的个性化、运营的高效化、管理的智能化和监管的精准化&#xf…

E-MapReduce极客挑战赛季军方案

前一段时间我参加了E-MapReduce极客挑战赛&#xff0c;很幸运的获得了季军。在这把我的比赛攻略给大家分享一下&#xff0c;希望可以抛砖引玉。 赛题分析与理解 赛题背景&#xff1a; 大数据时代&#xff0c;上云已成为越来越多终端客户大数据方案的落地选择&#xff0c;阿里…

Flutter创建自定义的软键盘

参考代码&#xff1a; Flutter - Create Custom Keyboard Examples 本文贴出的代码实现了一个输入十六进制数据的键盘&#xff1a; &#xff08;1&#xff09;支持长按退格键连续删除字符&#xff1b; &#xff08;2&#xff09;可通过退格键删除选中的文字&#xff1b; &…

Agent AI智能体的未来

随着科技的飞速发展&#xff0c;Agent AI智能体的智能化水平也在不断提高&#xff0c;它们将在未来社会中扮演更加重要的角色。以下是我对Agent AI智能体未来发展趋势的探讨&#xff0c;涵盖技术进步与创新、伦理与法律规范以及经济与就业市场三个方面。 一、技术进步与创新 …

【JDBC】数据库连接池

1 简介 1.1 概念 持有多个数据库连接的容器&#xff0c;当程序需要操作数据库的时候&#xff0c;直接可以从池中取出连接&#xff0c;使用完成之后&#xff0c;再放回到池中。 1.2 优点 节省资源。如果每次访问数据库&#xff0c;都需要创建新的连接&#xff0c;在使用完成后…

Oracle 表分区

1.概述 分区表就是将表在物理存储层面分成多个小的片段&#xff0c;这些片段即称为分区&#xff0c;每个分区保存表的一部分数据&#xff0c;表的分区对上层应用是完全透明的&#xff0c;从应用的角度来看&#xff0c;表在逻辑上依然是一个整体。 目的&#xff1a;提高大表的查…