特征多项式和常系数线性齐次递推
特征多项式
设 $A$ 为给定的 $n\times n$ 矩阵,$I_n$ 为 $n\times n$ 单位矩阵,$A$ 的特征多项式定义为
$$
p(\lambda )=\det(\lambda I_{n}-A)
$$
其中 $\det$ 表示行列式。
Cayley–Hamilton theorem
根据 凯莱–哈密顿定理,$A$ 满足方程
$$
p(A)=0
$$
其中 $0$ 是零矩阵。
因此我们可以利用这个 $n$ 次的多项式 $p(A)$ 来降低 $A$ 的高次幂。
求特征多项式
代入 $k+1$ 个值,求行列式,插值得到多项式系数。
高斯消元求行列式是 $O(n^3)$,总复杂度 $O(n^4)$。
有 $O(n^3)$ 的做法我就不学了。(点这里)
求矩阵的高次幂
BZOJ 4162: shlw loves matrix II
求 $k\times k$ 的矩阵 $M$ 的 $n$ 次幂。
$k\le 50, n\le 2^{10000}$。
暴力
直接暴力不卡常本机 2s,复杂度$O(k^3\log n)$。
正常做法
先 $O(k^4)$ 求出矩阵的特征多项式 $p(x)$。
然后就要求出 $x^n \bmod p(x)$,直接快速幂,其中乘法和取模都是 $O(k^2)$。
最后暴力乘出 $M^0, M^1, \dotsc, M^{k-1}$,按系数计算答案,复杂度也是 $O(k^4)$。
总复杂度 $O(k^4+k^2\log n)$。
代码在例题里贴。
常系数线性齐次递推
给出系数 $c_1, c_2, \dotsc, c_k$ 和数列 $f$ 的前 $k$ 项 $f_0, f_1, \dotsc, f_{k-1}$。
对于 $n\ge k$ 有 $f_n=\sum\limits_{i=1}^k f_{n-i}c_i$。
求 $f_n$。
暴力
构造出转移矩阵
$$
\begin{bmatrix}
c_1 & c_2 & \cdots & c_{k-1} & c_k \
1 & 0 & \cdots & 0 & 0 \
0 & 1 & \cdots & 0 & 0 \
\vdots & \vdots & \ddots & \vdots & \vdots \
0 & 0 & \cdots & 1 & 0
\end{bmatrix}
\begin{pmatrix}
f_{k-1} \
f_{k-2} \
f_{k-3} \
\vdots \
f_0
\end{pmatrix}
\begin{pmatrix}
f_k \
f_{k-1} \
f_{k-2} \
\vdots \
f_1
\end{pmatrix}
$$
可以做到 $O(k^3\log n)$。
特征多项式优化
上述转移矩阵设为 $A$,特征多项式是
$$
\begin{aligned}
p(\lambda) & =\det(\lambda I-A) \
& = \det\left(
\begin{bmatrix}
\lambda -c_1 & -c_2 & \cdots & -c_{k-1} & -c_k \
-1 & \lambda & \cdots & 0 & 0 \
0 & -1 & \cdots & \lambda & 0 \
\vdots & \vdots & \ddots & \vdots & \vdots \
0 & 0 & \cdots & -1 & \lambda
\end{bmatrix}
\right)
\end{aligned}
$$
对第一行展开
可以发现 $k$ 个代数余子式 $C_{1,1},C_{1,2},\dotsc,C_{1,k}$ 分别是 $\lambda^{k-1}, \lambda^{k-2}, \dotsc, \lambda^0$。
于是 $p(\lambda) = \lambda^k - \sum\limits_{i=1}^k c_i\lambda^{k-i}$。
我们令 $g(x)=x^n \bmod p(x)$,于是 $A^n=\sum\limits_{i=0}^{k-1} g_i A^i$。
令 $\vec{f}=
\begin{pmatrix}
f_{k-1} \
f_{k-2} \
f_{k-3} \
\vdots \
f_0
\end{pmatrix}$,$\left[\vec{a}\right]_ k$ 表示列向量 $\vec{a}$ 的第 $k$ 项。
则
$$
\begin{aligned}
f(n) & =\left[A^n \vec{f}\right]_ k \
& = \left[\sum_{i=0}^{k-1} g_i A^i \vec{f}\right]_ k \
& = \sum_{i=0}^{k-1} g_i \left[A^i \vec{f}\right]_ k \
& = \sum_{i=0}^{k-1} g_i f_i
\end{aligned}
$$
因为 $A\vec{f}$ 相当于转移了一次,转移 $i$ 次后向量的第 $k$ 项即 $f_i$。
实现
其实只需要求 $g(x)=x^n \bmod p(x)$ 就好了。
可以快速幂,暴力取模复杂度 $O(k^2\log n)$,用 NTT 可以优化到 $O(k\log k\log n)$。
例题
shlw loves matrix II
BZOJ 4162: shlw loves matrix II
上面讲过。
代码
1 |
|
【模板】线性递推
模板,需要 NTT。
代码
1 |
|
Shlw loves matrixI
可以暴力取模,由于模数原因也可以用 MTT。
代码
1 |
|
【NOI2017】泳池
咕咕咕。
特征多项式和常系数线性齐次递推