LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp} 命名空间参考

类

class  RecursionScope

函数

Result< OptionalRationalPolynomial > recognize_node (const std::shared_ptr< const SymbolicNode > &node, const std::string &variable, ComputationContext &context)
Result< OptionalRationalPolynomial > recognize_number (const NumberNode &number, const std::string &variable)
Result< OptionalRationalPolynomial > recognize_power (const PowerNode &power, const std::string &variable, ComputationContext &context)
Result< OptionalRationalPolynomial > recognize_product (const MultiplyNode &multiply, const std::string &variable, ComputationContext &context)
Result< OptionalRationalPolynomial > recognize_sum (const AddNode &add, const std::string &variable, ComputationContext &context)

变量

constexpr const char * kOperation = "recognize_rational_polynomial"

函数说明

◆ recognize_node()

Result< OptionalRationalPolynomial > LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_node ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & variable,
ComputationContext & context )

在文件 rational_polynomial_recognition.cpp 第 132 行定义.

135 {
136 auto entered = context.enter_recursion(kOperation);
137 if (!entered) return Result<OptionalRationalPolynomial>::failure(entered.error());
138 RecursionScope scope(context);
139
140 if (!node) {
143 "polynomial recognition encountered a null AST node",
144 kOperation);
145 }
146
147 if (auto number = std::dynamic_pointer_cast<const NumberNode>(node)) {
148 return recognize_number(*number, variable);
149 }
150 if (auto symbol = std::dynamic_pointer_cast<const VariableNode>(node)) {
151 if (symbol->is_constant() || symbol->name() != variable) {
153 }
155 Polynomial<Rational>({Rational(0), Rational(1)}, variable));
156 }
157 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
159 }
160 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
161 return recognize_product(*multiply, variable, context);
162 }
163 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
164 return recognize_power(*power, variable, context);
165 }
167}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
Result< OptionalRationalPolynomial > recognize_product(const MultiplyNode &multiply, const std::string &variable, ComputationContext &context)
Result< OptionalRationalPolynomial > recognize_number(const NumberNode &number, const std::string &variable)
Result< OptionalRationalPolynomial > recognize_sum(const AddNode &add, const std::string &variable, ComputationContext &context)
Result< OptionalRationalPolynomial > recognize_power(const PowerNode &power, const std::string &variable, ComputationContext &context)
const std::string & variable
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
@ Rational
Rational numbers
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)

引用了 LMCAS::add(), LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InternalInvariant, kOperation, recognize_node(), recognize_number(), recognize_power(), recognize_product(), recognize_sum(), LMCAS::Result< T >::success() , 以及 LMCAS::variable.

被这些函数引用 recognize_node(), recognize_power(), recognize_product() , 以及 recognize_sum().

函数调用图:
这是这个函数的调用关系图:

◆ recognize_number()

Result< OptionalRationalPolynomial > LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_number ( const NumberNode & number,
const std::string & variable )

在文件 rational_polynomial_recognition.cpp 第 24 行定义.

25 {
26 if (std::holds_alternative<BigInt>(number.value())) {
28 Rational(std::get<BigInt>(number.value())), variable));
29 }
30 if (std::holds_alternative<Rational>(number.value())) {
32 std::get<Rational>(number.value()), variable));
33 }
35}
const std::variant< BigInt, Rational > & value() const noexcept
一元多项式模板类

引用了 recognize_number(), LMCAS::Result< T >::success(), LMCAS::NumberNode::value() , 以及 LMCAS::variable.

被这些函数引用 recognize_node() , 以及 recognize_number().

函数调用图:
这是这个函数的调用关系图:

◆ recognize_power()

Result< OptionalRationalPolynomial > LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_power ( const PowerNode & power,
const std::string & variable,
ComputationContext & context )

在文件 rational_polynomial_recognition.cpp 第 78 行定义.

79 {
80 auto exponent_node = std::dynamic_pointer_cast<const NumberNode>(power.exponent());
81 if (!exponent_node) {
83 }
84
85 BigInt exponent;
86 if (std::holds_alternative<BigInt>(exponent_node->value())) {
87 exponent = std::get<BigInt>(exponent_node->value());
88 } else {
89 const Rational& rational = std::get<Rational>(exponent_node->value());
90 if (!rational.is_integer()) {
92 }
93 exponent = rational.to_bigint();
94 }
95
96 auto exponent_value = exponent.try_to_int64();
97 if (!exponent_value || *exponent_value <= 0) {
99 }
100 if (static_cast<std::uint64_t>(*exponent_value) >=
101 context.limits().max_expansion_terms) {
104 "polynomial exponent exceeds the expansion term budget",
105 kOperation);
106 }
107
108 auto base = recognize_node(power.base(), variable, context);
109 if (!base) return base;
110 if (!base.value()) {
112 }
113
114 Polynomial<Rational> result({Rational(1)}, variable);
115 for (std::int64_t i = 0; i < *exponent_value; ++i) {
116 auto step = context.consume_steps(1, kOperation);
117 if (!step) return Result<OptionalRationalPolynomial>::failure(step.error());
118 const std::size_t projected_terms = result.is_zero() || base.value()->is_zero()
119 ? 0
120 : result.coeffs.size() + base.value()->coeffs.size() - 1;
121 if (projected_terms > context.limits().max_expansion_terms) {
124 "polynomial expansion term budget exhausted",
125 kOperation);
126 }
127 result = result * *base.value();
128 }
129 return Result<OptionalRationalPolynomial>::success(std::move(result));
130}
const std::shared_ptr< const SymbolicNode > & exponent() const noexcept
const std::shared_ptr< const SymbolicNode > & base() const noexcept
Result< OptionalRationalPolynomial > recognize_node(const std::shared_ptr< const SymbolicNode > &node, const std::string &variable, ComputationContext &context)
const ExprPtr & exponent
ExprResult rational(const Rational &value)

引用了 LMCAS::PowerNode::base(), LMCAS::context, LMCAS::exponent, LMCAS::PowerNode::exponent(), LMCAS::Result< T >::failure(), kOperation, LMCAS::rational(), recognize_node(), recognize_power(), LMCAS::ResourceLimit, LMCAS::Result< T >::success() , 以及 LMCAS::variable.

被这些函数引用 recognize_node() , 以及 recognize_power().

函数调用图:
这是这个函数的调用关系图:

◆ recognize_product()

Result< OptionalRationalPolynomial > LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_product ( const MultiplyNode & multiply,
const std::string & variable,
ComputationContext & context )

在文件 rational_polynomial_recognition.cpp 第 55 行定义.

56 {
57 Polynomial<Rational> result({Rational(1)}, variable);
58 for (const auto& operand : multiply.operands()) {
59 auto child = recognize_node(operand, variable, context);
60 if (!child) return child;
61 if (!child.value()) {
63 }
64 const std::size_t projected_terms = result.is_zero() || child.value()->is_zero()
65 ? 0
66 : result.coeffs.size() + child.value()->coeffs.size() - 1;
67 if (projected_terms > context.limits().max_expansion_terms) {
70 "polynomial expansion term budget exhausted",
72 }
73 result = result * *child.value();
74 }
75 return Result<OptionalRationalPolynomial>::success(std::move(result));
76}

引用了 LMCAS::context, LMCAS::Result< T >::failure(), kOperation, recognize_node(), recognize_product(), LMCAS::ResourceLimit, LMCAS::Result< T >::success() , 以及 LMCAS::variable.

被这些函数引用 recognize_node() , 以及 recognize_product().

函数调用图:
这是这个函数的调用关系图:

◆ recognize_sum()

Result< OptionalRationalPolynomial > LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_sum ( const AddNode & add,
const std::string & variable,
ComputationContext & context )

在文件 rational_polynomial_recognition.cpp 第 37 行定义.

38 {
40 for (const auto& operand : add.operands()) {
41 auto child = recognize_node(operand, variable, context);
42 if (!child) return child;
43 if (!child.value()) {
45 }
46 result = result + *child.value();
47 if (result.coeffs.size() > context.limits().max_expansion_terms) {
49 CasErrc::ResourceLimit, "polynomial term budget exhausted", kOperation);
50 }
51 }
52 return Result<OptionalRationalPolynomial>::success(std::move(result));
53}

引用了 LMCAS::add(), LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::context, LMCAS::Result< T >::failure(), kOperation, recognize_node(), recognize_sum(), LMCAS::ResourceLimit, LMCAS::Result< T >::success() , 以及 LMCAS::variable.

被这些函数引用 recognize_node() , 以及 recognize_sum().

函数调用图:
这是这个函数的调用关系图:

变量说明

◆ kOperation

const char* LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::kOperation = "recognize_rational_polynomial"
constexpr