线性代数(长期更新)

矩阵

概念

定义:m,nN+,由数域Fm×n个数排成一个mn列的矩形数表,称之F上的一个mn列的矩阵或m×n矩阵。特别地,m=n时称该矩阵是一个n阶方阵。

(ai,j)=(ai,j)m×n=A

Mm,n(F)={A=(ai,j)|ai,jF}为数域F上所有m×n矩阵全体。Mn(F)=Mn,n(F)为数域F上所有n阶方阵全体。

看起来比较牛。

矩阵乘法

A=(ai,j)m×n,B=(bi,j)n×s,定义A×B为:

AB=C=(ci,j)m×sMm,s(F)

其中ci,j=1knai,k×bk,j。即A的第i行和B的第j列对应相乘再相加。O(n3)

卡常技巧:或许在数字不大的时候可以用long long/__int128存下ci,j,最后取模。

性质

结合律

A(BC)=(AB)C

分配律

A(B+C)=AB+AC,(B+C)A=BA+CA

单位元

n1,记:

In=[100001000001]Mn(F)

称为n阶单位矩阵,任取AMm,n(F),都有ImA=A=AIn

不满足消去律和交换律

ABBAAB=ACB=C

与常系数齐次线性递推

由于矩阵乘法的结合律,可以用快速幂计算Am

对于常系数齐次线性递推,可以构造转移矩阵A,然后对A快速幂即可。

邻接矩阵的矩阵乘法

对于一个有向图G,其邻接矩阵为A=(ai,j)ai,j表示从ij有多少条边直接相连(即从i1步到j的方案数)。

对比一下矩阵乘法和Floyd,发现很像。可以知道Akai,j表示从ik步到达j的方案数,O(n3)

如果只关心可达性,则将(+,×)矩阵乘法换成(&,|)矩阵乘法即可,其中可以加入bitsetO(n3ω)

这种板子题中变形一下就要拆点,尽量将拆边换成拆点,因为边数可以轻易达到O(n2)

矩阵乘法优化DP

那是DP的问题。

通常范围会很大,但是先别管,推出朴素的DP式子再说。

一般来讲这里的DP式子不会很长(没有Σ之类的),这样就可以把相关状态放到矩阵中,然后推一下转移矩阵再衔接矩阵快速幂。

如果DP式子很长,那么考虑差分一下去掉求和号,让DP式子变短(就是把相同的部分去掉)。

如果有类似标记/隔断之类的特殊情况,就在这个地方停下来特殊转移。

动态DP

因为矩阵乘法的结合律,可以把DP写成一串转移矩阵乘起来的样子,然后可以用数据结构支持修改/在一个区间(范围)中做DP。几乎是数据结构题。常见会用(max/min,+)矩阵。

高斯消元/高斯约旦消元

要解n元线性方程组:

{a1,1x1+a1,2x2+a1,nxn=b1an,1x1+an,2x2+an,nxn=bn

线性方程组的初等变换和高斯消元法

  • 交换两个方程的位置。

  • 用一个非零数乘某一方程的两边。

  • 将一个方程的k倍加到另一个方程上。

可以发现初等变换不改变线性方程组的解。

那么我们可以通过初等变换很容易将原来的线性方程组变成上阶梯形的样子,且每个系数不全为0的行的第一个非零的系数为1。选择当前变量的系数时要选最大的一个,提高精度减小误差。

设化为上阶梯形后,有r个方程左边的系数不全为0,那么称r为这个方程组的秩

  • r<nbr+1,r+2,,n不全为0,则方程组无解。

  • r=n,或者r<nbr+1,r+2,,n全为0,方程组有解。

在有解的情况下,继续讨论唯一解还是无穷多解:

  • r=n时,有唯一解,可以从上阶梯形的右下角开始向上递推出每个变量的值。

  • r<n时,有无穷多解,xr+1,r+2,,n可以在数域中任取,剩下的变量值由其决定。

高斯约旦消元法

首先将方程组看成增广矩阵。

[a1,1a1,2a1,nb1an,1an,2an,nbn]

高斯约旦消元将矩阵消成对角线。

怎么实现呢?

通过初等变换:交换两行,两行做加减。可以发现这在解方程上是没有影响的。

步骤:

  1. 按列遍历,将操作行交换至当前行。

  2. 从当前操作行以及未操作行中找到系数最大的一项,在其他行中将这一主元的系数消成0

  3. 重复前两步。

重要性质

  1. 每次消元后当前列只有当前行上不为0

  2. 当前行上,当前列左边的数均为0

这样就可以直接做有唯一解的情况了。

那么无解和无穷多解怎么判呢?

首先很显然的,如果有一行中系数全为0而常数项不为0,那么无解;非零行数量小于未知数的数量时,无穷多解。

在高斯约旦消元中,出现无解/无穷多解,则存在某一行找不到主元(即当前行与下面的行中,系数都为0)。

我们发现,第一次找不到主元时,仍满足上面的性质,那么我们只需维护这一性质,即只用维持当前行不变,处理下一列即可。

处理完后,对于未操作的行,其中的系数都为0,对于已操作的行,是一个“坡度不一”的倒三角。

那么判断无解/无穷多解只需判断系数全为0的行中常数项是否为0即可。

若没有常数项全为0的行,就正常高斯约旦消元解出方程。

P2455 [SDOI2006] 线性方程组

代码
#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(n3)

从当前行往下找操作行时,一般选当前主元系数最大的一行,可以减小误差。否则在卡精度的题中精度不够。

解空间

一堆概念来了

向量

定义:数域F中的n个数a1,a2,,an构成的一个有序组α=(a1,a2,,an)称为F上的一个n维(行)向量。

  • 加法:对于α=(a1,a2,,an)Fn,β=(b1,b2,,bn)Fnα+β=(a1+b1,a2+b2,,an+bn)

  • 数乘:对于kF,αFnkα=(ka1,ka2,,kan)

线性相关性

  • 线性组合:设α1,α2,,αsFnk1,k2,,ksF,称k1α1+k2α2++ksαsα1,α2,,αs的一个线性组合。

  • 线性表示:设α1,α2,,αs,βFn,如果β可以写成α1,α2,,αs的一个线性组合,那么称β可由α1,α2,,αs线性表示(或者线性表出)。

  • 线性相关:设α1,α2,,αsFn,若存在一组不全为0的数k1,k2,,ksF,使得k1α1+k2α2++ksαs=0,则称α1,α2,,αs线性相关,否则称之线性无关,即任取一组不全为0的数k1,k2,,ksFk1α1+k2α2++ksαs0

对于第三点,等价地,k1α1+k2α2++ksαs=0k1=k2==ks=0当且仅当α1,α2,,αs线性无关。

极大无关组

对于α1,α2,,αsFn,如果其中的部分向量αi1,,αir满足:

  • 线性无关。

  • 每个αi(1is)都可以由之线性表出。

那么称之为α1,α2,,αs的一个极大线性无关组(简称极大无关组)。

显然有:设α1,α2,,αsFn是含有非零向量的向量组,那么其必有极大无关组。

α1,α2,,αsFn是一个向量组,称其极大无关组所含向量的个数为它的,记作r(α1,,αs)或者rank(α1,,αs)

向量空间

WFn的一个非空子集,并且对于任意α,βW,kF,都有kα,α+βW,则称WFn的一个子空间

L(α1,,αs)={k1α1+k2α2++ksαs|k1,k2,,ksF},称之为由α1,,αs张成的子空间

进一步,当两组向量张成的子空间相同时,称两组向量是等价的。

定理:若α1,,αsβ1,,βt是等价的线性无关的向量组,那么s=t

WFn的一个子空间,若存在线性无关的向量组ϵ1,ϵ2,,ϵsW,使得W中的每个向量都可以由ϵ1,,ϵs线性表出,则称ϵ1,,ϵsW的一组,称sW的维数,记作dimW=s

W的任意两组基都是等价的,且所含向量数是相同的,于是dimW不依赖于基的选取。

线性方程组与矩阵

线性方程组可以写成矩阵形式:

[a11a12a1nan1an2ann][x1xn]=[b1bn]

由此可得两个矩阵:

  • 系数矩阵A=[a11a12a1nan1an2ann]

  • 增广矩阵A~=[a11a12a1nb1an1an2annbn]

矩阵的初等变换:与线性方程组的初等变换一一对应的。有初等行变换和初等列变换。

行空间,列空间

  • Am个行向量张成的Fm的子空间称为A行空间,其维数称为矩阵A行秩,记作rr(A)

  • An个列向量张成的Fn的子空间称为A列空间,其维数称为矩阵A列秩,记作rc(A)

定理:矩阵的初等行、列变换不改变矩阵的行秩和列秩。

矩阵的秩

定理

rr(A)=rc(A)

于是定义A的行秩和列秩为矩阵A的秩,记作r(A)或者rank(A)

定理r(AB)min(r(A),r(B))

线性方程组的解

定理

线性方程组有解的充要条件是r(A)=r(A~)

进一步,若r(A)=r(A~)=r,即有解时:

  • r=n时,有唯一解。

  • r<n时,有无穷多解。

齐次线性方程组解的结构

设原线性方程组的系数矩阵A=(ai,j)m×n=[α1αn][b1bn]=0时,

x1α1++xnαn=0

x1=c1,,xn=cn是一组解,写成列向量的形式[c1cn]=[c1cn]TFn

W={[c1cn]|kckαk=0},即W是该方程组所有解组成的集合。

直接验证,WFn的一个子空间,称之为方程组的解空间W的一组基η1,ηs被称为方程组的一个基础解系。此时方程组的每一个解都可以表示为λ1η1++λsηs,其中λ1,,λsF

定理:设r=r(A),则dimW=nr

一般线性方程组解的结构

设原线性方程组的系数矩阵A=(ai,j)m×n=[α1αn],增广矩阵A~=[α1αnβ]

x1α1++xnαn=β

其相伴的齐次线性方程组(或导出组):

x1α1++xnαn=0

W是其导出组的解空间。

定理:设r(A)=r(A~)=r,即原线性方程组有解,并且设γ是一组特解,则γ+W={γ+η|ηW}是方程组所有解的集合。

换言之,设η1,,ηnr是导出组的一个基础解系,那么方程组的所有解为γ+λ1η1++λnrηnr,其中λ1,,λnrF

线性基

OI中一般都用异或线性基。是在数域F2下维护F2n的一组基。

功能:

  1. 判断x是否能被数集中的数异或出来。

  2. 求一个数表示成数集中某些数异或和的方案数。

  3. 求数集的所有子集的异或和中最大/最小/第k大/第k小。

  4. 求一个数在数集的所有子集的异或和中的排名。

或许还可以发扬人类智慧来实现其他功能。

构造

我们贪心地构造一个数集S的线性基。

xS,0x<2k,那么数集中的每一个数都可以视作一个k维向量,每一个二进制位对应一个维度。

我们将线性基排序,保证其形如上三角矩阵,即第i个线性基中的元素,要么为0,要么第i位上为1。这样保证了处于第i个元素之后的元素不会影响第i位。

如何构造呢?我们考虑把数逐个插入线性基中(即维护了当前的向量所张成的空间的基底)。

设当前要插入x,从高位到低位枚举到了p,若x的第p位为0,则继续枚举,若为1,考虑第p个线性基中的元素wp,若其不为0,则xxwp然后继续枚举,否则wpx并结束。

容易发现这很对。正确性确实显然。

除了贪心的构造方式,还可以高斯消元,但我不会。

性质

  1. 原序列任意一个数都可以通过线性基中的一些数异或得到:因为线性基是原序列所张成的空间的一组基底。

  2. 线性基内任意数不能做异或得到0:显然的,因为线性基中的向量是线性无关的,所以无法用一些线性基中的向量表示另一个线性基中的向量,即不可能异或得到0

  3. 线性基中的元素个数是在满足性质一的前提下最少的:显然的。

基本操作

插入

同构造,直接代码实现。

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,否则为最小的wi

线性基求并

把小的逐个插入大的即可,不能插入的就忽略。

有可重复贡献性,可以进行类似ST表的操作。

带删除线性基

这里的线性基没有消元。

离线算法

记录下每个元素的删除时间,插入时优先将删除时间更晚的放在基里面。如果删了基外面的元素,不管。删了基里面的元素,那就在操作时略去这个元素。

在线算法

咕咕咕。

行列式

定义

行列式只对方阵有定义。

A=(ai,j)n×n,其行列式记作|A|或者detA或者|a11a1nan1ann|

先定义一下余子式和代数余子式

对于1i,jn,定义Mi,j表示在A中划去第i行和第j列后剩下的n1阶方阵的行列式,称之为A的元素ai,j的余子式,Ai,j=(1)i+jMi,jai,j的代数余子式。

递归地定义行列式:

  • n=1detA=a11

  • n>1detA=i=1nai1Ai1=i=1n(1)i+1ai1Mi1(都是第一列上的元素)。

这个的等价定义是:

Sn表示所有大小为n的排列(或者叫置换),π=(p1,p2,,pn)表示一个排列,τ(π)表示这个排列的逆序对个数,那么detA=πSn(1)τ(π)i=1napi,i=πSn(1)τ(π)i=1nai,pi

矩阵的初等变换对于行列式的影响

  • 交换A中不同的两行得到B,那么detB=detA

  • A中的一行整体乘上cF得到B,那么detB=cdetA

  • A中某一行的k倍加到另外一行上得到B,那么detB=detA

还有一个定理

|a11a1nas1+b1asn+bnan1ann|=|a11a1nas1asnan1ann|+|a11a1nb1bnan1ann|

求法

利用初等变换对行列式的影响,我们对行列式进行高斯消元使之变成上三角矩阵,然后行列式的值就是主对角线上所有元素的乘积。O(n3)

一定要注意交换两行时×(1)

一个定理

det(AB)=detA×detB

一个定理

detAT=detA

范德蒙德行列式

这个行列式很特殊,可以O(n2)求值。

形如:

Vn=|111a1a2ana12a22an2a1n1a2n1ann1|

推一下,我们先把第一列给消了,把第一行乘上a1加到第二行,以此类推。由性质可知Vn的值不变:

Vn=|1110a2a1ana10a22a2a1an2ana10a2n1a2n2a1ann1ann2a1|

然后按第一列展开:

Vn=|a2a1ana1a22a2a1an2ana1a2n1a2n2a1ann1ann2a1|

Vn转置一下值不变,然后每一行提出公因式(aka1),再转置回来,就得到了:

Vn=1<kn(aka1)|11a2ana2n2ann2|=1<kn(aka1)Vn1

所以就可以得到Vn=i>j(aiaj)O(n2)计算即可。

介绍一些概念和定理

可逆矩阵

AMn(F),若存在BMn(F),使得AB=In=BA,则称A是一个可逆矩阵BA逆矩阵。记作B=A1

可以证明,若AB=In,则一定有BA=In

性质

  • A可逆,则|A1|=|A|1

  • A,B都是n阶可逆矩阵,那么AB也可逆,且(AB)1=B1A1。一般地,若A1,,As都是n阶可逆矩阵,那么(A1As)1=As1A11

  • A可逆,则AT可逆,且(AT)1=(A1)T

  • An阶可逆矩阵detA0rank(A)=n

伴随矩阵

A=|A11A1nAn1Ann|

其中的Ai,j是代数余子式。称AA的伴随矩阵。

一个定理

i=1naisAit=[s=t]|A|=i=1nasiAti

相当于将第s行(列)复制到第t行(列),然后按第t行(列)展开。如果st,那么不满秩,行列式为0,否则就等于原来的值。

性质

  • AA=|A|In=AA。由上面的定理硬算AA即可得到。

  • A1=1|A|A,由上面那条性质可以得到。

初等变换的矩阵表示

初等行变换可以表示为左乘一个矩阵,初等列变换可以视为右称一个矩阵。

称这些矩阵为初等矩阵

初等矩阵之一

交换In的第i行和第j行(对于In来说也是相当于交换第i列和第j列),矩阵记作Pi,j

Pi,j=[1101(第i行第j列)11(第j行第i列)1011]

初等矩阵之二

c乘上In的第i行(等价于乘上第i列),记作Di(c)

Di(c)=[11c11]

初等矩阵之三

In的第i行乘上k加到第j行,ij(等同于第j列乘上数k加到第i列)。记作Ti,j(k)

Ti,j(k)=[111k11111]

k在第j行第i列,1k之间全为0

初等矩阵的性质

都是可逆矩阵。

  • Pi,j1=Pi,j

  • Di(c)1=Di(c1)

  • Ti,j(k)1=Ti,j(k)

怎么进行初等变换

AMm,n(F),且Pi,j,Di(c),Ti,j(k)m阶初等矩阵。

  • Pi,jA:交换A的第i行和第j行所得矩阵。
  • Di(c)A:将A的第i行乘上c所得矩阵。
  • Ti,j(k)A:将A的第i行的k倍加到第j行所得矩阵。

Pi,j,Di(c),Ti,j(k)n阶初等矩阵。

  • APi,j:交换A的第i列和第j列所得矩阵。
  • ADi(c):将A的第i列乘上c所得矩阵。
  • ATi,j(k):将A的第j行的k倍加到第i行所得矩阵。(这里对比上面,i,j交换了位置)

应用

  • Matrix-Tree定理

  • LGV引理

这两个去看计数。

Cramer's rule

若一个线性方程组的系数矩阵A是可逆的,则该方程有唯一解:xi=Di|A|

其中

Di=|a11a1,i1b1a1,i+1a1nan1an,i1bnan,i+1ann|

证明:给左边乘上个A1A消掉,然后用A1=1|A|A硬算右边即可。

特征值与特征多项式

特征值与特征向量

A对应的线性变换下,一些向量的方向没有改变,只是伸缩了。

非零向量ξ和数λ满足:

Aξ=λξ

则称λA的一个特征值,ξA的一个特征向量。

此时有:

(λInA)ξ=0

这个方程有非零解的充要条件是det(λInA)=0

特征多项式

AMn(F),行列式:

det(xInA)=|xa11a12a1na21xa22a2nan1an2xann|

是一个关于xn次多项式,称之为A特征多项式,记作cA(x)或者c(A)

λFA的特征值λcA(x)的一个根

求法

拉插

x=0,1,2,,n代入求值,然后就可以拉插求出特征多项式。O(n4)

但是有O(n3)的算法。

利用上Hessenberg矩阵

对于n阶方阵AB,如果存在n阶可逆方阵P使得B=P1AP,则称矩阵A,B相似,记变换AP1AP相似变换

相似变换不会改变矩阵的行列式和特征多项式,这是容易证明的。(考虑InP1InP后原式不变,然后根据行列式中可以把乘积拆开,提取因式得证)

P写成初等矩阵之积,那么P1AP=Tn1T11AT1Tn。这就相当于每次对A做一次行变换后又做一次列变换。

Schur's Lemma

AMn(F)cA(x)=i=1n(xλi),其中λiF,则存在n阶可逆矩阵PMn(F)使得:

P1AP=[λ10λ2000λn]

上三角矩阵的特征多项式是好求的,Schur's Lemma也证明了存在n阶可逆矩阵P使得P1AP为上三角形式,但是简单的类似高斯消元的做法不能保证消成上三角。

退而求其次,我们考虑消成上Henssenberg矩阵。

对于n>2的形如:

H=[α1h12h1nβ2α2h23h2nh(n1)nβnαn]

的矩阵我们称之为上Hessenberg矩阵,β为次对角线。我们可以通过相似变换将次对角线以下的元素消成0。而一个上Hessenberg矩阵的特征多项式可以在O(n3)的时间内求出。

Hi表示只保留H的前ii列的矩阵,pi(x)=det(xIiHi)

先来观察一下下i较小的情况。

  • H0=[ ]p0(x)=1(我们定义它为1)。

  • H1=[α1]p1(x)=xα1

  • H2=[α1h12β2α2]p2(x)=det[xα1h12β2xα2]=(xα2)p1(x)β2h12p0(x)

考虑不断对最后一行展开,要么直接选αn,要么选了一堆β之后选了hkn,可以归纳出递推式:

pn(x)=(xαn)pn1(x)m=1n1hnm,n(i=nm+1nβi)pnm1(x)

O(n3)递推即可。一般称之为Hessenberg算法。

性质

先介绍概念

首先dimMn(F)=n2

我们可以选取Ei,j(1i,jn)n2个矩阵作为一组基。其中Ei,j只有第i行第j列上的元素为1,其余为0。显然它们线性无关且能够表示出任意的AMn(F)。并且基的选取不影响空间的维数。所以做完了。

对于AMn(F)A0=In,A,A2,,An2线性相关(维数是n2的,这里有n2+1个矩阵)。

于是存在不全为零的c0,,cn2,使得

c0A0++cn2An2=0

f(x)=i=0n2cixi,那么f(x)0,且f(A)=0

我们称满足f(A)=0的多项式f(x)A零化多项式,上面证明了对于任意的A,零化多项式一定存在。

AMn(F),如果首项系数为1的多项式mA(x)A的零化多项式,且它是A的所有零化多项式中次数最小的,称mA(x)A极小多项式

性质:A的极小多项式是任意一个A的零化多项式的因式,即mA(x)|f(x)

Cayley-Hamilton定理

AMn(F)cA(x)=det(xInA)A的特征多项式,则cA(A)=0

A的特征多项式是A的零化多项式。

考虑证明,有一个引理:

A=[λ10λ2000λn]cA(A)=0

有了这个引理后,由Schur's Lemma,总是有相似变换AP1AP使之成为上三角矩阵,并且相似变换不改变特征多项式。

T=P1AP的特征多项式为cT(x),那么有cA(x)=cT(x),cT(P1AP)=0

cA(A)=cT(A)=cT(PTP1)=det(PTP1T)

T=P1BP,则B=PTP1,于是det(PTP1T)=det(PTP1PTP1)=0

于是cA(A)=0

应用:

对于一个关于矩阵A的多项式f(A),我们可以拆一下f(A)=cA(A)Q(A)+R(A),前一半为0,于是只用算R(A)。而这就是一个多项式取模。

posted @   RandomShuffle  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示