古法求解常系数齐次线性递推

对于常系数齐次线性递推,比较现代的做法是写成 \([x^N]\frac{P(x)}{Q(x)}\) 的形式,用 Bostan-Mori 在 \(O(k\log k\log N)\) 时间内直接算出来。最近学习了 Cayley-Hamilton 定理,顺便推了一下求解这个问题比较古代的做法。

  • Cayley-Hamilton 定理

对任意域 \(F\) 和矩阵 \(A\in M_{n\times n}(F)\),考虑其特征多项式 \(f(x)=\det(xI_{n\times n}-A)\in F[x]\),有 \(f(A)=0_{n\times n}\)

证明:考虑伴随矩阵 \((xI-A)^{\lor}\),有 \((xI-A)\times (xI-A)^{\lor}=\det(xI-A)\times I\)

  • 这里的 \(xI-A,(xI-A)^{\lor}\) 都是 \(M_{n\times n}(F[x])\) 中的元素,带入 \(x=A\) 的结果并不是 \(0_{n\times n}\)

设其特征多项式 \(f(x)=c_0+c_1x+\cdots+c_{n-1}x^{n-1}+x^n\),注意到 \((xI-A)^{\lor}\) 里面 \(x\) 的多项式的次数不会高于 \(n-1\),则存在 \(n\) 个矩阵 \(D_0,D_1,\cdots,D_{n-1}\in M_{n\times n}(F)\),有 \((xI-A)^{\lor}=D_0+D_1x+\cdots+D_{n-1}x^{n-1}\)

于是有 \((xI-A)\times(D_0+D_1x+\cdots+D_{n-1}x^{n-1})=(c_0+c_1x+\cdots +c_{n-1}x^{n-1}+x^n)I\)

对比 \(x^k\) 项系数,左边为 \(-AD_k+D_{k-1}\)\(k=0\) 时为 \(-AD_0\)),右边为 \(c_kI\)

\(x^k\) 项系数乘上 \(A^k\) 求和(注意,这并不是在带入 \(x=A\)),即得 Cayley-Hamilton 定理。


实际上有更进一步的结论

\(x^k\) 项系数(\(k\ge 1\))乘上 \(A^{k-1}\) 求和,左边得到 \(D_0\),右边得到 \(c_1+c_2A+\cdots+c_{n-1}A^{n-2}+A^{n-1}\)

另一方面,\(D_0=[x^0](xI-A)^{\lor}=(-A)^{\lor}=(-1)^{n-1}A^{\lor}\),于是有

\[(-1)^{n-1}A^{\lor}=c_1+c_2A+\cdots+c_{n-1}A^{n-2}+A^{n-1} \]

这个可以直接推出 C-H 定理:

显然 \(c_0=[x^0]\det (xI-A)=\det(-A)=(-1)^n\det A\),于是

\[\begin{aligned} c_0I+c_1A+\cdots+c_{n-1}A^{n-1}+A^n&=(-1)^n\det A\times I+A(c_1+c_2A+\cdots+c_{n-1}A^{n-2}+A^{n-1})\\ &=(-1)^n\det A\times I+A\times (-1)^{n-1}A^{\lor}=0^{n\times n} \end{aligned} \]


那么众所周知对于这个题,可以写出一个矩阵 \(A\in M_{k\times k}(\mathbb F_{998244353})\) 和一个初值向量 \(v_{0\cdots k-1}\)

问题就化为计算 \((A^nv)_0\)

\(f=\text{Char}_A\)\(A\) 的特征多项式(\(A\) 的形式很特殊,\(\text{Char}_A\) 很好计算),做多项式带余除法 \(x^n=f(x)p(x)+r(x)\),则有

\[A^n=f(A)p(A)+r(A)=r(A) \]

其中 \(\deg r\le k-1\)。设 \(r(x)=\sum_{i=0}^{k-1}b_ix^i\)

那么 \((A^nv)_0=(r(A)v)_0=\sum_{i=0}^{k-1}b_i(A^iv)_0\)

这里因为当 \(i\le k-1\)\((A^iv)_0\) 实际上就是 \(v_i\),所以上面那个可以直接算出来

于是我们只需要计算 \(x^n\bmod f(x)\)

这里可以快速幂计算,如果已知 \(x^m\equiv r(x)\pmod{f(x)}\),那么 \(x^{2m}\equiv r(x)^2\pmod{f(x)}\),所以我们相当于要不断做一个 \(2k-2\) 次多项式对一个 \(k\) 次多项式取模这个事情。这个当然可以做到 \(O(k\log k)\)

那么总复杂度就是 \(O(k\log k\log n)\)


多项式取模:

我们设 \(f^R\) 表示翻转 \(f\) 的系数,形式化地有 \(f^R(x)=x^{\deg f}f(\frac{1}{x})\),那么假如要算 \(f(x)\bmod g(x)\),那么有 \(f(x)=p(x)g(x)+r(x)\),这里我们在 \(r(x)\) 前面补 \(0\),强制令 \(\deg r=\deg g-1\),则

\[f^R=x^{\deg f}f(1/x)=x^{\deg p}p(1/x)x^{\deg g}g(1/x)+x^{\deg g-1+\deg f-\deg g+1}r(1/x)\\ =p^Rg^R+x^{\deg f-\deg g+1}r^R \]

于是有 \(f^R\equiv p^Rg^R\pmod{x^{\deg f-\deg g+1}}\),于是我们把 \(f^R,g^R\) 分别对 \(x^{\deg f-\deg g+1}\) 取模,然后计算 \(\frac{1}{g^R}\pmod {x^{\deg f-\deg g+1}}\),那么就能算出 \(p^R\),进而得到 \(r^R\)。复杂度是求逆的复杂度,也就是 1log

posted @ 2024-11-26 20:12  云浅知处  阅读(228)  评论(1)    收藏  举报