排列的逆序数

  对于一个排列,如果是从到到尾都是从小到大,那么逆序数(number of permutation inversions)就为0.只要出现一次大的在前,小的在后,逆序数就加一次。逆序数的符号是希腊字母 τ \tau τ,读音为“涛",比如以下排列:
3 , 6 , 5 , 4 , 1 , 2 3,6,5,4,1,2 3,6,5,4,1,2
  它的逆序数是多少呢?把逆序对,写出来:
( 3 , 1 ) , ( 3 , 2 ) ( 6 , 5 ) , ( 6 , 4 ) , ( 6 , 1 ) , ( 6 , 2 ) ( 5 , 4 ) , ( 5 , 1 ) , ( 5 , 2 ) ( 4 , 1 ) , ( 4 , 2 ) (3,1),(3,2)\\ (6,5),(6,4),(6,1),(6,2)\\ (5,4),(5,1),(5,2)\\ (4,1),(4,2)\\ (3,1),(3,2)(6,5),(6,4),(6,1),(6,2)(5,4),(5,1),(5,2)(4,1),(4,2)
  所以逆序数为
τ ( 3 , 6 , 5 , 4 , 1 , 2 ) = 11 \tau(3,6,5,4,1,2)=11 τ(3,6,5,4,1,2)=11
  逆序数为奇数就是奇排列,逆序数为偶数就是偶排列。

行列式定义

  行列式的定义是一个求和,求和的每一项是从矩阵的按顺序从每一列找出不同行的元素连乘起来,他们的行号如果是奇排列就乘以-1,如果是偶排列就不变。行列式的符号是一对竖线,跟绝对值一样,或者用det表示,用数学语言就是这样表示:
∣ A ∣ = d e t ( A ) = ∑ ( − 1 ) τ ( i 1 , ⋯ , i j , ⋯ , i n ) ∏ j = 1 n a i j j |A|=det(A)=\sum(-1)^{\tau(i_1,\cdots,i_j,\cdots,i_n)}\prod_{j=1}^{n}a_{i_jj} ∣A∣=det(A)=∑(−1)τ(i1​,⋯,ij​,⋯,in​)j=1∏n​aij​j​
  比如计算三阶矩阵的行列式,就是这样的:
∣ A ∣ = d e t ( A ) = τ ( 1 , 2 , 3 ) a 11 a 22 a 33 + τ ( 1 , 3 , 2 ) a 11 a 32 a 23 + τ ( 2 , 1 , 3 ) a 21 a 12 a 33 + τ ( 2 , 3 , 1 ) a 21 a 32 a 13 + τ ( 3 , 1 , 2 ) a 31 a 12 a 23 + τ ( 3 , 2 , 1 ) a 31 a 22 a 13 = a 11 a 22 a 33 − a 11 a 32 a 23 − a 21 a 12 a 33 + a 21 a 32 a 13 + a 31 a 12 a 23 − a 31 a 22 a 13 |A_|=det(A)\\=\tau(1,2,3)a_{11}a_{22}a_{33}+\\ \tau(1,3,2)a_{11}a_{32}a_{23}+\\ \tau(2,1,3)a_{21}a_{12}a_{33}+\\ \tau(2,3,1)a_{21}a_{32}a_{13}+\\ \tau(3,1,2)a_{31}a_{12}a_{23}+\\ \tau(3,2,1)a_{31}a_{22}a_{13}\\= a_{11}a_{22}a_{33}\\ -a_{11}a_{32}a_{23}\\ -a_{21}a_{12}a_{33}\\ +a_{21}a_{32}a_{13}\\ +a_{31}a_{12}a_{23}\\ -a_{31}a_{22}a_{13} ∣A∣​=det(A)=τ(1,2,3)a11​a22​a33​+τ(1,3,2)a11​a32​a23​+τ(2,1,3)a21​a12​a33​+τ(2,3,1)a21​a32​a13​+τ(3,1,2)a31​a12​a23​+τ(3,2,1)a31​a22​a13​=a11​a22​a33​−a11​a32​a23​−a21​a12​a33​+a21​a32​a13​+a31​a12​a23​−a31​a22​a13​
  当然也可以按顺序从每行找不同列的元素相乘,结果都是一样的,上面的公式就可以改写为:
∣ A ∣ = d e t ( A ) = ∑ ( − 1 ) τ ( j 1 , ⋯ , j i , ⋯ , j n ) ∏ i = 1 n a i j i |A|=det(A)=\sum(-1)^{\tau(j_1,\cdots,j_i,\cdots,j_n)}\prod_{i=1}^{n}a_{ij_i} ∣A∣=det(A)=∑(−1)τ(j1​,⋯,ji​,⋯,jn​)i=1∏n​aiji​​

Python实现

  按照定义计算行列式,需要求全排列,我在求全排列时,使用了Heap算法,至于Heap算法,可以参考我的博文:全排列Heap算法。全排列求出来了的话,剩余的就简单了,代码如下:

    def determinant_by_permutation(self):import com.youngthing.mathalgorithm.permutations.heap as hpn = len(self.__vectors)array = [i for i in range(n)]permutations = hp.permutations(array)sum = 0for p in permutations:inversions = hp.number_of_inversions(p)item = 1for i in range(n):item *= self.__vectors[i][p[i]]if (inversions & 1) == 0:sum += itemelse:sum -= itemreturn sum

  测试数据:
∣ 1 − 1 − 2 − 3 3 2 1 4 2 1 1 1 6 5 4 3 ∣ = − 28 \begin{vmatrix}1 & -1 & -2 & -3\\ 3 & 2 & 1 & 4\\ 2 & 1 & 1 & 1\\ 6 & 5 & 4 & 3\\ \end{vmatrix}=-28 ​1326​−1215​−2114​−3413​ ​=−28
  对于算法基础不好的人来说,求全排列确实麻烦,所以我接下来要介绍一种递归到 2 × 2 2\times 2 2×2矩阵的行列式算法,实现起来比较容易,链接如下:Chiò算法。

4.1 行列式的定义相关推荐

  1. 方阵求值——上三角行列式、定义(康拓展开求值)

    Problem:求方阵A的值. 设求n*n的矩阵:加法的操作次数为P(n),乘法的操作次数与为M(n). 对于方法1: j1~jn共有n!种选法:j1有n种选法,j2有n-1种选法,-,jn有1种选法 ...

  2. 【高等代数】行列式的定义和性质

    文章目录 逆序数 逆序数的定义 逆序数的一个重要性质 行列式的定义 行列式的性质 逆序数 逆序数的定义 一个排列中的某两个数字,如果前面的数大于后面的数,那么它们就是一个逆序.一个排列中逆序的总数就称 ...

  3. 用行列式的定义方法求解n阶行列式的值(C++)

    用行列式的定义方法求解行列式的值,方法肯定不是最简单的,但是觉得有趣.其中要用到全排列的递归算法.逆序数的算法 #include<iostream> using namespace std ...

  4. 001 线性代数之行列式:定义、逆序数、余子式与代数余子式、n个易算行列式、范德蒙行列式

    001 线性代数之行列式:定义.逆序数.余子式与代数余子式.n个易算行列式.范德蒙行列式

  5. 线性代数学习笔记——第十三讲——行列式的定义

    1. 一.二.三阶行列式的定义 2. n阶行列式任意元素的余子式与代数余子式的定义 3. n阶行列式的定义 4. 行列式按第一行的展开式 5. 二.三阶行列式适合对角线法则(四阶及四阶以上的行列式一般 ...

  6. 线性代数学习笔记——行列式的性质及拉普拉斯定理——2. n阶行列式的定义

    1. 二.三阶行列式的规律观察 2. n阶行列式的定义 3. 行列式与矩阵的区别与联系

  7. (邱维声)高等代数课程笔记:n 阶行列式的定义

    2.2 n 阶行列式的定义 \quad 在 上一节,我们已经定义了 二阶行列式,并根据二阶行列式的特征,抽象出了 n 元排列 的概念.举一个示例,可以看到:二阶行列式可以通过二元排列表示. 例 1: ...

  8. 线性代数 01.01 n阶行列式的定义

    第一章行列式 \color{blue}{第一章 行列式} 主要介绍n阶行列式的定义.性质及计算方法. 主要介绍n阶行列式的定义.性质及计算方法. 介绍用n阶行列式求解n元线性方程组的克拉默(Crame ...

  9. 行列式的定义及简单计算

    行列式是一个数值,虽然形式上看起来比较复杂,比较不象数值: 将行列式可以转化为加减乘除的四则运算,同样也可以将四则运算转换为行列式的形式,这样转化的好处在什么呢,利用行列式的性质对其进行快速计算: 1 ...

最新文章

  1. Android自己定义组件系列【2】——Scroller类
  2. python文件写入字典格式输出_Python把对应格式的csv文件转换成字典类型存储脚本的方法...
  3. CodeForces - 1236D Alice and the Doll(贪心+二分+模拟)
  4. 听一听蚂蚁金服机器学习算法中台周俊谈共享智能技术实践:如何降低数据共享的难度?
  5. wordpress改变ip或域名
  6. flask项目开发中,遇到http 413错误
  7. 玩转Python? 一文总结30种Python的窍门和技巧,不可错过哈!
  8. 网络安全管理实践(第2版)
  9. 7-5 sdut-验证“哥德巴赫猜想” (10 分)(优化素数判断)
  10. Facebook开源项目:我们为什么要用Fresco框架?
  11. 怎么用一个计算机控制两个屏幕,一台电脑带2个显示器,这样操作就对了,双屏显示操作更方便...
  12. 数据库设计其一,前置库的使用场景
  13. REP-0004: 警告:无法打开用户首选项文件
  14. ecshop其他页面判断是智能手机访问也跳转到ECTouch对应手机版页面[有修正]
  15. iOS之AR开发--demo制作篇:图片识别
  16. 81.(cesium之家)cesium修改灰色背景(默认蓝色)
  17. win10可以上网但是网路连接显示小地球-解决办法
  18. 如何查看谷歌网页端保存的密码以及查看xshell连接中的密码
  19. android登录+tomcat服务器
  20. 高效的HPPC java库

热门文章

  1. 2020就业形势报告:计算机相关行业仍是最热,人工智能聚集北上广深
  2. 【JY】推开土木工程振型求解之兰索斯法(Lanczos法)的大门
  3. vi编辑器如何设置行号
  4. 高德地图上添加一个点
  5. delphi透明panel组件或者制作方法
  6. sssssssssssssssssssssssssss
  7. 处理口罩图片数据(yolov5)中碰到的问题(macOS)
  8. 第一章 Xadmin简介
  9. Illustrator CS5扭曲功能初学者必读(2)——宽度工具
  10. 基于Springboot实现OA办公系统