Loading

线性代数基础

本文内容非常初等,oiwiki 中有很多优化递推的应用,这里不讲。

基础知识

来不及了,先凑活一下吧。

向量

向量运算

解方程

线性代数很大一部分在干的事就是解方程,对于一个方程组,我们可以写成 \(Ax=b\) 的形式。其中 \(A\) 是系数矩阵,\(x,b\) 是向量。

高斯消元

初等行列变换 把一行的某个倍数加到另一行上。

而我们高斯消元的过程,就是消成上三角矩阵。

线性基

一组线性无关的向量,可以构造出线性空间

异或线性基是比较常考的一个,具体来讲,对于每个 \(2\) 的幂次,记一个数表示这一位的基底。

前缀线性基

图上随机游走

在平面直角坐标系上,有一个神奇的点,一开始在 \((0, 0)\) 。每秒钟这个点都会随机移动:如果它在 \((x, y)\) ,下一秒它在 \((x - 1, y)\) 的概率是 \(p_1\) ,在 \((x, y - 1)\) 的概率是 \(p_2\) ,在 \((x + 1, y)\) 的概率是 \(p_3\) ,在 \((x, y + 1)\) 的概率是 \(p_4\) 。保证 \(p_1 + p_2 + p_3 + p_4 = 1\) ,各次移动互不关联。

求出这个点移动至距离原点距离为大于 \(R\) 的点的期望步数。距离为欧几里得距离。

容易列出方程 \(f_{x,y}=1+\sum_{i=0}^{3}p_if_{x+dx_i,y+dy_i}\)。状态数是 \(O(R^2)\),直接暴力消元是 \(O(R^6)\) 的。

  • band matrix

如果我们按照行列顺序编号,每行有值的部分只能是 \(O(R)\) 的区域(虽然只有四个位置有值)。那么我们可以用一些技巧去消元。

定理 对 band 长度为 \(O(d)\) 的矩阵消元可以在 \(O(nd^2)\) 的时间复杂度内解决。

具体来讲,我们每次消元只往下消 \(d\) 行,往右消 \(2d\) 列,结合代码很好理解。

// Froggy 的实现
void Guass(int n,int band,double *ans){
    for(int i=1;i<=n;++i){
        if(fabs(g[i][i])<eps){
            for(int j=i+1;j<=min(n,i+band);++j){
                if(fabs(g[j][i])>eps){
                    for(int k=i;k<=min(n,i+2*band);++k){  //换元
                        swap(g[i][k],g[j][k]);
                    }
                    break;
                }
            }
        }
        if(fabs(g[i][i])<eps)continue;
        for(int j=i+1;j<=min(i+band,n);++j){          //往下消d行
            double div=g[j][i]/g[i][i];
            for(int k=i;k<=min(i+2*band,n);++k){      //往右消2d列
                g[j][k]-=div*g[i][k];
            }
            g[j][n+1]-=div*g[i][n+1];                 //把最后一列也消一下
        }
    }
    for(int i=n;i>=1;--i){                           //回带求最后答案
        ans[i]=g[i][n+1];
        for(int j=i+1;j<=min(i+2*band,n);++j){
            ans[i]-=g[i][j]*ans[j];
        }
        ans[i]/=g[i][i];
    }
}
  • 主元法

将方程移项,得到:

\[f_{i+1,j}=\frac{f_{i,j}-p_1f_{i-1,j}-p_2f_{i,j-1}-p_4f_{i,j+1}}{p^3} \]

注意到只和 \(<i\) 或者 \(<j\) 的部分有关,故我们可以只设最左侧的点位未知数,然后递推出右侧的点。用最右侧外围一圈的点列方程。这样复杂度是 \(O(R^3)\)

注意每个方程都必须有意义,这样才能保证正确性。

主元法可以用在很多地方,只要存在转移的偏序关系,即可设计主元。

行列式

对于一个 \(n\) 阶矩阵,其行列式被定义为 \(|A|=\prod_{\sigma\in S_n}\text{sgn}(\sigma)\prod a_{i,\sigma_i}\)。其中 \(S_n\) 是所有 \(n\) 阶排列,\(\text{sgn}(\sigma)\)\(-1\)\(\sigma\) 的逆序对数次方。

定理\(i\) 行加上 \(j\) 行的 \(k\) 倍行列式不变,\(i\) 列同理。

将行列式展开,容易得到这样操作会被抵消掉。

定理\(i\) 行乘以 \(k\),行列式的值会乘以 \(k\)

还是根据定义式,第 \(i\) 行的值都会 \(\times k\)

定理 交换两行,行列式取反。

根据逆序对的定义得证。

据此,我们可以使用高斯消元求行列式,将矩阵消成上三角矩阵,对角线上的乘积就是行列式的值。

性质 柯西比内公式:\(|AB|=|A||B|\)

根据高斯消元显然得证。

给定参数 \(q_i,h_i\)。对于一个排列 \(p\) ,定义 \(v(p)=\sum_{i<j}[p_i>p_j]+[p_i+h_i>q_j]\),求有多少个 \(v(p)\) 是偶数。

看到排列、逆序对、奇偶性,就想行列式。然后有一个套路求偶数个数即 \(\frac{(-1)^{v(p)}+1}{2}\)。于是令矩阵 \(A_{i,j}=(-1)^{\sum_{k>i}[j+h_i>q_k]}\) 的行列式即可。

范德蒙德行列式

定义百度

直接记结论 \(\prod_{i\ne j}(x_i-x_j)\)

循环矩阵行列式

定义百度

直接记结论 \(f(x)=\sum_{i=0}^{n-1}a_{i+1}x^i\),则 \(\det A=\prod_{i=0}^{n-1}f(w^i)\),其中 \(w\)\(n\) 阶单位根,可以用原根代替。然后如果 \(n\) 不是 \(2\) 的次幂可以 Chirp Z-transform,但这先咕咕。

矩阵树

矩阵树定理 对于一个无向图 \(G\),它的生成树个数为:度数矩阵减去邻接矩阵删
去第 \(i\)\(i\) 列的行列式。

矩阵树定理的有向形式 对于一个有向图 \(G\),它的以 \(i\) 为根的外向生成树个数为:入度矩阵减去边矩阵删去第 \(i\)\(i\) 列的行列式。类似地,它的以 \(i\) 为根的内向生成树个数为:出度矩阵减去边矩阵删去第 \(i\)\(i\) 列的行列式。

变元矩阵树定理 定义边权为 \(w(u_i,v_i)\),则矩阵树定理求得的是 \(\sum_{T}\prod_{i\in T}w(u_i,v_i)\)

省选联考2020 作业题

肯定先欧拉反演一下,然后就变成了求所有生成树的边权和。将边设为 \((1+w_ix)\),那么我们最后就是要求 \(\prod_{i}(1+w_ix)\)\(x\) 前面的系数。然后只维护一个 \(2\) 阶行列式即可。

伴随矩阵

\(M_{i,j}\) 是去掉 \(i\)\(j\) 列的行列式,称作余子式。\(A_{i,j}=(-1)^{i+j}M_{i,j}\) 是代数余子式。

\(A^{*}\) 是由代数余子式的矩阵,称作伴随矩阵。

定理\(A\) 满秩时 \(A^*=|A|A^{-1}\)

欧拉图相关计数

BEST定理 对于一个出度=入读的有向图,其欧拉路个数为 \(T(x)\prod (deg_u-1)!\),其中 \(T(x)\)\(x\) 的外向树个数。

LGV

对于图 \(G\) 和起点终点集合 \(S,T\)。有 \(S,T\) 组合的不交路径数等于路径条数矩阵的行列式。具体来讲 \(A_{i,j}\) 等于 \(i\to j\) 的路径条数。

posted @ 2023-07-12 17:12  Semsue  阅读(79)  评论(0编辑  收藏  举报
Title