线性代数学习笔记
本文含有较多公式,请耐心等待渲染。
一、向量
定义
有大小、有方向的量称为向量,记为 \(\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\) 的时候,两向量垂直。
计算
对于向量的加法,我们可以类比力的合成,使用三角形公式与平行四边形公式进行计算。
- 平行四边形公式,即若两个向量起点相同,则以两个向量为两边,做出一个平行四边形,他们的和的起点为两个向量的公共起点,终点为平行四边形内不与这两个向量相邻的端点。
- 三角形公式,即对于两个首尾相接的向量,做出一个以两个向量为两边的三角形,它们的和即为第三边。
对于向量的减法,可以类比数的减法,即 \(\boldsymbol a - \boldsymbol b = \boldsymbol a + (-\boldsymbol b)\)。
二、线性代数简介
“线性”的来由
由于一次函数 \(y=kx\) 的函数图像是一条直线,故一次函数又称为线性函数。推广一下,所有类似这种 \(kx\) 乘法的变换都被称为线性变换。
域
简单来说,域是带有符合运算律的加减乘除运算的集合。要求有 \(0,1\),倒数、相反数存在,加、乘满足交换律、结合律、分配律。如有理数域 \(\mathbb{Q}\),实数域 \(\mathbb{R}\)。
域的判定
对于一个集合 \(F\) 和上述运算 \(+\),\(\times\),若 \((F,+,\times)\) 满足以下条件,则称其为一个域。
- 满足交换律,即 \(\forall x,y\in F,x+y=y+x,x\times y = y \times x\)。
- 满足结合律,即 \(\forall x,y,z\in F,x+y+z=x+(y+z),x\times y\times z = x \times (y\times z)\)。
- 满足分配律,即 \(\forall x,y,z\in F,(x+y)\times z = x \times z + y \times z\)。
- 有加法、乘法逆元,即 \(\forall x\in F,\exists (-x) \in F, x + (-x) = 0\),\(\forall x\in F,\exists (x^{-1}),x\times (x^{-1}) = 1\)。
- 有单位元,即 \(\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\) 列,这就是线性变换对应的矩阵了。
三、矩阵
定义
将一些元素排列成若干行,每行放上相同数量的元素,就是一个矩阵。这里说的元素可以是数字,例如以下的矩阵:
矩阵乘法
两个矩阵 \(\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\) 中的元素为:
这就是矩阵乘法的定义。
实现
我们在 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\),他的定义为
矩阵快速幂
对于一个 \(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}\) 写为一个矩阵。
我们想要通过一个矩阵 \(\boldsymbol P\),使得
由于 \(f_{n+1}=f_n+f_{n-1}\),所以说我们要让 \(\boldsymbol P\) 的第一行都为 \(1\)。\(f_n\) 在两个矩阵都出现了,所以直接令 \(\boldsymbol P\) 的第 \(2\) 行、第 \(1\) 列为 \(1\),第 \(2\) 行、第 \(2\) 列为 \(0\) 即可,也就是说
将式子 \((1)\) 无限递归下去,得到我们要求的 \(f_t\)
从特殊到一般
考虑总结出一个通用的递推式。
给定一个线性的递推关系式 \(f_n=\sum\limits_{i=1}^k w_if_{n-i}\),考虑求出这个式子的加速矩阵,其中 \(w_i\) 是一个常量,代表权重。
那么,我们可以用以下这个式子来快速求出答案。

浙公网安备 33010602011771号