[笔记]行列式

news/2024/11/28 21:25:33/文章来源:https://www.cnblogs.com/Link-Cut-Y/p/18575227

本文部分内容来自《高等代数》。


行列式定义

对于一个 \(n\) 阶行列式

\[A_{n \times n}= \begin{vmatrix} a_{11}& a_{12}& \cdots & a_{1n} \\ a_{21}& a_{22}& \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1}& a_{n2}& \cdots & a_{nn} \end{vmatrix}\]

其结果为所有不同行不同列的元素乘积的代数和。用数学语言写为:

\[\sum_{j_1j_2 \cdots j_n} (-1) ^ {\tau(j_1j_2\cdots j_n)} a_{1j_1}a_{2j_2}\cdots a_{nj_n} \]

其中 \(j_1j_2 \cdots j_n\)\(1 \sim n\) 的一个排列。\(\tau(j_1j_2 \cdots j_n)\) 表示排列 \(j\) 的逆序数的个数。

可以看出,如果 \(\tau(j_1 \sim j_n)\) 为偶数,那么该排列对答案的贡献为正。否则为负。

行列式性质

《高代》里原本有七条性质,这里只证明有用的五条。

  • 性质一:行列式转置后值不变。即:

\[\begin{vmatrix} a_{11}& a_{12}& \cdots & a_{1n} \\ a_{21}& a_{22}& \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1}& a_{n2}& \cdots & a_{nn} \end{vmatrix} = \begin{vmatrix} a_{11}& a_{21}& \cdots & a_{n1} \\ a_{12}& a_{22}& \cdots & a_{n2} \\ \vdots & \vdots & \ddots & \vdots \\ a_{1n}& a_{2n}& \cdots & a_{nn} \end{vmatrix} \]

  • 性质二:行列式内某一行的公因子可以提出。

\[\begin{vmatrix} a_{11}& a_{12}& \cdots & a_{1n} \\ a_{21}& a_{22}& \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ ka_{i1} & ka_{i2} & \cdots & ka_{in}\\ a_{n1}& a_{n2}& \cdots & a_{nn} \end{vmatrix} = k \begin{vmatrix} a_{11}& a_{12}& \cdots & a_{1n} \\ a_{21}& a_{22}& \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{i1} & a_{i2} & \cdots & a_{in}\\ a_{n1}& a_{n2}& \cdots & a_{nn} \end{vmatrix} \]

证明:

首先考虑 \(n\) 级行列式的 \(n!\) 项。如果把他们分成 \(n\) 组,一定有一种方案,使得第 \(1\) 组中都含有 \(a_{i1}\),第 \(2\) 组中都含有 \(a_{i2}\),以此类推。如果第 \(j\) 项提出 \(a_{ij}\) 后记作 \(A_{ij}\),那么有

\[\begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix}\]

\[= a_{i1}A_{i1} + a_{i2}A_{i2} + \cdots + a_{in}A_{in} = \sum_{j = 1}^{n} a_{ij}A_{ij} \]

这将方便我们后面的讨论。

现在证明性质二:

\[\begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n}\\a_{21} & a_{22} & \cdots & a_{2n}\\ \vdots & \vdots & & \vdots \\ ka_{i1} & ka_{i2} & \cdots & ka_{in}\\ a_{n1}& a_{n2} & \cdots & a_{nn} \end{vmatrix}\]

\[= ka_{i1}A_{i1} + ka_{i2}A_{i2} + \cdots + ka_{in}A_{in} \]

\[= k(a_{i1}A_{i1} + a_{i2}A_{i2} + \cdots + a_{in}A_{in}) \]

\[= k \begin{vmatrix}a_{11}& a_{12} & \cdots & a_{1n} \\ a_{21}& a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{i1} & a_{i2} & \cdots & a_{in} \\ a_{n1}& a_{n2}& \cdots & a_{nn} \end{vmatrix}\]

  • 性质三:

\[\begin{vmatrix} a_{11}& a_{12}& \cdots & a_{1n} \\ a_{21}& a_{22}& \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ b_1 + c_1 & b_2 + c_2 & \cdots & b_n + c_n \\a_{n1}& a_{n2}& \cdots & a_{nn} \end{vmatrix} \]

\[= \begin{vmatrix} a_{11}& a_{12}& \cdots & a_{1n} \\ a_{21}& a_{22}& \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ b_1 & b_2 & \cdots & b_n \\a_{n1}& a_{n2}& \cdots & a_{nn} \end{vmatrix} + \begin{vmatrix} a_{11}& a_{12}& \cdots & a_{1n} \\ a_{21}& a_{22}& \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ c_1 & c_2 & \cdots & c_n \\a_{n1}& a_{n2}& \cdots & a_{nn} \end{vmatrix} \]

证明:

原行列式可写成 \((b_1 + c_1)A_{i1} + (b_2 + c_2)A_{i2} + \cdots + (b_n + c_n)A_{in}\),这等于右式。

  • 性质四:把第 \(k\) 行的倍数加到第 \(i\) 行,行列式不变。

证明太容易而公式又太难打,就不写了。

  • 性质五:对调行列式的两行,行列式反号。

证明:

\[\begin{vmatrix} a_{11}& a_{12}& \cdots & a_{1n} \\ a_{21}& a_{22}& \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{i1} & a_{i2} & \cdots & a_{in} \\\vdots & \vdots & &\vdots \\a_{k1} & a_{k2} & \cdots &a_{kn} \\\vdots & \vdots & &\vdots \\a_{n1}& a_{n2}& \cdots & a_{nn} \end{vmatrix}\]

\[ = \begin{vmatrix} a_{11}& a_{12}& \cdots & a_{1n} \\ a_{21}& a_{22}& \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{i1} + a_{k1}& a_{i2} + a_{k2}& \cdots & a_{in} + a_{kn}\\\vdots & \vdots & &\vdots \\a_{k1} & a_{k2} & \cdots &a_{kn} \\\vdots & \vdots & &\vdots \\a_{n1}& a_{n2}& \cdots & a_{nn} \end{vmatrix}\]

\[= \begin{vmatrix} a_{11}& a_{12}& \cdots & a_{1n} \\ a_{21}& a_{22}& \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{i1} + a_{k1}& a_{i2} + a_{k2}& \cdots & a_{in} + a_{kn}\\\vdots & \vdots & &\vdots \\-a_{i1} & -a_{i2} & \cdots & -a_{in} \\\vdots & \vdots & &\vdots \\a_{n1}& a_{n2}& \cdots & a_{nn} \end{vmatrix}\]

\[= \begin{vmatrix} a_{11}& a_{12}& \cdots & a_{1n} \\ a_{21}& a_{22}& \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{k1} & a_{k2} & \cdots & a_{kn}\\\vdots & \vdots & &\vdots \\-a_{i1} & -a_{i2} & \cdots & -a_{in} \\\vdots & \vdots & &\vdots \\a_{n1}& a_{n2}& \cdots & a_{nn} \end{vmatrix}\]

\[= - \begin{vmatrix} a_{11}& a_{12}& \cdots & a_{1n} \\ a_{21}& a_{22}& \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{k1} & a_{k2} & \cdots & a_{kn}\\\vdots & \vdots & &\vdots \\a_{i1} & a_{i2} & \cdots & a_{in} \\\vdots & \vdots & &\vdots \\a_{n1}& a_{n2}& \cdots & a_{nn} \end{vmatrix} \]

其中第一步是利用性质四,将第 \(k\) 行加到了第 \(i\) 行上。

第二步是利用性质四,将第 \(i\) 行减去第 \(k\) 行。

第三步是利用性质四,将第 \(i\) 行加到了第 \(k\) 行上。

最后一步是利用性质二,将第 \(i\) 行提出 \(-1\)

证毕。

特殊的行列式

  1. 对角行列式

形如
\(\begin{vmatrix} a_{11} & 0 & \cdots & 0 \\ 0 & a_{22} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & a_{nn} \end{vmatrix}\)
的行列式称为对角行列式。其结果为 \(a_{11} \times a_{22} \cdots a_{nn}\)

  1. 三角行列式

形如 \(\begin{vmatrix}a_{11} & a_{12} & \cdots & a_{1n} \\0 & a_{22} & \cdots & a_{2n} \\\vdots & \vdots & & \vdots \\0 & 0 & 0 & a_{nn} \\ \end{vmatrix}\) 的行列式被称为三角行列式,其结果与对角行列式相同。

行列式计算

显然,如果按照定义,我们需要 \(O(n \times n!)\) 的复杂度。显然无法接受。

由于存在一些特殊的行列式,可以考虑将原行列式转化为三角行列式后求值。思路就是将原行列式利用性质一到四进行转化。

例如有行列式 \(\begin{vmatrix}2 & 3 & 5 \\3 & 4 & 7 \\4 & 3 & 2 \end{vmatrix}\),首先可以将 \(2 \sim 3\) 行分别加上第一行的 \(-\dfrac{3}{2}, -2\) 倍,化为 \(\begin{vmatrix}2 & 3 & 5 \\0 & -\dfrac{1}{2} & -\dfrac{1}{2} \\0 & -3 & -8 \end{vmatrix}\)

接下来,把第三行加上第二行的 \(-6\) 倍,可得 \(\begin{vmatrix}2 & 3 & 5 \\0 & -\dfrac{1}{2} & -\dfrac{1}{2} \\0 & 0 & -5 \end{vmatrix}\)

于是原式化为了一个三角行列式。对角线乘积即为答案 \(5\)

这个方法类似高斯消元的过程。因此就把它叫做高斯消元吧。

可以看出,这个方法的时间复杂度是 \(O(n ^ 3)\) 的,完全可以接受。

带模数行列式计算

如果带模数怎么算行列式的值呢?

有一种方法叫做辗转相减法,可以完美的解决这个问题。

比如有行列式 \(\begin{vmatrix}3 & 2\\4 & 1 \end{vmatrix}\),首先先用第二行的第一个数除以第一行第一个数,得到 \(1\)。(这里是下取整)。

然后用第二行减去第一行 \(\times 1\),得到 \(\begin{vmatrix}3 & 2\\1 & -1 \end{vmatrix}\)

容易证明第二行第一个数在操作完之后一定小于第一行第一个数。因此交换 \(1, 2\) 行,得到 \(-\begin{vmatrix}1 & -1\\3 & 2 \end{vmatrix}\)

重复上述操作,直到第一行为 \(0\)。得到这样的行列式:\(\begin{vmatrix}0 & 5\\1 & -1 \end{vmatrix}\)

最后再把一、二行交换即可得到下三角行列式:

\[-\begin{vmatrix}1 & -1\\0 & 5 \end{vmatrix}\]

答案即为 \(-5\)

由于在辗转相减的过程中可以取模,所以这个问题就被完美解决了。

分析一下复杂度。易证辗转相减的复杂度与欧几里得算法类似,为 \(O(\log n)\) 级别。如果记交换两行复杂度为 \(O(n)\),那么总复杂度就为 \(O(n ^ 2(\log n + n))\)

注意:两行交换时千万别忘变号!!!

代码

#include <algorithm>
#include <cstdio>
#define int long longusing namespace std;const int N = 610;
int n, p, w[N][N], f;
void Swap(int &a, int &b) {for (int i = 1; i <= n; i ++ )swap(w[a][i], w[b][i]);f ^= 1; // 变号
}
int gauss() {for (int i = 1; i <= n; i ++ )for (int j = i + 1; j <= n; j ++ ) {while (w[i][i]) {int K = (int)w[j][i] / w[i][i];for (int k = i; k <= n; k ++ )((w[j][k] -= K * w[i][k] % p) += p) %= p;Swap(i, j);} Swap(i, j);}int ans = 1;for (int i = 1; i <= n; i ++ )(ans *= w[i][i]) %= p;return (f ? (-ans + p) % p : (ans + p) % p);
}signed main() {scanf("%lld%lld", &n, &p);for (int i = 1; i <= n; i ++ )for (int j = 1; j <= n; j ++ )scanf("%lld", &w[i][j]);return 0 & printf("%lld\n", gauss());;
}

本文公式很多,可能有笔误。希望大家可以指出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843083.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java编程】BCEL ClassLoader

BCEL 介绍 BCEL的全名应该是Apache Commons BCEL,属于Apache Commons项目下的一个子项目。Apache Commons大家应该不陌生,反序列化最著名的利用链就是出自于其另一个子项目——Apache Commons Collections。 BCEL库提供了一系列用于分析、创建、修改Java Class文件的API。就…

借助电脑探究双变量函数问题侧记

记录一次借助电脑探究双变量函数问题的全过程前情概要 偶尔看到下面的习题,想到以前自己整理的双变量函数问题,尝试练手时发现,寻找思路不是很简单的问题,探索一番,对整个过程作以记录,成篇为一侧记 . 典型案例 【2025届高三数学月考3第12题】对于函数 \(f(x)=e^x-x^2+a\…

Paypal最新版本 paypal-server-sdk 使用案例(前端 Vue3 + 后端Spring Boot )

背景 在项目中对接Paypal支付,一开始在网上查了好久,发现资料少,而且陈旧,甚至我都没弄清楚我应该哪个SDK。 我到 maven 中央仓库中,搜索 com.paypal.sdk,能查出不少结果,据我所知,至少有三个sdk可以从后端访问到Paypal:paypal-core:非常陈旧,2016年就停止更新了,但…

【java编程】URLClassLoader

从上面我们研究【java编程】双亲委派模式时进行Debug了源代码, 可以发现的是, URLClassLoader是ExtClassLoader && AppClassLoader的父类(不是父亲), public class Launcher {static class ExtClassLoader extends URLClassLoader {}static class AppClassLoader exten…

秒杀系统

前言 秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性能、高一致、高可用的三高系统。而打造并维护一个超大…

.NET周刊【11月第4期 2024-11-24】

国内文章 C# 入门深度学习:万字长文讲解微积分和梯度下降 https://www.cnblogs.com/whuanle/p/18551532 这篇文章主要介绍了使用 C# 进行深度学习的方法,特别是微积分在此领域的应用。作者简要讲解了极限、导数等基本概念,并展示了如何在 C# 中实现这些数学运算,例如将一个…

高级程序语言第九次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C 这个作业要求在哪里:https://edu.cnblogs.com/campus/fzu/2024C/homework/13311 学号:102400204 姓名:刘嘉奕不太理解10题a,b两个题目的要求有何不同,一个把值返回该结构,不运用指针,而b要把值赋给合适…

DataSophon集成StreamPark2.1.5

为DataSophon制作streampark-2.1.5安装包.md 下载并解压streampark 2.1.5安装包 StreamPark官网下载 wget -O /opt/datasophon/DDP/packages/apache-streampark_2.12-2.1.5-incubating-bin.tar.gz https://www.apache.org/dyn/closer.lua/incubator/streampark/2.1.5/apache-s…

以Deformable_DETR为例说明训练过程

以Deformable_DETR为例说明使用服务器训练过程 下载程序文件 根据论文提供的github地址fundamentalvision/Deformable-DETR: Deformable DETR: Deformable Transformers for End-to-End Object Detection.下载zip到本地 租用服务器 在autodl平台租用服务器,申请账号氪金之后去…

Qt VTK加载openfoam计算结果

Qt VTK加载openfoam计算结果.foam文件。#include <QApplication> #include <QDebug> #include "qvtkopenglwidget.h" #include <vtkSmartPointer.h> #include <vtkGenericDataObjectReader.h> #include <vtkPolyDataMapper.h> #includ…

蓝桥3511飞机降落

样例输入 2 3 0 100 10 10 10 10 0 2 20 3 0 10 20 10 10 20 20 10 20 样例输出 YES NO思路: 具体来说,对于每架飞机,有起飞时间(t)、降落时间限制(d)和飞行时长(l)等信息,代码要判断能否按照一定规则安排这些飞机的起降顺序,使得所有飞机都能在其降落时间限制内完成…