LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
normalization_numeric_functions.cpp
浏览该文件的文档.
2
3namespace LMCAS {
4namespace {
6 const std::shared_ptr<const NumberNode>& number, const BigInt& value) {
7 BigInt integer;
8 return try_get_integer_value(number, integer) && integer == value;
9}
10
11std::shared_ptr<const SymbolicNode> function_at_zero(FunctionNode::FuncType type) {
12 switch (type) {
15 return detail::make_node<NumberNode>(BigInt(0));
18 return detail::make_node<NumberNode>(BigInt(1));
19 default:
20 return nullptr;
21 }
22}
23
24std::shared_ptr<const SymbolicNode> numeric_absolute(const NumberNode& number) {
25 if (const auto* integer = std::get_if<BigInt>(&number.value())) {
27 }
28 const auto& rational = std::get<Rational>(number.value());
29 if (rational.get_numerator().is_negative()) {
30 return detail::make_node<NumberNode>(Rational(
31 rational.get_numerator().abs(), rational.get_denominator()));
32 }
34}
35
36std::shared_ptr<const SymbolicNode> numeric_square_root(
37 const std::shared_ptr<const NumberNode>& number, detail::RewriteBudget* budget) {
38 if (auto root = normalization_exact_square_root(*number)) {
39 return root;
40 }
41 normalization_check_children(budget, 1, number);
43 std::vector<std::shared_ptr<const SymbolicNode>>{number});
44}
45
46std::shared_ptr<const SymbolicNode> numeric_lambert_w(
47 const std::shared_ptr<const NumberNode>& number) {
48 if (number_equals_integer(number, BigInt(0))) {
49 return detail::make_node<NumberNode>(BigInt(0));
50 }
51 return nullptr;
52}
53}
54
55std::shared_ptr<const SymbolicNode> normalization_numeric_function(
56 FunctionNode::FuncType type, const std::shared_ptr<const NumberNode>& number,
57 detail::RewriteBudget* budget) {
58 if (budget) { budget->require_nodes(1); }
59 if (number_equals_integer(number, BigInt(0))) {
60 if (auto value = function_at_zero(type)) {
61 return value;
62 }
63 }
64 if (type == FunctionNode::FuncType::Ln &&
65 number_equals_integer(number, BigInt(1))) {
66 return detail::make_node<NumberNode>(BigInt(0));
67 }
68 switch (type) {
69 case FunctionNode::FuncType::Abs: return numeric_absolute(*number);
70 case FunctionNode::FuncType::Sqrt: return numeric_square_root(number, budget);
71 case FunctionNode::FuncType::LambertW: return numeric_lambert_w(number);
72 default: return nullptr;
73 }
74}
75}
@ Sqrt
对数、绝对值、平方根。
const std::variant< BigInt, Rational > & value() const noexcept
void require_nodes(std::size_t nodes) const
bool number_equals_integer(const std::shared_ptr< const NumberNode > &number, const BigInt &value)
std::shared_ptr< const SymbolicNode > numeric_square_root(const std::shared_ptr< const NumberNode > &number, detail::RewriteBudget *budget)
std::shared_ptr< const SymbolicNode > numeric_absolute(const NumberNode &number)
std::shared_ptr< const SymbolicNode > numeric_lambert_w(const std::shared_ptr< const NumberNode > &number)
std::shared_ptr< const SymbolicNode > function_at_zero(FunctionNode::FuncType type)
std::shared_ptr< const Node > make_node(Args &&... args)
ExprResult integer(Integer)=delete
bool try_get_integer_value(const std::shared_ptr< const NumberNode > &node, BigInt &value)
std::shared_ptr< const SymbolicNode > normalization_numeric_function(FunctionNode::FuncType type, const std::shared_ptr< const NumberNode > &number, detail::RewriteBudget *budget=nullptr)
std::shared_ptr< const NumberNode > normalization_exact_square_root(const NumberNode &number)
void normalization_check_children(detail::RewriteBudget *budget, std::size_t roots, const std::shared_ptr< const Nodes > &... children)
const std::string const ExprPtr & value
ExprResult rational(const Rational &value)