使用本征求解线性方程模 2

问题描述

我正在尝试使用 Eigen 来求解 GF2 上的方程(即模 2)。

不幸的是,我得到了一些 5x5 矩阵的错误结果(较小的矩阵似乎也有效)。

这是我的代码包括一个演示错误行为的示例:

#include <assert.h>   // assert
#include <stdexcept>  // std::invalid_argument

#include <Eigen/Dense>
#include <Eigen/LU>
#include <iostream>

//////////
// GF 2 //
//////////

/**
 * Enable solving modulo 2,inspired by
 * https://stackoverflow.com/questions/59747377/custom-scalar-type-in-eigen
**/

struct GF2 {
   public:
    bool value;
    GF2() : value(0) {};
    GF2(bool v) : value(v) {};

    GF2 operator-() const { return *this; };

    friend std::ostream &operator<<(std::ostream &out,const GF2 &val) {
        out << val.value << " ";
        return out;
    }

    GF2 &operator+=(const GF2 &rhs) {
        this->value ^= rhs.value;
        return *this;
    }

    GF2 &operator-=(const GF2 &rhs) {
        return *this += rhs;
    }

    GF2 &operator*=(const GF2 &rhs) {
        this->value &= rhs.value;
        return *this;
    }

    GF2 &operator/=(const GF2 &rhs) {
        if (rhs.value == 0) {
            throw std::invalid_argument("Division by zero");
        }
        return *this;
    }

    GF2 operator/(int rhs) {
        if (rhs == 0) {
            throw std::invalid_argument("Division by zero");
        }
        return GF2(this->value);
    }

    operator bool() const {
        return value;
    }

};

bool isfinite(const GF2 &) { return true; }

namespace Eigen {
    template <>
    struct NumTraits<GF2> : NumTraits<bool> {
    // https://eigen.tuxfamily.org/dox/structEigen_1_1NumTraits.html
        enum {
            IsComplex = 0,IsInteger = 0,IsSigned = 0,RequireInitialization = 1,Readcost = 1,Addcost = 3,MulCost = 3
        };
    };
}  // namespace Eigen

//////////////////////
// TYPE DEFinitioNS //
//////////////////////

// GF 2
typedef Eigen::Matrix<GF2,Eigen::Dynamic,Eigen::Dynamic> GF2Matrix;

/////////////////
// SOLVE MOD 2 //
/////////////////

GF2Matrix solve_mod_2_GF2(GF2Matrix A,GF2Matrix b) {
    // https://eigen.tuxfamily.org/dox/group__TutorialLinearalgebra.html
    // householderQr is faster but yields incorrect results in some cases

    auto decomposition = A.fullPivLu();
    std::cout << "LU:" << std::endl << decomposition.matrixLU() << std::endl << std::endl;
    auto x = decomposition.solve(b);

    return x;
}

//////////
// MAIN //
//////////

int main () {
    int n = 5;

    GF2Matrix A(n,n);
    GF2Matrix b(n,1);

    A << 1,1,1;
    b << 1,0;

    std::cout << "A:" << std::endl << A << std::endl;
    std::cout << std::endl;
    std::cout << "b:" << std::endl << b << std::endl;
    std::cout << std::endl;

    auto x = solve_mod_2_GF2(A,b);

    std::cout << "x:" << std::endl << x << std::endl;

    // solution is incorrect,even though Ax=b admits solution
    // x = [0,1]

    return 0;
}

我正在像这样运行我的代码(使用 eigen 3.4):

$ g++ -I./eigen -o my_solve.o -std=c++11 my_solve.cpp && ./my_solve.o 
A:
 1   0   0   0   1 
 0   1   0   0   0 
 1   0   1   1   0 
 0   0   0   1   1 
 1   0   0   1   1 

b:
 1 
 0 
 1 
 0 
 0 

LU:
 1   0   0   0   1 
 0   1   0   0   0 
 1   0   1   1   1 
 0   0   0   1   1 
 1   0   0   1   1 

x:
 1 
 0 
 0 
 1 
 1 

任何想法如何解决这个问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)