Processing math: 0%

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)​

注意方程的形式是

g_i=\sum_j p_{j,i}g_j+[i=S]

前面一片都总是一样的,只要[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)​

推论:方程组

\begin{cases} x_1\ge 0\\ x_2\ge 0\\ \cdots\\ x_d\ge 0\\ \sum x_i\le S \end{cases}

的体积是\frac{s^d}{d!}​

THUPC2017 E

通过行列式,我们可以快速算出n​维空间中n+1​个点围成的棱锥的体积。

有一个结论:任选n​个点,把他们围成的棱锥的体积加起来,最后除以二,就是答案。

为什么?咕咕咕

矩阵树定理

生成树的个数就是度数矩阵减去邻接矩阵,再删掉一行一列,的行列式。

有向图的以i​为根的树形图,是度数矩阵减去邻接矩阵,再删去i​i​列,的行列式。外向树是入度,内向树是出度。

某知名定理

n​个点的完全图的生成树个数是n^{n-2}​

可以使用矩阵树定理或prufer序列证明。

BEST定理

n​个点有向图存在欧拉回路的充要条件是所有点入度等于出度。图的欧拉回路的条数是任意一个点的树形图个数乘所有点度数-1的阶乘。(显然任意一个点的树形图个数都相等)

ec(G)=t_w(G)\prod(deg_i-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​:拟阵的子集族(即一个由集合组成的集合),满足

  1. \empty\in I​
  2. A\subset B,B\in I​,那么A\in I​
  3. |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\cdot\mathrm{adj}(A)=\det (A)\cdot I\\ \mathrm{adj}(A)=\det (A)\cdot A^{-1}

因此,如果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}存在逆元:

1=\det (I)=\det(A\cdot A^{-1})=\det (A)\det (A^{-1})\\ \det (A^{-1})=\det (A)^{-1}

又因为

\mathrm{adj}(A)=\det (A)\cdot A^{-1}

所以

A^{-1}=\mathrm{adj}(A)\det (A)^{-1}

Schwartz–Zippel Lemma

一个多项式(可以有多个变量)在模p意义下,如果每个变量的值都是随机的,那么一整个多项式的值为0的概率不超过次数除以p。

判断一个二分图是否有完备匹配

给每一条边一个变量,……掉线

NTF笔记多好qwq

Tutte Matrix

Sherman–Morrison formula

对于列向量u,v​,有

(A+uv^T)^{-1}=A^{-1}-\frac{A^{-1}uv^{T}A^{-1}}{1+v^T A^{-1}u}

发现右边的东西可以O(n^2)​做出来。

扩展:可以在O(n^2k)​的时间内实现给一个矩阵加上一个\mathrm{rank}=k​的矩阵,并维护出它的逆。仍然有公式:

U​为一n\times k​矩阵,V​为一k\times n​矩阵,且I_k+VA^{-1}U​可逆,则

(A+UV)^{-1}=A^{-1}-A^{-1}U(I_k+VA^{-1}U)^{-1}VA^{-1}

对于某一个\mathrm{rank}=k的矩阵,选出它行空间的某一组基,那么其他的行肯定可以被表示出来,所以肯定可以被拆成U\cdot V的形式。

动态图传递闭包

A​为图的邻接矩阵(邻接矩阵内如果有边则随机设值,于是矩阵大概率可逆),那么传递闭包可以视为

I+A+A^2+A^3+\cdots=\frac{1}{I-A}

其中i,j​可达当且仅当A_{i,j}​不为零。

如果要加边删边,相当于对A​做很小的修改,于是可以用上面的方法维护出来。

甚至可以对某个点连出去或连进来的边全部进行修改,因为这样也只是修改了一行或一列而已。

(到底是否正确?)

ICPC2018 Nanjing F

如果固定终点,那么可以设f_x​表示从这里走到T​的期望步数,很容易列出方程:

f_x=[x\ne T](1+\sum_y p_{x\rightarrow y}f_y)

直接暴力高斯消元是O(n^4)​,过不去。

由于每一次改变T​的时候都只会改变一行,于是可以采用上面的方法维护逆矩阵……吗?

需要注意一些初始的东西,似乎是要保证一开始的矩阵要有逆,然而并没有完全听懂。

f_{i,j}​表示从i​走到j​的期望步数,那么

f_{i,j}=[i\ne j](1+\sum_x p_{i,x}f_{x,j})

g_i​表示从i​走回i​的期望步数,那么

g_i=1+\sum_x p_{i,x}f_{x,i}

于是

f_{i,i}=1+\sum_x p_{i,x}f_{x,i}-g_i

F=J+PF-G

(其中F​全是1,G​为对角矩阵)

(I-P)F=J-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 P=\pi

而且

\sum \pi_i=1

可以解方程解出\pi​

于是在一个无限长的出现序列里面,每g_i​步便出现一次i​,所以g_i=\frac 1{\pi_i}​

于是g​也求出来了,于是F​也就可以通过求逆求出来。

(不是很严谨)

特征值和特征向量

如果\lambda​A​的特征值,那么满足

\det(\lambda I-A)=0

显然,\det (\lambda I-A)​为一个关于A​的一个次数为n​的多项式,而且首项系数为1。记这个多项式为A​的特征多项式。

每个特征值对应一个特征向量x_i​,满足

A\cdot \left[ x_1,x_2,\cdots ,x_n \right]=[\lambda_1x_1,\lambda_2x_2,\cdots,\lambda_nx_n ]\\ =[x_i]\cdot D

其中D​\lambda_i​组成给的对角矩阵。记P=[x_i]​

所以AP=PD,A=PDP^{-1},所以A^n=PD^nP^{-1}

CF923E

矩阵对角化一下,显然\lambda_i=\frac 1 i,然后发现上面的PP^{-1}都有很好的性质,一通乱乘恰好是一个卷积的形式,于是就没了。

(具体证明懒得写了,看题解吧)

哈密尔顿-凯莱定理

对于A​的特征多项式f(\lambda)=\sum c_k\lambda^k​,有f(A)=0​

所以有

\sum c_kA^k=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那么有唯一解:

x_i=\frac{D_i}{D}

其中D=\det(A)D_i表示把第i列换成b的行列式。

这个东西似乎没什么用,然而在A是范德蒙德矩阵的时候可能会有奇效。

(需要用到多项式多点插值的式子和多项式多点求值)

posted @   p_b_p_b  阅读(749)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示