首页 > 其他分享 >特征多项式学习笔记

特征多项式学习笔记

时间:2024-02-08 10:22:40浏览次数:31  
标签:mathbf ddots int 多项式 Hessenberg 笔记 学习 beta lambda

介绍了方阵的特征多项式以及利用上Hessenberg矩阵的 \(\mathcal{O}(n^3)\) 求法。

Reference

OI-wiki

特征多项式:Hessenberg 法及加速矩阵幂

特征值与特征向量

给定 \(n \times n\) 的方阵 \(\mathbf{T}\),若存在一个非零列向量 \(\mathbf{v}\) 和数 \(\lambda\) 满足 \(\mathbf{T}\mathbf{v} = \lambda \mathbf{v}\),则称 \(\lambda\) 为 \(\mathbf{T}\) 的一个特征值,而 \(\mathbf{v}\) 是 \(\mathbf{T}\) 的属于特征值 \(\mathbf{v}\) 的一个特征向量

也就是说,\(\mathbf{v}\) 在 \(\mathbf{T}\) 的线性变换下,只是伸缩了 \(\lambda\) 倍。

特征多项式

将上面的式子变换得到 \((\lambda \mathbf{I}-\mathbf{T})\mathbf{v}=\mathbf{0}\),相应地,非 \(\mathbf{0}\) 解 \(\mathbf{v}\) 就是一个特征向量。我们称 \(\lambda \mathbf{I} - \mathbf{T}\) 为 \(T\) 的特征矩阵,特征矩阵的行列式 \(\det(\lambda \mathbf{I} - \mathbf{T})\) 是一个 \(n\) 次多项式,称为 \(\mathbf{T}\) 的特征多项式,其根就是 \(\mathbf{T}\) 的特征值,记做 \(p_{\mathbf{T}}(\lambda)\)。

怎么求一个方阵的特征多项式?代入 \(n+1\) 个 \(\lambda\) 后Lagrange插值即可,时间复杂度 \(\mathcal{O}(n^4)\)。

接下来,我们引入相似矩阵和上Hessenberg矩阵来做到 \(\mathcal{O}(n^3)\) 的时间复杂度。

更优秀的做法

Hessenberg矩阵

海森堡矩阵(Hessenberg matrix)是一个和三角阵很相似的方阵,上海森堡矩阵(upper Hessenberg matrix)的次对角线以下元素全为 \(0\),下海森堡(lower Hessenberg matrix)矩阵的次对角线以上元素全为 \(0\),下面是两个例子,左侧为上Hessenberg矩阵,右侧为下Hessenberg矩阵。

\[\begin{bmatrix} 1 & 3 & 4 & 2\\ 7 & 2 & 2 & 1\\ 0 & 1 & 4 & 5\\ 0 & 0 & 3 & 9 \end{bmatrix} \begin{bmatrix} 1 & 6 & 0 & 0\\ 7 & 2 & 2 & 0\\ 3 & 1 & 4 & 5\\ 5 & 8 & 3 & 9 \end{bmatrix} \nonumber \]

Hessenberg矩阵对我们求特征多项式有什么用处吗?接下来我们试着求出一个上Hessenberg矩阵的特征多项式,并且在之后用相似变换将求一般方阵的特征多项式转换为求Hessenberg矩阵的特征多项式。

设上Hessenberg矩阵 \(\mathbf{H}\) 为

\[\begin{bmatrix} \alpha_1 & h_{1,2} & h_{1,3} & \cdots & h_{1,n} \\ \beta_2 & \alpha_2 & h_{2,3} & \cdots & h_{2,n} \\ & \ddots & \ddots & \ddots & \vdots \\ & & \ddots & \ddots & h_{n-1,n} \\ & & & \beta_n & \alpha_n \end{bmatrix} \nonumber \]

那么其特征多项式就是

\[\begin{vmatrix} \lambda-\alpha_1 & -h_{1,2} & -h_{1,3} & \cdots & -h_{1,n} \\ -\beta_2 & \lambda-\alpha_2 & -h_{2,3} & \cdots & -h_{2,n} \\ & \ddots & \ddots & \ddots & \vdots \\ & & \ddots & \ddots & -h_{n-1,n} \\ & & & -\beta_n & \lambda-\alpha_n \end{vmatrix} \nonumber \]

记 \(\mathbf{H}_i\) 表示保留 \(\mathbf{H}\) 的前 \(i\) 行前 \(i\) 列得到的方阵,\(p_i(\lambda)\) 表示 \(\mathbf{H}_i\) 的特征多项式。

按最后一行展开 \(p_{n}(\lambda)\),得到

\[p_{n}(\lambda) = (\lambda - \alpha_n)p_{n-1}(\lambda) + \beta_n \begin{vmatrix} \lambda-\alpha_1 & -h_{1,2} & \cdots & -h_{1,n-2} & -h_{1,n} \\ -\beta_2 & \lambda-\alpha_2 & \cdots & -h_{2,n-2} & -h_{2,n} \\ & \ddots & \ddots & \vdots & \vdots \\ & & \ddots & \lambda - \alpha_{n-2} & -h_{n-2,n} \\ & & & -\beta_{n-1} & -h_{n-1,n} \end{vmatrix} \nonumber \]

再按最后一列展开右面的行列式,对于每一个 \(-h_{n-i,n}\),其余子式皆形如

\[\begin{vmatrix} & & & & & \\ & [\lambda \mathbf{I}-\mathbf{H}_{n-i-1}] & & & & \\ & & & & & \\ & & -\beta_{n-i+1} & \cdots & & \\ & & & \ddots & \vdots & \vdots \\ & & & & -\beta_{n-2} & \vdots \\ & & & & & -\beta_{n-1} \end{vmatrix} \nonumber \]

这个东西很特别,它就是

\[p_{n-i-1}(\lambda) \prod_{j=n-i+1}^{n-1}-\beta_j \nonumber \]

把每个 \(-h_{n-i,n}\) 展开的结果加起来,得到

\[\sum_{i=1}^{n-1}(-1)^{1+(n-i)+(n-1)+(i-1)} p_{n-i-1}(\lambda)h_{n-i,n}\prod_{j=n-i+1}^{n-1}\beta_j=-\sum_{i=1}^{n-1}p_{n-i-1}(\lambda)h_{n-i,n}\prod_{j=n-i+1}^{n-1}\beta_j \nonumber \]

代回到原式子,我们就有

\[p_{n}(\lambda) = (\lambda - \alpha_n)p_{n-1}(\lambda) -\sum_{i=1}^{n-1}p_{n-i-1}(\lambda)h_{n-i,n}\prod_{j=n-i+1}^{n}\beta_j \nonumber \]

可以递推计算 \(p_i(\lambda)\),时间复杂度 \(\mathcal{O}(n^3)\)。

相似矩阵

对于一个 \(n \times n\) 方阵 \(\mathbf{A}\),定义其相似矩阵 \(\mathbf{B}\) 是可以表示为 \(\mathbf{P} \times \mathbf{A} \times \mathbf{P}^{-1}\) 的 \(n \times n\) 方阵,其中 \(\mathbf{P}\) 是任意一个 \(n \times n\) 的可逆方阵,此时称 \(\mathbf{A}\) 和 \(\mathbf{B}\) 相似

相似矩阵有什么特别之处吗?

定理: 两个相似矩阵 \(\mathbf{A}\) 和 \(\mathbf{B}\) 具有相同的特征多项式。

证明:

\[\begin{aligned} \det(\lambda \mathbf{I} - \mathbf{P}\mathbf{A}\mathbf{P}^{-1})&=\det(\mathbf{P}(\lambda \mathbf{I})\mathbf{P}^{-1} - \mathbf{P}\mathbf{A}\mathbf{P}^{-1})\newline &=\det(\mathbf{P})\det(\mathbf{P}^{-1})\det(\lambda \mathbf{I} - \mathbf{A})\newline &=\det(\lambda \mathbf{I} - \mathbf{A}) \end{aligned}\nonumber \]

证毕!

运用相似变换直接将一个任意方阵 \(\mathbf{A}\) 变为上三角阵是不现实的:在消元时做第 \(i\) 列和第 \(j\) 列的初等列变换会把之前的东西变乱——但是运用相似变换将一个任意方阵 \(\mathbf{A}\) 变为一个Hessenberg矩阵是容易的!此时消元的初等列变换不会干扰到之前做好的值。

于是就得到了 \(\mathcal{O}(n^3)\) 求任意方阵的特征多项式的做法。

示例代码
const int MOD = 998244353;
inline int Plus(int a, int b) {return a + b >= MOD ? a + b - MOD : a + b; }
inline int Minus(int a, int b) {return a - b < 0 ? a - b + MOD : a - b; }
inline int ksm(long long a, int b) {
    long long r = 1;
    for(; b; b >>= 1, a = a * a % MOD)
        if(b & 1) r = r * a % MOD;
    return r;
}
namespace solver {
    int Mat[N][N];
    int p[N][N];    // p[i][k] 表示 p_i(Mat) 中 \lambda^k 的系数
    inline vector<int> solve(int n) {
        for(int i = 1; i <= n; i ++) {
            if(Mat[i + 1][i] == 0) {
                for(int j = i + 2; j <= n; j ++)
                    if(Mat[j][i] != 0) {
                        swap(Mat[i + 1], Mat[j]);
                        for(int k = 1; k <= n; k ++)
                            swap(Mat[k][i + 1], Mat[k][j]);
                        break;
                    }
            }
            if(Mat[i + 1][i] == 0) continue;
            for(int j = i + 2; j <= n; j ++) {
                long long mul = 1ll * Mat[j][i] * ksm(Mat[i + 1][i], MOD - 2) % MOD;
                for(int k = 1; k <= n; k ++)
                    Mat[j][k] = Minus(Mat[j][k], mul * Mat[i + 1][k] % MOD);
                for(int k = 1; k <= n; k ++)
                    Mat[k][i + 1] = Plus(Mat[k][i + 1], mul * Mat[k][j] % MOD);
            }
        }

        for(int i = 0; i <= n; i ++)
            for(int j = 0; j <= n; j ++)
                p[i][j] = 0; // 只做一次的话可以不清空
        p[0][0] = 1;
        for(int i = 1; i <= n; i ++) {
            p[i][0] = Minus(0, 1ll * Mat[i][i] * p[i - 1][0] % MOD);
            for(int j = 1; j <= i; j ++)
                p[i][j] = Minus(p[i - 1][j - 1], 1ll * Mat[i][i] * p[i - 1][j] % MOD);
            for(int j = 1; j <= i - 1; j ++) {
                long long mul = Mat[i - j][i];
                for(int k = i - j + 1; k <= i; k ++)
                    mul = mul * Mat[k][k - 1] % MOD;
                for(int k = 0; k <= i; k ++)
                    p[i][k] = Minus(p[i][k], p[i - j - 1][k] * mul % MOD);
            }
        }
        vector<int> res(n + 1);
        for(int i = 0; i <= n; i ++)
            res[i] = p[n][i];
        return res;
    }
}

标签:mathbf,ddots,int,多项式,Hessenberg,笔记,学习,beta,lambda
From: https://www.cnblogs.com/313la/p/18010414

相关文章

  • 机器学习之最小二乘法
    最小二乘法概述最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能......
  • 读千脑智能笔记07_人工智能的未来(中)
    1.      机器智能的未来1.1.        没有任何技术原因阻止我们创造智能机器1.1.1.          障碍在于我们缺乏对智能的理解,也不知道产生智能所需的机制1.2.        历史表明,我们无法预测将推动机器智能向前发展的技术进步1.2.1.    ......
  • 树链剖分学习笔记
    树链剖分,计算机术语,指一种对树进行划分的算法,它先通过轻重边剖分将树分为多条链,保证每个点属于且只属于一条链,然后再通过数据结构(树状数组、BST、SPLAY、线段树等)来维护每一条链。——百度百科重链剖分概念1重儿子一个父节点的所有儿子中,子树节点最大(siz最大)的节点。记......
  • 机器学习如何改变缺陷检测的格局?
    机器学习在缺陷检测中扮演着重要的角色,它能够通过自动学习和识别各种缺陷的模式和特征,改变缺陷检测的格局。以下是机器学习在缺陷检测中的一些应用和优势:自动化检测:机器学习技术可以自动化处理大量的数据,通过学习和识别缺陷的模式和特征,实现自动化检测。这大大提高了缺陷检测的......
  • 【CPL-2023】W14笔记-程序结果、预处理与I/O
    有趣的预编译编写大型程序头文件:变量的声明,函数的声明,宏的定义,预编译指令include库函数include<xx.h>找库函数的路径include自己的头文件include"xx.h",先找当前目录gcc--verbosemain.cgcc-I.include当前目录头文件的重复包含标准头文件结构#ifndef......
  • docker学习的时候敲的历史命令。两百多条
    sudoaptlist|grep-idockercurlhttps://registry-1.docker.io/v2/sudodockerstatussudodockerstatssudodockerpssudodockerps-asudodockerstartebb9831a05fdsudodockerpssudodockerstopebb9831a05fdsudodockerps-asudodockerrun-d......
  • 洛谷P3455 笔记
    传送门又是一道看了tj的题。题意\(t\)次询问,每次询问给定\(n\),\(m\),\(k\),求\(\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=k]\)。\(1\let\le5\times10^4\),\(1\lek\len\),\(m\le5\times10^4\)正文把\(k\)扔到上界去,记原式变为\(\sum_{i=1}^{\lfloor\frac{n}{k}......
  • DVB-S学习记录之信道编码
    经过信源编码和系统复接后生成的节目传送码流,通常需要通过某种传输媒介才能到达用户接收机。通常情况下,编码码流并不能直接通过信道传输,必须经过信道编码后,使其变成适合在信道中传输的形式后再进行传输。DVB-S的信道编码主要包括扰码R-S编码卷积交织卷积编码扰码数字通......
  • 2024/2/7学习进度笔记
    为什么要用非线性函数要解释这个问题,可以反过来思考一下,为什么激活函数不能使用线性函数。如果使用线性函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。加深神经网络的层数就没有什么意义了。线性函数的问题在于不管加深层数到多少,总是存在......
  • Go语言精进之路读书笔记第19条——理解Go语言表达式的求值顺序
    第19条了解Go语言控制语句惯用法及使用注意事项19.1使用if控制语句时应遵循"快乐路径"原则当出现错误时,快速返回;成功逻辑不要嵌入if-else语句中;"快乐路径"当执行逻辑中代码布局上始终靠左,这样读者可以一眼看到该函数当正常逻辑流程;"快乐路径"的返回值一般在函数最后一行。......