数学顶尖科技学习笔记

常系数齐次线性递推

考虑普通递推式:

fn=i=1kcifni

一般我们会用矩阵来表示递推关系,再通过矩阵快速幂来优化时间复杂度到 (k3log2n),但有些时候 n 会特别大,大到 log2n 可能等于 106,这是我们就需要用常系数齐次线性递推来优化矩阵快速幂。

特征多项式

定义

在求矩阵的特征值时,我们需要求方程 det(λIA)=0 的解,此时如果我们定义 ϕA(λ)=det(λIA),那么此时 ϕA(λ)=0 的根就是特征值,而 ϕA(λ) 就称为 A 的特征多项式。

假设 A 的特征值分别为 v1,v2,,vn,那么特征多项式又可以写成 ϕA(λ)=(λv1)(λv2)(λvn),可以发现 ϕA(λ) 是一个 n 次多项式,且最高项系数为 1

舒尔引理

设一个 n×n 的矩阵 A=[a1,1a1,2a1,3a1,na2,1a2,2a2,3a2,na3,1a3,2a3,3a3,nan,1an,2an,3an,n],它的特征多项式 ϕA(x)=(xλ1)(xλ2)(xλn)nC),那么一定存在一个 n×n 的可逆矩阵 P 使得 P1AP=[λ1p1,2p1,3p1,n0λ2p2,3p2,n00λ3p3,n000λn]

证:

上海森堡矩阵

虽然上三角矩阵的特征多项式可以简单地通过对角线算出,但

求解特征多项式:海森堡算法

矩阵对角化

考虑用基变换求矩阵的 k 次方时,我们把转移矩阵 M 写成了 PAP1 的形式,其中 A 是只有对角线有值,且是特征值,写成 M=PAP1,此时 A 解出来是 P1MP,此时可以发现,当我们对某些矩阵右乘一个可逆矩阵,再左乘这个矩阵的逆,可以把这个矩阵变成对角矩阵,这就是矩阵的对角化。

对角化矩阵的特征多项式 ϕP1AP(λ)=det(λIP1AP)=det(P1(λIA)P)=det(P1)det(λIA)det(P)=1det(P)det(P)ϕA(λ)=ϕA(λ),这也进一步说明对角化后矩阵代表的线性变换未发生改变,这在接下来的证明中很有用。

伴随矩阵

我们知道矩阵的代数余子式写作 Δi,j,于是定义一个矩阵 A 的伴随矩阵 adjA=[Δ1,1Δ1,2Δ1,3Δ1,nΔ2,1Δ2,2Δ2,3Δ2,nΔ3,1Δ3,2Δ3,3Δ3,nΔn,1Δn,2Δn,3Δn,n]

伴随矩阵与原矩阵的乘积有特殊含义,拿 3×3 的矩阵为例,设 B=[Δ1,1Δ1,2Δ1,3Δ2,1Δ2,2Δ2,3Δ3,1Δ3,2Δ3,3][a1,1a1,2a1,3a2,1a2,2a2,3a3,1a3,2a3,3]

根据矩阵乘法,有 B1,1=a1,1Δ1,1+a1,2Δ1,2+a1,3Δ1,3,现在,你会很惊喜的发现这就是将 A 的行列式在第一排的展开式,那么 B1,1=det(A),类似的,你会发现 B 左上到右下对角线上每个值都是 det(A)

对于不在左上到右下对角线上的元素,比如 B2,1=a1,1Δ1,2+a2,1Δ2,2+a3,1Δ3,2,它对应矩阵 [a1,1a1,1a1,3a2,1a2,1a2,3a3,1a3,1a3,3] 的行列式,由于这个行列式有两列相同,它的行列式一定为 0,类似的,你会发现 B 非左上到右下对角线上每个值都是 0

于是 B 可以表示成 [det(A)000det(A)000det(A)]=det(A)I

于是一个重要的定理就诞生了 (adjA)A=det(A)I

cayley-hamilton 定理

这是特征多项式非常重要的一个定理。假设我们已经求出了一个矩阵 A 的特征多项式 ϕA(λ),那么一定有 ϕA(A)=OO 为全为 0 的矩阵)。

举个例子,先拿 2×2 的矩阵为例,比如斐波那契数列的转移矩阵 A=[1110],它的特征多项式 ϕA(λ)=det([λ111λ])=λ2λ1

λ 替换为 A 之后(注意此时要将 1 替换为单位矩阵 I,它才是矩阵的基本单位),可以得到 [1110]2[1110][1001]=[2111][1110][1001]=[0000]

证明1

假设 A 是对角矩阵,那么变换后,这一线性空间中的基还在它原来的直线上,那么每个基都是一个特征向量,而对角线上的值就是特征值,假设是 v1,v2,v3,,vn,那么特征多项式就为 ϕA(λ)=(λv1)(λv2)(λvn),用 A 替换 λ,会发现 A 的第 i 行会出现 (vivi) 这种因式,那么每一行都是 0,此时 A 退化成了 O 矩阵。

对于可以对角化的矩阵,假设它对角化后为 P1AP,由于特征多项式的性质,有 ϕA(λ)=ϕP1AP(λ),由于我们已经得出了 ϕP1AP(P1AP)=O,因此 ϕA(P1AP)=O

我们知道 (P1AP)k=P1AkP,那么原式又可以变成 P1ϕA(A)P=O,于是 ϕA(A)=O

对于不可对角化的矩阵,可以通过伴随矩阵来证明。

考虑矩阵 F(λ)=λIA 的伴随矩阵 adjF(λ),根据伴随矩阵的性质,有 [adjF(λ)]F(λ)=det[F(λ)]I

根据特征多项式的定义,det[F(λ)]=ϕA(λ),那么原式可以变成 [adjF(λ)]F(λ)=ϕA(λ)I,由于伴随矩阵中每个代数余子式都是原矩阵的一个 (n1)×(n1) 的子矩阵的行列式,那么可以写成 adjF(λ)=B(λ)=bn1λn1+bn2λn2++b0,那么左边可以写成 B(λ)F(λ)=(bn1λn1+bn2λn2++b0)(λIA)=bn1λn+(bn2bn1A)λn1++(b0b1A)λ2b0Aλ

等式右边是 A 的特征多项式,于是可以写成 λn+an1λn1++a0,那么 ϕA(λ)I=λnI+an1λn1I++a0I。由于 [adjF(λ)]F(λ)=ϕA(λ)I 是恒等的,那么它们的系数也是相等的,于是有以下方程组:

{bn1=Ibn2bn1A=an1Ib0b1A=a1Ib0A=a0I

将第 1,2,,n1,n 排分别乘以 An,An1,,A,I,可以得到:

{bn1An=Anbn2An1bn1An=an1An1b0Ab1A2=a1Ab0A=a0

将左边全部加起来,右边全部加起来,发现右边的项都被消掉了,而左边加起来正好是 ϕA(A),因此 ϕA(A)=O

证明2

线性代数方法

这个方法是所有方法中时间复杂度最高的,达到了 O(d4+d2log2n),比后面的 dlog2dlog2n 要慢多了,但确实是最容易理解的方法,适合 d 比较小但 n 比较大的情况。

首先,设函数 f(x)=xn,于是我们要求的就是 f(M)M 为转移矩阵),考虑将 f(x) 做带余除法,除以 ϕM(x),于是有 f(x)=ϕM(x)g(x)+r(x)g(x) 为商式,r(x) 为余式,次数为 d1),将 M 代入,因为 ϕM(M)=O,于是第一项就是 0,得到 f(x)=r(x)。这是一个 d1 次多项式,直接将 M 代入即可。

于是直接快速幂,每次对 ϕM(x) 暴力多项式取模,总时间复杂度为 O(d4+d2log2n)

完整代码:P10775 BZOJ4162 shlw loves matrix II


Fiduccia 算法

现在还是来求 fn=i=1kcifni 的第 n 项,考虑构造两个多项式个多项式 Γ(x)=xki=0k1ckixiA(x)=i=0k1aixi,接着定义 Γ(x) 的友矩阵

bostan-mori 算法

这个算法需要我们细细的来讲。

还是从分式 F(x)=P(x)Q(x) 开始,假设我们要求解它的 xn 项的系数,考虑将分式上下两边同时乘以 Q(x),变成 P(x)Q(x)Q(x)Q(x),发现分母是一个偶函数,因此可以表示为 V(x2)。而根据高中数学可得,任意一个函数可以表示为一个奇函数和一个偶函数的和,那么分母又可以表示为 Ueven(x2)+xUodd(x2)。因此 F(x)=Ueven(x2)+xUodd(x2)V(x2)=Ueven(x2)V(x2)+xUodd(x2)V(x2)

这就意味着 [xn]P(x)Q(x)={[xn2]Ueven(x)V(x)n[xn12]Uodd(x)V(x)n

此时,一个求分式 xn 项系数的问题就转化成了求另一个次数相同的分式 xn2 项的系数,问题规模缩小了,因此只需要 O(dlog2dlog2n) 的时间复杂度(多出的复杂度是 FFT 的时间复杂度)就可以求出这个分式 xn 项的系数。

例题一

你有 n 种货币,问用这些货币组成 m 的方案数,保证 ai<ai+1aiai+1

n50,m1018

例题二

常系数非齐次线性递推

整式递推

类欧几里得算法

N 次剩余

高级筛法

Min\_25

Min\_26

洲阁筛

冷群筛

组合筛

参考资料

posted @   JPGOJCZX  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示