线性代数学习笔记

· · 算法·理论

行列式

定义

对于方阵 A,其行列式用以下方式表示:

\det A=\begin{vmatrix}a_{1,1} &a_{1,2} &\dots & a_{1,n} \\ a_{2,1} &a_{2,2} &\dots & a_{2,n} \\ \vdots &\vdots & \ddots &\vdots \\ a_{n,1} &a_{n,2} &\dots &a_{n,n}\end{vmatrix}

p 为一个排列,\tau(p) 表示 p逆序对个数,则:

\det A=\sum\limits_{p}(-1)^{\tau(p)}\prod\limits_{i=1}^n a_{i,p_i}

行列式表示 nn 维向量形成的有向体积

性质

  1. 行列式中交换两行会使其结果-1
  2. 行列式中将一行乘 k 的结果加到另一行上,结果不变。
  3. 将行列式一行乘 k,其结果也乘 k
  4. 将行列式转置a_{i,j}'=a_{j,i}),结果不变。

求值

如果将通过以上性质,将所有的 a_{i,j}(i>j) 都变成 0,则最终结果为 \prod\limits_{i=1}^n a_{i,i}

这可以用高斯消元进行完成。但是如果模数不是质数,就不能做了。

于是可以用辗转相除法进行代替。

LL solve()
{
    int w=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            while(a[i][i])
            {
                LL D=a[j][i]/a[i][i];
                for(int k=i;k<=n;k++)
                {
                    a[j][k]-=D*a[i][k];
                    a[j][k]%=mod;
                }
                swap(a[i],a[j]); w*=-1;
            }
            swap(a[i],a[j]); w*=-1;
        }
    }
    LL s=w;
    for(int i=1;i<=n;i++)s=s*a[i][i]%mod;
    return (s%mod+mod)%mod;
}

发现每进行两次辗转相除,a_{i,i} 都会减半。所以复杂度均摊 O(n^2\log n+n^3)

矩阵树定理

给定一个无向图,求出它的生成树个数。

A=\begin{pmatrix}a_{1,1} &a_{1,2} &\dots & a_{1,n} \\ a_{2,1} &a_{2,2} &\dots & a_{2,n} \\ \vdots &\vdots & \ddots &\vdots \\ a_{n,1} &a_{n,2} &\dots &a_{n,n}\end{pmatrix}

其中 a_{x,y} 表示 x\longleftrightarrow y 的边数 -1,而 a_{x,x} 表示 x度数

A 去掉k 行和第 k 列得到 A'\det A' 即为答案。(可以证明结果与 k 的选取无关)

如果要边要加权,求出所有生成树边权之积的和,则相当于是加重边

内向树/外向树

如果是求内向树个数,则 a_{x,y} 表示 x\longrightarrow y 的边数 -1a_{x,x} 表示 x出度数。

如果是求外向树个数,则 a_{x,y} 表示 x\longleftarrow y 的边数 -1a_{x,x} 表示 x入度数。

总之无论怎样,每行之和都是 0如果忘记了,可以把两种情况都试一下

特别的,若 rt 为根,则 A 必须删除rt 行和第 rt 列,再计算 \det A'

LGV 引理

\tau(\sigma) 表示排列 \sigma逆序对个数,\omega(P) 表示路径 P边权的乘积。再设 e(a,b) 表示 \sum\limits_{P:a\to b} \omega(P)

在一个有向无环图(DAG)中,有起点 A=\{a_1,a_2,\dots,a_n\},和终点 B=\{b_1,b_2,\dots, b_n\}

对于 A\to Bn 条路经 P=(P_1,P_2,\dots,P_n),其中第 i 条路径从 a_i\to b_{c_i},且所有路径不交(指没有公共点),则将排列 c 记作 \sigma(P)

则有:

\det M=\sum_{P:A\to B}(-1)^{\tau(\sigma(P))} \prod\limits_{i=1}^n \omega(P_i)

其中:

M=\begin{pmatrix}e(1,1) &e(1,2) &\dots & e(1,n) \\ e(2,1) &e(2,2) &\dots & e(2,n) \\ \vdots &\vdots & \ddots &\vdots \\ e(n,1) &e(n,2) &\dots &e(n,n)\end{pmatrix}

注意到,若在一些特殊的图中,仅存在 a_i\to b_i 的不交路径,则 \det M 即为不交路径个数。