常系数齐次线性递推
问题
给定一个线性递推数列 的前 项 ,和其递推式 的各项系数 ,求 。
前置知识
多项式取模。
做法
定义 ,那么答案就是 。
由于 ,所以 ,所以 。
设 。
那么 。
那么就可以通过多次对 加上 的倍数来降低 的次数。
也就是求 。 的次数不超过 ,而 已经给出了,就可以算了。
问题转化成了快速地求 ,只要将 普通快速幂 中的乘法与取模换成 多项式乘法 与 多项式取模 就可以在 的时间复杂度内解决这个问题了。
矩阵的解释
该算法由 Fiduccia 在 1985 年提出,对于 我们定义列向量 为
那么不难发现
而因为 中每一行都满足这个递推关系,不难将 描述为一个线性组合如
有
将两边的 消去后不难得到多项式 满足 其中 为一个 的零矩阵。假设我们要求 不难构造多项式 那么 ,而现在我们可将 写成 而其中零矩阵是没有贡献的,那么 。令 有 。而 显然,令 那么
即
我们关注 的第一行就是 已知,那么 可在 时间简单得到。求出 则可用快速幂和多项式取模与上述解释是一样的。该算法常数较大,使用生成函数可以得到一个常数更小的算法,见 一种新的线性递推计算方法。
buildLast update and/or translate time of this article2023/5/1 00:35:51,Check the history
editFound smelly bugs? Translation outdated? Wanna contribute with us? Edit this Page on Github
peopleContributor of this article QAQAutoMaton, Tiphereth-A, hly1204, Enter-tainer, thredreams
translateTranslator of this article Visit the original article!
copyrightThe article is available under CC BY-SA 4.0 & SATA ; additional terms may apply.