高斯消元

    xiaoxiao2025-09-08  673

    普通高斯消元:

    double a[1005][1005]; double b[1005]; double value[1005]; inline void Swap(int A,int B) { double temp; for(int i=1;i<=N;i++) swap(a[A][i],a[B][i]); swap(b[A],b[B]); } inline int Gauss() { int i,j,k;bool flag; for(i=1;i<=N;i++)//枚举列 { flag=0; for(j=i;j<=M;j++)//从第i行开始,找到一行a[j][i]不为0并交换 if(fabs(a[j][i])>eps) { flag=1; Swap(i,j); break; } if(!flag)//都为0,那么矩阵的秩<N,多解 return 2; for(j=i+1;j<=M;j++) { double temp=a[j][i]/a[i][i]; a[j][i]=0; for(k=i+1;k<=N;k++) a[j][k]-=temp*a[i][k]; b[j]-=temp*b[i]; } //消元 } //搞成上三角 for(i=1;i<=M;i++) { flag=0; for(j=1;j<=N;j++) if(fabs(a[i][j])>eps) flag=1; if(flag==0&&fabs(b[i])>eps) return 0; }//检查无解 0==x for(i=N;i>=1;i--) { for(j=i+1;j<=N;j++) { b[i]=b[i]-a[i][j]*value[j]; a[i][j]=0.0; } value[i]=b[i]/a[i][i]; }//有唯一解,根据算出的值将第i行第i列以后的系数消掉 return 1; } 高斯消元求解异或方程组:

    int a[35][35]; int b[35]; int x[35]; inline void Swap(int A,int B) { double temp; for(int i=1;i<=30;i++) swap(a[A][i],a[B][i]); swap(b[A],b[B]); } inline int Gauss() { int i,j,k;bool flag; for(i=1;i<=30;i++)//枚举列 { flag=0; for(j=i;j<=30;j++)//从第i行开始,找到一行a[j][i]不为0并交换 if(a[j][i]!=0) { flag=1; Swap(i,j); break; } if(!flag)//都为0,那么矩阵的秩<N,多解 return 2; for(j=i+1;j<=30;j++) { if(a[j][i]) { for(k=i;k<=30;k++) a[j][k]^=a[i][k]; b[j]^=b[i]; } } //消元 } //搞成上三角 for(i=1;i<=30;i++) { flag=0; for(j=1;j<=30;j++) if(a[i][j]!=0) flag=1; if(flag==0&&b[i]==1) return 0; }//检查无解 0==x for(i=30;i>=1;i--) { for(j=i+1;j<=30;j++) { b[i]^=(a[i][j]*x[j]); a[i][j]=0; } x[i]=b[i]/a[i][i]; }//有唯一解,根据算出的值将第i行第i列以后的系数消掉 return 1; }

    转载请注明原文地址: https://ju.6miu.com/read-1302438.html
    最新回复(0)