10 std::vector<Poly> polynomials;
13 if (!polynomial.
is_zero()) polynomials.push_back(polynomial);
25 for (
const auto& polynomial :
basis) {
32std::vector<SymbolicExpr> Solver::groebner_basis(
33 const std::vector<SymbolicExpr>& polynomials,
34 const std::vector<std::string>& variables) {
35 ComputationContext computation;
36 PolyContext
context(variables, computation);
43std::vector<SymbolicExpr> Solver::reduced_groebner_basis(
44 const std::vector<SymbolicExpr>& polynomials,
45 const std::vector<std::string>& variables) {
51 const std::vector<SymbolicExpr>& polynomials,
61bool Solver::ideal_membership(
const SymbolicExpr& polynomial,
62 const std::vector<SymbolicExpr>&
basis,
63 const std::vector<std::string>& variables) {
65 PolyContext
context(variables, computation);
66 auto converted_basis = convert_polynomials(
basis,
context);
67 auto converted = to_poly(polynomial,
context);
68 extend_basis(converted_basis,
context.ext_vars.size());
69 extend_variables(converted,
context.ext_vars.size());
70 return reduce(converted, converted_basis).
is_zero();
73std::vector<SymbolicExpr> Solver::elimination_ideal(
74 const std::vector<SymbolicExpr>&
basis,
75 const std::vector<std::string>& variables,
78 if (elim_count <= 0) {
81 if (elim_count >=
static_cast<int>(variables.size())) {
86 PolyContext ctx(variables, computation);
87 std::vector<SymbolicExpr> result;
89 for (
const auto& expr :
basis) {
91 if (p.is_zero())
continue;
93 bool involves_eliminated =
false;
94 for (
const auto& [m,
c] : p.terms) {
95 for (
int i = 0; i < elim_count && i < static_cast<int>(m.size()); ++i) {
97 involves_eliminated =
true;
101 if (involves_eliminated)
break;
104 if (!involves_eliminated) {
105 result.push_back(expr);
std::vector< Poly > convert_polynomials(const std::vector< SymbolicExpr > &expressions, PolyContext &context)
void extend_basis(std::vector< Poly > &basis, size_t num_vars)
std::vector< SymbolicExpr > reconstruct_basis(const std::vector< Poly > &basis, const PolyContext &context)
Polynomial< Rational > Poly
std::vector< SymbolicExpr > reduced_groebner_basis_impl(const std::vector< SymbolicExpr > &polynomials, const std::vector< std::string > &variables, ComputationContext &context)
void extend_variables(Poly &polynomial, size_t count)
void reduce_basis(std::vector< Poly > &basis)
SymbolicExpr from_poly_ext(const Poly &polynomial, const PolyContext &context)
Poly to_poly(const SymbolicExpr &expression, PolyContext &context)
void buchberger(std::vector< Poly > &basis, size_t num_vars)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const VectorField const VectorField & c
const std::vector< FGLMPoly > & basis
NumberDomainSet expressions()
多项式方程组求解器 Solver,包含 Gröbner 基、线性系统求解。