矩阵行列式计算

矩阵行列式计算

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

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

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

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

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

#include
using namespace std;
typedef long long ll;
int n;
ll mod;
ll a[207][207];

ll getRet()
{
    ll ret=1;
    for(int i=0;iif(a[i][i]<0)
        {
            ret=-ret;
            for(int k=i;kfor(int j=i+1;jfor(int k=i;kwhile(a[j][i])
            {
                if(a[j][i]<0)
                {
                    ret=-ret;
                    for(int k=i;kfor(int k=i;kfor(int k=i;kif(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;ifor(int j=0;jcin>>a[i][j];
        cout<return 0;
}

你可能感兴趣的:(模板)