LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
expand_visitor.cpp
浏览该文件的文档.
3
4namespace LMCAS {
5
6void ExpandVisitor::visit(const PowerNode& node) {
7 auto& context = rewrite_budget()->context();
8 std::size_t size = 1;
9 auto expanded_base = expand_child(node.base(), size);
10 auto expanded_exponent = expand_child(node.exponent(), size);
11 const auto number = std::dynamic_pointer_cast<const NumberNode>(expanded_exponent);
12 BigInt exponent;
13 if (try_get_integer_value(number, exponent)) {
14 if (exponent.is_zero() &&
18 return;
19 }
20 const auto count = exponent.try_to_uint64();
21 if (count && *count > 0 && *count < 20) {
23 set_result(expanded_base);
24 for (std::uint64_t i = 1; i < *count; ++i) {
25 set_result(normalizer.expand_product(result, expanded_base));
26 }
27 return;
28 }
29 }
30 set_result(detail::make_node<PowerNode>(expanded_base, expanded_exponent), size);
31}
32
33}
void visit(const NumberNode &node) override
std::shared_ptr< const SymbolicNode > expand_child(const std::shared_ptr< const SymbolicNode > &child, std::size_t &size)
std::shared_ptr< const SymbolicNode > result
展开结果节点。
void set_result(std::shared_ptr< const SymbolicNode > candidate, std::size_t size)
统一规范化数值幂。 精确操作数保留整数和有理数运算;近似求根要求指数精确等于 1/2。 有限浮点幂直接折叠,省去倒数中间值;非有限结果保留幂表达式。
std::shared_ptr< const SymbolicNode > expand_product(const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
幂运算节点,表示 base^exponent。
ComputationContext & context() const noexcept
RewriteBudget * rewrite_budget() const noexcept
展开访问器,将乘积和幂展开为多项式形式。
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
const FactsQuery & no_facts() noexcept
std::shared_ptr< const Node > make_node(Args &&... args)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
bool try_get_integer_value(const std::shared_ptr< const NumberNode > &node, BigInt &value)
bool normalization_can_discard(const std::shared_ptr< const SymbolicNode > &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
@ Complex
Complex numbers (default, least specific)
@ Real
Real numbers
const ExprPtr & exponent
bool normalization_proved(const Result< Tribool > &result)