矩阵行列式计算

来源:互联网 发布:小筱邸数据 编辑:程序博客网 时间:2024/04/30 07:16

矩阵行列式计算

要求矩阵行列式,需要通过初等变换使得矩阵变为三角矩阵,然后对角线元素之积就是矩阵行列式的值。但是一般的初等变换可能导致浮点数的产生从而影响精度。因此这里使用辗转相除法进行初等变换。

本算法是将其转化为上三角矩阵。因此从第一行开始,处理第 i行 时,要将第 (i+1) 行到第 n 行的第 i 列的元素转化为 0 ,这样处理完成后就是上三角矩阵了。

对于第 i 行,处理第 j 行时,考虑两个元素 aiiaji ,我们需要将 aji 转化为 0 ,对于两个数进行辗转相除后我们可以将一个元素转化为零,另一个元素转化为非零。每一次辗转相除会导致矩阵的两行发生交换,根据矩阵行列式性质,每次操作结束后 ret=ret

http://blog.csdn.net/zhoufenqin/article/details/7779707

本题多了个取模的部分。。。

#include<bits/stdc++.h>using namespace std;typedef long long ll;int n;ll mod;ll a[207][207];ll getRet(){    ll ret=1;    for(int i=0;i<n;i++)    {        if(a[i][i]<0)        {            ret=-ret;            for(int k=i;k<n;k++)    a[i][k]=-a[i][k];        }        for(int j=i+1;j<n;j++)        {            for(int k=i;k<n;k++)    a[i][k]%=mod,a[j][k]%=mod;            while(a[j][i])            {                if(a[j][i]<0)                {                    ret=-ret;                    for(int k=i;k<n;k++)    a[j][k]=-a[j][k];                }                ll t=a[i][i]/a[j][i];                for(int k=i;k<n;k++)    a[i][k]=(a[i][k]-t*a[j][k])%mod;                for(int k=i;k<n;k++)    swap(a[i][k],a[j][k]);                ret=-ret;            }        }        if(a[i][i]==0)  return 0;        ret=ret*a[i][i]%mod;    }    return (ret+mod)%mod;}int main(){    ios::sync_with_stdio(false);cin.tie(0);    while(cin>>n>>mod)    {        for(int i=0;i<n;i++)        for(int j=0;j<n;j++)    cin>>a[i][j];        cout<<getRet()<<endl;    }    return 0;}
0 0