数学顶尖科技学习笔记
常系数齐次线性递推
考虑普通递推式:
\(f_n = \displaystyle\sum_{i = 1}^k c_i f_{n - i}\)
一般我们会用矩阵来表示递推关系,再通过矩阵快速幂来优化时间复杂度到 \((k^3 \log_2 n)\),但有些时候 \(n\) 会特别大,大到 \(\log_2 n\) 可能等于 \(10^6\),这是我们就需要用常系数齐次线性递推来优化矩阵快速幂。
特征多项式
定义
在求矩阵的特征值时,我们需要求方程 \(\det(\lambda I - A) = 0\) 的解,此时如果我们定义 \(\phi_A(\lambda) = \det(\lambda I - A)\),那么此时 \(\phi_A(\lambda) = 0\) 的根就是特征值,而 \(\phi_A(\lambda)\) 就称为 \(A\) 的特征多项式。
假设 \(A\) 的特征值分别为 \(v_1, v_2, \dots, v_n\),那么特征多项式又可以写成 \(\phi_A(\lambda) = (\lambda - v_1)(\lambda - v_2) \dots (\lambda - v_n)\),可以发现 \(\phi_A(\lambda)\) 是一个 \(n\) 次多项式,且最高项系数为 \(1\)。
舒尔引理
设一个 \(n \times n\) 的矩阵 \(A = \begin{bmatrix} a_{1, 1} & a_{1, 2} & a_{1, 3} & \dots & a_{1, n} \\ a_{2, 1} & a_{2, 2} & a_{2, 3} & \dots & a_{2, n} \\ a_{3, 1} & a_{3, 2} & a_{3, 3} & \dots & a_{3, n} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ a_{n, 1} & a_{n, 2} & a_{n, 3} & \dots & a_{n, n}\end{bmatrix}\),它的特征多项式 \(\phi_A(x) = (x - \lambda_1)(x - \lambda_2) \dots (x - \lambda_n)\)(\(n \in \mathbb C\)),那么一定存在一个 \(n \times n\) 的可逆矩阵 \(P\) 使得 \(P^{-1} A P = \begin{bmatrix} \lambda_1 & p_{1, 2} & p_{1, 3} & \dots & p_{1, n} \\ 0 & \lambda_2 & p_{2, 3} & \dots & p_{2, n} \\ 0 & 0 & \lambda_3 & \dots & p_{3, n} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & 0 & \dots & \lambda_n\end{bmatrix}\)
证:
上海森堡矩阵
虽然上三角矩阵的特征多项式可以简单地通过对角线算出,但
求解特征多项式:海森堡算法
矩阵对角化
考虑用基变换求矩阵的 \(k\) 次方时,我们把转移矩阵 \(M\) 写成了 \(PAP^{-1}\) 的形式,其中 \(A\) 是只有对角线有值,且是特征值,写成 \(M = PAP^{-1}\),此时 \(A\) 解出来是 \(P^{-1}MP\),此时可以发现,当我们对某些矩阵右乘一个可逆矩阵,再左乘这个矩阵的逆,可以把这个矩阵变成对角矩阵,这就是矩阵的对角化。
对角化矩阵的特征多项式 \(\phi_{P^{-1}AP}(\lambda) = \det(\lambda I - P^{-1}AP) = \det(P^{-1}(\lambda I - A)P) = \det(P^{-1})\det(\lambda I - A)\det(P) = \displaystyle\frac{1}{\det(P)}\det(P)\phi_A(\lambda) = \phi_A(\lambda)\),这也进一步说明对角化后矩阵代表的线性变换未发生改变,这在接下来的证明中很有用。
伴随矩阵
我们知道矩阵的代数余子式写作 \(\Delta_{i, j}\),于是定义一个矩阵 \(A\) 的伴随矩阵 \(\mathrm{adj} A = \begin{bmatrix} \Delta_{1, 1} & \Delta_{1, 2} & \Delta_{1, 3} & \dots & \Delta_{1, n} \\ \Delta_{2, 1} & \Delta_{2, 2} & \Delta_{2, 3} & \dots & \Delta_{2, n} \\ \Delta_{3, 1} & \Delta_{3, 2} & \Delta_{3, 3} & \dots & \Delta_{3, n} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ \Delta_{n, 1} & \Delta_{n, 2} & \Delta_{n, 3} & \dots & \Delta_{n, n} \end{bmatrix}\)。
伴随矩阵与原矩阵的乘积有特殊含义,拿 \(3 \times 3\) 的矩阵为例,设 \(B = \begin{bmatrix} \Delta_{1, 1} & \Delta_{1, 2} & \Delta_{1, 3} \\ \Delta_{2, 1} & \Delta_{2, 2} & \Delta_{2, 3} \\ \Delta_{3, 1} & \Delta_{3, 2} & \Delta_{3, 3} \end{bmatrix} \begin{bmatrix} a_{1, 1} & a_{1, 2} & a_{1, 3} \\ a_{2, 1} & a_{2, 2} & a_{2, 3} \\ a_{3, 1} & a_{3, 2} & a_{3, 3}\end{bmatrix}\)。
根据矩阵乘法,有 \(B_{1, 1} = a_{1, 1} \Delta_{1, 1} + a_{1, 2} \Delta_{1, 2} + a_{1, 3} \Delta_{1, 3}\),现在,你会很惊喜的发现这就是将 \(A\) 的行列式在第一排的展开式,那么 \(B_{1, 1} = \det(A)\),类似的,你会发现 \(B\) 左上到右下对角线上每个值都是 \(\det(A)\)。
对于不在左上到右下对角线上的元素,比如 \(B_{2, 1} = a_{1, 1}\Delta_{1, 2} + a_{2, 1}\Delta_{2, 2} + a_{3, 1}\Delta_{3, 2}\),它对应矩阵 \(\begin{bmatrix} a_{1, 1} & a_{1, 1} & a_{1, 3} \\ a_{2, 1} & a_{2, 1} & a_{2, 3} \\ a_{3, 1} & a_{3, 1} & a_{3, 3} \end{bmatrix}\) 的行列式,由于这个行列式有两列相同,它的行列式一定为 \(0\),类似的,你会发现 \(B\) 非左上到右下对角线上每个值都是 \(0\)。
于是 \(B\) 可以表示成 \(\begin{bmatrix} \det(A) & 0 & 0 \\ 0 & \det(A) & 0 \\ 0 & 0 & \det(A) \end{bmatrix} = \det(A)I\)
于是一个重要的定理就诞生了 \((\mathrm{adj} A)A = \det(A)I\)。
cayley-hamilton 定理
这是特征多项式非常重要的一个定理。假设我们已经求出了一个矩阵 \(A\) 的特征多项式 \(\phi_A(\lambda)\),那么一定有 \(\phi_A(A) = O\)(\(O\) 为全为 \(0\) 的矩阵)。
举个例子,先拿 \(2 \times 2\) 的矩阵为例,比如斐波那契数列的转移矩阵 \(A = \begin{bmatrix} 1 & 1 \\ 1 & 0\end{bmatrix}\),它的特征多项式 \(\phi_A(\lambda) = \det(\begin{bmatrix} \lambda - 1 & -1 \\ -1 & \lambda\end{bmatrix}) = \lambda^2 - \lambda - 1\)。
将 \(\lambda\) 替换为 \(A\) 之后(注意此时要将 \(1\) 替换为单位矩阵 \(I\),它才是矩阵的基本单位),可以得到 \(\begin{bmatrix} 1 & 1 \\ 1 & 0\end{bmatrix}^2 - \begin{bmatrix} 1 & 1 \\ 1 & 0\end{bmatrix} - \begin{bmatrix} 1 & 0 \\ 0 & 1\end{bmatrix} = \begin{bmatrix} 2 & 1 \\ 1 & 1\end{bmatrix} - \begin{bmatrix} 1 & 1 \\ 1 & 0\end{bmatrix} - \begin{bmatrix} 1 & 0 \\ 0 & 1\end{bmatrix} = \begin{bmatrix} 0 & 0 \\ 0 & 0\end{bmatrix}\)。
证明1
假设 \(A\) 是对角矩阵,那么变换后,这一线性空间中的基还在它原来的直线上,那么每个基都是一个特征向量,而对角线上的值就是特征值,假设是 \(v_1, v_2, v_3, \dots, v_n\),那么特征多项式就为 \(\phi_A(\lambda) = (\lambda - v_1)(\lambda - v_2) \dots (\lambda - v_n)\),用 \(A\) 替换 \(\lambda\),会发现 \(A\) 的第 \(i\) 行会出现 \((v_i - v_i)\) 这种因式,那么每一行都是 \(0\),此时 \(A\) 退化成了 \(O\) 矩阵。
对于可以对角化的矩阵,假设它对角化后为 \(P^{-1}AP\),由于特征多项式的性质,有 \(\phi_A(\lambda) = \phi_{P^{-1}AP}(\lambda)\),由于我们已经得出了 \(\phi_{P^{-1}AP}(P^{-1}AP) = O\),因此 \(\phi_A(P^{-1}AP) = O\)。
我们知道 \((P^{-1}AP)^k = P^{-1}A^kP\),那么原式又可以变成 \(P^{-1} \phi_A(A) P = O\),于是 \(\phi_A(A) = O\)。
对于不可对角化的矩阵,可以通过伴随矩阵来证明。
考虑矩阵 \(F(\lambda) = \lambda I - A\) 的伴随矩阵 \(\mathrm{adj} F(\lambda)\),根据伴随矩阵的性质,有 \([\mathrm{adj} F(\lambda)]F(\lambda) = \det[F(\lambda)] I\)。
根据特征多项式的定义,\(\det[F(\lambda)] = \phi_A(\lambda)\),那么原式可以变成 \([\mathrm{adj} F(\lambda)]F(\lambda) = \phi_A(\lambda) I\),由于伴随矩阵中每个代数余子式都是原矩阵的一个 \((n - 1) \times (n - 1)\) 的子矩阵的行列式,那么可以写成 \(\mathrm{adj} F(\lambda) = B(\lambda) = b_{n - 1}\lambda^{n - 1} + b_{n - 2}\lambda^{n - 2} + \dots + b_0\),那么左边可以写成 \(B(\lambda)F(\lambda) = (b_{n - 1}\lambda^{n - 1} + b_{n - 2}\lambda^{n - 2} + \dots + b_0)(\lambda I - A) = b_{n - 1}\lambda^n + (b_{n - 2} - b_{n - 1}A)\lambda^{n - 1} + \dots + (b_0 - b_1 A)\lambda^2 - b_0 A \lambda\)。
等式右边是 \(A\) 的特征多项式,于是可以写成 $ \lambda^n + a_{n - 1}\lambda^{n - 1} + \dots + a_0$,那么 \(\phi_A(\lambda)I = \lambda^n I + a_{n - 1}\lambda^{n - 1} I + \dots + a_0 I\)。由于 \([\mathrm{adj} F(\lambda)]F(\lambda) = \phi_A(\lambda) I\) 是恒等的,那么它们的系数也是相等的,于是有以下方程组:
将第 \(1, 2, \dots, n - 1, n\) 排分别乘以 \(A^n, A^{n - 1}, \dots, A, I\),可以得到:
将左边全部加起来,右边全部加起来,发现右边的项都被消掉了,而左边加起来正好是 \(\phi_A(A)\),因此 \(\phi_A(A) = O\)。
证明2
线性代数方法
这个方法是所有方法中时间复杂度最高的,达到了 \(O(d^4 + d^2 \log_2 n)\),比后面的 \(d \log_2 d \log_2 n\) 要慢多了,但确实是最容易理解的方法,适合 \(d\) 比较小但 \(n\) 比较大的情况。
首先,设函数 \(f(x) = x^n\),于是我们要求的就是 \(f(M)\)(\(M\) 为转移矩阵),考虑将 \(f(x)\) 做带余除法,除以 \(\phi_M(x)\),于是有 \(f(x) = \phi_M(x) g(x) + r(x)\)(\(g(x)\) 为商式,\(r(x)\) 为余式,次数为 \(d - 1\)),将 \(M\) 代入,因为 \(\phi_M(M) = O\),于是第一项就是 \(0\),得到 \(f(x) = r(x)\)。这是一个 \(d - 1\) 次多项式,直接将 \(M\) 代入即可。
于是直接快速幂,每次对 \(\phi_M(x)\) 暴力多项式取模,总时间复杂度为 \(O(d^4 + d^2 \log_2 n)\)。
完整代码:P10775 BZOJ4162 shlw loves matrix II:
Fiduccia 算法
现在还是来求 \(f_n = \displaystyle\sum_{i = 1}^k c_i f_{n - i}\) 的第 \(n\) 项,考虑构造两个多项式个多项式 \(\Gamma(x) = x^k - \displaystyle\sum_{i = 0}^{k - 1} c_{k - i}x^i\) 和 \(A(x) = \displaystyle\sum_{i = 0}^{k - 1} a_i x^i\),接着定义 \(\Gamma(x)\) 的友矩阵
bostan-mori 算法
这个算法需要我们细细的来讲。
还是从分式 \(F(x) = \displaystyle\frac{P(x)}{Q(x)}\) 开始,假设我们要求解它的 \(x^n\) 项的系数,考虑将分式上下两边同时乘以 \(Q(-x)\),变成 \(\displaystyle\frac{P(x)Q(-x)}{Q(x)Q(-x)}\),发现分母是一个偶函数,因此可以表示为 \(V(x^2)\)。而根据高中数学可得,任意一个函数可以表示为一个奇函数和一个偶函数的和,那么分母又可以表示为 \(U_{even}(x^2) + xU_{odd}(x^2)\)。因此 \(F(x) = \displaystyle\frac{U_{even}(x^2) + xU_{odd}(x^2)}{V(x^2)} = \frac{U_{even}(x^2)}{V(x^2)} + x\frac{U_{odd}(x^2)}{V(x^2)}\)。
这就意味着 \([x^n]\displaystyle\frac{P(x)}{Q(x)} = \begin{cases} [x^\frac n2]\displaystyle\frac{U_{even}(x)}{V(x)} & n 是偶数 \\ [x^{\frac{n - 1}{2}}] \displaystyle\frac{U_{odd}(x)}{V(x)} & n 是奇数\end{cases}\)。
此时,一个求分式 \(x^n\) 项系数的问题就转化成了求另一个次数相同的分式 \(x^{\frac n2}\) 项的系数,问题规模缩小了,因此只需要 \(O(d \log_2 d \log_2 n)\) 的时间复杂度(多出的复杂度是 \(FFT\) 的时间复杂度)就可以求出这个分式 \(x^n\) 项的系数。
例题一
你有 \(n\) 种货币,问用这些货币组成 \(m\) 的方案数,保证 \(a_i < a_{i + 1}\) 且 \(a_i \mid a_{i + 1}\)。
\(n \leq 50, m \leq 10^{18}\)。
常系数非齐次线性递推
整式递推
参考资料
-
程序员的数学3:线性代数 平冈和幸 掘玄
-
Introductory Combinatorics(Fifth Edition) Richard A. Brualdi
-
「常系数齐次线性递推」——矩阵快速幂的优化 Troy Ricardo
-
特征多项式 Winniechen
-
Cayley-Hamilton 定理学习笔记 _Famiglistimo
-
哈密顿-凯莱定理 百度百科
-
[tutorial] Bostan-Mori, an elegant algorithm to compute k-th term of linear recurrence in O(dlgdlgk) Misuki
-
《A Simple and Fast Algorithm for Computing
the N-th Term of a Linearly Recurrent Sequence》
Alin Bostan and Ryuhei Mori -
常系数齐次线性递推 OI-Wiki
本文来自博客园,作者:Orange_new,转载请注明原文链接:https://www.cnblogs.com/JPGOJCZX/p/18606740

浙公网安备 33010602011771号