线性代数(长期更新)
矩阵
概念
定义:设\(m,n\in\mathrm N_+\),由数域\(\mathbb{F}\)中\(m\times n\)个数排成一个\(m\)行\(n\)列的矩形数表,称之\(\mathbb F\)上的一个\(m\)行\(n\)列的矩阵或\(m\times n\)矩阵。特别地,\(m=n\)时称该矩阵是一个\(n\)阶方阵。
记\(M_{m,n}(\mathbb F)=\{\mathbf A=(a_{i,j})|a_{i,j}\in \mathbb F\}\)为数域\(\mathbb F\)上所有\(m\times n\)矩阵全体。\(M_n(\mathbb F)=M_{n,n}(\mathbb F)\)为数域\(\mathbb F\)上所有\(n\)阶方阵全体。
看起来比较牛。
矩阵乘法
设\(A=(a_{i,j})_{m\times n},B=(b_{i,j})_{n\times s}\),定义\(A\times B\)为:
其中\(c_{i,j}=\sum\limits_{1\le k\le n}a_{i,k}\times b_{k,j}\)。即\(A\)的第\(i\)行和\(B\)的第\(j\)列对应相乘再相加。\(O(n^3)\)。
卡常技巧:或许在数字不大的时候可以用long long/__int128
存下\(c_{i,j}\),最后取模。
性质
结合律
分配律
单位元
对\(n\ge 1\),记:
称为\(n\)阶单位矩阵,任取\(A\in M_{m,n}(\mathbb F)\),都有\(I_mA=A=AI_n\)。
不满足消去律和交换律
与常系数齐次线性递推
由于矩阵乘法的结合律,可以用快速幂计算\(A^m\)。
对于常系数齐次线性递推,可以构造转移矩阵\(A\),然后对\(A\)快速幂即可。
邻接矩阵的矩阵乘法
对于一个有向图\(G\),其邻接矩阵为\(A=(a_{i,j})\),\(a_{i,j}\)表示从\(i\)到\(j\)有多少条边直接相连(即从\(i\)走\(1\)步到\(j\)的方案数)。
对比一下矩阵乘法和Floyd,发现很像。可以知道\(A^k\)中\(a_{i,j}\)表示从\(i\)走\(k\)步到达\(j\)的方案数,\(O(n^3)\)。
如果只关心可达性,则将\((+,\times)\)矩阵乘法换成\((\&,|)\)矩阵乘法即可,其中可以加入bitset
,\(O(\dfrac{n^3}{\omega})\)。
这种板子题中变形一下就要拆点,尽量将拆边换成拆点,因为边数可以轻易达到\(O(n^2)\)。
矩阵乘法优化DP
那是DP的问题。
通常范围会很大,但是先别管,推出朴素的DP式子再说。
一般来讲这里的DP式子不会很长(没有\(\Sigma\)之类的),这样就可以把相关状态放到矩阵中,然后推一下转移矩阵再衔接矩阵快速幂。
如果DP式子很长,那么考虑差分一下去掉求和号,让DP式子变短(就是把相同的部分去掉)。
如果有类似标记/隔断之类的特殊情况,就在这个地方停下来特殊转移。
动态DP
因为矩阵乘法的结合律,可以把DP写成一串转移矩阵乘起来的样子,然后可以用数据结构支持修改/在一个区间(范围)中做DP。几乎是数据结构题。常见会用\((\max/\min,+)\)矩阵。
高斯消元/高斯约旦消元
要解\(n\)元线性方程组:
线性方程组的初等变换和高斯消元法
-
交换两个方程的位置。
-
用一个非零数乘某一方程的两边。
-
将一个方程的\(k\)倍加到另一个方程上。
可以发现初等变换不改变线性方程组的解。
那么我们可以通过初等变换很容易将原来的线性方程组变成上阶梯形的样子,且每个系数不全为\(0\)的行的第一个非零的系数为\(1\)。选择当前变量的系数时要选最大的一个,提高精度减小误差。
设化为上阶梯形后,有\(r\)个方程左边的系数不全为\(0\),那么称\(r\)为这个方程组的秩。
-
若\(r<n\)且\(b_{r+1,r+2,\dots,n}\)不全为\(0\),则方程组无解。
-
若\(r=n\),或者\(r<n\)时\(b_{r+1,r+2,\dots,n}\)全为\(0\),方程组有解。
在有解的情况下,继续讨论唯一解还是无穷多解:
-
当\(r=n\)时,有唯一解,可以从上阶梯形的右下角开始向上递推出每个变量的值。
-
当\(r<n\)时,有无穷多解,\(x_{r+1,r+2,\dots,n}\)可以在数域中任取,剩下的变量值由其决定。
高斯约旦消元法
首先将方程组看成增广矩阵。
高斯约旦消元将矩阵消成对角线。
怎么实现呢?
通过初等变换:交换两行,两行做加减。可以发现这在解方程上是没有影响的。
步骤:
-
按列遍历,将操作行交换至当前行。
-
从当前操作行以及未操作行中找到系数最大的一项,在其他行中将这一主元的系数消成\(0\)。
-
重复前两步。
重要性质:
-
每次消元后当前列只有当前行上不为\(0\)。
-
当前行上,当前列左边的数均为\(0\)。
这样就可以直接做有唯一解的情况了。
那么无解和无穷多解怎么判呢?
首先很显然的,如果有一行中系数全为\(0\)而常数项不为\(0\),那么无解;非零行数量小于未知数的数量时,无穷多解。
在高斯约旦消元中,出现无解/无穷多解,则存在某一行找不到主元(即当前行与下面的行中,系数都为\(0\))。
我们发现,第一次找不到主元时,仍满足上面的性质,那么我们只需维护这一性质,即只用维持当前行不变,处理下一列即可。
处理完后,对于未操作的行,其中的系数都为\(0\),对于已操作的行,是一个“坡度不一”的倒三角。
那么判断无解/无穷多解只需判断系数全为\(0\)的行中常数项是否为\(0\)即可。
若没有常数项全为\(0\)的行,就正常高斯约旦消元解出方程。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=60;
const double eps=1e-5;
int x;
struct mat{
double num[maxn][maxn];
void GuassJordan(int n,int m){
int r=1;
for(int i=1;i<=n;++i){
int tmp=r;
for(int j=r+1;j<=n;++j){
if(fabs(num[j][i])>fabs(num[tmp][i])){
tmp=j;
}
}
if(fabs(num[tmp][i])<eps) continue;
swap(num[r],num[tmp]);
for(int k=1;k<=n;++k){
if(r==k) continue;
for(int j=i+1;j<=m;++j) num[k][j]-=num[k][i]/num[r][i]*num[r][j];
}
r++;
}
r--;
if(r<n){
for(int i=r+1;i<=n;++i){
if(fabs(num[i][m])>eps){
puts("-1");
return;
}
}
puts("0");
return;
}
for(int i=1;i<=n;++i){
num[i][m]/=num[i][i];
if(fabs(num[i][m])<eps) num[i][m]=0;
printf("x%d=%.2lf\n",i,num[i][m]);
}
return;
}
}matrix;
int main(){
scanf("%d",&x);
for(int i=1;i<=x;++i){
for(int j=1;j<=x+1;++j){
scanf("%lf",&matrix.num[i][j]);
}
}
matrix.GuassJordan(x,x+1);
return 0;
}
时间复杂度\(O(n^3)\)。
从当前行往下找操作行时,一般选当前主元系数最大的一行,可以减小误差。否则在卡精度的题中精度不够。
解空间
一堆概念来了
向量
定义:数域\(\mathbb F\)中的\(n\)个数\(a_1,a_2,\cdots,a_n\)构成的一个有序组\(\alpha=(a_1,a_2,\cdots,a_n)\)称为\(\mathbb F\)上的一个\(n\)维(行)向量。
-
加法:对于\(\alpha=(a_1,a_2,\cdots,a_n)\in \mathbb F^n,\beta=(b_1,b_2,\cdots,b_n)\in \mathbb F^n\),\(\alpha+\beta=(a_1+b_1,a_2+b_2,\cdots,a_n+b_n)\)。
-
数乘:对于\(k\in \mathbb F,\alpha \in \mathbb F^n\),\(k\alpha=(ka_1,ka_2,\cdots,ka_n)\)。
线性相关性
-
线性组合:设\(\alpha_1,\alpha_2,\cdots,\alpha_s\in \mathbb F^n\),\(k_1,k_2,\cdots,k_s\in \mathbb F\),称\(k_1\alpha_1+k_2\alpha_2+\cdots+k_s\alpha_s\)是\(\alpha_1,\alpha_2,\cdots,\alpha_s\)的一个线性组合。
-
线性表示:设\(\alpha_1,\alpha_2,\cdots,\alpha_s,\beta\in \mathbb F^n\),如果\(\beta\)可以写成\(\alpha_1,\alpha_2,\cdots,\alpha_s\)的一个线性组合,那么称\(\beta\)可由\(\alpha_1,\alpha_2,\cdots,\alpha_s\)线性表示(或者线性表出)。
-
线性相关:设\(\alpha_1,\alpha_2,\cdots,\alpha_s\in \mathbb F^n\),若存在一组不全为\(0\)的数\(k_1,k_2,\cdots,k_s\in \mathbb F\),使得\(k_1\alpha_1+k_2\alpha_2+\cdots+k_s\alpha_s=0\),则称\(\alpha_1,\alpha_2,\cdots,\alpha_s\)线性相关,否则称之线性无关,即任取一组不全为\(0\)的数\(k_1,k_2,\cdots,k_s\in \mathbb F\),\(k_1\alpha_1+k_2\alpha_2+\cdots+k_s\alpha_s\not=0\)。
对于第三点,等价地,\(k_1\alpha_1+k_2\alpha_2+\cdots+k_s\alpha_s=0\Rightarrow k_1=k_2=\cdots=k_s=0\)当且仅当\(\alpha_1,\alpha_2,\cdots,\alpha_s\)线性无关。
极大无关组
对于\(\alpha_1,\alpha_2,\cdots,\alpha_s\in \mathbb F^n\),如果其中的部分向量\(\alpha_{i_1},\cdots,\alpha_{i_r}\)满足:
-
线性无关。
-
每个\(\alpha_i(1\le i\le s)\)都可以由之线性表出。
那么称之为\(\alpha_1,\alpha_2,\cdots,\alpha_s\)的一个极大线性无关组(简称极大无关组)。
显然有:设\(\alpha_1,\alpha_2,\cdots,\alpha_s\in \mathbb F^n\)是含有非零向量的向量组,那么其必有极大无关组。
设\(\alpha_1,\alpha_2,\cdots,\alpha_s\in \mathbb F^n\)是一个向量组,称其极大无关组所含向量的个数为它的秩,记作\(r(\alpha_1,\cdots,\alpha_s)\)或者\(rank(\alpha_1,\cdots,\alpha_s)\)。
向量空间
设\(W\)是\(\mathbb F^n\)的一个非空子集,并且对于任意\(\alpha,\beta\in W,k\in \mathbb F\),都有\(k\alpha,\alpha+\beta\in W\),则称\(W\)是\(\mathbb F^n\)的一个子空间。
记\(\mathscr L(\alpha_1,\cdots,\alpha_s)=\{k_1\alpha_1+k_2\alpha_2+\cdots+k_s\alpha_s|k_1,k_2,\cdots,k_s\in \mathbb F\}\),称之为由\(\alpha_1,\cdots,\alpha_s\)张成的子空间。
进一步,当两组向量张成的子空间相同时,称两组向量是等价的。
定理:若\(\alpha_1,\cdots,\alpha_s\)和\(\beta_1,\cdots,\beta_t\)是等价的线性无关的向量组,那么\(s=t\)。
设\(W\)是\(\mathbb F^n\)的一个子空间,若存在线性无关的向量组\(\epsilon_1,\epsilon_2,\cdots,\epsilon_s\in W\),使得\(W\)中的每个向量都可以由\(\epsilon_1,\cdots,\epsilon_s\)线性表出,则称\(\epsilon_1,\cdots,\epsilon_s\)是\(W\)的一组基,称\(s\)为\(W\)的维数,记作\(\dim W=s\)。
\(W\)的任意两组基都是等价的,且所含向量数是相同的,于是\(\dim W\)不依赖于基的选取。
线性方程组与矩阵
线性方程组可以写成矩阵形式:
由此可得两个矩阵:
-
系数矩阵\(A=\begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n}\\ \vdots & \vdots & \ddots & \vdots\\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{bmatrix}\)。
-
增广矩阵\(\widetilde A=\begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} & b_1\\ \vdots & \vdots & \ddots & \vdots & \vdots\\ a_{n1} & a_{n2} & \cdots & a_{nn} & b_n \end{bmatrix}\)
矩阵的初等变换:与线性方程组的初等变换一一对应的。有初等行变换和初等列变换。
行空间,列空间
-
由\(A\)的\(m\)个行向量张成的\(\mathbb F^m\)的子空间称为\(A\)的行空间,其维数称为矩阵\(A\)的行秩,记作\(r_r(A)\)。
-
由\(A\)的\(n\)个列向量张成的\(\mathbb F^n\)的子空间称为\(A\)的列空间,其维数称为矩阵\(A\)的列秩,记作\(r_c(A)\)。
定理:矩阵的初等行、列变换不改变矩阵的行秩和列秩。
矩阵的秩
定理:
于是定义\(A\)的行秩和列秩为矩阵\(A\)的秩,记作\(r(A)\)或者\(rank(A)\)。
定理:\(r(AB)\le \min(r(A),r(B))\)
线性方程组的解
定理:
进一步,若\(r(A)=r(\widetilde A)=r\),即有解时:
-
\(r=n\)时,有唯一解。
-
\(r<n\)时,有无穷多解。
齐次线性方程组解的结构
设原线性方程组的系数矩阵\(A=(a_{i,j})_{m\times n}=\begin{bmatrix} \alpha_1 & \cdots & \alpha_n \end{bmatrix}\),\(\begin{bmatrix} b_1\\ \vdots\\ b_n \end{bmatrix}=\mathbf 0\)时,
设\(x_1=c_1,\cdots,x_n=c_n\)是一组解,写成列向量的形式\(\begin{bmatrix} c_1\\ \vdots\\ c_n \end{bmatrix}=\begin{bmatrix} c_1 & \cdots & c_n \end{bmatrix}^T\in \mathbb F^n\)
令\(W=\{\begin{bmatrix} c_1\\ \vdots\\ c_n \end{bmatrix}|\sum_k c_k\alpha_k=\mathbf 0\}\),即\(W\)是该方程组所有解组成的集合。
直接验证,\(W\)是\(\mathbb F^n\)的一个子空间,称之为方程组的解空间。\(W\)的一组基\(\eta_1,\cdots,\eta_s\)被称为方程组的一个基础解系。此时方程组的每一个解都可以表示为\(\lambda_1\eta_1+\cdots+\lambda_s\eta_s\),其中\(\lambda_1,\cdots,\lambda_s\in\mathbb F\)。
定理:设\(r=r(A)\),则\(\dim W=n-r\)
一般线性方程组解的结构
设原线性方程组的系数矩阵\(A=(a_{i,j})_{m\times n}=\begin{bmatrix} \alpha_1 & \cdots & \alpha_n \end{bmatrix}\),增广矩阵\(\widetilde A=\begin{bmatrix} \alpha_1 & \cdots & \alpha_n & \beta \end{bmatrix}\)
其相伴的齐次线性方程组(或导出组):
设\(W\)是其导出组的解空间。
定理:设\(r(A)=r(\widetilde A)=r\),即原线性方程组有解,并且设\(\gamma\)是一组特解,则\(\gamma+W=\{\gamma+\eta|\eta\in W\}\)是方程组所有解的集合。
换言之,设\(\eta_1,\cdots,\eta_{n-r}\)是导出组的一个基础解系,那么方程组的所有解为\(\gamma+\lambda_1\eta_1+\cdots+\lambda_{n-r}\eta_{n-r}\),其中\(\lambda_1,\cdots,\lambda_{n-r}\in\mathbb F\)
线性基
OI中一般都用异或线性基。是在数域\(\mathbb F_2\)下维护\(\mathbb F_2^n\)的一组基。
功能:
-
判断\(x\)是否能被数集中的数异或出来。
-
求一个数表示成数集中某些数异或和的方案数。
-
求数集的所有子集的异或和中最大/最小/第\(k\)大/第\(k\)小。
-
求一个数在数集的所有子集的异或和中的排名。
或许还可以发扬人类智慧来实现其他功能。
构造
我们贪心地构造一个数集\(S\)的线性基。
若\(\forall x\in S,0\le x<2^k\),那么数集中的每一个数都可以视作一个\(k\)维向量,每一个二进制位对应一个维度。
我们将线性基排序,保证其形如上三角矩阵,即第\(i\)个线性基中的元素,要么为\(0\),要么第\(i\)位上为\(1\)。这样保证了处于第\(i\)个元素之后的元素不会影响第\(i\)位。
如何构造呢?我们考虑把数逐个插入线性基中(即维护了当前的向量所张成的空间的基底)。
设当前要插入\(x\),从高位到低位枚举到了\(p\),若\(x\)的第\(p\)位为\(0\),则继续枚举,若为\(1\),考虑第\(p\)个线性基中的元素\(w_p\),若其不为\(0\),则\(x\gets x\oplus w_p\)然后继续枚举,否则\(w_p\gets x\)并结束。
容易发现这很对。正确性确实显然。
除了贪心的构造方式,还可以高斯消元,但我不会。
性质
-
原序列任意一个数都可以通过线性基中的一些数异或得到:因为线性基是原序列所张成的空间的一组基底。
-
线性基内任意数不能做异或得到\(0\):显然的,因为线性基中的向量是线性无关的,所以无法用一些线性基中的向量表示另一个线性基中的向量,即不可能异或得到\(0\)。
-
线性基中的元素个数是在满足性质一的前提下最少的:显然的。
基本操作
插入
同构造,直接代码实现。
void ins(ll x){
for(int i=50;i>=0;--i){
if((x>>i)&1){
if(w[i]) x^=w[i];
else{
w[i]=x;
break;
}
}
}
}
判断\(x\)能否被异或出来(存在性)
尝试插入\(x\),若可以插入,则不能,否则可以。代码略。
求数集的所有子集中最大异或和
贪心地,从线性基最高位开始尝试异或上线性基中的这个元素,取\(\max\)。
ll getmx(){
ll mx=0;
for(int i=50;i>=0;--i){
if(!w[i]) continue;
mx=max(mx,mx^w[i]);
}
return mx;
}
更改初值为\(x\)即可查询\(x\)异或上数集中的若干个数的最大异或和。
最小异或和
要检查是否有元素不能插入线性基,如果有,那么答案为\(0\),否则为最小的\(w_i\)。
线性基求并
把小的逐个插入大的即可,不能插入的就忽略。
有可重复贡献性,可以进行类似ST表的操作。
带删除线性基
这里的线性基没有消元。
离线算法
记录下每个元素的删除时间,插入时优先将删除时间更晚的放在基里面。如果删了基外面的元素,不管。删了基里面的元素,那就在操作时略去这个元素。
在线算法
咕咕咕。
行列式
定义
行列式只对方阵有定义。
设\(A=(a_{i,j})_{n\times n}\),其行列式记作\(|A|\)或者\(\det A\)或者\(\begin{vmatrix} a_{11} & \cdots & a_{1n}\\ \vdots & \ddots & \vdots\\ a_{n1} & \cdots & a_{nn} \end{vmatrix} \)
先定义一下余子式和代数余子式。
对于\(1\le i,j\le n\),定义\(M_{i,j}\)表示在\(A\)中划去第\(i\)行和第\(j\)列后剩下的\(n-1\)阶方阵的行列式,称之为\(A\)的元素\(a_{i,j}\)的余子式,\(A_{i,j}=(-1)^{i+j}M_{i,j}\)为\(a_{i,j}\)的代数余子式。
递归地定义行列式:
-
若\(n=1\),\(\det A=a_{11}\)。
-
若\(n>1\),\(\det A=\sum\limits_{i=1}^na_{i1}A_{i1}=\sum\limits_{i=1}^n(-1)^{i+1}a_{i1}M_{i1}\)(都是第一列上的元素)。
这个的等价定义是:
令\(\mathfrak S_n\)表示所有大小为\(n\)的排列(或者叫置换),\(\pi=(p_1,p_2,\cdots,p_n)\)表示一个排列,\(\tau(\pi)\)表示这个排列的逆序对个数,那么\(\det A=\sum\limits_{\pi\in \mathfrak S_n}(-1)^{\tau(\pi)}\prod\limits_{i=1}^na_{p_i,i}=\sum\limits_{\pi\in \mathfrak S_n}(-1)^{\tau(\pi)}\prod\limits_{i=1}^na_{i,p_i}\)
矩阵的初等变换对于行列式的影响
-
交换\(A\)中不同的两行得到\(B\),那么\(\det B=-\det A\)。
-
将\(A\)中的一行整体乘上\(c\in\mathbb F\)得到\(B\),那么\(\det B=c\det A\)。
-
将\(A\)中某一行的\(k\)倍加到另外一行上得到\(B\),那么\(\det B=\det A\)。
还有一个定理:
求法
利用初等变换对行列式的影响,我们对行列式进行高斯消元使之变成上三角矩阵,然后行列式的值就是主对角线上所有元素的乘积。\(O(n^3)\)。
高消小trick:模数不为质数,不可直接求逆元时,可以两行辗转相减将一个位置消成\(0\)。
一定要注意交换两行时\(\times (-1)\)。
一个定理:
一个定理:
范德蒙德行列式
这个行列式很特殊,可以\(O(n^2)\)求值。
形如:
推一下,我们先把第一列给消了,把第一行乘上\(-a_1\)加到第二行,以此类推。由性质可知\(V_n\)的值不变:
然后按第一列展开:
把\(V_n\)转置一下值不变,然后每一行提出公因式\((a_k-a_1)\),再转置回来,就得到了:
所以就可以得到\(V_n=\prod\limits_{i>j}(a_i-a_j)\),\(O(n^2)\)计算即可。
介绍一些概念和定理
可逆矩阵
设\(A\in M_n(\mathbb F)\),若存在\(B\in M_n(\mathbb F)\),使得\(AB=I_n=BA\),则称\(A\)是一个可逆矩阵,\(B\)是\(A\)的逆矩阵。记作\(B=A^{-1}\)。
可以证明,若\(AB=I_n\),则一定有\(BA=I_n\)。
性质
-
若\(A\)可逆,则\(|A^{-1}|=|A|^{-1}\)。
-
若\(A,B\)都是\(n\)阶可逆矩阵,那么\(AB\)也可逆,且\((AB)^{-1}=B^{-1}A^{-1}\)。一般地,若\(A_1,\cdots,A_s\)都是\(n\)阶可逆矩阵,那么\((A_1\cdots A_s)^{-1}=A_s^{-1}\cdots A_1^{-1}\)。
-
若\(A\)可逆,则\(A^T\)可逆,且\((A^T)^{-1}=(A^{-1})^T\)。
-
\(A\texttt{是}n\texttt{阶可逆矩阵}\iff \det A\ne 0\iff rank(A)=n\)
伴随矩阵
其中的\(A_{i,j}\)是代数余子式。称\(A^*\)是\(A\)的伴随矩阵。
一个定理:
相当于将第\(s\)行(列)复制到第\(t\)行(列),然后按第\(t\)行(列)展开。如果\(s\ne t\),那么不满秩,行列式为\(0\),否则就等于原来的值。
性质
-
\(A^*A=|A|I_n=AA^*\)。由上面的定理硬算\(A^*A\)即可得到。
-
\(A^{-1}=\dfrac{1}{|A|}A^*\),由上面那条性质可以得到。
初等变换的矩阵表示
初等行变换可以表示为左乘一个矩阵,初等列变换可以视为右称一个矩阵。
称这些矩阵为初等矩阵
初等矩阵之一
交换\(I_n\)的第\(i\)行和第\(j\)行(对于\(I_n\)来说也是相当于交换第\(i\)列和第\(j\)列),矩阵记作\(P_{i,j}\)。
初等矩阵之二
用\(c\)乘上\(I_n\)的第\(i\)行(等价于乘上第\(i\)列),记作\(D_i(c)\)。
初等矩阵之三
\(I_n\)的第\(i\)行乘上\(k\)加到第\(j\)行,\(i\ne j\)(等同于第\(j\)列乘上数\(k\)加到第\(i\)列)。记作\(T_{i,j}(k)\)。
\(k\)在第\(j\)行第\(i\)列,\(1\)和\(k\)之间全为\(0\)。
初等矩阵的性质
都是可逆矩阵。
-
\(P_{i,j}^{-1}=P_{i,j}\)
-
\(D_i(c)^{-1}=D_i(c^{-1})\)
-
\(T_{i,j}(k)^{-1}=T_{i,j}(-k)\)
怎么进行初等变换
设\(A\in M_{m,n}(\mathbb F)\),且\(P_{i,j},D_i(c),T_{i,j}(k)\)是\(m\)阶初等矩阵。
- \(P_{i,j}A\):交换\(A\)的第\(i\)行和第\(j\)行所得矩阵。
- \(D_i(c)A\):将\(A\)的第\(i\)行乘上\(c\)所得矩阵。
- \(T_{i,j}(k)A\):将\(A\)的第\(i\)行的\(k\)倍加到第\(j\)行所得矩阵。
设\(P_{i,j},D_i(c),T_{i,j}(k)\)是\(n\)阶初等矩阵。
- \(AP_{i,j}\):交换\(A\)的第\(i\)列和第\(j\)列所得矩阵。
- \(AD_i(c)\):将\(A\)的第\(i\)列乘上\(c\)所得矩阵。
- \(AT_{i,j}(k)\):将\(A\)的第\(j\)行的\(k\)倍加到第\(i\)行所得矩阵。(这里对比上面,\(i,j\)交换了位置)
应用
-
Matrix-Tree定理
-
LGV引理
这两个去看计数。
Cramer's rule
若一个线性方程组的系数矩阵\(A\)是可逆的,则该方程有唯一解:\(x_i=\dfrac{D_i}{|A|}\)。
其中
证明:给左边乘上个\(A^{-1}\)把\(A\)消掉,然后用\(A^{-1}=\dfrac{1}{|A|}A^*\)硬算右边即可。
特征值与特征多项式
特征值与特征向量
在\(A\)对应的线性变换下,一些向量的方向没有改变,只是伸缩了。
若非零向量\(\xi\)和数\(\lambda\)满足:
则称\(\lambda\)是\(A\)的一个特征值,\(\xi\)是\(A\)的一个特征向量。
此时有:
这个方程有非零解的充要条件是\(\det(\lambda I_n-A)=0\)
特征多项式
设\(A\in M_n(\mathbb F)\),行列式:
是一个关于\(x\)的\(n\)次多项式,称之为\(A\)的特征多项式,记作\(c_A(x)\)或者\(c(A)\)。
\(\lambda\in\mathbb F\texttt{是}A\texttt{的特征值}\iff \lambda \texttt{是}c_A(x)\texttt{的一个根}\)
求法
拉插
把\(x=0,1,2,\cdots ,n\)代入求值,然后就可以拉插求出特征多项式。\(O(n^4)\)。
但是有\(O(n^3)\)的算法。
利用上Hessenberg矩阵
对于\(n\)阶方阵\(A\)和\(B\),如果存在\(n\)阶可逆方阵\(P\)使得\(B=P^{-1}AP\),则称矩阵\(A,B\)相似,记变换\(A\mapsto P^{-1}AP\)为相似变换。
相似变换不会改变矩阵的行列式和特征多项式,这是容易证明的。(考虑\(I_n\mapsto P^{-1}I_nP\)后原式不变,然后根据行列式中可以把乘积拆开,提取因式得证)
把\(P\)写成初等矩阵之积,那么\(P^{-1}AP=T_n^{-1}\cdots T_1^{-1}AT_1\cdots T_n\)。这就相当于每次对\(A\)做一次行变换后又做一次列变换。
Schur's Lemma:
设\(A\in M_n(\mathbb F)\)且\(c_A(x)=\prod\limits_{i=1}^n(x-\lambda_i)\),其中\(\lambda_i\in \mathbb F\),则存在\(n\)阶可逆矩阵\(P\in M_n(\mathbb F)\)使得:
上三角矩阵的特征多项式是好求的,Schur's Lemma也证明了存在\(n\)阶可逆矩阵\(P\)使得\(P^{-1}AP\)为上三角形式,但是简单的类似高斯消元的做法不能保证消成上三角。
退而求其次,我们考虑消成上Henssenberg矩阵。
对于\(n>2\)的形如:
的矩阵我们称之为上Hessenberg矩阵,\(\beta\)为次对角线。我们可以通过相似变换将次对角线以下的元素消成\(0\)。而一个上Hessenberg矩阵的特征多项式可以在\(O(n^3)\)的时间内求出。
记\(H_i\)表示只保留\(H\)的前\(i\)行\(i\)列的矩阵,\(p_i(x)=\det(xI_i-H_i)\)。
先来观察一下下\(i\)较小的情况。
-
\(H_0=\begin{bmatrix}\ \end{bmatrix}\),\(p_0(x)=1\)(我们定义它为\(1\))。
-
\(H_1=\begin{bmatrix}\alpha_1\end{bmatrix}\),\(p_1(x)=x-\alpha_1\)。
-
\(H_2=\begin{bmatrix}\alpha_1 & h_{12}\\ \beta_2 & \alpha_2\end{bmatrix}\),\(p_2(x)=\det \begin{bmatrix}x-\alpha_1 & -h_{12}\\ -\beta_2 & x-\alpha_2\end{bmatrix}=(x-\alpha_2)p_1(x)-\beta_2h_{12}p_0(x)\)
考虑不断对最后一行展开,要么直接选\(\alpha_n\),要么选了一堆\(\beta\)之后选了\(h_{kn}\),可以归纳出递推式:
\(O(n^3)\)递推即可。一般称之为Hessenberg算法。
性质
先介绍概念
首先\(\dim M_n(\mathbb F)=n^2\)。
我们可以选取\(E_{i,j}(1\le i,j\le n)\)共\(n^2\)个矩阵作为一组基。其中\(E_{i,j}\)只有第\(i\)行第\(j\)列上的元素为\(1\),其余为\(0\)。显然它们线性无关且能够表示出任意的\(A\in M_n(\mathbb F)\)。并且基的选取不影响空间的维数。所以做完了。
对于\(A\in M_n(\mathbb F)\),\(A^0=I_n,A,A^2,\cdots,A^{n^2}\)线性相关(维数是\(n^2\)的,这里有\(n^2+1\)个矩阵)。
于是存在不全为零的\(c_0,\cdots ,c_{n^2}\),使得
记\(f(x)=\sum\limits_{i=0}^{n^2}c_ix^i\),那么\(f(x)\ne 0\),且\(f(A)=\mathbf 0\)。
我们称满足\(f(A)=\mathbf 0\)的多项式\(f(x)\)为\(A\)的零化多项式,上面证明了对于任意的\(A\),零化多项式一定存在。
设\(A\in M_n(\mathbb F)\),如果首项系数为\(1\)的多项式\(m_A(x)\)是\(A\)的零化多项式,且它是\(A\)的所有零化多项式中次数最小的,称\(m_A(x)\)为\(A\)的极小多项式。
性质:\(A\)的极小多项式是任意一个\(A\)的零化多项式的因式,即\(m_A(x)|f(x)\)。
Cayley-Hamilton定理
设\(A\in M_n(\mathbb F)\),\(c_A(x)=\det(xI_n-A)\)是\(A\)的特征多项式,则\(c_A(A)=\mathbf 0\)。
即\(A\)的特征多项式是\(A\)的零化多项式。
考虑证明,有一个引理:
有了这个引理后,由Schur's Lemma,总是有相似变换\(A\mapsto P^{-1}AP\)使之成为上三角矩阵,并且相似变换不改变特征多项式。
设\(T=P^{-1}AP\)的特征多项式为\(c_T(x)\),那么有\(c_A(x)=c_T(x),c_T(P^{-1}AP)=0\)。
设\(T=P^{-1}BP\),则\(B=PTP^{-1}\),于是\(\det(PTP^{-1}-T)=\det(PTP^{-1}-PTP^{-1})=0\)。
于是\(c_A(A)=0\)。
应用:
对于一个关于矩阵\(A\)的多项式\(f(A)\),我们可以拆一下\(f(A)=c_A(A)Q(A)+R(A)\),前一半为\(0\),于是只用算\(R(A)\)。而这就是一个多项式取模。