TIP:這篇文章只是快速入門,並不包含更加詳細的內容
Description
求以下遞推式第n項:
fi=j=1∑mcjfi−j
其中cj爲常數,
形如這樣的式子叫做:常係數齊次線性遞推,
接下來我們將討論,當m較小,n很大時,如何快速求出答案
前置技能
先介紹一些必要的東西:
若對於m階矩陣A,有常數λ,非零列向量v ,滿足:
λv=vA
那麼我們就稱:λ爲矩陣特徵值,v爲矩陣特徵列向量,
移項得:
(λI−A)v=0
也寫作:
(λI−A)=0
也就是說,(λI−A)的行列式均爲0,即∣λI−A∣=0,
我們可以將∣λI−A∣看做是關於λ的一個m次多項式,記作f(λ),叫做A的特徵多項式,
對於矩陣A的任意特徵值λ0,都有f(λ0)=0,
順便也定義一下矩陣多項式(即把普通多項式f(x)的x換成一個矩陣),
這個和向量差不多,加法就直接按位相加,常乘法就直接乘,乘法就矩陣乘法,
哈密頓—凱萊定理:對於矩陣A的特徵多項式f(x),滿足f(A)=0
Solution
先把原始轉成矩陣乘法的形式,
對於轉移矩陣C,我們考慮求它的特徵多項式:
C大概是長這樣的
λI−C=⎝⎜⎜⎜⎜⎜⎛λ−c1−10⋮0−c2λ−1⋮0⋯⋯⋯⋱⋯−cm−100⋮−1−cm00⋮λ⎠⎟⎟⎟⎟⎟⎞(1)
把第一行提出來,可以發現剩下的這個東西的特徵多項式(行列式)比較好求,即:
f(λ)=λm−i=1∑mciλm−i
(本來要乘(−1)i−1的但被逆序對貢獻的-1消掉了)
現在我們的目標是求Cn−1,求出這個東西以後就直接乘上初始矩陣即可,
我們把Cn−1看做是一個關於矩陣C的(n-1)次項多項式(只是只有一項罷了),
顯然的,Cn−1可以寫成P(C)f(C)+R(C)的形式,其中R(C)=Cn−1modf(C)
又已知f(C)=0,所以只用求R(C)即可,
我們可以把矩陣C先看成普通的實數x,即先求出R(x)=xn−1modf(x)中的R(x)的係數,最後再考慮矩陣C,
關於R(x)怎麼求,我們可以考慮使用快速冪+多項式取模解決,
複雜度:O(mlog(n)log(n))
設矩陣G表示一開始遞推式的前m項,gi表示第i項
設多項式R(x)=∑i=0m−1dixi
好了我們現在求出了R(x),現在我們要求的是R(C)∗G,將其展開:
i=0∑m−1di∗(Ci∗G)
答案就是這東西算出來的矩陣的第一項,
可以發現Ci∗G這個矩陣的第一項就是gi+1,也就是說:
Ans=i=0∑m−1di∗gi+1
Extra
關於遞推的前m項怎麼算,這個可以用生產函數解決,
我們可以把序列寫成多項式g(x),轉移也寫成多項式形式c(x)
這個多項式具有無限多項,滿足:
g(x)=g(x)∗c(x)+r
其中r爲第一項,
移項得:g(x)=1−c(x)r
這東西多項式求逆元即可,
這同時啓示我們只要存在形如這樣的式子即可以用這種方法解決,