高斯消元(行列式)

浮点高斯消元:

int gsxy(int n,int m)
{
    int i=1;
    for(int j=1;i<=n && j<=m;j++)
    {
        int x=i;
        for(int k=i+1;k<=n;k++)
            if(!zero(a[k][j]) && fabs(a[k][j])>fabs(a[x][j]))
               x=k;
        if(zero(a[x][j]))continue;
        for(int k=j;k<=m;k++)
            swap(a[i][k],a[x][k]);
        for(int k=1;k<=n;k++)
        {
            if(k==i || zero(a[k][j]))continue;
            double f=a[k][j]/a[i][j];
            for(int l=j;l<=m;l++)
                a[k][l]-=a[i][l]*f;
        }
        for(int k=m;k>=j;k--)
            a[i][k]/=a[i][j];
        i++;
    }
    return i-1;
}

模意义下高斯消元

int gsxy(int n,int m)
{
    int i=1;
    for(int j=1;i<=n && j<=m;++j)
    {
        int x=i;
        for(int k=i+1;k<=n;++k)
            if(a[k][j] && abs(a[k][j])>abs(a[x][j]))
               x=k;
        if(!a[x][j])continue;
        for(int k=j;k<=m;++k)
            swap(a[i][k],a[x][k]);
        for(int k=1;k<=n;++k)
        {
            if(k==i || !a[k][j])continue;
            ll f=a[k][j]*qpow(a[i][j],mod-2)%mod;
            for(int l=j;l<=m;++l)
            {
                a[k][l]-=a[i][l]*f%mod;
                if(a[k][l]<=-mod)a[k][l]%=mod;
                if(a[k][l]<0)a[k][l]+=mod;
            }
        }
        for(int k=m;k>=j;--k)
            (a[i][k]*=qpow(a[i][j],mod-2))%=mod;
        ++i;
    }
    return i-1;
}

整数行列式求值:

ll a[205][205],mod;

ll det(int n)
{
    ll ans=1,f=1;
    for(int i=1; i<=n; i++)
    {
        for(int j=i+1; j<=n; j++)
        {
            int x=i,y=j;
            while(a[y][i])
            {
                ll t=a[x][i]/a[y][i];
                for(int k=i; k<=n; k++)
                    a[x][k]=(a[x][k]-a[y][k]*t%mod)%mod;
                swap(x,y);
            }
            if(x!=i)
            {
                for(int k=1; k<=n; k++)
                    swap(a[i][k],a[j][k]);
                f=-f;
            }
        }
        ans=ans*a[i][i]%mod;
    }
    return (ans*f+mod)%mod;
}

异或消元:

int xorxy(int n,int m)
{
    int i=1;
    for(int j=1; i<=n && j<=m; j++)
    {
        int x=0;
        for(int k=i; k<=n; k++)
            if(b[k][j])
            {
                x=k;
                break;
            }
        if(!x)continue;
        for(int k=j;k<=m;k++)
            swap(b[i][k],b[x][k]);
        for(int k=1;k<=n;k++)
        {
            if(k==i || !b[k][j])continue;
            for(int l=j;l<=m;l++)
                b[k][l]^=b[i][l];
        }
        i++;
    }
    return i-1;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一章 行列式 三点内容。 一、计算。 1、数字型行列式计算用展开公式。注意用技巧多创造0:把某一行的k 倍加到第...
    苏醒7阅读 7,229评论 0 2
  • 数学是计算机技术的基础,线性代数是机器学习和深度学习的基础,了解数据知识最好的方法我觉得是理解概念,数学不只是上学...
    闯王来了要纳粮阅读 23,104评论 2 48
  • 理解矩阵一:转载自:http://blog.csdn.net/myan/article/details/64751...
    jiandanjinxin阅读 5,538评论 1 15
  • 2017年考研数学一大纲原文 考试科目:高等数学、线性代数、概率论与数理统计 考试形式和试卷结构 一、试卷满分及考...
    SheBang_阅读 3,833评论 0 7
  • 作为一个工科的学生,我们长期以来会使用比如像是矩阵以及行列式这些在线性代数上的知识,在这篇文章中,我想来聊一聊这些...
    云时之间阅读 15,404评论 0 11