这篇文章主要分析一些矩阵快速幂的原理(需要一定的线性代数的基础)、使用技巧。
我们从最基本的斐波那契数列开始吧,我们知道斐波那契数列有一个明显的递推公式f(n)=f(n-1)+f(n-2) (n>=3)可知:第n项依赖于前两项。
如果按照一般的求解过程,那么意味着,我们如果要求第n项就必须知道前n-1项,这对于n很大的情况就很不利,那有没有可能不求前n项直接求din项呢?
实际上是有的,数学天赋好的同学即使按照高中的递推公式经验我们也能求出其斐波那契数列通项公式:
但是我们今天介绍的是另一种对数学能力要求没有那么高的求解方法,矩阵乘法。
矩阵乘法,顾名思义,就是两个矩阵相乘。而在相乘的求解过程中则会有递归项的求解。
[ f1 f2 * [ a1 a2 = [ f1*a1+f2*a3, f1*a2+f2*a4
f3 f4 ] a3 a4 ] f3*a1+f4*a3, f3*a2+f4*a4 ]
我们如果将f1、f2两项定为递归项相邻的两项,那么result中f1*a1+f2*a3, f1*a2+f2*a4两项就包含这两相邻项的线性运算和。
(如果递推公式涉及三项递推项求和,可以使用三阶矩阵。如https://mp.csdn.net/editor/html/82021881)
我们选择 f1*a2+f2*a4作为递推项,即a2=1,a4=1。因为不需要f3,f4,可以设置为零。(因为要求第一列的第二项为相邻项的较大一项。)
则初始矩阵即[f1,f2; 0,0],我们需要相乘后的矩阵仍然跟初始矩阵格式相同,即第一行是相邻的递归项。
因为f1+f2=f3,则f1*a1+f2*a3应该为f2,且f3*a1+f4*a3=0, f3*a2+f4*a4=0,故a1=0,a2=1,a3=1,a4=1。
我们设res1 = 【f1,f2; 0, 0】,res2 = 【f2,f3; 0, 0】,...,resn = 【fn-2,fn-1; 0, 0】,p = 【0,1;1,1】
则有 res2 = res1*p, res3= res1*p^2,..., resn = res1*p^(n-1)
此时,我们便求出了递推项的矩阵通项公式。