本文大量参考了:
- 国家集训队2019论文集,钟子谦,两类递推数列的性质和应用
线性递推数列
基本性质和判定方法
一些定义:
-
对于无限数列 {a0,a1,⋯} 和有限非空数列 {r0=1,r1,⋯,rm−1},若对于任意 p≥m−1,有 ∑m−1k=0ap−krk=0,则称数列 r 为数列 a 的线性递推式。
对于有限数列 {a0,a1,⋯,an−1} 和有限非空数列 {r0=1,r1,⋯,rm−1},若对于任意 m−1≤p≤n−1,有 ∑m−1k=0ap−krk=0,则称数列 r 为数列 a 的线性递推式。
-
称存在线性递推式的无限数列为线性递推数列(有限数列一定存在线性递推式)。
-
称线性递推式 {r0,r1,⋯,rm−1} 的阶数为它的长度减 1(即 m−1),称数列 a 的阶数最小的线性递推式为数列 a 的最短线性递推式。
用生成函数的观点看线性递推式,我们将有如下结论:
-
定理 1:对于无限数列 {a0,a1,⋯} 和有限非空数列 {r0=1,r1,⋯,rm−1},设它们的生成函数分别为 A,R,那么数列 r 为数列 a 的线性递推式等价于存在次数不超过 m−2 的多项式 S 满足 AR+S=0。
对于有限数列 {a0,a1,⋯,an−1} 的情况,要满足的条件变为 AR+S≡0(modxn) 即可。
证明:考虑无限序列的情况,按照定义,对于 k≥m−1 我们肯定有 [xk](AR)=0,那么只需要取适当的 S 使得低次项系数为 0 即可。
推论 1:对于无限数列 {a0,a1,⋯} 及其生成函数 A,a 为线性递推数列当且仅当存在存在常数项为 1 的多项式 R 和 S 满足 A=SR。此时对应的线性递推式的阶数为 max(deg(R),deg(S)+1)。
证明:由定理1移项得到。
-
定理 2:对于一个 n×n 的矩阵 M,无限数列 {I,M,M2,⋯} 是一个线性递推数列,它的最短线性递推式阶数不超过 n。
证明:考虑矩阵 M 的特征多项式 p(λ)=|λI−M|,其次数为 n 且 n 次项恰好为 1。由 Cayley-Hamilton 定理可知 p(M)=0。
设 p(λ)=∑ni=0ciλn−i,那么就有 ∑ni=0ciMn−i=0。那么即可对任意 j≥n 推出 ∑ni=0ciMj−i=0。
于是 {c0,⋯,cn} 即为一个合法的阶数为 n 的线性递推式。
线性递推数列还满足以下的封闭性:
- 定理 3:对于线性递推数列 {a0,a1,⋯},{b0,b1,⋯},我们有:
- {ai+bi}∞i=0 为线性递推数列。
- {∑ij=0ajbi−j}∞i=0 为线性递推数列。
- {aibi}∞i=0 为线性递推数列。
前两者的证明都较为简单,直接按推论1设 A=S1R1,B=S2R2 即可。对于最后一者,可以从特征根的角度证明。
求一个数列的最短线性递推式
Berlekamp-Massey 算法。
先考虑有限数列 {a0,⋯,an} 的情况。我们会求出其每个前缀 {a0,⋯,ai} 的最短线性递推式 r(i)(设 li 为 r(i) 的阶数)。首先显然有 li−1≤li。
-
引理 1:如果 r(i−1) 不是 {a0,⋯,ai} 的最短线性递推式,那么:
li≥max(li−1,i−li−1+1)
证明:显然只需证 li≥i−li−1+1。
反证法。假设 li≤i−li−1,设 r(i−1)={p0,⋯,pli−1},r(i)={q0,⋯,qli}。那么:
−li−1∑j=1pjai−j=li−1+li∑s=2ai−s∑jpjqs−j=−li∑j=1qjai−j=ai
中间那一步用到了 i−(li−1+li)≥0。
所以 r(i−1) 也为 {a0,⋯,ai} 的线性递推式,显然它就是最短的,矛盾。
由此我们证明了 li 的下界, 而 Berlekamp-Massey 算法给出了取到下界的方案。
设 A 为数列 a 的生成函数,R(i) 为数列 r(i) 的生成函数,那么根据定理1可知存在多项式 S(i) 使得 AR(i)≡S(i)(modxi+1),其中 deg(S(i))≤li−1。
考虑由 R(i−1) 推到 R(i):
-
如果我们仍然有 AR(i−1)≡S(i−1)(modxi+1),那么令 R(i)←R(i−1) 即可。
-
否则,设 AR(i−1)−S(i−1)≡dxi(modxi+1)。我们考虑上一次增长递推式的情形,设当时存在 p<i 和 c 使得 AR(p−1)−S(p−1)=cxp(modxp+1),那么我们就有:
AR(i−1)−S(i−1)≡dxi(modxi+1)AR(p−1)−S(p−1)≡cxp(modxp+1)
将下式乘上 t⋅xi−p(其中 t=dc,注意 c,d 均不可能等于 0),再将两式相减,即可得到:
A(R(i−1)−txi−pR(p−1))−(S(i−1)−txi−pS(p−1))≡0(modxi+1)
取 R(i)=R(i−1)−txi−pR(p−1) 即可。
放在现实意义中的阿巴阿巴:考虑 r(p−1),它满足对于 j<p 都是成立的,但 j=p 时会多算出一些东西。我们利用这个性质,对 r(p−1) 进行适当的修改、放缩、补零,即可得到一个对于 j<i 取值都是 0、对于 j=i 取值恰好为 d 的递推式。然后再用 r(i−1) 和这个递推式相减即可消去第 i 位的多余部分。
然后可以归纳证明这样得到的 li 一定满足 li=max(li−1,i−li−1+1)。由于 p 是最近的一次增长递推式的时候,所以我们有 li−1=lp=p−lp−1+1,那么:
li=max(li−1,(i−p)+lp−1)=max(li−1,(i−p)+(p−lp+1))=max(li−1,i−lp+1)
即证。
那么我们只要枚举 i 并按照上述算法计算 r(i) 和 li 即可,注意 li>li−1 时需要对 p,c 进行更新。时间复杂度 O(n2)。
对于无限数列的情况,我们有如下定理:
-
定理 4:对于线性递推数列 {a0,a1,⋯},若它的最短线性递推式阶数不超过 s,那么 {a0,⋯,a2s−1} 的最短线性递推式即为 a 的最短线性递推式。
证明:设 {a0,a1,⋯} 的最短线性递推式阶数为 q,{a0,⋯,a2s−1} 的最短线性递推式阶数为 p,那么必定有 p≤q 且 p+q≤2s。接下来的证明就和引理1的证明类似了。
所以如果我们知道数列 a 最短线性递推式阶数的上界 s,我们只需要求出这个数列长度为 2s 的前缀并求出它的最短线性递推式即可。
求一个矩阵序列的最短线性递推式
这里需要假设运算均在模某个大质数 p 下进行。
对于 n 行 m 列的矩阵序列 {t0,t1,⋯},考虑在模 p 意义下随机一个 n 维行向量 u 和一个 m 维列向量 v,然后计算标量序列 {ut0v,ut1v,⋯} 的最短线性递推式。
根据一个我不会证的定理,它们的最短线性递推式相同的概率为 1−n+mp,即单次错误的概率为 n+mp。
求矩阵的最小多项式
n×n 的矩阵 M 的最小多项式为次数最小的使得 f(M)=0 的多项式 f。
设 f(x)=∑mi=0cixm−i。类似于定理2的证明,我们知道 M 的零化多项式 f 对应着无限数列 {I,M,M2,⋯} 的一个线性递推式。
所以矩阵 M 的最小多项式对应着无限数列 {I,M,M2,⋯} 的最短线性递推式。
根据定理2,再套用前两节的做法,我们需要先计算出 {I,uMv,⋯,uM2n−1v}。使用递推计算,过程中是向量乘矩阵,单次乘法为 O(n2),总时间复杂度 O(n3)。
整式递推数列
这个比较难,就只有最基础的一点东西(
基本性质和判定方法
一些定义:
-
对于无限数列 {a0,a1,⋯} 和有限非空多项式数列 {P0,P1,⋯,Pm−1},若 P0 非零且对于任意 p≥m−1,有 ∑m−1k=0ap−kPk(p)=0,则称数列 P 为数列 a 的整式递推式。
对于有限数列 {a0,a1,⋯,an−1} 和有限非空多项式数列 {P0,P1,⋯,Pm−1},若 P0 非零且对于任意 m−1≤p≤n−1,有 ∑m−1k=0ap−kPk(p)=0,则称数列 P 为数列 a 的整式递推式。
-
称存在整式递推式的无限数列为整式递推数列(有限数列一定存在整式递推式)。
-
称整式递推式 {P0,P1,⋯,Pm−1} 的阶数为它的长度减 1(即 m−1),次数为 maxideg(Pi)。
容易看出线性递推数列也是整式递推数列。
接下来给出整式递推数列最基本的判定方法:
-
称形式幂级数 A(x) 为微分有限的,当且仅当存在多项式 Q0(x),⋯,Qm−1(x) 满足 Qm−1(x)≠0 且 ∑m−1i=0Qi(x)A(i)(x)=0。
-
定理 5:对于无限数列 {a0,a1,⋯} 及其生成函数 A,a 为整式递推数列当且仅当 A 是微分有限的。
证明:对于必要性,这里直接给出一种明了的构造方式:
设 {P0,⋯,Pm−1} 为 a 的整式递推式(满足 ∀n≥m−1,∑m−1k=0an−kPk(n)=0)。设 D=maxideg(Pi)。
设 Ai(x)=xiA(i)(x)(0≤i≤D)。
那么对于任意 n≥D,[xn]Ai(x)=fi(n)an,其中 fi(n) 是关于 n 的 i 次多项式(具体来说是一个下降幂的形式,不过这不重要)。
那么,当 n≥D+m−1 时:
[xn]D∑i=0Q′i(x)xiA(i)(x)=m−1∑k=0D∑i=0([xk]Q′i(x))([xn−k]Ai(x))=m−1∑k=0D∑i=0q′i,kfi(n−k)an−k=m−1∑k=0an−kD∑i=0q′i,kfi(n−k)=m−1∑k=0an−kD∑i=0q′i,kf′i(n)
由于 f′i(n) 为关于 n 的 i 次多项式,所以 {f′0(n),⋯,f′D(n)} 线性组合张成的空间包含了所有关于 n 的次数不超过 D 的多项式,那么我们选取合适的 q′i,k 使得 ∑Di=0q′i,kf′i(n)=Pk(n) 即可。
再令 Qi(x)=Q′i(x)xi,于是对于任意 n≥D+m−1,[xn]∑Di=0Qi(x)A(i)(x)=∑m−1k=0an−kPk(n)=0。
上述过程建议画图推导。
那么现在我们已经构造出一组 Qi(x) 满足 ∑Di=0Qi(x)A(i)(x)=S(x),其中 S(x) 为一有限次多项式。
再对等式两边同时求 deg(S(x))+1 阶导,即可证明 A 是微分有限的。
至于充分性,直接将 ∑m−1i=0Qi(x)A(i)(x)=0 展开,然后对于充分大的 n,取左式的 n 次项系数即可得到一个 a 的整式递推式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通