LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
solve_polynomial_normalization.cpp
浏览该文件的文档.
5
7
8bool is_purely_numeric(const std::shared_ptr<SymbolicExpr>& expr) {
9 return !expr || free_variables(LMCAS::detail::node(expr)).empty();
10}
11
12std::shared_ptr<SymbolicExpr> negate(const std::shared_ptr<SymbolicExpr>& x) {
13 return SymbolicExpr::multiply(SymbolicExpr::number(-1), x);
14}
15
16std::shared_ptr<SymbolicExpr> sub(const std::shared_ptr<SymbolicExpr>& a, const std::shared_ptr<SymbolicExpr>& b) {
17 return SymbolicExpr::add(a, negate(b));
18}
19
20std::shared_ptr<SymbolicExpr> num(int n) { return SymbolicExpr::number(n); }
21
22
24 const Polynomial<SymbolicPolyCoeff>& sym_poly,
26{
27
28 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
29 (context).limits().max_ast_nodes, "transform");
30 out_poly = Polynomial<Rational>(sym_poly.variable_name);
31 out_poly.coeffs.resize(sym_poly.coeffs.size(), Rational(0));
32
33 for (size_t i = 0; i < sym_poly.coeffs.size(); ++i) {
34 auto coeff_expr = sym_poly.coeffs[i].val;
35 if (!coeff_expr) {
36 out_poly.coeffs[i] = Rational(0);
37 continue;
38 }
39
40 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(coeff_expr), transform_budget));
41 auto num_node = std::dynamic_pointer_cast<const NumberNode>(
42 LMCAS::detail::node(simplified));
43 if (!num_node) {
44 return false;
45 }
46 if (std::holds_alternative<Rational>(num_node->value())) {
47 out_poly.coeffs[i] = std::get<Rational>(num_node->value());
48 } else {
49 out_poly.coeffs[i] =
50 Rational(std::get<BigInt>(num_node->value()));
51 }
52 }
53
54 out_poly.trim();
55 return true;
56}
57
58}
一元多项式模板类
std::string variable_name
变量名
std::vector< CoeffType > coeffs
系数数组,coeffs[i] 为 x^i 的系数
void trim()
去除高次零系数
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::shared_ptr< SymbolicExpr > num(int value)
bool convert_to_rational_poly(const Polynomial< SymbolicPolyCoeff > &poly, Polynomial< Rational > &output, ComputationContext &context)
std::shared_ptr< SymbolicExpr > sub(const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b)
std::shared_ptr< SymbolicExpr > negate(const std::shared_ptr< SymbolicExpr > &expr)
bool is_purely_numeric(const std::shared_ptr< SymbolicExpr > &expr)
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
std::set< std::string > free_variables(const detail::SymbolicNodePtr &expression, detail::RewriteBudget *budget)
内部 AST 定义。