您的位置:首页 > 其它

高斯消元

2016-08-15 13:44 141 查看
普通高斯消元:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法