计算n阶行列式的模板

  之前在学习计数问题的时候也在网上找了很多关于行列式的资料

  但是发现很多地方都只介绍2\3阶的情况

  一些论文介绍的方法又看不懂

  然后就一直耽搁着

  今天恰好出到这样的题目 发现标算的代码简介明了 还挺开心的

function det(a:arr):int64;
var i,j,k:longint;
    t,ans:int64;

begin
    ans:=1;
    for i:=1 to n do
    begin
        for j:=i+1 to n do
        while a[j,i]<>0 do
        begin
            t:=a[i,i] div a[j,i];
            for k:=i to n do a[i,k]:=(a[i,k]-t*a[j,k]) mod p;
            for k:=1 to n do swap(a[i,k],a[j,k]);
            ans:=-ans;
        end;
        if a[i,i] = 0 then exit(0);
        ans:=(ans * a[i,i]) mod p;
    end;
    while ans<0 do inc(ans,p);
    exit(ans);
end;
时间: 2024-10-16 01:15:29

计算n阶行列式的模板的相关文章

n阶行列式

1.首先,在学习n阶行列式定义前,我们先介绍一下排列.逆序数及对换的概念: (1)排列定义:由 1,2,-,n 组成的一个有序数组称为一个 n 级排列(也叫做这 n 个元素的一个全          排列). 例子:所有的 3 级排列: 123     132     213     231     312     321 排列的分类:分为奇排列和偶排列:逆序数是奇数的排列称为奇排列:逆序数是偶数或 0 的排列            称为偶排列 (2)逆序数的定义:在一个排列中,如果一对数的前后

Armadillo之计算矩阵的行列式(determinant)

计算矩阵的行列式很简单,用det方法或是log_det方法 1 det(A) 如果A不是方阵的(square),将抛出std::logic_error异常 例: mat m = "3,2,4;1,-2,3;2,3,2;"; double d = det(m); cout << d << endl; 运行结果是-3 2 log_det(value, sign,A) 文档里推荐当矩阵A比较大时,使用本函数来代替det函数(估计会加快计算速度) det(A)=exp(

行列式(三):n阶行列式

  1.数学定义   n阶行列式定义如下: 2.算法实现 函数名: GetValue() 功能:返回一个行列式的值 Private Function GetValue() Dim gValue As Double Dim tempResultList As New List(Of Array) Dim tempNumArray(RankLength - 1) As Integer '要进行全排列的序列 For i = 0 To RankLength - 1 tempNumArray(i) = i

SPOJ - Find The Determinant III 计算矩阵的行列式答案 + 辗转相除法思想

SPOJ -Find The Determinant III 参考:https://blog.csdn.net/zhoufenqin/article/details/7779707 参考中还有几个关于行列式的性质. 题意: 计算矩阵的行列式答案 思路: 计算行列式的基本方法就是把矩阵化成上三角或下三角,然后观察对角线的元素,如果其中有一个元素为0则答案为0,否则行列式的值就是对角线上各个元素的乘积. #include <algorithm> #include <iterator>

Python 振动分析 迭代法计算高阶特征值及特征向量

参考书 : <<振动分析>> 张准 汪凤泉 编著 东南大学出版社 ISBN 7-80123-583-4 参考章节 : 4.6.2 和 4.6.3 <<数值分析>> 崔瑞彩 谢伟松 天津大学出版社 ISBN 7-5618-1366-X 参考章节 : 3.1 参考资料: <<交替使用幂法和降阶法求解矩阵全部特征值>> 下载地址:https://pan.baidu.com/s/1fmNMnS8zyaMv4B_6jd7rnQ 2018-03-

n阶行列式算法(c程序)

#include<stdio.h> #include<math.h> #define N 100 //N比输入的阶数大即可 int main() {   int n,a[N][N],i,j; void row_col_times(int b[N][N],int n); printf("请输入方阵阶数:\n"); scanf("%d",&n); printf("请输入%d阶的方阵(用空格隔开)\n",n); for(

n阶行列式的全排列求解(Java)

上一个随笔,我介绍了全排列的递归求解,其中还有排列的逆序数等代码,这次我来介绍如何使用全排列计算行列式的值. 使用全排列求行列式的值,简单的描述就是: 对这个行列式每一行选取一个数,这些数处于行列式的不同的列,将这些数相乘,结果记为A_1 将这些数的列标按行标从上到下的顺序排列,如果这个排列的逆序数为偶数,A_1加个正号+A_1,否则加个负号-A_1 由排列组合知识我们知道我们一共能从行列式中取出n!种情况.他们的和就是行列式的值 (刚开始用博客园,没找到插入latex的地方,我就截个图了...

java计算奇数阶魔方阵

一.提出问题 所谓"奇数阶魔方阵"是指n为不小于3的奇数的魔方阵.这类魔方阵的形式多样,这里我们仅讨论其中的一种形式的正规魔方阵.例如:3阶.5阶和7阶的魔方阵如图3 – 4 所示. , , 图3 – 4 3阶5阶和7阶魔方阵 容易知道,这三个魔方阵的魔方常数分别是15.65和175. 现在要求给出:能让计算机自动输出类似图3 – 4 所示的n阶奇数魔方阵的算法,其中n为任意给定的一个不小于3的奇数. 二.简单分析 决定"奇数阶魔方阵"的关键是要按要求决定其方阵中的

C++中计算矩阵的行列式

使用eigen库: 求行列式: #include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; int main() { Matrix2d c; c << 1, 2, 3, 4; //转置.伴随 std::cout<<c<<std::endl<<std::endl; std::cout<<"转置\n&qu