跳转至

常系数齐次线性递推

简介

常系数齐次线性递推数列(又称为 C-finite 或 C-recursive 数列)是常见的一类基础的递推数列。

对于数列 (aj)j0 和其递推式

an=j=1dcjanj,(nd)

其中 cj 不全为零,我们的目标是在给出初值 a0,,ad1 和递推式中的 c1,,cd 后求出 ak。如果 kd,我们想要更快速的算法。

这里 (aj)j0 被称为 d 阶的常系数齐次线性递推数列。

Fiduccia 算法

Fiduccia 算法使用多项式取模和快速幂来计算 ak,时间为 O(M(d)logk),其中 O(M(d)) 表示两个次数为 O(d) 的多项式相乘的时间。

算法:构造多项式 Γ(x):=xdj=0d1cdjxjA(x):=j=0d1ajxj,那么

ak=xkmodΓ(x),A(x)

其中定义 (j=0n1fjxj),(j=0n1gjxj):=j=0n1fjgj 为内积。

证明:我们定义 Γ(x) 的友矩阵为

CΓ:=[cd1cd11c1]

我们定义多项式 b(x):=j=0d1bjxj

Bb:=[b0b1bd1]

观察到

[cd1cd11c1]CΓ[b0b1bd1]Bb=[cdbd1b0+cd1bd1bd2+c1bd1]BxbmodΓ

CΓ=[BxmodΓBx2modΓBxdmodΓ],(CΓ)2=[Bx2modΓBx3modΓBxd+1modΓ],(CΓ)k=[BxkmodΓBxk+1modΓBxk+dmodΓ]

我们将这个递推用矩阵表示有

[akak+1ak+d1]=[11cdcd1c1]k((CΓ))k=((CΓ)k)[a0a1ad1]

可知 ((CΓ)k) 的第一行为 BxkmodΓ,根据矩阵乘法的定义得证。

表示为有理函数

对于上述数列 (aj)j0 一定存在有理函数

P(x)Q(x)=j0ajxj

Q(x)=xdΓ(x1),$\deg{P}