高斯消元解:多元一次方程,多元异或方程

Posted 一只特立独行的猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高斯消元解:多元一次方程,多元异或方程相关的知识,希望对你有一定的参考价值。

多元一次方程

模板题:
多元一次方程
线性代数解多元一次方程,一个小bug卡了半天。。。
思路:
1.在一列中找到绝对值最大的数
2.将该行换到最上面
3.将该行第一个元素变成1
4.消去剩下行的第一个数

#include<iostream>
#include<cmath>

#include<cstdio>

using namespace std;

const double eps = 1e-6;

double arr[105][105];
int n;

// void debug() {
//     for (int i = 0; i < n; i++) {
//         for (int j = 0; j <= n; j++) {
//             cout << arr[i][j] << " ";
//         }
//         cout << endl;
//     }
// }

int gaoss() {
    int c, r;
    for (c = 0, r = 0; c < n; c++) {
        int t = r;
        for (int i = r; i < n; i++) {//找到最大的一行
            if (fabs(arr[i][c]) > fabs(arr[t][c]))
                t = i;
        }
        if (fabs(arr[t][c]) <= eps) continue;//这一行不算入秩
        for (int i = c; i <= n; i++) swap(arr[r][i], arr[t][i]);//将最大值换到最上面
        for (int i = n; i >= c; i--)arr[r][i] /= arr[r][c]; //把最大行的第一个数变成1
        for (int i = r + 1; i < n; i++) {
            if (fabs(arr[i][c]) > eps) {//头值非零
                for (int j = n; j >= c; j--) {
                    arr[i][j] -= arr[i][c] * arr[r][j];
                }
            }
        }
        r++;
    }//行阶梯式转换完成
    // debug();
    if (r < n) {
        for (int i = r; i < n; i++) {
            // cout<<arr[i][n]<<endl;
            if (fabs(arr[i][n]) > eps) {
                return 2;
            }
        }
        return 1;
    }
    for (int i = n - 1; i >= 0; i--) {
        for (int j = i + 1; j < n; j++) {
            arr[i][n] -= arr[i][j] * arr[j][n];
        }
    }
    return 0;
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n + 1; j++) {
            scanf("%lf", &arr[i][j]);
        }
    }
    int t = gaoss();
    if (t == 0) {
        for (int i = 0; i < n; i++)
            printf("%.2f\\n", arr[i][n]);
    }
    else if (t == 1) {
        cout << "Infinite group solutions" << endl;
    }
    else {
        cout << "No solution" << endl;
    }
    return 0;
}

多元异或方程:

思路同上
x^y=z解x的方法是:x^y^y=z^y − − > --> >x=z^y
多元异或方程
代码:

#include<iostream>

using namespace std;

const int N = 1e2 + 5;

int arr[N][N];
int n;

int gauss() {
    int c, r;
    for (c = r = 0; c < n; c++) {
        //化上三角
        int t = r;
        for (int i = r; i < n; i++) {
            if (arr[i][c] > arr[t][c]) t = i;
        }
        if (arr[t][c] == 0) continue;
        for (int i = c; i < n + 1; i++)swap(arr[r][i], arr[t][i]);
        for (int i = r + 1; i < n; i++) {
            if (arr[i][c]) {
                for (int j = c; j < n + 1; j++) {
                    arr[i][j] ^= arr[r][j] ;
                }
            }
        }
        r++;
    }
    if (r < n) {
        for (int i = r; i < n; i++) {
            if (arr[i][n] != 0)
                return 2;
        }
        return 1;
    }
    for (int i = n - 1; i >= 0; i--) {
    //化单位矩阵
        for (int j = i + 1; j < n; j++) {
            arr[i][n] ^= arr[i][j] * arr[j][n];
        }
    }
    return 0;
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n + 1; j++) {
            cin >> arr[i][j];
        }
    }                     
    int k = gauss();
    if (k == 0) {
        for (int i = 0; i < n; i++) {
            cout << arr[i][n] << endl;
        }
    }
    else if (k == 1) {
        cout << "Multiple sets of solutions" << endl;
    }
    else {
        cout << "No solution" << endl;
    }
    return 0;
}

以上是关于高斯消元解:多元一次方程,多元异或方程的主要内容,如果未能解决你的问题,请参考以下文章

884. 高斯消元解异或线性方程组

423. 从英文中重建数字(解方程&高斯消元)

bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)

怎么去解多元一次方程组快

高斯消元解线性方程组(浮点高斯消元模板)

poj1830(高斯消元解mod2方程组)