2019暑期金华集训 Day2 线性代数
自闭集训 Day2
线性代数
高斯消元
做实数时,需要找绝对值最大的作为主元,以获取更高精度。
在欧几里得环(简单例子是模合数)意义下也是对的。比如模合数意义下可以使用辗转相除法消元。
欧几里得环:对于任意\(a,b\),都可以定义\(a=qb+r\ \ (|r|<b)\),于是可以辗转相除。(显然,多项式环也是欧几里得环)
逆矩阵
方法与高斯消元类似,左边摆一个原矩阵,右边摆一个单位矩阵,高斯消元的过程中左边的行操作都在右边同样做一遍。最后左边剩下一个单位矩阵,右边就是逆矩阵。
对于方程\(Ax=b\),如果\(A\)存在逆矩阵,那么\(x=A^{-1}b\)。对于有多个\(b\)询问的时候可以\(O(n^2)\)做每一个询问。
CF446D
假设起点固定,设\(g_i\)表示经过\(i\)号点的期望次数,很容易列出方程,所以可以做到\(O(n^4)\)。
注意方程的形式是
前面一片都总是一样的,只要\([i=S]\)每次变化。这类似于一个\(Ax=b\)的多组询问的形式,可以先求出\(A^{-1}\)然后每次乘上向量就可以得到答案。
总复杂度\(O(n^3)\)。
矩阵快速幂
多次询问\(A^n b\),每次\(n,b\)不同。
可以预处理\(A^{2^k}\),每次回答的时候只乘\(b\),可以做到\(m^3\log n+qm^2\log n\)。
行列式
\(M_{i,j}\)表示去掉\(i\)行\(j\)列之后的矩阵行列式。(余子式)
\(c_{i,j}=(-1)^{i+j}M_{i,j}\):代数余子式。
\(\det(A)=\sum_i a_{i,j} c_{i,j}\),即按行展开。(按列展开也是对的)
\(\det(A^T)=\det(A)\)。
\(\det(AB)=\det(A)\det(B)=\det(BA)\)。
行列式的几何意义:向量在\(d\)维空间中围成的平行X面体(单纯形?)体积,所以围成的类似于棱锥的体积等于\(\frac 1 {d!}\det(A)\)。
推论:方程组
的体积是\(\frac{s^d}{d!}\)。
THUPC2017 E
通过行列式,我们可以快速算出\(n\)维空间中\(n+1\)个点围成的棱锥的体积。
有一个结论:任选\(n\)个点,把他们围成的棱锥的体积加起来,最后除以二,就是答案。
为什么?咕咕咕
矩阵树定理
生成树的个数就是度数矩阵减去邻接矩阵,再删掉一行一列,的行列式。
有向图的以\(i\)为根的树形图,是度数矩阵减去邻接矩阵,再删去\(i\)行\(i\)列,的行列式。外向树是入度,内向树是出度。
某知名定理
\(n\)个点的完全图的生成树个数是\(n^{n-2}\)。
可以使用矩阵树定理或prufer序列证明。
BEST定理
\(n\)个点有向图存在欧拉回路的充要条件是所有点入度等于出度。图的欧拉回路的条数是任意一个点的树形图个数乘所有点度数-1的阶乘。(显然任意一个点的树形图个数都相等)
UOJ226
无向图的欧拉回路条数,如果图是一棵树带重边,那么可以很容易给边定向;如果是环套树带重边,那么可以枚举环上某两个点之间有几条往右几条往左,就可以推出所有边的情况。
带状矩阵
高斯消元可以做到\(nd^2\),其中\(d\)是带子的宽度。
如果需要改变主元,为了保证复杂度不能向下找,而要向右找,交换两列,相当于交换两个变量。
用途:比如网格图做生成树个数的时候,带宽可以做到\(\min(n,m)\),不妨设\(m<n\),那么复杂度就是\(O(nm^3)\)。(与博客中直接消元法类似)
CF963E
见博客。
线性空间(向量空间)
定义在某一个数域内,比如\(\rm{F}_p,\R^3\),使得\(v_1\in S,v_2\in S\),则有\(v_1+v_2\in S,av_1\in S\)。(即对加减法和数乘封闭)
对于向量集合\(S\),记\(\mathrm{span}(S)=\{a_1v_1+a_2v_2+a_3v_3+\cdots\}\)。
线性无关组\(\{v_{1...k}\}\):不存在不全为零的\(a_{1...k}\),使得\(\sum a_iv_i=0\)。
一个向量空间的基:向量空间中某个极大的线性无关组。
向量空间的维数:基的大小。
矩阵(或一组向量)的秩:张成的线性空间的维数。
定理:行空间和列空间的维数相等。
模\(p\)意义下,若\(\dim V=d\),那么共有\(p^d\)个元素。(???)
\(Ax=b\)什么时候会有一解、无解、多解?
如果是在模\(p\)意义下,那么有多解的时候解的个数是\(p^{n-\mathrm{rank}(A)}\)。(即\(n-\mathrm{rank} (A)\)就是自由元的个数)
空间\(\{x|Ax=0\}\)(即\(Ax=0\)的解空间)是一个线性空间。
\(xor\)可以定义在\(F_2\)的\(d\)维空间。
拟阵
拟阵由一个二元组\((V,I)\)组成。
\(I\):拟阵的子集族(即一个由集合组成的集合),满足
- \(\empty\in I\)
- \(A\subset B,B\in I\),那么\(A\in I\)
- \(|A|<|B|,A\in I,B\in I\),那么存在\(v\in B-A\),使得\(A+\{v\}\in I\)
线性无关组是拟阵。(???)
拟阵可以用来证明贪心的正确性。
HDU多校1 B
线性基里面存二元组\((x,p)\)表示当前值是\(x\),用到的最早的位置是\(p\)。插入的时候如果\(p>p'\)那么交换。
询问的时候取出\(r\)位置的线性基,只用\(p\ge l\)的位置的值得到答案。
UOJ 91
类似上一题,把\(p\)设成消失的时间,然后用一样的方法做。
SRM 620 Hard
对于每个因子列一个方程;
对于每一行、每一列再列一个方程。
如果有解那么方案数就是\(2^{n-\mathrm{rank}}\)。
伴随矩阵
\(A\)的伴随矩阵(记作\(\mathrm{adj}(A)\)),他的\(a'_{i,j}=c_{j,i}\),即代数余子式的矩阵的转置。
由于代数余子式求起来很慢,我们需要一个更快的做法。可以发现,\(\mathrm{adj}(A)\)有一些很有趣的性质:
因此,如果\(A\)可逆,那么可以直接求出\(\mathrm{adj}(A)\)。
否则,
若\(\mathrm{rank}(A)\le n-2\),那么伴随矩阵恒为0。(???)
若\(\mathrm{rank}(A)=n-1\),则\(A\cdot \mathrm{adj}(A)=0\),即\(\mathrm{adj}(A)\)的每一列都在\(Ax=0\)的解空间内。又因为\(Ax=0\)的解空间维数为1,所以\(\mathrm{adj}(A)\)的每一列都可以表示为\(t\cdot x_0\)。一种较为丑陋的方法就是先求出\(Ax=0\)的某一个解\(x_0\),然后把\(A\)的某一行换成随机数,那么这一行的余子式不会变,但矩阵变得可逆了,于是就可以求出\(\mathrm{adj}(A)\)的某一行(或列?),于是就可以求出一整个\(\mathrm{adj}(A)\)。
由这个式子可以推出\(A\)在交换环\(R\)(???)意义下存在逆矩阵的充要条件是\(\mathrm{\det A}\)存在逆元:
又因为
所以
Schwartz–Zippel Lemma
一个多项式(可以有多个变量)在模p意义下,如果每个变量的值都是随机的,那么一整个多项式的值为0的概率不超过次数除以p。
判断一个二分图是否有完备匹配
给每一条边一个变量,……掉线
NTF笔记多好qwq
Tutte Matrix
Sherman–Morrison formula
对于列向量\(u,v\),有
发现右边的东西可以\(O(n^2)\)做出来。
扩展:可以在\(O(n^2k)\)的时间内实现给一个矩阵加上一个\(\mathrm{rank}=k\)的矩阵,并维护出它的逆。仍然有公式:
\(U\)为一\(n\times k\)矩阵,\(V\)为一\(k\times n\)矩阵,且\(I_k+VA^{-1}U\)可逆,则
对于某一个\(\mathrm{rank}=k\)的矩阵,选出它行空间的某一组基,那么其他的行肯定可以被表示出来,所以肯定可以被拆成\(U\cdot V\)的形式。
动态图传递闭包
令\(A\)为图的邻接矩阵(邻接矩阵内如果有边则随机设值,于是矩阵大概率可逆),那么传递闭包可以视为
其中\(i,j\)可达当且仅当\(A_{i,j}\)不为零。
如果要加边删边,相当于对\(A\)做很小的修改,于是可以用上面的方法维护出来。
甚至可以对某个点连出去或连进来的边全部进行修改,因为这样也只是修改了一行或一列而已。
(到底是否正确?)
ICPC2018 Nanjing F
如果固定终点,那么可以设\(f_x\)表示从这里走到\(T\)的期望步数,很容易列出方程:
直接暴力高斯消元是\(O(n^4)\),过不去。
由于每一次改变\(T\)的时候都只会改变一行,于是可以采用上面的方法维护逆矩阵……吗?
需要注意一些初始的东西,似乎是要保证一开始的矩阵要有逆,然而并没有完全听懂。
设\(f_{i,j}\)表示从\(i\)走到\(j\)的期望步数,那么
令\(g_i\)表示从\(i\)走回\(i\)的期望步数,那么
于是
(其中\(F\)全是1,\(G\)为对角矩阵)
即
可以证明\(\mathrm{rank}(I-P)=n-1\)。
左右同时进行高斯消元,令\(F_{n,i}=0\),可以消出一个\(F\)的特解\(Y\)。
由于\((I-P)x=0\)的解空间的维数为1,所以可以给\(Y\)的每一列加上几个\(x\),然后……由于\(F_{i,i}=0\),可以知道每一列到底要加几个,然后就做完了……
(???)
设\(q_{k,i}\)表示走\(k\)步之后走到\(i\)的概率,则\(\lim\limits_{k\rightarrow \infty}q_{k,i}=\pi_i\)。
所以
而且
可以解方程解出\(\pi\)。
于是在一个无限长的出现序列里面,每\(g_i\)步便出现一次\(i\),所以\(g_i=\frac 1{\pi_i}\)。
于是\(g\)也求出来了,于是\(F\)也就可以通过求逆求出来。
(不是很严谨)
特征值和特征向量
如果\(\lambda\)为\(A\)的特征值,那么满足
显然,\(\det (\lambda I-A)\)为一个关于\(A\)的一个次数为\(n\)的多项式,而且首项系数为1。记这个多项式为\(A\)的特征多项式。
每个特征值对应一个特征向量\(x_i\),满足
其中\(D\)是\(\lambda_i\)组成给的对角矩阵。记\(P=[x_i]\)。
所以\(AP=PD,A=PDP^{-1}\),所以\(A^n=PD^nP^{-1}\)。
CF923E
矩阵对角化一下,显然\(\lambda_i=\frac 1 i\),然后发现上面的\(P\)和\(P^{-1}\)都有很好的性质,一通乱乘恰好是一个卷积的形式,于是就没了。
(具体证明懒得写了,看题解吧)
哈密尔顿-凯莱定理
对于\(A\)的特征多项式\(f(\lambda)=\sum c_k\lambda^k\),有\(f(A)=0\)。
所以有
优化线性递推
见博客。
BM算法求矩阵的最小多项式
考虑数列\(\{A^k\}\)的线性递推式\(A^n=\sum_{i=1}^t c_iA^{n-i}\),它其实就对应着一个零化多项式,所以我们就是要求这个数列的最短递推式。
考虑随机两个向量\(u,v\),改成求\(\{u^TA^kv\}\)的线性递推式。
设\(A\)中非0位置的个数是\(e\),那么\(A\)与一个向量相乘的复杂度是\(O(e)\)的,于是可以\(O(ne)\)搞到这个数列,然后再\(O(n^2)\)求出线性递推式。
总复杂度\(O(n(n+e))\)。
BM算法解稀疏线性方程组
对于一个方程组\(Ax=b\)(\(A\)满秩),有\(x=A^{-1}b\)。
考虑求出\(\{A^kb\}\)的最短递推式,那么得到\(Ib=\sum_{i=1}^m c_iA^ib\)。左右同乘\(A^{-1}\),得到\(A^{-1}b=\sum_{i=1}^m c_iA^{i-1}b\)。
\(A^kb=A(A^{k-1}b)\),所以可以直接递推得到。
总复杂度\(O(n(n+e))\)。
BM算法求稀疏矩阵行列式
由定义可知\(\det(A)=(-1)^n f(0)\),其中\(f\)为\(A\)的特征多项式。
每行随机乘\(a_i\),有很高概率它的最小多项式就是特征多项式(必须要满秩?没听清)。
于是稀疏矩阵的行列式就可以在\(O(n(n+e))\)的时间内求出来。
Cramer法则
对于\(Ax=b\),如果\(\det(A)=0\)那么有唯一解:
其中\(D=\det(A)\),\(D_i\)表示把第\(i\)列换成\(b\)的行列式。
这个东西似乎没什么用,然而在\(A\)是范德蒙德矩阵的时候可能会有奇效。
(需要用到多项式多点插值的式子和多项式多点求值)