线性递推数列

Published: by Creative Commons Licence

  • Tags:

求第k项

n表示线性递推关系的长度,即每一项都是前n项的线性组合。现在要求线性递推数列的第k项。

设递推数列为ai=nj=1aijcj。其特征多项式为xnnj=1cjxnj

Q(x)=1nj=1cjxjF(x)表示线性递推数列的生成函数。则P(x)=Q(x)F(x)的度数小于n

由于P(x)=P(x)modxn,因此P(x)=(Q(x)modxn)(F(x)modxn)

同理F(x)=P(x)Q(x)。我们实际上要求的则是[xk]P(x)Q(x)

P(x)Q(x)=[xk]P(x)Q(x)=[xk]P(x)Q(x)Q(x)Q(x)=[xk]A(x2)+xB(x2)C(x2)

如果k是奇数,则有:

[xk]P(x)Q(x)=[xk]xB(x2)C(x2)=[xk12]B(x)C(x)

否则k是偶数,则有

[xk]P(x)Q(x)=[xk]A(x2)C(x2)=[xk2]A(x)C(x)

上面的过程给出了一个O(M(n)log2k+M(n))时间复杂度的算法,并且只需要执行2log2k次的多项式卷积操作。

参考资料