LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
solver_groebner_internal.hpp
浏览该文件的文档.
1#pragma once
2
3#include "rational.hpp"
4#include "symbolic.hpp"
6#include <map>
7#include <set>
8#include <unordered_map>
9#include <vector>
10
11namespace LMCAS {
12class SymbolicNode;
13}
14
15namespace LMCAS::groebner_detail {
16using Monomial = std::vector<int>;
17
19 bool operator()(const Monomial& a, const Monomial& b) const;
20};
21
22struct Term {
23 Rational coeff;
25};
26
27using PolyTerms = std::map<Monomial, Rational, MonomialLess>;
28struct Poly {
30 size_t num_vars;
31 int sugar = 0;
32
33 Poly() : num_vars(0) {}
34 Poly(size_t count) : num_vars(count) {}
35 bool is_zero() const { return terms.empty(); }
36 Monomial lead_monomial() const;
37 Rational lead_coeff() const;
38 Term lead_term() const;
39 void add_term(const Monomial& monomial, const Rational& coefficient);
40};
41
43 std::vector<std::string> ext_vars;
44 std::unordered_map<std::string, size_t> transcendental_map;
45 std::unordered_map<size_t, std::shared_ptr<const SymbolicNode>> aux_to_node;
48
49 PolyContext(const std::vector<std::string>& variables, ComputationContext& context)
50 : ext_vars(variables), num_original_vars(variables.size()),
51 budget(context, context.limits().max_recursion_depth,
52 context.limits().max_ast_nodes, "groebner.convert") {}
53};
54
55struct SugarPair {
56 size_t i, j;
58 bool operator>(const SugarPair& other) const {
59 return sugar_degree > other.sugar_degree;
60 }
61};
62
63Monomial mul_mono(const Monomial& a, const Monomial& b);
64Monomial lcm_mono(const Monomial& a, const Monomial& b);
65bool divides_mono(const Monomial& a, const Monomial& b);
66Monomial div_mono(const Monomial& numerator, const Monomial& denominator);
67Poly add_poly(const Poly& a, const Poly& b);
68Poly sub_poly(const Poly& a, const Poly& b);
69Poly mul_poly_term(const Poly& polynomial, const Term& term);
70Poly mul_poly(const Poly& a, const Poly& b);
71void extend_variables(Poly& polynomial, size_t count);
72void align_variables(Poly& a, Poly& b);
73Poly reduce(Poly polynomial, const std::vector<Poly>& basis);
74Poly s_poly(const Poly& f, const Poly& g);
75bool coprime_leading_monomials(const Poly& f, const Poly& g);
76bool chain_criterion(const std::vector<Poly>& basis, size_t i, size_t j,
77 const std::set<std::pair<size_t, size_t>>& processed_pairs);
78int compute_spoly_sugar(const Poly& f, const Poly& g);
79void buchberger(std::vector<Poly>& basis, size_t num_vars);
80void reduce_basis(std::vector<Poly>& basis);
81Poly to_poly(const SymbolicExpr& expression, PolyContext& context);
82SymbolicExpr from_poly_ext(
83 const Poly& polynomial, const PolyContext& context);
84std::vector<SymbolicExpr> reduced_groebner_basis_impl(
85 const std::vector<SymbolicExpr>& polynomials,
86 const std::vector<std::string>& variables, ComputationContext& context);
87
88}
std::vector< SymbolicExpr > reduced_groebner_basis_impl(const std::vector< SymbolicExpr > &polynomials, const std::vector< std::string > &variables, ComputationContext &context)
Monomial div_mono(const Monomial &numerator, const Monomial &denominator)
Poly mul_poly(const Poly &a, const Poly &b)
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)
void extend_variables(Poly &polynomial, size_t count)
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)
void reduce_basis(std::vector< Poly > &basis)
Monomial mul_mono(const Monomial &a, const Monomial &b)
SymbolicExpr from_poly_ext(const Poly &polynomial, const PolyContext &context)
void align_variables(Poly &a, Poly &b)
Poly to_poly(const SymbolicExpr &expression, PolyContext &context)
std::map< Monomial, Rational, MonomialLess > PolyTerms
bool divides_mono(const Monomial &a, const Monomial &b)
Monomial lcm_mono(const Monomial &a, const Monomial &b)
Poly sub_poly(const Poly &a, const Poly &b)
Poly mul_poly_term(const Poly &polynomial, const Term &term)
Poly add_poly(const Poly &a, const Poly &b)
void buchberger(std::vector< Poly > &basis, size_t num_vars)
std::vector< int > Monomial
单项式类型,以整数向量表示各变量的指数
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
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
const std::vector< FGLMPoly > & basis
const ExprPtr & denominator
精确有理数 Rational,基于 BigInt 分子/分母表示,自动约分。
bool operator()(const Monomial &a, const Monomial &b) const
std::unordered_map< size_t, std::shared_ptr< const SymbolicNode > > aux_to_node
std::unordered_map< std::string, size_t > transcendental_map
PolyContext(const std::vector< std::string > &variables, ComputationContext &context)
void add_term(const Monomial &monomial, const Rational &coefficient)
bool operator>(const SugarPair &other) const
符号表达式主类 SymbolicExpr 及其工厂方法,运算接口.