如何解决使用本征求解线性方程模 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 举报,一经查实,本站将立刻删除。