首页 > 其他分享 >矩阵行列式

矩阵行列式

时间:2023-12-30 16:34:10浏览次数:22  
标签:int 矩阵 ret 行列式 FL mod

定义与形式

给定一个大小为 \(n\times n\) 的矩阵 \(A\),则行列式

\[\det(A)=|A|=\sum_{p} (-1)^{\pi(p)} \prod A_{i,p_i} \]

其中的 \(p\) 是一个 \(1\sim n\) 的排列,\(\pi(p)\) 为排列 \(p\) 的逆序对数。

一些性质

对于矩阵 \(A\) 来说:

  1. 以主对角线为对称轴翻转之后的行列式和 \(A\) 的行列式相同。

    更加形象的说,就是把所有下标的两维坐标翻转一下,从 \((i,j)\) 变为 \((j,i)\)。

    根据这条性质,在之后的描述中我们认为,矩阵 \(A\) 中行具有的性质列也具有(有时候省略的列的读者可自行推导)。

  2. 矩阵的行或列具有线性性

    1. 乘法情况:即 \(A\) 的某一行或某一列乘上 \(v\) 之后的行列式等于 \(v\times \det(A)\)。
    2. 加法情况:即 \(A\) 可以拆成两个矩阵的乘积:两个矩阵的第 \(i\) 行加和等于 \(A\) 的第 \(i\) 行,两矩阵的其他行和 \(A\) 相同。
  3. 交换其任意两行或者任意两列之后,行列式的值乘上了 \(-1\)。

    证明:交换列会使得逆序对数的奇偶改变。再由性质 \(1\),交换行和交换列等价。

  4. 有相同两行或两列的矩阵行列式为 \(0\)。

    证明:\(\det(A)=-\det(A)=0\)。

  5. 把 \(A\) 的第 \(i\) 行乘以 \(v\) 的结果,加到第 \(j\) 行上,行列式结果不变(\(i\not= j\) )。

    根据行的线性性,我们可以把结果拆成两个矩阵结果的加和:

    1. 原矩阵 \(A\)
    2. 第 \(j\) 行等于原来的第 \(i\) 行乘 \(v\),其他行不变的矩阵 \(A'\)。

    其中第 \(2\) 个矩阵根据线性性可以把第 \(j\) 行中的 \(v\) 提取出来。这时根据性质 \(4\) 可得 \(\det(A')=0\)。

  6. 上三角矩阵的行列式即为对角线元素乘积。

    证明:考虑如果 \(p\) 不是一个形如 \(1,2,3,\dots,n\) 的排列,那么必定存在一个位置满足 \(p_i<i\),而这会使得贡献为 \(0\)。

求解方法

有了第 \(5,6\) 条的性质,我们就可以直接使用高斯消元把 \(A\) 消成上三角矩阵然后直接计算了。

代码

模板题链接

#include <bits/stdc++.h>
#define FL(i, a, b) for(int i = (a); i <= (b); ++i)
#define FR(i, a, b) for(int i = (a); i >= (b); --i)
using namespace std;
typedef long long ll;
constexpr int N = 610;
int mod;
namespace Linear{
    int det(int n, int a[][N]){
        int ret = 1;
        FL(i, 1, n){
            FL(j, i + 1, n){
                while(a[i][i]){
                    ll t = a[j][i] / a[i][i];
                    FL(k, i, n) a[j][k] = (a[j][k] + mod - t * a[i][k] % mod) % mod;
                    swap(a[i], a[j]), ret = -ret;
                }
                swap(a[i], a[j]), ret = -ret;
            }
        }
        FL(i, 1, n) ret = (ll)ret * a[i][i] % mod;
        return (ret % mod + mod) % mod;
    }
}
int n, a[N][N];
int main(){
    scanf("%d%d", &n, &mod);
    FL(i, 1, n) FL(j, 1, n) scanf("%d", &a[i][j]);
    printf("%d\n", Linear::det(n, a));
    return 0;
}

标签:int,矩阵,ret,行列式,FL,mod
From: https://www.cnblogs.com/zac2010/p/17936507.html

相关文章

  • Advanced Algebra高等代数 - 多元建模有多个方程(多元线性)组成 - 使用 NumPy 实现 矩
    线性:指多元变量的每一元变量都是1次方(可以将高于1次方的元,以新一元变量代换,求解再做开方运算)将应用问题转化为多个多元线性方程,并成一组;由多元线性方程组抽出增广矩阵,并以“消元法”的策略,步步判断求解;对增广矩阵的多个“方程”应用“行消元法”化简成阶......
  • 旋转矩阵一些用法备忘
    Box_A的旋转角度为a 旋转矩阵为:a) 用于做localToWorld的变换,这个矩阵的col1,col2分别表示模型空间的x轴、y轴坐标b) 求点在世界坐标轴上的投影c)abs(RotA)*rightTopPoint_Local,求Box_A相对世界坐标轴的AABB包围盒halfSize 旋转矩阵的转置矩阵或逆矩阵为:a) 用......
  • 代码随想录day 02 双指针 滑动窗口 螺旋矩阵
    有序数组的平方题目如下:如果是可以使用O(nlogn)或以上复杂度的算法,本题可以简单的先平方一遍,然后使用排序算法就可以了但是要求使用O(n)复杂度的算法,那么我首先想到的是昨天的快慢指针类似的想法:我想先平方一次数组,然后从中间开始排序,如下但是运行之后发现从中间开始进行相邻元......
  • 矩阵秩的公式小结
    文章目录矩阵秩的公式说明公式矩阵秩的公式说明解释下了公式时,注意矩阵的行数列数由三秩相等原理,向量组的秩往往转换为矩阵的秩来研究线性方程组或型方程有解定理等价矩阵同秩转置矩阵同秩秩的定义公式,==若,则=若,则......
  • LY1090 [ 20230220 CQYC模拟赛IX T1 ] 矩阵
    题意给定一个矩阵,你需要支持:循环左移循环右移循环下移循环上移按行置换求逆按列置换求逆Sol前\(4\)个操作是\(trivial\)的。如何处理后两个操作?考虑设一个三元组:\((x,y,A_{xy})\)。每次操作,对于每一个元素都能确定操作后另外某个元素。不难发现后两个操作就......
  • 矩阵乘法和矩阵快速幂
    1机房今天晚上不知道为啥把洛谷也关了,AC自动机没题做了,教练您做的好啊那么就冲一个矩阵乘法和快速幂吧,开了提高OJ之后还有几道需要矩阵乘法的AC自动机没写,后面再冲一下状压虽然已经冲过了矩阵矩阵思想来源于线性方程组如方程组\[\begin{equation}\begin{cases}7x_1+8x_2+9x......
  • Leetcode—矩阵置零
    矩阵置零给定一个mxn的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为0。请使用原地算法。示例1:输入:输入:matrix=[[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]示例2:输入:matrix=[[0,1,2,0],[3,4,5,2],[1,3,1,5]]输出:[[0,0,0,0],[0,4,......
  • 快速幂,快速乘,矩阵乘
    快速幂,快速乘,矩阵乘快速幂计算\(a^n(n\geqslant0)\),一般会对答案取个模例如计算\(5^{11}\),考虑11二进制\((1011)_2\)有\(5^{11}=5^8*5^2*5^1\)将n的二进制中为1的位置对应的a的\(2^k\)次幂相乘就能得到最终结果可以用\(O(\log{n})\)的时间复杂度计算a所有被用到的\(2^k......
  • [LeetCode Hot 100] LeetCode74. 搜索二维矩阵
    题目描述思路:二维矩阵坐标变换+二分查找二维矩阵坐标变换:只要知道二维数组的的行数m和列数n,二维数组的坐标(i,j)可以映射成一维的index=i*n+j;反过来也可以通过一维index反解出二维坐标i=index/n,j=index%n。(n是列数)把二维数组matrix的元素访问抽象成在......
  • PCA(Principal Components Analysis)主成分分析: 一维列向量坐标的变换是左乘变换矩阵
    总结:一维列向量的坐标变换是左乘变换矩阵;一维行向量的坐标系基元变换是右乘变换矩阵;坐标变换坐标变换定义:把一个向量(或一个点)从一个高维(或3D)坐标系,转换到另一个高维(或3D)坐标系去。举个栗子:东北天坐标系上的点A坐标为(1,2,3),通过坐标变换到北西天坐标系,点A......