线性代数学习笔记

本文含有较多公式,请耐心等待渲染。

一、向量

定义

有大小、有方向的称为向量,记为 \(\overrightarrow{a}\)\(\boldsymbol a\),向量可以任意平移。向量以有向线段的方式表示,有向线段有三要素:起点,方向,长度。

有向线段 \(\overrightarrow{AB}\) 的长度称为它的模长,记为 \(|\overrightarrow{AB}|\)。特别的,当模长为 \(0\) 的时候,这个特殊向量称为零向量,零向量的方向是任意的,长度始终为 0。

若两个非零向量 \(\boldsymbol a ,\boldsymbol b\) 方向相同或相反,称这两个向量平行,记作 \(\boldsymbol a \parallel \boldsymbol b\)。对于多个互相平行的向量,我们可以找到一条直线,使得所有向量都能移动到该直线上,所以平行又可以称为共线

若已知两个向量 \(\boldsymbol a,\boldsymbol b\),做 \(\overrightarrow{OA}=\boldsymbol a,\overrightarrow{OB}=\boldsymbol b\)\(\angle AOB\) 即为向量 \(\boldsymbol a, \boldsymbol b\)夹角,记作 \(\langle \boldsymbol a,\boldsymbol b\rangle\)。特别的,当 \(\langle \boldsymbol a,\boldsymbol b\rangle=0\) 的时候,两向量同向,当 \(\langle \boldsymbol a,\boldsymbol b\rangle=\pi\) 的时候,两向量反向,当 \(\langle \boldsymbol a,\boldsymbol b\rangle=\frac \pi2\) 的时候,两向量垂直

计算

对于向量的加法,我们可以类比力的合成,使用三角形公式平行四边形公式进行计算。

  1. 平行四边形公式,即若两个向量起点相同,则以两个向量为两边,做出一个平行四边形,他们的和的起点为两个向量的公共起点,终点为平行四边形内不与这两个向量相邻的端点。
  2. 三角形公式,即对于两个首尾相接的向量,做出一个以两个向量为两边的三角形,它们的和即为第三边。

对于向量的减法,可以类比数的减法,即 \(\boldsymbol a - \boldsymbol b = \boldsymbol a + (-\boldsymbol b)\)

二、线性代数简介

“线性”的来由

由于一次函数 \(y=kx\) 的函数图像是一条直线,故一次函数又称为线性函数。推广一下,所有类似这种 \(kx\) 乘法的变换都被称为线性变换

简单来说,域是带有符合运算律的加减乘除运算的集合。要求有 \(0,1\),倒数、相反数存在,加、乘满足交换律、结合律、分配律。如有理数域 \(\mathbb{Q}\),实数域 \(\mathbb{R}\)

域的判定

对于一个集合 \(F\) 和上述运算 \(+\)\(\times\),若 \((F,+,\times)\) 满足以下条件,则称其为一个域。

  1. 满足交换律,即 \(\forall x,y\in F,x+y=y+x,x\times y = y \times x\)
  2. 满足结合律,即 \(\forall x,y,z\in F,x+y+z=x+(y+z),x\times y\times z = x \times (y\times z)\)
  3. 满足分配律,即 \(\forall x,y,z\in F,(x+y)\times z = x \times z + y \times z\)
  4. 有加法、乘法逆元,即 \(\forall x\in F,\exists (-x) \in F, x + (-x) = 0\)\(\forall x\in F,\exists (x^{-1}),x\times (x^{-1}) = 1\)
  5. 有单位元,即 \(\exists 0,1\in F,\forall x \in F, 0+x = x,1\times x = x\)

线性空间

一般的,一个线性空间 \(V\) 基于一个域 \(\mathbb{F}\) 定义,要求 \(V\) 内有加法运算,且 \(V\) 内的元素可以域 \(\mathbb{F}\) 内的元素相乘,并且满足运算律。

如果 \(V\) 内有加法,域 \(\mathbb{F}\)\(V\) 有乘法,满足以下条件则称 \(V\) 是 F-线性空间: \(V\) 内的加法满足交换律和结合律,有“0”,有“\(−x\)” ,且满足结合律、交换律、分配律。

线性变换

顾名思义,线性变换指一个线性的一个空间到另一个空间的变换。

具体而言,应用这个变换应该有和乘以特定值类似的性质。

也就是上面线性空间的定义中,把乘法换成应用变换。

我们称一个变换 \(f : V \to W\) 是线性的,其中 \(V, W\) 都是 F-线性空间,当且仅当:

  • \(\forall a\in F,v \in V,af(v)=f(av)\)
  • \(\forall u,v\in F,f(u+v)=f(u)+f(v)\)

实际上,乘以一个数也是一个线性变换,平面上或者空间中的绕原点旋转是一个线性变换,针对单一分量的伸缩也是线性变换。

线性变换的复合

类似于函数的复合,我们定义线性变换的复合为先执行一个再执行另一个。容易验证,线性变换的复合结果仍然是线性变换。注意线性变换的复合不满足交换律,而且是从右往左执行

描述线性变换

既然有了线性变换,我们自然会想要讨论如何用尽量少的信息来描述一个线性变换。

我们记单位向量 \(e_i\) 的第 \(i\) 维是 \(1\),其他都是 \(0\)

那么对于每个向量 \(v=\begin{bmatrix}v_1 \\ v_2 \\ \vdots \\ v_m\end{bmatrix}\),就可以表示为 \(v=\sum\limits_{i=1}^mv_ie_i\),那么,对于变换 \(f\) 就有 \(f(v) = \sum\limits_{i=1}^mv_if(e_i)\),这样,我们就用每个 \(e_i\) 的变换结果描述了整个线性变换。

进一步,如果我们在结果线性空间上取单位向量 \(f_j(1\le j\le n)\),那么我们就可以用 \(n\times m\) 个数 \(a_{i,j}\) 表示这个线性变换,即 \(f(e_i)=\sum\limits_{j=1}^na_{i,j}f_j\),我们把所有 \(a_{i,j}\) 写成 \(n\)\(m\) 列,这就是线性变换对应的矩阵了。

三、矩阵

定义

将一些元素排列成若干行,每行放上相同数量的元素,就是一个矩阵。这里说的元素可以是数字,例如以下的矩阵:

\[A = \begin{bmatrix}1&1&4 \\ 5&1&4\end{bmatrix} \]

矩阵乘法

两个矩阵 \(\boldsymbol A,\boldsymbol B\) 能够相乘,当且 \(\boldsymbol A\) 的列数与 \(\boldsymbol B\) 的行数相同。我们设 \(\boldsymbol A\)\(m\times n\) 的矩阵,\(\boldsymbol B\)\(n\times p\) 的矩阵,那么他们的矩阵 \(\boldsymbol C=\boldsymbol A\boldsymbol B\)\(m\times p\) 的。

\(\boldsymbol C\) 中的元素为:

\[\boldsymbol C_{i,j}=\sum\limits_{k=1}^n \boldsymbol A_{i,k}\times \boldsymbol B_{k,j} \]

这就是矩阵乘法的定义。

实现

我们在 OI 中一般使用 \(O(n^3)\) 的算法,即暴力乘法。

for (int i = 1; i <= m; ++i) 
    for (int j = 1; j <= p; ++j) 
        for (int k = 1; k <= n; ++k) 
            c[i][j] += a[i][k] * b[k][j];

实际上,最优的复杂度为 \(O(n^{2.373})\) 左右,但是由于常数很大,一般不这么使用。

矩阵乘法的性质

线性变换不满足交换律,矩阵乘法自然也不满足交换律。

不过,由于 \((AB)C\)\(A(BC)\) 的意义都是按照 \(CBA\) 顺序执行线性变换,矩阵乘法是满足结合律的。

可以发现,矩阵乘列向量与矩阵乘一列的矩阵是一样的,因此列向量可以视为只有一列的矩阵。

单位矩阵

对于 \(n\times m\) 的矩阵,它的单位矩阵大小为 \(m\times m\),对于 \(m\times n\) 的矩阵,它的单位矩阵大小为 \(n\times n\)

也就是说单位矩阵都是正方形的,这是因为只有正方形的矩阵能保证结果和前一个矩阵形状相同。

对于一个单位矩阵 \(\boldsymbol e\),他的定义为

\[\forall i\in[1,n],\boldsymbol e_{i,i}=1 \]

矩阵快速幂

对于一个 \(n\times n\) 的方阵 \(\boldsymbol A\),求 \(\boldsymbol A^k\)

矩阵快速幂与普通的快速幂几乎一样,稍微修改下代码即可通过。

struct M
{
    long long a[MAXN][MAXN] = {{0}, {0}};

    M operator*(M b)
    {
        M tmp;
        for (int i = 1; i <= n; ++i)
        {
            for (int j = 1; j <= n; ++j)
            {
                for (int k = 1; k <= n; ++k)
                {
                    tmp.a[i][j] = ((a[i][k] * b.a[k][j] % MOD) + tmp.a[i][j]) % MOD;
                }
            }
        }
        return tmp;
    }
} G;
M res;
void qp()
{

    for (int i = 1; i <= n; ++i)
    {
        res.a[i][i] = 1;
    }
    while (k)
    {
        if (k & 1)
            res = res * G;
        G = G * G;
        k >>= 1;
    }
}

四、矩阵加速递推

斐波那契数列

斐波那契数列 \(f_n\) 满足 \(f_n=f_{n-1}+f_{n-2}(n>2),f_1=f_2=1\)

我们发现这个递推式是线性的,因此可以使用线性变换描述。

具体的,我们将 \(f_{n+1},f_n\) 写为一个矩阵,将 \(f_n,f_{n-1}\) 写为一个矩阵。

\[\begin{bmatrix}f_{n+1} \\ f_n\end{bmatrix},\begin{bmatrix}f_n \\ f_{n-1}\end{bmatrix} \]

我们想要通过一个矩阵 \(\boldsymbol P\),使得

\[\begin{bmatrix}f_{n+1} \\ f_n\end{bmatrix}=\boldsymbol P\begin{bmatrix}f_n \\ f_{n-1}\end{bmatrix} (1) \]

由于 \(f_{n+1}=f_n+f_{n-1}\),所以说我们要让 \(\boldsymbol P\) 的第一行都为 \(1\)\(f_n\) 在两个矩阵都出现了,所以直接令 \(\boldsymbol P\) 的第 \(2\) 行、第 \(1\) 列为 \(1\),第 \(2\) 行、第 \(2\) 列为 \(0\) 即可,也就是说

\[\boldsymbol P = \begin{bmatrix}1 & 1 \\ 1 & 0\end{bmatrix} \]

将式子 \((1)\) 无限递归下去,得到我们要求的 \(f_t\)

\[\begin{bmatrix}f_{t+1} \\ f_t\end{bmatrix}=\begin{bmatrix}1 & 1 \\ 1 & 0\end{bmatrix}^t\begin{bmatrix}f_{1} \\ f_0\end{bmatrix} \]

从特殊到一般

考虑总结出一个通用的递推式。

给定一个线性的递推关系式 \(f_n=\sum\limits_{i=1}^k w_if_{n-i}\),考虑求出这个式子的加速矩阵,其中 \(w_i\) 是一个常量,代表权重。

那么,我们可以用以下这个式子来快速求出答案。

\[\begin{bmatrix} v_1&v_2&v_3&\cdots&v_k\\ 1 & 0 & 0 & \cdots & 0\\ 0 & 1 & 0 & \cdots & 0\\ \vdots & \vdots & \vdots & \ddots & \vdots\\ 0 & 0 & 0 & \cdots & 1 \end{bmatrix} \begin{bmatrix} a_{n + k - 1}\\ a_{n+k-2}\\ a_{n+k-3}\\ \vdots\\ a_n \end{bmatrix}= \begin{bmatrix} a_{n + k }\\ a_{n+k-1}\\ a_{n+k-2}\\ \vdots\\ a_{n+1} \end{bmatrix} \]

posted @ 2022-09-03 16:29  小蛐蛐awa  阅读(278)  评论(0)    收藏  举报