LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
solver_groebner_reconstruction.cpp
浏览该文件的文档.
3
5namespace {
6std::shared_ptr<const SymbolicNode> variable_node(size_t index, const PolyContext& context) {
7 if (index >= context.num_original_vars) {
8 auto found = context.aux_to_node.find(index);
9 if (found != context.aux_to_node.end()) return found->second;
10 }
11 return SymbolicFactory::create_variable(context.ext_vars[index]);
12}
13
14std::shared_ptr<const SymbolicNode> term_node(const Monomial& monomial,
15 const Rational& coefficient,
16 const PolyContext& context) {
17 std::vector<std::shared_ptr<const SymbolicNode>> factors;
18 if (coefficient.get_denominator() == BigInt(1)) {
19 factors.push_back(SymbolicFactory::create_number(coefficient.get_numerator()));
20 } else {
21 factors.push_back(SymbolicFactory::create_number(coefficient));
22 }
23 for (size_t index = 0; index < monomial.size() && index < context.ext_vars.size(); ++index) {
24 if (monomial[index] <= 0) continue;
25 auto variable = variable_node(index, context);
26 if (monomial[index] == 1) {
27 factors.push_back(variable);
28 } else {
29 factors.push_back(SymbolicFactory::create_power(
30 variable, SymbolicFactory::create_number(BigInt(monomial[index]))));
31 }
32 }
33 if (factors.size() == 1) return factors[0];
35}
36}
37
38SymbolicExpr from_poly_ext(
39 const Poly& polynomial, const PolyContext& context) {
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}
50}
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_variable(const std::string &name)
static std::shared_ptr< const SymbolicNode > create_power(std::shared_ptr< const SymbolicNode > base, std::shared_ptr< const SymbolicNode > exponent)
创建幂运算节点,自动处理指数为 0/1 及底数为 0/1 的情况.
static std::shared_ptr< const SymbolicNode > create_multiply(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)
std::shared_ptr< const SymbolicNode > variable_node(size_t index, const PolyContext &context)
std::shared_ptr< const SymbolicNode > term_node(const Monomial &monomial, const Rational &coefficient, const PolyContext &context)
SymbolicExpr from_poly_ext(const Poly &polynomial, const PolyContext &context)
const std::string & variable
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
内部 AST 定义。