【多项式】常系数齐次线性递推

TIP:这篇文章只是快速入门,并不包含更加详细的内容

Description

求以下递推式第n项:
f i = ∑ j = 1 m c j f i − j f_i=\sum_{j=1}^mc_jf_{i-j} fi=j=1mcjfij
其中 c j c_j cj为常数,
形如这样的式子叫做:常系数齐次线性递推,

接下来我们将讨论,当m较小,n很大时,如何快速求出答案

前置技能

先介绍一些必要的东西:

若对于m阶矩阵 A A A,有常数 λ \lambda λ,非零列向量 v → \overrightarrow{v} v ,满足:
λ v → = v → A \lambda \overrightarrow{v}=\overrightarrow{v} A λv =v A
那么我们就称: λ \lambda λ为矩阵特征值, v → \overrightarrow{v} v 为矩阵特征列向量,
移项得:
( λ I − A ) v → = 0 (\lambda I-A)\overrightarrow{v}=0 (λIA)v =0
也写作:
( λ I − A ) = 0 (\lambda I-A)=0 (λIA)=0
也就是说, ( λ I − A ) (\lambda I-A) (λIA)的行列式均为0,即 ∣ λ I − A ∣ = 0 |\lambda I-A|=0 λIA=0

我们可以将 ∣ λ I − A ∣ |\lambda I-A| λIA看做是关于 λ \lambda λ的一个m次多项式,记作 f ( λ ) f(\lambda) f(λ),叫做A的特征多项式,
对于矩阵 A A A的任意特征值 λ 0 \lambda_0 λ0,都有 f ( λ 0 ) = 0 f(\lambda_0)=0 f(λ0)=0

顺便也定义一下矩阵多项式(即把普通多项式 f ( x ) f(x) f(x) x x x换成一个矩阵),
这个和向量差不多,加法就直接按位相加,常乘法就直接乘,乘法就矩阵乘法,

哈密顿—凯莱定理:对于矩阵A的特征多项式 f ( x ) f(x) f(x),满足 f ( A ) = 0 f(A)=0 f(A)=0

Solution

先把原始转成矩阵乘法的形式,
对于转移矩阵C,我们考虑求它的特征多项式:
C大概是长这样的
(1) λ I − C = ( λ − c 1 − c 2 ⋯ − c m − 1 − c m − 1 λ ⋯ 0 0 0 − 1 ⋯ 0 0 ⋮ ⋮ ⋱ ⋮ ⋮ 0 0 ⋯ − 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) λIC=λc1100c2λ10cm1001cm00λ(1)
把第一行提出来,可以发现剩下的这个东西的特征多项式(行列式)比较好求,即:
f ( λ ) = λ m − ∑ i = 1 m c i λ m − i f(\lambda)= \lambda^{m}-\sum_{i=1}^mc_i \lambda^{m-i} f(λ)=λmi=1mciλmi
(本来要乘 ( − 1 ) i − 1 (-1)^{i-1} (1)i1的但被逆序对贡献的-1消掉了)

现在我们的目标是求 C n − 1 C^{n-1} Cn1,求出这个东西以后就直接乘上初始矩阵即可,

我们把 C n − 1 C^{n-1} Cn1看做是一个关于矩阵C的(n-1)次项多项式(只是只有一项罢了),
显然的, C n − 1 C^{n-1} Cn1可以写成 P ( C ) f ( C ) + R ( C ) P(C)f(C)+R(C) P(C)f(C)+R(C)的形式,其中 R ( C ) = C n − 1 m o d    f ( C ) R(C)=C^{n-1}\mod{f(C)} R(C)=Cn1modf(C)

又已知 f ( C ) = 0 f(C)=0 f(C)=0,所以只用求 R ( C ) R(C) R(C)即可,
我们可以把矩阵C先看成普通的实数x,即先求出 R ( x ) = x n − 1 m o d    f ( x ) R(x)=x^{n-1}\mod{f(x)} R(x)=xn1modf(x)中的 R ( x ) R(x) R(x)的系数,最后再考虑矩阵C,
关于 R ( x ) R(x) R(x)怎么求,我们可以考虑使用快速幂+多项式取模解决,
复杂度: O ( m log ⁡ ( n ) log ⁡ ( n ) ) O(m\log(n)\log(n)) O(mlog(n)log(n))

设矩阵 G G G表示一开始递推式的前m项, g i g_i gi表示第i项
设多项式 R ( x ) = ∑ i = 0 m − 1 d i x i R(x)=\sum_{i=0}^{m-1}d_ix^i R(x)=i=0m1dixi
好了我们现在求出了 R ( x ) R(x) R(x),现在我们要求的是 R ( C ) ∗ G R(C)*G R(C)G,将其展开:
∑ i = 0 m − 1 d i ∗ ( C i ∗ G ) \sum_{i=0}^{m-1}d_i*(C^i*G) i=0m1di(CiG)
答案就是这东西算出来的矩阵的第一项,
可以发现 C i ∗ G C^i*G CiG这个矩阵的第一项就是 g i + 1 g_{i+1} gi+1,也就是说:
A n s = ∑ i = 0 m − 1 d i ∗ g i + 1 Ans=\sum_{i=0}^{m-1}d_i*g_{i+1} Ans=i=0m1digi+1

Extra

关于递推的前m项怎么算,这个可以用生成函数解决,
我们可以把序列写成多项式 g ( x ) g(x) g(x),转移也写成多项式形式 c ( x ) c(x) c(x)
这个多项式具有无限多项,满足:
g ( x ) = g ( x ) ∗ c ( x ) + r g(x)=g(x)*c(x)+r g(x)=g(x)c(x)+r
其中r为第一项,
移项得: g ( x ) = r 1 − c ( x ) g(x)=\frac{r}{1-c(x)} g(x)=1c(x)r
这东西多项式求逆元即可,

这同时启示我们只要存在形如这样的式子即可以用这种方法解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值