高斯消元

来源:互联网 发布:阿里通信卡的网络2g 编辑:程序博客网 时间:2024/05/01 08:50

普通高斯消元:

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


0 0
原创粉丝点击