常系数线性递推式的快速求单项值方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Le_ballon_rouge/article/details/51407822

常系数线性递推式的快速求单项值方法


前导知识

  • 常系数线性递推式
    • 形如f(n)=ki=1aif(ni),其中kai为常数的递推式,称为常系数线性递推式。
  • Cayley-Hamilton定理
    • 对于矩阵Adet(λEA)是一个|A|次多项式,称为A的特征多项式(characteristic polynomial),记为g(λ)
    • 对于任意矩阵A,g(A)=0
    • 证明参见任何一本高等代数教科书。
  • 模多项式
    • f是n次多项式,g是m次多项式。
    • 存在多项式kl,满足kg+l=f,且l的次数小于m。
    • lfg的余多项式。
    • 证明参见任何一本高等代数教科书。

正文

设有递推式f(n)=ki=1aif(ni),我们需要求f(m)

通常而言,我们是构建一个k阶的矩阵A,称A为递推式的伴随矩阵(adjoint matrix);构建一个向量T,其中T1,i=f(i),而(TAmk)1,1就是f(m)的值。构建AT都是平凡的,这里不再赘述。

那么问题转化为求(TAp)1,1的值,而主要的瓶颈在于求Ap的值。

Ap=kg(A)+l,其中lApg(A)的余多项式。容易发现g(λ)=λ|A||A|i=1aiλ|A|i。由Cayley-Hamilton定理,g(A)=0,于是我们只需要关注l,也就是说我们只需要求出Apg(A)。这是简单的快速幂模多项式,使用FFT可以在O(|A|log|A|logp)

最终我们得到Ap=|A|1i=0biAi。注意到我们现在仅关心[T(|A|1i=0biAi)]1,1,而对于|A|1i0(TAi)1,1都直接表示f(i+1)的值,这也就是递推的初值,于是答案就是|A|1i=0bif(i+1)

总时间复杂度为O(klogklogm)

展开阅读全文

没有更多推荐了,返回首页