TIP:这篇文章只是快速入门,并不包含更加详细的内容
Description
求以下递推式第n项:
fi=∑j=1mcjfi−jf_i=\sum_{j=1}^mc_jf_{i-j}fi=j=1∑mcjfi−j
其中cjc_jcj为常数,
形如这样的式子叫做:常系数齐次线性递推,
接下来我们将讨论,当m较小,n很大时,如何快速求出答案
前置技能
先介绍一些必要的东西:
若对于m阶矩阵AAA,有常数λ\lambdaλ,非零列向量v→\overrightarrow{v}v ,满足:
λv→=v→A\lambda \overrightarrow{v}=\overrightarrow{v} Aλv=vA
那么我们就称:λ\lambdaλ为矩阵特征值,v→\overrightarrow{v}v为矩阵特征列向量,
移项得:
(λI−A)v→=0(\lambda I-A)\overrightarrow{v}=0(λI−A)v=0
也写作:
(λI−A)=0(\lambda I-A)=0(λI−A)=0
也就是说,(λI−A)(\lambda I-A)(λI−A)的行列式均为0,即∣λI−A∣=0|\lambda I-A|=0∣λI−A∣=0,
我们可以将∣λI−A∣|\lambda I-A|∣λI−A∣看做是关于λ\lambdaλ的一个m次多项式,记作f(λ)f(\lambda)f(λ),叫做A的特征多项式,
对于矩阵AAA的任意特征值λ0\lambda_0λ0,都有f(λ0)=0f(\lambda_0)=0f(λ0)=0,
顺便也定义一下矩阵多项式(即把普通多项式f(x)f(x)f(x)的xxx换成一个矩阵),
这个和向量差不多,加法就直接按位相加,常乘法就直接乘,乘法就矩阵乘法,
哈密顿—凯莱定理:对于矩阵A的特征多项式f(x)f(x)f(x),满足f(A)=0f(A)=0f(A)=0
Solution
先把原始转成矩阵乘法的形式,
对于转移矩阵C,我们考虑求它的特征多项式:
C大概是长这样的
(1)λI−C=(λ−c1−c2⋯−cm−1−cm−1λ⋯000−1⋯00⋮⋮⋱⋮⋮00⋯−1λ)
\lambda I-C= \left(
{
\begin{matrix}
\lambda-c_1 & -c_2 & \cdots &-c_{m-1} & -c_m \\
-1 & \lambda & \cdots & 0 &0 \\
0 & -1 &\cdots & 0 & 0\\
\vdots & \vdots & \ddots & \vdots &\vdots \\
0 & 0 & \cdots & -1 & \lambda
\end{matrix} \tag{1}
}
\right)
λI−C=⎝⎜⎜⎜⎜⎜⎛λ−c1−10⋮0−c2λ−1⋮0⋯⋯⋯⋱⋯−cm−100⋮−1−cm00⋮λ⎠⎟⎟⎟⎟⎟⎞(1)
把第一行提出来,可以发现剩下的这个东西的特征多项式(行列式)比较好求,即:
f(λ)=λm−∑i=1mciλm−if(\lambda)= \lambda^{m}-\sum_{i=1}^mc_i \lambda^{m-i}f(λ)=λm−i=1∑mciλm−i
(本来要乘(−1)i−1(-1)^{i-1}(−1)i−1的但被逆序对贡献的-1消掉了)
现在我们的目标是求Cn−1C^{n-1}Cn−1,求出这个东西以后就直接乘上初始矩阵即可,
我们把Cn−1C^{n-1}Cn−1看做是一个关于矩阵C的(n-1)次项多项式(只是只有一项罢了),
显然的,Cn−1C^{n-1}Cn−1可以写成P(C)f(C)+R(C)P(C)f(C)+R(C)P(C)f(C)+R(C)的形式,其中R(C)=Cn−1mod  f(C)R(C)=C^{n-1}\mod{f(C)}R(C)=Cn−1modf(C)
又已知f(C)=0f(C)=0f(C)=0,所以只用求R(C)R(C)R(C)即可,
我们可以把矩阵C先看成普通的实数x,即先求出R(x)=xn−1mod  f(x)R(x)=x^{n-1}\mod{f(x)}R(x)=xn−1modf(x)中的R(x)R(x)R(x)的系数,最后再考虑矩阵C,
关于R(x)R(x)R(x)怎么求,我们可以考虑使用快速幂+多项式取模解决,
复杂度:O(mlog(n)log(n))O(m\log(n)\log(n))O(mlog(n)log(n))
设矩阵GGG表示一开始递推式的前m项,gig_igi表示第i项
设多项式R(x)=∑i=0m−1dixiR(x)=\sum_{i=0}^{m-1}d_ix^iR(x)=∑i=0m−1dixi
好了我们现在求出了R(x)R(x)R(x),现在我们要求的是R(C)∗GR(C)*GR(C)∗G,将其展开:
∑i=0m−1di∗(Ci∗G)\sum_{i=0}^{m-1}d_i*(C^i*G)i=0∑m−1di∗(Ci∗G)
答案就是这东西算出来的矩阵的第一项,
可以发现Ci∗GC^i*GCi∗G这个矩阵的第一项就是gi+1g_{i+1}gi+1,也就是说:
Ans=∑i=0m−1di∗gi+1Ans=\sum_{i=0}^{m-1}d_i*g_{i+1}Ans=i=0∑m−1di∗gi+1
Extra
关于递推的前m项怎么算,这个可以用生成函数解决,
我们可以把序列写成多项式g(x)g(x)g(x),转移也写成多项式形式c(x)c(x)c(x)
这个多项式具有无限多项,满足:
g(x)=g(x)∗c(x)+rg(x)=g(x)*c(x)+rg(x)=g(x)∗c(x)+r
其中r为第一项,
移项得:g(x)=r1−c(x)g(x)=\frac{r}{1-c(x)}g(x)=1−c(x)r
这东西多项式求逆元即可,
这同时启示我们只要存在形如这样的式子即可以用这种方法解决,
本文探讨了如何在m阶递推式中,当n值较大时,利用矩阵特征值和多项式取模技巧,快速求解递推式第n项。通过矩阵乘法和快速幂算法,结合多项式运算,提出了一种高效的解决方案。
2924

被折叠的 条评论
为什么被折叠?



