特征值和特征向量

特征值和特征向量

定义 n×n 的矩阵 A非零 n×1 的列向量 v,实数 λ,若:

Av=λv

那么称 vA 的特征向量,λ 为特征值。

求解特征值

将定义式子移项得到:

(λEA)v=0

其中 E 为单位矩阵,那么又因为 v 为非零向量,可以得到 (λEA) 不满秩,换句话说也就是:

det(λEA)=0

那么行列式求值后得到的会是一个 n 次多项式,对应的 n 个根即为特征值,称这个多项式为矩阵 A 的特征多项式。

直接把 λ 看成未知数做多项式操作复杂度为 O(n5),或者直接插值能做到 O(n4),但是可以做到更好。

定义相似矩阵:

对于可逆矩阵 PB=PAP1 ,则称 BA 的相似矩阵。

定理:相似矩阵的特征多项式相同

ans=|xEPAP1|=|xE(PP1PAP1|=|PxEP1PAP1|=|P(xEA)P1|=|P||xEA||P1|=|xEA|

其实相似矩阵的迹(主对角线上元素之和)以及矩阵的秩和原矩阵相同,但求解特征多项式只需行列式相同即可。

这启示我们可以将 A 利用类似初等行变换的手法去变成一个好算行列式矩阵(例如上三角矩阵) B 然后再算特征多项式。

考虑用初等矩阵消元(初等矩阵都可逆)

定义 P(j,i(k)) 表示将 E 的第 i 行的 k 倍加到第 j 行上。

那么矩阵 P(j,i(k)) 中只有矩阵主对角线的值为 1(i,j)k,其他的元素均为 0

那么矩阵 P(j,i(k))1 中只有矩阵主对角线的值为 1(i,j)k,其他的元素均为 0,即 P(j,i(k))

假设对矩阵 A 的第 j 行加上 k 倍的第 i 行。

A=P(j,i(k))AP(j,i(k))

那么在在行消后,i 列要减去第 j 列的 k 倍。

交换两行的操作也可以用类似的手法得到,如果交换了第 i 行和第 j 行,那么在交换完成后,i 列和第 j 列也会交换。

其实也就是对原来高斯消元的每个操作多执行一次共轭操作。

手完几个矩阵后你会发现绝大多数时候并不能消成上三角矩阵(比如交换第 i 行和第 j 行时,第 i 列的值会被污染),退而求其次,你可以消成一个上海森堡矩阵 B,即对于 i>j+1,Bi,j=0

[b1,1b1,2b1,n1b1,nb2,1b2,2b2,n1b2,nb3.2,b3,n1b3,nb4,n1b4,nbn1,nbn,n]

号代表空矩阵。

那么现在的问题变成了如何在快速求解上海森堡矩阵的特征多项式。

性质这么好,考虑对最后一列拉普拉斯展开行列式

[b1,1b1,2b1,n1b1,nb2,1b2,2b2,n1b2,nb3.2,b3,n1b3,nb4,n1b4,nbn,n1bn,n]

假设最后一列选择的元素为 bi,n,那么对于所有大于 i 的行,唯一能选择的方案为 bj,j1,那么对于小于 i 的行列,又是一个递归的子问题 。

gi 表示只考虑前 ii 列的行列式。

g0=1,gi=k=1iak,igk1j=k+1i(ak,k1)

后面要去负号的原因在于每加一个数逆序对个数加一。

fi(x) 表示只考虑前 i 行前 i 列的特征多项式。(注意到计算的是 det(λEA)),那么 A 中的所有数要取反

fi(x)=(xai,i)fi1(x)k=1i1ak,ifk1(x)j=k+1iaj,j1

最后一列取值为 ai,i 时需要特殊判一下,因为贡献不一样。

稍微再化简一下得到:

fi(x)=xfi1(x)k=1iak,ifk1(x)j=k+1iaj,j1

其实可以做到 O(n2),但是没必要。

P7776 【模板】特征多项式

那么在 O(n3) 求出了一个矩阵的特征多项式。

其实算特征多项式算的是 det(λEA),那能否推广呢?

即能否在 O(n3) 计算 det(A+Bx) 呢?

其实是可以的,首先你注意到。

尝试用高斯消元 BB 最终变成单位矩阵(这里不需要用那个共轭操作),然后就变成我们会的东西了,但是有可能 B 不满秩。

如果当前在第 i 行,如果当前找的到主元直接换过来消元,如果找不到就看能否交换两列使得得到主元,如果还是找不到那么说明 B 所在的行全为 0

此时将这一行全部乘以 x,那么最终多项式的系数也会向右平移一个单位,再用前 i1 行确定的信息去消元第 i 行。

如果还找不到就重新再来一遍,每次乘以 x 的代价为 O(n2) 如果重复了大于 n 次说明多项式系数全为 0 (向右平移了大于 n 个单位),那直接退出即可。

那么用 O(n3)B 消元成了一个只有在主对角线上元素有值且每个值均非 0。那我们把每一行的系数全部提取出来,设他们的乘积为 w,那么现在就变成了求 det(A+xE)

A 全部取反后就变成了特征多项式板子题。

唯一要修改的地方就是将 f0(0) 的值从 1 变成 w

复杂度还是 O(n3)

还能扩展吗?比如说求 det(A+Bx+Cx2) ?貌似是可以的,但是很复杂,笔者暂未学习。(坑 ,但是插值是一定能做的,复杂度劣一些)

[ABC323G] Inversion of Tree

题目想要区分逆序边和顺序边,那直接将逆序边的权值设为 x,顺序边的权值设为 1,放到矩阵树上的矩阵中,去掉任意一行一列,求 det(A+Bx) 的每一项系数即可。

口胡的 idea

给定一个无向图,求有多少种方案选择一些边使得最终形成恰好 k 棵树,即森林大小为 k,对于 k=1n 分别求解。

n500

建一个虚点,又恰好 k 棵等价于所有恰好有 k 棵树的根跟虚点连边。

虚点跟其他每个点连一条权值为 x 的边,其他边正常连 1 的边,跑矩阵树即可。

特征分解(对角化)

在矩阵快速幂中,计算 Ak,每一次乘法都是 O(n3),这不免让人感到失落。

如果说矩阵是一个对角矩阵(只有主对角线有值的话),那么乘法的效率会大大提高。

如果能找到一个对角矩阵 PBP1=A

那么

Ak=(PBP1)k=(PBP1)(PBP1)(PBP1)=PB(P1P)B(P1P)BP1=PBkP1

PBP1=A 那么可以得到 AP=PB

B 主对对角线上的元素分别为 λ1,λ2,,λnP 分成 n 个列向量 v1,v2,vn,那么:

Avi=λivi

因为 P 可逆,所以 v1,v2,,vn 非零。

这对应着特征值和特征向量。

又因为 v1,v2,vn 线性无关,那么一个矩阵可对角化的条件是矩阵满秩。

那么矩阵对角化的方法是:

1.先找到 n 个特征值。

2.对于每一个特征值找对应的特征向量。

(Aλi)vi=0

直接高斯消元可以求得 v

将所有 v 竖着拼在依次一个矩阵 P 里,λi 依次填入对角矩阵 B

然后就得出了:PBP1=A

但是除非题目有特殊性质,否则根本没用。

因为我需要对一个多项式求根,且还可能出现复数。

所以往往要用矩阵对角化的题目大概率是一个上三角/下三角矩阵

Perpetual Subtraction

fk,i 表示 k 次后 x=i 的概率。

fk,i=j=infk1,jj+1

fk,x 看作列向量,那么:

[1121n+10121n+1001n+1]fk=fk+1

矩阵对角化!

PBP1=A

首先这是一个上三角矩阵,对应的 λi=1i

由于矩阵真的非常优美,考虑手摸特征向量。

(AλiE)vi=0

把它转换成线性方程组的语言:

{(A1,1λi)v1+A1,2v2+A1,3v3++A1,nvn=0(A2,2λi)v2+A2,3v3+A2,4v4++A2,nvn=0(A3,3λi)v3+A3,4v4+A3,5v5++A3,nvn=0(An,nλi)vn=0

倒着推算 vj,首先注意到 j>i,vj=0

来到第 i 行的时候,化简后变成 vi×0=0

注意到如果此时再将 vi 设为 0 的话,那么算出的向量 v 就只能是零向量了。

此时按理说是可以设为任意非零的值的,但是设为 1 能让矩阵更加优美(最后特征向量形成的矩阵比较有规律)

再根据已知的值推剩下的值 vj 即可。

解出来(过程略,可手推)

vj={(1)i+j(ij)ji0j>i

把所有拼在一起得到矩阵 P

[(1)0(00)(1)1(10)(1)n(n0)0(1)2(11)(1)n+1(n1)00(1)n+n(nn)]

还需要求出 P1,此时可以使用暴力矩阵求逆然后观察规律。

实际上你仔细想想。

这个矩阵正好对应着二项式反演的系数矩阵!

fi=j=in(1)i+j(ji)gjgj=j=in(ji)fj

上面的系数矩阵对应着 P,那么它的逆也就对应着下面的矩阵,即矩阵 P1(i,j) 的值为 (ji)B 对应的对角矩阵第 i 行第 i 列为 1i,其余位置均为 0

那么现在就变为求

PBP1fk=fk+1(PBP1)kf0=fkPBkP1f0=fkBk(P(P1f0))=fk

下面简写 f0,ifi

考虑计算 P1f0

gi=j=in(1)i+j(ji)fjgi=j=in(1)i+jj!i!(ji)!fjgi=(1)ii!j=in(1)jj!fj1(ji)!

这就是差卷积的板子。

P(P1f)

也是同样的套路,最后再成个对角矩阵就做完了。

Tasty Dishes

非常好的一道题,难道出题人真的来自外天空?太神了!

首先观察到随着时间增加 ai 单调不降,如果 i 能从 j 转移而来当且仅当 aj>0,设 dj 为恰好在第 dj 天后大于第一次零。

因为 aii ,所以 aj 一定会在 dj+1 天大于零。那么:

di=minjidj+1

考虑所有点对询问的贡献,设 Ai,j=j[ji],特别的,Ai,i=iei 为长度为 n 的列向量且恰好只有第 i 行的值为 1

那么答案为:

(i=lreiT)(dikAkdieiai)+i=lr[di>k]ai

后一坨是煎蛋的,直接暴力扫一遍即可。

左边还是困难的,主要问题在于 A 的矩阵大小太大了,做快速幂不能接受。

怎么办?还是考虑矩阵对角化!

A 矩阵是一个上三角矩阵,可以轻易地得到特征值 λi=i

跟上一道题一样,找特征向量。

(AλiE)vi=0

此题中的 A 并不是确定的,那就只能倒着消元得到 vi,过程跟上题类似,不展开。有趣的点在于可以将 vi,i 设置成任意你喜欢的非零数。

现在将 A 化成了 PBP1,直接带入式子,发现只能少个 log,没啥用。

仔细观察式子的内核,发现我们只在意矩阵的某一列的值而并非所有值。

考虑将每个 eiP[v1,v2,,vn] 线性表示。

ei=j=1nci,jvj

定睛一看,其实矩阵 c 就是 P1 的转置。化简左边的一坨:

ans=(i=lreiT)(dikAkdieiai)=(i=lreiT)(dikaiAkdij=1nci,jvj)=(i=lreiT)(dikaij=1nci,jAkdivj)=(i=lreiT)(dikaij=1nci,jjkdivj)

已经明晰了许多,考虑把前面一坨拿进来。

ans=dikaij=1nci,jjkdip=lrvj,p=j=1njk(p=lrvj,p)dikaici,jjdi

前面两坨可以轻松的在 O(n) 的时间计算,只需考虑最后一坨。

考虑对每个 j 开一个树状数组,下标维护 k 维度,每次相当于单点修改前缀查询。

注意到单点修改时,如果修改前 ai0 修改后 ai>0,那整个的 d 数组需要重新计算,树状数组也要全部修改。

但是一共最多重构 n 次,所以复杂度不会爆炸。

复杂度 O(n3logn+qnlogn),可以将前面的 log 去掉(O(n) 建树状数组。)

posted @   Hanghang007  阅读(172)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示