线性代数入门

先入个门,后面再补。

几乎没有证明,全靠感性理解。

0 行列式相关

主要是性质的归纳。

0.1 定义

对于 \(n\) 阶方阵 \(A\),有 \(\det A=\sum\limits_{p}(-1)^{\sigma(p)}\prod\limits_{i=1}^nA_{i,p_i}\),其中 \(p\) 取遍全排列,\(\sigma(p)\) 是逆序对数。

\(A\) 的行列式还可记为 \(|A|\)

0.2 性质

I. 交换矩阵的两行,行列式的值变为相反数。

排列中交换两个数后逆序对数的奇偶性改变,相当于给原式每一项乘上了 \(-1\)

II. 矩阵某一行乘上常数,行列式乘上相同常数。

行列式中每一项都会在修改的那一行选出一个数,每一项也有且仅有那个数被更改,因此所有项都被乘上相同常数。

III. 矩阵某一行加上另一行的倍数,行列式不变

假设操作让 \(A_p\) 加上 \(kA_q\) 得到 \(C\)。令 \(B\) 满足 \(B_p=kA_q\)\(B_i=A_i(i\not=p)\)。有 \(|A|+|B|=|C|\)\(|B|=0\),因此 \(|A|=|C|\)

IV. 上三角矩阵的行列式等于主对角线所有值的乘积。

对于行列式中的一项,如果在主对角线上面取了一个数,一定会在下面取一个 \(0\)。另一种理解方式是,要使取到的 \(A_{n,p_n}\not=0\),必有 \(p_n=n\);要使 \(A_{n-1,p_{n-1}}\not=0\),由于 \(p_n=n\) 已选,必有 \(p_{n-1}=n-1\);以此类推唯一的选择是 \(p_i=i\),也即主对角线。

V. 矩阵满秩与行列式非 0 是充要条件。

由 III. IV. 易得。也即高斯消元之后的主对角线若满秩一定全部非零,否则一定不存在 0。反之亦然。

0.3 积和式

定义积和式 \(\operatorname{perm}(A)=\sum\limits_{p}\prod\limits_{i=1}^nA_{i,p_i}\)。它与行列式的最大区别在于行列式实际上是带符号和。

因为求积和式是 NP 的,所以通常用一些手段转变为求行列式。

0.4 余子式 & Laplace 展开

定义 \(k\) 阶余子式\(n\) 阶方阵删去 \(n-k\)\(n-k\) 列后所剩的 \(k\) 阶方阵。另一个说法是在原方阵中取 \(k\) 行与 \(k\) 列的交集,这两个定义是一样的。

\(A\) 去除第 \(i\) 行第 \(j\) 列所得余子式为 \(M_{i,j}\),称 \((-1)^{i+j}M_{i,j}\) 为其代数余子式

容易发现,行列式的值等于任意行(或列)的代数余子式与其对应元素的乘积之和。即 \(\det A=\sum\limits_{j=1}^n (-1)^{i+j}a_{i,j}M_{i,j}\)

该展开方式称拉普拉斯展开

0.5 Cauchy-Binet 公式

对于 \(m\times n\) 矩阵 \(A\)\(n\times m\) 矩阵 \(B\),有:

\(\det(AB)=\left \{ \begin{array}{rr} 0, m>n\\ \sum\limits_{S\in\binom{n}{m}}det(A_{[m],S})\cdot\det(B_{S,[m]}), m\leq n\end{array} \right.\)

\(S\) 表示 \(n\)\(m\) 子集,也就是从 \(A,B\) 中选出相对应的行和列组成两个 \(m\) 阶方阵 \(A_{[m],S}\)\(B_{S,[m]}\)

0.6 例题

I. Yet Another Linear Algebra Problem

选出的向量构成基就是组成的向量组满秩。满秩等价于行列式非零。

对于问题一:在模 \(3\) 意义下非零只有 \(1\)\(2\) 两种取值,而它们的平方在模 \(3\) 意义下都是 \(1\)。也就是说只需要计算所有 \(m\) 阶子方阵的行列式平方和。考虑 Cauchy-Binet,答案也就是 \(\det(A A^T)\)

对于问题二:在模 \(2\) 意义下需要求所有合法的子行列式之和。从每种颜色中选等价于每种颜色出现恰好一次。用 01 矩阵刻画颜色,然后 Cauchy-Binet 做。具体地,构造 01 矩阵 \(C\),令 \(C_{i,j}\) 为 1 表示颜色 \(i\) 包含向量 \(j\)。这样做矩阵乘法的时候就会让非法的位置变成零从而整个行列式为零。答案即 \(\det(AC)\)

1 高斯消元相关

1.1 模意义下消元

如果模数是质数,可以直接求逆元,且不影响复杂度。问题在于模数是合数。乘法逆元本质上是将除法转变为乘法做,换句话说,在模意义下只能做加(减)和数乘的线性变换。

假如当前想用 \(a_r\)\(a_i\),使得 \(a_{i,c}=0\),考虑将 \(t=\dfrac{a_{i,c}}{a_{r,c}}\) 分离成整数部分 \(p\) 和小数部分 \(q\)。对于 \(p\) 的一部分是可以直接在模意义下消的。此时若 \(a_{i,c}\not=0\),有 \(a_{i,c}=qa_{r,c}<a_{r,c}\),可以考虑交换 \(a_r,a_i\),使得 \(a_{i,c}>a_{r,c}\),这样就可以继续做上面的整除过程。

总结一下,对于模数为合数的情况,不能利用逆元处理除法,但是可以用类似辗转相除的方法。令模数为 \(p\),复杂度看似是 \(O(n^3\log p)\),但是由于每次做减法都会使其中至少一个数减半,而方阵一共有 \(n^2\) 个数,其实是 \(O(n^3+n^2\log p)\)。而 \(n\) 一般大于 \(\log p\),所以整体上不会有大的变化。

while (A[i][c] && A[r][c]) {
	if (A[i][c] < A[r][c]) for (int j = 0; j < N; ++j) swap(A[i][j], A[r][j]); 
	int t = A[i][c] / A[r][c];
	for (int j = 0; j < N; ++j) (A[i][j] += mod - (LL)A[r][j] * t % mod) %= mod;
}

1.2 Band-Matrix

1.2.1 简介

对于一类特殊的带状矩阵,可以将消元过程优化。

对于宽度为 \(d\) 的带状矩阵,其中每一个非零的元素 \(a_{i,j}\) 满足它上下左右 \(d\) 个元素外为 \(0\)。一般来说每行或每列会有连续的长度为 \(d\) 的非零段。可以用下面的方法优化消元过程至 \(O(nd^2)\)

在一些转移带环的 DP 里面常见。

1.2.2 流程

假如当前要用 \(a_r\) 消第 \(c\) 列。有效的数字只在 \(a_{r+1}\)\(a_{r+d-1}\) 出现。所以消元的时候往下面 \(d\) 行消,同时每行最多消 \(d\) 个元素,时间复杂度 \(O(nd^2)\)

需要注意的是如果是增广矩阵要消最后一列的系数,不影响复杂度。

1.2.3 例题
I. CF24D

典中典。考虑期望 DP,倒推定义 \(dp_{i,j}\) 表示从 \(i,j\) 走到最后一行的期望,每个格子分别讨论向三个方向走。

由于转移式带环互相依赖,考虑高斯消元。第 \(i\) 行只和 \(i+1\) 行相关,所以对每一行单独消元。直接做是 \(O(nm^3)\) 的。

发现满足带状矩阵性质,可以优化成 \(O(nm)\)

II. [BJOI2018] 治疗之雨

值得一提的是这是图上期望 DP 的典例,不一定是显性图但是思路都是差不多的。

1.3 应用:矩阵求逆

1.3.1 简介

如果 \(n\) 阶方阵 \(B\) 对方阵 \(A\) 满足 \(A\cdot B=I_n\)(其中 \(I_n\) 表示 \(n\) 阶单位矩阵),称 \(B\)\(A\) 的逆矩阵,记为 \(A^{-1}\)

有时会和多项式相关结合使用。

1.3.2 流程

\(A\) 的右边拼接一个单位矩阵 \(I\) 形成 \([A|I]\),然后跑高斯约旦消元,化为 \([I|B]\) 的形式,此时 \(B=A^{-1}\)

注意到初始时右边的单位矩阵所做的其实是记录消元的过程。\(A\)\(I\)\(I\)\(A^{-1}\) 经过的线性变换是一样的。结果上可以看成是对两边都乘上了 \(A^{-1}\),这样 \(A\) 就变成了 \(I\)\(I\) 就变成了 \(A^{-1}\)

1.4 应用:求行列式

由行列式的性质可以直接消元消成上三角矩阵,然后把对角线乘起来就可以了。需要注意交换两行行列式会变号。

2 线性基入门

2.1 简介

对于线性空间 \(V\),一个极大线性无关向量组 \(S\) 能张成 \(V\),则 \(S\)\(V\) 的一组 Hamel 基或线性基

如果 \(S\) 中的元素两两正交,也即 \(\forall a,b\in S\),若 \(a\not=b\),则 \(a\cdot b=0\),称 \(S\) 是一组正交基。

OI 中一般使用实数线性基、异或线性基较多,还有在模域下的线性基。

2.2 实现

对于一个向量组,要维护它所张成的向量空间 \(V\) 的基,也即维护极大向量组来表示原向量组。

为使用方便,维护一个向量组 \(P\),其中 \(P_i\) 表示最高位为 \(i\) 的基。

2.2.1 贪心法构造

假如现在往线性基中插入一个向量 \(X\),从高位到低位扫。对于第 \(i\) 维,如果 \(X_i\) 为零,直接跳过;否则:

  • \(P_i\) 不存在,令 \(P_i=X\),结束算法;

  • \(P_i\) 存在,用 \(P_i\)\(X\) 使得 \(X_i=0\),继续看下一位。也即让 \(X\) 带上 \(P_i\) 的影响,同时排除 \(X\) 对第 \(i\) 维的影响。

2.2.2 高斯消元构造

将原向量组堆叠成矩阵跑高斯消元,得到的矩阵的非零行也就组成了基。

高斯约旦消元构造出来的基有一个行最简的性质,在存在最高位为 \(i\) 的基向量的情况下,其它基向量一定没有 \(i\) 这一维。

2.3 应用

2.3.1 矩阵求秩

矩阵的秩也即其行或列最大线性无关项的个数。根据线性基的定义,矩阵中所有行(或列)向量的线性基大小(非零基向量个数)。

2.3.2 判断向量能否被表示

对于向量 \(X\),问某一向量组能否表示 \(X\),即其张成的线性空间是否包含 \(X\)。对向量组求线性基,再插入 \(X\)。如果插入失败,说明 \(X\) 可以被基中的向量表示,否则不行。

2.3.3 求异或第 k 大

对于贪心法构造的线性基,最常用的是求最大异或和,从高到低位做贪心即可。

对于高斯约旦消元构造的线性基,由于其行最简的性质,对于 \(n\) 维空间可以将基向量的选择与不选看成是二进制的 01 表示,第 \(k\) 大也就是对应二进制表示的组合。可以根据不同的情况将 \(k\) 映射到 \([0,2^n)\) 上。

2.3.4 线性基合并

线性基求并,把一个线性基的元素全部插到另一个里面即可。

2.3.5 线性基求交

用得不多。具体可见 一个正交基做法。后面找机会补一下。

求正交线性基可以化成行最简形式后从低到高考虑构造。

2.4 可删除线性基

2.4.1 带时间戳的离线做法

直接套线段树分治会有一个 \(O(\log n)\) 的代价。

考虑对每个基向量同时维护一个时间戳表示该向量应该删除的时间。插入的时候如果当前插入向量删除时间更晚就把删除时间早的那个换出来继续插入。

查询的时候直接忽略时间戳非法的基向量就可以了。

本质上不是删除。

2.4.2 在线做法

动态线性基。后面找机会补一下。

2.5 例题

在后面的 LGV 引理中也有所涉及。

I. P 哥的桶

单点插入,区间最大异或和,考虑线段树上每一个结点维护对应区间的线性基。时间复杂度 \(O(n\log n\log^2 V)\)

II. [Ynoi2013] 无力回天 NOI2017

区间异或,区间最大异或和。区间异或很难做,差分转化成单点异或。令原数组为 \(a\),差分数组为 \(d\)。由于是异或,\(d_{l+1}\)\(d_r\)\(a_l\) 的并的空间与 \(a_l\)\(a_r\) 是相同的。数据结构维护即可。

3 Schwartz–Zippel引理

3.1 简介

对于一个在有限域 \(F\) 内的 \(n\) 次多项式 \(f(x_1,x_2,\cdots,x_m)\),给其中的每个元 \(x_1\)\(x_m\) 在域内随机赋值,\(f\)\(0\) 的概率为 \(\dfrac{n}{|F|}\)

OI 中常见的应用在于对判定性问题使用随机赋值的 trick。一个例子是对于一个积和式值的零判定,可以通过对行列式随机赋值变成行列式的零判定来降低复杂度。

3.2 应用

对于一个 \(n\) 阶 01 方阵,将其中的 \(1\) 随机赋值为一个域内非零数,有行列式为 0 但积和式不为 0 的概率为 \(\dfrac{n}{|F|}\)。这样可以把 NP 的求积和式转变为 P 的求行列式。代价是只能判定不能求值,但是会有特例。

4 LGV 引理

4.1 简介

适用于 DAG。对于一条简单路径 \(P\),令 \(w(P)=\prod\limits_{e\in P}w(e)\),就是路径上的边权积。定义 \(e(u,v)=\sum\limits_{P:u\rightarrow v}w(P)\),就是 \(u\)\(v\)所有路径边权积之和

对于一个 \(|V|=m\) 的 DAG,从中取起点集合 \(S\) 与终点集合 \(T\) 满足 \(|S|=|T|=n\leq m\),构造 \(n\) 阶方阵 \(M\) 满足 \(M_{i,j}=e(S_i,T_j)\),LGV 引理有:

\(det(M)=\sum\limits_{(P_1,P_2,\cdots,P_n):S\rightarrow T}(-1)^{\sigma(p)}\prod\limits_{i=1}^n w(P_i)\)。其中 \(P_i\) 是一条从 \(S_i\)\(T_{p_i}\) 的路径,这些路径互不相交;\(p\) 是排列。也就是说,\(M\) 的行列式等于从 \(S\)\(T\) 选出 \(n\)点不相交的路径,所有方案的边权积的带符号和

4.2 应用

4.2.1 不相交路径计数

对于路径计数问题,可以将边权全部设为 \(1\),这样边权积就表示一种方案。

4.2.2 结合生成函数

由生成函数对乘法的性质,可以用生成函数作边权算一些数列求值问题。

4.3 例题

I. [NOI2021] 路径交点

分层图上路径交点就意味着排列的逆序对。然后发现偶减奇就是带符号和的形态,于是变成了板子。

II. Fiolki 2

也就是统计对于每个 \([l,r]\)\([1,k]\) 到达这些点最多有几条点不相交路径数。计数问题将边权设为 \(1\),然后对每个点维护一个向量表示 \([1,k]\) 到这个点的方案数(边权积之和)。

要注意的是边权积之和是积和式所刻画的,而 LGV 引理中的行列式刻画的是带符号和。所以可以对 \(1\) 权边随机赋值,根据 Schwartz–Zippel 引理将积和式转化为行列式。

\([l,r]\) 的向量堆叠起来,\(f(l,r)\) 就是最大的 \(x\) 使得从中选出 \(x\)\(x\) 列的行列式非零。这等价于 \(x\) 阶方阵满秩,因此 \(f(l,r)\) 等价于原向量组堆叠形成的矩阵的秩。求秩可以用线性基维护。

\(f(l,*)\) 是单调的,可以用双指针做统计。线性基需要支持删除。

III. C

题目大意:给出一个带权二分图,左右部点个数均为 \(n\),对每个 \(k \in[0,128)\) 问是否存在一个完美匹配使得匹配的边权按位与(and)为 \(k\)

先考虑完美匹配的条件。对于 LGV 就是在二分图这种特殊情形下的点不相交路径为 \(n\)。也就是行列式非零。等价于矩阵满秩。

对于按位与的条件,一个简单的思路是保存所有边权包含 \(k\) 的边(也即 \(w(e) \operatorname{and} k=k\)),然后判断矩阵是否满秩。

但是这样做会有一个问题,就是按位与的结果可能并不是 \(k\) 而包含 \(k\),因为选出来的边可能都包含二进制的一位而 \(k\) 不包含。考虑用容斥解决这个问题。由于用随机赋值解决积和式的问题,求出的不是方案数。但是回归定义,我们求的是边权积之和,行列式代表的是所有方案的边权积的带符号和。因此直接做容斥是可以做到判定的。因为一个 \(k\) 如果没有方案,那所有包含 \(k\)\(i\) 的方案的边权积的带符号和一定与用上面的方法求出来的 \(k\) 对应的行列式相同,因为对应的方案相同。所以容斥之后的行列式是否非零就是判定的结果。

IV. [SNCPC2024] 最大流

容量为 1 的最大流就是边不相交最大路径数。假 \(1\) 号点有 \(k\) 条入边,就保证了起点集合。然后把边看成点,让一个点的入边向这个点的所有出边非显式连边,转化为点不相交。这样问题变成了从起点集合到每个点的入边集合的最大点不相交路径数。

套用 Fiokli 2 的套路,先随机赋值,对每条边维护一个向量表示从起点集合到该边的边权积之和。然后把每个点入边的向量堆叠求秩即可。

可以按拓扑序转移。问题在于每条入边都要和每条出边转移,如果存在一个点入度出度都很大时间无法承受。注意到对于一条出边,本质上是所有入边的随机线性组合产生了转移。这样可以用线性基维护每个点入边的基来线性组合。入边矩阵的秩不会超过 \(k\),等价于线性基的大小不会超过 \(k\)。可以做到 \(O((n+m)k^2)\) 的时间复杂度。

5 矩阵树定理

目前只有无向图的内容。其实有向图差不多,但是没怎么见过就先搁着了。所以没有说明默认是无向图。

5.1 简介

对于无向图,令其度数矩阵为 \(D\),邻接矩阵为 \(G\),基尔霍夫矩阵 \(L=D-G\)。有结论:\(L\) 删去第 \(i\) 行第 \(i\) 列所得的矩阵行列式等于该图的生成树个数

通过改变 \(D\)\(G\) 的实际意义可以得知生成树边权积之和等其它生成树相关信息。有些时候从 \(L\) 与关联矩阵的角度去构造会更清晰,因此有必要了解证明并掌握。

5.2 关联矩阵

5.2.1 定义

定义关联矩阵 \(M\)\(n\times m\) 的矩阵(其中 \(n\) 是点数 \(m\) 是边数):若第 \(i\) 条边连接 \((u,v)\),则 \(M_{u,i}=1,M_{v,i}=-1\),其余情况为 \(0\)。无向图可以任意定向。

定义基本关联矩阵 \(M'\)\(M\) 删去一行所得的矩阵。因为 \(M\) 每一列的和都为 \(0\),所以知道任意一个 \(M'\) 就知道了 \(M\)

5.2.2 性质

I. \(\operatorname{rank}(M)=n-u\),其中 \(u\) 是连通块个数。证明可以先证对无向连通图 \(\operatorname{rank}(M)=n-1\),然后推广到不连通的情况。

II. 若 \(A\)\(M'\)\(n-1\) 阶子式,\(|A|\not=0\) 是选出的这 \(n-1\) 条边构成生成树的充要条件。结合 IV. 可以证明矩阵树定理。

III. 若 \(A\)\(M'\)\(n-1\) 阶子式,\(|det(A)|\leq 1\)

IV. \(M\times M^T=L\)。根据定义是显然的。这启发我们在计算生成树上权值时可以根据原运算与乘法的关系构造矩阵 \(L\)

5.3 容斥

考虑先从图中忽略一个点 \(rt\) 作为根,但是与之相连的边保留。为每个点指定父亲 \(p_i\),如果 \(p_i=i\) 表示任选。

计算生成树需要排除有环的情况,考虑容斥,枚举环的数量。有 \(\sum_i (-1)^i \times \sum_{G'} \prod_{j\notin V(G')}D_{j,j}\)。其中 \(G'\) 是一个由 \(i\) 个环构成的子图,\(V(G')\) 是其中的点集,也就是上面钦定 \(p_i\not=i\) 的点。

考虑 \(L\) 删掉第 \(rt\) 行第 \(rt\) 列后行列式中枚举的排列 \(p\),容易发现 \(n-1\) 全排列 \(p\) 覆盖了所有情况,对于一个 \(p\) 的置换环,对应的是图上的环或者点。可以写出等价的容斥式:\(\sum_p (-1)^{\sigma(p)} \prod\limits_{i=1}^n con(i)\)。其中 \(con(i)\) 表示该情况下 \(i\) 的贡献。

在矩阵 \(L\) 上,对于 \(i\not=p_i\) 的点,\(con(i)=-G_{i,p_i}\);对于 \(i=p_i\) 的点,\(con(i)=D_{i,i}\)

感性理解,对于 \(G_{i,p_i}\) 有零的上下两个式子的贡献都是 \(0\),不影响;否则系数会受到 \(G\) 的影响,下面那个式子 \(-1\) 的指数是 \(n\) 减去孤立点的个数,这与环的个数(上面那个式子的容斥系数)的奇偶性是等价的。而 \(D\) 的影响一定是相同的。

最后把上面的东西收束一下,可以证明等价。

5.4 应用&例题

I. [JSOI2010] 巨额奖金 最小生成树计数

假设现在有了一个 \(T\) 是 MST。考虑如何改变它的边变成另一棵 MST。删减的边一定权值集合相同,否则与 MST 的定义相违背,反证是简单的。

于是只用考虑边权相等的边的贡献。类比 Kruskal 的过程,从小到大加入边权相等的边,对这些边和之前的连通块组成的图进行生成树计数,这样就只考虑了这些边权相同的边的贡献。之后对连通块缩点继续加入更大的权值的边。最后乘法原理乘起来就可以了。

II. [SDOI2014] 重建 生成树边权积求和

对于一棵生成树,它形成的概率是树边的边权积再乘上其它边不能通行的概率积。可以先假定所有边不可通行记录 \(\prod\limits_{i=1}^m 1-p_i\),再将边权改为 \(\dfrac{p_i}{1-p_i}\),就变成了生成树边权积求和。

此时将关联矩阵 \(M\) 上的 \(1\)\(-1\) 分别改为 \(\sqrt {p_i}\)\(-\sqrt {p_i}\),对应在 \(L\) 中就是 \(L_{i,i}=\sum_e p_e\),其中 \(e\) 是连接 \(i\) 的一条边;\(L_{i,j}=-p_{e_{(i,j)}}(i\not=j)\)。这样做结合上面的证明是对的。

值得一提的是这意味着矩阵树定理可以求生成树上的边权积之和,生成树计数就是边权为 \(1\) 的特殊情况。而广义的支持乘法的元素例如矩阵和多项式等也可以作为边权。

III. [省选联考 2020 A 卷] 作业题 生成树边权和求和

值域不大,首先枚举 \(\gcd\),设为 \(d\)。一个简单的做法是保留所有满足 \(d|w_e\) 的边,求生成树边权和之和。

有了 重建 的启发,尝试用乘法刻画边权和。考虑一条边的贡献,等于边权乘上包含这条边的生成树数,也就是其他边的边权为 \(1\),该边保留边权的生成树边权积之和。

为了对所有边一同求出答案,可以用一个二元组 \((x,y)\) 刻画,其中 \(x\) 表示生成树计数器,\(y\) 是边权和计数器。每条边的边权是 \((1,w_e)\)。这样只要对这个二元组的运算法则做出合理定义就可以刻画全局的答案。

加减法是直接对应相减。乘法对于 \(x\),像生成树计数那样定义为普通的乘法;对于 \(y\),根据上面的分析采取 \((\times,+)\) 的形式,即:\((a,b)\times(c,d)=(ac, ad+bc)\)。注意这和复数的乘法是不一样的。相当于是两个一元一次式相乘后舍弃二次项(二次项的实际含义是选两条边的边权相乘),\(x\) 代表常数,\(y\) 代表一次项系数,这样应该更好理解了。另外因为求行列式还需要除法,是乘法的逆运算直接推就可以了。

最后要注意求出的答案因为是钦定了 \(\gcd\),实际上有些生成树的 \(\gcd(T)\) 并不是枚举的 \(d\),而是 \(d|\gcd(T)\),这个形式可以直接容斥(欧拉反演)。

posted @ 2025-07-10 20:31  _Communist  阅读(30)  评论(0)    收藏  举报