线性代数基础和矩阵树定理

【定义】

  1. 向量:每个向量由若干个标量(数)组成,每个标量都来自同一个域 F。若一个向量包含 k 个标量,称其为 k 维向量。

  2. 向量空间 V:由若干个向量组成。需要满足以下条件:

    1. V 中的向量满足加法交换律和加法结合律。

    2. V 中存在 0 向量,0+u=u

    3. uV,则 uV

    4. a,b 为标量,a(bu)=(ab)u,(a+b)u=au+bu

    5. a 为标量,a(u+v)=au+av

  3. 线性表示:若有向量 v,a1an,且存在一组标量 (k1kn) 使得 v=i=1nkiai,则 v 可被 a1an 线性表示。

  4. 线性相关:对于一个向量空间 V 内的 n 个向量 (v1,v2,,vn),若存在一组标量 (a1,a2,,an) 满足 a1an 不全为 0i=1naivi=0,则称 v1vn 线性相关。

    线性相关还有另外一个表述方式i[1,n]Z,vi 不可被 {v1vn}/{vi} 线性表示。

  5. 生成空间:对于一组向量 v1vn,定义其生成空间 V(a1,a2,,an)(0,0,,0)(aivi)V。可以看出,V 是一个向量空间。

  6. 基:对于一个向量空间 V,若能找出若干个向量,使它们的生成空间等于 V,称这些向量为 V 的一组基。基可能不唯一。

    定理:不论怎么找基,基中向量个数都等于 V 中向量的维度。

  7. 奇排列和偶排列:对于排列 p,记其逆序对个数为 inv(p)。如果 inv(p) 为奇数,称为奇排列;否则称为偶排列。

  8. 矩阵的转置。对于一个 n×m 的矩阵 E,定义其转置矩阵 ETETm×n 的矩阵,Ei,jT=Ej,i

【矩阵乘法】

【向量】

向量:一个有方向的量。

如果没有方向,称为 “标量”;有方向,就是 “向量”。

平面向量:就是 2 维向量。

维度:如果一个向量是 n 维的,说明它可以用 n 个数确定方向

例如 2 维向量。

2 维向量,我们在 2 维平面上研究。因为我们不在乎起点和终点,所以我们可以把起点平移到原点。

此时,终点落在平面上的一个点 (a1,a2) 上,这就是向量的坐标。

同理,在 3 维向量中,我们可以用 (a1,a2,a3) 来表示终点所在的坐标。

所以,维度就是表示我们用多少个数就可以确定平面上的点

【矩阵的理解】

矩阵乘法,就是一个线性变换

什么叫线性变换

我们看一个函数:f(x)=kx,这是一个一次函数,也就是线性的

类推:f(x1,x2,,xn)=i=1nkixi,也是线性的

这样我们通过 (k1,k2,,kn) 这个线性变换,把 (x1,x2,,xn) 变成了一个数。

观察矩阵乘法的运算法则:

ci,j=x=1kai,x×bx,j,这不就是可以视为线性变换吗?

ai,x 视作上面的 kibx,j 视作上面的 xici,j 视作线性变换的结果。

再回过头看我们的矩阵乘法:

向量乘以矩阵,得出的向量就是经过线性变换后得出的向量

两个矩阵相乘,既可以视作很多个向量存在矩阵里,依次进行线性变换;也可以视为得出一个先做第一个变换,再做第二个变换的等价变换

oi-wiki

【用矩阵处理问题】

我们说到,矩阵可以视作一个线性变换

那么,如果我们的答案是一个经过若干次线性变换得出的,就可以考虑编成一个矩阵,然后利用快速幂log 级别的时间内求出来。

例题:斐波那契数列,这题可谓相当经典。

我们看这个递推式:Fi=Fi2+Fi1,满足 y=k1x1+k2x2 的形式,Fi2x1,Fi1x2,这是线性变换!

所以我们可以考虑用矩阵乘法。

研究矩阵乘法的递推,我们从起点开始。

上面提到过,系数 (k1,,kn) 是线性变换,那么 x1,,xn 就是起点。

所以把 x1,x2 存进矩阵当起点:

mar=(Fi2Fi1)

我们往后推一步:

mar=(Fi1Fi)

mar 变换矩阵change =mar

mar1,1=Fi1 正好就是 mar2,1,根据矩阵乘法的定义,mar1,1=mar1,1change1,1+mar1,2change2,1

我们只要恰好一个 mar2,1:所以change1,1=0,change2,1=1

同理得:change1,2=change2,2=1

所以:

(Fi2Fi1)(0111)=(Fi1Fi)

(F1F2)(0111)i2=(Fi1Fi)

同时,为了好写,我们可以把初始的一行矩阵也写成 2×2 的方阵,第二行全是 0 即可。

【高斯消元】

高斯消元用来解决线性方程组的问题。

例如:

{2x1+3x2+4x3=20x1+2x2+3x3=143x1+x2+2x3=11

得出 x1=1,x2=2,x3=3

这就是线性方程组。

高斯消元法给出了一个普遍性的解决这种问题的方法。

假设我们要解决一个 n 元的线性方程组,第 i 个方程是 ki,1x1+ki,2x2+ki,3x3++ki,nxn=ai

我们建立一个 n×(n+1) 的矩阵,其中矩阵的第 i 行为 (ki,1,ki,2,,ki,n,ai)

例如:

(234201231431211)

我们的目标是得出一个矩阵,这个矩阵左边的 n×n 应该是一个单位矩阵。

例如:

(100101020013)

这样,第 n+1 列的所有数就是 {xi} 的解了。

回到一开始的矩阵,我们考虑考虑怎么做。

我们希望最后第一行第一列的是 1,其他行第一列的都是 0

所以我们先让第一行第一列变成 1,也就是除一下:

(11.52101231431211)

然后我们用第一行 “消” 掉其他行的 x1,这就是平时解方程的加减消元法。

(11.521000.51403.5419)

然后到 x2,注意到当我们消完 x1 的时候,对之后每一行的乘除都不会影响到第一列的系数了。

因此我们让第二行的第二列变成 1

(11.5210012803.5419)

这个时候再用第二行消去其他行的 x2。因为第一列已经是 0,所以第二行加减第一行也不会影响 x1 的系数 1

(101201280039)

最后到 x3,一样的操作。

(100101020013)

这样我们就得出了解。

但是!还有情况!无解或者无穷多解怎么办?

考虑一个无解的情况:

x1+x2=1,2x1+2x2=3

(111223)

消去 x1

(111001)

发现,这个时候的最后一行,前面都是 0 但是最后一列不是。

这表示 00,矛盾,所以无解。

因此,只要我们做完高斯消元,发现有一行前面都是 0 但最后不是 0,说明无解。

再看看无穷多解。

x1+x2=1,2x1+2x2=2

(111222)

消去。

(111000)

这个时候最后一行全都是 0,说明无穷多组解。


高斯消元总结:

  1. 构建矩阵。

  2. i 次操作,从 in 行中找出一个第 i 列非 0 的行,把这个行换到第 i 行的位置,用这个行消去其他行。

    注意:如果找不到非 0 的行,说明无穷多组解。

  3. 结束后判断有没有全 0 的行或者前面全 0 但最后不是 0 的行。

【行列式】

行列式定义在一个矩阵 M 上,记作 det(M)

det(M)=p=1~n的一个排列sgn(p)i=1nMi,pi

其中 sgn(p)={1p是奇排列1p是偶排列 ,也能看出来 sgn(p)=(1)inv(p)

行列式有一些性质。

  • 将矩阵的某一列乘以一个标量 a 加到另一列上,行列式不变。

  • 交换矩阵的两列,行列式符号取反。

  • 将某列整体乘以一个标量 a,行列式也乘以 a

  • 由于矩阵是对称的,上面关于 "列" 的性质,对 "行" 也同样成立。

【求行列式】

怎么求一个矩阵的行列式?根据这三条性质,有一个 O(n3) 的算法。

首先考虑一个下(上)三角矩阵:对角线下方的位置都是 0。可以发现,这个矩阵的行列式就等于对角线上的数的乘积。

根据性质 "某行加减另一行若干倍,行列式不变" 可以用类似高斯消元的方式把原来的矩阵等价到一个下三角矩阵。

同时,高斯消元法里面会有交换两行的操作。在求行列式的时候,累计交换两行的次数,判断奇偶性,最后再取反即可。

这里可以延伸出一个行列式的性质。

  • 如果矩阵存在一些列或行(列向量的集合),它们线性相关,则这个矩阵的行列式为 0

    证明:如果这个矩阵有一些列或行线性相关,则我们用上面的变换,使矩阵的某一行(列)全为 0,显然可得行列式为 0

【柯西-宾内 公式】

Cauchy-Binet 公式可以把两矩阵相乘的行列式拆成两个矩阵分别的行列式。

det(AB)=S{1,2,,n},|S|=mdet(AS)det(BS)

介绍一下上面式子里的元素。

A 是一个 m×n 的矩阵,B 是一个 n×m 的矩阵,且 mn

S 是一个 m 的大小的 {1,2,,n} 的子集。

AS 是从 A 的一个子矩阵:如果 S 中包含 i,则 AS 中包含 A 的第 i 列。这些列顺次排列得到 AS

BS 是从 B 的一个子矩阵:如果 S 中包含 i,则 BS 中包含 B 的第 i 行。这些行顺次排列得到 BS

【矩阵树定理】

矩阵树定理能在 O(n3) 的时间内求出任意图的生成树个数。

对于一张图 G(暂时只考虑简单图),构造一个矩阵 Q

  • Qn×n

  • Qi,i=degi,即 i 点的度数。

  • Qi,j|ij={1i,j 之间有边0i,j 之间没有边

M11Q 删去第一行第一列的矩阵,矩阵树定理表明 det(M11) 等于 G 的生成树个数。

证明

考虑构造一个 n×m 的矩阵 EE 的每一列代表一条边。若第 i 条边是 (ui,vi),则 E 的第 i 列中第 ui 行设为 1,第 vi 行设为 1,其他行设为 0。(这里 ui 行设为 1vi 行设为 1 也可以,因为某一列整体乘 a 行列式不变)

可以发现,Ei 行所有数的绝对值之和等于 i 的度数。

观察Q=EET

考虑 Q 的第 i 行第 i 列的元素,也就是 E 的第 i 行和 ET 的第 i 列对应相乘后求和。而 ET 的第 i 列就等于 E 的第 i 行。那 E 的第 i 行与自身相乘答案是多少?答案就是第 i 行中有多少个非 0 的元素,就等于 i 的度数。

对于 Q 的第 i 行第 ji 列的元素,对应到 E 的第 i,j 行:当 i,j 之间没有边,E 的第 i,j 行的每一列都至少有一个 0;如果有边,则有一列贡献了 1

观察证毕。

FE 去掉第一行留下的矩阵,类似观察可以证得 M11=FFT

这两个矩阵都一样,行列式自然也一样。所以 det(M11)=det(FFT)

运用柯西-宾内(Cauchy-Binet)公式:det(M11)=det(FFT)=Sdet(FS)det(FST)

根据柯西宾内公式的定义,这里枚举的 S 应该是一个大小为 n11m 的子集。(F 是一个 (n1)×m 的矩阵)我们发现 S 其实在 F 中对应了一颗生成树。

同时注意 FST 的定义是:抽出 FTS 中的行,而 FT 的行就等于 F 的列,所以 det(FS)det(FST)=det(FS)2

所以 det(M11) 此时已经转到了 Sdet(FS)2,其中 S 是一个大小为 n1 的边集。

接下来我们要证明:det(FS)={±1S 是生成树0S 不是生成树 。显然有了这个结论就能推出矩阵树定理。

先证明 det(FS)=0S 不是生成树

由于 Sn1 大小的边集,而不是生成树。所以 S 肯定有一个环:p1,p2,,pk

取出这 k 列,我们发现它们线性相关。所以 det(FS)=0

再证明 det(FS)=±1S 是生成树。我们如果证明了,可以通过交换 FS 的两列使得 FS 是下三角矩阵且 S 的对角线全是 ±1,也就证明了这个命题。

(这里严格证明不会…… 咕一下)

总之,我们证明了矩阵树定理。


这里再回顾一下矩阵树定理的原本内容:矩阵树定理表明 det(M11) 等于 G 的生成树个数。

【矩阵树定理的拓展】

矩阵树定理的问题主要有两个方向:改造问题,变成生成树计数相关的问题;或者改造矩阵树定理的矩阵 Q

  1. 非简单图的矩阵树定理。

    在构造 Q 的时候,Qi,j|ij 不再等于 1,而是等于 (i,j 之间的边数)

    发现这个改动实际上只影响了对于 Q=EET 的证明,而 E 的第 i,j 行的乘积,还是等于 i,j 之间的边数

  2. 边带权的矩阵树定理。

    发现,矩阵树定理实际上是计算了 TeT1,其中 T 是一颗生成树。

    如果给每条边带上权,怎么做?也就是求 TeTwe

    回想我们矩阵树定理最重要的一步:det(FS)={±1S 是生成树0S 不是生成树 ,我们由此推出当 S 的生成树的时候,答案会贡献 1。具体的做法是证明可以构造一个等价的下三角矩阵。对角线的乘积为 ±1,进而 det(FS)2=1

    现在我们想要让生成树贡献 we,也就是让 det(FS)2=we,也就是 det(FS)=±we,也就是我们要构造一个下三角矩阵,对角线上都是 ±we

    我们知道了 E 怎么构造(注意这里不是 Q 的构造):对于第 i 条边 (ui,vi,wi),让第 i 列的第 ui,vi 行分别等于 ±wi

    但是我们要求的是 Q,要求的是 M11 啊?这里有两种办法:Q=EET,和 M11=FFT

【矩阵树定理的相关题目】

重建

题意:每条边有 pi 的概率是好的。求图中有且仅有一颗生成树上的边是好边的概率。n50

这里就相当于求 T(eTpe)(eT(1pe))

我们知道矩阵树定理可以求 TeTpe,但是后面那个怎么办?

eT(1pe)=eG(1pe)÷eT(1pe),显然前面那半截可以提出来。

所以 原式=eG(1pe)TeTpe1pe

we=pe1pe,就变成我们熟悉的形式了。

CF917D:有 k 条黑边的生成树

题意:给定一张图,每条边为黑白色。求恰好有 k 条黑边的生成树个数。n100

借助多项式的系数表示方案数。

考虑重新构造矩阵 E。(再复习一下,E 的第 i 列代表第 i 条边)

如果边 i 为黑边,令 E 的第 i 列的两个数为 xx;否则令它们为 ±1

可能这里会疑惑为什么一定要一正一负:这是为了保证当 S 不对应生成树的时候,det(FS)=0——因为我们要保证环对应的边能线性相关。

为什么要这样做?x 又代表什么?

首先,x 是一个形式参数。我们把它放在这里,是因为我们一会要通过多项式运算求方案数。

注意 (±x)2=x,所以 TeTwe=TxT 中黑边个数

于是只要我们求出 TeTwe 的结果(注意这个结果是一个多项式)。其中 xk 的系数就是 k 条黑边的方案数。

但是这还不够,因为在求 det(FFT) 的时候,需要做多项式的运算,每一次复杂度都是 O(nlogn) 的。太慢了。

我们其实只关心最后每一项的系数。而且因为生成树黑边数量显然 n1,所以最后的多项式最多 n1 次。所以可以使用拉格朗日插值公式,令 xn 个不同的值分别代入,可以求得最终多项式的系数。

posted @   FLY_lai  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示