线性代数学习笔记
线性代数
线性空间
指向量空间,在线性空间里,定义了向量加法与标量乘法。
其中标量乘法对向量加法有分配律。
我们称标量乘与向量加为线性组合。
线性无关
如果一组向量中不存在一个子集使得其能线性组合出该组向量中的另一向量。
线性基
也称线性空间的基底,即最小的一组能线性表示出整个线性空间的向量组。
OI 中经常运用 01 向量的线性基。
一个有趣的 useless 的问题是求一个线性基的正交线性基。
直接将主元位置只有对角线为 1 的线性基转置再交换主元与非主元即可。
正交线性基 \(B\) 对于原线性基 \(A\) 来说,满足 \(x\in A,y\in B,|x\and y|\equiv 0\pmod 2\),若 \(A\) 的大小为 \(k\),则 \(B\) 的大小为 \(m-k\)。
for(int i=0;i<m;i++){
if(!p[i])continue;
for(int j=i+1;j<m;j++)if((p[j]>>i)&1)p[j]^=p[i];
}
for(int i=0;i<m;i++)
for(int j=0;j<m;j++)
if((p[i]>>j)&1)q[j]|=(1ll<<i);
for(int i=0;i<m;i++)q[i]^=(1ll<<i);
向量
点积
对于两个 \(k\) 维向量 \(\vec a,\vec b\),其点积 \(\vec a\cdot \vec b=\sum_{i=0}^{k-1}a_ib_i\)。
显然,点积对加法有分配律 \((\vec a+\vec b)\cdot \vec c=\vec a\cdot \vec c+\vec b\cdot \vec c\)。
向量正交化
对于一组线性无关的向量组,构造一组向量使得其组成的线性空间与原向量组等价,且两两垂直,模长为单位长度。
考虑一个个向量处理,对于第 \(i\) 个向量 \(\vec{v_i}\),我们只需取系数 \(a_{i,j}\) 得到 \(\vec{v_i'}=\vec{v_i}+\sum_{j=0}^{i-1} \vec{v_j’}a_{i,j}\)。
我们考虑由于 \(v_j'\) 两两垂直,我们把 \(v_i\) 拆成向量 \(\vec a+\vec b\) 使得 \(\vec a\bot \vec{v_j'},\vec b//\vec{v_j'}\)。
考虑 \(\vec b\) 实际上是 \(\vec{v_j'}\) 到 \(\vec{v_i}\) 的投影,写个点积求模长,把 \(\vec b\) 减掉即可。
矩阵
矩阵,为一个按矩形排列的复数集合,将 \(n\) 行 \(m\) 列的矩阵简称为 \(n\times m\) 矩阵。
基本定义与符号
记 \(n\) 阶单位矩阵为 \(I_n\),零矩阵为 \(O_n\),在不引起歧义的情况下简记为 \(I\),\(O\)。
方阵的迹:\(\text{tr}(A)=\sum_{i=1}^na_{i,i}\)。
矩阵的转置
对于 \(n\times m\) 的矩阵 \(A\),称一个满足 \(A^{T}_{i,j}=A_{j,i}\) 的 \(m\times n\) 矩阵 \(A^{T}\) 为 \(A\) 的转置。
矩阵运算
对于 \(n\times m\) 矩阵 \(A,B\):
定义数乘 \(vA=C\)。
满足 \(C\) 是 \(n\times m\) 矩阵且 \(c_{i,j}=v*a_{i,j}(i\in[1,n],j\in[1,m])\)。
定义矩阵加法 \(A+B=C\)。
满足 \(C\) 是 \(n\times m\) 矩阵且 \(c_{i,j}=a_{i,j}+b_{i,j}(i\in[1,n],j\in[1,m])\)。
减法类似。
矩阵加减法均有交换结合律,对数乘有结合律。
对于 \(n\times m\) 矩阵 \(A\) 与 \(m\times p\) 矩阵 \(B\):
定义矩阵乘法 \(A\times B=C\)。
满足 \(C\) 是 \(n\times p\) 矩阵且 \(c_{i,j}=\sum_{k=1}^ma_{i,k}b_{k,j}(i\in[1,n],j\in[1,p])\)。
矩乘没有交换律,但有结合律。
时间复杂度 \(O(nmp)\)。
for(int i=1;i<=n;i++)
for(int k=1;k<=m;k++)
for(int j=1;j<=p;j++)
c[i][j]=add(c[i][j]+1ll*a[i][k]*b[k][j]%mod);
这样一段矩乘代码内存访问更为连续。
特别的,对于 \(n\times n\) 矩阵 \(A\):定义 \(A^k\) 为 \(A^{k-1}\times A\) ,且 \(A^1=A\)。
一般使用矩阵快速幂在 \(O(n^3\log k)\) 的复杂度内得到 \(A^k\)。
在OI中,经常重新定义矩阵乘法,例如 \(\min+\) 矩乘。
需注意应满足结合律才可采用矩阵快速幂算法。
矩阵的初等变换
矩阵的初等行变换:
- 交换两行。
- 以非零实数乘以某行。
- 将某行替换为它与其它行倍数的和。
我们试图通过初等行变换消元,得到原多个向量组成的线性空间的一组基。
这个过程以高斯消元实现,高斯消元后下三角矩阵变为0,称为行阶梯形。
矩阵的秩
对于一个 \(n\times m\) 的矩阵 \(A\),我们定义:
行秩:矩阵 \(n\) 个行向量中线性无关的极大数目。
列秩:矩阵 \(m\) 个列向量中线性无关的极大数目。
行秩=列秩,称为 \(\text{rank}(A)\)。
满秩:称行秩为行数的矩阵行满秩,同理可得列满秩定义。
对于一个方阵,若其秩为阶数则称其为满秩矩阵。
矩阵的逆
若方阵 \(A\) 满秩,\(A\) 存在逆矩阵 \(A^{-1}\),满足 \(A\times A^{-1}=A^{-1}\times A=I\)。
矩阵求逆可以考虑将矩阵 \(A\) 高消成 \(I\) 的过程。
由于矩阵初等变换本质是给矩阵乘一个矩阵。
那么,\(A\times B=I\),则 \(B\) 为 \(A^{-1}\),我们对一个单位矩阵做 \(A\) 的高消操作即可得到 \(A^{-1}\)。
结论
\((AB)^{-1}=B^{-1}\times A^{-1}\)
\((AB)^{T}=B^{T}\times A^{T}\)
\((A^T)^{-1}=(A^{-1})^T\)
行列式
定义
定义一个 \(n\) 阶方阵 \(A\) 的行列式为 \(\det(A)\)。
记 \(sign(p)=(-1)^{\tau(p)}\),\(\tau(p)\) 为排列 \(p\) 的逆序对数。
\(\det(A)=\sum_{p}sign(p)\prod_{i=1}^na_{i,p_i}\)
根据定义式,行列式有一个显然的组合意义:满二分图匹配的偶数个交点方案数减去奇数个交点的方案数。
例:[NOI2021] 路径交点
碰到偶减奇的形式应该能想到行列式。
定义 \(M_{i,j}\) 表示矩阵 \(A\) 去掉第 \(i\) 行,第 \(j\) 列之后剩下的大小为 \((n-1)\times (n-1)\) 的子矩阵的行列式,称为余子式。
定义代数余子式 \(A_{i,j}=(-1)^{i+j}M_{i,j}\)。
性质
行列式对于三种初等变换均有较好的性质。
- 对换行列式两行(列)的位置,行列式的值反号。
- 把行列式的某一行(列)乘上实数 \(k\) ,行列式的值乘以 \(k\)。
- 将某行(列)的倍数加到其它行(列)上,行列式的值不变。
\(\det(AB)=\det(A)\det(B)\)
可以将 \(A\),\(B\) 利用初等变换变成上三角矩阵证明。
\(\det(A+B)\) 的组合意义:
基本的定义式:\(\det(A+B)=\sum_{p}sign(p)\prod_{i=1}^n(a_{i,p_i}+b_{i,p_i})\)。
考虑实际上其为将 \(A\) 的若干行替换成 \(B\) 中对应行的行列式之和。
特别的,当 \(B\) 为全 \(c\) 矩阵时,仅为 \(n+1\) 个行列式的和。
行列式可以进行拉普拉斯展开:
\(\forall i\in[1,n],\det(A)=\sum_{j=1}^nA_{i,j}\)
\(\forall j\in[1,n],\det(A)=\sum_{i=1}^nA_{i,j}\)
一些特殊的行列式
范德蒙德矩阵
\(\begin{vmatrix}1&1&...&1\\x_0&x_1&...&x_{n-1}\\\vdots&\vdots&\ddots&\vdots\\x_0^{n-1}&x_1^{n-1}&\dots&x_{n-1}^{n-1}\end{vmatrix}=\prod_{0\leq i<j<n}(x_j-x_i)\)
容易发现,一个行向量右乘范德蒙德矩阵得到的结果是将行向量看成多项式系数在 \(x_i\) 处的点值。
循环矩阵
\(\begin{vmatrix}c_0&c_1&...&c_{n-1}\\c_1&c_2&...&c_0\\\vdots&\vdots&\ddots&\vdots\\c_{n-1}&c_0&\dots&c_{n-2}\end{vmatrix}\)
记 \(f(x)=\sum_{i=0}^{n-1}c_ix^i\)。
则行列式为 \(\prod_{i=0}^{n-1}f(\omega_n^i)\),\(\omega_n\) 为 \(n\) 次单位根。
证明:
考虑将循环矩阵右乘一个范德蒙德矩阵:\(\begin{vmatrix}1&1&...&1\\\omega_n^0&\omega_n^1&...&\omega_n^{n-1}\\\vdots&\vdots&\ddots&\vdots\\\omega_n^{0(n-1)}&\omega_n^{1(n-1)}&\dots&\omega_n^{(n-1)(n-1)}\end{vmatrix}\)。
得到的矩阵为:\(\begin{vmatrix}f(\omega_n^0)&f(\omega_n^1)&\cdots&f(\omega_n^{n-1})\\\omega_n^0f(\omega_n^0)&\omega_n^1 f(\omega_n^1)&\cdots&\omega_n^{n-1} f(\omega_n^{n-1})\\\vdots&\vdots&\ddots&\vdots\\\omega_n^{0(n-1)}f(\omega_n^0)&\omega_n^{1(n-1)}f(\omega_n^1)&\cdots&\omega_n^{(n-1)(n-1)}f(\omega_n^{n-1})\end{vmatrix}\)。
显然我们可以将 \(\prod_{i=0}^{n-1}f(\omega_n^i)\) 提出来,剩下的行列式就是我们乘上的范德蒙德行列式。
由于 \(w_n^i\) 两两不同,其行列式值 \(\prod_{0\leq i<j<n}(\omega_n^j-\omega_n^i)\) 不为 \(0\),可以约去。故循环矩阵的行列式为 \(\prod_{i=0}^{n-1}f(\omega_n^i)\)。
对于 \(n\) 为 \(2\) 的整次幂的情况,我们直接使用 DFT 就能 \(x_i=\dfrac{\det(A_i)}{\det(A)}\) 得到 \(\forall i\in[0,n-1],f(\omega_n^i)\)。
\(n\) 不为 \(2\) 的整次幂的情况是经典的 blue-stein 算法,利用 \(\binom{i+k}{2}-\binom{i}{2}-\binom{k}{2}\) 转化成一个减法卷积问题。
一类扩展
\(a_{i,j}=\begin{cases}k^nc_{i-j},i<j\\c_{i-j},i\geq j\end{cases}\)
下标的减法在模 \(n\) 意义下进行。
考虑该矩阵类似于循环矩阵,仅在下三角上乘上了 \(k^n\)。
其行列式为 \(\prod_{i=0}^{n-1}f(k\omega_n^i)\),构造和证明均与循环矩阵相同。
海森堡矩阵
定义一个方阵 \(A\) 为上海森堡矩阵,满足:若 \(i>j+1\),\(a_{i,j}=0\)。
定义一个方阵 \(A\) 为下海森堡矩阵,满足:若 \(i<j-1\),\(a_{i,j}=0\)。
其行列式容易使用高斯消元 \(O(n^2)\) 得到(仅需向下消一行)。
克莱姆法则
对于线性方程组,记其系数矩阵为 \(A\),增广矩阵最后一列为 \(B\)。
若 \(\det(A)\neq 0\),则方程组有唯一解 \(x_i=\dfrac{\det(A_i)}{\det(A)}\)。
其中,\(A_i\) 指将 \(A\) 的第 \(i\) 列换成 \(B\) 得到的矩阵。
大概能和行列式有特殊性质的系数矩阵联合使用。
特征多项式
定义
对于一个方阵 \(A\),定义 \(\lambda\) 为其特征值,当且仅当存在一个列向量 \(x\),满足 \(Ax=\lambda x\)。
而对于一个特征值 \(\lambda\),若有 \(Ax=\lambda x\),则称 \(x\) 为 \(\lambda\) 的特征向量。
定义一个矩阵的特征多项式为 \(p_A(\lambda)=|\lambda I-A|\),特征多项式为一个首一多项式。
特征多项式的根为方阵的特征值。
求解特征多项式
朴素的实现复杂度高达 \(O(n^5)\) 也不大好写。
我们可以考虑插值,得到一个通用的 \(O(n^4)\) 做法。
进一步优化,我们可以使用相似变换将问题转化成求一个上海森堡矩阵的特征多项式。
考虑使用高斯消元行变换构造 \(P\),\(P^{-1}\) 为对应的列变换,观察到高斯消元的过程。
由于列变换的存在,我们无法将矩阵消成上三角的,但可以做到消成上海森堡形,此部分复杂度 \(O(n^3)\)。
考虑仍然使用拉插,由于海森堡矩阵的行列式仅需 \(O(n^2)\) 即可求得,求得 \(p_A(x)\) 的 \(n+1\) 个点值的复杂度为 \(O(n^3)\)。
故我们得到了一个 \(O(n^3)\) 求解特征多项式的做法。
基础应用
容易发现,\(p_A(A)=|A-A|=0\)。
我们可以通过求解矩阵的特征多项式,得到一个矩阵降幂次的递推式,形如:\(A^n=\sum_{i=0}^{n-1}w_iA^i\)。
可以将这个式子看成一个线性递推。
考虑如何将一个 \(A^m\) 表示成 \(A^i,i\in[0,n)\) 的线性组合。
若我们已知 \(A^x=\sum_{i=0}^{n-1}a_iA^i,A^y=\sum_{i=0}^{n-1}b_iA^i\)。
考虑 \(A^{x+y}\) 的线性组合,实际上是两者系数多项式卷积对 \(p_A(x)\) 取模的结果。
容易做到 \(O(n^2\log m+n^4)\),在 \(n\) 较小,\(\log m\) 巨大时优于矩阵快速幂的 \(O(n^3\log m)\)。
使用 NTT/FFT 优化多项式卷积甚至能够做到 \(O(n\log n\log m+n^4)\),\(\log m\) 可以更加巨大。
一些特殊矩阵的特征多项式
幂零矩阵
即存在一个幂零指数 \(l\),使得 \(A^l=O\)。
其特征多项式为 \(x^n\),特别的,特征多项式为 \(x^n\) 的矩阵一定为幂零矩阵。
相似矩阵
定义
对于两个 \(n\) 阶方阵 \(A,B\),若存在可逆矩阵 \(P\),满足 \(P^{-1}AP=B\),则称 \(A\),\(B\) 相似,\(B\) 是 \(A\) 的相似矩阵。
性质
对于一对相似的矩阵 \(A\),\(B\),有非常好的性质
- \(\text{rank}(A)=\text{rank}(B)\)
- \(\det(A)=\det(B)\)
- \(\text{tr}(A)=\text{tr}(B)\)
- \(p_A(x)=p_B(x)\)
可对角化
若矩阵 \(A\) 与一个对角矩阵 \(B\) 相似,称 \(A\) 可对角化。
矩阵可对角化的充要条件是矩阵有 \(n\) 个线性无关的特征向量。
特别的,如果矩阵有 \(n\) 个不同的特征值,其一定可对角化。
基于线代的图论问题
一般图匹配相关问题
Tutte 矩阵
定义无向图 \(G\) 的 Tutte 矩阵 \(\hat A(G)\) 为一个 \(n\times n\) 的方阵,满足:
其中,\(x_{i,j}\) 是一个与边 \((i,j)\) 相关的变量,\(\hat A(G)\) 中共有 \(|E|\) 个变量
值得一提的是,Tutte 矩阵是一个斜对称/反对称矩阵。
Tutte 定理
Tutte 定理:图 \(G\) 有完美匹配,当且仅当 \(\det \hat A(G)\neq 0\)
为了证明定理,完美以偶环覆盖的概念刻画一个有完美匹配的图
其中,“环覆盖”是指对于一个图,用若干个环覆盖节点,使得每个节点恰好在一个环中
形式化的,每个环覆盖对应一个 \(1\) 到 \(n\) 的排列 \(\pi\),满足 \((i,\pi_i)\in E\)
那么偶环覆盖即指排列中的环大小均为偶数的一组环覆盖
Lemma:图有完美匹配当且仅当图有一个偶环覆盖
- 若图 \(G\) 有一个完美匹配,那么用完美匹配的每一对点构成的二元环就可以覆盖图 \(G\)
- 若图 \(G\) 有一个偶环覆盖,那么我们取偶环覆盖中不相邻的所有边即得到完美匹配
我们考虑证明 Tutte 定理:
我们知道 \(\det \hat A(G)=\sum_{\pi}sign(\pi)\prod_{i=1}^na_{i,\pi_i}\)
考虑等式右边的非零项,形如 \(sign(\pi)\prod_{i=1}^n\pm x_{i,\pi_i}\),显然,\((i,\pi_i),i\in [1,n]\) 构成了一个环覆盖
我们对于一个非偶环覆盖,建立一个双射:翻转其中第一个奇环
我们知道一个经典结论 \((-1)^{\tau(\pi)}=(-1)^{n-c(\pi)}\),\(c(\pi)\) 指置换中的环数
那么翻转环后的排列 \(\pi'\) 满足 \((-1)^{\tau(\pi)}=(-1)^{\tau(\pi')}\),故仅有 \(a\) 值的符号发生了改变
如果环为偶环,则贡献不变,否则贡献取反,则贡献被抵消
显然非偶环覆盖的总贡献为 \(0\),仅剩下偶环的贡献
那么如果 \(\det \hat A(G)\neq 0\) 则有一组偶环覆盖,故存在一组完美匹配
一般图匹配的判定
我们得到 Tutte 定理后,有了一个很好的判定 \(G\) 是否有完美匹配的算法:判断 \(\det \hat A(G)\) 是否为 \(0\)
我们显然不能暴力的算出行列式的值,我们也不需要知道行列式长什么样,我们只需要判定行列式是否恒为 \(0\)
而判定一个多项式是否恒为 \(0\) 是一个经典问题
Schwartz-Zippel 引理:
对于域 \(F\) 上的一个不恒为 \(0\) 的 \(n\) 元 \(d\) 度多项式 \(P(x_1,x_2, . . . , x_n )\),
设 \(r_1,r_2,\dots,r_n\) 为 \(n\) 个 \(F\) 中的独立选取的随机数,则\[Pr[P(r_1,r_2,\dots,r_n)=0]\leq \frac{d}{\mathbb F} \]
引理的证明可以考虑归纳,详情参考论文
我们知道多项式 \(\det\hat A(G)\) 的度数是 \(O(n)\) 的,我们可以选取一个 \(O(n^2)\) 的质数 \(p\),
在模 \(p\) 域 \(\mathbb F_p\) 下给每个变量赋予一个随机数,通过计算点值是否为 \(0\),断言 \(G\) 是否存在完美匹配
由于引理,我们判断错误的概率不超过 \(\dfrac n p=O(\dfrac 1 n)\),我们还可以通过调整 \(p\) 的大小或者多次随机来进一步降低错误率
我们得到了一个复杂度为 \(O(n^3)\) 的判定做法
一般图匹配的构造
\(\color{red}{\text{未完成施工}}\)
普法夫值(Pfaffian)
记 \(m=\dfrac n 2\) 定义 \(n\times n\) 的方阵 \(A\) 的 Pfaffian 为
一般来说,我们只考虑 \(A\) 为斜对称矩阵,即 \(A_{i,j}=-A_{j,i}\) 的情况
我们考虑固定 \((p_{2i-1},p_{2i})\) (无序二元组)的集合后的 \(2^mm!\) 种排列对普法夫值的贡献相同
证明可以考虑交换一个二元组的顺序和交换相邻二元组的顺序后逆序对奇偶性均不变
令 \(PM(n)\) 为所有 \(1\sim n\) 二元组划分顺次连接形成排列的集合,定义 \(f(\pi)=sign(\pi)\prod_{i=1}^mA_{\pi_{2i-1,\pi_{2i}}}\)
则 \(Pf(A)=\sum_{\pi\in PM(n)}f(\pi)\)
一个重要的引理是,对于斜对称矩阵 \(A\),有 \(Pf(A)^2=\det(A)\)
证明:
令 \(g(\pi)=sign(\pi)\prod_{i=1}^nA_{i,\pi_i}\),有 \(\det(A)=\sum_{\pi}g(\pi)\)
我们建立存在奇环的置换的双射,将第一个奇环翻转,将满足 \(g(\pi)+g(\pi')=0\),则所有存在奇环的置换贡献被抵消
我们可以建立一个偶环置换 \(\pi\) 与一对 \(PM(n)\) 中元素 \(S,T\) 的双射:
对于环 \(c\),从环上最小数开始数,得到的第 \(i\) 个数称为 \(c_i\)
\((c_{2i-1},c_{2i})\) 属于 \(S\),\((c_{2i},c_{2i+1})\) 属于 \(T\),反之从每对 \(S,T\) 也能得到唯一的偶环置换
只需证明 \(g(\pi)=f(S)f(T)\),注意到两边的绝对值显然相等,仅考虑符号
突然不会!
应用
完美匹配
考虑 Tutte 矩阵 \(M\) 作为一个斜对称矩阵的普法夫值的图论意义:
\(Pf(M)\),其中任意两个 \((\pi_{2i},\pi_{2i+1})\)与 \((\pi_{2j},\pi_{2j+1})\) 互换不会改变 \(sign\),也不会改变乘积,则贡献不变;其中 \(\pi_{2i}\) 与 \(\pi_{2i+1}\) 互换会同时改变 \(sign\) 和乘积的符号,则贡献亦不变;故事实上,完美匹配 \(P\) 对应的全体 \(\pi\) 对答案的贡献都相同
一个 \(P\) 对应的 \(\pi\) 数量即为 \(2^mm!\),则我们找到了 Tutte 矩阵普法夫值的实际意义:所有完美匹配边权积带符号的和
我们利用 \(\det(M)\) 开根,就能快速计算 \(Pf(M)\) 的值
类似矩阵树定理,我们可以解决计算所有完美匹配的边权和的值域
在 Tutte 矩阵中加入 \(y\) 元,显然新的矩阵 \(M\) 的普法夫值成为了一个关于 \(y\) 的多项式
那么若不存在和为 \(s\) 的完美匹配,那么 \([y^s]Pf(M)\) 一定为 \(0\),否则为 \(0\) 的概率和之前的分析一样