高斯消元求解线性方程组
高斯消元将方程组转化为上三角形进行求解
算法:
枚举每一列c:
1. 找到绝对值最大的一行
2. 将该行换到最上面(第一行操作完后不再改变,第二行成为最上面的行,以此类推)
3. 将该行的第一个数变为1
4. 将下面所有行的第c列变为0
// a[N][N]是增广矩阵
int gauss()
{
int c, r;
for (c = 0, r = 0; c < n; c ++ )
{
int t = r;
// 找到绝对值最大的行
for (int i = r; i < n; i ++ )
if (fabs(a[i][c]) > fabs(a[t][c]))
t = i;
// 当前列为0则跳过
if (fabs(a[t][c]) < eps) continue;
// 将绝对值最大的行换到最顶端
for (int i = c; i <= n; i ++ ) swap(a[t][i], a[r][i]);
// 将当前行的首位变成1, 注意是倒着向前更新的
for (int i = n; i >= c; i -- ) a[r][i] /= a[r][c];
// 用当前行将下面所有的列消成0
for (int i = r + 1; i < n; i ++ )
if (fabs(a[i][c]) > eps) // 非零
for (int j = n; j >= c; j -- )
a[i][j] -= a[r][j] * a[i][c];
r++ ;
}
if (r < n)
{
for (int i = r; i < n; i ++ )
if (fabs(a[i][n]) > eps)
return 2; // 无解
return 1; // 有无穷多组解
}
for (int i = n - 1; i >= 0; i -- )
for (int j = i + 1; j < n; j ++ )
a[i][n] -= a[i][j] * a[j][n];
return 0; // 有唯一解
}
高斯消元求解异或线性方程组
int gauss() // 高斯消元,答案存于a[i][n]中,0 <= i < n
{
int c, r;
for (c = 0, r = 0; c < n; c ++ )
{
int t = r;
for (int i = r; i < n; i ++ ) // 找非零行
if (a[i][c])
t = i;
if (!a[t][c]) continue;
// 将非零行换到最顶端
for (int i = c; i <= n; i ++ ) swap(a[r][i], a[t][i]);
// 用当前行将下面所有的列消成0
for (int i = r + 1; i < n; i ++ )
if (a[i][c])
for (int j = n; j >= c; j -- )
a[i][j] ^= a[r][j];
r ++ ;
}
if (r < n)
{
for (int i = r; i < n; i ++ )
if (a[i][n])
return 2; // 无解
return 1; // 有多组解
}
// 有解则进行求解
for (int i = n - 1; i >= 0; i -- )
for (int j = i + 1; j < n; j ++ )
a[i][n] ^= a[i][j] * a[j][n];
return 0; // 有唯一解
}