LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
polynomial_conversion.hpp
浏览该文件的文档.
1
/**
2
* @file polynomial_conversion.hpp
3
* @brief 符号表达式与一元多项式的转换。
4
*/
5
#pragma once
6
7
#include "
computation_context.hpp
"
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
17
namespace
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
*/
29
template
<
typename
T>
30
LMCAS_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
*/
39
template
<
typename
T>
40
LMCAS_API
std::shared_ptr<SymbolicExpr> poly_to_symbolic(
41
const
Polynomial<T>
& polynomial);
42
43
using
OptionalRationalPolynomial
= std::optional<Polynomial<Rational>>;
44
45
46
/**
47
* @brief 证明表达式是精确的一元有理系数多项式。
48
*
49
* 成功且 optional 为空表示表达式超出当前结构支持域。
50
* 精确系数仅取自精确数值节点;遍历与展开计入上下文预算。
51
*/
52
LMCAS_API
Result<OptionalRationalPolynomial>
recognize_rational_polynomial
(
53
const
SymbolicExpr& expression,
54
const
std::string&
variable
,
55
ComputationContext
&
context
);
56
57
/** @brief 符号多项式算法使用的表达式系数。 */
58
struct
SymbolicPolyCoeff
{
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
71
SymbolicPolyCoeff
operator+
(
const
SymbolicPolyCoeff
& other)
const
{
72
return
SymbolicPolyCoeff
(SymbolicExpr::add(
val
, other.
val
));
73
}
74
75
SymbolicPolyCoeff
operator-
(
const
SymbolicPolyCoeff
& other)
const
{
76
return
SymbolicPolyCoeff
(SymbolicExpr::add(
77
val
,
78
SymbolicExpr::multiply(other.
val
, SymbolicExpr::number(-1))));
79
}
80
81
SymbolicPolyCoeff
operator*
(
const
SymbolicPolyCoeff
& other)
const
{
82
return
SymbolicPolyCoeff
(SymbolicExpr::multiply(
val
, other.
val
));
83
}
84
85
SymbolicPolyCoeff
operator/
(
const
SymbolicPolyCoeff
& other)
const
{
86
return
SymbolicPolyCoeff
(SymbolicExpr::divide(
val
, other.
val
));
87
}
88
89
SymbolicPolyCoeff
operator-
()
const
{
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
98
friend
SymbolicPolyCoeff
abs
(
const
SymbolicPolyCoeff
&
value
) {
99
return
value
;
100
}
101
102
bool
operator<
(
const
SymbolicPolyCoeff
&)
const
{
103
return
false
;
104
}
105
};
106
107
/** @brief 精确提取系数;不支持的值返回错误,保持数值完整。 */
108
template
<
typename
T>
109
Result<T>
extract_coeff_value
(
const
std::shared_ptr<SymbolicExpr>& coefficient);
110
111
template
<>
112
LMCAS_API
Result<SymbolicPolyCoeff>
extract_coeff_value<SymbolicPolyCoeff>
(
113
const
std::shared_ptr<SymbolicExpr>& coefficient);
114
115
template
<>
116
LMCAS_API
Result<BigInt>
extract_coeff_value<BigInt>
(
117
const
std::shared_ptr<SymbolicExpr>& coefficient);
118
119
template
<>
120
LMCAS_API
Result<Rational>
extract_coeff_value<Rational>
(
121
const
std::shared_ptr<SymbolicExpr>& coefficient);
122
123
/** @brief 判断表达式是否含指定变量的自由出现。 */
124
LMCAS_API
bool
contains
(
125
const
SymbolicExpr& expression,
126
const
std::string&
variable
);
127
128
129
}
LMCAS::ComputationContext
定义
computation_context.hpp:99
LMCAS::Polynomial
一元多项式模板类
定义
polynomial.hpp:52
LMCAS::Result
定义
result.hpp:39
computation_context.hpp
LMCAS_API
#define LMCAS_API
定义
lmcas_export.hpp:13
LMCAS
定义
assumption.hpp:11
LMCAS::variable
const std::string & variable
定义
expr.hpp:286
LMCAS::context
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
定义
exact_factorization.hpp:65
LMCAS::extract_coeff_value
Result< T > extract_coeff_value(const std::shared_ptr< SymbolicExpr > &coefficient)
精确提取系数;不支持的值返回错误,保持数值完整。
LMCAS::contains
bool contains(const SymbolicExpr &expression, const std::string &variable)
定义
poly_utils.cpp:110
LMCAS::recognize_rational_polynomial
Result< OptionalRationalPolynomial > recognize_rational_polynomial(const SymbolicExpr &expression, const std::string &variable, ComputationContext &context)
定义
rational_polynomial_recognition.cpp:171
LMCAS::value
const std::string const ExprPtr & value
定义
expr.hpp:293
LMCAS::OptionalRationalPolynomial
std::optional< Polynomial< Rational > > OptionalRationalPolynomial
将符号表达式转换为一元多项式。
定义
polynomial_conversion.hpp:43
polynomial.hpp
一元多项式模板类 Polynomial<T>,支持四则运算,GCD,求导,求值.
LMCAS::SymbolicPolyCoeff::operator+
SymbolicPolyCoeff operator+(const SymbolicPolyCoeff &other) const
定义
polynomial_conversion.hpp:71
LMCAS::SymbolicPolyCoeff::operator-
SymbolicPolyCoeff operator-(const SymbolicPolyCoeff &other) const
定义
polynomial_conversion.hpp:75
LMCAS::SymbolicPolyCoeff::SymbolicPolyCoeff
SymbolicPolyCoeff(std::shared_ptr< SymbolicExpr > value)
定义
polynomial_conversion.hpp:63
LMCAS::SymbolicPolyCoeff::operator!=
bool operator!=(const SymbolicPolyCoeff &other) const
定义
polynomial_conversion.hpp:67
LMCAS::SymbolicPolyCoeff::val
std::shared_ptr< SymbolicExpr > val
定义
polynomial_conversion.hpp:59
LMCAS::SymbolicPolyCoeff::operator/
SymbolicPolyCoeff operator/(const SymbolicPolyCoeff &other) const
定义
polynomial_conversion.hpp:85
LMCAS::SymbolicPolyCoeff::operator-
SymbolicPolyCoeff operator-() const
定义
polynomial_conversion.hpp:89
LMCAS::SymbolicPolyCoeff::operator<
bool operator<(const SymbolicPolyCoeff &) const
定义
polynomial_conversion.hpp:102
LMCAS::SymbolicPolyCoeff::SymbolicPolyCoeff
SymbolicPolyCoeff(int value)
定义
polynomial_conversion.hpp:62
LMCAS::SymbolicPolyCoeff::operator*
SymbolicPolyCoeff operator*(const SymbolicPolyCoeff &other) const
定义
polynomial_conversion.hpp:81
LMCAS::SymbolicPolyCoeff::SymbolicPolyCoeff
SymbolicPolyCoeff()
定义
polynomial_conversion.hpp:61
LMCAS::SymbolicPolyCoeff::to_string
std::string to_string() const
定义
polynomial_conversion.hpp:94
LMCAS::SymbolicPolyCoeff::abs
friend SymbolicPolyCoeff abs(const SymbolicPolyCoeff &value)
定义
polynomial_conversion.hpp:98
symbolic.hpp
符号表达式主类 SymbolicExpr 及其工厂方法,运算接口.
include
polynomial_conversion.hpp
生成于
, 为 LMCAS使用
1.18.0