LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
polynomial_conversion.hpp
浏览该文件的文档.
1/**
2 * @file polynomial_conversion.hpp
3 * @brief 符号表达式与一元多项式的转换。
4 */
5#pragma once
6
8#include "polynomial.hpp"
9#include "symbolic.hpp"
10
11#include <memory>
12#include <optional>
13#include <string>
14#include <utility>
15#include <vector>
16
17namespace LMCAS {
18
19/**
20 * @brief 将符号表达式转换为一元多项式。
21 *
22 * 支持 BigInt、Rational 和 SymbolicPolyCoeff 系数。
23 * 不支持的子树或无法表示的系数使整个转换返回 UnsupportedExpression;
24 * 成功返回的零多项式表示数学上的零。空输入或变量名返回 InvalidArgument。
25 * 幂展开次数须为小于 1000 的非负整数;更大次数或超出 int 次数表示范围的
26 * 系数存储返回 ResourceLimit。有限 double 按精确 binary64 值转换;
27 * 证明源表达式精确性请用 recognize_rational_polynomial()。
28 */
29template <typename T>
30LMCAS_API Result<Polynomial<T>> symbolic_to_poly(
31 const std::shared_ptr<SymbolicExpr>& expression,
32 const std::string& variable);
33
34/**
35 * @brief 将支持的一元多项式转换为符号表达式。
36 *
37 * 支持 BigInt、Rational 和 SymbolicPolyCoeff 系数。
38 */
39template <typename T>
40LMCAS_API std::shared_ptr<SymbolicExpr> poly_to_symbolic(
41 const Polynomial<T>& polynomial);
42
43using OptionalRationalPolynomial = std::optional<Polynomial<Rational>>;
44
45
46/**
47 * @brief 证明表达式是精确的一元有理系数多项式。
48 *
49 * 成功且 optional 为空表示表达式超出当前结构支持域。
50 * 精确系数仅取自精确数值节点;遍历与展开计入上下文预算。
51 */
53 const SymbolicExpr& expression,
54 const std::string& variable,
56
57/** @brief 符号多项式算法使用的表达式系数。 */
59 std::shared_ptr<SymbolicExpr> val;
60
61 SymbolicPolyCoeff() : val(SymbolicExpr::number(0)) {}
62 explicit SymbolicPolyCoeff(int value) : val(SymbolicExpr::number(value)) {}
63 SymbolicPolyCoeff(std::shared_ptr<SymbolicExpr> value) : val(std::move(value)) {}
64
65 LMCAS_API bool operator==(const SymbolicPolyCoeff& other) const;
66
67 bool operator!=(const SymbolicPolyCoeff& other) const {
68 return !(*this == other);
69 }
70
72 return SymbolicPolyCoeff(SymbolicExpr::add(val, other.val));
73 }
74
76 return SymbolicPolyCoeff(SymbolicExpr::add(
77 val,
78 SymbolicExpr::multiply(other.val, SymbolicExpr::number(-1))));
79 }
80
82 return SymbolicPolyCoeff(SymbolicExpr::multiply(val, other.val));
83 }
84
86 return SymbolicPolyCoeff(SymbolicExpr::divide(val, other.val));
87 }
88
90 return SymbolicPolyCoeff(
91 SymbolicExpr::multiply(val, SymbolicExpr::number(-1)));
92 }
93
94 std::string to_string() const {
95 return val ? val->to_string() : "0";
96 }
97
99 return value;
100 }
101
102 bool operator<(const SymbolicPolyCoeff&) const {
103 return false;
104 }
105};
106
107/** @brief 精确提取系数;不支持的值返回错误,保持数值完整。 */
108template <typename T>
109Result<T> extract_coeff_value(const std::shared_ptr<SymbolicExpr>& coefficient);
110
111template <>
113 const std::shared_ptr<SymbolicExpr>& coefficient);
114
115template <>
117 const std::shared_ptr<SymbolicExpr>& coefficient);
118
119template <>
121 const std::shared_ptr<SymbolicExpr>& coefficient);
122
123/** @brief 判断表达式是否含指定变量的自由出现。 */
125 const SymbolicExpr& expression,
126 const std::string& variable);
127
128
129}
一元多项式模板类
#define LMCAS_API
const std::string & variable
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
Result< T > extract_coeff_value(const std::shared_ptr< SymbolicExpr > &coefficient)
精确提取系数;不支持的值返回错误,保持数值完整。
bool contains(const SymbolicExpr &expression, const std::string &variable)
Result< OptionalRationalPolynomial > recognize_rational_polynomial(const SymbolicExpr &expression, const std::string &variable, ComputationContext &context)
const std::string const ExprPtr & value
std::optional< Polynomial< Rational > > OptionalRationalPolynomial
将符号表达式转换为一元多项式。
一元多项式模板类 Polynomial<T>,支持四则运算,GCD,求导,求值.
SymbolicPolyCoeff operator+(const SymbolicPolyCoeff &other) const
SymbolicPolyCoeff operator-(const SymbolicPolyCoeff &other) const
SymbolicPolyCoeff(std::shared_ptr< SymbolicExpr > value)
bool operator!=(const SymbolicPolyCoeff &other) const
std::shared_ptr< SymbolicExpr > val
SymbolicPolyCoeff operator/(const SymbolicPolyCoeff &other) const
SymbolicPolyCoeff operator-() const
bool operator<(const SymbolicPolyCoeff &) const
SymbolicPolyCoeff operator*(const SymbolicPolyCoeff &other) const
friend SymbolicPolyCoeff abs(const SymbolicPolyCoeff &value)
符号表达式主类 SymbolicExpr 及其工厂方法,运算接口.