线性递推数列
求第k项
记n表示线性递推关系的长度,即每一项都是前n项的线性组合。现在要求线性递推数列的第k项。
设递推数列为ai=∑nj=1ai−jcj。其特征多项式为xn−∑nj=1cjxn−j。
令Q(x)=1−∑nj=1cjxj,F(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)=[xk−12]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次的多项式卷积操作。