02.2 行列式
行列式(determinant,字面意思是“决定因素”)是一个标量函数,将一个 n 阶方阵映射为一个数。方阵 A 的行列式记为 \det A 或者 |A|。
定义
定义动机
行列式有若干个定义动机。
几何上,若把方阵 A 视为 n 个列向量拼成的向量组,则 \det A 描述了这 n 个列向量构成的高维“平行六面体”的体积;若把 A 视为 n 维空间上的线性变换,则 \det A 描述了变换的体积。
代数上,n 元、n 个线性方程组有唯一解,可以用一个通式表示,这个通式由 Cramer 法则给出,Cramer 法则包含了行列式。
定义1:逆序数
在 n 个数的排列 (a_1, \dots, a_n) 中(假定各个数互不相同),逆序对(inversion)指的是内部和递增顺序相反的一对数 (a_i, a_j),也就是满足 i < j 且 a_i > a_j 的数对。一个排列的逆序对数称为这个排列的逆序数(inversion number),记为 \tau(a_1, \dots, a_n)。
在逆序数的基础上,定义逆序数为奇数的排列为奇排列,逆序数为偶数的排列为偶排列。
最终,n 阶行列式的定义如下,一个矩阵所有取自不同行不同列的乘积,按行递增的顺序可以排成:
的形式,将它们按列排列的奇偶性赋予符号:当 j_1, \dots, j_n 是奇排列时,赋予负号;当 j_1 \dots, j_n 是偶排列时,赋予正号;再将所有带符号的乘积加起来,其结果称为所有乘积的代数和,并定义为行列式的值:
定义2:递归按行展开
首先定义 1 阶行列式的值就是矩阵唯一元素本身:
由此还可以看出行列式符号 |(a_{11})| 和绝对值符号(以及复数、向量的模)具有不同意义,不能混淆。
然后定义 n 阶行列式的值为其按第一行展开。
定义3:公理化定义
行列式也可以给出公理化定义。设 c_1, c_2, \dots, c_n, c_n' \in \mathbb{F}^n(列向量),而 e_1, e_2, \dots, e_n 为 n 维标准基 (1, 0, \dots, 0), (0, 1, \dots, 0), \dots, (0, \dots, 0, 1),定义行列式为 n 个 n 维列向量到一个数的映射 \det,满足三条性质:
- 可加性:\det(c_1, \dots, c_n) + \det(c_1, \dots, c_n') = \det(c_1, \dots, c_n + c_n');
- 反交换律:\det(c_1, \dots, c_i, c_j, \dots, c_n ) = -\det(c_1, \dots, c_j, c_i, \dots, c_n );
- 归一性:\det(e_1, \dots, e_n) = 1。
讨论
行列式的定义 1 和定义 2 只使用了加法和乘法,故可以看出行列式只需要定义在一个交换环上。交换环对行列式封闭。
性质
- 转置不改变行列式的值;
- 可以提出一行或一列的公因子,不改变行列式的值;
- 对任意一行或一列有可加性;
- 若两行或两列成比例,行列式为 0;
- 将一行(或一列)的 k 倍加到另一行(或一列)上,行列式的值不变;
- 交换两行,行列式反号。
Gauss 消元法计算行列式
C++ 代码参考:Gauss 消元法(初等变换法)
按 Gauss 消元法计算行列式,能够以时间复杂度 O(n^3) 的代价算出一个 n 阶行列式,效率比按逆序数定义计算或按第一行递归展开快得多。
方法:先令 k = 1,令变量 s = 1 记录行列式的系数,循环以下步骤直到 k > n:
- 若第 k 行全为 0,返回行列式的值为 0,跳出循环;否则,继续下一步。
- 若 a_{kk} = 0,找到同行的一个非零数 a_{kj},交换 k, j 列,s 反号;
- 此时 a_{kk} 非零,循环令 i = k + 1, \dots, n:
- 将第 k 行的 -a_{ik} / a_{kk} 倍加到第 i 行,此时 a_{ik} = 0;
- 令 k = k + 1。 循环结束后,行列式的值即为 s a_{11} \cdots a_{nn}。
实际手工计算中,可以适当地提取公因数,或者一行同乘一个数消掉分母,简化计算。
以上算法的计算过程中出现了除法,适用于浮点数矩阵的行列式计算;若引入适当的分数计算库,也适用于有理数矩阵的计算。
但是,根据行列式的逆序数定义或递归定义,整数行列式的值必定为整数,以上算法会出现浮点误差。此时可以使用 s 记录系数的分母,改变内层循环为:令第 i 行乘上 a_{kk} 倍,并令 s = s \cdot a_{kk},再将第 k 行的 -a_{ik} 倍加到第 i 行。这样在运算过程中行列式将一直是整数,循环结束后行列式的值为 a_{11} \cdots a_{nn} / s,且最后的除法一定可以整除。
读完了,有什么想法?
阅读已保存的问答示例,并循着引用回到原文。