200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 矩阵行列式计算

矩阵行列式计算

时间:2023-10-28 11:14:20

相关推荐

矩阵行列式计算

矩阵行列式计算

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

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

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

/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;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。