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

类

class  ExplicitComplexFinder
class  FunctionDependencyFinder
class  FunctionOfExplicitComplexFinder

函数

std::optional< int > bounded_complex_power (const std::shared_ptr< const SymbolicNode > &node)
bool contains_explicit_complex (const detail::SymbolicNodePtr &node)
bool has_function_of_explicit_complex (const detail::SymbolicNodePtr &node)
bool has_z_dependent_function (const detail::SymbolicNodePtr &node, const std::string &z)
void split_real_imag (const std::shared_ptr< const SymbolicNode > &node, std::shared_ptr< SymbolicExpr > &re, std::shared_ptr< SymbolicExpr > &im, ComputationContext &context)
 递归地将表达式分解为 (实部, 虚部),把 ComplexNode 视为 a+bi。 仅处理加法、乘法、数值与 ComplexNode 组合;其余子表达式视为实值。
Result< void > validate_complex_expr_input (const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context, const std::string &operation)
Result< void > validate_complex_expr_point_input (const std::shared_ptr< SymbolicExpr > &expr, const std::string &z, const std::shared_ptr< SymbolicExpr > &z0, int order, ComputationContext &context, const std::string &operation)

函数说明

◆ bounded_complex_power()

std::optional< int > LMCAS::anonymous_namespace{complex_analysis.cpp}::bounded_complex_power ( const std::shared_ptr< const SymbolicNode > & node)

在文件 complex_analysis.cpp 第 392 行定义.

393 {
394 auto number = std::dynamic_pointer_cast<const NumberNode>(node);
395 if (!number) return std::nullopt;
396 BigInt exponent;
397 if (const auto* integer = std::get_if<BigInt>(&number->value())) {
398 exponent = *integer;
399 } else if (const auto* rational = std::get_if<Rational>(&number->value())) {
400 if (!rational->is_integer()) return std::nullopt;
401 exponent = rational->get_numerator();
402 }
403 if (exponent < BigInt(0) || exponent > BigInt(16)) return std::nullopt;
404 return static_cast<int>(*exponent.try_to_int64());
405}
ExprResult integer(Integer)=delete
const ExprPtr & exponent
ExprResult rational(const Rational &value)

引用了 bounded_complex_power(), LMCAS::exponent, LMCAS::integer , 以及 LMCAS::rational().

被这些函数引用 bounded_complex_power() , 以及 split_real_imag().

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

◆ contains_explicit_complex()

bool LMCAS::anonymous_namespace{complex_analysis.cpp}::contains_explicit_complex ( const detail::SymbolicNodePtr & node)

在文件 complex_analysis.cpp 第 133 行定义.

引用了 LMCAS::SymbolicNode::accept(), contains_explicit_complex() , 以及 LMCAS::anonymous_namespace{complex_analysis.cpp}::ExplicitComplexFinder::found().

被这些函数引用 contains_explicit_complex() , 以及 LMCAS::anonymous_namespace{complex_analysis.cpp}::FunctionOfExplicitComplexFinder::visit_function().

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

◆ has_function_of_explicit_complex()

bool LMCAS::anonymous_namespace{complex_analysis.cpp}::has_function_of_explicit_complex ( const detail::SymbolicNodePtr & node)

在文件 complex_analysis.cpp 第 179 行定义.

引用了 LMCAS::SymbolicNode::accept(), LMCAS::anonymous_namespace{complex_analysis.cpp}::FunctionOfExplicitComplexFinder::found() , 以及 has_function_of_explicit_complex().

被这些函数引用 has_function_of_explicit_complex().

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

◆ has_z_dependent_function()

bool LMCAS::anonymous_namespace{complex_analysis.cpp}::has_z_dependent_function ( const detail::SymbolicNodePtr & node,
const std::string & z )

在文件 complex_analysis.cpp 第 171 行定义.

172 {
173 if (!node) return false;
174 FunctionDependencyFinder finder(z);
175 node->accept(finder);
176 return finder.found();
177}

引用了 LMCAS::SymbolicNode::accept(), LMCAS::anonymous_namespace{complex_analysis.cpp}::FunctionDependencyFinder::found() , 以及 has_z_dependent_function().

被这些函数引用 has_z_dependent_function().

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

◆ split_real_imag()

void LMCAS::anonymous_namespace{complex_analysis.cpp}::split_real_imag ( const std::shared_ptr< const SymbolicNode > & node,
std::shared_ptr< SymbolicExpr > & re,
std::shared_ptr< SymbolicExpr > & im,
ComputationContext & context )

递归地将表达式分解为 (实部, 虚部),把 ComplexNode 视为 a+bi。 仅处理加法、乘法、数值与 ComplexNode 组合;其余子表达式视为实值。

累乘:(a+bi)(c+di) = (ac-bd) + (ad+bc)i

对整数次幂,展开为重复乘法以分离实/虚部。

(a+bi)^e via repeated complex multiplication

实底数或非整数指数:视为实值

退化情形:原样返回为实部

默认:视为实值表达式

在文件 complex_analysis.cpp 第 409 行定义.

411 {
412
413 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
414 (context).limits().max_ast_nodes, "transform");
415 re = SymbolicExpr::number(0);
416 im = SymbolicExpr::number(0);
417 if (!node) return;
418
419
420 if (auto cn = std::dynamic_pointer_cast<const ComplexNode>(node)) {
421 re = LMCAS::detail::make_expression_ptr(cn->real());
422 im = LMCAS::detail::make_expression_ptr(cn->imag());
423 return;
424 }
425 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
426 for (const auto& op : add->operands()) {
427 std::shared_ptr<SymbolicExpr> r2, i2;
428 split_real_imag(op, r2, i2, context);
429 re = SymbolicExpr::add(re, r2);
430 im = SymbolicExpr::add(im, i2);
431 }
434 return;
435 }
436 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
437 /// 累乘:(a+bi)(c+di) = (ac-bd) + (ad+bc)i
438 std::shared_ptr<SymbolicExpr> accR = SymbolicExpr::number(1);
439 std::shared_ptr<SymbolicExpr> accI = SymbolicExpr::number(0);
440 for (const auto& op : mul->operands()) {
441 std::shared_ptr<SymbolicExpr> r2, i2;
442 split_real_imag(op, r2, i2, context);
443 auto ac = SymbolicExpr::multiply(accR, r2);
444 auto bd = SymbolicExpr::multiply(accI, i2);
445 auto ad = SymbolicExpr::multiply(accR, i2);
446 auto bc = SymbolicExpr::multiply(accI, r2);
447 accR = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(ac, SymbolicExpr::multiply(SymbolicExpr::number(-1), bd))), transform_budget));
448 accI = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(ad, bc)), transform_budget));
449 }
450 re = accR;
451 im = accI;
452 return;
453 }
454 if (auto pw = std::dynamic_pointer_cast<const PowerNode>(node)) {
455 /// 对整数次幂,展开为重复乘法以分离实/虚部。
456 auto exponent = bounded_complex_power(pw->exponent());
457 std::shared_ptr<SymbolicExpr> baseR, baseI;
458 split_real_imag(pw->base(), baseR, baseI, context);
459 bool base_real = LMCAS::detail::node(baseI) && LMCAS::detail::node(baseI)->is_zero();
460 if (exponent && !base_real) {
461 /// (a+bi)^e via repeated complex multiplication
462 std::shared_ptr<SymbolicExpr> accR = SymbolicExpr::number(1);
463 std::shared_ptr<SymbolicExpr> accI = SymbolicExpr::number(0);
464 for (int k = 0; k < *exponent; ++k) {
465 auto ac = SymbolicExpr::multiply(accR, baseR);
466 auto bd = SymbolicExpr::multiply(accI, baseI);
467 auto ad = SymbolicExpr::multiply(accR, baseI);
468 auto bc = SymbolicExpr::multiply(accI, baseR);
469 accR = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(ac, SymbolicExpr::multiply(SymbolicExpr::number(-1), bd))), transform_budget));
470 accI = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(ad, bc)), transform_budget));
471 }
472 re = accR; im = accI;
473 return;
474 }
475 /// 实底数或非整数指数:视为实值
476 if (base_real) {
478 im = SymbolicExpr::number(0);
479 return;
480 }
481 /// 退化情形:原样返回为实部
483 im = SymbolicExpr::number(0);
484 return;
485 }
486 /// 默认:视为实值表达式
488 im = SymbolicExpr::number(0);
489}
void split_real_imag(const std::shared_ptr< const SymbolicNode > &node, std::shared_ptr< SymbolicExpr > &re, std::shared_ptr< SymbolicExpr > &im, ComputationContext &context)
递归地将表达式分解为 (实部, 虚部),把 ComplexNode 视为 a+bi。 仅处理加法、乘法、数值与 ComplexNode 组合;其余子表达式视为实值。
std::optional< int > bounded_complex_power(const std::shared_ptr< const SymbolicNode > &node)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult mul(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
const ExprPtr RelationOp op

引用了 LMCAS::add(), bounded_complex_power(), LMCAS::context, LMCAS::exponent, LMCAS::SymbolicNode::is_zero(), LMCAS::detail::make_expression_ptr(), LMCAS::mul(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::op , 以及 split_real_imag().

被这些函数引用 split_real_imag().

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

◆ validate_complex_expr_input()

Result< void > LMCAS::anonymous_namespace{complex_analysis.cpp}::validate_complex_expr_input ( const std::shared_ptr< SymbolicExpr > & expr,
ComputationContext & context,
const std::string & operation )

在文件 complex_analysis.cpp 第 21 行定义.

24{
25 auto step = context.consume_steps(1, operation);
26 if (!step) return step;
27 if (!expr || !LMCAS::detail::node(expr)) {
29 "expression cannot be null", operation);
30 }
31 return Result<void>::success();
32}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)

引用了 LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::Result< T >::success() , 以及 validate_complex_expr_input().

被这些函数引用 validate_complex_expr_input().

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

◆ validate_complex_expr_point_input()

Result< void > LMCAS::anonymous_namespace{complex_analysis.cpp}::validate_complex_expr_point_input ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & z,
const std::shared_ptr< SymbolicExpr > & z0,
int order,
ComputationContext & context,
const std::string & operation )

在文件 complex_analysis.cpp 第 34 行定义.

41{
42 auto step = context.consume_steps(1, operation);
43 if (!step) return step;
44 if (!expr || !LMCAS::detail::node(expr) || !z0 || !LMCAS::detail::node(z0)) {
46 "complex-analysis expressions cannot be null",
47 operation);
48 }
49 if (z.empty()) {
51 "complex variable name cannot be empty",
52 operation);
53 }
54 if (order < 1 || order > 13) {
56 "complex-analysis order must be between 1 and 13",
57 operation);
58 }
59 return Result<void>::success();
60}
const std::vector< FGLMPoly > const MonomialOrder & order

引用了 LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::order, LMCAS::Result< T >::success() , 以及 validate_complex_expr_point_input().

被这些函数引用 validate_complex_expr_point_input().

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