LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
normalization_numeric_functions.cpp
浏览该文件的文档.
1
#include "
internal/normalization_utils.hpp
"
2
3
namespace
LMCAS
{
4
namespace
{
5
bool
number_equals_integer
(
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
11
std::shared_ptr<const SymbolicNode>
function_at_zero
(
FunctionNode::FuncType
type) {
12
switch
(type) {
13
case
FunctionNode::FuncType::Sin
:
14
case
FunctionNode::FuncType::Tan
:
15
return
detail::make_node<NumberNode>
(BigInt(0));
16
case
FunctionNode::FuncType::Cos
:
17
case
FunctionNode::FuncType::Exp
:
18
return
detail::make_node<NumberNode>
(BigInt(1));
19
default
:
20
return
nullptr
;
21
}
22
}
23
24
std::shared_ptr<const SymbolicNode>
numeric_absolute
(
const
NumberNode
& number) {
25
if
(
const
auto
*
integer
= std::get_if<BigInt>(&number.
value
())) {
26
return
detail::make_node<NumberNode>
(
integer
->abs());
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
}
33
return
detail::make_node<NumberNode>
(
rational
);
34
}
35
36
std::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);
42
return
detail::make_node<FunctionNode>
(
FunctionNode::FuncType::Sqrt
,
43
std::vector<std::shared_ptr<const SymbolicNode>>{number});
44
}
45
46
std::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
55
std::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
}
LMCAS::FunctionNode::FuncType
FuncType
定义
functions.hpp:12
LMCAS::FunctionNode::FuncType::Sin
@ Sin
定义
functions.hpp:13
LMCAS::FunctionNode::FuncType::Tan
@ Tan
定义
functions.hpp:13
LMCAS::FunctionNode::FuncType::Abs
@ Abs
定义
functions.hpp:16
LMCAS::FunctionNode::FuncType::Ln
@ Ln
定义
functions.hpp:16
LMCAS::FunctionNode::FuncType::Sqrt
@ Sqrt
对数、绝对值、平方根。
定义
functions.hpp:16
LMCAS::FunctionNode::FuncType::Exp
@ Exp
指数函数。
定义
functions.hpp:17
LMCAS::FunctionNode::FuncType::LambertW
@ LambertW
Lambert W 函数。
定义
functions.hpp:18
LMCAS::FunctionNode::FuncType::Cos
@ Cos
定义
functions.hpp:13
LMCAS::NumberNode
定义
numbers.hpp:8
LMCAS::NumberNode::value
const std::variant< BigInt, Rational > & value() const noexcept
定义
numbers.hpp:21
LMCAS::detail::RewriteBudget
定义
rewrite_budget.hpp:15
LMCAS::detail::RewriteBudget::require_nodes
void require_nodes(std::size_t nodes) const
定义
rewrite_budget.cpp:119
LMCAS::anonymous_namespace{normalization_numeric_functions.cpp}::number_equals_integer
bool number_equals_integer(const std::shared_ptr< const NumberNode > &number, const BigInt &value)
定义
normalization_numeric_functions.cpp:5
LMCAS::anonymous_namespace{normalization_numeric_functions.cpp}::numeric_square_root
std::shared_ptr< const SymbolicNode > numeric_square_root(const std::shared_ptr< const NumberNode > &number, detail::RewriteBudget *budget)
定义
normalization_numeric_functions.cpp:36
LMCAS::anonymous_namespace{normalization_numeric_functions.cpp}::numeric_absolute
std::shared_ptr< const SymbolicNode > numeric_absolute(const NumberNode &number)
定义
normalization_numeric_functions.cpp:24
LMCAS::anonymous_namespace{normalization_numeric_functions.cpp}::numeric_lambert_w
std::shared_ptr< const SymbolicNode > numeric_lambert_w(const std::shared_ptr< const NumberNode > &number)
定义
normalization_numeric_functions.cpp:46
LMCAS::anonymous_namespace{normalization_numeric_functions.cpp}::function_at_zero
std::shared_ptr< const SymbolicNode > function_at_zero(FunctionNode::FuncType type)
定义
normalization_numeric_functions.cpp:11
LMCAS::detail::make_node
std::shared_ptr< const Node > make_node(Args &&... args)
定义
base.hpp:123
LMCAS
定义
assumption.hpp:11
LMCAS::integer
ExprResult integer(Integer)=delete
LMCAS::try_get_integer_value
bool try_get_integer_value(const std::shared_ptr< const NumberNode > &node, BigInt &value)
定义
normalization_utils.cpp:39
LMCAS::normalization_numeric_function
std::shared_ptr< const SymbolicNode > normalization_numeric_function(FunctionNode::FuncType type, const std::shared_ptr< const NumberNode > &number, detail::RewriteBudget *budget=nullptr)
定义
normalization_numeric_functions.cpp:55
LMCAS::normalization_exact_square_root
std::shared_ptr< const NumberNode > normalization_exact_square_root(const NumberNode &number)
定义
normalization_numeric_powers.cpp:103
LMCAS::normalization_check_children
void normalization_check_children(detail::RewriteBudget *budget, std::size_t roots, const std::shared_ptr< const Nodes > &... children)
定义
normalization_utils.hpp:27
LMCAS::value
const std::string const ExprPtr & value
定义
expr.hpp:293
LMCAS::rational
ExprResult rational(const Rational &value)
定义
expr_values.cpp:82
normalization_utils.hpp
src
normalization_numeric_functions.cpp
生成于
, 为 LMCAS使用
1.18.0