LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::groebner_detail 命名空间参考

命名空间

namespace  anonymous_namespace{solver_groebner_basis.cpp}
namespace  anonymous_namespace{solver_groebner_builder.cpp}
namespace  anonymous_namespace{solver_groebner_reconstruction.cpp}

类

struct  MonomialLess
struct  Poly
class  PolyBuilder
struct  PolyContext
struct  SugarPair
struct  Term

类型定义

using Monomial = std::vector<int>
using PolyTerms = std::map<Monomial, Rational, MonomialLess>

函数

Poly add_poly (const Poly &a, const Poly &b)
void align_variables (Poly &a, Poly &b)
void buchberger (std::vector< Poly > &basis, size_t num_vars)
bool chain_criterion (const std::vector< Poly > &basis, size_t i, size_t j, const std::set< std::pair< size_t, size_t > > &processed_pairs)
int compute_spoly_sugar (const Poly &f, const Poly &g)
bool coprime_leading_monomials (const Poly &f, const Poly &g)
Monomial div_mono (const Monomial &numerator, const Monomial &denominator)
bool divides_mono (const Monomial &a, const Monomial &b)
void extend_variables (Poly &polynomial, size_t count)
SymbolicExpr from_poly_ext (const Poly &polynomial, const PolyContext &context)
Monomial lcm_mono (const Monomial &a, const Monomial &b)
Monomial mul_mono (const Monomial &a, const Monomial &b)
Poly mul_poly (const Poly &a, const Poly &b)
Poly mul_poly_term (const Poly &polynomial, const Term &term)
Poly reduce (Poly polynomial, const std::vector< Poly > &basis)
void reduce_basis (std::vector< Poly > &basis)
std::vector< SymbolicExpr > reduced_groebner_basis_impl (const std::vector< SymbolicExpr > &polynomials, const std::vector< std::string > &variables, ComputationContext &context)
Poly s_poly (const Poly &f, const Poly &g)
Poly sub_poly (const Poly &a, const Poly &b)
Poly to_poly (const SymbolicExpr &expression, PolyContext &context)

类说明

◆ LMCAS::groebner_detail::Term

struct LMCAS::groebner_detail::Term

在文件 solver_groebner_internal.hpp 第 22 行定义.

LMCAS::groebner_detail::Term 的协作图:
类成员
Rational coeff
Monomial mono

类型定义说明

◆ Monomial

using LMCAS::groebner_detail::Monomial = std::vector<int>

在文件 solver_groebner_internal.hpp 第 16 行定义.

◆ PolyTerms

在文件 solver_groebner_internal.hpp 第 27 行定义.

函数说明

◆ add_poly()

Poly LMCAS::groebner_detail::add_poly ( const Poly & a,
const Poly & b )

在文件 solver_groebner_poly.cpp 第 72 行定义.

72 {
73 Poly res = a;
74 for (auto const& [m, c] : b.terms) {
75 res.add_term(m, c);
76 }
77 return res;
78 }
const VectorField const VectorField & c
const MultiPoly & b
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a
void add_term(const Monomial &monomial, const Rational &coefficient)

引用了 LMCAS::a, add_poly(), LMCAS::groebner_detail::Poly::add_term(), LMCAS::b , 以及 LMCAS::c.

被这些函数引用 add_poly() , 以及 LMCAS::groebner_detail::PolyBuilder::visit().

函数调用图:
这是这个函数的调用关系图:

◆ align_variables()

void LMCAS::groebner_detail::align_variables ( Poly & a,
Poly & b )

在文件 solver_groebner_poly.cpp 第 218 行定义.

218 {
219 if (a.num_vars < b.num_vars) {
220 extend_variables(a, b.num_vars);
221 } else if (b.num_vars < a.num_vars) {
222 extend_variables(b, a.num_vars);
223 }
224}
void extend_variables(Poly &polynomial, size_t count)

引用了 LMCAS::a, align_variables(), LMCAS::b , 以及 extend_variables().

被这些函数引用 align_variables(), LMCAS::groebner_detail::PolyBuilder::visit() , 以及 LMCAS::groebner_detail::PolyBuilder::visit().

函数调用图:
这是这个函数的调用关系图:

◆ buchberger()

void LMCAS::groebner_detail::buchberger ( std::vector< Poly > & basis,
size_t num_vars )

在文件 solver_groebner_basis.cpp 第 65 行定义.

65 {
66 initialize_sugar(basis);
67 auto pairs = initial_pairs(basis);
68 std::set<std::pair<size_t, size_t>> processed_pairs;
69 while (!pairs.empty()) {
70 auto [i, j, sugar_degree] = pairs.top();
71 pairs.pop();
72 auto canonical_pair = i < j ? std::make_pair(i, j) : std::make_pair(j, i);
73 processed_pairs.insert(canonical_pair);
74 if (coprime_leading_monomials(basis[i], basis[j])) continue;
75 if (chain_criterion(basis, i, j, processed_pairs)) continue;
76 Poly polynomial = s_poly(basis[i], basis[j]);
77 extend_variables(polynomial, num_vars);
78 Poly remainder = reduce(polynomial, basis);
79 if (remainder.is_zero()) continue;
80 remainder.sugar = sugar_degree;
81 size_t new_index = basis.size();
82 basis.push_back(remainder);
83 for (size_t k = 0; k < new_index; ++k) {
84 pairs.push({k, new_index, compute_spoly_sugar(basis[k], basis[new_index])});
85 }
86 }
87}
bool chain_criterion(const std::vector< Poly > &basis, size_t i, size_t j, const std::set< std::pair< size_t, size_t > > &processed_pairs)
bool coprime_leading_monomials(const Poly &f, const Poly &g)
Poly s_poly(const Poly &f, const Poly &g)
Poly reduce(Poly polynomial, const std::vector< Poly > &basis)
int compute_spoly_sugar(const Poly &f, const Poly &g)
const std::vector< FGLMPoly > & basis

引用了 LMCAS::basis, buchberger(), chain_criterion(), compute_spoly_sugar(), coprime_leading_monomials(), extend_variables(), LMCAS::groebner_detail::Poly::is_zero(), reduce(), s_poly() , 以及 LMCAS::groebner_detail::Poly::sugar.

被这些函数引用 buchberger() , 以及 reduced_groebner_basis_impl().

函数调用图:
这是这个函数的调用关系图:

◆ chain_criterion()

bool LMCAS::groebner_detail::chain_criterion ( const std::vector< Poly > & basis,
size_t i,
size_t j,
const std::set< std::pair< size_t, size_t > > & processed_pairs )

在文件 solver_groebner_poly.cpp 第 168 行定义.

169 {
170 Monomial L = lcm_mono(G[i].lead_monomial(), G[j].lead_monomial());
171 for (size_t k = 0; k < G.size(); ++k) {
172 if (k == i || k == j) {
173 continue;
174 }
175 if (G[k].is_zero()) {
176 continue;
177 }
178 if (divides_mono(G[k].lead_monomial(), L)) {
179 auto pair_ik = (i < k) ? std::make_pair(i, k) : std::make_pair(k, i);
180 auto pair_kj = (k < j) ? std::make_pair(k, j) : std::make_pair(j, k);
181 if (processed_pairs.count(pair_ik) && processed_pairs.count(pair_kj)) {
182 return true;
183 }
184 }
185 }
186 return false;
187 }
bool divides_mono(const Monomial &a, const Monomial &b)
Monomial lcm_mono(const Monomial &a, const Monomial &b)

引用了 chain_criterion(), divides_mono() , 以及 lcm_mono().

被这些函数引用 buchberger() , 以及 chain_criterion().

函数调用图:
这是这个函数的调用关系图:

◆ compute_spoly_sugar()

int LMCAS::groebner_detail::compute_spoly_sugar ( const Poly & f,
const Poly & g )

在文件 solver_groebner_poly.cpp 第 189 行定义.

189 {
191
192 int deg_L = 0;
193 for (int e : L) deg_L += e;
194
195 int deg_lm_f = 0;
196 for (int e : f.lead_monomial()) deg_lm_f += e;
197
198 int deg_lm_g = 0;
199 for (int e : g.lead_monomial()) deg_lm_g += e;
200
201 int sugar_f = f.sugar + deg_L - deg_lm_f;
202 int sugar_g = g.sugar + deg_L - deg_lm_g;
203
204 return std::max(sugar_f, sugar_g);
205 }
ExprResult e()

引用了 compute_spoly_sugar(), LMCAS::e(), lcm_mono(), LMCAS::groebner_detail::Poly::lead_monomial() , 以及 LMCAS::groebner_detail::Poly::sugar.

被这些函数引用 buchberger(), compute_spoly_sugar() , 以及 LMCAS::groebner_detail::anonymous_namespace{solver_groebner_basis.cpp}::initial_pairs().

函数调用图:
这是这个函数的调用关系图:

◆ coprime_leading_monomials()

bool LMCAS::groebner_detail::coprime_leading_monomials ( const Poly & f,
const Poly & g )

在文件 solver_groebner_poly.cpp 第 154 行定义.

154 {
155 if (f.is_zero() || g.is_zero()) {
156 return false;
157 }
158 const Monomial& lm_f = f.lead_monomial();
159 const Monomial& lm_g = g.lead_monomial();
160 for (size_t i = 0; i < lm_f.size() && i < lm_g.size(); ++i) {
161 if (lm_f[i] > 0 && lm_g[i] > 0) {
162 return false;
163 }
164 }
165 return true;
166 }
std::vector< int > Monomial
单项式类型,以整数向量表示各变量的指数

引用了 coprime_leading_monomials(), LMCAS::groebner_detail::Poly::is_zero() , 以及 LMCAS::groebner_detail::Poly::lead_monomial().

被这些函数引用 buchberger() , 以及 coprime_leading_monomials().

函数调用图:
这是这个函数的调用关系图:

◆ div_mono()

Monomial LMCAS::groebner_detail::div_mono ( const Monomial & numerator,
const Monomial & denominator )

在文件 solver_groebner_poly.cpp 第 66 行定义.

66 {
67 Monomial res(num.size());
68 for (size_t i = 0; i < num.size(); ++i) res[i] = num[i] - den[i];
69 return res;
70 }
std::shared_ptr< SymbolicExpr > num(int value)

引用了 div_mono() , 以及 LMCAS::polynomial_solver_detail::num().

被这些函数引用 div_mono(), reduce() , 以及 s_poly().

函数调用图:
这是这个函数的调用关系图:

◆ divides_mono()

bool LMCAS::groebner_detail::divides_mono ( const Monomial & a,
const Monomial & b )

在文件 solver_groebner_poly.cpp 第 59 行定义.

59 {
60 for (size_t i = 0; i < a.size(); ++i) {
61 if (a[i] > b[i]) return false;
62 }
63 return true;
64 }

引用了 LMCAS::a, LMCAS::b , 以及 divides_mono().

被这些函数引用 chain_criterion(), divides_mono(), LMCAS::groebner_detail::anonymous_namespace{solver_groebner_basis.cpp}::minimal_basis() , 以及 reduce().

函数调用图:
这是这个函数的调用关系图:

◆ extend_variables()

void LMCAS::groebner_detail::extend_variables ( Poly & polynomial,
size_t count )

在文件 solver_groebner_poly.cpp 第 207 行定义.

207 {
208 if (polynomial.num_vars >= count) return;
209 Poly extended(count);
210 for (const auto& [monomial, coefficient] : polynomial.terms) {
211 Monomial resized = monomial;
212 resized.resize(count, 0);
213 extended.add_term(resized, coefficient);
214 }
215 polynomial = std::move(extended);
216}

引用了 LMCAS::groebner_detail::Poly::add_term(), extend_variables(), LMCAS::groebner_detail::Poly::num_vars , 以及 LMCAS::groebner_detail::Poly::terms.

被这些函数引用 align_variables(), buchberger(), LMCAS::anonymous_namespace{solver_groebner.cpp}::extend_basis(), extend_variables() , 以及 LMCAS::groebner_detail::PolyBuilder::visit().

函数调用图:
这是这个函数的调用关系图:

◆ from_poly_ext()

SymbolicExpr LMCAS::groebner_detail::from_poly_ext ( const Poly & polynomial,
const PolyContext & context )

在文件 solver_groebner_reconstruction.cpp 第 38 行定义.

39 {
40 if (polynomial.terms.empty()) {
42 }
43 std::vector<std::shared_ptr<const SymbolicNode>> terms;
44 for (const auto& [monomial, coefficient] : polynomial.terms) {
45 terms.push_back(term_node(monomial, coefficient, context));
46 }
47 if (terms.size() == 1) return LMCAS::detail::expression_from_node(terms[0]);
49}
static std::shared_ptr< const SymbolicNode > create_add(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建加法节点,自动扁平化嵌套加法并消除零项.
static std::shared_ptr< const SymbolicNode > create_number(const ::LMCAS::BigInt &v)
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context

引用了 LMCAS::context, LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_number(), LMCAS::detail::expression_from_node(), from_poly_ext() , 以及 LMCAS::groebner_detail::Poly::terms.

被这些函数引用 from_poly_ext() , 以及 LMCAS::anonymous_namespace{solver_groebner.cpp}::reconstruct_basis().

函数调用图:
这是这个函数的调用关系图:

◆ lcm_mono()

Monomial LMCAS::groebner_detail::lcm_mono ( const Monomial & a,
const Monomial & b )

在文件 solver_groebner_poly.cpp 第 53 行定义.

53 {
54 Monomial res(a.size());
55 for (size_t i = 0; i < a.size(); ++i) res[i] = std::max(a[i], b[i]);
56 return res;
57 }

引用了 LMCAS::a, LMCAS::b , 以及 lcm_mono().

被这些函数引用 chain_criterion(), compute_spoly_sugar(), lcm_mono() , 以及 s_poly().

函数调用图:
这是这个函数的调用关系图:

◆ mul_mono()

Monomial LMCAS::groebner_detail::mul_mono ( const Monomial & a,
const Monomial & b )

在文件 solver_groebner_poly.cpp 第 47 行定义.

47 {
48 Monomial res(a.size());
49 for (size_t i = 0; i < a.size(); ++i) res[i] = a[i] + b[i];
50 return res;
51 }

引用了 LMCAS::a, LMCAS::b , 以及 mul_mono().

被这些函数引用 mul_mono(), mul_poly() , 以及 mul_poly_term().

函数调用图:
这是这个函数的调用关系图:

◆ mul_poly()

Poly LMCAS::groebner_detail::mul_poly ( const Poly & a,
const Poly & b )

在文件 solver_groebner_poly.cpp 第 99 行定义.

99 {
100 Poly res(a.num_vars);
101 for (auto const& [ma, ca] : a.terms) {
102 for (auto const& [mb, cb] : b.terms) {
103 res.add_term(mul_mono(ma, mb), ca * cb);
104 }
105 }
106 return res;
107 }
Monomial mul_mono(const Monomial &a, const Monomial &b)

引用了 LMCAS::a, LMCAS::groebner_detail::Poly::add_term(), LMCAS::b, mul_mono() , 以及 mul_poly().

被这些函数引用 mul_poly(), LMCAS::groebner_detail::PolyBuilder::visit() , 以及 LMCAS::groebner_detail::PolyBuilder::visit().

函数调用图:
这是这个函数的调用关系图:

◆ mul_poly_term()

Poly LMCAS::groebner_detail::mul_poly_term ( const Poly & polynomial,
const Term & term )

在文件 solver_groebner_poly.cpp 第 90 行定义.

90 {
91 Poly res(p.num_vars);
92 if (t.coeff == Rational(0)) return res;
93 for (auto const& [m, c] : p.terms) {
94 res.add_term(mul_mono(m, t.mono), c * t.coeff);
95 }
96 return res;
97 }
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & t

引用了 LMCAS::groebner_detail::Poly::add_term(), LMCAS::c, mul_mono(), mul_poly_term(), LMCAS::groebner_detail::Poly::num_vars, LMCAS::t , 以及 LMCAS::groebner_detail::Poly::terms.

被这些函数引用 mul_poly_term(), reduce() , 以及 s_poly().

函数调用图:
这是这个函数的调用关系图:

◆ reduce()

Poly LMCAS::groebner_detail::reduce ( Poly polynomial,
const std::vector< Poly > & basis )

在文件 solver_groebner_poly.cpp 第 109 行定义.

109 {
110 Poly r(p.num_vars);
111
112 while (!p.is_zero()) {
113 bool reduced = false;
114 Monomial p_lm = p.lead_monomial();
115
116 for (const auto& g : G) {
117 if (divides_mono(g.lead_monomial(), p_lm)) {
118
119 Term factor;
120 factor.coeff = p.lead_coeff() / g.lead_coeff();
121 factor.mono = div_mono(p_lm, g.lead_monomial());
122
123 Poly term_g = mul_poly_term(g, factor);
124 p = sub_poly(p, term_g);
125 reduced = true;
126 break;
127 }
128 }
129
130 if (!reduced) {
131 Term lt = p.lead_term();
132 r.add_term(lt.mono, lt.coeff);
133
134 p.terms.erase(p.terms.begin());
135 }
136 }
137 return r;
138 }
Monomial div_mono(const Monomial &numerator, const Monomial &denominator)
Poly sub_poly(const Poly &a, const Poly &b)
Poly mul_poly_term(const Poly &polynomial, const Term &term)
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > r
ExprResult lt(const ExprPtr &lhs, const ExprPtr &rhs)

引用了 LMCAS::groebner_detail::Term::coeff, div_mono(), divides_mono(), LMCAS::groebner_detail::Poly::is_zero(), LMCAS::groebner_detail::Poly::lead_coeff(), LMCAS::groebner_detail::Poly::lead_monomial(), LMCAS::groebner_detail::Poly::lead_term(), LMCAS::lt(), LMCAS::groebner_detail::Term::mono, mul_poly_term(), LMCAS::groebner_detail::Poly::num_vars, LMCAS::r, reduce(), sub_poly() , 以及 LMCAS::groebner_detail::Poly::terms.

被这些函数引用 buchberger(), reduce() , 以及 reduce_basis().

函数调用图:
这是这个函数的调用关系图:

◆ reduce_basis()

void LMCAS::groebner_detail::reduce_basis ( std::vector< Poly > & basis)

在文件 solver_groebner_basis.cpp 第 89 行定义.

89 {
90 auto minimal = minimal_basis(basis);
91 for (size_t i = 0; i < minimal.size(); ++i) {
92 std::vector<Poly> others;
93 for (size_t j = 0; j < minimal.size(); ++j) {
94 if (j != i) others.push_back(minimal[j]);
95 }
96 minimal[i] = reduce(minimal[i], others);
97 }
98 std::vector<Poly> reduced;
99 for (const auto& polynomial : minimal) {
100 if (!polynomial.is_zero()) reduced.push_back(polynomial);
101 }
102 for (auto& polynomial : reduced) make_monic(polynomial);
103 basis = std::move(reduced);
104}

引用了 LMCAS::basis, reduce() , 以及 reduce_basis().

被这些函数引用 reduce_basis() , 以及 reduced_groebner_basis_impl().

函数调用图:
这是这个函数的调用关系图:

◆ reduced_groebner_basis_impl()

std::vector< SymbolicExpr > LMCAS::groebner_detail::reduced_groebner_basis_impl ( const std::vector< SymbolicExpr > & polynomials,
const std::vector< std::string > & variables,
ComputationContext & context )

在文件 solver_groebner.cpp 第 50 行定义.

52 {
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}
void reduce_basis(std::vector< Poly > &basis)
void buchberger(std::vector< Poly > &basis, size_t num_vars)

引用了 LMCAS::basis, buchberger(), LMCAS::context , 以及 reduce_basis().

被这些函数引用 LMCAS::anonymous_namespace{solver_groebner_system.cpp}::simplified_basis().

函数调用图:
这是这个函数的调用关系图:

◆ s_poly()

Poly LMCAS::groebner_detail::s_poly ( const Poly & f,
const Poly & g )

在文件 solver_groebner_poly.cpp 第 140 行定义.

140 {
142
143 Term t1;
144 t1.mono = div_mono(L, f.lead_monomial());
145 t1.coeff = Rational(1) / f.lead_coeff();
146
147 Term t2;
148 t2.mono = div_mono(L, g.lead_monomial());
149 t2.coeff = Rational(1) / g.lead_coeff();
150
151 return sub_poly(mul_poly_term(f, t1), mul_poly_term(g, t2));
152 }

引用了 LMCAS::groebner_detail::Term::coeff, div_mono(), lcm_mono(), LMCAS::groebner_detail::Poly::lead_coeff(), LMCAS::groebner_detail::Poly::lead_monomial(), LMCAS::groebner_detail::Term::mono, mul_poly_term(), s_poly() , 以及 sub_poly().

被这些函数引用 buchberger() , 以及 s_poly().

函数调用图:
这是这个函数的调用关系图:

◆ sub_poly()

Poly LMCAS::groebner_detail::sub_poly ( const Poly & a,
const Poly & b )

在文件 solver_groebner_poly.cpp 第 80 行定义.

80 {
81 Poly res = a;
82 for (auto const& [m, c] : b.terms) {
83
84 Rational c_neg = c * Rational(-1);
85 res.add_term(m, c_neg);
86 }
87 return res;
88 }

引用了 LMCAS::a, LMCAS::groebner_detail::Poly::add_term(), LMCAS::b, LMCAS::c , 以及 sub_poly().

被这些函数引用 reduce(), s_poly() , 以及 sub_poly().

函数调用图:
这是这个函数的调用关系图:

◆ to_poly()

Poly LMCAS::groebner_detail::to_poly ( const SymbolicExpr & expression,
PolyContext & context )

在文件 solver_groebner_conversion.cpp 第 144 行定义.

144 {
145 PolyBuilder b(ctx.ext_vars, ctx);
146 LMCAS::detail::node(expr)->accept(b);
147 return b.get_result();
148 }
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept

引用了 LMCAS::b, LMCAS::groebner_detail::PolyContext::ext_vars, LMCAS::detail::node() , 以及 to_poly().

被这些函数引用 LMCAS::anonymous_namespace{solver_groebner.cpp}::convert_polynomials() , 以及 to_poly().

函数调用图:
这是这个函数的调用关系图: