线性代数 - 矩阵对角化
今天听 \(\texttt{m}\color{red}{\texttt{yee}}\) 嘴的,赶紧来补个学习笔记。
我们有点时候需要计算一个较小矩阵的 \(n\) 次幂,但直接求幂非常不方便,这是会考虑矩阵对角化,将 \(M\) 改写为 \(\mathcal{PDP^{-1}}\),这样 \(M^n\) 次就可以写为 \((\mathcal{PDP^{-1}})=\mathcal{PD^nP^{-1}}\),转化为快速计算 \(\mathcal{D^n}\)。
求解方法
我们定义一个矩阵 \(\mathcal{A}\) 的特征向量为 \(\alpha\),相应特征值为 \(\gamma\),他们满足:
其中 \(\alpha\) 是定义在 \(K^n\) 次空间内的非零向量,\(\gamma\) 是一个常数,可以将上面的式子写成矩阵的形式:
矩阵对这个向量只起到拉扯作用。
对于上面的定义式 \(\mathcal{A}\alpha=\gamma\alpha\),我们在右边乘上一个 \(I\) 单位矩阵对答案不会有任何影响,并可以作以下变形:
观察上面的式子,可以发现 \(\mathcal{A}-\gamma\mathcal{I}\) 一定不存在矩阵的逆(证明:如果存在,可以在等式左右两端各乘上一个逆,那么得到 \(\alpha=\vec{0}\),但由于 \(\alpha\not=\vec{0}\),矛盾,所以不行)。
由于不存在矩阵的逆,所以一定有 \(\text{det}(\mathcal{A}-\gamma\mathcal{I})=0\)!!!
那么根据行列式的定义式:
我们不妨手动计算行列式,其中不失有对二、三阶矩阵行列式的快速计算方法:
- 二阶矩阵行列式:主对角线元素之积减去另外两个元素的乘积。
- 三阶矩阵行列为:主对角线三乘三减去副对角线三乘三,\(a_{11}a_{22}a_{33}+a_{12}a_{23}a_{31}+a_{13}a_{21}a_{32}-a_{13}a_{22}a_{31}-a_{12}a_{21}a_{33}-a_{11}a_{23}a_{32}\)。
为了防止忘记减去 \(\gamma\),我们将 \(\mathcal{A}-\gamma\mathcal{I}\) 写成矩阵形式,这就是我们需要求解的矩阵:
那么写出行列式表达式,我们得到了关于 \(\gamma\) 的一个方程,对它求解我们就得到了 \(\le n\) 个 \(\gamma\) 值。
对于每一个 \(\gamma\),代回上面 \((\mathcal{A}-\gamma\mathcal{I})\alpha=\vec{0}\) 的式子,我们就可以计算出 \(n\) 个 \(\alpha\) 的表达式,我们的要求是这 \(n\) 个 \(\alpha\) 线性无关!!
结果已经出现,假设对角化后结果为 \(\mathcal{A}=\mathcal{PDP^{-1}}\),那么:
\(\mathcal{P^{-1}}\) 就是 \(\mathcal{P}\) 的逆,可以手动计算!!由于 \(\gamma\) 解 \(\alpha\) 时可能会有多个解,只要相应 \(\gamma\) 对应相应 \(\alpha\) 即可。
注意其中每一个 \(\alpha\) 都是列向量,所以 \(\mathcal{P}\) 是一个 \(n\times n\) 的方阵。
这样就可以快速求出 \(\mathcal{A}\) 的表达式啦!!
例题
hdu 6956 Pass!
有 \(n\) 个小朋友在玩球!!最开始球在 \(1\) 号小朋友手上,每次游戏小朋友都会将球等概率传给除了自己的任何一个小朋友。
设经过 \(t\) 次传球后将球传回 \(1\) 号小朋友的方案数对
998244353
取模的值为 \(x\)。现在给定 \(x\),求最小的 \(t\),满足方案数取模后为 \(x\),如果无解输出
-1
。\(1\le T\le 100,2\le n\le 10^6,0\le x<998244353\)。
先考虑一个正向暴力的做法:
设 \(f_i\) 表示在第 \(i\) 次传球后球在 \(1\) 的概率,\(g_i\) 表示不在 \(1\) 的概率,一定有 \(f_i+g_i=1\)
根据上面的推导,我们对等式右边的矩阵对角化,可以解出 \(\gamma_1=n-1,\gamma_2=-1\),
写出对角化之后的矩阵: