LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
squared_norm.cpp
浏览该文件的文档.
2
3namespace LMCAS::detail {
4namespace {
5
7 if (const auto* function = dynamic_cast<const FunctionNode*>(&root)) {
8 if (function->type() == FunctionNode::FuncType::Sqrt && function->arguments().size() == 1) {
9 return function->arguments().front().get();
10 }
11 return nullptr;
12 }
13 const auto* power = dynamic_cast<const PowerNode*>(&root);
14 if (!power) {
15 return nullptr;
16 }
17 const auto* exponent = dynamic_cast<const NumberNode*>(power->exponent().get());
18 if (!exponent) {
19 return nullptr;
20 }
21 const auto& value = exponent->value();
22 const bool half = std::holds_alternative<Rational>(value) &&
23 std::get<Rational>(value) == Rational(1, 2);
24 return half ? power->base().get() : nullptr;
25}
26
28 const auto* power = dynamic_cast<const PowerNode*>(node);
29 if (!power) {
30 return nullptr;
31 }
32 const auto* exponent = dynamic_cast<const NumberNode*>(power->exponent().get());
33 if (!exponent) {
34 return nullptr;
35 }
36 const auto& value = exponent->value();
37 const bool two = std::holds_alternative<BigInt>(value)
38 ? std::get<BigInt>(value) == BigInt(2)
39 : std::get<Rational>(value) == Rational(2);
40 return two ? power : nullptr;
41}
42
43}
44
45std::array<const PowerNode*, 2> squared_norm_terms(const SymbolicNode& root) {
46 const auto* argument = square_root_argument(root);
47 if (const auto* single = squared_term(argument)) {
48 return {single, nullptr};
49 }
50 const auto* sum = dynamic_cast<const AddNode*>(argument);
51 if (!sum || sum->operands().size() != 2) {
52 return {};
53 }
54 const auto* first = squared_term(sum->operands()[0].get());
55 const auto* second = squared_term(sum->operands()[1].get());
56 return first && second ? std::array<const PowerNode*, 2>{first, second}
57 : std::array<const PowerNode*, 2>{};
58}
59
60}
加法节点,表示多个操作数的求和。
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
@ Sqrt
对数、绝对值、平方根。
幂运算节点,表示 base^exponent。
const SymbolicNode * square_root_argument(const SymbolicNode &root)
const PowerNode * squared_term(const SymbolicNode *node)
多元 Hensel 提升(单变量步)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::array< const PowerNode *, 2 > squared_norm_terms(const SymbolicNode &root)
Recognize real-numeric norm forms without evaluating their squares.
const ExprPtr & exponent
const std::string const ExprPtr & value
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)