LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
solver_groebner.cpp
浏览该文件的文档.
1#include "solver.hpp"
3
4namespace LMCAS {
5namespace {
6using namespace groebner_detail;
7
8std::vector<Poly> convert_polynomials(const std::vector<SymbolicExpr>& expressions,
10 std::vector<Poly> polynomials;
11 for (const auto& expression : expressions) {
12 Poly polynomial = to_poly(expression, context);
13 if (!polynomial.is_zero()) polynomials.push_back(polynomial);
14 }
15 return polynomials;
16}
17
18void extend_basis(std::vector<Poly>& basis, size_t num_vars) {
19 for (auto& polynomial : basis) extend_variables(polynomial, num_vars);
20}
21
22std::vector<SymbolicExpr> reconstruct_basis(
23 const std::vector<Poly>& basis, const PolyContext& context) {
24 std::vector<SymbolicExpr> expressions;
25 for (const auto& polynomial : basis) {
26 expressions.push_back(from_poly_ext(polynomial, context));
27 }
28 return expressions;
29}
30}
31
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);
37 auto basis = convert_polynomials(polynomials, context);
38 extend_basis(basis, context.ext_vars.size());
39 buchberger(basis, context.ext_vars.size());
40 return reconstruct_basis(basis, context);
41}
42
43std::vector<SymbolicExpr> Solver::reduced_groebner_basis(
44 const std::vector<SymbolicExpr>& polynomials,
45 const std::vector<std::string>& variables) {
47 return groebner_detail::reduced_groebner_basis_impl(polynomials, variables, context);
48}
49
51 const std::vector<SymbolicExpr>& polynomials,
52 const std::vector<std::string>& variables, ComputationContext& computation) {
53 PolyContext context(variables, computation);
54 auto basis = convert_polynomials(polynomials, context);
55 extend_basis(basis, context.ext_vars.size());
56 buchberger(basis, context.ext_vars.size());
58 return reconstruct_basis(basis, context);
59}
60
61bool Solver::ideal_membership(const SymbolicExpr& polynomial,
62 const std::vector<SymbolicExpr>& basis,
63 const std::vector<std::string>& variables) {
64 ComputationContext computation;
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();
71}
72
73std::vector<SymbolicExpr> Solver::elimination_ideal(
74 const std::vector<SymbolicExpr>& basis,
75 const std::vector<std::string>& variables,
76 int elim_count)
77{
78 if (elim_count <= 0) {
79 return basis;
80 }
81 if (elim_count >= static_cast<int>(variables.size())) {
82 return {};
83 }
84
85 ComputationContext computation;
86 PolyContext ctx(variables, computation);
87 std::vector<SymbolicExpr> result;
88
89 for (const auto& expr : basis) {
90 Poly p = to_poly(expr, ctx);
91 if (p.is_zero()) continue;
92
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) {
96 if (m[i] != 0) {
97 involves_eliminated = true;
98 break;
99 }
100 }
101 if (involves_eliminated) break;
102 }
103
104 if (!involves_eliminated) {
105 result.push_back(expr);
106 }
107 }
108
109 return result;
110}
111
112}
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)
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 基、线性系统求解。