【学习笔记】线性代数

线性空间

对于集合 \(V\),若存在对 \(V\) 封闭的加法运算 \(\oplus\)\(V\oplus V\to V\))和对 \(V\) 封闭的对于域 \(F\) 的数乘运算 \(\otimes\)\(a\otimes V\to V\)), 且加法与数乘满足以下 \(8\) 条性质,就称 \(V\) 为线性空间(\(\alpha,\beta,\gamma\in V,k,l\in F\)):

  • 加法交换律:\(\alpha\oplus\beta=\beta\oplus\alpha\)
  • 加法结合律:\((\alpha\oplus\beta)\oplus\gamma=\alpha\oplus(\beta\oplus\gamma)\)
  • \(V\) 中存在 \(0\) 元:存在 \(0\in V\) 使得 \(\alpha\oplus0=\alpha\)
  • \(V\) 中存在逆元:对于任意 \(\alpha\in V\) 都存在 \(\beta\in V\) 使得 \(\alpha\oplus\beta=0\)
  • 单位元:对于 \(F\) 中单位元 \(1\),有 \(1\alpha=\alpha\)
  • \((k+l)\alpha=k\alpha\oplus l\alpha\)
  • \((kl)\alpha=k(l\alpha)\)
  • \(k(\alpha\oplus\beta)=k\alpha\oplus k\beta\)

而验证一个线性空间的子空间 \(U\) 是否是线性空间则只需要验证两条:

  • 对加法封闭:\(\alpha,\beta\in U\)\(\alpha\oplus\beta\in U\)
  • 对数乘封闭:\(\alpha\in U,k\in F\)\(k\otimes\alpha\in U\)

此中的 \(\oplus\)\(\otimes\) 运算称为该封闭空间的线性变换。下面用普通的 \(+\)\(\times\) 符号代替。

线性基

明确几个定义:

  • 线性相关:称 \(a_1,a_2,\cdots,a_n\in V\)\(V\) 的一个向量组,对于 \(k_1,k_2,\cdots,k_n\in F\)\(\sum k_i a_i\) 为向量组 \(a_1,a_2,\cdots,a_n\) 的一个 线性组合。若向量 \(\beta\in V\) 可以表示为向量组 \(a_1,a_2,\cdots,a_n\) 的一个线性组合,则称 \(\beta\) 可以被向量组 \(a_1,a_2,\cdots,a_n\) 线性表出。若 \(\sum k_i a_i=0\) 等价于 \(\forall i\in[1,n],k_i=0\),则称向量组 \(a_1,a_2,\cdots,a_n\) 线性无关,否则称它们 线性相关。规定零向量与任意向量线性相关。
  • 线性基:线性空间的一个 极大线性无关组,意义是通过线性基中的元素可以表示出该个线性空间的所有元素。线性基不唯一。OI 中常见的线性基为异或线性基,这里也只会对异或线性基进行讨论,若无特殊说明,下面提到的线性基均为异或线性基。事实上构建线性基的思想是互通的,我们完全可以照搬异或线性基的构造方法去构造 向量线性基 等。

构建线性基

称线性基数组为 \(b\)

对原集合的每个数 \(x\) 转为二进制,从高位向低位扫,对于第 \(i\) 位是 \(1\) 的,若 \(b_i\) 不存在则令 \(b_i\leftarrow x\) 并结束插入,否则令 \(x\leftarrow x\text{ xor } a_i\)。正确性容易观察出。这样找到的基是原数列中的一组合法基。该线性基是一个上三角矩阵的形式,我们更加希望其朝对角矩阵的形式变化,于是我们可以从小往大利用第 \(i\) 维为 \(1\)\(b_i\) 将所有第 \(i\) 为为 \(1\)\(b_{j>i}\) 的第 \(i\) 维置 \(0\)。这样操作后称我们得到的线性基为最简基。我们可以观察出一个集合的线性基大小为 \(O(\log V)\)。以下无特殊说明线性基均指最简基。

同样地通过仿照插入操作我们可以判断一个数是否存在于线性空间中。查询异或最小值即查询线性基中的最小元素。

对于最简基,由于若 \(b_i\) 有值则基中只有 \(b_i\) 的第 \(i\) 维为 \(1\),所以最简基查询异或最大值就是查询最简基所有元素异或和。一组合法基寻找异或最大值则需要按位贪心,每次判断异或该数是否变大。

查询 \(k\) 的排名:将最简基中元素按照最高维排序,若 \(k\)\(p\) 位为 \(1\),最简基中 \(p\) 前面有 \(t\) 个位置有值,则必定存在 \(2^t\) 个异或值 \(<k\)。于是 \(k\) 的排名为 \(2^{t}+(k-\text{rnk}(b_p))\),也就是 \(\sum_{p\in k}2^p\)。同理我们基本可以仿照上述做法得到 \(k\)

没有特殊性质的合法基无法支持查询异或第 \(k\) 大。

前缀线性基

前缀线性基能够维护该前缀所有后缀的线性基,以达到查询区间线性基的效果,这里以查询区间异或最大值为例。注意到序列 \([1,i]\) 的后缀 \([j,i]\) 互相包含,即 \([j,i]\) 的线性基必定包含 \([j+1,i]\) 的线性基,于是利用这个单调性,我们可以对线性基中的元素维护一个最晚出现的时间,在插入时若存在值但时间先于自己则同样可以交换两个向量。由于需要维护出现时间,这里做最简基会破坏其时间戳的性质。

其实实际上就是每次尝试用更新的向量替换旧的向量,没有复杂度上的改变。

矩阵

定义

定义矩阵 \(A\) 的主对角线为 \(A_{i,i}\) 的元素。

定义单位矩阵 \(I\) 指主对角线为 \(1\) 其他元素为 \(0\) 的方阵,单位矩阵满足 \(A\times I=I\times A=A\)

定义零矩阵 \(0\) 指所有元素均为 \(0\) 的方阵,满足 \(0\times A=A\times 0=0\)

定义上三角矩阵指主对角线左下角元素全为 \(0\),下三角矩阵指主对角线右上角元素全为 \(0\) 的方阵。

定义矩阵乘法:当且仅当对于 \(n\)\(m\) 列矩阵 \(A\)\(m\)\(d\) 列矩阵 \(B\),存在 \(n\)\(d\) 列矩阵 \(C=A\times B\),且 \(C_{i,j}=\sum_{k=1}^n A_{i,k}\times B_{k,j}\)。直观上来讲就是把矩阵 \(A\) 的第 \(i\) 行和矩阵 \(B\) 的第 \(j\) 列乘起来再加起来得到 \(C_{i,j}\)。矩阵乘法不存在交换律,但存在结合律,证明:\(D=(A\times B)\times C\to D_{i,j}=\sum_{d=1}^n(\sum_{k=1}^n A_{i,k}\times B_{k,d})\times C_{d,j}=\sum_{k=1}^nA_{i,k}\times(\sum_{d=1}^n B_{k,d}\times C_{d,j})=A\times(B\times C)\)

定义对角矩阵 \(\text{diag}\{a_1,a_2,\cdots,a_n\}\) 为仅主对角线存在值的方阵。

定义倍乘矩阵 \(D_i(k)\) 为特殊的对角矩阵 \(\text{diag}\{1,1,\cdots,k\ne0,\cdots,1\}\)。容易发现倍乘矩阵乘上某个矩阵 \(A\) 相当于 \(k\) 倍缩放 \(A\) 的第 \(i\) 行。

定义置换矩阵 \(P_{i,j}(i\ne j)\) 为所有元素均为 \(0\)\(1\) 的矩阵,其中主对角线仅 \(i\)\(j\) 号元素为 \(0\),主对角线外仅 \((i,j),(j,i)\) 两个元素为 \(1\)。容易发现置换矩阵乘上某个矩阵 \(A\) 相当于交换 \(A\) 的第 \(i\)\(j\) 行。

定义倍加矩阵 \(T_{i,j}(k)(i\ne j)\) 为在单位矩阵 \(I\) 的基础上令 \((i,j)=k\) 的矩阵。容易发现倍加矩阵乘上某个矩阵 \(A\) 相当于将 \(A\) 的第 \(i\)\(k\) 倍加到第 \(j\) 行上。

而倍乘矩阵,置换矩阵,倍加矩阵统称为初等矩阵。事实上,这也是高斯消元中使用的变换形式。

广义矩阵乘法

也就是说对于有结合律和交换律的“加法” \(\oplus\) 运算以及有结合律的“乘法” \(\otimes\) 运算,若二者间具有分配率,则可以类似地定义矩阵乘法 \(C_{i,j}=\oplus_{k=1}^n A_{i,k}\otimes B_{k,j}\)。常见的如 \((\max,+)\) 矩阵乘法。如此定义的矩阵乘法同样具有结合律以及对矩阵加法(\(\oplus\) 运算下)的分配率。

高斯消元

很符合人类思维的消元思想,在实数高斯消元中注意取绝对值最大的位置最大限度避免精度误差。当且仅当系数矩阵的行列式不为 \(0\) 时方程有唯一解。

事实上,高斯消元可以理解成矩阵的形式,消元的过程可以看做我们在手动模拟其系数矩阵与初等矩阵的乘法。

高斯-约旦消元

并不是很高级的算法。朴素的高斯消元中会把系数矩阵消成上三角矩阵,而高斯-约旦消元中会把系数矩阵消成对角矩阵,事实上这两种消元方法的转化也是相当简单的。而高斯-约旦消元之后的对角矩阵通常具有更好的性质。

矩阵求逆

定义矩阵 \(A\) 的逆 \(A^{-1}\) 指满足 \(A^{-1}\times A=A\times A^{-1}=I\) 的矩阵。若一个矩阵有逆则其左右逆相等且唯一。

任取非零向量 \(y\),设有 \(x=A^{-1}y\),则有 \(y=Iy=AA^{-1}y=A(A^{-1}y)=Ax\),也即若 \(A\) 存在逆则 \(Ax=y\) 对于任意 \(y\) 均存在解,所以 \(|A|\ne0\)\(A\) 存在逆的充要条件。必要性显然,充分性是因为若 \(|A|\ne0\) 则我们一定可以通过某种方式得到 \(A^{-1}\)。事实上这也就是矩阵逆的求法。

考察一个 \(n\times 2n\) 的矩阵 \([A|I]\),即左半部分是 \(A\) 右半部分是 \(I\),发现其左乘任意 \(n\times n\) 的方阵左右两部分均不会互相干扰,于是会有 \(A^{-1}\times[A|I]=[I|A^{-1}]\)。而高斯消元本身可以表示成初等矩阵和系数矩阵的乘积,所以相当于我们对 \([A|I]\) 做高斯消元,最后右半部分得到的即为 \(A^{-1}\)

行列式

方阵 \(A\) 的行列式 \(|A|\) 或者 \(\det(A)\) 是一个固定的值 \(\sum_{p}(-1)^{\tau(p)}\prod_{i=1}^n A(i,p_i)\)。其中 \(p\)\(1\)\(n\) 的排列,\(\tau(p)\) 是该排列的逆序对数。

对于一个普通的方阵直接按照上式求行列式是很不明智的,于是对于行列式我们有以下性质:

  • 将矩阵第 \(i\) 行(列)乘以 \(k\),行列式乘以 \(k\)。证明直接使用定义,新矩阵行列式为 \(\sum_{p}(-1)^{\tau(p)}\prod A(1,p_1)A(2,p_2)\cdots kA(i,p_i)\cdots A(n,p_n)=k\sum_{p}(-1)^{\tau(p)}\prod_{i=1}^n A(i,p_i)\)
  • 交换矩阵的第 \(i\) 行和第 \(j\) 行(\(i\ne j\)),行列式取反。证明考虑交换一个排列的 \(p_i,p_j\)\(\tau(p)\) 奇偶性一定改变,而任意一个新的排列皆可以映射到原来的一个排列且这两个排列恰好交换了 \(p_i,p_j\) 项,于是每一个排列贡献的系数均会取反。
  • 方阵 \(A\) 存在第 \(i\) 行是第 \(j\)\(k\) 倍是矩阵行列式为 \(0\) 的充要条件。充分性证明:将第 \(i\) 行乘上 \(k\),交换第 \(i\) 行和第 \(j\) 行有 \(|A'|=-|A''|\),而由于第 \(i\) 行和第 \(j\) 行相同所以 \(|A'|=|A''|\),于是 \(|A'|=|A''|=0\),所以原方阵 \(|A|=0\)
  • 将方阵第 \(i\)\(k\) 倍加到第 \(j\) 行行列式不变。证明考虑拆式子,很好证。

于是我们可以用类似高斯消元的做法做 \(O(n^3)\)行列式求值。如果模数不是质数需要把倍加的部分用辗转相除替代,由于每个数最多被辗转相除 \(O(\log V)\) 次,所以复杂度是 \(O(n^3+n^2\log V)\) 的。

矩阵树定理

对于无向图 \(G\)\(A\) 表示 \(G\) 的邻接矩阵,即 \(A_{i,j}=\left\{\begin{matrix}0&(i=j)\\e_{i,j}&(i\ne j)\end{matrix}\right.\)\(e_{i,j}\) 表示 \(i,j\) 间的边权(生成树计数 中即为边的数量),令 \(D\) 表示 \(G\) 的度数矩阵,即 \(D_{i,j}=\left\{\begin{matrix}deg_i&(i=j)\\0&(i\ne j)\end{matrix}\right.\)。令 \(K=D-A\),则 \(K\) 的任意主子式(去掉第 \(i\)\(i\) 列)的行列式均相等且为 \(G\) 中所有生成树的边权之积之和(生成树计数中即为生成树个数)。这里的 \(K\) 也称 \(G\) 的 kirchkoff 矩阵。证明需要用到特征多项式。

对于有向图的情况:\(A\)\(K\) 的计算方法不变,\(D_{i,j}\) 依情况改为入度(叶向树)或出度(根向树)。

部分问题 询问的是对生成树边权求和,解法如下:将边权 \(w\) 的边的生成函数表示为 \(1+wx\),则 \(\sum_{i=1}^{n-1}w_{e_i}=[x^1]\prod(1+w_{e_i}x)\)。由于只需要一次项系数所以计算过程中只需要保留常数项及一次项系数即可。更加的加强版是对和的 \(k\) 次方求和。可以将指数生成函数 \(1+w_i+\cdots+\frac{w_i^k}{k!}\) 作为权值。

BEST 定理

实际上是 Matrix-Tree 定理的一个拓展。定理内容如下:对于有向欧拉图 \(G\)\(G\) 中边两两不同,设 \(c(G,v)\) 表示以 \(v\) 为顶点的根向树数量,则对于 \(\forall v\in[1,n]\),都有 \(c(G,v)\) 相等且 \(c(G,v)\times\prod(\operatorname{deg}(x)-1)\)\(G\) 的欧拉回路数量。

证明:

  • 有一个前提定理,一个欧拉图中选一棵根向生成树,除根外每个点以生成树上的边作为最后一条出边,其他的边无论怎么走都能构成一个欧拉回路。证明参考,不会证
  • 现在我们限定 \(1\) 为欧拉回路的起点。那么除了 \(1\) 其他节点贡献的方案数为 \(out_i-1\)。答案是 \(t^r(G,k)\prod_{i=2}^n(out_i-1)!\times out_1!\)。其中 \(k\) 取任意一个点都可以,可以通过欧拉回路性质证明欧拉图中任何一个点得到的根向生成树个数相同。
  • 然后把限定起点删掉,一条欧拉回路会以每个出现的 \(1\) 分为 \(out_1\) 段,在没有限定起点里面这 \(out_1\) 段的循环组合是一样的。所以答案需要除以 \(out_1\)。上面那个式子除以一个 \(out_1\) 就是定理式子。

限制起点 \(s\) 相当于每次访问起点都可能作为答案的开始,所以方案数要乘上 \(\operatorname{deg}(s)\)

BEST 定理计算的是边两两不同的情况,对于重边算作相同的情况,每条重边被重复算了 \(cnt!\) 次,\(cnt\) 是出现次数,所以乘上 \(\frac{1}{\prod cnt}\)

LGV 引理

定义 \(w(P)\) 表示路径 \(P\) 上的边的边权积。在做统计方案数问题时可以把边权设为 \(1\)\(e(x,y)\) 表示从 \(x\)\(y\) 的每一条路径 \(P\)\(w(P)\) 和,即 \(e(x,y)=\sum_{P:x\to y}w(P)\)。起点集合 \(A\),终点集合 \(B\),大小均为 \(n\)

记一组不相交路径集 \(S={S_1,S_2,\cdots,S_n}\),满足 \(S_i\) 表示从 \(A_i\)\(B_{\sigma(S)_i}\) 的一条路径且对于任意 \(i\ne j\)\(S_i\)\(S_j\) 无公共交点。\(\sigma(S)\) 表示 \(S\) 对应的一个 \(1\)\(n\) 的排列。\(\tau(\sigma)\) 表示排列 \(\sigma\) 的逆序对数。

记一组相交路径记为 \(C\),一组不相交路径记为 \(S\)。不作说明时 \(P\) 为任意一组路径,带下标时 \(P_i\) 表示 \(A_i\to B_{\sigma(P)_i}\) 这条路径。定义 \(W(P)=\prod_{i=1}^n w(P_i)\)

LGV 引理的内容是:令有一个矩阵 \(M=\begin{bmatrix}e(A_1,B_1)&e(A_1,B_2)&\cdots&e(A_1,B_n)\\e(A_2,B_1)&e(A_2,B_2)&\cdots&e(A_2,B_n)\\\vdots&\vdots&\ddots&\vdots\\e(A_n,B_1)&e(A_n,B_2)&\cdots&e(A_n,B_n)\end{bmatrix}\)。则有 \(\det(M)=\sum_{S:A\to B}(-1)^{\tau(\sigma(S))}\prod_{i=1}^n w(S_i)\)。其中 \(S:A\to B\)\(A\to B\) 的不相交路径集。人话就是 \(\det(M)\) 的值就是 \(A\to B\) 的所有不相交路径集的带符号和,其中符号指对于当前 \(S\)\(\tau(\sigma(S))\) 的奇偶性,也即 \((-1)^{\tau(\sigma(S))}\)

证明:

  • 根据行列式定义有 \(\det(M)=\sum_{\sigma}(-1)^{\tau(\sigma)}\prod_{i=1}^n e(A_i,B_{\sigma_i})=\sum{\sigma}(-1)^{\tau(\sigma)}\prod_{i=1}^n\sum_{P:A_i\to B_{\sigma_i}}w(P)\)
  • 求积那一坨实际上就是求所有 \(A\to B\) 排列为 \(\sigma\) 的路径集 \(P\)\(W(P)\)
  • \(\det(M)=\sum_{\sigma}(-1)^{\tau(\sigma)}\sum_{P=\sigma}W(P)=\sum_{P:A\to B}(-1)^{\tau(\sigma)}\prod_{i=1}^n w(P_i)=\sum_{C:A\to B}(-1)^{\tau(\sigma)}\prod_{i=1}^n w(C_i)+\sum_{S:A\to B}(-1)^{\tau(\sigma)}\prod_{i=1}^n w(S_i)\)

若引理成立则须有 \(\sum_{P^c:A\to B}(-1)^{\tau(\sigma)}\prod_{i=1}^n w(P^c_i)=0\),证明:

  • 若存在一个相交路径组 \(C\),则必然存在一个相交路径组 \(C'\) 满足 \(C\) 含有 \(A_i\to u\to B_i,A_j\to u\to B_j\)\(C'\) 含有 \(A_i\to u\to B_j,A_j\to u\to B_i\),然后其他路径都相等。那么有 \(W(C)=W(C')\)\(\tau(C)=\tau(C')\pm1\)\((-1)^{\tau(C)}=-(-1)^{\tau(C')}\)。于是得证。

这个式子不仅是最后的行列式有用,中途的 \(\sum_{S:A\to B}(-1)^{\tau(\sigma(S))}\prod w(S_i)\) 也很有用,你甚至可以拿这个东西 做 dp

裸 LGV 出现很少的原因是这种时候一般起点和终点是一一对应的,如果要求不交的话,直接套 LGV 就好了。但是如果不是一一对应的,你就没有办法通过调整终点顺序把那个 \(-1\) 的逆序对次方表示出来,导致你其实很难处理掉正负号。

还有一些比较神秘的 trick。如果你需要判断是否存在一组解,调用 LGV 引理可能会导致带符号和抵消。想到若无解则行列式一定为 \(0\),于是可以对于每条边随机赋非 \(0\) 值,很大概率不会出错。同时判断一个点集最多有多少解实际就是求随机后矩阵组成的秩,可以线性基解决。出错概率大约在 \(\frac{1}{V}\)\(V\) 是你对边赋权的值域。

拉格朗日插值

对于给定的 \(n+1\) 个平面直角坐标系的点 \((x_i,y_i)\),在 \(x_i\) 互不相同的情况下,我们可以确定唯一的 \(n\) 次函数(多项式?)\(f(x)\)。拉格朗日插值解决给定 \(k\),求 \(f(k)\) 的问题,使用前提是已经证明需要求的东西是一个 \(n\) 次多项式。

如果我们能用一个函数表示出来这 \(n+1\) 个点,因为此时函数唯一确定,这个函数就是我们的 \(f(x)\)。设拉格朗日基本多项式为 \(l_i(x)=\prod_{j=0,j\ne i}^n \frac{x-x_j}{x_i-x_j}\)。注意到对于 \(i\ne j\)\(l_i(x_j)=0\),并且有 \(l_i(x_i)=1\)。所以这个多项式就可以表示为 \(f(x)=\sum_{i=0}^n y_il_i(x)\)。然后我们把 \(k\) 代进去就行了。复杂度 \(O(n^2)\)

对于 \(x\) 连续的情况,比如 \(x:[0,n]\),我们可以在 \(O(n)\) 的复杂度内解决。具体地,将 \(x_i=i\) 代入上面的基本多项式可以得到 \(l(x)=\prod_{j=0,j\ne i}^n \frac{x-j}{i-j}\)。考虑根据 \(j\ne i\) 这个东西把这些点分为两份,分母显然就是阶乘乘阶乘,注意一下后面那个阶乘可能带符号就好。然后维护关于 \(x-i\) 的前后缀积 \(pr,sf\),那么分子就可以表示为 \(pr_{i-1}\times sf_{i+1}\)。所以这个复杂度就是 \(O(n)\) 的。

posted @ 2024-02-04 11:01  Wind_Leaves_ShaDow  阅读(79)  评论(0)    收藏  举报