线性代数相关学习笔记(upd 2025.9.21)
线性代数理论
参考资料:自为风月马前卒的文章
可以观看视频:线性代数的本质
向量
(物理学上)向量是空间中的箭头;
(信息学上)向量是一个数列,例如 $ \begin{bmatrix} 1 \ 2 \end{bmatrix} $。
向量的基本运算有向量加减和数乘,例如
和
特殊的向量有:\(\hat{i} ,\hat{j},\hat{k}\) ,这些是平面\空间直角坐标系的基向量。
线性组合,张成,线性相关,线性无关
形如 \(a\vec{u}+b\vec{v}\) 的式子叫做 \(\vec{u},\vec{v}\) 的线性组合。
所有可以被给定向量线性组合的向量集合,被称为给定向量张成的空间
当你有多个向量时:
-
当你可以移除其中一个并不减小这些向量张成空间的维度时,我们称它们是线性相关的。
-
当你移除任意一个向量都会使这些向量张成空间的维度减小时,我们称它们是线性无关的。
有些时候线性无关会被表示为 \(a\vec{u}+b\vec{v} \neq 0 (a,b\text{不全为}0)\)
矩阵、线性变换
线性的定义:
(非严格) 变换后所有直线都还是直线(保持网格线平行且等距分布)且原点不变。
(严格)若一个变换 \(L\) 具有如下性质:\(L(\vec{u})+L(\vec{v})=L(\vec{u}+\vec{v}),cL(\vec{u})=L(c\vec{u})\)(分别是可加性和一阶齐次),那么 \(L\) 是线性的。
矩阵的几何意义是线性变换。
矩阵乘法和复合变换
矩阵乘法的本质就是两个连续线性变换构成复合变换。
那么矩阵乘法具有结合律却不具有交换律就显而易见了。
行列式
线性变换改变面积的比例被称为这个变换的行列式
当 \(det(M) > 0\) 时,\(M\) 变换后空间定向改变。
当 \(det(M) < 0\) 时,\(M\) 变换后空间逆向改变(翻了一面)。
当 \(det(M) = 0\) 时,\(M\) 变换后空间被压缩至更低维度。
性质: \(det(MN)=det(M)det(N)\)
矩阵、逆矩阵和一次多元方程组
一次多元方程组一定可以被表示为: \(A\vec{x}=\vec{v}\) ,其中 \(A\) 是系数矩阵。
逆矩阵:若存在 \(A\) 满足 \(det(A) \neq 0\),那么我们称满足 \(A^{-1}A=I\) 的 \(A^{-1}\) 为 \(A\) 的逆矩阵。
秩、列空间和零空间
秩:变换后空间的维数。
当秩和矩阵列数相等时,我们称该矩阵是满秩的。
对于变换 \(A\),所有可能输出向量 \(A\vec{v}\) 构成的集合叫 \(A\) 的列空间。
对于变换 \(A\),变换后一些向量落在零向量上,这些向量构成的空间叫 \(A\) 的零空间。
点积
(代数上)对于两个同维向量,其点积为相同坐标乘积之和。
(几何上)一个向量在另一个向量所在直线的正交投影的长度和另一个向量长度的乘积。
这两者是可以互相转化的,理解通过对偶性,详见视频。
叉积
叉积是三维空间中两个向量的二元运算,记作 \(\vec{u} \times \vec{v}\)
对于 \(\vec{u} \times \vec{v} = \vec{w}\),\(\vec{w}\) 满足大小为 \(\det(\vec{v},\vec{u} \text{列构成的矩阵})\),方向垂直于 \(\vec{v},\vec{u}\) 且满足右手定则(可以让食指指向 \(\vec{u}\),中指指向 \(\vec{v}\) ,拇指指向 \(\vec{w}\))
特征向量和特征值
特征向量和特征值都是相对于一个变换 \(M\) 而言的。
如果一个向量 \(\vec{u}\) 在变换后仍处于它张成空间且方向不变,那么 \(\vec{u}\) 是 \(M\) 的特征向量。
对于一个特征向量 \(\vec{u}\) ,它在变换后的长度和变换前的长度之比叫它的特征值。
相关算法
高斯消元
参考资料:ShineEternal的文章
这里只讲高斯-约旦消元。
主要思想是:把系数矩阵 \(A\) 通过线性变换变换为一个对角矩阵。
具体操作:
-
找到第 \(1\) 列的元素最大的行,并把其和第 \(1\) 行交换;
-
把第 \(1\) 行第 \(1\) 列的元素通过线性变换变成 \(1\);
-
其他行通过减去若干倍的第 \(1\) 行使自己这一行的第 \(1\) 列的元素变为 \(0\);
-
依次对其他行重复操作;
特殊情况:
-
如果存在消元后左边系数为 \(0\) 而右边系数不为 \(0\) 情况(例如 \(0*x_i=y\)),那么该方程无解。
-
如果存在消元后左边系数为 \(0\) 而右边系数为 \(0\) 情况(例如 \(0*x_i=0\)),那么该方程有无穷解;但是在实际解题构造方案时,可以把当前行的解看作 \(x_i=0\) 来简化操作。
应用:
- 矩阵求逆:因为 \(A\) 通过高斯消元变成了 \(I\),等价于乘上 \(A^{-1}\)。那么我们只需要对 \(A\) 进行高斯消元,并在做线性变换时维护一个初始为 \(I\) 的矩阵 \(B\),对 \(B\) 进行相同的线性变换,最后得到的 \(B\) 就是 \(A^{-1}\)。
例题:
线性基
参考资料:Troverld的文章 Marser的题解
我们先来学异或线性基。
线性基是一个序列生成的集合,并且满足如下性质:
-
线性基中选出若干(非零)数的异或值所构成的集合,等于原序列中选出若干(非零)数的异或值所构成的集合;
-
线性基是满足性质 \(1\) 的最小集合;
-
原序列中的任何数都可以由线性基中的若干数异或得到;
-
线性基中不存在一组数,使得它们的异或和为 \(0\)(反证法:如果存在这么一组数 \(a_1,a_2,...,a_n\),使得 \(a_1 \oplus a_2 \oplus a_3 ... \oplus a_n=0\),那么一定存在 \(a_1 = a_2 \oplus a_3 ... \oplus a_n\),那么 \(a_1\) 是没有用的,可以删去);
-
线性基中不存在两组数,使得它们的异或和相等(证明类似);
实现:
维护一个 \(d\) 数组,\(d_i\) 满足 \(d_i\) 的二进制表示中,第 \(i\) 位是 \(1\),第 \(i+1\) 位及之后都是 \(0\);
插入操作:核心思想是 尽量把 \(x\) 通过与 \(d_i\) 异或变成 \(0\),因此我们只需要从高位到低位判断 \(x\) 当前位是否为 \(1\),如果不是,就往低位判断;如果是,那么如果 \(d_i\) 存在,那么 \(x \leftarrow x \oplus d_i\),并向低位判断;否则就 \(d_i \leftarrow x\);
时间复杂度:\(O(n \log V)\),\(n\) 是数组长度,\(V\) 是值域大小。
支持询问:
-
最小异或和:因为线性基中不存在两个二进制最高位相同的数,因此答案就是线性基中最小数
-
最大异或和:考虑从高位到低位遍历线性基,考虑到第 \(i\) 时,如果当前位为 \(1\),那么向低位遍历;否则就异或 \(d_i\) ,因为这么做不会使答案更劣。
-
第 \(k\) 小异或和:考虑简化 \(d_i\) 的贡献,如果 \(d_i\) 的 \(j(j <i)\) 位为 \(1\) 且 \(d_j\) 存在,那么 \(d_i\) 的第 \(j\) 位的贡献一定也可以被 \(d_j\) 处理,那么可以 \(d_i \leftarrow d_i \oplus d_j\) ,这么操作是可以在原线性基上做的,因为异或操作是可抵消的,上述操作可以在 \(O(\log^2n)\) 的时间内处理。处理询问时,先进行因此简化,在对 \(k\) 进行二进制拆分:如果 \(k\) 的第 \(i\) 位是 \(1\),那么就 \(ans \leftarrow ans \oplus d_j\),其中 \(d_j\) 是 \(d\) 数组从后往前第 \(i\) 个有值的数。
对于更加一般的线性基(向量线性基),我们通常用一个数组表示一个向量,然后模拟上述过程(你可以理解为在异或线性基里,我们数字的每一位代表了向量的一维,只不过我们现在单独把每一维存下来)。然后之前的异或操作变成通过线性变换把某一维的数值变成 \(0\)。
扩展:时间戳线性基
在插入 \(x\) 并枚举位数时,若 \(x\) 的第 \(i\) 位上为 \(1\) 且 \(d_i\) 存在,那么就比较 \(x\) 和 \(d_i\) 被插入的时间,如果 \(x\) 被插入得更晚,那么就交换 \(x\) 和 \(d_i\) ,异或后继续向下枚举。这样可以保证每一个 \(d_i\) 都是当前时间戳最大的。
常用来处理需要使用一段区间内元素构成的线性基的问题。
LGV 引理
参考资料:pengyule的文章 歌吟入梦的题解
现在前面:LGV 引理的目的是把 DAG 上不交路径数转化为一个矩阵的行列式值,因此我们只需要构造矩阵、求行列式的值就好,行列式的意义理解就行,证明选择性理解。
主要内容:
在一个 DAG 上,有一个大小为 \(n\) 的起点集合 \(A\),和一个大小为 \(n\) 的终点集合 \(B\) 。令 \(w(P)\) 表示这条路径 \(P\) 上的边权的乘积(一般地,在计数问题中,我们通常认为边权是 \(1\)),\(e(u,v)\) 表示 \(u\) 到 \(v\) 每一条路径的 \(w(P)\) 之和。
我们认为一组 \(A\) 到 \(B\) 的不相交路径集合 \(S\) 为对于其中任意两条路径 \(S_i\) 和 \(S_j\),它们没有公共端点,并且每一条路径恰好连接 \(A\) 中的一个起点和 \(B\) 中的一个终点,且每一个起点和终点都恰好有一条路径连接。容易证明 \(S\) 的大小一定为 \(n\),其中每一条路径连接 \(A_i\) 和 \(B_{p_i}\),\(p\) 为 \(1\) 到 \(n\) 的排列,设 \(\pi(p)\) 为 \(p\) 中逆序对个数,那么存在:
重要的的事再重复一遍:为了更好的理解 LGV 引理,请从下往上读这个式子。
证明:(摘自 这篇题解)
考虑经典容斥,枚举哪些人的路径相交了。
相交的路径可以转化为,在相交点将两个人之后的路径取反,最终是第一个人走到第二个人的终点去了,第二个人走到第一个人的终点去了。
进一步观察可以发现,容斥的系数就是逆序对的奇偶性,这和行列式的定义完全一样。
我们可以求出每个起点到每个终点的方案数,组成一个矩阵,求出来行列式就是答案。
求出每个点到每个点的方案数,使用经典容斥的方法。
例题:
然后我们来介绍一下 LGV 引理 pro 版:
还是那个式子。但是有时候我们对于一组 \(A\) 和 \(B\) 我们不一定有一个大小为 \(n\) 的不相交路径集合 \(S\)。但是我们希望知道 \(S\) 的大小最大可以是多少,于是就需要下面这个事实:
一组 \(A\) 到 \(B\) 的不相交路径集合 \(S\) 的大小的最大值为 \(M\) 的秩的最大值。
那么我们怎么找到 \(M\) 的秩的最大值呢?我们要回想“秩”是什么?就是线性无关的向量个数,那么怎么维护线性无关的向量个数的最大值呢?那就是线性基!
这方面的例题有: