LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS 命名空间参考

命名空间

namespace  anonymous_namespace{assumption_conditionals.cpp}
namespace  anonymous_namespace{assumption_context.cpp}
namespace  anonymous_namespace{assumption_serialization.cpp}
namespace  anonymous_namespace{bigint_arithmetic.cpp}
namespace  anonymous_namespace{bigint_combinatorics.cpp}
namespace  anonymous_namespace{bigint_number_theory.cpp}
namespace  anonymous_namespace{calculus_continuity.cpp}
namespace  anonymous_namespace{complex_analysis.cpp}
namespace  anonymous_namespace{differential_geometry.cpp}
namespace  anonymous_namespace{differentiation_functions.cpp}
namespace  anonymous_namespace{equivalence_engine.cpp}
namespace  anonymous_namespace{equivalence_options.cpp}
namespace  anonymous_namespace{expr_complex_evaluation.cpp}
namespace  anonymous_namespace{expr_errors.cpp}
namespace  anonymous_namespace{expr_facade.cpp}
namespace  anonymous_namespace{expr_number_domains.cpp}
namespace  anonymous_namespace{expr_serialization.cpp}
namespace  anonymous_namespace{expr_serialization_reader.cpp}
namespace  anonymous_namespace{expression_analysis.cpp}
namespace  anonymous_namespace{fglm.cpp}
namespace  anonymous_namespace{fglm_polynomial.cpp}
namespace  anonymous_namespace{inequality_solver.cpp}
namespace  anonymous_namespace{inequality_solver_parametric.cpp}
namespace  anonymous_namespace{inequality_solver_polynomial.cpp}
namespace  anonymous_namespace{inequality_solver_rational.cpp}
namespace  anonymous_namespace{inference_engine_bounds.cpp}
namespace  anonymous_namespace{inference_engine_periodicity.cpp}
namespace  anonymous_namespace{inference_engine_product.cpp}
namespace  anonymous_namespace{integration_by_parts.cpp}
namespace  anonymous_namespace{integration_definite.cpp}
namespace  anonymous_namespace{integration_linearity.cpp}
namespace  anonymous_namespace{integration_rational.cpp}
namespace  anonymous_namespace{integration_rational_coefficients.cpp}
namespace  anonymous_namespace{integration_rational_collection.cpp}
namespace  anonymous_namespace{integration_rational_factorization.cpp}
namespace  anonymous_namespace{integration_rational_terms.cpp}
namespace  anonymous_namespace{integration_special_functions.cpp}
namespace  anonymous_namespace{integration_substitution.cpp}
namespace  anonymous_namespace{integration_trig_substitution.cpp}
namespace  anonymous_namespace{integration_trigonometric.cpp}
namespace  anonymous_namespace{integration_weierstrass.cpp}
namespace  anonymous_namespace{integrator.cpp}
namespace  anonymous_namespace{interval_normalization.cpp}
namespace  anonymous_namespace{interval_set_operations.cpp}
namespace  anonymous_namespace{irrational_representation.cpp}
namespace  anonymous_namespace{irrational_symbolic.cpp}
namespace  anonymous_namespace{limit_result.cpp}
namespace  anonymous_namespace{limit_visitor_asymptotic.cpp}
namespace  anonymous_namespace{limit_visitor_composition.cpp}
namespace  anonymous_namespace{limit_visitor_direction.cpp}
namespace  anonymous_namespace{limit_visitor_taylor.cpp}
namespace  anonymous_namespace{matrix_decomposition.cpp}
namespace  anonymous_namespace{matrix_decomposition_cholesky.cpp}
namespace  anonymous_namespace{matrix_decomposition_eigen.cpp}
namespace  anonymous_namespace{matrix_decomposition_lu.cpp}
namespace  anonymous_namespace{matrix_decomposition_qr.cpp}
namespace  anonymous_namespace{matrix_quadratic_form.cpp}
namespace  anonymous_namespace{mixed_transcendental_classification.cpp}
namespace  anonymous_namespace{mixed_transcendental_search.cpp}
namespace  anonymous_namespace{multivariate_factor_checked.cpp}
namespace  anonymous_namespace{newton_raphson.cpp}
namespace  anonymous_namespace{normalization_arithmetic.cpp}
namespace  anonymous_namespace{normalization_matrices.cpp}
namespace  anonymous_namespace{normalization_norms.cpp}
namespace  anonymous_namespace{normalization_numeric_functions.cpp}
namespace  anonymous_namespace{normalization_numeric_powers.cpp}
namespace  anonymous_namespace{normalization_products.cpp}
namespace  anonymous_namespace{normalization_signs.cpp}
namespace  anonymous_namespace{normalization_trigonometric.cpp}
namespace  anonymous_namespace{numeric_evaluation.cpp}
namespace  anonymous_namespace{numerical_integration.cpp}
namespace  anonymous_namespace{parametric_solver_branches.cpp}
namespace  anonymous_namespace{poly_utils.cpp}
namespace  anonymous_namespace{print_visitor.cpp}
namespace  anonymous_namespace{property_classification.cpp}
namespace  anonymous_namespace{property_store.cpp}
namespace  anonymous_namespace{quantity.cpp}
namespace  anonymous_namespace{query_conditions.cpp}
namespace  anonymous_namespace{rational_parsing.cpp}
namespace  anonymous_namespace{rational_polynomial_recognition.cpp}
namespace  anonymous_namespace{rational_representation.cpp}
namespace  anonymous_namespace{relation_store.cpp}
namespace  anonymous_namespace{residual_comparison.cpp}
namespace  anonymous_namespace{residual_verification.cpp}
namespace  anonymous_namespace{root_of_identity.cpp}
namespace  anonymous_namespace{series_engine.cpp}
namespace  anonymous_namespace{solve_mixed_transcendental.cpp}
namespace  anonymous_namespace{solve_solution_finalization.cpp}
namespace  anonymous_namespace{solve_transcendental.cpp}
namespace  anonymous_namespace{solver_assumptions.cpp}
namespace  anonymous_namespace{solver_groebner.cpp}
namespace  anonymous_namespace{solver_groebner_system.cpp}
namespace  anonymous_namespace{symbolic_algebra_adapter.cpp}
namespace  anonymous_namespace{symbolic_cancel.cpp}
namespace  anonymous_namespace{symbolic_complex.cpp}
namespace  anonymous_namespace{symbolic_construction.cpp}
namespace  anonymous_namespace{symbolic_factor.cpp}
namespace  anonymous_namespace{symbolic_factory.cpp}
namespace  anonymous_namespace{symbolic_gcd.cpp}
namespace  anonymous_namespace{symbolic_geometry.cpp}
namespace  anonymous_namespace{symbolic_geometry_line.cpp}
namespace  anonymous_namespace{symbolic_geometry_line_plane.cpp}
namespace  anonymous_namespace{symbolic_geometry_plane.cpp}
namespace  anonymous_namespace{symbolic_geometry_surface.cpp}
namespace  anonymous_namespace{symbolic_geometry_vector.cpp}
namespace  anonymous_namespace{symbolic_matrix_eigen.cpp}
namespace  anonymous_namespace{symbolic_matrix_transform.cpp}
namespace  anonymous_namespace{symbolic_node_order.cpp}
namespace  anonymous_namespace{symbolic_number_order.cpp}
namespace  anonymous_namespace{symbolic_ode.cpp}
namespace  anonymous_namespace{symbolic_set.cpp}
namespace  anonymous_namespace{transcendental_rewrite.cpp}
namespace  anonymous_namespace{transcendental_solver_substitution.cpp}
namespace  anonymous_namespace{unit.cpp}
namespace  anonymous_namespace{univariate_factor_bridge.cpp}
namespace  anonymous_namespace{value.cpp}
namespace  assumption_detail
namespace  berlekamp_detail
namespace  calculus_utils_detail
namespace  detail
 多元 Hensel 提升(单变量步)
namespace  equivalence_detail
namespace  expr_detail
namespace  fglm_detail
namespace  geometry_detail
namespace  groebner_detail
namespace  integration_table_detail
namespace  modular_detail
namespace  multivariate_checked_detail
namespace  ode_root_detail
namespace  polynomial_solver_detail
namespace  property_detail
namespace  query_detail
namespace  serialization_detail
namespace  solver_detail
namespace  transform_detail
namespace  vector_calculus_detail

类

class  AddNode
 加法节点,表示多个操作数的求和。 更多...
struct  ApproxComplex
struct  ApproxReal
class  AssumptionDecl
 Declaration of an assumption to apply within a with_assumptions block. 更多...
struct  AsymptoteResult
 根据左右极限与函数值,在给定上下文假设下证明实数域中的连续性分类。 跳跃与可去间断的比较需证明逐点不等,相等性需保证各值有定义;形式非恒等不足以证明二者。 参数值或有定义性未确定时返回 Inconclusive;资源、取消和底层证明错误原样传播,不作为分类。 更多...
struct  BerlekampResult
 Berlekamp 分解结果。 更多...
struct  Binding
struct  ByConstructionProof
struct  CacheKey
 由表达式结构哈希、属性和自变量组成缓存键。 更多...
struct  CacheKeyHash
 缓存键哈希,计入周期查询的自变量。 更多...
class  CancellationToken
struct  CasError
struct  CheckedInterval
struct  CholeskyDecomposition
struct  ComparableEndpoint
class  ComplexNode
 复数节点,表示 real + imag * i。 更多...
struct  ComplexSymbolic
 符号复数,由实部和虚部组成 更多...
class  ComputationContext
struct  ConditionalSolutions
struct  ConditionSet
struct  ConvergenceInfo
 收敛性判定信息. 更多...
struct  CriticalPoint
 临界点的坐标、分类及成立条件。 更多...
struct  Diagnostic
class  DiagnosticEngine
class  DifferentiationVisitor
struct  EmptySolutions
struct  EqvBudget
 各限额均为非零值;深度与规模在重写运行中检查,超限返回 ResourceLimit。 更多...
struct  EqvOptions
struct  EvaluatedTransform
 受检变换成功时返回在 conditions 和收敛域 roc 条件下有效的已求值表达式。 支持性未决或收敛条件无法表示时,返回外层 Inconclusive 错误。 更多...
struct  ExactNormalizationProof
struct  ExactResidualProof
struct  ExactRoundTripProof
class  ExpandVisitor
struct  ExprMatch
struct  ExprMatchBinding
class  ExprParser
class  FactsQuery
struct  FiniteLimit
 已证在请求的实数或复数域内有定义的有限值。 表达式树中所有极限均已求定,扩展实数运算均有确定结果。 更多...
class  FiniteSetNode
struct  FiniteSolution
 conditions 是在操作上下文假设下须同时满足的条件。 空条件保留原表达式定义域且不增加约束;整数参数遍历全体整数。 更多...
struct  FiniteSolutions
struct  FourierPeriod
struct  FrobeniusSolution
 Frobenius 级数解结果. 更多...
class  FunctionNode
 函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。 更多...
struct  GcdSamples
struct  HenselLiftPair
 二因子二次 Hensel 提升的状态结构. 更多...
class  IntegralNode
struct  IntegrationStep
class  IntervalNode
struct  IntervalSolution
struct  IntervalSolutions
struct  IsolatedInterval
 隔离子区间,包含至多一个根 更多...
struct  JordanDecomposition
struct  LaurentResult
 洛朗级数展开结果. 更多...
struct  LimitDoesNotExist
class  LimitNode
struct  LineSymbolic
 由一点和方向向量定义的符号直线。 更多...
class  LogicalNode
struct  LUDecomposition
struct  MathResult
struct  MatrixInconsistentLinearSolution
class  MatrixNode
 矩阵节点,支持稠密和稀疏两种存储方式。 更多...
struct  MatrixParametricLinearSolution
struct  MatrixUniqueLinearSolution
class  MembershipNode
class  ModInt
 模整数类,封装模 p 下的算术运算 更多...
class  MonomialOrder
 单项式序比较器,支持 Lex、GrevLex、DegLex、DegRevLex 更多...
struct  MultiFactorResult
 多元因式分解结果 更多...
class  MultiplyNode
 乘法节点,表示多个操作数的乘积。 更多...
struct  NegativeInfinityLimit
struct  NodeCompare
struct  NodeEqual
struct  NodeHash
struct  NodeLess
class  NormalizationVisitor
 统一规范化数值幂。 精确操作数保留整数和有理数运算;近似求根要求指数精确等于 1/2。 有限浮点幂直接折叠,省去倒数中间值;非有限结果保留幂表达式。 更多...
class  NumberNode
struct  NumericRoot
 数值根结果,包含根值,残差和迭代次数. 更多...
struct  ODEClassification
 ODE 分类结果,包含类型及提取的结构信息. 更多...
struct  ODESolution
 ODE 求解结果. 更多...
struct  OdeTaylorCoefficients
struct  ParametricSolution
struct  ParametricSolutions
class  PiecewiseNode
 分段函数节点,表示条件分支表达式. 更多...
struct  PiecewiseSolution
 含参方程组的分段解,按参数条件分类 更多...
struct  PlaneSymbolic
 由法向量和常数 d 定义的符号平面 ax + by + cz = d。 更多...
class  Polynomial
 一元多项式模板类 更多...
struct  PositiveInfinityLimit
class  PowerNode
 幂运算节点,表示 base^exponent。 更多...
class  ProductNode
 连乘节点,表示符号有限/无限连乘 prod_{k=a}^{b} f(k). 更多...
struct  ProvedNonIdentityResidual
 证明残差在原公共定义域上非恒零,例如非零有理多项式。 残差仍可能在特定参数值处为零;点值不等性、定义域及上下文假设下的非零性均需另行证明。 更多...
struct  ProvedZeroResidual
 在表达式的原公共定义域上认证值相等;点值定义域与分母条件需另行证明。 更多...
struct  QRDecomposition
struct  QuadraticBoundaries
struct  QuadratureEstimate
class  QuantifierNode
class  QuantityNode
struct  RationalRootReconstruction
struct  Relation
 A stored relational constraint between two symbolic expressions. 更多...
class  RelationalNode
struct  ResourceLimits
 Per-operation limits for APIs that accept a ComputationContext. 更多...
class  Result
class  Result< void >
class  RewriteVisitor
class  RootOfNode
struct  SearchInterval
 搜索区间 更多...
class  SetBuilderNode
struct  SignChartEntry
 符号图条目,记录区间及其上的符号 更多...
struct  SignHash
 Hash functor for Sign enum to allow use in unordered_set. 更多...
struct  SolveOptions
 方程求解选项,控制数值求解行为和结果形式. 更多...
struct  SquareFreeDecomp
 无平方因子分解结果 更多...
struct  SubstitutionResult
 换元结果,记录换元表达式、换元后的多项式及换元变量名。 更多...
class  SummationNode
 求和节点,表示符号有限/无限求和 sum_{k=a}^{b} f(k). 更多...
struct  SurfaceSymbolic
 隐式曲面 F(x,y,z) = 0。 更多...
struct  SVDDecomposition
class  SymbolicFactory
class  SymbolicNode
struct  SymbolicPolyCoeff
 符号多项式算法使用的表达式系数。 更多...
struct  TfPolyBuildResult
 分解含 sin、cos、exp、ln 等超越函数的表达式。 更多...
struct  TfSquareFreeResult
 执行一步二次 Hensel 提升:mod m -> mod m^2. 更多...
class  TransformNode
 积分变换节点,表示 Laplace,Fourier,Z 变换及其逆变换. 更多...
struct  TransSubstitution
 换元映射条目:超越子表达式 -> 代数不定元名 更多...
struct  TransSubstitutionResult
 换元结果 更多...
struct  TrigSquare
class  UninterpretedFunctionNode
struct  UnitDefinition
struct  UniversalSolutions
struct  UnprovedResidual
class  VariableNode
 变量节点,表示一个符号变量。 更多...
struct  Verified
struct  ZcFactorSearch

类型定义

using AssumptionSolveResult
using AssumptionTriboolResult = Result<Tribool>
using AssumptionVoidResult = Result<void>
using AsymptoteAnalysisResult = Result<AsymptoteResult>
using BindingResult = Result<Binding>
using CholeskyDecompositionResult = Result<CholeskyDecomposition>
using ComplexBoolResult = Result<bool>
using ComplexRootsResult = Result<std::vector<ComplexSymbolic>>
using ComplexSymbolicResult = Result<ComplexSymbolic>
using ConstExprPtr = std::shared_ptr<const SymbolicExpr>
using ContinuityResult = Result<ContinuityType>
using ConvergenceInfoResult = Result<ConvergenceInfo>
using CrtResult = Result<std::pair<int64_t, int64_t>>
using DifferentialGeometryExprResult = Result<std::shared_ptr<SymbolicExpr>>
using DifferentialGeometryVectorResult = Result<std::vector<std::shared_ptr<SymbolicExpr>>>
using Expr = SymbolicExpr
using ExpressionResult = Result<std::shared_ptr<SymbolicExpr>>
 Result of an operation that produces a symbolic expression.
using ExprMatchResult = Result<ExprMatch>
using ExprPtr = std::shared_ptr<SymbolicExpr>
using ExprResult = Result<ExprPtr>
using ExprSetResult = Result<ExprSet>
using ExtremaResult = Result<std::vector<CriticalPoint>>
using FiniteSolveResult
using FrobeniusSolutionResult = Result<FrobeniusSolution>
using HenselLiftResult = Result<std::vector<Polynomial<BigInt>>>
using InferencePeriodResult = Result<std::optional<SymbolicExpr>>
using InferenceTriboolResult = Result<Tribool>
using JordanDecompositionResult = Result<JordanDecomposition>
using LagrangeResult
using LaurentSeriesResult = Result<LaurentResult>
using LimitExpressionResult = Result<LimitExprPtr>
using LimitExprPtr = std::shared_ptr<SymbolicExpr>
using LimitOutcome
using LimitResult = Result<Verified<LimitOutcome>>
using LineSymbolicResult = Result<LineSymbolic>
using LUDecompositionResult = Result<LUDecomposition>
using MatchMap = std::unordered_map<std::string, SymbolicExpr>
 匹配结果映射,通配符名称 → 绑定的表达式
using MatrixEigenvalueResult = Result<std::vector<std::shared_ptr<SymbolicExpr>>>
using MatrixEigenvectorResult
using MatrixLinearSolution
using MatrixLinearSolveResult = Result<MatrixLinearSolution>
using MatrixNullspaceResult
using MatrixRankResult = Result<std::size_t>
 计算两个符号矩阵的乘积
using MixedTranscendentalResult
 受检混合超越方程求解结果.
using Monomial = std::vector<int>
 单项式类型,以整数向量表示各变量的指数
using MultiFactorCheckedResult = Result<MathResult<MultiFactorResult>>
template<typename T>
using NodeMap = std::unordered_map<std::shared_ptr<const SymbolicNode>, T, NodeHash, NodeEqual>
using NodeSet = std::unordered_set<std::shared_ptr<const SymbolicNode>, NodeHash, NodeEqual>
using NumericBindings = std::unordered_map<std::string, double>
using NumericRootResult = Result<std::optional<NumericRoot>>
using NumericRootsResult = Result<std::vector<NumericRoot>>
using ODESingularityResult = Result<ODESingularityType>
using ODESolutionResult = Result<ODESolution>
template<typename T>
using OptionalRationalPolynomial = std::optional<Polynomial<Rational>>
 将符号表达式转换为一元多项式。
using ParametricMatrix = std::vector<std::vector<std::shared_ptr<SymbolicExpr>>>
using ParametricSolutionList
using ParametricSolutionsResult = Result<ParametricSolutionList>
using ParametricVector = std::vector<std::shared_ptr<SymbolicExpr>>
using PlaneSymbolicResult = Result<PlaneSymbolic>
using PolynomialSystemResult
 多项式方程组求解器,提供线性系统求解、Gröbner 基计算及多项式系统求解功能。
using PowerSeriesResult = Result<std::vector<std::shared_ptr<SymbolicExpr>>>
using ProofCertificate
using ProofExprPtr = std::shared_ptr<SymbolicExpr>
using PropertyStoreResult = Result<void>
using QRDecompositionResult = Result<QRDecomposition>
using QuantityResult = Result<std::shared_ptr<SymbolicExpr>>
using QueryPeriodResult = Result<std::optional<SymbolicExpr>>
using QueryTriboolResult = Result<Tribool>
using RationalReconstructionResult = Result<std::pair<int64_t, int64_t>>
using RelationStoreResult = Result<void>
using ResidualCheck
using ResidualCheckResult = Result<ResidualCheck>
using RootOfComplexEvaluationResult = Result<ApproxComplex>
using RootOfConstructionResult = Result<std::shared_ptr<SymbolicExpr>>
using RootOfEvaluationResult = Result<lmmc_real_t>
using SolutionSet
 成功的 SolveResult 表示操作定义域内的完整解集。 完备性未决时返回外层 Inconclusive 错误;EmptySolutions 表示已证明的空解集。
using SolveResult = Result<SolutionSet>
using SolveVectorResult
using SVDDecompositionResult = Result<SVDDecomposition>
using SymbolicExprVectorResult = Result<std::vector<std::shared_ptr<SymbolicExpr>>>
using SymbolicGcdResult = Result<std::shared_ptr<SymbolicExpr>>
using SymbolicSetResult = Result<std::shared_ptr<SymbolicExpr>>
using TransformEngineResult = Result<Verified<EvaluatedTransform>>
using UnivariateFactorResult
using VectorAngleResult = Result<double>
using VectorCalculusExprResult = Result<std::shared_ptr<SymbolicExpr>>
using VectorCalculusFieldResult = Result<VectorField>
using VectorExprListResult = Result<std::vector<std::shared_ptr<SymbolicExpr>>>
using VectorField = std::vector<std::shared_ptr<SymbolicExpr>>
 向量场由标量表达式组成。
using VectorStringResult = Result<std::string>
using ZassenhausResult

枚举

enum class  Boundedness { Bounded , Unbounded , Unknown }
 Boundedness classification for symbols. 更多...
enum class  CalculusRealCandidateStatus { Real , NonReal , Inconclusive }
enum class  CasErrc {
  InvalidArgument , ParseError , UnboundSymbol , DomainError ,
  DimensionMismatch , UnitInvalid , UnitStripTypeMismatch , SetElementTypeMismatch ,
  SetOperandTypeMismatch , SetElementNotHashable , UnsupportedExpression , Inconclusive ,
  ResourceLimit , Cancelled , NumericFailure , InternalInvariant
}
enum class  Completeness { Complete , Inconclusive }
enum class  ContinuityType { Continuous , Removable , Jump , Essential }
 连续性类型枚举. 更多...
enum class  ConvergenceResult { Convergent , Divergent , Inconclusive }
 收敛性结果枚举. 更多...
enum class  CriticalPointClassification {
  LocalMinimum , LocalMaximum , Saddle , Degenerate ,
  Inconclusive
}
enum class  Definiteness {
  PositiveDefinite , PositiveSemiDefinite , NegativeDefinite , NegativeSemiDefinite ,
  Indefinite , Unknown
}
 Matrix definiteness classification. 更多...
enum class  DiagnosticSeverity { Info , Warning , Error }
enum class  Domain {
  Complex , Real , Algebraic , Rational ,
  Integer , Natural , PositiveInt
}
 Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational ⊃ Integer ⊃ Natural ⊃ PositiveInt 更多...
enum class  EqvProfile { Core , TrigBasic , ExpLogBasic }
enum class  Finiteness { Finite , Divergent , Unknown }
 Finiteness classification for limits and sequences. 更多...
enum class  InequalityType { GreaterThan , GreaterEqual , LessThan , LessEqual }
 不等式类型 更多...
enum class  LimitDirection { Both , FromBelow , FromAbove }
 Direction from which a limit approaches its point. 更多...
enum class  MonomialOrderType { Lex , GrevLex , DegLex , DegRevLex }
 单项式序的类型枚举 更多...
enum class  Monotonicity {
  Increasing , Decreasing , NonDecreasing , NonIncreasing ,
  Unknown
}
 Monotonicity classification for functions over intervals. 更多...
enum class  NumberDomain {
  Integers , Rationals , Reals , Complexes ,
  Expressions
}
enum class  NumericStatus { Finite , PositiveInfinity , NegativeInfinity }
enum class  ODESingularityType { Ordinary , RegularSingular , IrregularSingular }
 对一阶 ODE 进行类型分类. 更多...
enum class  ODEType {
  Separable , Linear1 , Linear2_ConstCoeff , Homogeneous ,
  Bernoulli , Exact , HigherOrder_ConstCoeff , Euler ,
  System , LaplaceMethod , Frobenius , Unknown
}
 ODE 类型枚举,标识方程所属的求解类别. 更多...
enum class  Parity { Even , Odd , Unknown }
 Integer parity classification. 更多...
enum class  PropType {
  Positive , Negative , NonNegative , NonPositive ,
  Real , Integer , NonZero , Algebraic ,
  Transcendental , Finite , Divergent , Periodic ,
  PositiveDefinite , PositiveSemiDefinite
}
 Identifies which property is being queried, used as part of the cache key. 更多...
enum class  RelationOp {
  EQ , NEQ , LT , GT ,
  LEQ , GEQ
}
 Stable relational operator used by public APIs. 更多...
enum class  Sign {
  Positive , Negative , NonNegative , NonPositive ,
  Zero , NonZero
}
 Sign classification for symbols and expressions. 更多...
enum class  SingularityType { Removable , Pole , Essential }
 从无限级数通项计算幂级数收敛半径. 更多...
enum class  SolveStrategy {
  ClosedForm , Preprocessing , Transcendental , Numerical ,
  RootOf
}
 求解策略枚举,标识所使用的求解方法. 更多...
enum class  Tribool { True , False , Unknown }
 Tri-state logic value for property queries. 更多...
enum class  UnitStripMode { BaseValue , DisplayValue }
enum class  ZPolynomialPattern { None , Linear , Quadratic , Cubic }

函数

class __attribute__ ((visibility("default"))) AssumptionContext
 Scoped assumption context with push/pop management.
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std __attribute__ ((visibility("default"))) BerlekampResult berlekamp_factor(const Polynomial< Rational > &poly
 Berlekamp 模素数分解(内部接口).
template<>
__attribute__((visibility("default"))) Result< SymbolicPolyCoeff > extract_coeff_value< SymbolicPolyCoeff >(const std __attribute__((visibility("default"))) Result< BigInt > extract_coeff_value< BigInt >(const std __attribute__((visibility("default"))) Result< Rational > extract_coeff_value< Rational >(const std __attribute__ ((visibility("default"))) bool contains(const SymbolicExpr &expression
 判断表达式是否含指定变量的自由出现。
template<typename T>
 __attribute__ ((visibility("default"))) Result< Polynomial< T > > symbolic_to_poly(const std
ExprResult abs (const ExprPtr &expression)
ExprResult abs (const ExprPtr &expression, ComputationContext &context)
static bool accumulate_bernoulli_exponent (int value, int &exponent)
ExprResult acos (const ExprPtr &expression)
ExprResult acos (const ExprPtr &expression, ComputationContext &context)
static std::string active_univariate_variable (const MultiPoly &poly)
Result< QuadratureEstimate > adaptive_simpson_numeric (const std::shared_ptr< SymbolicExpr > &function, const std::string &variable, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, double tolerance, int max_depth)
Result< QuadratureEstimate > adaptive_simpson_numeric (const std::shared_ptr< SymbolicExpr > &function, const std::string &variable, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, double tolerance, int max_depth)
ExprResult add (const ExprPtr &lhs, const ExprPtr &rhs)
ExprResult add (const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
static Result< void > add_fourier_harmonic (Integrator &integrator, const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &half_lo, const std::shared_ptr< SymbolicExpr > &half_hi, const std::shared_ptr< SymbolicExpr > &L, const std::shared_ptr< SymbolicExpr > &arg, bool cosine, std::shared_ptr< SymbolicExpr > &result, ComputationContext &context)
static void add_lagrange_value (MultiPoly &result, const MultiPoly &value, const std::vector< Rational > &basis_coeffs, const std::vector< std::string > &all_vars, int var_idx)
static std::shared_ptr< const NumberNode > add_number_nodes (const std::shared_ptr< const NumberNode > &a, const std::shared_ptr< const NumberNode > &b)
std::shared_ptr< const NumberNode > add_numbers (const std::shared_ptr< const NumberNode > &a, const std::shared_ptr< const NumberNode > &b)
 两个数值节点相加
static ExpressionResult alternating_sequence_bound (const std::shared_ptr< SymbolicExpr > &remainder, const std::string &n, bool upper, ComputationContext &context)
std::shared_ptr< SymbolicExpr > analytic_continuation (const std::shared_ptr< SymbolicExpr > &f, const std::string &)
static bool any_nonreal_sqrt (const std::vector< std::shared_ptr< const SymbolicNode > > &children, ComputationContext &context)
static bool any_transcendental (const std::vector< std::shared_ptr< const SymbolicNode > > &nodes, const std::string &var)
 判断表达式 AST 中是否包含依赖指定变量的超越函数.
static void append_factor_solutions (const Polynomial< Rational > &factor, int multiplicity, const std::string &var, std::vector< std::shared_ptr< SymbolicExpr > > &results, ComputationContext &context)
static void append_product_families (ParametricSolutions &values, const std::set< std::string > &original_names, std::vector< ParametricSolution > &families)
static Result< void > append_product_roots (FiniteSolutions &values, std::size_t multiplicity, std::vector< FiniteSolution > &finite)
AssumptionVoidResult apply_assumption_decl_checked (AssumptionContext &ctx, const AssumptionDecl &decl)
static bool apply_hensel_lift_steps (const MultiPoly &poly, std::vector< MultiPoly > &factors, const std::string &lift_var, int lift_var_idx, const Rational &eval_point, int degree_bound, int factor_count)
ExprResult approx_real (double value)
ExpressionResult arc_length_x_checked (std::shared_ptr< SymbolicExpr > fx, std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b)
ExpressionResult arc_length_x_checked (std::shared_ptr< SymbolicExpr > fx, std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b, ComputationContext &context)
ExpressionResult arc_length_y_checked (std::shared_ptr< SymbolicExpr > fy, std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b)
ExpressionResult arc_length_y_checked (std::shared_ptr< SymbolicExpr > fy, std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b, ComputationContext &context)
ExprResult asin (const ExprPtr &expression)
ExprResult asin (const ExprPtr &expression, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > assemble_frobenius_polynomial (const std::vector< double > &a, const std::shared_ptr< SymbolicExpr > &x_minus_x0)
static SymbolicExprVectorResult asymptote_candidates (const std::shared_ptr< SymbolicExpr > &denominator, const std::string &var, ComputationContext &context, const std::string &operation)
AsymptoteAnalysisResult asymptotes_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var)
AsymptoteAnalysisResult asymptotes_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, ComputationContext &context)
std::shared_ptr< SymbolicExpr > asymptotic_expand (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, int order)
ExprResult atan (const ExprPtr &expression)
ExprResult atan (const ExprPtr &expression, ComputationContext &context)
QuantityResult attach_unit (const std::shared_ptr< SymbolicExpr > &value, const std::string &unit, ComputationContext &context)
QuantityResult attach_unit (const std::shared_ptr< SymbolicExpr > &value, std::string display_unit, UnitDefinition definition, ComputationContext &context)
BerlekampResult berlekamp_factor (const Polynomial< Rational > &poly, int64_t prime)
static std::optional< int > bernoulli_integer_exponent (const NumberNode &number)
BindingResult binding (ExprPtr symbol, ExprPtr value)
NumericRootResult bisection_checked (const std::shared_ptr< SymbolicExpr > &function, const std::string &variable, lmmc_real_t lower, lmmc_real_t upper, ComputationContext &context, const SolveOptions &options)
NumericRootResult bisection_checked (const std::shared_ptr< SymbolicExpr > &function, const std::string &variable, lmmc_real_t lower, lmmc_real_t upper, const SolveOptions &options)
static Polynomial< ModInt > bk_to_poly_modint (const std::vector< int64_t > &coeffs, int64_t p, const std::string &var)
 将模 p 系数向量转换为 Polynomial<ModInt>.
static std::shared_ptr< SymbolicExpr > build_euler_solution (const std::vector< CharRoot > &roots, const std::string &x, std::vector< std::string > &constants)
static std::shared_ptr< SymbolicExpr > build_homogeneous_solution (const std::vector< CharRoot > &roots, const std::string &x, std::vector< std::string > &constants)
 根据特征根构造齐次通解.
ExpressionResult calculate_residue_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &z, const std::shared_ptr< SymbolicExpr > &z0, int order)
ExpressionResult calculate_residue_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &z, const std::shared_ptr< SymbolicExpr > &z0, int order, ComputationContext &context)
static ExpressionResult calculate_residue_impl (const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::shared_ptr< SymbolicExpr > &, int, ComputationContext &)
static bool calculus_utils_contains_complex (const std::shared_ptr< const SymbolicNode > &node)
static bool calculus_utils_contains_nonreal_sqrt (const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > calculus_utils_extract_denominator (const std::shared_ptr< SymbolicExpr > &expr)
static CalculusRealCandidateStatus calculus_utils_extract_real_candidate (const std::shared_ptr< SymbolicExpr > &candidate, std::shared_ptr< SymbolicExpr > &real_candidate, ComputationContext &context)
static bool calculus_utils_is_minus_one (const std::shared_ptr< const NumberNode > &number)
static bool calculus_utils_is_negative_number (const std::shared_ptr< const NumberNode > &number)
static bool calculus_utils_oblique_from_rational (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, std::shared_ptr< SymbolicExpr > &slope, std::shared_ptr< SymbolicExpr > &intercept, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > calculus_utils_product (const std::vector< std::shared_ptr< const SymbolicNode > > &factors, ComputationContext &context)
static bool calculus_utils_split_rational (const std::shared_ptr< SymbolicExpr > &expr, std::shared_ptr< SymbolicExpr > &numerator, std::shared_ptr< SymbolicExpr > &denominator, ComputationContext &context)
static ExpressionResult calculus_utils_try_symbolic_definite (const std::shared_ptr< SymbolicExpr > &integrand, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
ExpressionResult cauchy_integral_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &z, const std::shared_ptr< SymbolicExpr > &z0, int n)
ExpressionResult cauchy_integral_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &z, const std::shared_ptr< SymbolicExpr > &z0, int n, ComputationContext &context)
static ExpressionResult cauchy_integral_impl (const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::shared_ptr< SymbolicExpr > &, int, ComputationContext &)
static std::shared_ptr< SymbolicExpr > cbrt_expr (const std::shared_ptr< SymbolicExpr > &x)
ExprResult ceil (const ExprPtr &expression)
ExprResult ceil (const ExprPtr &expression, ComputationContext &context)
ResidualCheckResult check_equivalent (const ExprPtr &left, const ExprPtr &right, ComputationContext &context, const LMCAS::EqvOptions &options)
bool check_negative_arg (const std::shared_ptr< const SymbolicNode > &argument, std::shared_ptr< const SymbolicNode > &positive, detail::RewriteBudget *budget=nullptr)
ResidualCheckResult check_zero_residual (const ExprPtr &residual, ComputationContext &context, const LMCAS::EqvOptions &options)
static ExpressionResult checked_derivative (const ExprPtr &expression, const std::string &variable, ComputationContext &context, const char *operation)
template<typename T>
Result< T > checked_inference_result (const SymbolicExpr &expr, const std::string &operation, ComputationContext &context, const std::function< Result< T >()> &query)
CholeskyDecompositionResult cholesky_decomposition_checked (const std::shared_ptr< SymbolicExpr > &A)
CholeskyDecompositionResult cholesky_decomposition_checked (const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
static std::string choose_main_variable (const MultiPoly &a, const MultiPoly &b)
DifferentialGeometryExprResult christoffel_first_kind_checked (const std::shared_ptr< SymbolicExpr > &g_ij, const std::vector< std::string > &coords, int k, int i, int j)
DifferentialGeometryExprResult christoffel_first_kind_checked (const std::shared_ptr< SymbolicExpr > &g_ij, const std::vector< std::string > &coords, int k, int i, int j, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > christoffel_first_kind_impl (const std::shared_ptr< SymbolicExpr > &, const std::vector< std::string > &, int, int, int, ComputationContext &context)
DifferentialGeometryExprResult christoffel_second_kind_checked (const std::shared_ptr< SymbolicExpr > &g_ij, const std::shared_ptr< SymbolicExpr > &g_up_ij, const std::vector< std::string > &coords, int k, int i, int j)
DifferentialGeometryExprResult christoffel_second_kind_checked (const std::shared_ptr< SymbolicExpr > &g_ij, const std::shared_ptr< SymbolicExpr > &g_up_ij, const std::vector< std::string > &coords, int k, int i, int j, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > christoffel_second_kind_impl (const std::shared_ptr< SymbolicExpr > &, const std::shared_ptr< SymbolicExpr > &, const std::vector< std::string > &, int, int, int, ComputationContext &context)
ExprResult clamp (const ExprPtr &expression, const ExprPtr &lower, const ExprPtr &upper)
ExprResult clamp (const ExprPtr &expression, const ExprPtr &lower, const ExprPtr &upper, ComputationContext &context)
ODEClassification classify_first_order_ode (const std::shared_ptr< SymbolicExpr > &rhs, const std::string &x, const std::string &y)
static CriticalPointClassification classify_hessian_eigenvalues (const std::vector< std::shared_ptr< SymbolicExpr > > &eigenvals, double tol, ComputationContext &context, detail::RewriteBudget &transform_budget)
static CriticalPointClassification classify_hessian_pair (const std::vector< double > &numeric_H, double tol)
ODEClassification classify_higher_order_ode (const std::vector< std::shared_ptr< SymbolicExpr > > &coeffs, const std::shared_ptr< SymbolicExpr > &forcing, const std::string &x, const std::string &)
static SymbolicExprVectorResult classify_inflection_candidates (const FiniteSolutions &finite, const std::shared_ptr< SymbolicExpr > &f, const std::shared_ptr< SymbolicExpr > &f_prime, const std::shared_ptr< SymbolicExpr > &f_double_prime, const std::string &var, const FactsQuery &facts, ComputationContext &context, const std::string &operation)
std::string classify_quadratic_form (const ExprPtr &A)
VectorStringResult classify_quadric_checked (const SurfaceSymbolic &surf)
VectorStringResult classify_quadric_checked (const SurfaceSymbolic &surf, ComputationContext &context)
static ConvergenceInfo classify_ratio_limit (const std::shared_ptr< SymbolicExpr > &lim, ComputationContext &context)
ODESingularityResult classify_singular_point_checked (const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x)
ODESingularityResult classify_singular_point_checked (const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > clean_number (double val)
static std::optional< std::shared_ptr< SymbolicExpr > > coefficient_power_radius (const PowerNode &power, const std::string &index_var, ComputationContext &context)
static bool collect_bernoulli_coefficients (const std::vector< std::shared_ptr< const SymbolicNode > > &terms, const std::string &y, std::map< int, std::shared_ptr< SymbolicExpr > > &coefficients, ComputationContext &context)
static SolveResult collect_exact_solutions (std::vector< std::shared_ptr< SymbolicExpr > > roots, ComputationContext &context)
static void collect_gcd_samples (const MultiPoly &a_prim, const MultiPoly &b_prim, const std::string &main_var, const std::vector< Rational > &eval_pts, int num_points, GcdSamples &samples)
static Result< void > collect_infinite_asymptotes (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &pos_inf, const std::shared_ptr< SymbolicExpr > &neg_inf, ComputationContext &context, AsymptoteResult &result)
static Result< void > collect_oblique_asymptote (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &x_expr, const std::shared_ptr< SymbolicExpr > &infinity, ComputationContext &context, AsymptoteResult &result)
static bool collect_operand_denominators (const std::vector< std::shared_ptr< const SymbolicNode > > &operands, std::vector< std::shared_ptr< const SymbolicNode > > &den_factors, std::vector< std::shared_ptr< SymbolicExpr > > &den_constraints)
static bool collect_power_denominators (const PowerNode &power, std::vector< std::shared_ptr< const SymbolicNode > > &den_factors, std::vector< std::shared_ptr< SymbolicExpr > > &den_constraints)
static bool collect_scalar_radical (const SymbolicNode *node, Rational &coefficient, const NumberNode *&radicand)
static Result< void > collect_vertical_asymptotes (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, ComputationContext &context, AsymptoteResult &result, const std::string &operation)
template<typename Operation>
static std::shared_ptr< const SymbolicNode > combine_operands (std::vector< std::shared_ptr< const SymbolicNode > > operands)
Result< ComparableEndpoint > comparable_endpoint (const Endpoint &endpoint, ComputationContext &context, const std::string &operation)
Result< ComparableEndpoint > comparable_endpoint (const Endpoint &endpoint, ComputationContext &context, const std::string &operation)
Result< ComparableEndpoint > comparable_endpoint (const Endpoint &endpoint, ComputationContext &context, const std::string &operation)
Result< int > compare_comparable (const ComparableEndpoint &left, const ComparableEndpoint &right, ComputationContext &context)
Result< int > compare_comparable (const ComparableEndpoint &left, const ComparableEndpoint &right, ComputationContext &context)
Result< int > compare_comparable (const ComparableEndpoint &left, const ComparableEndpoint &right, ComputationContext &context)
static bool complementary_square (const std::shared_ptr< const SymbolicNode > &node, const TrigSquare &square)
ExprResult complex (ExprPtr real, ExprPtr imag)
ExpressionResult complex_abs_checked (const ComplexSymbolic &z)
ExpressionResult complex_abs_checked (const ComplexSymbolic &z, ComputationContext &context)
ComplexSymbolicResult complex_add_checked (const ComplexSymbolic &a, const ComplexSymbolic &b)
ComplexSymbolicResult complex_add_checked (const ComplexSymbolic &a, const ComplexSymbolic &b, ComputationContext &context)
ExpressionResult complex_arg_checked (const ComplexSymbolic &z)
ExpressionResult complex_arg_checked (const ComplexSymbolic &z, ComputationContext &context)
ComplexSymbolicResult complex_conj_checked (const ComplexSymbolic &z)
ComplexSymbolicResult complex_conj_checked (const ComplexSymbolic &z, ComputationContext &context)
ComplexSymbolicResult complex_div_checked (const ComplexSymbolic &a, const ComplexSymbolic &b)
ComplexSymbolicResult complex_div_checked (const ComplexSymbolic &a, const ComplexSymbolic &b, ComputationContext &context)
ComplexSymbolicResult complex_exp_form_checked (std::shared_ptr< SymbolicExpr > r, std::shared_ptr< SymbolicExpr > theta)
ComplexSymbolicResult complex_exp_form_checked (std::shared_ptr< SymbolicExpr > r, std::shared_ptr< SymbolicExpr > theta, ComputationContext &context)
ExpressionResult complex_locus_circle_checked (const ComplexSymbolic &a, std::shared_ptr< SymbolicExpr > r, const std::string &z_var)
ExpressionResult complex_locus_circle_checked (const ComplexSymbolic &a, std::shared_ptr< SymbolicExpr > r, const std::string &z_var, ComputationContext &context)
ExpressionResult complex_locus_perpendicular_bisector_checked (const ComplexSymbolic &a, const ComplexSymbolic &b, const std::string &z_var)
ExpressionResult complex_locus_perpendicular_bisector_checked (const ComplexSymbolic &a, const ComplexSymbolic &b, const std::string &z_var, ComputationContext &context)
ComplexSymbolicResult complex_mul_checked (const ComplexSymbolic &a, const ComplexSymbolic &b)
ComplexSymbolicResult complex_mul_checked (const ComplexSymbolic &a, const ComplexSymbolic &b, ComputationContext &context)
ComplexSymbolicResult complex_sub_checked (const ComplexSymbolic &a, const ComplexSymbolic &b)
ComplexSymbolicResult complex_sub_checked (const ComplexSymbolic &a, const ComplexSymbolic &b, ComputationContext &context)
ComplexSymbolicResult complex_trig_form_checked (std::shared_ptr< SymbolicExpr > r, std::shared_ptr< SymbolicExpr > theta)
ComplexSymbolicResult complex_trig_form_checked (std::shared_ptr< SymbolicExpr > r, std::shared_ptr< SymbolicExpr > theta, ComputationContext &context)
NumberDomainSet complexes ()
static Result< void > composition_inner_powers (const std::vector< std::shared_ptr< SymbolicExpr > > &g, std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > &gp, int order, ComputationContext &context, const std::string &operation)
static SolveResult conditional_equation (const ExprPtr &original, const std::string &variable)
static SolveResult conditional_linear_polynomial (const Polynomial< SymbolicPolyCoeff > &polynomial, const ExprPtr &leading, const std::string &variable)
ExprResult conj (const ExprPtr &expression)
ExprResult conj (const ExprPtr &expression, ComputationContext &context)
ExpressionResult conjugate_checked (const std::shared_ptr< SymbolicExpr > &expr)
ExpressionResult conjugate_checked (const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)
static bool consume_digits (const std::string &str, size_t &pos)
static void consume_sign (const std::string &str, size_t &pos)
bool contains (const SymbolicExpr &expression, const std::string &variable)
static bool contains_inverse_candidate (const std::vector< std::shared_ptr< SymbolicExpr > > &candidates, const std::shared_ptr< SymbolicExpr > &candidate)
bool contains_transcendental_of_var (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var)
bool contains_unevaluated_integral (const std::shared_ptr< const SymbolicNode > &node)
ContinuityResult continuity_at_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &point)
ContinuityResult continuity_at_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &point, ComputationContext &context)
ExpressionResult convergence_radius_checked (const std::shared_ptr< SymbolicExpr > &general_coefficient, const std::string &index_var)
ExpressionResult convergence_radius_checked (const std::shared_ptr< SymbolicExpr > &general_coefficient, const std::string &index_var, ComputationContext &context)
ExpressionResult convergence_radius_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &coefficients, const std::string &var)
ExpressionResult convergence_radius_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &coefficients, const std::string &var, ComputationContext &context)
ConvergenceInfoResult convergence_test_checked (const std::shared_ptr< SymbolicExpr > &general_term, const std::string &index_var)
ConvergenceInfoResult convergence_test_checked (const std::shared_ptr< SymbolicExpr > &general_term, const std::string &index_var, ComputationContext &context)
static ConvergenceInfoResult convergence_test_impl (const std::shared_ptr< SymbolicExpr > &, const std::string &, ComputationContext &)
ExprResult convert_to_unit (const ExprPtr &quantity, const std::string &unit, ComputationContext &context)
ExprResult convert_to_unit_definition (const ExprPtr &quantity, std::string display_unit, UnitDefinition definition, ComputationContext &context)
QuantityResult convert_unit (const std::shared_ptr< SymbolicExpr > &expression, const std::string &target_unit, ComputationContext &context)
QuantityResult convert_unit (const std::shared_ptr< SymbolicExpr > &expression, std::string display_unit, UnitDefinition definition, ComputationContext &context)
TransformEngineResult convolve_checked (const std::shared_ptr< SymbolicExpr > &f, const std::shared_ptr< SymbolicExpr > &g, const std::string &var)
TransformEngineResult convolve_checked (const std::shared_ptr< SymbolicExpr > &f, const std::shared_ptr< SymbolicExpr > &g, const std::string &var, ComputationContext &context)
ExprResult cos (const ExprPtr &expression)
ExprResult cos (const ExprPtr &expression, ComputationContext &context)
VectorCalculusFieldResult cross_product (const VectorField &a, const VectorField &b)
static VectorCalculusFieldResult cross_product_impl (const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)
std::pair< int64_t, int64_t > crt (int64_t r1, int64_t m1, int64_t r2, int64_t m2)
 中国剩余定理(两模数),返回规范余数与模数乘积。
CrtResult crt_checked (int64_t r1, int64_t m1, int64_t r2, int64_t m2)
CrtResult crt_checked (int64_t r1, int64_t m1, int64_t r2, int64_t m2, ComputationContext &context)
 Checked Chinese remainder theorem for two positive coprime moduli.
VectorField curl (const VectorField &F, const std::vector< std::string > &vars)
VectorCalculusFieldResult curl_checked (const VectorField &F, const std::vector< std::string > &vars)
VectorCalculusFieldResult curl_checked (const VectorField &F, const std::vector< std::string > &vars, ComputationContext &context)
ExpressionResult curvature_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var)
ExpressionResult curvature_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, ComputationContext &context)
ExpressionResult curvature_parametric_checked (const std::shared_ptr< SymbolicExpr > &x_t, const std::shared_ptr< SymbolicExpr > &y_t, const std::string &t)
ExpressionResult curvature_parametric_checked (const std::shared_ptr< SymbolicExpr > &x_t, const std::shared_ptr< SymbolicExpr > &y_t, const std::string &t, ComputationContext &context)
std::shared_ptr< SymbolicExpr > curve_integral_scalar (const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b)
VectorCalculusExprResult curve_integral_scalar_checked (const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b)
VectorCalculusExprResult curve_integral_scalar_checked (const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
std::shared_ptr< SymbolicExpr > curve_integral_vector (const VectorField &F, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b)
VectorCalculusExprResult curve_integral_vector_checked (const VectorField &F, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b)
VectorCalculusExprResult curve_integral_vector_checked (const VectorField &F, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
std::vector< lmmc_real_t > deduplicate_roots (std::vector< NumericRoot > &roots, lmmc_real_t tolerance, int max_roots)
static void deflate_rational_root (Polynomial< Rational > &current, const Rational &root, std::vector< Rational > &roots)
static std::shared_ptr< const SymbolicNode > denominator_factor (const std::shared_ptr< const SymbolicNode > &node)
static Result< bool > dep_var_is_positive (const std::string &y, const AssumptionContext *ctx, ComputationContext &context)
 Check if the dependent variable is known Positive in the given context.
bool depends_on_integration_variable (const SymbolicExpr &expression, const std::string &variable)
static std::shared_ptr< const SymbolicNode > detect_negation (const std::shared_ptr< const SymbolicNode > &node)
 If the node is multiplication by exactly -1, returns the other operand.
static int detect_parity (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, ComputationContext &context)
Result< std::optional< SubstitutionResult > > detect_substitution (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var)
TransSubstitutionResult detect_trans_substitutions (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var)
 为依赖 var 的 Sin、Cos、Exp、Ln、Tan 子表达式构造换元结果。
std::optional< SearchInterval > determine_search_interval (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const SolveOptions &opts)
std::shared_ptr< SymbolicExpr > differential (const std::shared_ptr< SymbolicExpr > &f, const std::string &var)
ExprResult differentiate (const ExprPtr &expression, const std::string &variable)
ExprResult differentiate (const ExprPtr &expression, const std::string &variable, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > differentiate_if_dependent (const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable, ComputationContext &context)
ExpressionResult dihedral_angle_checked (const PlaneSymbolic &p1, const PlaneSymbolic &p2)
ExpressionResult dihedral_angle_checked (const PlaneSymbolic &p1, const PlaneSymbolic &p2, ComputationContext &context)
Result< DimensionSignature > dimension_of (const SymbolicExpr &expression)
static bool diophantine_target (const MultiPoly &target, const std::string &var, const Rational &eval_point, const std::string &main_var, Polynomial< Rational > &target_uni)
static bool diophantine_univariate_factors (const std::vector< MultiPoly > &factors, const std::string &var, const Rational &eval_point, Polynomial< Rational > &f1_uni, Polynomial< Rational > &f2_uni)
std::shared_ptr< SymbolicExpr > directional_derivative (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const VectorField &direction, int order)
VectorCalculusExprResult directional_derivative_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const VectorField &direction, int order)
VectorCalculusExprResult directional_derivative_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const VectorField &direction, int order, ComputationContext &context)
static SolveResult dispatch_equation (const ExprPtr &expr, const ExprPtr &f_expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)
ExprResult div (const ExprPtr &numerator, const ExprPtr &denominator)
ExprResult div (const ExprPtr &numerator, const ExprPtr &denominator, ComputationContext &context)
std::shared_ptr< SymbolicExpr > divergence (const VectorField &F, const std::vector< std::string > &vars)
VectorCalculusExprResult divergence_checked (const VectorField &F, const std::vector< std::string > &vars)
VectorCalculusExprResult divergence_checked (const VectorField &F, const std::vector< std::string > &vars, ComputationContext &context)
std::shared_ptr< SymbolicExpr > divergence_theorem (const VectorField &F, const std::vector< std::string > &vars, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &x_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &y_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &z_bounds)
VectorCalculusExprResult divergence_theorem_checked (const VectorField &F, const std::vector< std::string > &vars, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &x_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &y_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &z_bounds)
VectorCalculusExprResult divergence_theorem_checked (const VectorField &F, const std::vector< std::string > &vars, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &x_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &y_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &z_bounds, ComputationContext &context)
bool divides_monomial (const Monomial &divisor, const Monomial &target)
 判断 divisor 是否整除 target
static bool divides_poly (const MultiPoly &dividend, const MultiPoly &divisor)
Result< bool > domain_contains (const NumberDomainSet &domain, const ExprPtr &element)
static bool domain_requires_real (Domain domain)
Result< bool > domain_subset (const NumberDomainSet &lhs, const NumberDomainSet &rhs)
VectorCalculusExprResult dot_product (const VectorField &a, const VectorField &b)
static VectorCalculusExprResult dot_product_impl (const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)
static Result< std::vector< Interval > > double_root_inequality_intervals (const Polynomial< Rational > &polynomial, const Rational &rational_part, bool wants_positive, bool leading_positive, bool strict, detail::RewriteBudget &budget)
ExprResult e ()
static void eliminate_parametric_column (ParametricMatrix &A, ParametricVector &b, size_t current_row, size_t col, size_t n, ComputationContext &context)
static MultiPoly embed_hensel_terms (const MultiPoly &polynomial, const std::vector< std::string > &variables)
static MultiPoly embed_univariate_gcd (const MultiPoly &result, const std::string &a_var, const std::vector< std::string > &vars)
static std::vector< MultiPoly > embed_without_lifting (const std::vector< Polynomial< Rational > > &univariate_factors, const std::vector< std::string > &vars)
static bool endpoints_equivalent (const Endpoint &left, const Endpoint &right)
ExprResult eq (const ExprPtr &lhs, const ExprPtr &rhs)
ExprResult eq (const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
ExprPtr equation_predicate (const ExprPtr &expression)
Result< bool > equivalent (const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context, const EqvOptions &options)
Result< EqvProfile > eqv_profile_from_name (const std::string &name)
const char * error_name (CasErrc code) noexcept
const char * error_name (const CasError &error) noexcept
static std::optional< int > essential_exponent (const std::shared_ptr< SymbolicExpr > &f, const std::shared_ptr< SymbolicExpr > &shift, ComputationContext &context)
static LaurentSeriesResult essential_laurent (const std::shared_ptr< SymbolicExpr > &shift, int m, int order_neg, ComputationContext &context)
Result< ApproxComplex > eval_complex (const SymbolicExpr &expression, const NumericBindings &bindings)
Result< ApproxComplex > eval_complex (const SymbolicExpr &expression, const NumericBindings &bindings, ComputationContext &context)
Result< ApproxReal > evalf (const SymbolicExpr &expression, const NumericBindings &bindings)
Result< ApproxReal > evalf (const SymbolicExpr &expression, const NumericBindings &bindings, ComputationContext &context)
Result< ApproxReal > evaluate_numeric (const SymbolicExpr &expression, const NumericBindings &bindings, ComputationContext &context)
Result< ApproxReal > evaluate_numeric (const SymbolicExpr &expression, const NumericBindings &bindings={})
static std::vector< MultiPoly > evaluated_lifting_cofactors (const std::vector< MultiPoly > &factors, const std::string &lift_var, const Rational &eval_point, const std::vector< std::string > &vars)
Result< Rational > exact_double_rational (double value, ComputationContext &context, const std::string &operation)
static std::vector< std::shared_ptr< SymbolicExpr > > exact_factor_roots (Polynomial< Rational > polynomial, ComputationContext &context)
Rational exact_number_as_rational (const NumberNode &node)
int exact_numeric_sign (const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)
static bool exact_radical_domain_excludes (const SymbolicNode *node, Domain domain)
static bool exact_rational_domain_excludes (const Rational &value, Domain domain)
static const NumberNode * exact_scalar_number (const SymbolicNode *node)
static const NumberNode * exact_scalar_radicand (const SymbolicNode *node)
std::optional< int > exact_small_integer_node (const detail::SymbolicNodePtr &node, int min_value, int max_value)
ExprResult exp (const ExprPtr &expression)
ExprResult exp (const ExprPtr &expression, ComputationContext &context)
ExprResult expand (const ExprPtr &expression)
ExprResult expand (const ExprPtr &expression, ComputationContext &context)
static SymbolicExprVectorResult explicit_inverse_candidates (const FiniteSolutions &finite, const std::string &operation)
ExprMatchResult expr_match (const ExprPtr &pattern, const ExprPtr &target, const std::vector< std::string > &wildcards)
ExprMatchResult expr_match (const ExprPtr &pattern, const ExprPtr &target, const std::vector< std::string > &wildcards, ComputationContext &context)
ExprSetResult expr_set (std::vector< ExprPtr > elements)
Result< bool > expr_set_contains (const ExprSet &set, const ExprPtr &element)
ExprSetResult expr_set_difference (const ExprSet &lhs, const ExprSet &rhs)
ExprSetResult expr_set_failure (CasErrc code, std::string message, const char *operation)
ExprSetResult expr_set_intersection (const ExprSet &lhs, const ExprSet &rhs)
Result< bool > expr_set_not_contains (const ExprSet &set, const ExprPtr &element)
Result< bool > expr_set_subset (const ExprSet &lhs, const ExprSet &rhs)
Result< bool > expr_set_subset_domain (const ExprSet &set, const NumberDomainSet &domain)
ExprSetResult expr_set_symmetric_difference (const ExprSet &lhs, const ExprSet &rhs)
ExprSetResult expr_set_union (const ExprSet &lhs, const ExprSet &rhs)
bool expression_depends_on_variable (const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)
NumberDomainSet expressions ()
int64_t extended_gcd (int64_t a, int64_t b, int64_t &s, int64_t &t)
 用扩展欧几里得算法求 gcd(a,b) 及 Bezout 系数。
static MultiPoly extended_gcd_interpolation (const MultiPoly &a_prim, const MultiPoly &b_prim, const std::string &main_var, const std::vector< std::string > &vars, int degree_bound, const Rational &nc_gcd)
static Polynomial< Rational > extended_gcd_poly (const Polynomial< Rational > &a, const Polynomial< Rational > &b, Polynomial< Rational > &s, Polynomial< Rational > &t)
 一元多项式扩展 GCD(有理数域上)
DifferentialGeometryVectorResult exterior_derivative_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &form_coeffs, int degree, const std::vector< std::string > &vars)
DifferentialGeometryVectorResult exterior_derivative_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &form_coeffs, int degree, const std::vector< std::string > &vars, ComputationContext &context)
static bool extract_bernoulli_factor (const std::shared_ptr< const SymbolicNode > &factor, const std::string &y, int &exponent, std::shared_ptr< SymbolicExpr > &coefficient, ComputationContext &context)
static bool extract_bernoulli_monomial (const std::shared_ptr< const SymbolicNode > &term, const std::string &y, int &exponent, std::shared_ptr< SymbolicExpr > &coefficient, ComputationContext &context)
template<typename T>
Result< T > extract_coeff_value (const std::shared_ptr< SymbolicExpr > &coefficient)
 精确提取系数;不支持的值返回错误,保持数值完整。
template<>
Result< BigInt > extract_coeff_value< BigInt > (const std::shared_ptr< SymbolicExpr > &coefficient)
template<>
Result< Rational > extract_coeff_value< Rational > (const std::shared_ptr< SymbolicExpr > &coefficient)
template<>
Result< SymbolicPolyCoeff > extract_coeff_value< SymbolicPolyCoeff > (const std::shared_ptr< SymbolicExpr > &coefficient)
static std::shared_ptr< SymbolicExpr > extract_coefficient (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context)
static std::map< int, MultiPoly > extract_coefficients (const MultiPoly &poly, const std::string &main_var)
static std::shared_ptr< SymbolicExpr > extract_constant_term (const std::shared_ptr< SymbolicExpr > &expr, const std::vector< std::string > &unknowns, ComputationContext &context)
static Result< int > extract_laurent_regular_part (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &center, const std::shared_ptr< SymbolicExpr > &shift, std::shared_ptr< SymbolicExpr > &regular, ComputationContext &context)
static std::optional< ExpressionResult > factor_common_polynomial (const std::shared_ptr< const AddNode > &add_node, ComputationContext &context)
Polynomial< BigInt > factor_integer_polynomial (const Polynomial< Rational > &polynomial)
MultiFactorCheckedResult factor_multivariate_checked (const MultiPoly &poly)
MultiFactorCheckedResult factor_multivariate_checked (const MultiPoly &poly, ComputationContext &context)
static std::optional< ExpressionResult > factor_multivariate_expression (const std::shared_ptr< SymbolicExpr > &simp, const std::set< std::string > &factor_variables, ComputationContext &context)
static std::optional< ExpressionResult > factor_numeric_content (const std::shared_ptr< SymbolicExpr > &simp, const std::shared_ptr< const AddNode > &add_node, ComputationContext &context)
static std::optional< ExpressionResult > factor_rational_univariate (const std::shared_ptr< SymbolicExpr > &simp, const std::string &var, ComputationContext &context)
static std::optional< ExpressionResult > factor_symbolic_quadratic (const std::shared_ptr< SymbolicExpr > &simp, const std::string &var, ComputationContext &context)
Result< std::vector< std::shared_ptr< SymbolicExpr > > > factor_transcendental (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var)
Result< std::vector< std::shared_ptr< SymbolicExpr > > > factor_transcendental (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context)
static ExpressionResult factor_transcendental_expression (const std::shared_ptr< SymbolicExpr > &simp, ComputationContext &context)
UnivariateFactorResult factor_univariate_bridge_checked (const Polynomial< Rational > &polynomial, ComputationContext &context)
static std::optional< ExpressionResult > factor_variable_rational_roots (const std::shared_ptr< SymbolicExpr > &simp, const std::string &var, ComputationContext &context)
std::vector< FGLMPoly > fglm_convert (const std::vector< FGLMPoly > &source_basis, const MonomialOrder &source_order, const MonomialOrder &target_order, size_t num_vars)
static std::size_t find_complementary_square (const std::vector< std::shared_ptr< const SymbolicNode > > &operands, const std::vector< bool > &consumed, std::size_t start, const TrigSquare &square)
std::vector< CriticalPoint > find_extrema (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars)
ExtremaResult find_extrema_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars)
ExtremaResult find_extrema_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context)
static std::vector< CriticalPoint > find_extrema_impl (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context, detail::RewriteBudget &transform_budget)
std::shared_ptr< SymbolicExpr > find_integrating_factor (const std::shared_ptr< SymbolicExpr > &M, const std::shared_ptr< SymbolicExpr > &N, const std::string &x, const std::string &y)
static ExpressionResult find_integrating_factor_impl (const std::shared_ptr< SymbolicExpr > &M, const std::shared_ptr< SymbolicExpr > &N, const std::string &x, const std::string &y, ComputationContext &context)
static size_t find_parametric_pivot (ParametricMatrix &matrix, size_t row, size_t column, ComputationContext &context)
std::vector< Rational > find_rational_roots (const Polynomial< Rational > &poly)
std::vector< std::pair< std::shared_ptr< SymbolicExpr >, int > > find_roots_with_multiplicity (const std::shared_ptr< SymbolicExpr > &expr, const std::string &variable, ComputationContext &context)
ExprResult finite_set (std::vector< ExprPtr > elements)
ExprResult finite_set (std::vector< ExprPtr > elements, ComputationContext &context)
SymbolicSetResult finite_set_difference (const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)
SymbolicSetResult finite_set_intersection (const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)
SymbolicSetResult finite_set_symmetric_difference (const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)
SymbolicSetResult finite_set_union (const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)
static SolveResult finite_values_to_set (SolveVectorResult result)
ExprResult floor (const ExprPtr &expression)
ExprResult floor (const ExprPtr &expression, ComputationContext &context)
static MultiPoly formal_derivative (const MultiPoly &poly, const std::string &main_var)
 计算多元多项式关于指定变量的形式偏导数
static ExpressionResult fourier_constant_coefficient (Integrator &integrator, const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const FourierPeriod &period, ComputationContext &context)
static Result< void > fourier_harmonics (Integrator &integrator, const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const FourierPeriod &period, const std::shared_ptr< SymbolicExpr > &x, int n_terms, int parity, std::shared_ptr< SymbolicExpr > &result, ComputationContext &context)
ExpressionResult fourier_series_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &period, int n_terms)
ExpressionResult fourier_series_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &period, int n_terms, ComputationContext &context)
TransformEngineResult fourier_transform_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &omega)
TransformEngineResult fourier_transform_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &omega, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > fourier_transform_core (const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &omega, ComputationContext &context, const AssumptionContext &assumptions, std::vector< std::shared_ptr< SymbolicExpr > > &conditions)
std::set< std::string > free_variables (const detail::SymbolicNodePtr &expression, detail::RewriteBudget *budget)
static CasError frobenius_arithmetic_failure ()
static Result< double > frobenius_coefficient_limit (const std::shared_ptr< SymbolicExpr > &coefficient, const std::string &x, const std::shared_ptr< SymbolicExpr > &x0, double value, ComputationContext &context)
static Result< std::pair< double, double > > frobenius_indicial_roots (double P0, double Q0)
static CasError frobenius_unsupported_numeric ()
ExprResult function (const std::string &name, std::vector< ExprPtr > arguments)
template<typename T>
T gcd_coeff_impl (const T &a, const T &b)
 计算两个系数的最大公约数(泛型实现)
static std::vector< Rational > gcd_evaluation_points (int bound)
ExprResult ge (const ExprPtr &lhs, const ExprPtr &rhs)
std::vector< int64_t > generate_good_primes (int count, const std::vector< BigInt > &leading_coeffs, uint64_t start_from=UINT64_C(1000000000))
 生成指定数量的好素数
static std::optional< ConvergenceInfo > geometric_term_convergence (const std::shared_ptr< const SymbolicNode > &node, const std::string &index_var)
std::shared_ptr< SymbolicExpr > get_coeff (const Polynomial< SymbolicPolyCoeff > &p, int deg)
static bool get_integer_value (const std::shared_ptr< const SymbolicNode > &node, BigInt &value)
BigInt get_node_degree_helper (const std::shared_ptr< const SymbolicNode > &node)
 计算 AST 节点的多项式次数
bool get_pi_coeff (const std::shared_ptr< const SymbolicNode > &node, Rational &coefficient)
VectorField gradient (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars)
VectorCalculusFieldResult gradient_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars)
VectorCalculusFieldResult gradient_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context)
std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > gram_schmidt (const std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > &vectors, bool normalize)
std::shared_ptr< SymbolicExpr > greens_theorem (const std::shared_ptr< SymbolicExpr > &P, const std::shared_ptr< SymbolicExpr > &Q, const std::vector< std::string > &vars, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &x_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &y_bounds)
std::shared_ptr< SymbolicExpr > greens_theorem_area (const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b)
VectorCalculusExprResult greens_theorem_area_checked (const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b)
VectorCalculusExprResult greens_theorem_area_checked (const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
VectorCalculusExprResult greens_theorem_checked (const std::shared_ptr< SymbolicExpr > &P, const std::shared_ptr< SymbolicExpr > &Q, const std::vector< std::string > &vars, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &x_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &y_bounds)
VectorCalculusExprResult greens_theorem_checked (const std::shared_ptr< SymbolicExpr > &P, const std::shared_ptr< SymbolicExpr > &Q, const std::vector< std::string > &vars, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &x_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &y_bounds, ComputationContext &context)
std::vector< FGLMPoly > grevlex_to_lex (const std::vector< FGLMPoly > &grevlex_basis, size_t num_vars)
ExprResult gt (const ExprPtr &lhs, const ExprPtr &rhs)
static bool has_nonzero_forcing (const std::shared_ptr< SymbolicExpr > &forcing)
static bool has_oblique_asymptote (const AsymptoteResult &result, const std::shared_ptr< SymbolicExpr > &slope, const std::shared_ptr< SymbolicExpr > &intercept)
void hash_combine (std::size_t &seed, std::size_t value)
 将一个哈希值混合到种子中,用于组合多个字段的哈希.
HenselLiftResult hensel_lift_checked (const Polynomial< BigInt > &poly, const std::vector< Polynomial< ModInt > > &mod_factors, int64_t prime, int lift_bound)
 Hensel 提升:将模 p 因子提升到 mod p^k.
std::shared_ptr< SymbolicExpr > hessian (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars)
VectorCalculusExprResult hessian_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars)
VectorCalculusExprResult hessian_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context)
static BigInt hl_binomial (int n, int k)
 计算二项式系数 C(n, k).
static bool hl_coeff_vectors_equal (std::vector< BigInt > left, std::vector< BigInt > right)
static int hl_compute_lift_height (const Polynomial< BigInt > &poly, int64_t prime)
 计算 Hensel 提升所需的高度 k.
static std::pair< std::vector< BigInt >, std::vector< BigInt > > hl_extended_gcd_poly (const std::vector< BigInt > &g, const std::vector< BigInt > &h, const BigInt &m)
 计算两个多项式在模 m 下的扩展 GCD 的 Bezout 系数.
static bool hl_is_prime (int64_t value)
static BigInt hl_l2_norm_squared (const Polynomial< BigInt > &poly)
 计算多项式系数的 L2 范数的平方.
static BigInt hl_mignotte_bound (const Polynomial< BigInt > &poly)
 计算多项式的 Mignotte 界.
static BigInt hl_mod_inverse (const BigInt &a, const BigInt &m)
 计算 BigInt 在模 m 下的乘法逆元.
static std::vector< std::vector< BigInt > > hl_multi_factor_lift (const std::vector< BigInt > &f, const std::vector< std::vector< BigInt > > &factors, int64_t prime, int target_k)
 多因子 Hensel 提升:将 k 个模 p 因子同时提升到 mod p^target_k.
static std::vector< BigInt > hl_poly_add_mod (const std::vector< BigInt > &a, const std::vector< BigInt > &b, const BigInt &m)
 多项式加法(BigInt 系数),结果模 m 归约.
static std::pair< std::vector< BigInt >, std::vector< BigInt > > hl_poly_divmod (const std::vector< BigInt > &a, const std::vector< BigInt > &b, const BigInt &m)
 多项式带余除法(BigInt 系数),模 m 下运算.
static std::vector< BigInt > hl_poly_mul_mod (const std::vector< BigInt > &a, const std::vector< BigInt > &b, const BigInt &m)
 多项式乘法(BigInt 系数),结果模 m 归约.
static std::vector< BigInt > hl_poly_sub_mod (const std::vector< BigInt > &a, const std::vector< BigInt > &b, const BigInt &m)
 多项式减法(BigInt 系数),结果模 m 归约.
static void hl_reduce_coeffs (std::vector< BigInt > &poly, const BigInt &m)
 对多项式系数向量执行模归约(对称表示).
HenselLiftPair hl_two_factor_lift (const std::vector< BigInt > &f, const HenselLiftPair &current)
 执行一步二次 Hensel 提升:mod m -> mod m^2.
static Result< void > hl_validate_lift_inputs (const Polynomial< BigInt > &poly, const std::vector< std::vector< BigInt > > &factor_vecs, int64_t prime)
ExprResult imag (const ExprPtr &expression)
ExprResult imag (const ExprPtr &expression, ComputationContext &context)
ExpressionResult imag_part_checked (const std::shared_ptr< SymbolicExpr > &expr)
ExpressionResult imag_part_checked (const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)
ExprResult imaginary_unit ()
std::shared_ptr< SymbolicExpr > implicit_diff (std::shared_ptr< SymbolicExpr > expression, const std::string &independent_variable, const std::string &dependent_variable)
int infinity_sign (const SymbolicExpr &expression, ComputationContext &context)
static Result< bool > inflection_curve_defined (const std::shared_ptr< SymbolicExpr > &f, const std::shared_ptr< SymbolicExpr > &f_prime, const std::shared_ptr< SymbolicExpr > &f_double_prime, const std::shared_ptr< SymbolicExpr > &point, const std::string &var, const FactsQuery &facts, const std::string &operation, ComputationContext &context)
SymbolicExprVectorResult inflection_points_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var)
SymbolicExprVectorResult inflection_points_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, ComputationContext &context)
ExprResult integer (const BigInt &value)
ExprResult integer (int value)
NumberDomainSet integers ()
Result< SymbolicExpr > integrate_multiple_checked (const SymbolicExpr &integrand, const std::vector< IntegrationStep > &steps, Integrator &integrator, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > integrating_factor_from_antiderivative (const std::shared_ptr< SymbolicExpr > &antiderivative, const std::string &variable, ComputationContext &context)
static ExpressionResult integrating_factor_from_ratio (const std::shared_ptr< SymbolicExpr > &ratio, const std::string &variable, const std::string &excluded_variable, Integrator &integrator, ComputationContext &context)
std::optional< int > integration_bounded_exponent (const NumberNode &number, int minimum_exponent, int maximum_exponent)
ExprResult interval (const ExprPtr &lower, const ExprPtr &upper, bool lower_closed, bool upper_closed, ComputationContext &context)
ExprResult interval (ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
Result< bool > interval_contains_checked (const Interval &interval, double value)
Result< bool > interval_contains_checked (const Interval &interval, double value, ComputationContext &context)
static Result< bool > interval_covers_checked_impl (const Interval &outer, const Interval &inner, ComputationContext &context)
 判断 outer 是否完全包含 inner。 包含条件为 outer.lower <= inner.lower 且 inner.upper <= outer.upper, 并结合端点的开闭属性判断边界。
Result< bool > interval_is_empty_checked (const Interval &interval)
Result< bool > interval_is_empty_checked (const Interval &interval, ComputationContext &context)
static std::shared_ptr< const SymbolicNode > interval_to_expr (const Interval &interval, const std::shared_ptr< const SymbolicNode > &variable)
static bool intervals_equivalent (const Interval &left, const Interval &right)
static Result< bool > intervals_overlap_checked_impl (const Interval &a, const Interval &b, ComputationContext &context)
 判断两个区间是否存在已证明的交集。 端点排序采用受检区间运算;超出支持域时,交集判定仍为未决。
static ExpressionResult inverse_branch_derivative (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::vector< std::shared_ptr< SymbolicExpr > > &candidates, const std::string &operation, ComputationContext &context)
ExpressionResult inverse_derivative_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &point)
ExpressionResult inverse_derivative_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &point, ComputationContext &context)
TransformEngineResult inverse_fourier_transform_checked (const std::shared_ptr< SymbolicExpr > &F, const std::string &omega, const std::string &t)
TransformEngineResult inverse_fourier_transform_checked (const std::shared_ptr< SymbolicExpr > &F, const std::string &omega, const std::string &t, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > inverse_fourier_transform_core (const std::shared_ptr< SymbolicExpr > &F, const std::string &omega, const std::string &t, ComputationContext &context)
SymbolicExprVectorResult inverse_function_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &y)
SymbolicExprVectorResult inverse_function_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &y, ComputationContext &context)
TransformEngineResult inverse_laplace_checked (const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t)
TransformEngineResult inverse_laplace_checked (const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > inverse_laplace_core (const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t, ComputationContext &context)
static bool is_alternating_factor (const std::shared_ptr< const SymbolicNode > &node, const std::string &n)
ComplexBoolResult is_analytic_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &z)
ComplexBoolResult is_analytic_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &z, ComputationContext &context)
static bool is_analytic_impl (const std::shared_ptr< SymbolicExpr > &, const std::string &, ComputationContext &context)
bool is_bernoulli_ode (const std::shared_ptr< SymbolicExpr > &rhs, const std::string &x, const std::string &y, std::shared_ptr< SymbolicExpr > &P, std::shared_ptr< SymbolicExpr > &Q, int &n)
bool is_constant_coefficient (const std::vector< std::shared_ptr< SymbolicExpr > > &coeffs, const std::string &x)
bool is_euler_equation (const std::vector< std::shared_ptr< SymbolicExpr > > &coeffs, const std::string &x, std::vector< double > &euler_consts)
bool is_even_integer_number (const NumberNode &num)
bool is_exact_ode (const std::shared_ptr< SymbolicExpr > &M, const std::shared_ptr< SymbolicExpr > &N, const std::string &x, const std::string &y)
bool is_good_prime (int64_t p, const std::vector< BigInt > &leading_coeffs)
 判断素数 p 是否为"好素数"(不整除任何首项系数)
bool is_homogeneous_ode (const std::shared_ptr< SymbolicExpr > &rhs, const std::string &x, const std::string &y)
bool is_integer_number (const NumberNode &num)
bool is_linear_first_order (const std::shared_ptr< SymbolicExpr > &rhs, const std::string &x, const std::string &y, std::shared_ptr< SymbolicExpr > &P, std::shared_ptr< SymbolicExpr > &Q)
bool is_negative_infinity_coefficient (const NumberNode &number)
static bool is_nonreal_sqrt (const FunctionNode &function, ComputationContext &context)
static bool is_pi_variable (const VariableNode &variable)
__attribute__((visibility("default"))) MixedTranscendentalResult solve_mixed_transcendental_checked(const std __attribute__((visibility("default"))) MixedTranscendentalResult solve_mixed_transcendental_checked(const std __attribute__((visibility("default"))) bool contains_transcendental_of_var(const std bool is_polynomial_after_substitution (const TransSubstitutionResult &sub_result)
 在调用方计算上下文中执行混合超越方程求解.
bool is_positive_integer_number (const NumberNode &num)
static bool is_representable_small_integer (double value)
 将 double 值转为"干净"的数值表达式.
bool is_separable (const std::shared_ptr< SymbolicExpr > &rhs, const std::string &x, const std::string &y)
static bool is_variable_operand (const std::shared_ptr< const VariableNode > &node)
static Result< bool > is_vertical_asymptote (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &point, ComputationContext &context)
static bool is_wildcard (const std::shared_ptr< const SymbolicNode > &node, const std::unordered_set< std::string > &wildcards, std::string &name_out)
bool is_zero_dimensional (const std::vector< FGLMPoly > &basis, size_t num_vars)
bool is_zero_number (const NumberNode &num)
static std::pair< SymbolicExpr, SymbolicExpr > isolate_linear_coeff (const SymbolicExpr &expr, const std::string &var, ComputationContext &context)
Result< std::vector< std::pair< Rational, Rational > > > isolate_real_roots_checked (const Polynomial< Rational > &polynomial)
Result< std::vector< std::pair< Rational, Rational > > > isolate_real_roots_checked (const Polynomial< Rational > &polynomial, ComputationContext &context)
std::vector< IsolatedInterval > isolate_roots (const std::shared_ptr< SymbolicExpr > &expr, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &var, const SearchInterval &interval, const SolveOptions &opts)
std::shared_ptr< SymbolicExpr > jacobian (const std::vector< std::shared_ptr< SymbolicExpr > > &functions, const std::vector< std::string > &vars)
VectorCalculusExprResult jacobian_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &functions, const std::vector< std::string > &vars)
VectorCalculusExprResult jacobian_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &functions, const std::vector< std::string > &vars, ComputationContext &context)
JordanDecompositionResult jordan_form_checked (const ExprPtr &A)
JordanDecompositionResult jordan_form_checked (const ExprPtr &A, ComputationContext &context)
std::shared_ptr< SymbolicExpr > kronecker (const std::shared_ptr< SymbolicExpr > &A, const std::shared_ptr< SymbolicExpr > &B)
static std::vector< Rational > lagrange_basis_coefficients (const std::vector< Rational > &points, size_t i, const Rational &denom)
static VectorCalculusFieldResult lagrange_gradient_strict (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const std::string &operation, detail::RewriteBudget &transform_budget)
static MultiPoly lagrange_interpolate (const std::vector< Rational > &points, const std::vector< MultiPoly > &values, const std::string &main_var, const std::vector< std::string > &all_vars)
static std::vector< std::string > lagrange_multiplier_names (size_t count)
std::vector< std::map< std::string, std::shared_ptr< SymbolicExpr > > > lagrange_multipliers (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::shared_ptr< SymbolicExpr > > &constraints, const std::vector< std::string > &vars)
LagrangeResult lagrange_multipliers_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::shared_ptr< SymbolicExpr > > &constraints, const std::vector< std::string > &vars)
LagrangeResult lagrange_multipliers_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::shared_ptr< SymbolicExpr > > &constraints, const std::vector< std::string > &vars, ComputationContext &context)
static LagrangeResult lagrange_multipliers_strict (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::shared_ptr< SymbolicExpr > > &constraints, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
static std::shared_ptr< SymbolicExpr > lagrange_stationarity_equation (const VectorField &gradient, const std::vector< VectorField > &constraints, const std::vector< std::string > &multipliers, size_t index)
uint64_t lammp_gcd (uint64_t a, uint64_t b)
 计算两个无符号整数的最大公约数(调用 LMMP)
bool lammp_is_prime (uint64_t n)
 判断无符号整数是否为素数
uint64_t lammp_next_prime (uint64_t n)
 求大于 n 的下一个素数
TransformEngineResult laplace_transform_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &s)
TransformEngineResult laplace_transform_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &s, ComputationContext &context)
std::shared_ptr< SymbolicExpr > laplacian (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars)
VectorCalculusExprResult laplacian_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars)
VectorCalculusExprResult laplacian_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context)
ExpressionResult laurent_series_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &center, int order_neg, int order_pos)
ExpressionResult laurent_series_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &center, int order_neg, int order_pos, ComputationContext &context)
LaurentSeriesResult laurent_series_full_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &center, int order_neg, int order_pos)
LaurentSeriesResult laurent_series_full_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &center, int order_neg, int order_pos, ComputationContext &context)
static LaurentSeriesResult laurent_series_full_impl (const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::shared_ptr< SymbolicExpr > &, int, int, ComputationContext &)
Monomial lcm_monomial (const Monomial &a, const Monomial &b)
 计算两个单项式的最小公倍单项式
ExprResult le (const ExprPtr &lhs, const ExprPtr &rhs)
DifferentialGeometryExprResult lie_derivative_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::shared_ptr< SymbolicExpr > > &X, const std::vector< std::string > &vars, int order)
DifferentialGeometryExprResult lie_derivative_checked (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::shared_ptr< SymbolicExpr > > &X, const std::vector< std::string > &vars, int order, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > lie_derivative_impl (const std::shared_ptr< SymbolicExpr > &, const std::vector< std::shared_ptr< SymbolicExpr > > &, const std::vector< std::string > &, int, ComputationContext &context)
static MultiPoly lifting_error_coefficient (const MultiPoly &error, const std::string &lift_var, int lift_var_idx, const Rational &eval_point, int k, const std::vector< MultiPoly > &shift_powers, const std::vector< std::string > &vars)
static bool lifting_residual_is_zero (const MultiPoly &verify_error, int lift_var_idx, int k)
static std::vector< MultiPoly > lifting_shift_powers (const std::vector< std::string > &vars, int lift_var_idx, const Rational &eval_point, int degree_bound)
ExpressionResult lim_inf_checked (const std::shared_ptr< SymbolicExpr > &a_n, const std::string &n)
ExpressionResult lim_inf_checked (const std::shared_ptr< SymbolicExpr > &a_n, const std::string &n, ComputationContext &context)
ExpressionResult lim_sup_checked (const std::shared_ptr< SymbolicExpr > &a_n, const std::string &n)
ExpressionResult lim_sup_checked (const std::shared_ptr< SymbolicExpr > &a_n, const std::string &n, ComputationContext &context)
LimitResult limit_checked (const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, Domain domain)
LimitResult limit_checked (const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, Domain domain)
LimitExpressionResult limit_expression_checked (const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, Domain domain)
LimitExpressionResult limit_expression_checked (const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, Domain domain)
LineSymbolicResult line_from_two_points_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &p1, const std::vector< std::shared_ptr< SymbolicExpr > > &p2)
LineSymbolicResult line_from_two_points_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &p1, const std::vector< std::shared_ptr< SymbolicExpr > > &p2, ComputationContext &context)
VectorExprListResult line_plane_intersection_checked (const LineSymbolic &line, const PlaneSymbolic &plane)
VectorExprListResult line_plane_intersection_checked (const LineSymbolic &line, const PlaneSymbolic &plane, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > linear2_root_basis (const std::vector< ode_root_detail::CharRoot > &roots, const std::string &x)
ExprResult log (const ExprPtr &expression)
ExprResult log (const ExprPtr &expression, ComputationContext &context)
ExprResult log10 (const ExprPtr &expression)
ExprResult log10 (const ExprPtr &expression, ComputationContext &context)
std::shared_ptr< SymbolicExpr > log_differentiate (const std::shared_ptr< SymbolicExpr > &f, const std::string &var)
ExprResult logical_and (const ExprPtr &lhs, const ExprPtr &rhs)
ExprResult logical_not (const ExprPtr &expression)
ExprResult logical_or (const ExprPtr &lhs, const ExprPtr &rhs)
template<typename Transform>
std::shared_ptr< SymbolicExpr > lookup_integral (const std::vector< detail::IntegrationEntry > &table, const SymbolicExpr &matched, const std::string &matched_variable, detail::RewriteBudget &budget, Transform &&transform)
ExprResult lt (const ExprPtr &lhs, const ExprPtr &rhs)
LUDecompositionResult lu_decomposition_checked (const std::shared_ptr< SymbolicExpr > &A)
LUDecompositionResult lu_decomposition_checked (const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > make_abs (std::shared_ptr< SymbolicExpr > expr)
 Wrap an expression in abs() to signal positive-branch preference.
std::shared_ptr< SymbolicExpr > make_arctan (const std::shared_ptr< SymbolicExpr > &operand)
ComplexSymbolic make_complex (std::shared_ptr< SymbolicExpr > real, std::shared_ptr< SymbolicExpr > imag)
 构造符号复数
SymbolicSetResult make_finite_set (std::vector< std::shared_ptr< SymbolicExpr > > elements, ComputationContext &context)
SymbolicSetResult make_interval (const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, bool lower_closed, bool upper_closed, ComputationContext &context)
SymbolicSetResult make_membership (const std::shared_ptr< SymbolicExpr > &element, const std::shared_ptr< SymbolicExpr > &set, ComputationContext &context)
std::shared_ptr< const SymbolicNode > make_normalized_multiply_node (const std::vector< std::shared_ptr< const SymbolicNode > > &operands, detail::RewriteBudget *budget=nullptr)
RootOfConstructionResult make_rootof_checked (const std::shared_ptr< SymbolicExpr > &polynomial, const std::string &variable, std::size_t index)
RootOfConstructionResult make_rootof_checked (const std::shared_ptr< SymbolicExpr > &polynomial, const std::string &variable, std::size_t index, ComputationContext &context)
std::vector< std::shared_ptr< SymbolicExpr > > make_rootof_solutions (const Polynomial< SymbolicPolyCoeff > &poly, const std::string &var)
std::shared_ptr< SymbolicExpr > make_unary_function (FunctionNode::FuncType type, const std::shared_ptr< SymbolicExpr > &operand)
static bool match_commutative_recursive (const std::vector< std::shared_ptr< const SymbolicNode > > &p_ops, const std::vector< std::shared_ptr< const SymbolicNode > > &t_ops, std::vector< bool > &used_t, size_t p_index, const std::unordered_set< std::string > &wildcards, MatchMap &results)
static bool match_function (const FunctionNode &pattern, const FunctionNode &target, const std::unordered_set< std::string > &wildcards, MatchMap &results)
template<typename Operation>
static bool match_operation (const Operation &pattern, const Operation &target, const std::unordered_set< std::string > &wildcards, const char *rest_key, MatchMap &results)
static bool match_recursive (const std::shared_ptr< const SymbolicNode > &p_node, const std::shared_ptr< const SymbolicNode > &t_node, const std::unordered_set< std::string > &wildcards, MatchMap &results)
ExpressionResult matrix_characteristic_polynomial_checked (const std::shared_ptr< SymbolicExpr > &A, const std::string &variable)
ExpressionResult matrix_characteristic_polynomial_checked (const std::shared_ptr< SymbolicExpr > &A, const std::string &variable, ComputationContext &context)
ExpressionResult matrix_determinant_checked (const std::shared_ptr< SymbolicExpr > &A)
ExpressionResult matrix_determinant_checked (const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
MatrixEigenvalueResult matrix_eigenvalues_checked (const std::shared_ptr< SymbolicExpr > &A)
MatrixEigenvalueResult matrix_eigenvalues_checked (const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
MatrixEigenvectorResult matrix_eigenvectors_checked (const std::shared_ptr< SymbolicExpr > &A)
MatrixEigenvectorResult matrix_eigenvectors_checked (const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
ExprPtr matrix_exp (const ExprPtr &A)
ExpressionResult matrix_inverse_checked (const std::shared_ptr< SymbolicExpr > &A)
ExpressionResult matrix_inverse_checked (const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
ExprPtr matrix_log (const ExprPtr &A)
ExpressionResult matrix_multiply_checked (const std::shared_ptr< SymbolicExpr > &A, const std::shared_ptr< SymbolicExpr > &B)
ExpressionResult matrix_multiply_checked (const std::shared_ptr< SymbolicExpr > &A, const std::shared_ptr< SymbolicExpr > &B, ComputationContext &context)
std::shared_ptr< SymbolicExpr > matrix_norm (const std::shared_ptr< SymbolicExpr > &A, const std::string &type)
MatrixNullspaceResult matrix_nullspace_checked (const std::shared_ptr< SymbolicExpr > &A)
MatrixNullspaceResult matrix_nullspace_checked (const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
MatrixRankResult matrix_rank_checked (const std::shared_ptr< SymbolicExpr > &A)
MatrixRankResult matrix_rank_checked (const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
ExpressionResult matrix_reflection_checked (double angle, int dim)
ExpressionResult matrix_reflection_checked (double angle, int dim, ComputationContext &context)
ExpressionResult matrix_rotation_checked (double theta, int dim)
ExpressionResult matrix_rotation_checked (double theta, int dim, ComputationContext &context)
ExpressionResult matrix_rref_checked (const std::shared_ptr< SymbolicExpr > &A)
ExpressionResult matrix_rref_checked (const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
ExpressionResult matrix_scaling_checked (double sx, double sy, int dim)
ExpressionResult matrix_scaling_checked (double sx, double sy, int dim, ComputationContext &context)
MatrixLinearSolveResult matrix_solve_linear_checked (const std::shared_ptr< SymbolicExpr > &coefficients, const std::shared_ptr< SymbolicExpr > &right_hand_side)
MatrixLinearSolveResult matrix_solve_linear_checked (const std::shared_ptr< SymbolicExpr > &coefficients, const std::shared_ptr< SymbolicExpr > &right_hand_side, ComputationContext &context)
std::shared_ptr< SymbolicExpr > matrix_trace (const std::shared_ptr< SymbolicExpr > &A)
ExprResult member (const ExprPtr &element, const ExprPtr &set, ComputationContext &context)
ExprResult membership (const ExprPtr &element, const ExprPtr &set, bool negated)
DifferentialGeometryExprResult metric_inverse_checked (const std::shared_ptr< SymbolicExpr > &g_ij)
DifferentialGeometryExprResult metric_inverse_checked (const std::shared_ptr< SymbolicExpr > &g_ij, ComputationContext &context)
VectorCalculusExprResult mixed_product (const VectorField &a, const VectorField &b, const VectorField &c)
static VectorCalculusExprResult mixed_product_impl (const VectorField &a, const VectorField &b, const VectorField &c, detail::RewriteBudget &transform_budget)
ExprResult mul (const ExprPtr &lhs, const ExprPtr &rhs)
ExprResult mul (const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
std::pair< int64_t, int64_t > multi_crt (const std::vector< int64_t > &residues, const std::vector< int64_t > &primes)
 多模数中国剩余定理
CrtResult multi_crt_checked (const std::vector< int64_t > &residues, const std::vector< int64_t > &primes)
CrtResult multi_crt_checked (const std::vector< int64_t > &residues, const std::vector< int64_t > &primes, ComputationContext &context)
 Checked CRT for a non-empty list of pairwise coprime positive moduli.
static std::shared_ptr< const NumberNode > multiply_number_nodes (const std::shared_ptr< const NumberNode > &a, const std::shared_ptr< const NumberNode > &b)
std::shared_ptr< const NumberNode > multiply_numbers (const std::shared_ptr< const NumberNode > &a, const std::shared_ptr< const NumberNode > &b)
 两个数值节点相乘
static std::shared_ptr< SymbolicExpr > multipoly_to_symbolic (const LMCAS::MultiPoly &poly, ComputationContext &context)
MultiPoly multivariate_content (const MultiPoly &poly, const std::string &main_var)
std::vector< MultiPoly > multivariate_diophantine (const std::vector< MultiPoly > &factors, const MultiPoly &target, const std::string &var, const Rational &eval_point, int degree_bound)
 多元丢番图方程求解器
static std::shared_ptr< SymbolicExpr > multivariate_factor_expression (const MultiFactorResult &result, ComputationContext &context)
MultiPoly multivariate_gcd (const MultiPoly &a, const MultiPoly &b)
std::vector< MultiPoly > multivariate_hensel_lift (const MultiPoly &poly, const std::vector< Polynomial< Rational > > &univariate_factors, const std::string &lift_var, const Rational &eval_point, int degree_bound)
 多元 Hensel 提升(单变量步)
MultiPoly multivariate_primitive_part (const MultiPoly &poly, const std::string &main_var)
ExprResult ne (const ExprPtr &lhs, const ExprPtr &rhs)
ExprResult neg (const ExprPtr &expression)
ExprResult neg (const ExprPtr &expression, ComputationContext &context)
NumericRootResult newton_raphson_checked (const std::shared_ptr< SymbolicExpr > &function, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &variable, lmmc_real_t initial, ComputationContext &context, const SolveOptions &options)
NumericRootResult newton_raphson_checked (const std::shared_ptr< SymbolicExpr > &function, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &variable, lmmc_real_t initial, const SolveOptions &options)
NumericRootResult newton_raphson_checked (const std::shared_ptr< SymbolicExpr > &function, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &variable, lmmc_real_t initial, lmmc_real_t bracket_lower, lmmc_real_t bracket_upper, ComputationContext &context, const SolveOptions &options)
NumericRootResult newton_raphson_checked (const std::shared_ptr< SymbolicExpr > &function, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &variable, lmmc_real_t initial, lmmc_real_t bracket_lower, lmmc_real_t bracket_upper, const SolveOptions &options)
std::shared_ptr< const SymbolicNode > norm_subst_index (const std::shared_ptr< const SymbolicNode > &node, const std::string &index_var, const std::shared_ptr< const SymbolicNode > &value, detail::RewriteBudget *budget=nullptr)
FGLMPoly normal_form (const FGLMPoly &f, const std::vector< FGLMPoly > &basis, const MonomialOrder &order)
void normalization_append (detail::RewriteBudget *budget, std::size_t &nodes, std::vector< std::shared_ptr< const SymbolicNode > > &children, std::shared_ptr< const SymbolicNode > child)
bool normalization_can_discard (const std::shared_ptr< const SymbolicNode > &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
template<class Parent>
std::size_t normalization_check_arithmetic (detail::RewriteBudget *budget, const std::vector< std::shared_ptr< const SymbolicNode > > &children, std::size_t nodes, bool wrapped=true)
template<class Parent, class... Nodes>
std::size_t normalization_check_arithmetic (detail::RewriteBudget *budget, std::size_t extra_nodes, const std::shared_ptr< const Nodes > &... children)
template<class... Nodes>
void normalization_check_children (detail::RewriteBudget *budget, std::size_t roots, const std::shared_ptr< const Nodes > &... children)
void normalization_check_children (detail::RewriteBudget *budget, std::size_t roots, const std::vector< std::shared_ptr< const SymbolicNode > > &children)
std::size_t normalization_check_count (detail::RewriteBudget *budget, std::size_t rows, std::size_t cols=1, bool wrapped=true)
std::shared_ptr< const NumberNode > normalization_exact_square_root (const NumberNode &number)
bool normalization_factor_less (const std::shared_ptr< const SymbolicNode > &left, const std::shared_ptr< const SymbolicNode > &right)
std::shared_ptr< const SymbolicNode > normalization_imaginary_power (const BigInt &exponent, detail::RewriteBudget *budget=nullptr)
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 SymbolicNode > normalization_numeric_power (const std::shared_ptr< const NumberNode > &base, const std::shared_ptr< const NumberNode > &exponent, detail::RewriteBudget *budget=nullptr)
std::shared_ptr< const SymbolicNode > normalization_pi_function (FunctionNode::FuncType type, const Rational &coefficient, detail::RewriteBudget *budget=nullptr)
bool normalization_proved (const Result< Tribool > &result)
static MultiPoly normalize_gcd_candidate (MultiPoly candidate, const Rational &content)
Result< std::vector< Interval > > normalize_intervals_checked (std::vector< Interval > intervals)
Result< std::vector< Interval > > normalize_intervals_checked (std::vector< Interval > intervals, ComputationContext &context)
static bool numeric_domain_excludes (double value, Domain domain)
static bool numeric_sign_excludes (double value, const AssumptionContext &ctx, const std::string &variable)
static std::shared_ptr< SymbolicExpr > numeric_token_value (const std::string &str, size_t start, size_t &pos, bool decimal)
std::ostream & operator<< (std::ostream &os, const Irrational &value)
template<typename T>
std::ostream & operator<< (std::ostream &os, const Polynomial< T > &p)
 多项式流输出运算符
static FrobeniusSolutionResult ordinary_frobenius_solution (const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, const std::shared_ptr< SymbolicExpr > &x_minus_x0, FrobeniusSolution result, ComputationContext &context)
static Result< std::vector< double > > ordinary_series_recurrence (const OdeTaylorCoefficients &coefficients, int order)
static Result< OdeTaylorCoefficients > ordinary_taylor_coefficients (const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, int order, ComputationContext &context)
static std::map< std::string, std::shared_ptr< SymbolicExpr > > parametric_linear_solution (const ParametricMatrix &A, const ParametricVector &b, const std::vector< size_t > &pivot_cols, const std::vector< size_t > &pivot_rows, const std::vector< std::string > &unknowns, ComputationContext &context)
static Tribool parametric_nonzero_value (const std::shared_ptr< SymbolicExpr > &expression, ComputationContext &context)
static bool parametric_residual_zero (const std::shared_ptr< SymbolicExpr > &expression, ComputationContext &context)
static bool parametric_zero (const std::shared_ptr< SymbolicExpr > &expression, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > parse_approximate_atom (const std::string &str, size_t &pos)
static bool parse_endpoint_value (const std::string &str, size_t &pos, Endpoint &ep)
ExprResult parse_expr (const std::string &source)
ExprResult parse_expr (const std::string &source, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > parse_fraction (const std::string &str, size_t start, size_t &pos)
static bool parse_interval_lower (const std::string &str, size_t &pos, Endpoint &lower)
static bool parse_interval_upper (const std::string &str, size_t &pos, Endpoint &upper)
static std::shared_ptr< SymbolicExpr > parse_numeric_value (const std::string &str, size_t &pos)
static bool parse_single_interval (const std::string &str, size_t &pos, Interval &iv)
ExprResult phi ()
ExprResult pi ()
PlaneSymbolicResult plane_from_three_points_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &p1, const std::vector< std::shared_ptr< SymbolicExpr > > &p2, const std::vector< std::shared_ptr< SymbolicExpr > > &p3)
PlaneSymbolicResult plane_from_three_points_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &p1, const std::vector< std::shared_ptr< SymbolicExpr > > &p2, const std::vector< std::shared_ptr< SymbolicExpr > > &p3, ComputationContext &context)
PlaneSymbolic plane_general (std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b, std::shared_ptr< SymbolicExpr > c, std::shared_ptr< SymbolicExpr > d)
 由一般方程系数构造平面 ax + by + cz = d。
ExpressionResult point_plane_distance_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &point, const PlaneSymbolic &plane)
ExpressionResult point_plane_distance_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &point, const PlaneSymbolic &plane, ComputationContext &context)
static ExprPtr polynomial_logic (const ExprPtr &left, const ExprPtr &right, LogicalNode::Op op)
template<typename T>
bool polynomial_product_fits (const Polynomial< T > &left, const Polynomial< T > &right)
static ExprPtr polynomial_relation (const ExprPtr &left, const ExprPtr &right, RelationOp op)
static std::vector< BigInt > positive_divisors (const BigInt &n)
ExprResult pow (const ExprPtr &base, const ExprPtr &exponent)
ExprResult pow (const ExprPtr &base, const ExprPtr &exponent, ComputationContext &context)
std::vector< std::shared_ptr< SymbolicExpr > > power_series_add (const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b)
PowerSeriesResult power_series_compose_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &f, const std::vector< std::shared_ptr< SymbolicExpr > > &g, int order)
PowerSeriesResult power_series_compose_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &f, const std::vector< std::shared_ptr< SymbolicExpr > > &g, int order, ComputationContext &context)
PowerSeriesResult power_series_multiply_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, int order)
PowerSeriesResult power_series_multiply_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, int order, ComputationContext &context)
static std::optional< ConvergenceInfo > power_term_convergence (const std::shared_ptr< const SymbolicNode > &node, const std::string &index_var)
static Result< FourierPeriod > prepare_fourier_period (const std::shared_ptr< SymbolicExpr > &period, const std::string &var, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > product_without_factor (const MultiplyNode &product, size_t omitted)
static ExprSetResult project_finite_expr_set (const ExprPtr &original, const std::string &variable, ComputationContext &context, const SolveOptions &options)
QRDecompositionResult qr_decomposition_checked (const std::shared_ptr< SymbolicExpr > &A)
QRDecompositionResult qr_decomposition_checked (const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
std::shared_ptr< SymbolicExpr > quadratic_form_matrix (const std::shared_ptr< SymbolicExpr > &expr, const std::vector< std::string > &vars)
Result< QuadratureEstimate > quadrature_gaussian_numeric (const std::shared_ptr< SymbolicExpr > &function, const std::string &variable, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, int order)
Result< QuadratureEstimate > quadrature_gaussian_numeric (const std::shared_ptr< SymbolicExpr > &function, const std::string &variable, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, int order)
Result< QuadratureEstimate > quadrature_simpson_numeric (const std::shared_ptr< SymbolicExpr > &function, const std::string &variable, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, int subdivisions)
Result< QuadratureEstimate > quadrature_simpson_numeric (const std::shared_ptr< SymbolicExpr > &function, const std::string &variable, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, int subdivisions)
QuantityResult quantity_add (const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs, ComputationContext &context)
QuantityResult quantity_divide (const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs, ComputationContext &context)
QuantityResult quantity_multiply (const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs, ComputationContext &context)
QuantityResult quantity_power (const std::shared_ptr< SymbolicExpr > &base, const std::shared_ptr< SymbolicExpr > &exponent, ComputationContext &context)
QuantityResult quantity_subtract (const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs, ComputationContext &context)
int quotient_dimension (const std::vector< FGLMPoly > &basis, size_t num_vars, int max_degree)
static ConvergenceInfoResult ratio_convergence_test (const std::shared_ptr< SymbolicExpr > &general_term, const std::string &index_var, ComputationContext &context)
ExprResult rational (const Rational &value)
static Rational rational_gcd (const Rational &a, const Rational &b)
RationalReconstructionResult rational_reconstruction_checked (int64_t x, int64_t m)
RationalReconstructionResult rational_reconstruction_checked (int64_t x, int64_t m, ComputationContext &context)
 Checked rational reconstruction.
static std::optional< Rational > rational_root_candidate (const Polynomial< Rational > &current)
static std::vector< std::shared_ptr< const SymbolicNode > > rational_root_factors (const std::vector< Rational > &roots, const Rational &leading, const std::shared_ptr< SymbolicExpr > &x_node, ComputationContext &context)
static Polynomial< Rational > rational_root_product (const std::vector< Rational > &roots, const Rational &leading, const std::string &var)
static Polynomial< SymbolicPolyCoeff > rational_to_symbolic_poly (const Polynomial< Rational > &rat_poly)
NumberDomainSet rationals ()
ExprResult real (const ExprPtr &expression)
ExprResult real (const ExprPtr &expression, ComputationContext &context)
ExpressionResult real_part_checked (const std::shared_ptr< SymbolicExpr > &expr)
ExpressionResult real_part_checked (const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)
NumberDomainSet reals ()
Result< OptionalRationalPolynomial > recognize_rational_polynomial (const SymbolicExpr &expression, const std::string &variable, ComputationContext &context)
static Result< int > recognize_regular_laurent (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, ComputationContext &context)
static std::optional< ExpressionResult > reconstruct_rational_root_factors (const Polynomial< Rational > &polynomial, const std::vector< Rational > &roots, const std::string &var, ComputationContext &context)
static RationalRootReconstruction reconstruct_rational_roots (const Polynomial< Rational > &polynomial, const std::vector< Rational > &roots, const std::string &variable, ComputationContext &context)
template<typename Operation>
static void record_remainder (const Operation &target, const std::vector< bool > &used, const char *key, MatchMap &results)
static MultiPoly recursive_multivariate_gcd (const MultiPoly &a, const MultiPoly &b, const std::vector< std::string > &vars)
std::optional< NumericRoot > refine_root (const std::shared_ptr< SymbolicExpr > &expr, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &var, const IsolatedInterval &interval, const SolveOptions &opts)
static bool regular_laurent_type (FunctionNode::FuncType type)
ExprResult relation (const ExprPtr &lhs, const ExprPtr &rhs, RelationOp op)
std::optional< RelationOp > relation_op (const ExprPtr &expression) noexcept
ExpressionResult residue_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &z, const std::shared_ptr< SymbolicExpr > &z0, int order)
ExpressionResult residue_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &z, const std::shared_ptr< SymbolicExpr > &z0, int order, ComputationContext &context)
static Monomial restore_main_exponent (const Monomial &reduced, size_t variable_count, int variable_index, int exponent)
DifferentialGeometryExprResult riemann_curvature_tensor_checked (const std::shared_ptr< SymbolicExpr > &g_ij, const std::vector< std::string > &coords, int rho, int sigma, int mu, int nu)
DifferentialGeometryExprResult riemann_curvature_tensor_checked (const std::shared_ptr< SymbolicExpr > &g_ij, const std::vector< std::string > &coords, int rho, int sigma, int mu, int nu, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > riemann_curvature_tensor_with_inverse (const std::shared_ptr< SymbolicExpr > &g_ij, const std::shared_ptr< SymbolicExpr > &g_up_ij, const std::vector< std::string > &coords, int rho, int sigma, int mu, int nu, ComputationContext &context)
bool root_less_than (const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
RootOfEvaluationResult rootof_evaluate_checked (const std::shared_ptr< SymbolicExpr > &rootof_expr)
RootOfEvaluationResult rootof_evaluate_checked (const std::shared_ptr< SymbolicExpr > &rootof_expr, ComputationContext &context)
RootOfComplexEvaluationResult rootof_evaluate_complex_checked (const std::shared_ptr< SymbolicExpr > &rootof_expr)
RootOfComplexEvaluationResult rootof_evaluate_complex_checked (const std::shared_ptr< SymbolicExpr > &rootof_expr, ComputationContext &context)
std::shared_ptr< SymbolicExpr > rootof_simplify (const std::shared_ptr< SymbolicExpr > &rootof_expr)
ExprSetResult roots (const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)
ExprSetResult roots (const ExprPtr &expression, const std::string &variable, const SolveOptions &options)
bool roots_equal (const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
ExprResult round (const ExprPtr &expression)
ExprResult round (const ExprPtr &expression, ComputationContext &context)
VectorCalculusExprResult scalar_project (const VectorField &a, const VectorField &b)
static VectorCalculusExprResult scalar_project_impl (const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)
static detail::SymbolicNodePtr scale_integral_field (const detail::SymbolicNodePtr &value, const detail::SymbolicNodePtr &coefficient, detail::RewriteBudget &budget)
static bool separable_product (const MultiplyNode &product, const std::string &x, const std::string &y)
static bool separable_reciprocal (const PowerNode &power, const std::string &x, const std::string &y)
static ExpressionResult sequence_extreme_limit (const std::shared_ptr< SymbolicExpr > &a_n, const std::string &n, bool upper, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > series_abs (const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)
static bool series_extract_alternating (const std::shared_ptr< const SymbolicNode > &node, const std::string &n, std::shared_ptr< SymbolicExpr > &remainder)
double series_get_double (const std::shared_ptr< SymbolicExpr > &expression)
static bool series_index_variable (const std::shared_ptr< const VariableNode > &variable, const std::string &index_var)
bool series_is_infinity (const std::shared_ptr< SymbolicExpr > &expression)
bool series_is_infinity (const std::shared_ptr< SymbolicExpr > &expression)
bool series_is_number (const std::shared_ptr< SymbolicExpr > &expression)
static std::shared_ptr< SymbolicExpr > series_negate (const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)
double series_number_value (const NumberNode &number)
Result< void > set_eqv_budget (EqvOptions &options, std::size_t steps, std::size_t depth, std::size_t growth)
Result< void > set_eqv_profile (EqvOptions &options, const std::string &name)
ExprResult simplify (const ExprPtr &expression)
ExprResult simplify (const ExprPtr &expression, ComputationContext &context)
static bool simplify_finite_limit (std::shared_ptr< SymbolicExpr > &value, ComputationContext &context)
static std::shared_ptr< const SymbolicNode > simplify_pythagorean_sum (const AddNode &sum, const std::string &var)
ExprResult sin (const ExprPtr &expression)
ExprResult sin (const ExprPtr &expression, ComputationContext &context)
static FrobeniusSolutionResult singular_frobenius_solution (const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, const std::shared_ptr< SymbolicExpr > &x_minus_x0, FrobeniusSolution result, ComputationContext &context)
static Result< std::vector< double > > singular_series_recurrence (const OdeTaylorCoefficients &coefficients, double P0, double Q0, double r1, int order)
static Result< OdeTaylorCoefficients > singular_taylor_coefficients (const std::shared_ptr< SymbolicExpr > &xp_expr, const std::shared_ptr< SymbolicExpr > &x2q_expr, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, int order, double P0, double Q0, ComputationContext &context)
ExpressionResult skew_lines_distance_checked (const LineSymbolic &l1, const LineSymbolic &l2)
ExpressionResult skew_lines_distance_checked (const LineSymbolic &l1, const LineSymbolic &l2, ComputationContext &context)
static size_t skip_ws (const std::string &str, size_t pos)
static Result< bool > solution_is_excluded (const std::shared_ptr< SymbolicExpr > &solution, Domain domain, const AssumptionContext &ctx, const std::string &variable, ComputationContext &context)
ExprSetResult solve (const ExprPtr &equation, const std::string &variable, ComputationContext &context, const SolveOptions &options)
ExprSetResult solve (const ExprPtr &equation, const std::string &variable, const SolveOptions &options)
ODESolutionResult solve_bernoulli_ode_checked (const std::shared_ptr< SymbolicExpr > &P, const std::shared_ptr< SymbolicExpr > &Q, int n, const std::string &x, const std::string &y)
ODESolutionResult solve_bernoulli_ode_checked (const std::shared_ptr< SymbolicExpr > &P, const std::shared_ptr< SymbolicExpr > &Q, int n, const std::string &x, const std::string &y, ComputationContext &context)
static ODESolutionResult solve_bernoulli_ode_impl (const std::shared_ptr< SymbolicExpr > &, const std::shared_ptr< SymbolicExpr > &, int, const std::string &, const std::string &, ComputationContext &context)
std::vector< std::shared_ptr< SymbolicExpr > > solve_biquadratic (const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, const std::shared_ptr< SymbolicExpr > &c, const std::string &variable)
std::vector< std::shared_ptr< SymbolicExpr > > solve_by_factoring (const Polynomial< SymbolicPolyCoeff > &poly, const std::string &variable)
static std::vector< std::shared_ptr< SymbolicExpr > > solve_closed_form_from_poly (const Polynomial< SymbolicPolyCoeff > &poly, const std::string &var, ComputationContext &context)
static std::vector< std::shared_ptr< SymbolicExpr > > solve_closed_form_poly (const Polynomial< SymbolicPolyCoeff > &poly, const std::string &var, ComputationContext &context)
ComplexRootsResult solve_complex_nth_root_checked (std::shared_ptr< SymbolicExpr > c, int n)
ComplexRootsResult solve_complex_nth_root_checked (std::shared_ptr< SymbolicExpr > c, int n, ComputationContext &context)
ComplexRootsResult solve_complex_quadratic_checked (std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b, std::shared_ptr< SymbolicExpr > c)
ComplexRootsResult solve_complex_quadratic_checked (std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b, std::shared_ptr< SymbolicExpr > c, ComputationContext &context)
static IntervalUnion solve_constant_inequality (const Polynomial< SymbolicPolyCoeff > &poly, InequalityType type, ComputationContext &context)
std::vector< std::shared_ptr< SymbolicExpr > > solve_cubic (const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, const std::shared_ptr< SymbolicExpr > &c, const std::shared_ptr< SymbolicExpr > &d, const std::string &variable)
static std::vector< std::shared_ptr< SymbolicExpr > > solve_degenerate_cubic (const std::shared_ptr< SymbolicExpr > &b, const std::shared_ptr< SymbolicExpr > &c, const std::shared_ptr< SymbolicExpr > &d, ComputationContext &context)
static std::vector< MultiPoly > solve_diophantine_pair (const std::vector< MultiPoly > &factors, const MultiPoly &target, const std::string &var, const Rational &eval_point, int degree_bound)
LMCAS::SolveResult solve_equation (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)
LMCAS::SolveResult solve_equation (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const SolveOptions &opts)
ODESolutionResult solve_euler_ode_checked (const std::vector< double > &euler_coeffs, const std::shared_ptr< SymbolicExpr > &forcing, const std::string &x, const std::string &y)
ODESolutionResult solve_euler_ode_checked (const std::vector< double > &euler_coeffs, const std::shared_ptr< SymbolicExpr > &forcing, const std::string &x, const std::string &y, ComputationContext &context)
static Result< ODESolution > solve_euler_ode_impl (const std::vector< double > &, const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::string &, ComputationContext &context)
Result< IntervalUnion > solve_exact_affine_inequality (const Polynomial< Rational > &polynomial, InequalityType type, ComputationContext &context)
static SolveVectorResult solve_exact_factor (Polynomial< Rational > remainder, const std::string &var, ComputationContext &context)
ODESolutionResult solve_exact_ode_checked (const std::shared_ptr< SymbolicExpr > &M, const std::shared_ptr< SymbolicExpr > &N, const std::string &x, const std::string &y)
ODESolutionResult solve_exact_ode_checked (const std::shared_ptr< SymbolicExpr > &M, const std::shared_ptr< SymbolicExpr > &N, const std::string &x, const std::string &y, ComputationContext &context)
static ODESolutionResult solve_exact_ode_impl (const std::shared_ptr< SymbolicExpr > &, const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::string &, ComputationContext &context)
Result< IntervalUnion > solve_exact_polynomial_inequality (const Polynomial< Rational > &polynomial, InequalityType type, ComputationContext &context)
static SolveResult solve_exact_polynomial_set (const Polynomial< Rational > &exact, const std::string &var, ComputationContext &context)
ExprSetResult solve_expr_set (const ExprPtr &equation, const std::string &variable, ComputationContext &context, const SolveOptions &options)
ExprSetResult solve_expr_set (const ExprPtr &equation, const std::string &variable, const SolveOptions &options)
LMCAS::FiniteSolveResult solve_finite_checked (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)
LMCAS::FiniteSolveResult solve_finite_checked (const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable, const SolveOptions &options)
static std::optional< SolveVectorResult > solve_finite_mixed (const std::shared_ptr< SymbolicExpr > &f_expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)
FrobeniusSolutionResult solve_frobenius_checked (const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, int order)
FrobeniusSolutionResult solve_frobenius_checked (const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, int order, ComputationContext &context)
static FrobeniusSolutionResult solve_frobenius_impl (const std::shared_ptr< SymbolicExpr > &, const std::shared_ptr< SymbolicExpr > &, const std::shared_ptr< SymbolicExpr > &, const std::string &, int, ODESingularityType, ComputationContext &)
static SolveVectorResult solve_higher_exact_roots (const Polynomial< Rational > &remainder, const std::string &var, ComputationContext &context)
ODESolutionResult solve_higher_order_ode_checked (const std::vector< double > &coeffs, const std::shared_ptr< SymbolicExpr > &forcing, const std::string &x, const std::string &y)
ODESolutionResult solve_higher_order_ode_checked (const std::vector< double > &coeffs, const std::shared_ptr< SymbolicExpr > &forcing, const std::string &x, const std::string &y, ComputationContext &context)
static Result< ODESolution > solve_higher_order_ode_impl (const std::vector< double > &, const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::string &, ComputationContext &context)
ODESolutionResult solve_homogeneous_ode_checked (const std::shared_ptr< SymbolicExpr > &rhs, const std::string &x, const std::string &y)
ODESolutionResult solve_homogeneous_ode_checked (const std::shared_ptr< SymbolicExpr > &rhs, const std::string &x, const std::string &y, ComputationContext &context)
static ODESolutionResult solve_homogeneous_ode_impl (const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::string &, ComputationContext &context)
static LagrangeResult solve_lagrange_strict (const VectorField &equations, const std::vector< std::string > &all_vars, ComputationContext &context, const std::string &operation)
ExprPtr solve_linear1_ode (ExprPtr Px, ExprPtr Qx, const std::string &x, const std::string &y, const AssumptionContext *ctx)
static Result< std::shared_ptr< SymbolicExpr > > solve_linear2_homogeneous (double a, double b, double c, const std::string &x, const std::string &y, const AssumptionContext *ctx, ComputationContext &context)
std::shared_ptr< SymbolicExpr > solve_linear2_ode (double a, double b, double c, std::shared_ptr< SymbolicExpr > fx, const std::string &x, const std::string &y, const AssumptionContext *ctx)
Result< std::shared_ptr< SymbolicExpr > > solve_linear2_ode_checked (double a, double b, double c, std::shared_ptr< SymbolicExpr > fx, const std::string &x, const std::string &y, ComputationContext &context, const AssumptionContext *ctx)
Result< std::shared_ptr< SymbolicExpr > > solve_linear2_ode_checked (double a, double b, double c, std::shared_ptr< SymbolicExpr > fx, const std::string &x, const std::string &y, const AssumptionContext *ctx)
MixedTranscendentalResult solve_mixed_transcendental_checked (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const SolveOptions &opts)
MixedTranscendentalResult solve_mixed_transcendental_checked (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const SolveOptions &opts, ComputationContext &context)
NumericRootsResult solve_numeric_checked (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)
NumericRootsResult solve_numeric_checked (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const SolveOptions &opts)
static SolveResult solve_product_factor (const detail::SymbolicNodePtr &node, const std::string &variable, ComputationContext &context, const SolveOptions &options, std::size_t &multiplicity)
static std::optional< SolveResult > solve_product_set (const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)
std::vector< std::shared_ptr< SymbolicExpr > > solve_quartic (const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, const std::shared_ptr< SymbolicExpr > &c, const std::shared_ptr< SymbolicExpr > &d, const std::shared_ptr< SymbolicExpr > &e, const std::string &variable)
ExprPtr solve_separable_ode (ExprPtr rhs, const std::string &x, const std::string &y, const AssumptionContext *ctx)
SolveResult solve_set (const ExprPtr &equation, const std::string &variable, ComputationContext &context, const SolveOptions &options)
SolveResult solve_set (const ExprPtr &equation, const std::string &variable, const SolveOptions &options)
static SolveResult solve_set_core (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)
static SolveResult solve_symbolic_polynomial_set (const Polynomial< SymbolicPolyCoeff > &polynomial, const ExprPtr &original, const std::string &variable, ComputationContext &context)
static SolveResult solve_symbolic_quadratic (const Polynomial< SymbolicPolyCoeff > &polynomial, const ExprPtr &leading, const FactsQuery &facts, ComputationContext &context)
SolveResult solve_transcendental (const ExprPtr &expr, const std::string &var, ComputationContext &context, const SolveOptions &options)
SolveResult solve_transcendental (const ExprPtr &expr, const std::string &var, const SolveOptions &options)
ODESolutionResult solve_variation_of_parameters_checked (const std::shared_ptr< SymbolicExpr > &y1, const std::shared_ptr< SymbolicExpr > &y2, const std::shared_ptr< SymbolicExpr > &g, const std::string &x)
ODESolutionResult solve_variation_of_parameters_checked (const std::shared_ptr< SymbolicExpr > &y1, const std::shared_ptr< SymbolicExpr > &y2, const std::shared_ptr< SymbolicExpr > &g, const std::string &x, ComputationContext &context)
static ODESolutionResult solve_variation_of_parameters_core (const std::shared_ptr< SymbolicExpr > &y1, const std::shared_ptr< SymbolicExpr > &y2, const std::shared_ptr< SymbolicExpr > &g, const std::string &x, ComputationContext &context)
AssumptionSolveResult solve_with_assumptions_checked (const std::shared_ptr< SymbolicExpr > &equation, const std::string &variable, const AssumptionContext *assumptions)
AssumptionSolveResult solve_with_assumptions_checked (const std::shared_ptr< SymbolicExpr > &equation, const std::string &variable, const AssumptionContext *assumptions, ComputationContext &context)
static AssumptionSolveResult solve_with_assumptions_impl (const std::shared_ptr< SymbolicExpr > &equation, const std::string &variable, const AssumptionContext *ctx, ComputationContext &context)
ExprResult sqrt (const ExprPtr &expression)
ExprResult sqrt (const ExprPtr &expression, ComputationContext &context)
SquareFreeDecomp square_free_decompose (const MultiPoly &poly, const std::string &main_var)
 多元无平方因子分解(Yun 算法的多元推广)
std::vector< std::pair< Polynomial< Rational >, int > > square_free_factorization (const Polynomial< Rational > &poly)
static bool starts_with_at (const std::string &str, size_t pos, const std::string &prefix)
std::shared_ptr< SymbolicExpr > stokes_theorem (const VectorField &F, const std::vector< std::string > &vars, const VectorField &parametrization, const std::string &u, const std::string &v, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &u_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &v_bounds)
VectorCalculusExprResult stokes_theorem_checked (const VectorField &F, const std::vector< std::string > &vars, const VectorField &parametrization, const std::string &u, const std::string &v, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &u_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &v_bounds)
VectorCalculusExprResult stokes_theorem_checked (const VectorField &F, const std::vector< std::string > &vars, const VectorField &parametrization, const std::string &u, const std::string &v, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &u_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &v_bounds, ComputationContext &context)
ExprResult strip_to_base_value (const ExprPtr &quantity, ComputationContext &context)
ExprResult strip_to_display_value (const ExprPtr &quantity, ComputationContext &context)
QuantityResult strip_unit (const std::shared_ptr< SymbolicExpr > &expression, UnitStripMode mode, ComputationContext &context)
bool structurally_equal (const SymbolicExpr &lhs, const SymbolicExpr &rhs)
ExprResult sub (const ExprPtr &lhs, const ExprPtr &rhs)
ExprResult sub (const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
ExprResult substitute (const ExprPtr &expression, const Binding &replacement)
ExprResult substitute (const ExprPtr &expression, const Binding &replacement, ComputationContext &context)
ExprResult substitute (const ExprPtr &expression, const std::string &variable, const ExprPtr &value)
ExprResult substitute (const ExprPtr &expression, const std::string &variable, const ExprPtr &value, ComputationContext &context)
ExprResult substitute (const ExprPtr &expression, const std::vector< Binding > &replacements)
ExprResult substitute (const ExprPtr &expression, const std::vector< Binding > &replacements, ComputationContext &context)
detail::SymbolicNodePtr substitute_free (const detail::SymbolicNodePtr &expression, const std::string &variable, const detail::SymbolicNodePtr &replacement, detail::RewriteBudget *budget)
static std::shared_ptr< const SymbolicNode > substitute_negative_variable (const VariableNode &node, const std::string &var, const std::string &t_var)
ExprPtr substitute_raw (const ExprPtr &expression, const std::string &variable, const ExprPtr &value)
std::optional< int > supported_laurent_integer_power (const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)
std::optional< int > supported_laurent_integer_power (const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)
ExpressionResult surface_area_revolution_x_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b)
ExpressionResult surface_area_revolution_x_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
ExpressionResult surface_area_revolution_y_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b)
ExpressionResult surface_area_revolution_y_checked (const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
std::shared_ptr< SymbolicExpr > surface_integral_scalar (const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper)
VectorCalculusExprResult surface_integral_scalar_checked (const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper)
VectorCalculusExprResult surface_integral_scalar_checked (const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context)
std::shared_ptr< SymbolicExpr > surface_integral_vector (const VectorField &F, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper)
VectorCalculusExprResult surface_integral_vector_checked (const VectorField &F, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper)
VectorCalculusExprResult surface_integral_vector_checked (const VectorField &F, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context)
VectorExprListResult surface_normal_checked (const SurfaceSymbolic &surf, const std::vector< std::shared_ptr< SymbolicExpr > > &point)
VectorExprListResult surface_normal_checked (const SurfaceSymbolic &surf, const std::vector< std::shared_ptr< SymbolicExpr > > &point, ComputationContext &context)
SVDDecompositionResult svd_decomposition_checked (const std::shared_ptr< SymbolicExpr > &A)
SVDDecompositionResult svd_decomposition_checked (const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
ExprResult sym (const std::string &name)
std::shared_ptr< SymbolicExpr > sym_rational (const BigInt &numerator, const BigInt &denominator)
std::shared_ptr< SymbolicExpr > sym_sub (const SymbolicExpr &lhs, const SymbolicExpr &rhs)
std::optional< std::string_view > symbol_name (const ExprPtr &expression) noexcept
static std::vector< std::shared_ptr< SymbolicExpr > > symbolic_cubic_roots (const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, const std::shared_ptr< SymbolicExpr > &c, const std::shared_ptr< SymbolicExpr > &d, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > symbolic_hessian (const std::vector< double > &numeric_H, size_t n, double tol)
static LMCAS::MultiPoly symbolic_node_to_multipoly (const std::shared_ptr< const SymbolicNode > &node, const std::vector< std::string > &vars)
static std::shared_ptr< SymbolicExpr > symbolic_poly_to_expr (const Polynomial< SymbolicPolyCoeff > &poly, ComputationContext &context)
Result< Rational > symbolic_polynomial_content (const SymbolicExpr &expression, ComputationContext &context)
SymbolicGcdResult symbolic_polynomial_gcd (const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)
template<typename T>
Result< Polynomial< T > > symbolic_power_to_poly (const PowerNode &power, const std::string &variable, ComputationContext *context, detail::RewriteBudget *budget)
std::shared_ptr< SymbolicExpr > symbolic_product (const std::shared_ptr< SymbolicExpr > &body, const std::string &index, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper)
template<typename T>
Result< Polynomial< T > > symbolic_product_to_poly (const MultiplyNode &multiply, const std::string &variable, ComputationContext *context, detail::RewriteBudget *budget)
static std::shared_ptr< SymbolicExpr > symbolic_root_term (const std::shared_ptr< SymbolicExpr > &coefficient, const std::string &variable, int degree)
std::shared_ptr< SymbolicExpr > symbolic_sum (const std::shared_ptr< SymbolicExpr > &body, const std::string &index, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper)
template<typename T>
Result< Polynomial< T > > symbolic_sum_to_poly (const AddNode &add, const std::string &variable, ComputationContext *context, detail::RewriteBudget *budget)
template<typename T>
Result< Polynomial< T > > symbolic_to_poly_recursive (const std::shared_ptr< const SymbolicNode > &node, const std::string &variable, ComputationContext *context, detail::RewriteBudget *budget)
ExprResult tan (const ExprPtr &expression)
ExprResult tan (const ExprPtr &expression, ComputationContext &context)
PlaneSymbolicResult tangent_plane_checked (const SurfaceSymbolic &surf, const std::vector< std::shared_ptr< SymbolicExpr > > &point)
PlaneSymbolicResult tangent_plane_checked (const SurfaceSymbolic &surf, const std::vector< std::shared_ptr< SymbolicExpr > > &point, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > te_abs_decay (const std::shared_ptr< SymbolicExpr > &f, const std::string &t, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > te_abs_fourier (const std::shared_ptr< SymbolicExpr > &rate, const std::string &omega, ComputationContext &context)
static bool te_accept_decay (const std::shared_ptr< SymbolicExpr > &rate, const AssumptionContext &assumptions, std::vector< std::shared_ptr< SymbolicExpr > > &conditions, ComputationContext &context)
static TransformEngineResult te_convolve_core (const std::shared_ptr< SymbolicExpr > &f, const std::shared_ptr< SymbolicExpr > &g, const std::string &variable, ComputationContext &context)
static TransformEngineResult te_convolve_sum (const AddNode &addition, const std::shared_ptr< SymbolicExpr > &other, bool sum_is_left, const std::string &variable, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > te_decay_condition (const std::shared_ptr< SymbolicExpr > &rate)
static bool te_extract_exp (const std::shared_ptr< SymbolicExpr > &e, const std::string &t, std::shared_ptr< SymbolicExpr > &a_out, std::shared_ptr< SymbolicExpr > &rem_out)
static std::shared_ptr< SymbolicExpr > te_fourier_sum (const AddNode &addition, const std::string &t, const std::string &omega, ComputationContext &context, const AssumptionContext &assumptions, std::vector< std::shared_ptr< SymbolicExpr > > &conditions)
static std::shared_ptr< SymbolicExpr > te_fourier_unevaluated (const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &omega)
static std::shared_ptr< SymbolicExpr > te_gaussian_fourier (const Rational &rate, const std::string &omega)
static std::shared_ptr< SymbolicExpr > te_inv_power (const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > te_inv_product (const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > te_inverse_pole (const std::shared_ptr< const SymbolicNode > &base, const std::string &variable)
static std::shared_ptr< SymbolicExpr > te_inverse_pole_term (const AddNode &addition, std::size_t i, const std::string &variable)
static bool te_is_abs_variable (const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)
static bool te_is_denominator_factor (const std::shared_ptr< const SymbolicNode > &expression, const std::string &variable)
static bool te_is_hyp (const std::shared_ptr< SymbolicExpr > &e, const std::string &v, bool &is_sinh, std::shared_ptr< SymbolicExpr > &freq)
static bool te_is_power_of_var (const std::shared_ptr< SymbolicExpr > &e, const std::string &v, BigInt &n)
static std::shared_ptr< SymbolicExpr > te_laplace_lookup (const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &s, ComputationContext &context)
static std::vector< std::shared_ptr< SymbolicExpr > > te_laplace_roc (const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &s)
static std::shared_ptr< SymbolicExpr > te_laplace_sum (const std::shared_ptr< SymbolicExpr > &f, const AddNode &addition, const std::string &t, const std::string &s, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > te_unevaluated_inv_laplace (const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t)
static std::shared_ptr< SymbolicExpr > te_unevaluated_laplace (const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &s)
static Result< void > te_validate_convolution_inputs (const std::shared_ptr< SymbolicExpr > &f, const std::shared_ptr< SymbolicExpr > &g, const std::string &var, ComputationContext &context, const std::string &operation)
std::shared_ptr< SymbolicExpr > tf_back_substitute (const std::shared_ptr< SymbolicExpr > &factor_expr, const std::vector< TransSubstitution > &mappings, ComputationContext &context)
 将因子表达式中的不定元变量替换回原始超越子表达式.
Result< TfPolyBuildResult > tf_build_polynomial (const std::shared_ptr< SymbolicExpr > &poly_expr, const std::vector< std::string > &indeterminates, const std::string &original_var)
Result< TfPolyBuildResult > tf_build_polynomial_impl (const std::shared_ptr< SymbolicExpr > &expression, const std::vector< std::string > &indeterminates, const std::string &original_variable, ComputationContext &context)
static void tf_collect_transcendental (const std::shared_ptr< const SymbolicNode > &node, const std::string &var, std::vector< std::shared_ptr< const SymbolicNode > > &candidates)
 按先序收集依赖 var 的超越函数子表达式。
bool tf_contains_transcendental (const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)
static Result< TfPolyBuildResult > tf_convert_main_variable (TfPolyBuildResult result, const std::shared_ptr< SymbolicExpr > &expanded, const std::vector< std::string > &all_variables)
static void tf_deduplicate (std::vector< std::shared_ptr< const SymbolicNode > > &candidates)
 按结构哈希和 equals 比较去重,保留首次出现的顺序。
int tf_degree_in (const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)
static void tf_detect_constraints (TransSubstitutionResult &result)
std::vector< std::shared_ptr< SymbolicExpr > > tf_detect_exponential_separation (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context)
 检测加法表达式中的公共指数因子并执行分离.
std::vector< std::shared_ptr< SymbolicExpr > > tf_detect_multiplicative_structure (const std::shared_ptr< SymbolicExpr > &expr)
 检测表达式是否已为独立子表达式的乘积形式.
static bool tf_extract_coeff_trig_squared (const std::shared_ptr< const SymbolicNode > &node, std::shared_ptr< const SymbolicNode > &coeff, FunctionNode::FuncType &func_type, std::shared_ptr< const SymbolicNode > &argument)
 从 a*sin^2(f) 或 a*cos^2(f) 提取系数和三角平方项。
static std::shared_ptr< const SymbolicNode > tf_extract_exp_factor (const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
 从乘积项中提取指数函数因子.
static Result< std::vector< std::shared_ptr< SymbolicExpr > > > tf_factor_substitution (const TransSubstitutionResult &sub_result, const std::string &var, const std::shared_ptr< SymbolicExpr > &pyth_simplified, ComputationContext &context)
bool tf_is_linear_irreducible (const TransSubstitutionResult &sub_result, const std::string &var)
 判断换元后的表达式是否对所有不定元和原始变量均为线性.
static bool tf_is_negation_of (const std::shared_ptr< const SymbolicNode > &node, const std::shared_ptr< const SymbolicNode > &arg)
 匹配 (-1)*arg 或 arg*(-1) 的二因子乘积结构。
static bool tf_is_sine_cosine_pair (FunctionNode::FuncType first, FunctionNode::FuncType second)
bool tf_is_transcendental_type (FunctionNode::FuncType ft)
 判断函数类型是否支持超越函数换元。
static bool tf_is_trig_squared (const std::shared_ptr< const SymbolicNode > &node, FunctionNode::FuncType &func_type, std::shared_ptr< const SymbolicNode > &argument)
 匹配 sin^2(f) 或 cos^2(f),提取函数类型和参数。
static bool tf_is_variable_exponential (const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
static bool tf_nodes_equal (const std::shared_ptr< const SymbolicNode > &a, const std::shared_ptr< const SymbolicNode > &b)
 判断两个 AST 节点是否结构相等。
static std::shared_ptr< SymbolicExpr > tf_pair_constraint (const TransSubstitution &left, const TransSubstitution &right, const FunctionNode &first, const FunctionNode &second)
static std::vector< std::string > tf_polynomial_variables (const std::shared_ptr< SymbolicExpr > &expression, const std::vector< std::string > &indeterminates, const std::string &original_var)
static int tf_power_degree (const PowerNode &power, const std::string &var)
static std::shared_ptr< const SymbolicNode > tf_remove_exp_factor (const std::shared_ptr< const SymbolicNode > &node, const std::shared_ptr< const SymbolicNode > &exp_factor)
 从乘积项中移除指定的指数函数因子,返回剩余部分.
static std::vector< std::shared_ptr< SymbolicExpr > > tf_restore_factors (const std::vector< Polynomial< Rational > > &true_factors, const TransSubstitutionResult &sub_result, const std::shared_ptr< SymbolicExpr > &pyth_simplified, ComputationContext &context)
static void tf_select_main_variable (TfPolyBuildResult &result, const std::shared_ptr< SymbolicExpr > &expanded, const std::vector< std::string > &variables, int &max_degree)
std::vector< std::shared_ptr< SymbolicExpr > > tf_simplify_factors (std::vector< std::shared_ptr< SymbolicExpr > > &factors)
 化简逆换元后的因子,合并数值因子及乘积的数值前导系数。 保留非常数部分,将非 1 的常数积置于结果首位。
std::vector< std::shared_ptr< SymbolicExpr > > tf_simplify_factors_impl (const std::vector< std::shared_ptr< SymbolicExpr > > &factors, ComputationContext &context)
std::shared_ptr< SymbolicExpr > tf_simplify_pythagorean (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var)
 在因式分解前用 sin^2(f) + cos^2(f) = 1 化简表达式。
static std::shared_ptr< const SymbolicNode > tf_simplify_pythagorean_node (const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
 递归化简 a*sin^2(f) + a*cos^2(f) 为 a,系数为 1 时结果为 1。
TfSquareFreeResult tf_square_free (const Polynomial< Rational > &poly)
 计算多项式的无平方因子部分,用于 Berlekamp 模分解预处理。
static std::shared_ptr< const SymbolicNode > tf_substitute_expr (const std::shared_ptr< const SymbolicNode > &node, const std::vector< TransSubstitution > &mappings)
 按映射顺序将超越子表达式替换为不定元,递归重建未匹配节点。
static bool tf_validate_polynomial (const std::shared_ptr< SymbolicExpr > &poly_expr, const std::vector< std::string > &all_variables)
 判断换元式是否为候选变量的多项式。 各候选变量的次数须可确定为非负整数,且超越函数不得依赖不定元或原始变量。
int total_degree (const Monomial &m)
 计算单项式的全次数
std::vector< std::pair< std::shared_ptr< SymbolicExpr >, std::string > > total_differential (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars)
static MultiPoly truncate_mod_var (const MultiPoly &poly, const std::string &var, int degree_bound)
 将 MultiPoly 截断为关于指定变量次数 < degree_bound 的部分
static MultiPoly truncated_factor_product (const std::vector< MultiPoly > &factors, const std::string &variable, int degree_bound)
double try_eval_double (const std::shared_ptr< SymbolicExpr > &expr)
 尝试将表达式求值为 double。
bool try_get_integer_value (const std::shared_ptr< const NumberNode > &node, BigInt &value)
static MultiPoly univariate_gcd (const MultiPoly &a, const MultiPoly &b, const std::vector< std::string > &vars)
static bool unsupported_euler_forcing (const std::shared_ptr< SymbolicExpr > &forcing, const std::vector< double > &coefficients)
static bool valid_classifier_variables (const std::string &x, const std::string &y)
static bool valid_newton_bracket (lmmc_real_t initial, lmmc_real_t lower, lmmc_real_t upper)
static Result< void > validate_frobenius_regular_singular_domain (const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, ComputationContext &context, const std::string &operation)
static bool validate_integration_steps (const std::vector< IntegrationStep > &steps)
Result< void > validate_laurent_orders (int order_neg, int order_pos, const std::string &operation)
static Result< void > validate_laurent_result (const LaurentResult &result, const std::optional< int > &supported_power, const std::shared_ptr< SymbolicExpr > &center, const std::string &operation)
Result< void > validate_numeric_ode_coefficients (const std::vector< double > &coefficients, std::size_t minimum_size, std::size_t maximum_size, const std::string &operation)
Result< void > validate_ode_expr_var_pair (const std::shared_ptr< SymbolicExpr > &expr, const std::string &x, const std::string &y, ComputationContext &context, const std::string &operation)
Result< void > validate_ode_pair_var_pair (const std::shared_ptr< SymbolicExpr > &first, const std::shared_ptr< SymbolicExpr > &second, const std::string &x, const std::string &y, ComputationContext &context, const std::string &operation)
Result< void > validate_ode_three_expr_one_var (const std::shared_ptr< SymbolicExpr > &first, const std::shared_ptr< SymbolicExpr > &second, const std::shared_ptr< SymbolicExpr > &third, const std::string &x, ComputationContext &context, const std::string &operation)
Result< void > validate_ode_two_expr_point (const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, ComputationContext &context, const std::string &operation)
Result< void > validate_ode_variables (const std::string &x, const std::string &y, ComputationContext &context, const std::string &operation)
Result< void > validate_power_series_coefficients (const std::vector< std::shared_ptr< SymbolicExpr > > &coefficients, const std::string &operation, const std::string &name)
Result< void > validate_power_series_coefficients (const std::vector< std::shared_ptr< SymbolicExpr > > &coefficients, const std::string &operation, const std::string &name)
PropertyStoreResult validate_property_interval (const Interval &interval, ComputationContext &context, const std::string &operation)
Result< void > validate_series_expr_point (const std::shared_ptr< SymbolicExpr > &expr, const std::shared_ptr< SymbolicExpr > &center, const std::string &var, ComputationContext &context, const std::string &operation)
Result< void > validate_series_variable (const std::string &variable, ComputationContext &context, const std::string &operation)
Result< void > validate_series_variable (const std::string &variable, ComputationContext &context, const std::string &operation)
VectorAngleResult vector_angle_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b)
VectorAngleResult vector_angle_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, ComputationContext &context)
VectorCalculusExprResult vector_angle_symbolic (const VectorField &a, const VectorField &b)
static VectorCalculusExprResult vector_angle_symbolic_impl (const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)
static CriticalPointClassification vector_calculus_classify_critical_point (const std::vector< double > &numeric_H, size_t n, ComputationContext &context, detail::RewriteBudget &transform_budget)
static VectorCalculusExprResult vector_calculus_constant_integrand (const std::shared_ptr< SymbolicExpr > &integrand, const std::string &variable, ComputationContext &context, detail::RewriteBudget &transform_budget)
static Result< VectorField > vector_calculus_cross_product_partials_strict (const VectorField &parametrization, const std::string &u, const std::string &v, const std::string &operation, detail::RewriteBudget &transform_budget)
static Result< VectorField > vector_calculus_curl_strict (const VectorField &F, const std::vector< std::string > &vars, const std::string &operation, detail::RewriteBudget &transform_budget)
static VectorCalculusExprResult vector_calculus_definite_integral_strict (const std::shared_ptr< SymbolicExpr > &integrand, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
static bool vector_calculus_evaluate_hessian_at_point (const std::shared_ptr< SymbolicExpr > &H, const std::vector< std::string > &, const std::map< std::string, std::shared_ptr< SymbolicExpr > > &pt, size_t n, std::vector< double > &numeric_H, ComputationContext &context, detail::RewriteBudget &transform_budget)
static VectorCalculusExprResult vector_calculus_inconclusive (const std::string &operation, const std::string &message)
static std::shared_ptr< SymbolicExpr > vector_calculus_magnitude_squared (const VectorField &v, detail::RewriteBudget &transform_budget)
static VectorCalculusExprResult vector_calculus_multiple_integral_strict (const std::shared_ptr< SymbolicExpr > &integrand, const std::vector< IntegrationStep > &steps, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
static VectorCalculusExprResult vector_calculus_numerical_definite (const std::shared_ptr< SymbolicExpr > &integrand, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, detail::RewriteBudget &transform_budget)
static std::shared_ptr< SymbolicExpr > vector_calculus_single_dir_deriv (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const VectorField &unit_dir, detail::RewriteBudget &transform_budget)
static VectorCalculusExprResult vector_calculus_substitute_coords_strict (const std::shared_ptr< SymbolicExpr > &expr, const std::vector< std::string > &coord_vars, const VectorField &values, const std::string &operation, detail::RewriteBudget &transform_budget)
static VectorCalculusExprResult vector_calculus_surface_dot_strict (const VectorField &field, const std::vector< std::string > &coordinates, const VectorField &parametrization, const VectorField &normal, const std::string &message, const std::string &operation, detail::RewriteBudget &transform_budget)
static VectorCalculusExprResult vector_calculus_try_definite (const std::shared_ptr< SymbolicExpr > &integrand, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, detail::RewriteBudget &transform_budget)
std::vector< std::shared_ptr< SymbolicExpr > > vector_cross (const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b)
VectorExprListResult vector_cross_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b)
VectorExprListResult vector_cross_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, ComputationContext &context)
std::shared_ptr< SymbolicExpr > vector_dot (const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b)
ExpressionResult vector_dot_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b)
ExpressionResult vector_dot_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, ComputationContext &context)
VectorCalculusFieldResult vector_project (const VectorField &a, const VectorField &b)
static VectorCalculusFieldResult vector_project_impl (const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)
static Result< QuadraticBoundaries > verified_quadratic_boundaries (const Polynomial< Rational > &polynomial, const Rational &rational_part, const Rational &denominator, const Rational &discriminant, detail::RewriteBudget &budget)
static SymbolicExprVectorResult verified_real_inverse_candidates (const std::vector< std::shared_ptr< SymbolicExpr > > &candidates, const std::shared_ptr< SymbolicExpr > &equation, const std::string &var, const std::string &operation, ComputationContext &context)
static LagrangeResult verify_lagrange_solutions (const std::vector< std::map< std::string, std::shared_ptr< SymbolicExpr > > > &full_solutions, const VectorField &equations, const std::vector< std::string > &all_vars, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
ExpressionResult volume_of_revolution_x_checked (std::shared_ptr< SymbolicExpr > fx, std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b)
ExpressionResult volume_of_revolution_x_checked (std::shared_ptr< SymbolicExpr > fx, std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b, ComputationContext &context)
ExpressionResult volume_of_revolution_y_checked (std::shared_ptr< SymbolicExpr > fy, std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b)
ExpressionResult volume_of_revolution_y_checked (std::shared_ptr< SymbolicExpr > fy, std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b, ComputationContext &context)
SymbolicExpr wildcard (const std::string &name)
template<typename F>
auto with_assumptions (AssumptionContext &ctx, const std::vector< AssumptionDecl > &decls, F &&callable) -> std::enable_if_t< std::is_void_v< decltype(callable())>, AssumptionVoidResult >
template<typename F>
auto with_assumptions (AssumptionContext &ctx, const std::vector< AssumptionDecl > &decls, F &&callable) -> std::enable_if_t<!std::is_void_v< decltype(callable())>, Result< decltype(callable())> >
 Execute a callable within a temporary assumption scope.
template<typename F>
auto with_assumptions (AssumptionContext &ctx, std::initializer_list< AssumptionDecl > decls, F &&callable) -> decltype(with_assumptions(ctx, std::vector< AssumptionDecl >(decls), std::forward< F >(callable)))
ExprResult with_unit (const ExprPtr &value, const std::string &unit, ComputationContext &context)
ExprResult with_unit_definition (const ExprPtr &value, std::string display_unit, UnitDefinition definition, ComputationContext &context)
ODESolutionResult wrap_ode_solution (ODESolution solution, ODEType expected_method, const std::string &operation)
TransformEngineResult z_transform_checked (const std::shared_ptr< SymbolicExpr > &f_n, const std::string &n, const std::string &z)
TransformEngineResult z_transform_checked (const std::shared_ptr< SymbolicExpr > &f_n, const std::string &n, const std::string &z, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > z_transform_core (const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::string &z, ComputationContext &context)
ZassenhausResult zassenhaus_combine_checked (const Polynomial< Rational > &poly, const std::vector< Polynomial< BigInt > > &lifted_factors, const BigInt &reconstruction_modulus)
ZassenhausResult zassenhaus_combine_checked (const Polynomial< Rational > &poly, const std::vector< Polynomial< BigInt > > &lifted_factors, const BigInt &reconstruction_modulus, ComputationContext &context)
static ZassenhausResult zassenhaus_combine_impl (const Polynomial< Rational > &poly, const std::vector< Polynomial< BigInt > > &lifted_factors, const BigInt &reconstruction_modulus, ComputationContext &context)
static Polynomial< Rational > zc_bigint_to_rational_poly (const std::vector< BigInt > &coeffs, const std::string &var)
 将 BigInt 系数向量转换为有理系数多项式.
static bool zc_divides_exactly (const Polynomial< Rational > &f, const Polynomial< Rational > &candidate)
 检验候选因子是否整除原多项式(精确有理除法).
static ZassenhausResult zc_enumerate (const Polynomial< Rational > &poly, const std::vector< Polynomial< BigInt > > &lifted_factors, const BigInt &modulus, ComputationContext &context)
static ZassenhausResult zc_finalize (const Polynomial< Rational > &original, std::vector< Polynomial< Rational > > factors, Polynomial< Rational > remaining, Completeness completeness, std::string reason)
static Result< bool > zc_find_factor (ZcFactorSearch &search)
static Polynomial< Rational > zc_make_primitive (const Polynomial< Rational > &poly)
 使候选多项式首一化(首项系数归一).
static bool zc_next_combination (std::vector< size_t > &positions, size_t count)
static bool zc_rational_reconstruction (const BigInt &a, const BigInt &m, BigInt &num, BigInt &den)
 对 BigInt 系数执行有理数重构.
static Polynomial< Rational > zc_reconstruct_candidate (const std::vector< BigInt > &product_coeffs, const BigInt &mod, const std::string &var)
 对子集乘积的所有系数执行有理重构,构造有理系数多项式.
static std::vector< size_t > zc_select_indices (const std::vector< size_t > &active, const std::vector< size_t > &positions)
static Result< std::vector< BigInt > > zc_subset_product (const std::vector< Polynomial< BigInt > > &lifted_factors, const std::vector< size_t > &indices, const BigInt &mod, ComputationContext &context)
 在模 m 下乘以按字典序枚举的提升因子子集.
static Result< bool > zc_try_candidate (ZcFactorSearch &search, const std::vector< size_t > &positions)
static Result< void > zc_validate_lifted_product (const Polynomial< Rational > &poly, const std::vector< Polynomial< BigInt > > &lifted_factors, const BigInt &modulus, ComputationContext &context)
static bool zero_remainder (const detail::SymbolicNodePtr &value, detail::RewriteBudget &budget)
static std::shared_ptr< SymbolicExpr > zt_abs_expr (const std::shared_ptr< SymbolicExpr > &expr)
static std::vector< std::shared_ptr< SymbolicExpr > > zt_base_roc (const std::shared_ptr< SymbolicExpr > &base, const std::string &z)
static std::shared_ptr< SymbolicExpr > zt_exponential (const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::shared_ptr< SymbolicExpr > &z, ComputationContext &context)
static bool zt_is_exp_seq (const std::shared_ptr< SymbolicExpr > &f, const std::string &n, std::shared_ptr< SymbolicExpr > &base_out)
static bool zt_is_weighted_exp (const std::shared_ptr< SymbolicExpr > &f, const std::string &n, std::shared_ptr< SymbolicExpr > &base)
static std::vector< std::shared_ptr< SymbolicExpr > > zt_lookup_roc (const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::string &z)
static std::shared_ptr< SymbolicExpr > zt_polynomial (const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::shared_ptr< SymbolicExpr > &z, const std::string &z_var, ComputationContext &context)
static ZPolynomialPattern zt_polynomial_pattern (const std::shared_ptr< SymbolicExpr > &f, const std::string &n)
static std::vector< std::shared_ptr< SymbolicExpr > > zt_roc (const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::string &z)
static std::shared_ptr< SymbolicExpr > zt_sum (const std::shared_ptr< SymbolicExpr > &f, const AddNode &addition, const std::string &n, const std::string &z, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > zt_trigonometric (const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::shared_ptr< SymbolicExpr > &z, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > zt_unevaluated (const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::string &z)
static std::vector< std::shared_ptr< SymbolicExpr > > zt_unit_roc (const std::string &z)

变量

__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a
const MultiPoly & b
const std::vector< FGLMPoly > & basis
const Binding & binding
const std::vector< Binding > & bindings = {})
const VectorField const VectorField & c
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
std::string UnitDefinition definition
const ExprPtr & denominator
std::size_t std::size_t depth
__attribute__((visibility("default"))) MatrixRankResult matrix_rank_checked(const std __attribute__((visibility("default"))) MatrixRankResult matrix_rank_checked(const std __attribute__((visibility("default"))) ExpressionResult matrix_rref_checked(const std __attribute__((visibility("default"))) ExpressionResult matrix_rref_checked(const std __attribute__((visibility("default"))) MatrixNullspaceResult matrix_nullspace_checked(const std __attribute__((visibility("default"))) MatrixNullspaceResult matrix_nullspace_checked(const std __attribute__((visibility("default"))) MatrixLinearSolveResult matrix_solve_linear_checked(const std __attribute__((visibility("default"))) MatrixLinearSolveResult matrix_solve_linear_checked(const std int dim
const std::string const LimitExprPtr LimitDirection direction = LimitDirection::Both
std::string display_unit
const NumberDomainSet & domain = Domain::Real)
const ExprPtr & element
const ExprPtr & exponent
std::size_t std::size_t std::size_t growth
ExprPtr imag
template<typename Integer, std::enable_if_t< std::is_integral_v< Integer > &&!std::is_same_v< Integer, int >, int > = 0>
ExprResult integer (Integer)=delete
const std::vector< IntegrationStep > Integrator & integrator
constexpr const char * kEquivalentOperation = "LMCAS.equivalent"
constexpr const char * kEquivalentProfileOperation
constexpr const char * kEvalComplexOperation = "LMCAS.eval_complex"
constexpr const char * kExprSetOperation = "LMCAS.expr_set"
constexpr const char * kParseOperation
constexpr const char * kSolveExprSetOperation = "LMCAS.solve_expr_set"
__attribute__((visibility("default"))) ExpressionResult point_plane_distance_checked(const std __attribute__((visibility("default"))) ExpressionResult point_plane_distance_checked(const std const LineSymbolic & l2
const std::vector< Polynomial< ModInt > > int64_t int lift_bound
const std::vector< Polynomial< BigInt > > & lifted_factors
const ExprPtr & lower
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr bool lower_closed
const std::string & main_var
const std::vector< Polynomial< ModInt > > & mod_factors
constexpr int64_t MODULAR_PRIMES []
 预定义的大素数表,用于模运算多素数方案
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name
const ExprPtr bool negated = false)
constexpr size_t NUM_MODULAR_PRIMES = sizeof(MODULAR_PRIMES) / sizeof(MODULAR_PRIMES[0])
 预定义素数表的长度
const ExprPtr RelationOp op
const std::string ComputationContext const SolveOptions & options = {})
const std::vector< FGLMPoly > const MonomialOrder & order
__attribute__((visibility("default"))) LineSymbolicResult line_from_two_points_checked(const std __attribute__((visibility("default"))) LineSymbolicResult line_from_two_points_checked(const std __attribute__((visibility("default"))) PlaneSymbolicResult plane_from_three_points_checked(const std __attribute__((visibility("default"))) PlaneSymbolicResult plane_from_three_points_checked(const std const PlaneSymbolic & p2
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField & parametrization
const PlaneSymbolic & plane
const std::string const LimitExprPtr & point
int64_t prime
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > r
const std::vector< Polynomial< BigInt > > const BigInt & reconstruction_modulus
const ExprPtr & rhs
const ExprPtr & right
const ExprPtr & set
std::size_t steps
double sy
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & t
const ExprPtr & target
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & u
__attribute__((visibility("default"))) std const std::vector< std::string > const VectorField const std::string const std::string const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & u_bounds
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > & u_lower
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > & u_upper
const std::string & unit
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr bool bool upper_closed
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string & v
__attribute__((visibility("default"))) std const std::vector< std::string > const VectorField const std::string const std::string const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & v_bounds
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > & v_lower
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > & v_upper
const std::string const ExprPtr & value
const std::string & variable
__attribute__((visibility("default"))) VectorCalculusFieldResult gradient_checked(const std __attribute__((visibility("default"))) VectorCalculusFieldResult gradient_checked(const std __attribute__((visibility("default"))) VectorField gradient(const std const std::vector< std::string > & vars
const ExprPtr const std::vector< std::string > & wildcards
__attribute__((visibility("default"))) std const std::vector< std::string > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & x_bounds
__attribute__((visibility("default"))) std const std::vector< std::string > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & y_bounds
__attribute__((visibility("default"))) std const std::vector< std::string > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & z_bounds
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > const std::string & z_var = "z")

类说明

◆ LMCAS::Binding

struct LMCAS::Binding

在文件 symbolic.hpp 第 33 行定义.

LMCAS::Binding 的协作图:
类成员
shared_ptr< SymbolicExpr > symbol
shared_ptr< SymbolicExpr > value

◆ LMCAS::ByConstructionProof

struct LMCAS::ByConstructionProof

在文件 proof_outcome.hpp 第 14 行定义.

LMCAS::ByConstructionProof 的协作图:

◆ LMCAS::CasError

struct LMCAS::CasError

在文件 result.hpp 第 31 行定义.

LMCAS::CasError 的协作图:
类成员
CasErrc code = CasErrc::InternalInvariant
string message
string operation

◆ LMCAS::CheckedInterval

struct LMCAS::CheckedInterval

在文件 interval_endpoint.hpp 第 27 行定义.

LMCAS::CheckedInterval 的协作图:
类成员
Interval interval
ComparableEndpoint lower
ComparableEndpoint upper

◆ LMCAS::CholeskyDecomposition

struct LMCAS::CholeskyDecomposition

在文件 matrix_decomposition.hpp 第 26 行定义.

LMCAS::CholeskyDecomposition 的协作图:
类成员
shared_ptr< SymbolicExpr > L

◆ LMCAS::ComplexSymbolic

struct LMCAS::ComplexSymbolic

符号复数,由实部和虚部组成

在文件 symbolic_complex.hpp 第 16 行定义.

LMCAS::ComplexSymbolic 的协作图:
类成员
shared_ptr< SymbolicExpr > imag 虚部
shared_ptr< SymbolicExpr > real 实部

◆ LMCAS::ConditionalSolutions

struct LMCAS::ConditionalSolutions

在文件 conditional_result.hpp 第 59 行定义.

LMCAS::ConditionalSolutions 的协作图:
类成员
ConditionSet value

◆ LMCAS::ConditionSet

struct LMCAS::ConditionSet

在文件 conditional_result.hpp 第 45 行定义.

LMCAS::ConditionSet 的协作图:
类成员
vector< ExprPtr > conditions
ExprPtr predicate
string variable

◆ LMCAS::ConvergenceInfo

struct LMCAS::ConvergenceInfo

收敛性判定信息.

在文件 series_engine.hpp 第 31 行定义.

LMCAS::ConvergenceInfo 的协作图:
类成员
ConvergenceResult result 判定结果
string test_used 使用的判定方法("ratio", "root", "comparison")

◆ LMCAS::Diagnostic

struct LMCAS::Diagnostic

在文件 computation_context.hpp 第 38 行定义.

LMCAS::Diagnostic 的协作图:
类成员
string message
string operation
DiagnosticSeverity severity = DiagnosticSeverity::Info

◆ LMCAS::EmptySolutions

struct LMCAS::EmptySolutions

在文件 conditional_result.hpp 第 51 行定义.

LMCAS::EmptySolutions 的协作图:

◆ LMCAS::EqvBudget

struct LMCAS::EqvBudget

各限额均为非零值;深度与规模在重写运行中检查,超限返回 ResourceLimit。

在文件 equivalence_options.hpp 第 18 行定义.

LMCAS::EqvBudget 的协作图:
类成员
size_t max_node_growth_factor = 4 候选树及未封装孩子列表的规模上限取 context.max_ast_nodes 与原始两输入节点总数乘此因子的较小值。 每次子树引用分别计数;整个证明及 profile 切换共用原始基数。 乘法饱和为 SIZE_MAX;真实输入节点和溢出返回 ResourceLimit。
size_t max_rewrite_depth = 64 同时活动的重写及嵌套 visitor 层数,根为第 1 层。
size_t max_rewrite_steps = 256 一次证明及 profile 切换共享的重写遍历、候选追加与阶段步数。 形状查询和缓存清空的实际工作计入 ResourceLimits::max_steps。

◆ LMCAS::EqvOptions

struct LMCAS::EqvOptions

在文件 equivalence_options.hpp 第 34 行定义.

LMCAS::EqvOptions 的协作图:
类成员
EqvBudget budget = {}
EqvProfile profile = EqvProfile::Core

◆ LMCAS::EvaluatedTransform

struct LMCAS::EvaluatedTransform

受检变换成功时返回在 conditions 和收敛域 roc 条件下有效的已求值表达式。 支持性未决或收敛条件无法表示时,返回外层 Inconclusive 错误。

在文件 conditional_result.hpp 第 83 行定义.

LMCAS::EvaluatedTransform 的协作图:
类成员
vector< ExprPtr > conditions
ExprPtr expression
vector< ExprPtr > roc

◆ LMCAS::ExactNormalizationProof

struct LMCAS::ExactNormalizationProof

在文件 proof_outcome.hpp 第 15 行定义.

LMCAS::ExactNormalizationProof 的协作图:
类成员
ProofExprPtr normalized_residual

◆ LMCAS::ExactResidualProof

struct LMCAS::ExactResidualProof

在文件 proof_outcome.hpp 第 18 行定义.

LMCAS::ExactResidualProof 的协作图:
类成员
ProofExprPtr normalized_residual

◆ LMCAS::ExactRoundTripProof

struct LMCAS::ExactRoundTripProof

在文件 proof_outcome.hpp 第 21 行定义.

LMCAS::ExactRoundTripProof 的协作图:
类成员
ProofExprPtr normalized_residual

◆ LMCAS::ExprMatch

struct LMCAS::ExprMatch

在文件 expr.hpp 第 37 行定义.

LMCAS::ExprMatch 的协作图:
类成员
vector< ExprMatchBinding > bindings
bool matched = false

◆ LMCAS::ExprMatchBinding

struct LMCAS::ExprMatchBinding

在文件 expr.hpp 第 32 行定义.

LMCAS::ExprMatchBinding 的协作图:
类成员
string name
ExprPtr value

◆ LMCAS::FiniteLimit

struct LMCAS::FiniteLimit

已证在请求的实数或复数域内有定义的有限值。 表达式树中所有极限均已求定,扩展实数运算均有确定结果。

在文件 limit_value.hpp 第 18 行定义.

LMCAS::FiniteLimit 的协作图:
类成员
LimitExprPtr value

◆ LMCAS::FiniteSolution

struct LMCAS::FiniteSolution

conditions 是在操作上下文假设下须同时满足的条件。 空条件保留原表达式定义域且不增加约束;整数参数遍历全体整数。

在文件 conditional_result.hpp 第 25 行定义.

LMCAS::FiniteSolution 的协作图:
类成员
vector< ExprPtr > conditions
size_t multiplicity = 1
ExprPtr value

◆ LMCAS::FiniteSolutions

struct LMCAS::FiniteSolutions

在文件 conditional_result.hpp 第 53 行定义.

LMCAS::FiniteSolutions 的协作图:
类成员
vector< FiniteSolution > values

◆ LMCAS::FourierPeriod

struct LMCAS::FourierPeriod

在文件 series_expansions.cpp 第 195 行定义.

LMCAS::FourierPeriod 的协作图:
类成员
shared_ptr< SymbolicExpr > frequency
shared_ptr< SymbolicExpr > half_length
shared_ptr< SymbolicExpr > lower
shared_ptr< SymbolicExpr > two
shared_ptr< SymbolicExpr > upper

◆ LMCAS::FrobeniusSolution

struct LMCAS::FrobeniusSolution

Frobenius 级数解结果.

在文件 symbolic_ode_engine.hpp 第 435 行定义.

LMCAS::FrobeniusSolution 的协作图:
类成员
optional< ProofCertificate > certificate
vector< double > indicial_roots 指标方程的根(正则奇点时)
shared_ptr< SymbolicExpr > normalized_residual
ODESingularityType point_type 展开点的奇点类型
shared_ptr< SymbolicExpr > series_solution 截断级数解
int truncation_order 截断阶数

◆ LMCAS::GcdSamples

struct LMCAS::GcdSamples

在文件 multivariate_factor.cpp 第 257 行定义.

LMCAS::GcdSamples 的协作图:
类成员
vector< Rational > points
int target_degree = -1
vector< MultiPoly > values

◆ LMCAS::HenselLiftPair

struct LMCAS::HenselLiftPair

二因子二次 Hensel 提升的状态结构.

存储一对因子 g, h 及其 Bezout 系数 s, t,满足:

  • f == g * h (mod modulus)
  • s * g + t * h == 1 (mod modulus)

系数按升幂存储:coeffs[i] 对应 x^i 的系数.

在文件 exact_factorization.hpp 第 81 行定义.

LMCAS::HenselLiftPair 的协作图:
类成员
vector< BigInt > g 第一个因子的系数。
vector< BigInt > h 第二个因子的系数。
BigInt modulus 当前模数。
vector< BigInt > s g 的 Bezout 系数。
vector< BigInt > t h 的 Bezout 系数。

◆ LMCAS::IntegrationStep

struct LMCAS::IntegrationStep

在文件 multiple_integral.hpp 第 9 行定义.

LMCAS::IntegrationStep 的协作图:
类成员
shared_ptr< SymbolicExpr > lower
shared_ptr< SymbolicExpr > upper
string variable

◆ LMCAS::IntervalSolution

struct LMCAS::IntervalSolution

在文件 conditional_result.hpp 第 31 行定义.

LMCAS::IntervalSolution 的协作图:
类成员
vector< ExprPtr > conditions
ExprPtr lower
bool lower_closed = true
ExprPtr upper
bool upper_closed = true

◆ LMCAS::IntervalSolutions

struct LMCAS::IntervalSolutions

在文件 conditional_result.hpp 第 56 行定义.

LMCAS::IntervalSolutions 的协作图:
类成员
vector< IntervalSolution > values

◆ LMCAS::IsolatedInterval

struct LMCAS::IsolatedInterval

隔离子区间,包含至多一个根

在文件 solve_mixed_transcendental.hpp 第 31 行定义.

LMCAS::IsolatedInterval 的协作图:
类成员
bool confirmed 若导数单调性确认恰含一个根则为 true
lmmc_real_t hi 子区间上界
lmmc_real_t lo 子区间下界

◆ LMCAS::JordanDecomposition

struct LMCAS::JordanDecomposition

在文件 matrix_decomposition.hpp 第 36 行定义.

LMCAS::JordanDecomposition 的协作图:
类成员
shared_ptr< SymbolicExpr > J
shared_ptr< SymbolicExpr > P

◆ LMCAS::LaurentResult

struct LMCAS::LaurentResult

洛朗级数展开结果.

在文件 series_engine.hpp 第 171 行定义.

LMCAS::LaurentResult 的协作图:
类成员
int pole_order 极点阶数(非极点时为 0)
shared_ptr< SymbolicExpr > residue 留数((z-z_0)-¹ 的系数)
shared_ptr< SymbolicExpr > series 洛朗级数表达式
SingularityType singularity 奇点类型

◆ LMCAS::LimitDoesNotExist

struct LMCAS::LimitDoesNotExist

在文件 limit_value.hpp 第 23 行定义.

LMCAS::LimitDoesNotExist 的协作图:

◆ LMCAS::LineSymbolic

struct LMCAS::LineSymbolic

由一点和方向向量定义的符号直线。

在文件 symbolic_geometry_line_plane.hpp 第 7 行定义.

LMCAS::LineSymbolic 的协作图:
类成员
vector< shared_ptr< SymbolicExpr > > direction 方向向量。
vector< shared_ptr< SymbolicExpr > > point 直线上一点。

◆ LMCAS::LUDecomposition

struct LMCAS::LUDecomposition

在文件 matrix_decomposition.hpp 第 15 行定义.

LMCAS::LUDecomposition 的协作图:
类成员
shared_ptr< SymbolicExpr > L
shared_ptr< SymbolicExpr > P
shared_ptr< SymbolicExpr > U

◆ LMCAS::MathResult

struct LMCAS::MathResult
template<typename T>
struct LMCAS::MathResult< T >

在文件 result.hpp 第 125 行定义.

LMCAS::MathResult< T > 的协作图:
类成员
Completeness completeness = Completeness::Complete
string reason
T value

◆ LMCAS::MatrixInconsistentLinearSolution

struct LMCAS::MatrixInconsistentLinearSolution

在文件 symbolic_matrix.hpp 第 88 行定义.

LMCAS::MatrixInconsistentLinearSolution 的协作图:

◆ LMCAS::MatrixUniqueLinearSolution

struct LMCAS::MatrixUniqueLinearSolution

在文件 symbolic_matrix.hpp 第 78 行定义.

LMCAS::MatrixUniqueLinearSolution 的协作图:
类成员
vector< shared_ptr< SymbolicExpr > > values

◆ LMCAS::MultiFactorResult

struct LMCAS::MultiFactorResult

多元因式分解结果

满足不变量:constant * ∏(factors[i] ^ multiplicities[i]) == 原多项式。 Complete 结果的终端因子已证明不可约;Inconclusive 结果保留精确乘积。

在文件 multivariate_factor.hpp 第 33 行定义.

LMCAS::MultiFactorResult 的协作图:
类成员
Rational constant 数值常数因子
vector< MultiPoly > factors 精确因子列表(各因子本原)
vector< int > multiplicities 各因子的重数

◆ LMCAS::NegativeInfinityLimit

struct LMCAS::NegativeInfinityLimit

在文件 limit_value.hpp 第 22 行定义.

LMCAS::NegativeInfinityLimit 的协作图:

◆ LMCAS::NumericRoot

struct LMCAS::NumericRoot

数值根结果,包含根值,残差和迭代次数.

在文件 solve_strategies.hpp 第 32 行定义.

LMCAS::NumericRoot 的协作图:
类成员
int iterations 收敛所用迭代次数
lmmc_real_t residual 残差(将根代入方程后的绝对值)
lmmc_real_t value 根的数值

◆ LMCAS::ODEClassification

struct LMCAS::ODEClassification

ODE 分类结果,包含类型及提取的结构信息.

在文件 symbolic_ode_engine.hpp 第 42 行定义.

LMCAS::ODEClassification 的协作图:
类成员
int bernoulli_n = 0
shared_ptr< SymbolicExpr > bernoulli_P Bernoulli: P(x), Q(x), n 使得 y' + P(x)y = Q(x)y^n
shared_ptr< SymbolicExpr > bernoulli_Q
vector< double > const_coeffs 常系数: 系数列表 [a_n, a_{n-1}, ..., a_1, a_0] 和非齐次项 f(x)
vector< double > euler_coeffs Euler 方程: 系数列表 [a_n, ..., a_0] 对应 x^n*y^(n) + ... + a_0*y = f(x)
shared_ptr< SymbolicExpr > euler_forcing
shared_ptr< SymbolicExpr > exact_M 恰当方程: M(x,y), N(x,y)
shared_ptr< SymbolicExpr > exact_N
shared_ptr< SymbolicExpr > forcing_func
int order = 0 方程阶数
shared_ptr< SymbolicExpr > P_coeff 一阶线性: P(x), Q(x) 使得 y' + P(x)y = Q(x)
shared_ptr< SymbolicExpr > Q_coeff
ODEType type = ODEType::Unknown 识别出的 ODE 类型

◆ LMCAS::ODESolution

struct LMCAS::ODESolution

ODE 求解结果.

在文件 symbolic_ode_engine.hpp 第 71 行定义.

LMCAS::ODESolution 的协作图:
类成员
optional< ProofCertificate > certificate
vector< string > constants 任意常数名称列表 (C1, C2, ...)
shared_ptr< SymbolicExpr > general_solution 通解表达式
ODEType method_used = ODEType::Unknown 使用的求解方法
shared_ptr< SymbolicExpr > normalized_residual

◆ LMCAS::OdeTaylorCoefficients

struct LMCAS::OdeTaylorCoefficients

在文件 ode_frobenius.cpp 第 43 行定义.

LMCAS::OdeTaylorCoefficients 的协作图:
类成员
vector< double > p
vector< double > q

◆ LMCAS::ParametricSolution

struct LMCAS::ParametricSolution

在文件 conditional_result.hpp 第 39 行定义.

LMCAS::ParametricSolution 的协作图:
类成员
vector< ExprPtr > conditions
vector< string > integer_parameters
ExprPtr value

◆ LMCAS::ParametricSolutions

struct LMCAS::ParametricSolutions

在文件 conditional_result.hpp 第 62 行定义.

LMCAS::ParametricSolutions 的协作图:
类成员
vector< ParametricSolution > values

◆ LMCAS::PiecewiseSolution

struct LMCAS::PiecewiseSolution

含参方程组的分段解,按参数条件分类

在文件 parametric_solver.hpp 第 15 行定义.

LMCAS::PiecewiseSolution 的协作图:
类成员
vector< Case > cases 所有分段

◆ LMCAS::PlaneSymbolic

struct LMCAS::PlaneSymbolic

由法向量和常数 d 定义的符号平面 ax + by + cz = d。

在文件 symbolic_geometry_line_plane.hpp 第 15 行定义.

LMCAS::PlaneSymbolic 的协作图:
类成员
shared_ptr< SymbolicExpr > d 常数项。
vector< shared_ptr< SymbolicExpr > > normal 法向量。

◆ LMCAS::PositiveInfinityLimit

struct LMCAS::PositiveInfinityLimit

在文件 limit_value.hpp 第 21 行定义.

LMCAS::PositiveInfinityLimit 的协作图:

◆ LMCAS::ProvedNonIdentityResidual

struct LMCAS::ProvedNonIdentityResidual

证明残差在原公共定义域上非恒零,例如非零有理多项式。 残差仍可能在特定参数值处为零;点值不等性、定义域及上下文假设下的非零性均需另行证明。

在文件 residual_verification.hpp 第 23 行定义.

LMCAS::ProvedNonIdentityResidual 的协作图:
类成员
ExprPtr normalized_residual

◆ LMCAS::ProvedZeroResidual

struct LMCAS::ProvedZeroResidual

在表达式的原公共定义域上认证值相等;点值定义域与分母条件需另行证明。

在文件 residual_verification.hpp 第 15 行定义.

LMCAS::ProvedZeroResidual 的协作图:
类成员
ProofCertificate certificate

◆ LMCAS::QRDecomposition

struct LMCAS::QRDecomposition

在文件 matrix_decomposition.hpp 第 21 行定义.

LMCAS::QRDecomposition 的协作图:
类成员
shared_ptr< SymbolicExpr > Q
shared_ptr< SymbolicExpr > R

◆ LMCAS::QuadraticBoundaries

struct LMCAS::QuadraticBoundaries

在文件 inequality_solver_polynomial.cpp 第 126 行定义.

LMCAS::QuadraticBoundaries 的协作图:
类成员
shared_ptr< SymbolicExpr > first
shared_ptr< SymbolicExpr > second

◆ LMCAS::QuadratureEstimate

struct LMCAS::QuadratureEstimate

在文件 numerical_integration.hpp 第 13 行定义.

LMCAS::QuadratureEstimate 的协作图:
类成员
double estimated_error = 0.0
double value = 0.0

◆ LMCAS::RationalRootReconstruction

struct LMCAS::RationalRootReconstruction

在文件 symbolic_factor.cpp 第 274 行定义.

LMCAS::RationalRootReconstruction 的协作图:
类成员
vector< shared_ptr< const SymbolicNode > > factors
Polynomial< Rational > quotient
Polynomial< Rational > remainder

◆ LMCAS::Relation

struct LMCAS::Relation

A stored relational constraint between two symbolic expressions.

在文件 relation_store.hpp 第 32 行定义.

LMCAS::Relation 的协作图:
类成员
SymbolicExpr lhs Left-hand side expression
RelationOp op Relational operator (GT, LT, GEQ, LEQ, NEQ, EQ)
SymbolicExpr rhs Right-hand side expression

◆ LMCAS::ResourceLimits

struct LMCAS::ResourceLimits

Per-operation limits for APIs that accept a ComputationContext.

Context-free BigInt and symbolic constructors are intentionally unbounded; use checked, context-aware entry points when processing untrusted input.

在文件 computation_context.hpp 第 26 行定义.

LMCAS::ResourceLimits 的协作图:
类成员
size_t max_ast_nodes = 1'000'000 Reference-expanded nodes per AST or output forest.
size_t max_diagnostics = 10'000 Stored diagnostics.
size_t max_expansion_terms = 100'000 One checked expansion.
size_t max_input_bytes = 1'048'576 One checked input buffer.
size_t max_integer_bits = 1'000'000 One checked integer result.
size_t max_recursion_depth = 256 Simultaneous checked depth.
size_t max_steps = 10'000'000 Cumulative checked steps.

◆ LMCAS::SearchInterval

struct LMCAS::SearchInterval

搜索区间

在文件 solve_mixed_transcendental.hpp 第 25 行定义.

LMCAS::SearchInterval 的协作图:
类成员
lmmc_real_t hi 上界
lmmc_real_t lo 下界

◆ LMCAS::SignChartEntry

struct LMCAS::SignChartEntry

符号图条目,记录区间及其上的符号

在文件 inequality_solver.hpp 第 19 行定义.

LMCAS::SignChartEntry 的协作图:
类成员
Interval interval 区间
int sign 该区间上表达式的符号(+1, 0, -1)

◆ LMCAS::SolveOptions

struct LMCAS::SolveOptions

方程求解选项,控制数值求解行为和结果形式.

在文件 solve_strategies.hpp 第 17 行定义.

LMCAS::SolveOptions 的协作图:
类成员
bool allow_numeric = false 是否允许数值求解
bool has_initial_guess = false 是否指定了初始猜测值
bool has_search_interval = false 是否指定了搜索区间
lmmc_real_t initial_guess = 0.0 数值迭代初始猜测值
int max_newton_iterations = 100 Newton 迭代最大次数
int max_roots = -1 数值候选数量预算;精确解集和整数解族保持完整。
bool return_rootof = true 为 false 时,任何不可表示的根使整个求解返回 Inconclusive。
lmmc_real_t search_hi = 10.0 搜索区间上界(默认 10)
lmmc_real_t search_lo = -10.0 搜索区间下界(默认 -10)
lmmc_real_t tolerance = 1e-12 收敛容差

◆ LMCAS::SquareFreeDecomp

struct LMCAS::SquareFreeDecomp

无平方因子分解结果

components[i] 的重数为 i+1。 满足:f = components[0] * components[1]² * components[2]³ * ...(至多差常数)。

在文件 multivariate_factor.hpp 第 100 行定义.

LMCAS::SquareFreeDecomp 的协作图:
类成员
vector< MultiPoly > components 各无平方分量,components[i] 重数为 i+1

◆ LMCAS::SubstitutionResult

struct LMCAS::SubstitutionResult

换元结果,记录换元表达式、换元后的多项式及换元变量名。

在文件 solve_transcendental.hpp 第 18 行定义.

LMCAS::SubstitutionResult 的协作图:
类成员
shared_ptr< SymbolicExpr > poly_in_u 换元后关于 u 的多项式
shared_ptr< SymbolicExpr > u_expr 换元表达式(u = f(x) 中的 f(x))
string u_var 换元变量名

◆ LMCAS::SurfaceSymbolic

struct LMCAS::SurfaceSymbolic

隐式曲面 F(x,y,z) = 0。

在文件 symbolic_geometry_quadric.hpp 第 7 行定义.

LMCAS::SurfaceSymbolic 的协作图:
类成员
shared_ptr< SymbolicExpr > F 曲面方程左端,等于零。
vector< string > vars 坐标变量名 {x,y,z}。

◆ LMCAS::SVDDecomposition

struct LMCAS::SVDDecomposition

在文件 matrix_decomposition.hpp 第 30 行定义.

LMCAS::SVDDecomposition 的协作图:
类成员
shared_ptr< SymbolicExpr > S
shared_ptr< SymbolicExpr > U
shared_ptr< SymbolicExpr > V

◆ LMCAS::TransSubstitution

struct LMCAS::TransSubstitution

换元映射条目:超越子表达式 -> 代数不定元名

在文件 transcendental_factor.hpp 第 23 行定义.

LMCAS::TransSubstitution 的协作图:
类成员
string indeterminate 代数不定元名 (e.g., "u0")
shared_ptr< SymbolicExpr > trans_expr 原始超越子表达式 (e.g., sin(x))

◆ LMCAS::TransSubstitutionResult

struct LMCAS::TransSubstitutionResult

换元结果

在文件 transcendental_factor.hpp 第 29 行定义.

LMCAS::TransSubstitutionResult 的协作图:
类成员
vector< shared_ptr< SymbolicExpr > > constraints 代数约束 (e.g., u0^2+u1^2-1=0)
vector< TransSubstitution > mappings 所有换元映射
shared_ptr< SymbolicExpr > poly_expr 换元后的多项式表达式

◆ LMCAS::TrigSquare

struct LMCAS::TrigSquare

在文件 transcendental_pythagorean.cpp 第 105 行定义.

LMCAS::TrigSquare 的协作图:
类成员
shared_ptr< const SymbolicNode > argument
shared_ptr< const SymbolicNode > coefficient
FuncType type

◆ LMCAS::UnitDefinition

struct LMCAS::UnitDefinition

在文件 unit.hpp 第 42 行定义.

LMCAS::UnitDefinition 的协作图:
类成员
DimensionSignature dimension
Rational scale_to_base = Rational(1)

◆ LMCAS::UniversalSolutions

struct LMCAS::UniversalSolutions

在文件 conditional_result.hpp 第 52 行定义.

LMCAS::UniversalSolutions 的协作图:

◆ LMCAS::UnprovedResidual

struct LMCAS::UnprovedResidual

在文件 residual_verification.hpp 第 27 行定义.

LMCAS::UnprovedResidual 的协作图:
类成员
ExprPtr normalized_residual

◆ LMCAS::Verified

struct LMCAS::Verified
template<class T>
struct LMCAS::Verified< T >

在文件 proof_outcome.hpp 第 32 行定义.

LMCAS::Verified< T > 的协作图:
类成员
ProofCertificate certificate
T value

◆ LMCAS::ZcFactorSearch

struct LMCAS::ZcFactorSearch

在文件 zassenhaus_combine.cpp 第 347 行定义.

LMCAS::ZcFactorSearch 的协作图:
类成员
vector< size_t > active
ComputationContext & context
vector< Polynomial< Rational > > factors
const vector< Polynomial< BigInt > > & lifted
const BigInt & modulus
Polynomial< Rational > remaining

类型定义说明

◆ AssumptionSolveResult

◆ AssumptionTriboolResult

◆ AssumptionVoidResult

在文件 assumption_context.hpp 第 33 行定义.

◆ AsymptoteAnalysisResult

◆ BindingResult

在文件 expr.hpp 第 30 行定义.

◆ CholeskyDecompositionResult

◆ ComplexBoolResult

在文件 complex_analysis.hpp 第 14 行定义.

◆ ComplexRootsResult

在文件 symbolic_complex.hpp 第 22 行定义.

◆ ComplexSymbolicResult

◆ ConstExprPtr

using LMCAS::ConstExprPtr = std::shared_ptr<const SymbolicExpr>

在文件 expr.hpp 第 27 行定义.

◆ ContinuityResult

◆ ConvergenceInfoResult

◆ CrtResult

using LMCAS::CrtResult = Result<std::pair<int64_t, int64_t>>

在文件 modular_arithmetic.hpp 第 22 行定义.

◆ DifferentialGeometryExprResult

using LMCAS::DifferentialGeometryExprResult = Result<std::shared_ptr<SymbolicExpr>>

在文件 differential_geometry.hpp 第 15 行定义.

◆ DifferentialGeometryVectorResult

using LMCAS::DifferentialGeometryVectorResult = Result<std::vector<std::shared_ptr<SymbolicExpr>>>

在文件 differential_geometry.hpp 第 16 行定义.

◆ Expr

using LMCAS::Expr = SymbolicExpr

在文件 expr.hpp 第 26 行定义.

◆ ExpressionResult

using LMCAS::ExpressionResult = Result<std::shared_ptr<SymbolicExpr>>

Result of an operation that produces a symbolic expression.

在文件 symbolic.hpp 第 31 行定义.

◆ ExprMatchResult

在文件 expr.hpp 第 42 行定义.

◆ ExprPtr

using LMCAS::ExprPtr = std::shared_ptr<SymbolicExpr>

在文件 conditional_result.hpp 第 19 行定义.

◆ ExprResult

在文件 expr.hpp 第 28 行定义.

◆ ExprSetResult

using LMCAS::ExprSetResult = Result<ExprSet>

在文件 expr.hpp 第 83 行定义.

◆ ExtremaResult

using LMCAS::ExtremaResult = Result<std::vector<CriticalPoint>>

在文件 vector_calculus_extrema.hpp 第 23 行定义.

◆ FiniteSolveResult

◆ FrobeniusSolutionResult

◆ HenselLiftResult

using LMCAS::HenselLiftResult = Result<std::vector<Polynomial<BigInt>>>

在文件 exact_factorization.hpp 第 40 行定义.

◆ InferencePeriodResult

using LMCAS::InferencePeriodResult = Result<std::optional<SymbolicExpr>>

在文件 inference_engine.hpp 第 37 行定义.

◆ InferenceTriboolResult

◆ JordanDecompositionResult

◆ LagrangeResult

◆ LaurentSeriesResult

◆ LimitExpressionResult

◆ LimitExprPtr

using LMCAS::LimitExprPtr = std::shared_ptr<SymbolicExpr>

在文件 limit_value.hpp 第 12 行定义.

◆ LimitOutcome

初始值:
std::variant<
已证在请求的实数或复数域内有定义的有限值。 表达式树中所有极限均已求定,扩展实数运算均有确定结果。

在文件 limit_value.hpp 第 25 行定义.

◆ LimitResult

在文件 limit_value.hpp 第 27 行定义.

◆ LineSymbolicResult

◆ LUDecompositionResult

◆ MatchMap

using LMCAS::MatchMap = std::unordered_map<std::string, SymbolicExpr>

匹配结果映射,通配符名称 → 绑定的表达式

在文件 matcher.hpp 第 21 行定义.

◆ MatrixEigenvalueResult

using LMCAS::MatrixEigenvalueResult = Result<std::vector<std::shared_ptr<SymbolicExpr>>>

在文件 symbolic_matrix.hpp 第 16 行定义.

◆ MatrixEigenvectorResult

◆ MatrixLinearSolution

◆ MatrixLinearSolveResult

◆ MatrixNullspaceResult

◆ MatrixRankResult

using LMCAS::MatrixRankResult = Result<std::size_t>

计算两个符号矩阵的乘积

归一化后的近似元素保留浮点计算值,精确元素保持精确算术。 误差容限用于显式数值比较,不参与矩阵元素的归一化。 矩阵因子按输入顺序相乘,结果形状为左矩阵行数乘以右矩阵列数。 成功返回已归一化的显式矩阵;稀疏存储及全零乘积不会丢失结果维度。

参数
A左矩阵
B右矩阵
返回
乘积矩阵的符号表达式

计算符号矩阵的行列式

参数
A输入矩阵
返回
行列式的符号表达式

计算符号矩阵的逆矩阵

参数
A输入矩阵
返回
逆矩阵的符号表达式

在文件 symbolic_matrix.hpp 第 74 行定义.

◆ MixedTranscendentalResult

初始值:

受检混合超越方程求解结果.

Complete 表示给定有界区间内的全部求解路径均已穷尽; Inconclusive 可携带已经通过区间与残差验证的候选根。恒零方程和 仅依赖未绑定参数的方程也返回 Inconclusive,因为有限向量无法表示其解集。

在文件 solve_mixed_transcendental.hpp 第 44 行定义.

◆ Monomial

using LMCAS::Monomial = std::vector<int>

单项式类型,以整数向量表示各变量的指数

在文件 monomial_order.hpp 第 15 行定义.

◆ MultiFactorCheckedResult

◆ NodeMap

template<typename T>
using LMCAS::NodeMap = std::unordered_map<std::shared_ptr<const SymbolicNode>, T, NodeHash, NodeEqual>

在文件 base.hpp 第 287 行定义.

◆ NodeSet

using LMCAS::NodeSet = std::unordered_set<std::shared_ptr<const SymbolicNode>, NodeHash, NodeEqual>

在文件 base.hpp 第 289 行定义.

◆ NumericBindings

using LMCAS::NumericBindings = std::unordered_map<std::string, double>

在文件 numeric_evaluation.hpp 第 14 行定义.

◆ NumericRootResult

using LMCAS::NumericRootResult = Result<std::optional<NumericRoot>>

在文件 newton_raphson.hpp 第 20 行定义.

◆ NumericRootsResult

在文件 newton_raphson.hpp 第 21 行定义.

◆ ODESingularityResult

◆ ODESolutionResult

◆ OptionalRationalPolynomial

template<typename T>
using LMCAS::OptionalRationalPolynomial = std::optional<Polynomial<Rational>>

将符号表达式转换为一元多项式。

支持 BigInt、Rational 和 SymbolicPolyCoeff 系数。 不支持的子树或无法表示的系数使整个转换返回 UnsupportedExpression; 成功返回的零多项式表示数学上的零。空输入或变量名返回 InvalidArgument。 幂展开次数须为小于 1000 的非负整数;更大次数或超出 int 次数表示范围的 系数存储返回 ResourceLimit。有限 double 按精确 binary64 值转换; 证明源表达式精确性请用 recognize_rational_polynomial()。

将支持的一元多项式转换为符号表达式。

支持 BigInt、Rational 和 SymbolicPolyCoeff 系数。

在文件 polynomial_conversion.hpp 第 43 行定义.

◆ ParametricMatrix

using LMCAS::ParametricMatrix = std::vector<std::vector<std::shared_ptr<SymbolicExpr>>>

在文件 parametric_solver.cpp 第 69 行定义.

◆ ParametricSolutionList

初始值:
std::vector<std::map<std::string, std::shared_ptr<SymbolicExpr>>>

在文件 parametric_solver.hpp 第 24 行定义.

◆ ParametricSolutionsResult

◆ ParametricVector

using LMCAS::ParametricVector = std::vector<std::shared_ptr<SymbolicExpr>>

在文件 parametric_solver.cpp 第 70 行定义.

◆ PlaneSymbolicResult

◆ PolynomialSystemResult

初始值:

多项式方程组求解器,提供线性系统求解、Gröbner 基计算及多项式系统求解功能。

在文件 solver.hpp 第 19 行定义.

◆ PowerSeriesResult

using LMCAS::PowerSeriesResult = Result<std::vector<std::shared_ptr<SymbolicExpr>>>

在文件 series_engine.hpp 第 16 行定义.

◆ ProofCertificate

◆ ProofExprPtr

using LMCAS::ProofExprPtr = std::shared_ptr<SymbolicExpr>

在文件 proof_outcome.hpp 第 12 行定义.

◆ PropertyStoreResult

在文件 property_store.hpp 第 25 行定义.

◆ QRDecompositionResult

◆ QuantityResult

using LMCAS::QuantityResult = Result<std::shared_ptr<SymbolicExpr>>

在文件 quantity.hpp 第 12 行定义.

◆ QueryPeriodResult

using LMCAS::QueryPeriodResult = Result<std::optional<SymbolicExpr>>

在文件 query_interface.hpp 第 28 行定义.

◆ QueryTriboolResult

在文件 query_interface.hpp 第 27 行定义.

◆ RationalReconstructionResult

using LMCAS::RationalReconstructionResult = Result<std::pair<int64_t, int64_t>>

在文件 modular_arithmetic.hpp 第 23 行定义.

◆ RelationStoreResult

在文件 relation_store.hpp 第 27 行定义.

◆ ResidualCheck

初始值:
std::variant<
在表达式的原公共定义域上认证值相等;点值定义域与分母条件需另行证明。
证明残差在原公共定义域上非恒零,例如非零有理多项式。 残差仍可能在特定参数值处为零;点值不等性、定义域及上下文假设下的非零性均需另行证明。

在文件 residual_verification.hpp 第 31 行定义.

◆ ResidualCheckResult

◆ RootOfComplexEvaluationResult

◆ RootOfConstructionResult

using LMCAS::RootOfConstructionResult = Result<std::shared_ptr<SymbolicExpr>>

在文件 root_of_identity.hpp 第 20 行定义.

◆ RootOfEvaluationResult

using LMCAS::RootOfEvaluationResult = Result<lmmc_real_t>

在文件 root_of_identity.hpp 第 18 行定义.

◆ SolutionSet

◆ SolveResult

在文件 conditional_result.hpp 第 77 行定义.

◆ SolveVectorResult

◆ SVDDecompositionResult

◆ SymbolicExprVectorResult

using LMCAS::SymbolicExprVectorResult = Result<std::vector<std::shared_ptr<SymbolicExpr>>>

在文件 calculus_utils.hpp 第 55 行定义.

◆ SymbolicGcdResult

using LMCAS::SymbolicGcdResult = Result<std::shared_ptr<SymbolicExpr>>

在文件 poly_utils.hpp 第 11 行定义.

◆ SymbolicSetResult

using LMCAS::SymbolicSetResult = Result<std::shared_ptr<SymbolicExpr>>

在文件 symbolic_set.hpp 第 11 行定义.

◆ TransformEngineResult

◆ UnivariateFactorResult

◆ VectorAngleResult

在文件 symbolic_geometry_vector.hpp 第 12 行定义.

◆ VectorCalculusExprResult

using LMCAS::VectorCalculusExprResult = Result<std::shared_ptr<SymbolicExpr>>

在文件 vector_calculus_types.hpp 第 16 行定义.

◆ VectorCalculusFieldResult

◆ VectorExprListResult

using LMCAS::VectorExprListResult = Result<std::vector<std::shared_ptr<SymbolicExpr>>>

在文件 symbolic_geometry_vector.hpp 第 11 行定义.

◆ VectorField

using LMCAS::VectorField = std::vector<std::shared_ptr<SymbolicExpr>>

向量场由标量表达式组成。

在文件 vector_calculus_types.hpp 第 15 行定义.

◆ VectorStringResult

using LMCAS::VectorStringResult = Result<std::string>

在文件 symbolic_geometry_vector.hpp 第 13 行定义.

◆ ZassenhausResult

枚举类型说明

◆ Boundedness

enum class LMCAS::Boundedness
strong

Boundedness classification for symbols.

枚举值
Bounded 

Symbol has finite bounds

Unbounded 

Symbol is unbounded

Unknown 

Boundedness not determined

在文件 assumption.hpp 第 43 行定义.

43 {
44 Bounded, ///< Symbol has finite bounds
45 Unbounded, ///< Symbol is unbounded
46 Unknown ///< Boundedness not determined
47};
@ Unbounded
Symbol is unbounded
@ Bounded
Symbol has finite bounds
@ Unknown
Parity not determined

◆ CalculusRealCandidateStatus

枚举值
Real 
NonReal 
Inconclusive 

在文件 calculus_inverse.cpp 第 123 行定义.

◆ CasErrc

enum class LMCAS::CasErrc
strong
枚举值
InvalidArgument 
ParseError 
UnboundSymbol 
DomainError 
DimensionMismatch 
UnitInvalid 
UnitStripTypeMismatch 
SetElementTypeMismatch 
SetOperandTypeMismatch 
SetElementNotHashable 
UnsupportedExpression 
Inconclusive 
ResourceLimit 
Cancelled 
NumericFailure 
InternalInvariant 

在文件 result.hpp 第 12 行定义.

◆ Completeness

enum class LMCAS::Completeness
strong
枚举值
Complete 
Inconclusive 

在文件 result.hpp 第 122 行定义.

◆ ContinuityType

enum class LMCAS::ContinuityType
strong

连续性类型枚举.

枚举值
Continuous 

连续:左极限 = 右极限 = 函数值

Removable 

可去间断点:左极限 = 右极限 != 函数值(或函数无定义)

Jump 

跳跃间断点:左极限 != 右极限,但两侧极限均存在

Essential 

本性间断点:至少一侧极限不存在或为无穷

在文件 calculus_utils.hpp 第 21 行定义.

21 {
22 Continuous, ///< 连续:左极限 = 右极限 = 函数值
23 Removable, ///< 可去间断点:左极限 = 右极限 != 函数值(或函数无定义)
24 Jump, ///< 跳跃间断点:左极限 != 右极限,但两侧极限均存在
25 Essential ///< 本性间断点:至少一侧极限不存在或为无穷
26};
@ Jump
跳跃间断点:左极限 != 右极限,但两侧极限均存在
@ Continuous
连续:左极限 = 右极限 = 函数值
@ Essential
本性间断点:至少一侧极限不存在或为无穷
@ Removable
可去间断点:左极限 = 右极限 != 函数值(或函数无定义)

◆ ConvergenceResult

enum class LMCAS::ConvergenceResult
strong

收敛性结果枚举.

枚举值
Convergent 

收敛

Divergent 

发散

Inconclusive 

无法判定

在文件 series_engine.hpp 第 22 行定义.

22 {
23 Convergent, ///< 收敛
24 Divergent, ///< 发散
25 Inconclusive ///< 无法判定
26};
@ Divergent
Diverges to infinity or oscillates

◆ CriticalPointClassification

◆ Definiteness

enum class LMCAS::Definiteness
strong

Matrix definiteness classification.

枚举值
PositiveDefinite 

All eigenvalues positive

PositiveSemiDefinite 

All eigenvalues non-negative

NegativeDefinite 

All eigenvalues negative

NegativeSemiDefinite 

All eigenvalues non-positive

Indefinite 

Mixed eigenvalue signs

Unknown 

Definiteness not determined

在文件 assumption.hpp 第 66 行定义.

66 {
67 PositiveDefinite, ///< All eigenvalues positive
68 PositiveSemiDefinite, ///< All eigenvalues non-negative
69 NegativeDefinite, ///< All eigenvalues negative
70 NegativeSemiDefinite, ///< All eigenvalues non-positive
71 Indefinite, ///< Mixed eigenvalue signs
72 Unknown ///< Definiteness not determined
73};
@ NegativeSemiDefinite
All eigenvalues non-positive
@ NegativeDefinite
All eigenvalues negative
@ PositiveSemiDefinite
All eigenvalues non-negative
@ PositiveDefinite
All eigenvalues positive
@ Indefinite
Mixed eigenvalue signs

◆ DiagnosticSeverity

◆ Domain

enum class LMCAS::Domain
strong

Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational ⊃ Integer ⊃ Natural ⊃ PositiveInt

枚举值
Complex 

Complex numbers (default, least specific)

Real 

Real numbers

Algebraic 

Algebraic numbers (roots of polynomials with rational coefficients)

Rational 

Rational numbers

Integer 

Integers

Natural 

Non-negative integers (0, 1, 2, ...)

PositiveInt 

Positive integers (1, 2, 3, ...)

在文件 assumption.hpp 第 15 行定义.

15 {
16 Complex, ///< Complex numbers (default, least specific)
17 Real, ///< Real numbers
18 Algebraic, ///< Algebraic numbers (roots of polynomials with rational coefficients)
19 Rational, ///< Rational numbers
20 Integer, ///< Integers
21 Natural, ///< Non-negative integers (0, 1, 2, ...)
22 PositiveInt ///< Positive integers (1, 2, 3, ...)
23};
@ Complex
Complex numbers (default, least specific)
@ Rational
Rational numbers
@ Natural
Non-negative integers (0, 1, 2, ...)
@ PositiveInt
Positive integers (1, 2, 3, ...)

◆ EqvProfile

enum class LMCAS::EqvProfile
strong
枚举值
Core 
TrigBasic 
ExpLogBasic 

在文件 equivalence_options.hpp 第 11 行定义.

◆ Finiteness

enum class LMCAS::Finiteness
strong

Finiteness classification for limits and sequences.

枚举值
Finite 

Has a finite value or limit

Divergent 

Diverges to infinity or oscillates

Unknown 

Finiteness not determined

在文件 assumption.hpp 第 76 行定义.

76 {
77 Finite, ///< Has a finite value or limit
78 Divergent, ///< Diverges to infinity or oscillates
79 Unknown ///< Finiteness not determined
80};
@ Finite
Has a finite value or limit

◆ InequalityType

enum class LMCAS::InequalityType
strong

不等式类型

枚举值
GreaterThan 

严格大于

GreaterEqual 

大于等于

LessThan 

严格小于

LessEqual 

小于等于

在文件 interval.hpp 第 18 行定义.

18 {
19 GreaterThan, ///< 严格大于
20 GreaterEqual, ///< 大于等于
21 LessThan, ///< 严格小于
22 LessEqual ///< 小于等于
23};

◆ LimitDirection

enum class LMCAS::LimitDirection
strong

Direction from which a limit approaches its point.

枚举值
Both 
FromBelow 
FromAbove 

在文件 limit_direction.hpp 第 6 行定义.

◆ MonomialOrderType

enum class LMCAS::MonomialOrderType
strong

单项式序的类型枚举

枚举值
Lex 

字典序

GrevLex 

分次逆字典序

DegLex 

分次字典序

DegRevLex 

分次逆字典序(同 GrevLex)

在文件 monomial_order.hpp 第 18 行定义.

18 {
19 Lex, ///< 字典序
20 GrevLex, ///< 分次逆字典序
21 DegLex, ///< 分次字典序
22 DegRevLex ///< 分次逆字典序(同 GrevLex)
23};
@ DegRevLex
分次逆字典序(同 GrevLex)

◆ Monotonicity

enum class LMCAS::Monotonicity
strong

Monotonicity classification for functions over intervals.

枚举值
Increasing 

Strictly increasing

Decreasing 

Strictly decreasing

NonDecreasing 

Non-decreasing (weakly increasing)

NonIncreasing 

Non-increasing (weakly decreasing)

Unknown 

Monotonicity not determined

在文件 assumption.hpp 第 57 行定义.

57 {
58 Increasing, ///< Strictly increasing
59 Decreasing, ///< Strictly decreasing
60 NonDecreasing, ///< Non-decreasing (weakly increasing)
61 NonIncreasing, ///< Non-increasing (weakly decreasing)
62 Unknown ///< Monotonicity not determined
63};
@ NonDecreasing
Non-decreasing (weakly increasing)
@ Decreasing
Strictly decreasing
@ NonIncreasing
Non-increasing (weakly decreasing)
@ Increasing
Strictly increasing

◆ NumberDomain

enum class LMCAS::NumberDomain
strong
枚举值
Integers 
Rationals 
Reals 
Complexes 
Expressions 

在文件 expr.hpp 第 85 行定义.

◆ NumericStatus

enum class LMCAS::NumericStatus
strong
枚举值
Finite 
PositiveInfinity 
NegativeInfinity 

在文件 numeric_value.hpp 第 5 行定义.

◆ ODESingularityType

enum class LMCAS::ODESingularityType
strong

对一阶 ODE 进行类型分类.

给定 dy/dx = rhs(x, y) 形式的方程右端,检测其属于哪种可求解类型. 检测顺序:可分离 -> 一阶线性 -> 齐次 -> Bernoulli -> 恰当. 空 rhs 返回 Unknown。

参数
[in]rhs方程右端表达式 (dy/dx = rhs)
[in]x自变量名
[in]y因变量名
返回
分类结果

对高阶线性 ODE 进行类型分类.

给定系数列表和非齐次项,检测是否为常系数或 Euler 类型. 系数列表按降阶排列:coeffs[0] 对应最高阶导数. 常系数分类仅在所有系数都能表示为有限 double 时返回;否则返回 Unknown, 避免在 const_coeffs 中伪造数值。

参数
[in]coeffs各阶导数的系数表达式列表(降阶排列)
[in]forcing非齐次项 f(x)
[in]x自变量名
[in]y因变量名
返回
分类结果

检测表达式是否为可分离变量形式 f(x)*g(y).

空 rhs、空变量名或相同的 x/y 变量名返回 false。

参数
[in]rhs方程右端表达式
[in]x自变量名
[in]y因变量名
返回
若可分离返回 true

检测一阶 ODE 是否为线性形式 y' + P(x)y = Q(x).

空 rhs、空变量名或相同的 x/y 变量名返回 false;返回 false 时 P、Q 均置空。

参数
[in]rhs方程右端表达式 (dy/dx = rhs)
[in]x自变量名
[in]y因变量名
[out]P若为线性,输出 P(x)
[out]Q若为线性,输出 Q(x)
返回
若为一阶线性返回 true

检测一阶 ODE 是否为齐次形式 y' = f(y/x).

通过检查 f(tx, ty) = f(x, y) 来判断齐次性. 判定只接受符号等价性证明;有限采样点相等不会被当作恒等证明。 空变量名或相同的 x/y 变量名返回 false。

参数
[in]rhs方程右端表达式
[in]x自变量名
[in]y因变量名
返回
若为齐次返回 true

检测一阶 ODE 是否为 Bernoulli 形式 y' + P(x)y = Q(x)y^n.

支持可由 AST 精确分解的任意 int 幂次,包括负幂;不通过有限点采样猜测 幂次。 空 rhs、空变量名或相同的 x/y 变量名返回 false;返回 false 时 P、Q 均置空且 n 置零。

参数
[in]rhs方程右端表达式 (dy/dx = rhs)
[in]x自变量名
[in]y因变量名
[out]P若为 Bernoulli,输出 P(x)
[out]Q若为 Bernoulli,输出 Q(x)
[out]n若为 Bernoulli,输出幂次 n (n != 0, 1)
返回
若为 Bernoulli 返回 true

检测方程是否为恰当形式 M(x,y) + N(x,y)y' = 0,即 partialM/partialy = partialN/partialx. 判定只接受符号等价性证明;有限采样点相等不会被当作恒等证明。 空表达式、空变量名或相同的 x/y 变量名返回 false。

参数
[in]MM(x,y) 表达式
[in]NN(x,y) 表达式
[in]x自变量名
[in]y因变量名
返回
若恰当返回 true

检测高阶 ODE 系数是否全为常数.

系数列表和自变量名必须非空,否则返回 false。

参数
[in]coeffs各阶导数的系数表达式列表
[in]x自变量名
返回
若所有系数不依赖 x 返回 true

检测高阶 ODE 是否为 Euler (Cauchy-Euler) 形式.

Euler 方程形如 x^n*y^(n) + a_{n-1}*x^{n-1}*y^{n-1} + ... + a_0*y = f(x), 即第 k 阶导数的系数为常数乘以 x^k. 系数列表和自变量名必须非空,最高阶系数必须非零。判定要求每个比值 coefficient_k/x^k 可被符号化简为有限常数,不用有限采样代替恒等证明。 返回 false 时 euler_consts 置空。

参数
[in]coeffs各阶导数的系数表达式列表(降阶排列)
[in]x自变量名
[out]euler_consts提取的常数系数列表
返回
若为 Euler 方程返回 true

求解齐次 ODE y' = f(y/x).

算法:令 v = y/x,则 y = vx,y' = v + xv'. 代入得 v + xv' = f(v),即 xv' = f(v) - v, 分离变量后积分,最后回代 v = y/x.

参数
[in]rhs方程右端表达式 f(x, y)(满足 f(tx,ty)=f(x,y))
[in]x自变量名
[in]y因变量名
返回
求解结果

使用默认计算上下文求解齐次 ODE,并显式报告无效输入和未覆盖域.

求解 Bernoulli 方程 y' + P(x)y = Q(x)y^n.

算法:令 v = y^(1-n),则 v' = (1-n)y^(-n)y'. 代入得线性方程 v' + (1-n)P(x)v = (1-n)Q(x), 用积分因子法求解后回代 y = v^(1/(1-n)).

参数
[in]PP(x) 系数
[in]QQ(x) 系数
[in]n幂次 (n != 0, 1)
[in]x自变量名
[in]y因变量名
返回
求解结果

使用默认计算上下文求解 Bernoulli 方程,并显式报告无效输入和未覆盖域.

求解恰当方程 M(x,y)dx + N(x,y)dy = 0.

算法:当 partialM/partialy = partialN/partialx 时,存在势函数 F(x,y) 使得 partialF/partialx = M, partialF/partialy = N.通过对 M 关于 x 积分并从 N 确定 y 相关部分来构造 F,解为 F(x,y) = C.

当方程不恰当时,尝试寻找积分因子 mu(x) 或 mu(y).

参数
[in]MM(x,y) 表达式
[in]NN(x,y) 表达式
[in]x自变量名
[in]y因变量名
返回
求解结果(隐式解 F(x,y) = C)

使用默认计算上下文求解恰当方程,并显式报告无效输入和未覆盖域.

寻找积分因子使非恰当方程变为恰当方程.

尝试以下形式的积分因子:

  1. mu = mu(x):当 (partialM/partialy - partialN/partialx)/N 仅依赖 x 时
  2. mu = mu(y):当 (partialN/partialx - partialM/partialy)/M 仅依赖 y 时
参数
[in]MM(x,y) 表达式
[in]NN(x,y) 表达式
[in]x自变量名
[in]y因变量名
返回
积分因子表达式,若找不到返回 nullptr

求解高阶常系数线性 ODE.

算法:构造特征多项式;二次实根使用避免相消的稳定公式;三至六次 多项式先用变量尺度平衡系数,再用多项式与其导数的近似 GCD 提取 高阶重根;最后根据根的类型构造通解:

  • 实根 r(重数 m):e^(rx), x*e^(rx), ..., x^(m-1)*e^(rx)
  • 复根 alpha+/-betai(重数 m):e^(alphax)(cos(betax), sin(betax)), x*e^(alphax)(cos(betax), sin(betax)), ...

非齐次支持域当前限于常数 forcing 且 y 的系数非零。 支持阶数最高为 6。统一乘以任意有限非零常数不改变输入方程。 特征根迭代必须收敛且通过后向误差检查;实根分类验证实轴投影相对于 候选根的误差,复根必须形成经尺度平衡后多项式验证的共轭对,不使用 会吞掉小非零虚部的固定绝对容差。归一化、尺度恢复、迭代或验证超出 有限 double 域时返回 CasErrc::NumericFailure。

参数
[in]coeffs各阶导数的数值系数(降阶排列:coeffs[0] 对应最高阶)
[in]forcing非齐次项 f(x),齐次时为 nullptr 或零
[in]x自变量名
[in]y因变量名
返回
求解结果

使用默认计算上下文求解高阶常系数 ODE,并显式报告无效输入和未覆盖域.

求解 Euler (Cauchy-Euler) 方程.

算法:对 Euler 方程 a_n*x^n*y^(n) + ... + a_0*y = f(x), 令 x = e^t(即 t = ln(x)),将方程转化为关于 t 的常系数 ODE, 求解后回代 t = ln(x).

支持二阶和三阶 Euler 方程.

参数
[in]euler_coeffsEuler 方程的常数系数列表(降阶排列)
[in]forcing非齐次项 f(x),齐次时为 nullptr 或零
[in]x自变量名
[in]y因变量名
返回
求解结果

使用默认计算上下文求解 Euler 方程,并显式报告无效输入和未覆盖域.

奇点类型枚举.

枚举值
Ordinary 

常点

RegularSingular 

正则奇点

IrregularSingular 

非正则奇点

在文件 symbolic_ode_engine.hpp 第 425 行定义.

425 {
426 Ordinary, ///< 常点
427 RegularSingular, ///< 正则奇点
428 IrregularSingular ///< 非正则奇点
429};

◆ ODEType

enum class LMCAS::ODEType
strong

ODE 类型枚举,标识方程所属的求解类别.

枚举值
Separable 

可分离变量型 dy/dx = f(x)g(y)

Linear1 

一阶线性 dy/dx + P(x)y = Q(x)

Linear2_ConstCoeff 

二阶常系数线性

Homogeneous 

齐次方程 y' = f(y/x)

Bernoulli 

Bernoulli 方程 y' + P(x)y = Q(x)y^n

Exact 

恰当方程 M(x,y)dx + N(x,y)dy = 0

HigherOrder_ConstCoeff 

高阶常系数线性

Euler 

Euler (Cauchy-Euler) 方程

System 

ODE 系统

LaplaceMethod 

Laplace 变换法

Frobenius 

Frobenius 级数解法

Unknown 

无法识别的类型

在文件 symbolic_ode_engine.hpp 第 24 行定义.

24 {
25 Separable, ///< 可分离变量型 dy/dx = f(x)g(y)
26 Linear1, ///< 一阶线性 dy/dx + P(x)y = Q(x)
27 Linear2_ConstCoeff, ///< 二阶常系数线性
28 Homogeneous, ///< 齐次方程 y' = f(y/x)
29 Bernoulli, ///< Bernoulli 方程 y' + P(x)y = Q(x)y^n
30 Exact, ///< 恰当方程 M(x,y)dx + N(x,y)dy = 0
31 HigherOrder_ConstCoeff, ///< 高阶常系数线性
32 Euler, ///< Euler (Cauchy-Euler) 方程
33 System, ///< ODE 系统
34 LaplaceMethod, ///< Laplace 变换法
35 Frobenius, ///< Frobenius 级数解法
36 Unknown ///< 无法识别的类型
37};
@ Euler
Euler (Cauchy-Euler) 方程
@ Bernoulli
Bernoulli 方程 y' + P(x)y = Q(x)y^n
@ Exact
恰当方程 M(x,y)dx + N(x,y)dy = 0
@ Separable
可分离变量型 dy/dx = f(x)g(y)
@ Linear1
一阶线性 dy/dx + P(x)y = Q(x)
@ LaplaceMethod
Laplace 变换法
@ Homogeneous
齐次方程 y' = f(y/x)
@ HigherOrder_ConstCoeff
高阶常系数线性
@ Frobenius
Frobenius 级数解法
@ Linear2_ConstCoeff
二阶常系数线性

◆ Parity

enum class LMCAS::Parity
strong

Integer parity classification.

枚举值
Even 

Even integer

Odd 

Odd integer

Unknown 

Parity not determined

在文件 assumption.hpp 第 36 行定义.

36 {
37 Even, ///< Even integer
38 Odd, ///< Odd integer
39 Unknown ///< Parity not determined
40};
@ Even
Even integer

◆ PropType

enum class LMCAS::PropType
strong

Identifies which property is being queried, used as part of the cache key.

枚举值
Positive 
Negative 
NonNegative 
NonPositive 
Real 
Integer 
NonZero 
Algebraic 
Transcendental 
Finite 
Divergent 
Periodic 
PositiveDefinite 
PositiveSemiDefinite 

在文件 query_interface.hpp 第 33 行定义.

◆ RelationOp

enum class LMCAS::RelationOp
strong

Stable relational operator used by public APIs.

枚举值
EQ 
NEQ 
LT 
GT 
LEQ 
GEQ 

在文件 symbolic.hpp 第 39 行定义.

◆ Sign

enum class LMCAS::Sign
strong

Sign classification for symbols and expressions.

枚举值
Positive 

0

Negative 

< 0

NonNegative 

>= 0

NonPositive 

<= 0

Zero 

== 0

NonZero 

!= 0

在文件 assumption.hpp 第 26 行定义.

26 {
27 Positive, ///< > 0
28 Negative, ///< < 0
29 NonNegative, ///< >= 0
30 NonPositive, ///< <= 0
31 Zero, ///< == 0
32 NonZero ///< != 0
33};

◆ SingularityType

enum class LMCAS::SingularityType
strong

从无限级数通项计算幂级数收敛半径.

当前对常数通项,b^n 和 n^p 给出精确结果;无法证明尾项行为时返回 ::CasErrc::Inconclusive,不会从有限样本外推极限.

参数
[in]general_coefficient系数通项 a_n
[in]index_var系数指标变量名
返回
已证明的收敛半径表达式

返回有限系数多项式的收敛半径.

coefficients 完整表示有限多项式,未列出的高阶系数均为零,因此非空 有效输入的收敛半径恒为 infinity.若要表示无限级数,应使用通项重载; 有限前缀不足以证明无限尾项的收敛半径.

判定无穷级数的收敛性.

依次尝试比值判别法,根值判别法和比较判别法.

参数
[in]general_term通项表达式 a_n
[in]index_var求和指标变量名
返回
收敛性判定信息

幂级数加法:逐项相加.

参数
[in]a第一个幂级数系数列表
[in]b第二个幂级数系数列表
返回
和级数的系数列表

幂级数乘法:柯西乘积(卷积).

参数
[in]a第一个幂级数系数列表
[in]b第二个幂级数系数列表
[in]order截断阶数
返回
乘积级数的系数列表(截断到 order 项)

幂级数复合:计算 f(g(x)) 的系数,要求 g(0) = 0.

参数
[in]f外层幂级数系数列表
[in]g内层幂级数系数列表(g[0] 必须为 0)
[in]order截断阶数
返回
复合级数的系数列表

Computes a bounded truncated Fourier expansion.

All coefficient integrations share context. Resource exhaustion, cancellation, invalid inputs, and nested integration failures are returned without being collapsed to a null expression.

奇点类型枚举.

枚举值
Removable 

可去奇点

Pole 

极点

Essential 

本性奇点

在文件 series_engine.hpp 第 162 行定义.

162 {
163 Removable, ///< 可去奇点
164 Pole, ///< 极点
165 Essential ///< 本性奇点
166};

◆ SolveStrategy

enum class LMCAS::SolveStrategy
strong

求解策略枚举,标识所使用的求解方法.

枚举值
ClosedForm 

闭式公式求解

Preprocessing 

预处理(化简,换元等)

Transcendental 

超越方程求解

Numerical 

数值迭代求解

RootOf 

以 RootOf 表达式表示

在文件 solve_strategies.hpp 第 39 行定义.

39 {
40 ClosedForm, ///< 闭式公式求解
41 Preprocessing, ///< 预处理(化简,换元等)
42 Transcendental, ///< 超越方程求解
43 Numerical, ///< 数值迭代求解
44 RootOf ///< 以 RootOf 表达式表示
45};
@ RootOf
以 RootOf 表达式表示
@ Numerical
数值迭代求解
@ ClosedForm
闭式公式求解
@ Preprocessing
预处理(化简,换元等)

◆ Tribool

enum class LMCAS::Tribool
strong

Tri-state logic value for property queries.

枚举值
True 

Property definitely holds

False 

Property definitely does not hold

Unknown 

Property cannot be determined

在文件 assumption.hpp 第 50 行定义.

50 {
51 True, ///< Property definitely holds
52 False, ///< Property definitely does not hold
53 Unknown ///< Property cannot be determined
54};
@ True
Property definitely holds
@ False
Property definitely does not hold

◆ UnitStripMode

enum class LMCAS::UnitStripMode
strong
枚举值
BaseValue 
DisplayValue 

在文件 quantity.hpp 第 14 行定义.

◆ ZPolynomialPattern

函数说明

◆ __attribute__() [1/4]

LMCAS::__attribute__ ( (visibility("default")) )
finalnoexcept

Scoped assumption context with push/pop management.

运行时统一值类型,支持数值,符号,容器等类型的动态表示

Owns unit declarations for one computation context.

A canonical product of base dimensions raised to exact rational powers.

生成缩放矩阵

生成反射矩阵

生成旋转矩阵

求解三角、指数、对数类超越方程。

投影完整、无条件的有限解集,并保留重数。 空集投影为空向量;无限解集或条件解集返回 Inconclusive。

Solves an equation using a default computation context.

在已验证支持域内求方程的完整解集。 精确有理多项式保留全部复根及重数,以精确根式或 RootOf 表示,保持系数精确。 实超越反演保留原操作数定义域、整数参数和未决条件;系数退化未知时, 返回完整的 ConditionalSolutions,并以条件限定通用根。 数值搜索可辅助求解;候选残差全部通过仍不足以证明完备性。 完备性未证或完整定义域无法表示时返回 CasErrc::Inconclusive。 成功表示在上下文假设及所有返回条件下,得到操作定义域内的完整解集。 UniversalSolutions 仅在该域内普遍成立,原式极点始终排除。 候选残差恒等式仅证明公共定义域上的正确性;可定义性、根的互异性及覆盖性须另证。 未决逐点条件须保留为条件或 Inconclusive,形式非恒等式不足以消除这些条件。 资源耗尽与取消仍作为外层错误返回。

Stores relational constraints and derives sign properties for simple patterns.

精确有理数类,以 BigInt 分子/分母表示,构造时自动约分

Stores and validates mathematical properties for named symbols.

含参方程组求解器,支持线性与多项式方程组的参数化求解

Numerically solves using an isolated default computation context.

在受支持的一元表达式域内执行数值求根.

稀疏多元多项式。

基于规则的表达式重写引擎

重写规则,定义模式到替换表达式的变换

符号表达式模式匹配器

保留精确系数和无平方因子的被开方数。

区间并集,表示不等式的解集

单个区间 [a, b] 或 (a, b) 等

区间端点,支持有限值与正负无穷

不等式求解器,提供多项式,有理式及参数化不等式的求解

参数化不等式的分段解集

FGLM 算法中使用的多项式表示,以 (单项式, 系数) 对列表存储

借用单个符号的名称。

Maintains a stack of scopes, each containing a PropertyStore and RelationStore. Queries use read-through semantics: searching from the top scope down to root, 查询按子作用域到父作用域的顺序定位首个符号声明. 子作用域声明覆盖查询结果,同时保留父作用域状态;弹出作用域后恢复先前结果.

返回
空表达式、非符号表达式或数学常量返回 nullopt。
注解
借用名称仅在原表达式存活且未被重新赋值时有效。

查看关系运算符;空表达式或非关系表达式返回 nullopt。 Versioned, lossless semantic expression encoding (independent of to_string).

商保留精确分子与分母,仅 to_double() 执行舍入;相等性比较使用精确交叉乘积。 排序及 is_positive()/is_negative() 使用近似判断,不能作为精确证明。 sign_checked()/abs_checked() 使用认证包围区间;含 pi/e 的组合在 4096 位时仍跨零, 返回 Inconclusive。纯根式持续细化,直至完成认证或耗尽预算。 无上下文的基本运算与 BigInt 一样不限预算;受检便捷入口及 abs() 使用默认 ComputationContext。

以 (Monomial, Rational) 对的有序列表表示多元多项式。 单项式按指定的 MonomialOrder 排序。 支持加减乘、求值、度数查询和一元转换。 非零操作数必须具有按名称和排列完全相同的变量表,否则加减乘和整除 抛出 std::invalid_argument;不自动合并变量或重排变量坐标。 加减乘结果使用左侧单项式序;一侧为零时使用非零侧的变量表和序, 双方为零时保留左侧表示。不同单项式序不改变同一变量环中的数学值。

多项式输入先由 Sturm 序列隔离实根,再执行受检精化;隔离区间通过 溢出安全的中点生成 Newton 初值,包括最大有限浮点端点。 其他输入使用 Newton 初值,缺省初值为零;求值、取消与资源诊断 均通过 Result 通道返回调用方。

参见
Jacques Charles François Sturm, "Mémoire sur la résolution des équations numériques," 1829.

Supports domain hierarchy implication, sign implication, contradiction detection, and cross-constraint checking between domains and signs.

When a relation of the form variable op 0 is added, the RelationStore notifies the PropertyStore to mark the variable with the corresponding sign:

  • GT -> Positive
  • GEQ -> NonNegative
  • LT -> Negative
  • LEQ -> NonPositive
  • NEQ -> NonZero

复合关系(多变量左端或任意右端)按原结构存储,供 InferenceEngine 后续推导.

参数
expr待求解的表达式(视为等于零)。
var求解变量名。
返回
完整实数解集。三角函数解族使用精确符号 pi 和新引入的整数参数; 未求出的原像保留原始谓词,超出处理范围的变换返回 Inconclusive 而非部分根。
参数
theta有限的旋转角度(弧度)
dim矩阵维度,默认为 2
返回
二维旋转矩阵;上下文错误优先,其次维度错误,非有限角度返回 InvalidArgument。
参数
angle反射轴角度(弧度)
dim矩阵维度,默认为 2
返回
反射矩阵的符号表达式
参数
sx有限的 x 方向缩放因子
sy有限的 y 方向缩放因子
dim矩阵维度,默认为 2
返回
二维缩放矩阵;上下文错误优先,其次维度错误,非有限因子返回 InvalidArgument。

Push a new scope onto the stack.

Pop the current scope.

Return the current nesting depth (number of scopes on the stack).

访问当前作用域可修改的 PropertyStore,用于声明。 push 可能使引用失效,pop 销毁弹出的存储;仍有效的引用可观察后续提交。

Access the current scope's PropertyStore (const).

Access the current scope's RelationStore (mutable).

Access the current scope's RelationStore (const).

Check if a symbol has a specific sign (read-through all scopes).

Check if a symbol has at least the given domain specificity (read-through).

Get the most specific domain for a symbol (read-through).

Get all signs for a symbol (read-through).

Get parity for a symbol (read-through).

Get boundedness for a symbol (read-through).

Get interval bounds for a symbol (read-through).

仅查询周期声明元数据;不透明周期符号仍按非常量处理。

继承父作用域关系时排除被较近声明遮蔽的关系;仅使用已有关系,不构造跨作用域传递闭包。

Declare domain for a variable in the current scope. Returns an explicit error if the variable name is empty or contradictory.

Declares a domain and reports invalid or contradictory input.

Declare sign for a variable in the current scope. Returns an explicit error if the variable name is empty or contradictory.

Declares a sign and reports invalid or contradictory input.

Store a relational constraint. The expression's root must be a RelationalNode. Invalid or contradictory relations are returned as an explicit error.

Stores a relation and reports invalid or contradictory input.

Store a conditional assumption: if condition holds, conclude conclusion.

The conditional is stored in the current scope and discarded on scope pop. When a query depends on the conclusion, the system checks if the condition is satisfied by the current assumption state. If satisfied, the conclusion is used; if not verifiable, the conditional is inactive.

参数
conditionA relational expression (e.g., x > 1) serving as the guard
conclusionA relational expression (e.g., ln(x) > 0) to use when condition holds Invalid or contradictory relations are returned as an explicit error.

Stores a guarded conclusion and reports invalid input.

A conditional assumption: "if condition then conclusion".

Retrieve all active conditional assumptions across all scopes (top to bottom).

Used by the QueryInterface/InferenceEngine to check if any conditional conclusions are applicable given the current assumption state.

返回
Vector of all conditional assumptions from all scopes (most recent first)

Evaluate whether a condition expression is satisfied by the current state.

Checks if the condition (a RelationalNode) can be verified against the current RelationStore and PropertyStore. Returns True if the condition is provably satisfied, False if provably unsatisfied, Unknown otherwise.

参数
conditionThe condition expression to evaluate
返回
Tribool indicating whether the condition is satisfied

Query whether the expression is positive (> 0).

Queries positivity and propagates computation failures.

Query whether the expression is negative (< 0).

Queries negativity and propagates computation failures.

Query whether the expression is non-negative (>= 0).

Queries non-negativity and propagates computation failures.

Query whether the expression is real.

Queries real-domain membership and propagates computation failures.

Query whether the expression is an integer.

Queries integer-domain membership and propagates computation failures.

Query whether the expression is non-zero (!= 0).

Queries nonzero status and propagates computation failures.

Serialize the entire AssumptionContext to a human-readable string.

Format is line-oriented with SCOPE delimiters. Each scope's properties, relations, and conditionals are serialized one per line. The output ends with "END".

返回
Serialized string representation of all scopes.

Deserialize a string into a fully reconstructed AssumptionContext.

Parses the line-oriented format produced by serialize().

参数
dataSerialized string (as produced by serialize()).
返回
Reconstructed context or a parse/contradiction error.

面向不可信输入的受检反序列化接口,通过 CasError 传递格式与约束诊断.

Checked deserialization using the caller's resource and cancellation policy.

Query whether a symbol is continuous on a given interval (read-through all scopes).

参数
symbolSymbol name to query.
intervalInterval on which to check continuity.
返回
True if continuous, False if not, Unknown if undetermined.

Queries interval continuity and propagates computation failures.

Query whether a symbol is differentiable on a given interval (read-through all scopes).

参数
symbolSymbol name to query.
intervalInterval on which to check differentiability.
返回
True if differentiable, False if not, Unknown if undetermined.

Queries interval differentiability and propagates computation failures.

Query whether a symbol (matrix) is positive definite (read-through all scopes).

参数
symbolSymbol name to query.
返回
True if positive definite, False if known not, Unknown if undetermined.

Queries positive definiteness and propagates computation failures.

Query whether a symbol (matrix) is positive semidefinite (read-through all scopes).

参数
symbolSymbol name to query.
返回
True if positive semidefinite, False if known not, Unknown if undetermined.

Queries positive semidefiniteness and propagates computation failures.

Set the maximum recursion depth for inference queries.

This depth limit is wired to the InferenceEngine used by QueryInterface.

参数
depthMaximum depth (must be > 0). Default is 32.

Get the current maximum recursion depth for inference queries.

返回
The configured maximum depth.

Maximum recursion depth for inference queries (default 32).

QueryInterface 观察到的缓存代数;存储提交采用惰性检测。

观察事务修订并返回当前缓存代数。

符号枚举

默认构造,值为 0

拷贝构造

移动构造

拷贝赋值

移动赋值

精确导入有符号机器整数,包括其最小值。

精确导入无符号机器整数,保留各数位的完整宽度。

从十进制字符串构造

参数
str十进制数字字符串,可带正负号
异常
std::invalid_argument若字符串为空、仅含符号或包含非十进制字符

转换为十进制字符串

返回
十进制表示的字符串

转换为 int(溢出时饱和到 int 范围)

返回
对应的 int 值

精确转换为 int64_t;超出范围时返回空。

精确转换非负值,负值或超出范围时失败。

返回绝对值的二进制位数,零的位数为 0。

转换为浮点数

返回
对应的 double 值

比较两个 BigInt 的绝对值

参数
a第一个操作数
b第二个操作数
返回
1 表示 |a|>|b|,-1 表示 |a|<|b|,0 表示相等

判断是否为零

获取 limb 数组的副本

返回
各 limb 值组成的 vector

计算哈希值

返回
哈希值

取绝对值

返回
|*this|

判断是否为负数

取相反数

返回
-*this

一元负号运算符

绝对值加法(内部使用)

参数
dst结果
a加数
b加数

绝对值减法(内部使用,要求 |a| >= |b|)

参数
dst结果
a被减数
b减数

加法运算符

减法运算符

乘法运算符

除法运算符(整数除法,截断)

参数
other除数
返回
商
异常
std::domain_error除数为零时抛出

取模运算符

参数
other模数
返回
余数
异常
std::domain_error模数为零时抛出

整数幂运算

参数
exp非负指数
返回
this^exp

整数幂运算(BigInt 指数)

参数
exp非负 BigInt 指数
返回
this^exp
异常
std::domain_error指数为负时抛出

整数平方根(向下取整)

返回
floor(sqrt(*this))
异常
std::domain_error负数时抛出

判断是否为奇数

判断是否为偶数

计算末尾零比特数

返回
二进制表示中末尾连续 0 的个数

右移赋值

参数
shift移位比特数
返回
*this

左移赋值

参数
shift移位比特数
返回
*this

右移运算符

左移运算符

计算阶乘

参数
n非负整数
返回
n!

计算排列数 P(n, r)

参数
n总数
r选取数
返回
n! / (n-r)!

计算组合数 C(n, r)

参数
n总数
r选取数
返回
n! / (r! * (n-r)!)

计算多项式系数(多重组合数)

参数
n总数(应等于 r 各元素之和)
r各组大小
返回
n! / (r[0]! * r[1]! * ... * r[k]!)
异常
std::invalid_argumentr 之和不等于 n 时抛出

计算最大公约数

参数
a第一个大整数
b第二个大整数
返回
gcd(|a|, |b|)

计算最小公倍数

参数
a第一个大整数
b第二个大整数
返回
lcm(|a|, |b|)

Compute the canonical residue base^exp mod mod.

参数
baseSigned integer base.
expNonnegative integer exponent.
modStrictly positive modulus.
返回
A value in the half-open interval [0,mod).
异常
std::domain_errorIf exp is negative or mod is not positive.

判断整数的素性并保留无法证明的结论。 单个机器字使用确定性判定;较大整数发现合数证据时返回 false, 尚无法证明素性时返回 CasErrc::Inconclusive。

判断是否为完全平方数

返回
是完全平方数返回 true

构造具有非空表达式的规范空有限集。

快照输入包装对象,后续赋值保持集合成员不变。

返回由规范有限集表达式派生的只读包装视图。

< 项列表

< 变量个数

默认构造

构造指定变量数的零多项式

参数
n变量个数

判断是否为零多项式

获取首项单项式

获取首项系数

添加一项

参数
m单项式
c系数(零系数不添加)

按指定单项式序排序各项

参数
order单项式序

合并同类项并去除零项

对给定基进行多项式约化

参数
basisGröbner 基
order单项式序
返回
约化后的余式

从单项式构造多项式(系数为 1)

参数
m单项式
num_vars变量个数
返回
仅含一项的多项式

构造零多项式

参数
num_vars变量个数
返回
零多项式

单个分段:条件 + 对应解集

< 参数满足的条件

< 该条件下的解集

< 所有分段

判断结果是否为空

返回
无分段时返回 true

判断是否只有一个分段

返回
恰好一个分段时返回 true

获取唯一分段的解集

is_single() 为真时返回该分段;多分段解依赖参数取值, 因而映射为空集以完整保留分段语义.

返回
单一分段的解集;多分段结果映射为空集

在计算上下文预算内求解精确有理系数的单变量多项式不等式。

注解
近似系数或符号参数返回 CasErrc::Inconclusive。

Solve a conjunction of inequalities through the checked solver.

Every component must lie in the checked scalar support domain and every required endpoint comparison must be exact. An empty conjunction denotes the entire real line.

求解单个不等式

参数
expr不等式左端表达式(右端为 0)
type不等式类型
variable求解变量名
返回
解集

Exact quadratic coefficients are converted to numerical roots with a cancellation-resistant quadratic formula. Integer snapping requires an exactly integral approximation, and exact roots are deduplicated symbolically rather than by a fixed floating-point distance before the sign chart is constructed. Prefer solve_inequality_checked() when a proved exact result is required.

求解不等式组(取交集)

参数
inequalities不等式列表,每项为 (表达式, 不等式类型)
variable求解变量名
返回
解集

求解有理不等式 numerator/denominator >/< 0

参数
numerator分子表达式
denominator分母表达式
type不等式类型
variable求解变量名
返回
解集

在计算上下文预算内求解可证明的参数多项式不等式。

注解
无法证明完整参数分支时返回 CasErrc::Inconclusive。

< 端点值(无穷时为空)

< 是否为开端点

< 是否为负无穷

< 是否为正无穷

构造负无穷端点

返回
负无穷端点

构造正无穷端点

返回
正无穷端点

构造闭端点

参数
val端点值
返回
闭端点

构造开端点

参数
val端点值
返回
开端点

< 下端点

< 上端点

判断数值是否在区间内

参数
value待判断的数值
返回
包含返回 true

判断区间是否为空

返回
空区间返回 true

判断区间是否为整条实数轴

返回
是整条实数轴返回 true

构造空区间

返回
空区间

构造整条实数轴 (-∞, +∞)

返回
全实数轴区间

构造单点区间 [val, val]

参数
val点值
返回
单点区间

从区间列表构造并集

参数
intervals区间列表

从单个区间构造并集

参数
iv区间
返回
包含单个区间的并集

Validate and construct an interval union with an explicit context.

Validate and construct an interval union with a default context.

构造空集

返回
空的区间并集

构造全实数轴

返回
表示 (-∞, +∞) 的并集

与另一个并集求交

参数
other另一个区间并集
返回
交集结果

Checked intersection with explicit endpoint-validation errors.

参数
other另一个区间并集
context计算上下文和资源预算
返回
成功时返回交集;端点不可比较或资源耗尽时返回错误

与另一个并集求并

参数
other另一个区间并集
返回
并集结果

Checked union with exact endpoint ordering.

参数
other另一个区间并集
context计算上下文和资源预算
返回
成功时返回并集;端点不可比较或资源耗尽时返回错误

求补集

返回
补集结果

Checked complement with exact endpoint ordering.

参数
context计算上下文和资源预算
返回
成功时返回补集;端点不可比较或资源耗尽时返回错误

判断数值是否在并集内

参数
value待判断的数值
返回
包含返回 true

判断并集是否为空

返回
空集返回 true

判断并集是否为全实数轴

返回
是全实数轴返回 true

获取内部区间列表

返回
区间列表的常引用

转换为字符串表示

返回
区间并集的字符串形式

从规范字符串解析数值端点区间并集

参数
str区间表示;端点支持任意精度十进制整数、精确分数和有限浮点数
返回
解析及区间规范化成功时返回并集;无效输入返回 nullopt

转换为符号表达式

参数
var变量名
返回
表示该区间并集的符号表达式;空集为有限空集,全实数域为恒真关系

负被开方数返回 DomainError;预算耗尽时返回错误,保持精确性。

认证符号,成功值为 Negative、Zero 或 Positive。

计算经过认证的绝对值。

异常
std::domain_error对应 DomainError。
std::length_error对应 ResourceLimit。
std::logic_error对应 InternalInvariant。
std::runtime_error对应其余受检失败(包括 Inconclusive、Cancelled),附带原因。

用任意精度整数保存数学指数与被开方数。

将模式与目标表达式进行匹配

参数
pattern模式表达式
target目标表达式
wildcards模式中的通配符名称集合
results匹配成功时输出绑定结果
返回
匹配成功返回 true

将绑定结果代入模板表达式

参数
template_expr模板表达式
bindings通配符绑定映射
use_rest是否使用剩余项替换
返回
替换后的表达式

< 匹配模式

< 替换模板

< 通配符集合

< 附加匹配条件(可选)

使用匹配绑定与假设上下文检查附加条件。

两个条件均存在时须同时成立;缺少上下文时跳过规则并保留回调未调用的状态。

添加重写规则

参数
rule规则对象

反复应用规则直到不动点或达到最大迭代次数

参数
expr输入表达式
max_iterations最大迭代次数
返回
重写后的表达式

对表达式应用一步重写

参数
expr输入表达式
返回
重写后的表达式,若无规则匹配则返回原表达式

获取当前所有规则

返回
规则列表的常引用

项类型:(单项式, 系数)

构造零多项式

从项列表和变量名列表构造多元多项式

参数
[in]terms项列表,每项为 (单项式, 系数) 对
[in]vars变量名列表,确定各分量对应的变量
[in]order单项式序类型,默认分次逆字典序

从常数构造多元多项式

参数
[in]constant常数值
[in]vars变量名列表

— 算术运算 —

多项式加法

多项式减法

多项式乘法

一元取负

同一变量表内按系数和单项式判等,不受单项式序影响

返回
两个零多项式始终相等;非零对象的变量表不同时返回 false

判不等

标量乘法

参数
[in]scalar有理数标量
返回
各项系数乘以 scalar 后的多项式

精确除法(假设整除)

参数
[in]divisor除数多项式
返回
商多项式 同一变量表允许不同单项式序;结果使用被除数的序。 零被除数的商使用除数的变量表和序。
异常
std::runtime_error除数为零或不整除时抛出
std::invalid_argument两个非零操作数的变量表或排列不同时抛出

— 求值 —

将指定变量代入有理数值,返回降维后的多项式

参数
[in]var待代入的变量名
[in]val代入值
返回
代入后的多项式(变量数减一或不变)

将多个变量同时代入有理数值

参数
[in]substitution变量名到值的映射
返回
代入后的多项式

— 度数查询 —

计算多项式的全次数

返回
所有项中单项式全次数的最大值;零多项式返回 -1

计算关于指定变量的次数

参数
[in]var变量名
返回
该变量在所有项中指数的最大值;零多项式返回 -1

获取关于指定变量的首项系数

将多项式视为 var 的一元多项式,返回最高次项的系数(为辅助变量的多项式)。

参数
[in]var主变量名
返回
首项系数多项式

— 转换 —

转换为一元 Polynomial<Rational>

仅当多项式实际只含一个变量时有效。

返回
对应的一元多项式
异常
std::invalid_argument含多个有效变量时抛出

从一元多项式构造多元多项式

参数
[in]poly一元多项式
[in]var对应的变量名
返回
等价的 MultiPoly 表示

— 属性查询 —

判断是否为零多项式

判断是否为常数多项式

判断是否实质为一元多项式(仅一个变量出现非零指数)

判断是否为齐次多项式(所有项全次数相同)

获取非零项数

获取变量个数

获取变量名列表

返回
变量名列表的常引用

获取项列表

返回
有序项列表的常引用

— 工具方法 —

提取数值内容(所有系数的 GCD)

返回
所有系数绝对值的最大公约数(有理数形式)

使多项式本原化(除以数值内容)

返回
本原多项式(数值内容为 1)

转换为可读字符串表示

返回
多项式的字符串形式

< 有序项列表(按 order_ 降序)

< 变量名列表

< 单项式序类型

规范化:合并同类项、去零项、按单项式序排序

求解含参方程组,返回所有解

参数
equations方程列表(每个表达式 = 0)
unknowns未知数名称列表
parameters参数名称列表
返回
解的列表,每个解为变量名到表达式的映射

求解含参方程组,返回按参数条件分段的解

参数
equations方程列表(每个表达式 = 0)
unknowns未知数名称列表
parameters参数名称列表
返回
分段解集

求解关于未知数为线性的含参方程组

求解关于未知数为多项式的含参方程组

判断方程组是否关于未知数为线性

参数
equations方程列表
unknowns未知数名称列表
返回
线性返回 true

成功提交(含赋值)均更新此存储的修订号。

Declare domain for a symbol and report contradictions.

Declares a domain and reports contradictions.

Declare sign for a symbol and report contradictions.

Declares a sign and reports contradictions.

Declare parity for a symbol and report contradictions.

Declares parity and reports contradictions.

Declare boundedness for a symbol, optionally with interval bounds.

Declares boundedness and reports contradictions.

Query the most specific domain for a symbol (default: Complex).

Query all signs stored for a symbol.

Query parity for a symbol (default: Unknown).

Query boundedness for a symbol (default: Unknown).

Get stored interval bounds (if any).

Check if symbol has a specific sign (explicit or implied).

Check if symbol has at least the given domain specificity.

Declare a symbol as continuous on a specified interval.

参数
symbolSymbol name.
intervalInterval on which continuity holds. Contradictory overlapping declarations are returned as CasError.

Declare a symbol as differentiable on a specified interval.

Differentiability implies continuity, so this also ensures the symbol is recorded as continuous on the same interval.

参数
symbolSymbol name.
intervalInterval on which differentiability holds. Contradictory overlapping declarations are returned as CasError.

Query whether a symbol is continuous on a given interval.

参数
symbolSymbol name.
intervalInterval to check.
返回
true if the symbol has been declared continuous (or differentiable) on an interval that covers the queried interval.

Query whether a symbol is differentiable on a given interval.

参数
symbolSymbol name.
intervalInterval to check.
返回
true if the symbol has been declared differentiable on an interval that covers the queried interval.

Declare a symbol as transcendental.

Sets the symbol's domain to Real and marks it transcendental. Returns an error if the symbol already has an algebraic sub-domain.

参数
symbolSymbol name

Declares transcendence and reports domain contradictions.

Query whether a symbol has been declared transcendental.

参数
symbolSymbol name
返回
true if the symbol is marked transcendental

Declare finiteness for a symbol.

Finite implies Bounded. Contradictions are returned as CasError.

参数
symbolSymbol name
fFiniteness value (Finite, Divergent, or Unknown)

Declares finiteness and reports contradictions.

Query the finiteness classification of a symbol.

参数
symbolSymbol name
返回
Finiteness value (default: Unknown)

Declare matrix definiteness for a symbol.

PositiveDefinite implies PositiveSemiDefinite. NegativeDefinite implies NegativeSemiDefinite. Contradictions are returned as CasError.

参数
symbolSymbol name
dDefiniteness value

Declares matrix definiteness and reports contradictions.

Query the definiteness classification of a symbol.

参数
symbolSymbol name
返回
Definiteness value (default: Unknown)

声明符号关于指定变量的候选周期。

参数
symbol符号名
variable非空自变量名
period非空候选周期;已知非正值会被拒绝。

Declares periodicity and reports invalid periods.

获取符号关于指定变量声明的候选周期。

使用者须证明符号周期为正实数,且相对于该自变量为常量。

查询周期声明是否存在;符号周期的有效性需另行证明。

借用按变量索引的全部声明,用于确定性序列化。

Get all symbol names that have any declared properties.

返回
Vector of symbol names with at least one non-default property.

Continuity declaration (public type for serialization access).

Monotonicity declaration (public type for serialization access).

Get all continuity/differentiability declarations for a symbol.

参数
symbolSymbol name.
返回
Vector of continuity declarations.

Get all monotonicity declarations for a symbol.

参数
symbolSymbol name.
返回
Vector of monotonicity declarations.

Declare monotonicity of a symbol with respect to a variable on an interval.

Stores a MonotonicityDecl recording that the symbol is monotonically increasing/decreasing (or non-decreasing/non-increasing) with respect to the given variable over the specified interval.

参数
symbolThe symbol (expression name) being declared monotone.
variableThe variable with respect to which monotonicity holds.
intervalThe interval on which the monotonicity property holds.
monoThe type of monotonicity (Increasing, Decreasing, etc.).

Query the monotonicity of a symbol with respect to a variable on an interval.

Searches stored MonotonicityDecl entries for the symbol. Returns the monotonicity type if the queried interval is covered by a stored declaration (i.e., the stored interval contains the queried interval), otherwise returns Monotonicity::Unknown.

参数
symbolThe symbol to query.
variableThe variable with respect to which monotonicity is queried.
intervalThe interval to check coverage for.
返回
The monotonicity type if covered, or Monotonicity::Unknown.

Whether the symbol is classified as transcendental.

Finiteness classification (Finite, Divergent, or Unknown).

Matrix definiteness classification.

按自变量索引的候选周期。

Continuity declaration over an interval.

< Interval on which continuity/differentiability holds

< True if differentiable (implies continuous)

Declared continuity/differentiability intervals.

Monotonicity declaration with respect to a variable over an interval.

< Variable with respect to which monotonicity holds

< Interval on which monotonicity holds

< Type of monotonicity

Declared monotonicity intervals.

Check domain-sign cross-constraints. Throws on contradiction.

Check sign contradiction pairs. Throws on contradiction.

Get all signs implied by a given sign.

Get the specificity level of a domain (higher = more specific).

默认构造,值为 0

从 BigInt 构造整数有理数

参数
num分子(分母为 1)

从分子分母构造有理数

参数
num分子
den分母(不可为零)

从 int 构造整数有理数

参数
num整数值

从 int 分子分母构造有理数

参数
num分子
den分母

从字符串构造有理数,支持小数、科学计数法、循环小数

参数
num数字字符串

从 double 构造精确有理数。

参数
value有限的 binary64 浮点数值
返回
binary64 存储值对应的精确有理数,而非十进制显示文本的值
异常
std::invalid_argument若 value 为 NaN 或无穷大

获取分子

获取分母

判断是否为整数(分母为 1)

判断是否为零

计算哈希值

返回
哈希值

转换为分数字符串(如 "3/4")

返回
字符串表示

转换为十进制小数字符串(自动检测循环节)

返回
小数字符串,循环部分用括号标记

转换为指定精度的十进制小数字符串

参数
n小数位数(正数为小数点后位数,负数为整数部分截断位数)
返回
定精度小数字符串

就地向零截断到指定十进制精度,区别于数学下取整。

参数
n正数为小数位,零为整数位,负数为十进制整数位
异常
std::length_error|n| 超过 1,000,000 时抛出,原值不变

牛顿迭代法计算平方根(就地修改)

参数
n精度位数

计算平方根(返回新值)

参数
n精度位数
返回
平方根的有理近似

牛顿迭代法计算 n 次方根(就地修改)

参数
radical根次数
n精度位数

计算 n 次方根(返回新值)

参数
radical根次数
n精度位数
返回
n 次方根的有理近似

转换为 BigInt(仅当为整数时有效)

返回
对应的 BigInt
异常
std::runtime_error非整数时抛出

转换为浮点数。

精确值可按 binary64 round-to-nearest 转为有限值时返回有限结果, 包括正负最大有限端点及其半 ULP 内邻域; 超出有限舍入范围或非零值下溢为零时抛出范围异常。

返回
对应的 double 值

有理数加法

有理数减法

有理数乘法

有理数除法

参数
other除数
返回
商
异常
std::runtime_error除数为零时抛出

有理数整数幂

参数
exponent指数(可为负)
返回
this^exponent
异常
std::runtime_error零的负幂或 0^0 时抛出

有理数的有理数幂(就地修改)

参数
exponent有理数指数
n精度位数

有理数的有理数幂(返回新值)

参数
exponent有理数指数
n精度位数
返回
结果的有理近似

取倒数

返回
1 / *this
异常
std::runtime_error零的倒数时抛出

取绝对值

返回
|*this|

一元负号运算符

成功提交(含赋值)均更新此存储的修订号。

Store a relation and optionally derive sign properties.

If the relation compares one variable with exact zero, the corresponding sign property is declared on the PropertyStore.

参数
lhsLeft-hand side expression
rhsRight-hand side expression
opRelational operator
prop_storePropertyStore to notify for simple variable > 0 patterns

Checked relation insertion with explicit failure reporting.

Applies the relation plus derived property declarations transactionally. On failure, neither this store nor the PropertyStore is modified.

Retrieve all stored relations.

返回
Const reference to the vector of stored relations

Check if a specific relation is stored.

Compares LHS, RHS, and operator using structural equality of the AST nodes.

参数
lhsLeft-hand side expression
rhsRight-hand side expression
opRelational operator
返回
true if the relation is found in the store

Clear all stored relations (used during scope pop).

Maximum number of new relations deduced per add_relation call via transitive closure.

新增关系后计算传递闭包。

从新关系开始 BFS,仅对 GT、GEQ 进行传递组合: GT+GT→GT、GT+GEQ→GT、GEQ+GT→GT、GEQ+GEQ→GEQ。 最多新增 MAX_TRANSITIVE_DEDUCTIONS 个结论,之后仍登记已有结论的替代证明。

参数
new_relation触发本轮闭包计算的关系索引
prop_store用于推导关系符号的属性存储
返回
本轮是否新增结论或替代证明。

求解线性方程组。

参数
equations方程列表(每个方程视为等于零的表达式)
variables待求解的变量名列表
返回
变量名到解表达式的映射

计算多项式集合的 Gröbner 基。

参数
polynomials输入多项式列表
variables变量名列表(决定单项式序)
返回
Gröbner 基多项式列表

求解多项式方程组,显式报告失败。

计算约化 Gröbner 基。

参数
polynomials输入多项式列表
variables变量名列表
返回
约化 Gröbner 基多项式列表

判断多项式是否属于给定 Gröbner 基生成的理想。

参数
polynomial待检测的多项式
basisGröbner 基
variables变量名列表
返回
若多项式属于该理想则返回 true

计算消元理想,消去前 elim_count 个变量。

参数
basisGröbner 基
variables变量名列表(前 elim_count 个将被消去)
elim_count要消去的变量数量
返回
消元理想的生成元列表

值的类型枚举

< 当前值的类型

内部存储的 variant 类型

< 实际存储的数据

返回只读类型标记。

返回只读底层存储,调用方不能破坏类型不变量。

默认构造,初始化为 Null

字符串使用独立的 Type::String 标记,与 Null 保持类型区分.

Checked conversion to a floating-point value.

Checked conversion to a rational value.

Checked conversion to an irrational-value wrapper.

Checked conversion to a symbolic expression.

判断值是否可转换为符号表达式

返回
若可转换则返回 true

将值转换为可读字符串

返回
格式化的字符串表示

Checked element-wise vector addition.

Checked vector dot product.

Checked matrix multiplication.

< 字符串构造时的缓存(兼容旧测试)

在文件 assumption_context.hpp 第 1 行定义.

44 {
45public:
46 AssumptionContext();
47 AssumptionContext(const AssumptionContext&) = default;
48 AssumptionContext(AssumptionContext&& other);
49 AssumptionContext& operator=(const AssumptionContext& other);
50 AssumptionContext& operator=(AssumptionContext&& other) noexcept;
51
52
53 // --- Scope management ---
54
55 /// Push a new scope onto the stack.
56 void push();
57
58 /// Pop the current scope.
60
61 /// Return the current nesting depth (number of scopes on the stack).
62 int depth() const;
63
64 // --- Direct access to current (top) scope stores ---
65
66 /**
67 * @brief 访问当前作用域可修改的 PropertyStore,用于声明。
68 * push 可能使引用失效,pop 销毁弹出的存储;仍有效的引用可观察后续提交。
69 */
70 PropertyStore& current_properties();
71
72 /// Access the current scope's PropertyStore (const).
73 const PropertyStore& current_properties() const;
74
75 /// Access the current scope's RelationStore (mutable).
76 RelationStore& current_relations();
77
78 /// Access the current scope's RelationStore (const).
79 const RelationStore& current_relations() const;
80
81 // --- Read-through query methods ---
82 // These search from the top scope down to root, returning the first
83 // scope's value that has a declaration for the symbol. This provides
84 // shadowing semantics: child declarations override parent declarations.
85
86 /// Check if a symbol has a specific sign (read-through all scopes).
87 bool has_sign(const std::string& symbol, Sign sign) const;
88
89 /// Check if a symbol has at least the given domain specificity (read-through).
90 bool has_domain(const std::string& symbol, Domain domain) const;
91
92 /// Get the most specific domain for a symbol (read-through).
93 Domain get_domain(const std::string& symbol) const;
94
95 /// Get all signs for a symbol (read-through).
96 std::unordered_set<Sign, SignHash> get_signs(const std::string& symbol) const;
97
98 /// Get parity for a symbol (read-through).
99 Parity get_parity(const std::string& symbol) const;
100
101 /// Get boundedness for a symbol (read-through).
102 Boundedness get_boundedness(const std::string& symbol) const;
103
104 /// Get interval bounds for a symbol (read-through).
105 std::optional<Interval> get_bounds(const std::string& symbol) const;
106
107 bool is_transcendental(const std::string& symbol) const;
108 Finiteness get_finiteness(const std::string& symbol) const;
109 Definiteness get_definiteness(const std::string& symbol) const;
110 std::optional<SymbolicExpr> get_period(
111 const std::string& symbol, const std::string& variable) const;
112 bool is_periodic(const std::string& symbol, const std::string& variable) const;
113 /** @brief 仅查询周期声明元数据;不透明周期符号仍按非常量处理。 */
114 bool has_period_declarations(const std::string& symbol) const;
115 Result<Monotonicity> get_monotonicity_checked(
116 const std::string& symbol, const std::string& variable,
117 const Interval& interval) const;
118
119 /** @brief 继承父作用域关系时排除被较近声明遮蔽的关系;仅使用已有关系,不构造跨作用域传递闭包。 */
120 bool has_relation(const SymbolicExpr& lhs, const SymbolicExpr& rhs, RelationOp op) const;
121 std::vector<Relation> get_visible_relations() const;
122 Result<bool> has_relation_checked(
123 const SymbolicExpr& lhs, const SymbolicExpr& rhs, RelationOp op,
125 Result<std::vector<Relation>> get_visible_relations_checked(
127
128 /// Declare domain for a variable in the current scope.
129 /// Returns an explicit error if the variable name is empty or contradictory.
130 AssumptionVoidResult assume_domain(const std::string& variable, Domain domain);
131
132 /** @brief Declares a domain and reports invalid or contradictory input. */
133 AssumptionVoidResult assume_domain_checked(const std::string& variable, Domain domain);
134
135 /// Declare sign for a variable in the current scope.
136 /// Returns an explicit error if the variable name is empty or contradictory.
137 AssumptionVoidResult assume_sign(const std::string& variable, Sign sign);
138
139 /** @brief Declares a sign and reports invalid or contradictory input. */
140 AssumptionVoidResult assume_sign_checked(const std::string& variable, Sign sign);
141
142 /// Store a relational constraint. The expression's root must be a RelationalNode.
143 /// Invalid or contradictory relations are returned as an explicit error.
144 AssumptionVoidResult assume(const SymbolicExpr& relation);
145
146 /** @brief Stores a relation and reports invalid or contradictory input. */
147 AssumptionVoidResult assume_checked(const SymbolicExpr& relation);
148
149 /**
150 * @brief Store a conditional assumption: if condition holds, conclude conclusion.
151 *
152 * The conditional is stored in the current scope and discarded on scope pop.
153 * When a query depends on the conclusion, the system checks if the condition
154 * is satisfied by the current assumption state. If satisfied, the conclusion
155 * is used; if not verifiable, the conditional is inactive.
156 *
157 * @param condition A relational expression (e.g., x > 1) serving as the guard
158 * @param conclusion A relational expression (e.g., ln(x) > 0) to use when condition holds
159 * Invalid or contradictory relations are returned as an explicit error.
160 */
161 AssumptionVoidResult assume_conditional(const SymbolicExpr& condition, const SymbolicExpr& conclusion);
162
163 /** @brief Stores a guarded conclusion and reports invalid input. */
164 AssumptionVoidResult assume_conditional_checked(
165 const SymbolicExpr& condition,
166 const SymbolicExpr& conclusion);
167
168 /**
169 * @brief A conditional assumption: "if condition then conclusion".
170 */
171 struct ConditionalAssumption {
172 SymbolicExpr condition;
173 SymbolicExpr conclusion;
174 };
175
176 /**
177 * @brief Retrieve all active conditional assumptions across all scopes (top to bottom).
178 *
179 * Used by the QueryInterface/InferenceEngine to check if any conditional
180 * conclusions are applicable given the current assumption state.
181 *
182 * @return Vector of all conditional assumptions from all scopes (most recent first)
183 */
184 std::vector<ConditionalAssumption> get_active_conditionals() const;
185
186 /**
187 * @brief Evaluate whether a condition expression is satisfied by the current state.
188 *
189 * Checks if the condition (a RelationalNode) can be verified against the
190 * current RelationStore and PropertyStore. Returns True if the condition
191 * is provably satisfied, False if provably unsatisfied, Unknown otherwise.
192 *
193 * @param condition The condition expression to evaluate
194 * @return Tribool indicating whether the condition is satisfied
195 */
196 Tribool evaluate_condition(const SymbolicExpr& condition) const;
197
198 // --- Expression property queries ---
199
200 /// Query whether the expression is positive (> 0).
201 AssumptionTriboolResult is_positive(const SymbolicExpr& expr) const;
202
203 /** @brief Queries positivity and propagates computation failures. */
204 AssumptionTriboolResult is_positive_checked(const SymbolicExpr& expr) const;
205 AssumptionTriboolResult is_positive_checked(
206 const SymbolicExpr& expr, ComputationContext& context) const;
207
208 /// Query whether the expression is negative (< 0).
209 AssumptionTriboolResult is_negative(const SymbolicExpr& expr) const;
210
211 /** @brief Queries negativity and propagates computation failures. */
212 AssumptionTriboolResult is_negative_checked(const SymbolicExpr& expr) const;
213 AssumptionTriboolResult is_negative_checked(
214 const SymbolicExpr& expr, ComputationContext& context) const;
215
216 /// Query whether the expression is non-negative (>= 0).
217 AssumptionTriboolResult is_nonnegative(const SymbolicExpr& expr) const;
218
219 /** @brief Queries non-negativity and propagates computation failures. */
220 AssumptionTriboolResult is_nonnegative_checked(const SymbolicExpr& expr) const;
221 AssumptionTriboolResult is_nonnegative_checked(
222 const SymbolicExpr& expr, ComputationContext& context) const;
223
224 /// Query whether the expression is real.
225 AssumptionTriboolResult is_real(const SymbolicExpr& expr) const;
226
227 /** @brief Queries real-domain membership and propagates computation failures. */
228 AssumptionTriboolResult is_real_checked(const SymbolicExpr& expr) const;
229 AssumptionTriboolResult is_real_checked(
230 const SymbolicExpr& expr, ComputationContext& context) const;
231
232 /// Query whether the expression is an integer.
233 AssumptionTriboolResult is_integer(const SymbolicExpr& expr) const;
234
235 /** @brief Queries integer-domain membership and propagates computation failures. */
236 AssumptionTriboolResult is_integer_checked(const SymbolicExpr& expr) const;
237 AssumptionTriboolResult is_integer_checked(
238 const SymbolicExpr& expr, ComputationContext& context) const;
239
240 /// Query whether the expression is non-zero (!= 0).
241 AssumptionTriboolResult is_nonzero(const SymbolicExpr& expr) const;
242
243 /** @brief Queries nonzero status and propagates computation failures. */
244 AssumptionTriboolResult is_nonzero_checked(const SymbolicExpr& expr) const;
245 AssumptionTriboolResult is_nonzero_checked(
246 const SymbolicExpr& expr, ComputationContext& context) const;
247
248 /**
249 * @brief Serialize the entire AssumptionContext to a human-readable string.
250 *
251 * Format is line-oriented with SCOPE delimiters. Each scope's properties,
252 * relations, and conditionals are serialized one per line. The output ends
253 * with "END".
254 *
255 * @return Serialized string representation of all scopes.
256 */
257 std::string serialize() const;
258
259 /**
260 * @brief Deserialize a string into a fully reconstructed AssumptionContext.
261 *
262 * Parses the line-oriented format produced by serialize().
263 *
264 * @param data Serialized string (as produced by serialize()).
265 * @return Reconstructed context or a parse/contradiction error.
266 */
267 static Result<AssumptionContext> deserialize(const std::string& data);
268
269 /// 面向不可信输入的受检反序列化接口,通过 CasError 传递格式与约束诊断.
270 static Result<AssumptionContext> deserialize_checked(const std::string& data);
271 /// Checked deserialization using the caller's resource and cancellation policy.
272 static Result<AssumptionContext> deserialize_checked(
273 const std::string& data, ComputationContext& context);
274
275 /**
276 * @brief Query whether a symbol is continuous on a given interval (read-through all scopes).
277 * @param symbol Symbol name to query.
278 * @param interval Interval on which to check continuity.
279 * @return True if continuous, False if not, Unknown if undetermined.
280 */
281 AssumptionTriboolResult is_continuous(const std::string& symbol, const Interval& interval) const;
282
283 /** @brief Queries interval continuity and propagates computation failures. */
284 AssumptionTriboolResult is_continuous_checked(
285 const std::string& symbol,
286 const Interval& interval) const;
287
288 /**
289 * @brief Query whether a symbol is differentiable on a given interval (read-through all scopes).
290 * @param symbol Symbol name to query.
291 * @param interval Interval on which to check differentiability.
292 * @return True if differentiable, False if not, Unknown if undetermined.
293 */
294 AssumptionTriboolResult is_differentiable(const std::string& symbol, const Interval& interval) const;
295
296 /** @brief Queries interval differentiability and propagates computation failures. */
297 AssumptionTriboolResult is_differentiable_checked(
298 const std::string& symbol,
299 const Interval& interval) const;
300
301 /**
302 * @brief Query whether a symbol (matrix) is positive definite (read-through all scopes).
303 * @param symbol Symbol name to query.
304 * @return True if positive definite, False if known not, Unknown if undetermined.
305 */
306 AssumptionTriboolResult is_positive_definite(const std::string& symbol) const;
307
308 /** @brief Queries positive definiteness and propagates computation failures. */
309 AssumptionTriboolResult is_positive_definite_checked(const std::string& symbol) const;
310
311 /**
312 * @brief Query whether a symbol (matrix) is positive semidefinite (read-through all scopes).
313 * @param symbol Symbol name to query.
314 * @return True if positive semidefinite, False if known not, Unknown if undetermined.
315 */
316 AssumptionTriboolResult is_positive_semidefinite(const std::string& symbol) const;
317
318 /** @brief Queries positive semidefiniteness and propagates computation failures. */
319 AssumptionTriboolResult is_positive_semidefinite_checked(const std::string& symbol) const;
320
321 /**
322 * @brief Set the maximum recursion depth for inference queries.
323 *
324 * This depth limit is wired to the InferenceEngine used by QueryInterface.
325 * @param depth Maximum depth (must be > 0). Default is 32.
326 */
327 void set_max_query_depth(int depth);
328
329 /**
330 * @brief Get the current maximum recursion depth for inference queries.
331 * @return The configured maximum depth.
332 */
333 int get_max_query_depth() const;
334
335private:
336 friend class detail::AssumptionFacts;
337
338 static AssumptionContext deserialize_impl(
339 const std::string& data, ComputationContext& context);
340
341 struct Scope {
342 PropertyStore properties;
343 RelationStore relations;
344 std::vector<ConditionalAssumption> conditionals;
345 mutable std::uint64_t observed_property_revision = 0;
346 mutable std::uint64_t observed_relation_revision = 0;
347 };
348
349 std::vector<Scope> scope_stack_;
350 struct RelationShadowing;
351 RelationShadowing collect_relation_shadowing(
352 std::size_t scope, detail::RewriteBudget& budget) const;
353 static bool relation_shadowed(
354 const Relation& relation, const RelationShadowing& shadowing,
355 detail::RewriteBudget& budget);
356 std::vector<bool> relation_visibility(
357 std::size_t scope, detail::RewriteBudget& budget) const;
358 Result<bool> has_relation_in_scope(
359 std::size_t scope, const SymbolicExpr& lhs, const SymbolicExpr& rhs,
360 RelationOp op, detail::RewriteBudget& budget) const;
361
362 /// Maximum recursion depth for inference queries (default 32).
363 int max_query_depth_ = 32;
364
365 /** @brief QueryInterface 观察到的缓存代数;存储提交采用惰性检测。 */
366 mutable uint64_t cache_generation_ = 0;
367
368public:
369 /** @brief 观察事务修订并返回当前缓存代数。 */
370 uint64_t cache_generation() const;
371};
const std::string & variable
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
Domain
Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational...
Boundedness
Boundedness classification for symbols.
Result< Tribool > AssumptionTriboolResult
Definiteness
Matrix definiteness classification.
RelationOp
Stable relational operator used by public APIs.
const ExprPtr RelationOp op
std::size_t std::size_t depth
const NumberDomainSet & domain
Finiteness
Finiteness classification for limits and sequences.
Result< void > AssumptionVoidResult
ExprResult relation(const ExprPtr &lhs, const ExprPtr &rhs, RelationOp op)
const ExprPtr & rhs
Parity
Integer parity classification.
Sign
Sign classification for symbols and expressions.
A stored relational constraint between two symbolic expressions.

◆ __attribute__() [2/4]

LMCAS::__attribute__ ( (visibility("default")) ) const &
noexcept

Berlekamp 模素数分解(内部接口).

计算三个三维向量的混合积 a·(b×c)。

计算两个向量夹角 arccos(a·b / (|a|·|b|))。

计算向量 a 在向量 b 上的标量投影 a·b / |b|。

计算向量 a 在向量 b 上的投影向量 proj_b(a) = (a·b / b·b)·b。

计算两个三维向量的叉积 a×b。

计算两个向量的点积 a·b = ∑aᵢbᵢ。

使用默认计算上下文计算斯托克斯定理曲面积分,并显式报告无效输入和未覆盖域。

斯托克斯定理:计算 ∬_S (∇×F)·dS。

使用默认计算上下文计算散度定理体积分,并显式报告无效输入和未覆盖域。

散度定理(高斯定理):计算 ∭_V ∇·F dV。

使用默认计算上下文计算格林面积公式,并显式报告无效输入和未覆盖域。

格林定理:计算 ∬_R (∂Q/∂x - ∂P/∂y) dA。

用默认上下文计算第二类曲面积分,报告无效输入与未覆盖域。

计算第一类曲面积分(标量场在曲面上的积分)。

使用默认上下文计算旋度;无效输入返回错误。

计算向量场的旋度 ∇×F。

使用默认上下文计算散度;无效输入返回错误。

计算标量函数的梯度 ∇f。

使用默认上下文计算第二类曲线积分,报告无效输入与未覆盖域。

计算第一类曲线积分(标量场沿曲线的积分)。

Constructs an immutable finite set with structural deduplication.

计算曲面在某点的切平面。

计算曲面在某点的单位法向量 ∇F/|∇F|。

对二次曲面进行分类。 对称特征分解将含混合项的二次型旋转到主轴,再完成平方, 依据中心常数和惯性判定实数轨迹。零空间线性分量采用逐主轴点积误差界, 使抛物方向的判定独立于其他轴的大系数;秩一非中心二次型归为抛物柱面。 非零特征值落入特征分解反向误差界时返回 Inconclusive,保持原秩; 空集、单点、直线和平面对按退化情形处理。

由两点构造直线。

计算点到平面的距离。

计算直线与平面的交点。

将极坐标形式转换为指数形式复数 r*e^(i*theta)

计算复数的辐角

计算复数的模

计算复数的共轭

复数除法

复数乘法

复数减法

复数加法

成功时返回恒等、非恒等或未知分类,计算错误由外层 Result 返回。 假设可辅助恒等规则;形式非恒等与点值事实分别判定,未知分类仍属成功返回。

Attaches a declared unit to a scalar symbolic expression.

证明表达式是精确的一元有理系数多项式。

Return the positive coefficient content of an exact rational polynomial.

Compute the monic GCD of two exact rational multivariate polynomials.

Evaluate a real expression using explicit symbol bindings and a computation context.

多元无平方因子分解

计算多元多项式 GCD

计算多元本原部分

内部算法组件(供测试使用)

受检精确多元因式分解.

将有限值与有符号无穷极限投影为表达式。 DoesNotExist 转为 Inconclusive,表达式载荷仅承载极限值。

证明单侧极限,并在有限点合并两侧结果。 两侧已证极限不相容时返回 LimitDoesNotExist;证明不足时返回 Inconclusive。 资源与取消错误原样保留。无穷点表示尾部趋近,仅有一种趋近方向。 Domain::Real 保留实分支与有定义性约束。 Domain::Complex 在支持的分支切割之外用连续性证明有限极限; 已证去心邻域有定义时也支持多项式分母的可去奇点,要求方向为 Both、极限点有限, 并采用复域邻域语义。 成功认证的是上下文假设下的带标签结果,可能为无穷或极限不存在。 有限单侧值按指定域逐点比较;残差非恒等于零仍可能在部分允许参数值处为零。 恒等式认证相等前须证明有定义性;参数比较未知时返回 Inconclusive。

Checked emptiness decision for an interval.

Checked numeric membership test for an interval.

计算多项式关于基的标准形(余式)

Explicitly evaluate an expression as a finite complex value.

Construct the complex modulus in square-sum form.

计算多项式的无平方因子部分.

在计算预算内执行精确 Zassenhaus 因子组合。 要求重构模数为正,且提升因子乘积与 poly 的整数归一化结果同余。 候选子集按字典序枚举,支持任意因子数;预算耗尽时以 Inconclusive 返回精确部分分解。

执行 Hensel 提升并诊断前置条件。 空因子列表、非法素数、零或常数输入、零因子及模 p 因子乘积 与原多项式不符时,通过 CasError 返回具体诊断。

在有限域 F_p 上对有理系数多项式执行 Berlekamp 算法, 返回模 p 下的不可约因子列表.

参数
[in]poly有理系数多项式
[in]prime选定的素数 p
返回
Berlekamp 分解结果

以 gcd(f, f') 分离重复因子,为 Berlekamp 分解提供无平方因子部分。

参数
[in]poly输入的有理系数多项式
返回
无平方因子预处理结果,包含 square-free 部分和重复因子信息

Exact numeric components retain exact simplification. Approximate components and bound real components use a scaled norm without forming their squares.

Powers with integer exponents in [-64, 64] use exponentiation by squaring. Exact exponent expressions are normalized before numeric conversion, with rational exponents classified in their exact number domain. Negative powers first form the reciprocal base, keeping the computation on the magnitude scale of the requested result. Complex traversal and real-component evaluation share the context's active recursion budget. Each frame releases its depth on return or stack unwinding. Complex products use LMMC's component-wise binary scaling at exponent boundaries and retain the propagated component error estimates.

参数
f待约化多项式
basisGröbner 基
order单项式序
返回
标准形

每个成功值都精确重构 poly.`Complete` 还证明所有终端因子在已实现 的精确路径下不可约;有界或尚不支持的精确部分结果标记为 Inconclusive.资源、取消、分配与内部不变量失败均通过 CasError 返回.

计算多元容度

将多项式视为主变量的一元多项式,计算所有系数多项式(辅助变量的多项式)的 GCD。

参数
[in]poly输入多元多项式
[in]main_var主变量名
返回
容度多项式(辅助变量的多项式)

将多项式除以其关于主变量的容度,得到本原部分。 满足:multivariate_content(poly, var) * multivariate_primitive_part(poly, var) == poly(至多差符号)。

参数
[in]poly输入多元多项式
[in]main_var主变量名
返回
本原部分多项式

采用递归求值-插值算法,避开降次的坏求值点,并对恢复的 候选多项式执行精确整除验证。

参数
[in]a第一个多项式
[in]b第二个多项式
返回
gcd(a, b)

通过计算 gcd(f, ∂f/∂x_main) 检测重因子,将多项式分解为 f = f₁ · f₂² · f₃³ · ... 的形式,其中每个 fᵢ 无平方。

参数
[in]poly输入多元多项式
[in]main_var主变量名
返回
无平方因子分解结果

Square roots of one or two real squares are evaluated as absolute values or hypot, avoiding intermediate overflow and underflow in norm expressions.

参见
ISO C11 committee draft N1570, 7.12.7.3 (hypot). https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

Exact numeric exponents retain their integer classification and parity on negative real bases. Non-integral powers of negative real values report DomainError rather than rounding the exponent into the integer domain.

参见
ISO C11 committee draft N1570, 7.12.7.4 (pow). https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

Complex phase on a real argument embeds the value as x + i(+0) and evaluates its principal argument with atan2(+0, x). Negative reals, including negative zero and negative-infinity bindings, therefore have phase +pi; positive reals and positive zero have phase +0. Argument-evaluation failures propagate through Result.

参见
ISO C11 committee draft N1570, 7.3.9.1 (carg), principal argument. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

The expressions may contain any number of symbolic variables, exact integer or rational coefficients, addition, multiplication, and nonnegative integer powers. Approximate numbers and non-polynomial nodes are rejected. A successful result is verified to divide both inputs exactly.

成功且 optional 为空表示表达式超出当前结构支持域。 精确系数仅取自精确数值节点;遍历与展开计入上下文预算。

Attaches a resolved unit definition. Converts a quantity to a declared unit of the same dimension. Converts to a resolved unit definition. Removes a quantity annotation using the requested scale.

参数
a加数
b加数
返回
和
参数
a被减数
b减数
返回
差
参数
a乘数
b乘数
返回
积
参数
a被除数
b除数
返回
商
参数
z输入复数
返回
共轭复数
参数
z输入复数
返回
模的符号表达式
参数
z输入复数
返回
辐角的符号表达式
参数
r模
theta辐角
返回
对应的符号复数

将极坐标形式转换为三角形式复数 r*(cos(theta) + i*sin(theta))

参数
r模
theta辐角
返回
对应的符号复数

求复数 c 的 n 次方根

参数
c被开方的复数表达式
n根的次数
返回
n 个复数根的列表

求解系数已证为实数且 a 非零的方程 az^2 + bz + c = 0。

按公式的 (+sqrt, -sqrt) 顺序返回两个直角坐标形式的根,保留重数。 负判别式的平方根仅进入虚部;返回前须将所有候选根代入 直角坐标多项式并将残差化简为零。 空输入返回 InvalidArgument;a 已证为零返回 DomainError; 系数未证为实数返回 UnsupportedExpression。 a 的非零性、判别式符号或零残差未获证明时返回 Inconclusive。 使用上下文假设并传播计算错误。

有限向量的点积或交点坐标更新存在溢出、下溢风险时,按最大分量 缩放相关向量和坐标,并同步缩放平面常数及直线参数化。 点积按维数预留累加余量;非零尺度变换保持交点不变。

参数
line直线
plane平面
返回
交点坐标向量

有限法向量的平方或点积部分和存在溢出、下溢风险时,同尺度缩放 法向量与常数项,保持平面和距离不变。点积按维数预留累加余量, 使最终可表示的抵消结果免受部分和溢出影响。

参数
point空间点坐标
plane平面
返回
距离的符号表达式

计算两条异面直线之间的距离。

有限方向向量分别按自身最大分量归一化后计算叉积。 有限点坐标差可能溢出时,先按公共最大分量缩放两点, 求出距离比值后恢复点尺度;方向及临时点尺度保持距离不变。

参数
l1第一条直线
l2第二条直线
返回
距离的符号表达式

有限点坐标差可能溢出时,先按两点的公共最大分量缩放再求差; 公共方向尺度保持直线不变。

参数
p1第一个点
p2第二个点
返回
直线(point = p1, direction = p2 - p1)

由三点构造平面(法向量 = (p2-p1)×(p3-p1))。

有限点坐标差可能溢出时,按三点的公共尺度构造边; 叉积或其范数平方仍有溢出、下溢风险时,分别缩放两条边。 这些尺度变换保持平面不变。

参数
p1第一个点
p2第二个点
p3第三个点
返回
平面(法向量 + 常数 d = n·p1)

计算两平面之间的二面角 arccos(|n₁·n₂| / (|n₁||n₂|))。

有限法向量的非零验证和角度计算均避开直接分量平方和, 支持方向可表示但平方会溢出的法向量。

参数
p1第一个平面
p2第二个平面
返回
二面角表达式(弧度)
参数
surf隐式曲面。
返回
分类字符串:"sphere"、"ellipsoid"、"paraboloid"、"hyperboloid"、 "cone"、"cylinder"、"unknown"。

数值梯度采用按最大分量缩放的二范数归一化,因此有限梯度的平方 即使超出 double 范围,只要单位方向可表示仍能返回结果。

参数
surf隐式曲面
point曲面上的点(变量名到值的映射)
返回
单位法向量分量

奇异点判断直接检查有限梯度分量,不构造可能溢出的平方和。有限数值 梯度与切点的点积存在中间溢出风险时,等比例缩放平面系数后计算常数。

参数
surf隐式曲面
point切点
返回
切平面(法向量与 ∇F(point) 同向)

Constructs a real interval. Endpoint ordering is validated when decidable. Constructs and simplifies a membership proposition when membership is decidable.

计算 ∫ₐᵇ f(r(t))·|r'(t)| dt,其中 r(t) 为参数化曲线。

参数
[in]f标量函数表达式(以曲线参数化中的坐标变量表示)
[in]parametrization参数化曲线 [x(t), y(t)] 或 [x(t), y(t), z(t)]
[in]t参数变量名
[in]a参数下界
[in]b参数上界
返回
曲线积分结果表达式

使用默认上下文计算第一类曲线积分,报告无效输入与未覆盖域。

计算第二类曲线积分(向量场沿曲线的积分)。

计算 ∫ₐᵇ F(r(t))·r'(t) dt,其中 r(t) 为参数化曲线。

参数
[in]F向量场(各分量以坐标变量表示)
[in]parametrization参数化曲线 [x(t), y(t)] 或 [x(t), y(t), z(t)]
[in]t参数变量名
[in]a参数下界
[in]b参数上界
返回
曲线积分结果表达式
参数
[in]f标量函数表达式
[in]vars变量名列表
返回
梯度向量,各分量为偏导数 ∂f/∂xᵢ

使用默认上下文计算梯度;无效输入返回错误。

计算向量场的散度 ∇·F = ∑∂Fᵢ/∂xᵢ。

参数
[in]F向量场(各分量为标量表达式)
[in]vars变量名列表(与 F 的分量一一对应)
返回
散度标量表达式

三维情况返回三分量向量;二维情况返回标量旋度(单分量向量)。

参数
[in]F向量场
[in]vars变量名列表
返回
旋度向量场

计算 ∬ f(r(u,v))·|r_u × r_v| du dv,其中 r(u,v) 为参数化曲面。

参数
[in]f标量函数表达式(以坐标变量表示)
[in]parametrization参数化曲面 [x(u,v), y(u,v), z(u,v)]
[in]u第一参数变量名
[in]v第二参数变量名
[in]u_loweru 参数下界
[in]u_upperu 参数上界
[in]v_lowerv 参数下界
[in]v_upperv 参数上界
返回
曲面积分结果表达式

用默认上下文计算第一类曲面积分,报告无效输入与未覆盖域。

计算第二类曲面积分(向量场通过曲面的通量)。

计算 ∬ F·(r_u × r_v) du dv,其中 r(u,v) 为参数化曲面。

参数
[in]F向量场(三分量,以坐标变量表示)
[in]parametrization参数化曲面 [x(u,v), y(u,v), z(u,v)]
[in]u第一参数变量名
[in]v第二参数变量名
[in]u_loweru 参数下界
[in]u_upperu 参数上界
[in]v_lowerv 参数下界
[in]v_upperv 参数上界
返回
曲面积分结果表达式

等价于闭合曲线积分 ∮_C P dx + Q dy。 region 以积分区间表示:x ∈ [x_lo, x_hi], y ∈ [y_lo(x), y_hi(x)]。

参数
[in]P向量场 x 分量
[in]Q向量场 y 分量
[in]vars变量名列表 {x_var, y_var}
[in]x_boundsx 的积分区间 {下界, 上界}
[in]y_boundsy 的积分区间 {下界(可含x), 上界(可含x)}
返回
格林定理计算的二重积分结果

使用默认计算上下文计算格林定理面积分,并显式报告无效输入和未覆盖域。

利用格林定理计算封闭曲线围成的面积 A = (1/2)∮(x dy - y dx)。

参数
[in]parametrization曲线参数化 r(t) = (x(t), y(t))
[in]t参数变量名
[in]a参数下界
[in]b参数上界
返回
面积表达式

等价于封闭曲面上的通量积分 ∬_S F·dS。 volume_bounds 以迭代积分区间表示。

参数
[in]F三维向量场
[in]vars变量名列表 {x, y, z}
[in]x_boundsx 的积分区间
[in]y_boundsy 的积分区间(可含 x)
[in]z_boundsz 的积分区间(可含 x, y)
返回
散度定理计算的三重积分结果

等价于边界曲线上的环量积分 ∮_C F·dr。 通过参数化曲面计算 ∬(∇×F)·(r_u × r_v) du dv。

参数
[in]F三维向量场
[in]vars变量名列表 {x, y, z}
[in]parametrization曲面参数化 r(u,v) = (x(u,v), y(u,v), z(u,v))
[in]u第一参数变量名
[in]v第二参数变量名
[in]u_boundsu 的积分区间
[in]v_boundsv 的积分区间
返回
斯托克斯定理计算的曲面积分结果
参数
[in]a向量 a
[in]b向量 b(维度需与 a 相同)
返回
点积标量表达式
参数
[in]a三维向量 a
[in]b三维向量 b
返回
叉积向量(三分量)
参数
[in]a被投影向量
[in]b投影方向向量
返回
投影向量;b 为零向量时返回零向量
参数
[in]a被投影向量
[in]b投影方向向量
返回
标量投影表达式;b 为零向量时返回 nullptr
参数
[in]a向量 a
[in]b向量 b
返回
夹角表达式(弧度);任一向量为零时返回 nullptr
参数
[in]a向量 a
[in]b向量 b
[in]c向量 c
返回
混合积标量表达式(等于以 a,b,c 为行的行列式)

引用了 LMCAS_API, options , 以及 set_eqv_profile().

函数调用图:

◆ __attribute__() [3/4]

template<>
__attribute__((visibility("default"))) Result< SymbolicPolyCoeff > extract_coeff_value< SymbolicPolyCoeff >(const std __attribute__((visibility("default"))) Result< BigInt > extract_coeff_value< BigInt >(const std __attribute__((visibility("default"))) Result< Rational > extract_coeff_value< Rational >(const std LMCAS::__attribute__ ( (visibility("default")) ) const &

判断表达式是否含指定变量的自由出现。

引用了 contains(), LMCAS_API , 以及 variable.

函数调用图:

◆ __attribute__() [4/4]

template<typename T>
LMCAS::__attribute__ ( (visibility("default")) ) const

在文件 poly_utils.cpp 第 441 行定义.

443 {
444 if (!expression || !LMCAS::detail::node(expression) || variable.empty()) {
446 "Expression and variable must not be empty", "polynomial.convert");
447 }
448 try {
449 ComputationContext context;
451 } catch (const CasError& error) {
452 return Result<Polynomial<T>>::failure(error);
453 } catch (const std::bad_alloc&) {
455 "Polynomial allocation failed", "polynomial.convert");
456 } catch (const std::length_error& error) {
458 error.what(), "polynomial.convert");
459 }
460}
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
Result< Polynomial< T > > symbolic_to_poly_recursive(const std::shared_ptr< const SymbolicNode > &node, const std::string &variable, ComputationContext *context, detail::RewriteBudget *budget)

引用了 context, InvalidArgument, LMCAS_API, LMCAS::detail::node(), ResourceLimit, symbolic_to_poly_recursive() , 以及 variable.

函数调用图:

◆ abs() [1/2]

ExprResult LMCAS::abs ( const ExprPtr & expression)

在文件 expr_arithmetic.cpp 第 172 行定义.

172 {
174 return abs(expression, context);
175}
ExprResult abs(const ExprPtr &expression, ComputationContext &context)

引用了 abs() , 以及 context.

函数调用图:

◆ abs() [2/2]

ExprResult LMCAS::abs ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_arithmetic.cpp 第 128 行定义.

128 {
129 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
130 (context).limits().max_ast_nodes, "transform");
131 auto step = context.consume_steps(1, kAbsOperation);
132 if (!step) {
133 return ExprResult::failure(step.error());
134 }
135 auto re = real(expression, context);
136 if (!re) {
137 return re;
138 }
139 auto im = imag(expression, context);
140 if (!im) {
141 return im;
142 }
143 try {
144 auto re_squared = SymbolicExpr::power(re.value(), SymbolicExpr::number(2));
145 auto im_squared = SymbolicExpr::power(im.value(), SymbolicExpr::number(2));
146 auto sum = SymbolicExpr::add(re_squared, im_squared);
147 auto result = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::sqrt(sum)), transform_budget));
148 if (!result || !LMCAS::detail::node(result)) {
150 "complex absolute value construction failed",
152 }
153 return ExprResult::success(std::move(result));
154 } catch (const std::bad_alloc&) {
156 "complex absolute value allocation failed",
158 } catch (const std::length_error& error) { return ExprResult::failure(CasErrc::ResourceLimit, error.what(), "abs"); } catch (const std::exception& error) {
161 }
162} catch (const CasError& error) {
163 return ExprResult::failure(error);
164} catch (const std::bad_alloc&) {
165 return ExprResult::failure(CasErrc::ResourceLimit, "allocation failed", "abs");
166} catch (const std::length_error& error) {
167 return ExprResult::failure(CasErrc::ResourceLimit, error.what(), "abs");
168} catch (const std::exception& error) {
169 return ExprResult::failure(CasErrc::InternalInvariant, error.what(), "abs");
170}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(ExprPtr value)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
constexpr const char * kAbsOperation
ExprResult expression_failure(CasErrc code, std::string message, const char *operation)
ExprResult real(const ExprPtr &expression, ComputationContext &context)
ExprPtr imag

引用了 abs(), context, LMCAS::expr_detail::expr_common::expression_failure(), LMCAS::Result< ExprPtr >::failure(), imag, InternalInvariant, LMCAS::expr_detail::expr_common::kAbsOperation, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), real(), ResourceLimit , 以及 LMCAS::Result< ExprPtr >::success().

被这些函数引用 abs(), abs(), LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function() , 以及 LMCAS::detail::strict_cauchy_root_bound().

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

◆ accumulate_bernoulli_exponent()

bool LMCAS::accumulate_bernoulli_exponent ( int value,
int & exponent )
static

在文件 ode_classification.cpp 第 207 行定义.

207 {
208 if (value > 0 && exponent > std::numeric_limits<int>::max() - value) {
209 return false;
210 }
211 if (value < 0 && exponent < std::numeric_limits<int>::min() - value) {
212 return false;
213 }
214 exponent += value;
215 return true;
216}
const ExprPtr & exponent
const std::string const ExprPtr & value

引用了 accumulate_bernoulli_exponent(), exponent , 以及 value.

被这些函数引用 accumulate_bernoulli_exponent() , 以及 extract_bernoulli_factor().

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

◆ acos() [1/2]

ExprResult LMCAS::acos ( const ExprPtr & expression)

在文件 expr_elementary.cpp 第 93 行定义.

93 {
95 return acos(expression, context);
96}
ExprResult acos(const ExprPtr &expression, ComputationContext &context)

引用了 acos() , 以及 context.

函数调用图:

◆ acos() [2/2]

ExprResult LMCAS::acos ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_elementary.cpp 第 86 行定义.

86 {
87 auto valid = require_dimensionless(expression, "acos");
88 if (!valid) { return valid; }
89 return make_unary_function_expr(expression, context, "acos",
91}
ExprResult make_unary_function_expr(const ExprPtr &expression, ComputationContext &context, const char *function_name, FunctionNode::FuncType type)
ExprResult require_dimensionless(const ExprPtr &expression, const char *function_name)

引用了 acos(), LMCAS::FunctionNode::ArcCos, context, LMCAS::expr_detail::expr_common::make_unary_function_expr() , 以及 LMCAS::expr_detail::expr_common::require_dimensionless().

被这些函数引用 acos(), acos() , 以及 LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function().

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

◆ active_univariate_variable()

std::string LMCAS::active_univariate_variable ( const MultiPoly & poly)
static

在文件 multivariate_factor.cpp 第 208 行定义.

208 {
209 for (const auto& variable : poly.variables()) {
210 if (poly.degree(variable) > 0) { return variable; }
211 }
212 return {};
213}

引用了 active_univariate_variable() , 以及 variable.

被这些函数引用 active_univariate_variable() , 以及 univariate_gcd().

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

◆ adaptive_simpson_numeric() [1/2]

Result< QuadratureEstimate > LMCAS::adaptive_simpson_numeric ( const std::shared_ptr< SymbolicExpr > & function,
const std::string & variable,
const std::shared_ptr< SymbolicExpr > & lower,
const std::shared_ptr< SymbolicExpr > & upper,
ComputationContext & context,
double tolerance,
int max_depth )

在文件 numerical_integration.cpp 第 299 行定义.

306 {
307 constexpr const char* operation = "adaptive_simpson";
308 auto valid = validate_quadrature_args(
309 function, variable, lower, upper, operation);
310 if (!valid) return Result<QuadratureEstimate>::failure(valid.error());
311 if (!(tolerance > 0.0) || !std::isfinite(tolerance)) {
314 "tolerance must be finite and positive",
315 operation);
316 }
317 if (max_depth < 0) {
320 "maximum recursion depth must be non-negative",
321 operation);
322 }
323 auto interval = evaluate_interval(lower, upper, context, operation);
325 if (interval.value().lower == interval.value().upper) {
327 }
328 auto recursion = context.enter_recursion(operation);
329 if (!recursion) return Result<QuadratureEstimate>::failure(recursion.error());
330 struct RecursionGuard {
331 ComputationContext& context;
332 ~RecursionGuard() { context.leave_recursion(); }
333 } recursion_guard{context};
334 const std::size_t remaining_depth =
335 context.limits().max_recursion_depth > context.recursion_depth()
336 ? context.limits().max_recursion_depth - context.recursion_depth()
337 : 0;
338 const std::size_t effective_depth = std::min(
339 static_cast<std::size_t>(max_depth), remaining_depth);
340
342 QuadratureCallback callback{
343 &function, &variable, &context, operation, std::nullopt};
344 lmmc_quad_result_t backend_result{};
345 const auto status = lmmc_quad_adaptive(
346 evaluate_quadrature_callback, &callback,
347 interval.value().lower, interval.value().upper,
348 tolerance, 0.0, effective_depth, &backend_result);
349 if (callback.error) return Result<QuadratureEstimate>::failure(*callback.error);
350 if (status == LMMC_STATUS_WARNING_MAX_DEPTH) {
353 "adaptive Simpson recursion limit reached before meeting tolerance",
354 operation);
355 }
356 if (status != LMMC_STATUS_OK) {
357 return quadrature_failure<QuadratureEstimate>(status, operation);
358 }
359 QuadratureEstimate result;
360 result.value = interval.value().sign * backend_result.value;
361 result.estimated_error = std::abs(backend_result.error) +
362 std::numeric_limits<double>::epsilon() *
363 std::max(1.0, std::abs(result.value)) * 16.0;
364 if (!std::isfinite(result.value) || !std::isfinite(result.estimated_error)) {
367 "adaptive Simpson result is not finite",
368 operation);
369 }
371}
CasError & error()
Result< NormalizedInterval > evaluate_interval(const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, const std::string &operation)
void ensure_lmmc_lifecycle() noexcept
ComputationContext const std::string & operation
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
const ExprPtr & lower
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)

引用了 adaptive_simpson_numeric(), context, LMCAS::detail::ensure_lmmc_lifecycle(), LMCAS::Result< T >::error(), LMCAS::QuadratureEstimate::estimated_error, LMCAS::Result< T >::failure(), function(), interval(), InvalidArgument, lower, NumericFailure, ResourceLimit, LMCAS::Result< T >::success(), upper, LMCAS::QuadratureEstimate::value, LMCAS::Result< T >::value() , 以及 variable.

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

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

◆ adaptive_simpson_numeric() [2/2]

Result< QuadratureEstimate > LMCAS::adaptive_simpson_numeric ( const std::shared_ptr< SymbolicExpr > & function,
const std::string & variable,
const std::shared_ptr< SymbolicExpr > & lower,
const std::shared_ptr< SymbolicExpr > & upper,
double tolerance,
int max_depth )

在文件 numerical_integration.cpp 第 373 行定义.

379 {
382 function, variable, lower, upper, context, tolerance, max_depth);
383}
Result< QuadratureEstimate > adaptive_simpson_numeric(const std::shared_ptr< SymbolicExpr > &function, const std::string &variable, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, double tolerance, int max_depth)

引用了 adaptive_simpson_numeric(), context, function(), lower, upper , 以及 variable.

函数调用图:

◆ add() [1/2]

ExprResult LMCAS::add ( const ExprPtr & lhs,
const ExprPtr & rhs )

在文件 expr_arithmetic.cpp 第 24 行定义.

24 {
26 return add(lhs, rhs, context);
27}
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)

引用了 add(), context , 以及 rhs.

函数调用图:

◆ add() [2/2]

ExprResult LMCAS::add ( const ExprPtr & lhs,
const ExprPtr & rhs,
ComputationContext & context )

在文件 expr_arithmetic.cpp 第 18 行定义.

20 {
21 return quantity_add(lhs, rhs, context);
22}
QuantityResult quantity_add(const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs, ComputationContext &context)

引用了 add(), context, quantity_add() , 以及 rhs.

被这些函数引用 add(), add(), calculus_utils_contains_complex(), calculus_utils_contains_nonreal_sqrt(), LMCAS::equivalence_detail::canonicalize_complex_product(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::canonicalize_sum(), LMCAS::solver_detail::collect_denominator_factors(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_proof.cpp}::collect_polynomial_variable_names(), LMCAS::anonymous_namespace{residual_verification.cpp}::collect_residual_profiles(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::collect_transcendental_subexprs(), LMCAS::InferenceEngine::Impl::composite_integer(), LMCAS::InferenceEngine::Impl::composite_negative(), LMCAS::InferenceEngine::Impl::composite_nonnegative(), LMCAS::InferenceEngine::Impl::composite_nonpositive(), LMCAS::InferenceEngine::Impl::composite_nonzero(), LMCAS::InferenceEngine::Impl::composite_positive(), LMCAS::InferenceEngine::Impl::composite_real(), LMCAS::SymbolicFactory::create_add(), LMCAS::anonymous_namespace{mixed_transcendental_classification.cpp}::degree_in_var(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_node(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_node(), LMCAS::detail::matrix_decomposition::exact_rational_expr(), LMCAS::detail::matrix_decomposition::anonymous_namespace{matrix_decomposition_support.cpp}::exact_rational_sum(), LMCAS::anonymous_namespace{mixed_transcendental_search.cpp}::extract_linear_coefficient(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::has_exp_k_var_terms(), inverse_laplace_core(), LMCAS::anonymous_namespace{symbolic_factor.cpp}::is_poly_expr_node(), LMCAS::solver_detail::is_polynomial_node(), LMCAS::transform_detail::laplace_transform_core(), match_recursive(), LMCAS::AddNode::normalize_operands(), LMCAS::expr_detail::ExprParser::parse_additive(), LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::parse_quadratic_surd(), LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::parse_surd_sum(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::propagate(), LMCAS::anonymous_namespace{integration_rational_collection.cpp}::rd_collect_rational(), LMCAS::anonymous_namespace{integration_rational_collection.cpp}::rd_collect_sum(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_node(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_sum(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::SubstNodeVisitor::replace(), LMCAS::anonymous_namespace{residual_verification.cpp}::residual_piecewise(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::rewrite_exp_as_u_power(), LMCAS::equivalence_detail::rewrite_exp_log_basic_identity(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::rewrite_function(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::rewrite_radical(), LMCAS::equivalence_detail::rewrite_trig_basic_identity(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_trig.cpp}::rewrite_trig_sum(), LMCAS::anonymous_namespace{complex_analysis.cpp}::split_real_imag(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::structural(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::sum_bounds(), LMCAS::anonymous_namespace{query_conditions.cpp}::sum_conditions(), LMCAS::InferenceEngine::Impl::sum_nonzero(), LMCAS::InferenceEngine::Impl::sum_relation_sign(), symbolic_node_to_multipoly(), symbolic_sum_to_poly(), symbolic_to_poly_recursive(), tf_collect_transcendental(), tf_contains_transcendental(), tf_degree_in(), tf_detect_exponential_separation(), tf_simplify_pythagorean_node(), tf_substitute_expr(), LMCAS::NormalizationVisitor::visit(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_has_trig_of_var(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_is_rational_trig(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_replace() , 以及 LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_to_rational().

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

◆ add_fourier_harmonic()

Result< void > LMCAS::add_fourier_harmonic ( Integrator & integrator,
const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & half_lo,
const std::shared_ptr< SymbolicExpr > & half_hi,
const std::shared_ptr< SymbolicExpr > & L,
const std::shared_ptr< SymbolicExpr > & arg,
bool cosine,
std::shared_ptr< SymbolicExpr > & result,
ComputationContext & context )
static

在文件 series_expansions.cpp 第 161 行定义.

167 {
168 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
169 (context).limits().max_ast_nodes, "transform");
170 auto integrand = SymbolicExpr::multiply(
171 f, cosine ? SymbolicExpr::cos(arg) : SymbolicExpr::sin(arg));
172 auto integrated = integrator.integrate_def_checked(
173 *integrand, var, *half_lo, *half_hi, context);
174 if (!integrated) {
175 return Result<void>::failure(integrated.error());
176 }
177 auto coefficient = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(
178 detail::make_expression_ptr(integrated.value()), L)), transform_budget));
179 if (!(detail::node(coefficient) && detail::node(coefficient)->is_zero())) {
180 result = SymbolicExpr::add(
181 result, SymbolicExpr::multiply(
182 coefficient, cosine ? SymbolicExpr::cos(arg) : SymbolicExpr::sin(arg)));
183 }
184 return Result<void>::success();
185} catch (const CasError& error) {
186 return Result<void>::failure(error);
187} catch (const std::bad_alloc&) {
188 return Result<void>::failure(CasErrc::ResourceLimit, "allocation failed", "add_fourier_harmonic");
189} catch (const std::length_error& error) {
190 return Result<void>::failure(CasErrc::ResourceLimit, error.what(), "add_fourier_harmonic");
191} catch (const std::exception& error) {
192 return Result<void>::failure(CasErrc::InternalInvariant, error.what(), "add_fourier_harmonic");
193}
const std::vector< IntegrationStep > Integrator & integrator

引用了 add_fourier_harmonic(), context, LMCAS::Result< T >::failure(), integrator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::Result< T >::success().

被这些函数引用 add_fourier_harmonic() , 以及 fourier_harmonics().

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

◆ add_lagrange_value()

void LMCAS::add_lagrange_value ( MultiPoly & result,
const MultiPoly & value,
const std::vector< Rational > & basis_coeffs,
const std::vector< std::string > & all_vars,
int var_idx )
static

在文件 multivariate_factor.cpp 第 111 行定义.

113 {
114 for (size_t k = 0; k < basis_coeffs.size(); ++k) {
115 if (basis_coeffs[k].is_zero()) { continue; }
116 MultiPoly scaled = value * basis_coeffs[k];
117 if (scaled.is_zero()) { continue; }
118 for (const auto& term : scaled.terms()) {
120 term.first, all_vars.size(), var_idx, static_cast<int>(k));
121 std::vector<MultiPoly::Term> t = {{full_mono, term.second}};
122 result = result + MultiPoly(std::move(t), all_vars);
123 }
124 }
125}
std::vector< int > Monomial
单项式类型,以整数向量表示各变量的指数
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & t
static Monomial restore_main_exponent(const Monomial &reduced, size_t variable_count, int variable_index, int exponent)

引用了 add_lagrange_value(), restore_main_exponent(), t , 以及 value.

被这些函数引用 add_lagrange_value() , 以及 lagrange_interpolate().

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

◆ add_number_nodes()

std::shared_ptr< const NumberNode > LMCAS::add_number_nodes ( const std::shared_ptr< const NumberNode > & a,
const std::shared_ptr< const NumberNode > & b )
static

在文件 solver_linear.cpp 第 50 行定义.

50 {
51 if (std::holds_alternative<Rational>(a->value()) || std::holds_alternative<Rational>(b->value())) {
52 Rational r1 = std::holds_alternative<Rational>(a->value()) ? std::get<Rational>(a->value()) : Rational(std::get<BigInt>(a->value()));
53 Rational r2 = std::holds_alternative<Rational>(b->value()) ? std::get<Rational>(b->value()) : Rational(std::get<BigInt>(b->value()));
55 }
56
57 return LMCAS::detail::make_node<NumberNode>(std::get<BigInt>(a->value()) + std::get<BigInt>(b->value()));
58}
std::shared_ptr< const Node > make_node(Args &&... args)
const MultiPoly & b
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a

引用了 a, add_number_nodes(), b, LMCAS::detail::make_node() , 以及 LMCAS::Result< T >::value().

被这些函数引用 add_number_nodes() , 以及 LMCAS::solver_detail::multiply_no_expand().

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

◆ add_numbers()

std::shared_ptr< const NumberNode > LMCAS::add_numbers ( const std::shared_ptr< const NumberNode > & a,
const std::shared_ptr< const NumberNode > & b )

两个数值节点相加

参数
a加数节点
b加数节点
返回
和的数值节点

在文件 normalization_utils.cpp 第 150 行定义.

150 {
151 if (std::holds_alternative<Rational>(a->value()) || std::holds_alternative<Rational>(b->value())) {
152 const Rational r1 = exact_number_as_rational(*a);
153 const Rational r2 = exact_number_as_rational(*b);
155 }
156
158 std::get<BigInt>(a->value()) + std::get<BigInt>(b->value()));
159}
Rational exact_number_as_rational(const NumberNode &node)

引用了 a, add_numbers(), b, exact_number_as_rational(), LMCAS::detail::make_node() , 以及 LMCAS::Result< T >::value().

被这些函数引用 LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::add_base(), add_numbers() , 以及 LMCAS::NormalizationVisitor::collect_sum().

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

◆ alternating_sequence_bound()

ExpressionResult LMCAS::alternating_sequence_bound ( const std::shared_ptr< SymbolicExpr > & remainder,
const std::string & n,
bool upper,
ComputationContext & context )
static

在文件 series_sequence_limits.cpp 第 88 行定义.

90 {
91 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
92 (context).limits().max_ast_nodes, "transform");
93 auto limited = limit_expression_checked(
94 remainder, n, SymbolicExpr::infinity(), LimitDirection::Both, context);
95 if (!limited) {
96 return limited;
97 }
98 auto limit = std::move(limited.value());
99 auto simplified = limit ? detail::make_expression_ptr(detail::normalize_node(detail::node(limit), transform_budget)) : nullptr;
100 if (simplified && !series_is_infinity(simplified)) {
101 auto magnitude = series_abs(simplified, context);
102 return upper ? magnitude : series_negate(magnitude, context);
103 }
104 if (series_is_infinity(simplified)) {
105 return upper ? SymbolicExpr::infinity() : SymbolicExpr::infinity(-1);
106 }
107 auto magnitude = series_abs(limit, context);
108 return upper ? magnitude : series_negate(magnitude, context);
109} catch (const CasError& error) {
110 return ExpressionResult::failure(error);
111} catch (const std::bad_alloc&) {
112 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "alternating_sequence_bound");
113} catch (const std::length_error& error) {
114 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "alternating_sequence_bound");
115} catch (const std::exception& error) {
116 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "alternating_sequence_bound");
117}
static std::shared_ptr< SymbolicExpr > series_negate(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)
LimitExpressionResult limit_expression_checked(const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, Domain domain)
bool series_is_infinity(const std::shared_ptr< SymbolicExpr > &expression)
static std::shared_ptr< SymbolicExpr > series_abs(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)

引用了 alternating_sequence_bound(), Both, context, limit_expression_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), series_abs(), series_is_infinity(), series_negate() , 以及 upper.

被这些函数引用 alternating_sequence_bound() , 以及 sequence_extreme_limit().

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

◆ analytic_continuation()

std::shared_ptr< SymbolicExpr > LMCAS::analytic_continuation ( const std::shared_ptr< SymbolicExpr > & f,
const std::string &  )

Basic analytic continuation via symbolic simplification Simplification often reduces locally defined series (if represented) to their global analytic forms (e.g. geometric series).

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

379 {
381 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
382 (context).limits().max_ast_nodes, "transform");
383 /// Basic analytic continuation via symbolic simplification
384 /// Simplification often reduces locally defined series (if represented)
385 /// to their global analytic forms (e.g. geometric series).
386 if (!f) return f;
388}

引用了 analytic_continuation(), context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 analytic_continuation().

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

◆ any_nonreal_sqrt()

bool LMCAS::any_nonreal_sqrt ( const std::vector< std::shared_ptr< const SymbolicNode > > & children,
ComputationContext & context )
static

在文件 calculus_inverse.cpp 第 83 行定义.

85{
86 for (const auto& child : children) {
88 return true;
89 }
90 }
91 return false;
92}
static bool calculus_utils_contains_nonreal_sqrt(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context)

引用了 any_nonreal_sqrt(), calculus_utils_contains_nonreal_sqrt() , 以及 context.

被这些函数引用 any_nonreal_sqrt() , 以及 calculus_utils_contains_nonreal_sqrt().

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

◆ any_transcendental()

bool LMCAS::any_transcendental ( const std::vector< std::shared_ptr< const SymbolicNode > > & nodes,
const std::string & var )
static

判断表达式 AST 中是否包含依赖指定变量的超越函数.

递归遍历 AST,若发现任何 FunctionNode 类型为 Sin/Cos/Exp/Ln/Tan 且其参数依赖 var,则返回 true.

参数
[in]node当前 AST 节点
[in]var目标变量名
返回
包含超越函数返回 true

在文件 transcendental_rewrite.cpp 第 481 行定义.

483 {
484 for (const auto& node : nodes) {
485 if (tf_contains_transcendental(node, var)) {
486 return true;
487 }
488 }
489 return false;
490}
bool tf_contains_transcendental(const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)

引用了 any_transcendental() , 以及 tf_contains_transcendental().

被这些函数引用 any_transcendental() , 以及 tf_contains_transcendental().

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

◆ append_factor_solutions()

void LMCAS::append_factor_solutions ( const Polynomial< Rational > & factor,
int multiplicity,
const std::string & var,
std::vector< std::shared_ptr< SymbolicExpr > > & results,
ComputationContext & context )
static

在文件 solve_polynomial.cpp 第 55 行定义.

57 {
58 if (factor.degree() <= 0) { return; }
59 auto symbolic = rational_to_symbolic_poly(factor);
60 auto solutions = factor.degree() <= 4 ?
61 solve_closed_form_poly(symbolic, var, context) :
62 detail::make_rootof_solutions_impl(symbolic, var, context);
63 for (int copy = 0; copy < multiplicity; ++copy) {
64 results.insert(results.end(), solutions.begin(), solutions.end());
65 }
66}
int degree() const
获取多项式的次数
static std::vector< std::shared_ptr< SymbolicExpr > > solve_closed_form_poly(const Polynomial< SymbolicPolyCoeff > &poly, const std::string &var, ComputationContext &context)
static Polynomial< SymbolicPolyCoeff > rational_to_symbolic_poly(const Polynomial< Rational > &rat_poly)

引用了 append_factor_solutions(), context, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::detail::make_rootof_solutions_impl(), rational_to_symbolic_poly() , 以及 solve_closed_form_poly().

被这些函数引用 append_factor_solutions() , 以及 LMCAS::polynomial_solver_detail::solve_by_factoring_impl().

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

◆ append_product_families()

void LMCAS::append_product_families ( ParametricSolutions & values,
const std::set< std::string > & original_names,
std::vector< ParametricSolution > & families )
static

在文件 solve_visitor.cpp 第 266 行定义.

267 {
268 for (auto& family : values.values) {
269 auto occupied = original_names;
270 const auto value_names = detail::all_variable_names(detail::node(family.value));
271 occupied.insert(value_names.begin(), value_names.end());
272 for (auto& parameter : family.integer_parameters) {
273 if (!original_names.count(parameter)) { continue; }
274 std::string fresh = "_k";
275 for (std::size_t suffix = 1; occupied.count(fresh); ++suffix) {
276 fresh = "_k" + std::to_string(suffix);
277 }
278 auto symbol = SymbolicExpr::variable(fresh);
279 family.value = substitute_raw(family.value, parameter, symbol);
280 for (auto& condition : family.conditions) {
281 condition = substitute_raw(condition, parameter, symbol);
282 }
283 parameter = fresh;
284 occupied.insert(fresh);
285 }
286 families.push_back(std::move(family));
287 }
288}
std::set< std::string > all_variable_names(const SymbolicNodePtr &expression, RewriteBudget *budget=nullptr)
ExprPtr substitute_raw(const ExprPtr &expression, const std::string &variable, const ExprPtr &value)
std::vector< ParametricSolution > values

引用了 LMCAS::detail::all_variable_names(), append_product_families(), LMCAS::detail::node(), substitute_raw() , 以及 LMCAS::ParametricSolutions::values.

被这些函数引用 append_product_families() , 以及 solve_product_set().

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

◆ append_product_roots()

Result< void > LMCAS::append_product_roots ( FiniteSolutions & values,
std::size_t multiplicity,
std::vector< FiniteSolution > & finite )
static

在文件 solve_visitor.cpp 第 244 行定义.

245 {
246 for (auto& value : values.values) {
247 if (value.multiplicity > std::numeric_limits<std::size_t>::max() / multiplicity) {
248 return Result<void>::failure(CasErrc::ResourceLimit, "root multiplicity overflow", "solve.product");
249 }
250 value.multiplicity *= multiplicity;
251 auto existing = std::find_if(finite.begin(), finite.end(), [&](const FiniteSolution& candidate) {
252 return detail::node(candidate.value)->equals(*detail::node(value.value)) &&
253 candidate.conditions.empty() && value.conditions.empty();
254 });
255 if (existing == finite.end()) { finite.push_back(std::move(value)); }
256 else {
257 if (existing->multiplicity > std::numeric_limits<std::size_t>::max() - value.multiplicity) {
258 return Result<void>::failure(CasErrc::ResourceLimit, "root multiplicity overflow", "solve.product");
259 }
260 existing->multiplicity += value.multiplicity;
261 }
262 }
263 return Result<void>::success();
264}
std::vector< FiniteSolution > values

引用了 append_product_roots(), LMCAS::Result< T >::failure(), ResourceLimit, LMCAS::Result< T >::success(), value , 以及 LMCAS::FiniteSolutions::values.

被这些函数引用 append_product_roots() , 以及 solve_product_set().

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

◆ apply_assumption_decl_checked()

AssumptionVoidResult LMCAS::apply_assumption_decl_checked ( AssumptionContext & ctx,
const AssumptionDecl & decl )
inline

在文件 assumption_context.hpp 第 450 行定义.

452 {
453 switch (decl.type()) {
455 return ctx.assume_domain_checked(decl.symbol(), decl.domain());
457 return ctx.assume_sign_checked(decl.symbol(), decl.sign());
459 return ctx.assume_checked(decl.relation());
460 }
462 CasErrc::InternalInvariant, "unknown assumption declaration type", "with_assumptions");
463}
const SymbolicExpr & relation() const
const std::string & symbol() const
static Result failure(CasErrc code, std::string message, std::string operation={})

引用了 apply_assumption_decl_checked(), LMCAS::AssumptionDecl::Domain, LMCAS::AssumptionDecl::domain(), LMCAS::Result< void >::failure(), InternalInvariant, LMCAS::AssumptionDecl::Relation, LMCAS::AssumptionDecl::relation(), LMCAS::AssumptionDecl::Sign, LMCAS::AssumptionDecl::sign(), LMCAS::AssumptionDecl::symbol() , 以及 LMCAS::AssumptionDecl::type().

被这些函数引用 apply_assumption_decl_checked(), with_assumptions() , 以及 with_assumptions().

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

◆ apply_hensel_lift_steps()

bool LMCAS::apply_hensel_lift_steps ( const MultiPoly & poly,
std::vector< MultiPoly > & factors,
const std::string & lift_var,
int lift_var_idx,
const Rational & eval_point,
int degree_bound,
int factor_count )
static

在文件 multivariate_hensel.cpp 第 180 行定义.

182 {
183 const auto& vars = poly.variables();
184 auto shift_powers = lifting_shift_powers(vars, lift_var_idx,
185 eval_point, degree_bound);
186 for (int k = 1; k <= degree_bound; ++k) {
187 MultiPoly product = truncated_factor_product(factors, lift_var, k + 1);
188 MultiPoly poly_trunc = truncate_mod_var(poly, lift_var, k + 1);
189 MultiPoly error = poly_trunc - product;
190 if (error.is_zero()) { continue; }
191 auto error_k = lifting_error_coefficient(error, lift_var, lift_var_idx,
192 eval_point, k, shift_powers, vars);
193 if (error_k.is_zero()) { continue; }
194 auto cofactors = evaluated_lifting_cofactors(factors, lift_var,
195 eval_point, vars);
196 std::vector<MultiPoly> corrections = multivariate_diophantine(
197 cofactors, error_k, lift_var, eval_point, k + 1);
198 if (corrections.size() != static_cast<size_t>(factor_count)) { return false; }
199 for (int i = 0; i < factor_count; ++i) {
200 if (corrections[i].is_zero()) { continue; }
201 MultiPoly correction_poly = corrections[i] * shift_powers[k];
202 factors[i] = factors[i] + correction_poly;
203 }
204 MultiPoly verify_product = truncated_factor_product(factors, lift_var, k + 1);
205 MultiPoly verify_error = poly_trunc - verify_product;
206 if (!lifting_residual_is_zero(verify_error, lift_var_idx, k)) { break; }
207 }
208 return true;
209}
bool is_zero(const SymbolicExpr &expression)
__attribute__((visibility("default"))) VectorCalculusFieldResult gradient_checked(const std __attribute__((visibility("default"))) VectorCalculusFieldResult gradient_checked(const std __attribute__((visibility("default"))) VectorField gradient(const std const std::vector< std::string > & vars
static MultiPoly truncate_mod_var(const MultiPoly &poly, const std::string &var, int degree_bound)
将 MultiPoly 截断为关于指定变量次数 < degree_bound 的部分
static std::vector< MultiPoly > lifting_shift_powers(const std::vector< std::string > &vars, int lift_var_idx, const Rational &eval_point, int degree_bound)
static MultiPoly truncated_factor_product(const std::vector< MultiPoly > &factors, const std::string &variable, int degree_bound)
static bool lifting_residual_is_zero(const MultiPoly &verify_error, int lift_var_idx, int k)
static MultiPoly lifting_error_coefficient(const MultiPoly &error, const std::string &lift_var, int lift_var_idx, const Rational &eval_point, int k, const std::vector< MultiPoly > &shift_powers, const std::vector< std::string > &vars)
std::vector< MultiPoly > multivariate_diophantine(const std::vector< MultiPoly > &factors, const MultiPoly &target, const std::string &var, const Rational &eval_point, int degree_bound)
多元丢番图方程求解器
static std::vector< MultiPoly > evaluated_lifting_cofactors(const std::vector< MultiPoly > &factors, const std::string &lift_var, const Rational &eval_point, const std::vector< std::string > &vars)

引用了 apply_hensel_lift_steps(), evaluated_lifting_cofactors(), lifting_error_coefficient(), lifting_residual_is_zero(), lifting_shift_powers(), multivariate_diophantine(), truncate_mod_var(), truncated_factor_product() , 以及 vars.

被这些函数引用 apply_hensel_lift_steps() , 以及 multivariate_hensel_lift().

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

◆ approx_real()

ExprResult LMCAS::approx_real ( double value)

在文件 expr_values.cpp 第 93 行定义.

93 {
94 if (!std::isfinite(value)) {
96 "approximate real must be finite", kApproxOperation);
97 }
98 try {
99 return ExprResult::success(SymbolicExpr::number(value));
100 } catch (const std::bad_alloc&) {
102 "approximate real allocation failed", kApproxOperation);
103 } catch (const std::exception& error) {
105 }
106}
constexpr const char * kApproxOperation

引用了 approx_real(), LMCAS::expr_detail::expr_common::expression_failure(), InternalInvariant, InvalidArgument, LMCAS::expr_detail::expr_common::kApproxOperation, ResourceLimit, LMCAS::Result< ExprPtr >::success() , 以及 value.

被这些函数引用 approx_real() , 以及 LMCAS::expr_detail::ExprParser::parse_approx_literal().

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

◆ arc_length_x_checked() [1/2]

ExpressionResult LMCAS::arc_length_x_checked ( std::shared_ptr< SymbolicExpr > fx,
std::shared_ptr< SymbolicExpr > a,
std::shared_ptr< SymbolicExpr > b )

在文件 symbolic_geometry.cpp 第 264 行定义.

268 {
270 return arc_length_x_checked(std::move(fx), std::move(a), std::move(b), context);
271}
ExpressionResult arc_length_x_checked(std::shared_ptr< SymbolicExpr > fx, std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b, ComputationContext &context)

引用了 a, arc_length_x_checked(), b , 以及 context.

函数调用图:

◆ arc_length_x_checked() [2/2]

ExpressionResult LMCAS::arc_length_x_checked ( std::shared_ptr< SymbolicExpr > fx,
std::shared_ptr< SymbolicExpr > a,
std::shared_ptr< SymbolicExpr > b,
ComputationContext & context )

在文件 symbolic_geometry.cpp 第 253 行定义.

258 {
259 return arc_length_checked_impl(
260 std::move(fx), std::move(a), std::move(b), "x",
261 context, "arc_length_x");
262}

引用了 a, arc_length_x_checked(), b , 以及 context.

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

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

◆ arc_length_y_checked() [1/2]

ExpressionResult LMCAS::arc_length_y_checked ( std::shared_ptr< SymbolicExpr > fy,
std::shared_ptr< SymbolicExpr > a,
std::shared_ptr< SymbolicExpr > b )

在文件 symbolic_geometry.cpp 第 307 行定义.

311 {
313 return arc_length_y_checked(std::move(fy), std::move(a), std::move(b), context);
314}
ExpressionResult arc_length_y_checked(std::shared_ptr< SymbolicExpr > fy, std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b, ComputationContext &context)

引用了 a, arc_length_y_checked(), b , 以及 context.

函数调用图:

◆ arc_length_y_checked() [2/2]

ExpressionResult LMCAS::arc_length_y_checked ( std::shared_ptr< SymbolicExpr > fy,
std::shared_ptr< SymbolicExpr > a,
std::shared_ptr< SymbolicExpr > b,
ComputationContext & context )

在文件 symbolic_geometry.cpp 第 296 行定义.

301 {
302 return arc_length_checked_impl(
303 std::move(fy), std::move(a), std::move(b), "y",
304 context, "arc_length_y");
305}

引用了 a, arc_length_y_checked(), b , 以及 context.

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

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

◆ asin() [1/2]

ExprResult LMCAS::asin ( const ExprPtr & expression)

在文件 expr_elementary.cpp 第 81 行定义.

81 {
83 return asin(expression, context);
84}
ExprResult asin(const ExprPtr &expression, ComputationContext &context)

引用了 asin() , 以及 context.

函数调用图:

◆ asin() [2/2]

ExprResult LMCAS::asin ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_elementary.cpp 第 74 行定义.

74 {
75 auto valid = require_dimensionless(expression, "asin");
76 if (!valid) { return valid; }
77 return make_unary_function_expr(expression, context, "asin",
79}

引用了 LMCAS::FunctionNode::ArcSin, asin(), context, LMCAS::expr_detail::expr_common::make_unary_function_expr() , 以及 LMCAS::expr_detail::expr_common::require_dimensionless().

被这些函数引用 asin(), asin() , 以及 LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function().

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

◆ assemble_frobenius_polynomial()

std::shared_ptr< SymbolicExpr > LMCAS::assemble_frobenius_polynomial ( const std::vector< double > & a,
const std::shared_ptr< SymbolicExpr > & x_minus_x0 )
static

在文件 ode_frobenius.cpp 第 118 行定义.

120 {
121 const int order = static_cast<int>(a.size()) - 1;
122 auto series_sol = SymbolicExpr::number(0);
123 for (int k = 0; k <= order; ++k) {
124 if (std::abs(a[k]) < 1e-15) {
125 continue;
126 }
127 auto coeff = SymbolicExpr::number(a[k]);
128 auto power_term = (k == 0) ? SymbolicExpr::number(1)
129 : SymbolicExpr::power(x_minus_x0, SymbolicExpr::number(k));
130 series_sol = SymbolicExpr::add(series_sol,
131 SymbolicExpr::multiply(coeff, power_term));
132 }
133
134 return series_sol;
135}
ExprResult e()
const std::vector< FGLMPoly > const MonomialOrder & order

引用了 a, assemble_frobenius_polynomial(), e() , 以及 order.

被这些函数引用 assemble_frobenius_polynomial(), ordinary_frobenius_solution() , 以及 singular_frobenius_solution().

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

◆ asymptote_candidates()

SymbolicExprVectorResult LMCAS::asymptote_candidates ( const std::shared_ptr< SymbolicExpr > & denominator,
const std::string & var,
ComputationContext & context,
const std::string & operation )
static

在文件 calculus_asymptotes.cpp 第 165 行定义.

169{
170 auto solved = solve_equation(denominator, var, context, SolveOptions{});
171 if (!solved) {
172 return SymbolicExprVectorResult::failure(solved.error());
173 }
174 const auto& zero_set = solved.value();
175 const auto* finite = std::get_if<FiniteSolutions>(&zero_set);
176 if (!std::holds_alternative<EmptySolutions>(zero_set) && !finite) {
179 "asymptote denominator zeros are outside the finite exact support domain",
180 operation);
181 }
182 std::vector<std::shared_ptr<SymbolicExpr>> zeros;
183 if (!finite) {
184 return SymbolicExprVectorResult::success(std::move(zeros));
185 }
186 zeros.reserve(finite->values.size());
187 for (const auto& solution : finite->values) {
188 if (!solution.value || !LMCAS::detail::node(solution.value)) {
191 "checked solver returned a null vertical-asymptote candidate", operation);
192 }
193 auto candidate = rootof_simplify(solution.value);
194 if (!candidate || !LMCAS::detail::node(candidate)) {
197 "checked solver returned a malformed vertical-asymptote candidate", operation);
198 }
202 "vertical-asymptote candidate could not be reduced to an exact explicit point",
203 operation);
204 }
205 zeros.push_back(candidate);
206 }
207 return SymbolicExprVectorResult::success(std::move(zeros));
208}
bool contains_node_type(const SymbolicNodePtr &root)
std::shared_ptr< SymbolicExpr > rootof_simplify(const std::shared_ptr< SymbolicExpr > &rootof_expr)
LMCAS::SolveResult solve_equation(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)
const ExprPtr & denominator
方程求解选项,控制数值求解行为和结果形式.

引用了 asymptote_candidates(), LMCAS::detail::contains_node_type(), context, denominator, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), Inconclusive, InternalInvariant, LMCAS::detail::node(), rootof_simplify(), solve_equation(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success() , 以及 LMCAS::Result< T >::value().

被这些函数引用 asymptote_candidates() , 以及 collect_vertical_asymptotes().

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

◆ asymptotes_checked() [1/2]

AsymptoteAnalysisResult LMCAS::asymptotes_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var )

在文件 calculus_asymptotes.cpp 第 404 行定义.

406{
408 return asymptotes_checked(f, var, context);
409}
AsymptoteAnalysisResult asymptotes_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, ComputationContext &context)

引用了 asymptotes_checked() , 以及 context.

函数调用图:

◆ asymptotes_checked() [2/2]

AsymptoteAnalysisResult LMCAS::asymptotes_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
ComputationContext & context )

在文件 calculus_asymptotes.cpp 第 373 行定义.

376{
377 try {
378 AsymptoteResult result;
379 const std::string operation = "asymptotes";
380 auto input = calculus_utils_validate_expr(f, var, context, operation);
381 if (!input) {
382 return AsymptoteAnalysisResult::failure(input.error());
383 }
384 auto pos_inf = SymbolicExpr::infinity(1);
385 auto neg_inf = SymbolicExpr::infinity(-1);
386 auto vertical = collect_vertical_asymptotes(f, var, context, result, operation);
387 if (!vertical) {
388 return AsymptoteAnalysisResult::failure(vertical.error());
389 }
390 auto infinite = collect_infinite_asymptotes(f, var, pos_inf, neg_inf, context, result);
391 if (!infinite) {
392 return AsymptoteAnalysisResult::failure(infinite.error());
393 }
394 return AsymptoteAnalysisResult::success(std::move(result));
395 } catch (const std::bad_alloc&) {
397 CasErrc::ResourceLimit, "asymptote analysis allocation failed", "asymptotes");
398 } catch (const std::exception& ex) {
400 CasErrc::InternalInvariant, ex.what(), "asymptotes");
401 }
402}
Result< void > calculus_utils_validate_expr(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const std::string &operation)
static Result< void > collect_vertical_asymptotes(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, ComputationContext &context, AsymptoteResult &result, const std::string &operation)
static Result< void > collect_infinite_asymptotes(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &pos_inf, const std::shared_ptr< SymbolicExpr > &neg_inf, ComputationContext &context, AsymptoteResult &result)
根据左右极限与函数值,在给定上下文假设下证明实数域中的连续性分类。 跳跃与可去间断的比较需证明逐点不等,相等性需保证各值有定义;形式非恒等不足以证明二者。 参数值或有定义性未确定时返回 Inconclu...

引用了 asymptotes_checked(), LMCAS::calculus_utils_detail::calculus_utils_validate_expr(), collect_infinite_asymptotes(), collect_vertical_asymptotes(), context, LMCAS::Result< AsymptoteResult >::failure(), InternalInvariant, ResourceLimit , 以及 LMCAS::Result< AsymptoteResult >::success().

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

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

◆ asymptotic_expand()

std::shared_ptr< SymbolicExpr > LMCAS::asymptotic_expand ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
int order )

通过 x = 1/t 替换,在 t=0 处做 Taylor 展开,再回代 t = 1/x, 得到按 x 递减幂次的渐近展开.

回代 t = 1/x

在文件 series_expansions.cpp 第 654 行定义.

655 {
657 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
658 (context).limits().max_ast_nodes, "transform");
659 if (!f || order < 0) {
660 return nullptr;
661 }
662 /// 通过 x = 1/t 替换,在 t=0 处做 Taylor 展开,再回代 t = 1/x,
663 /// 得到按 x 递减幂次的渐近展开.
664 auto x = SymbolicExpr::variable(var);
665 std::string tname = var + "__asym_t";
666 auto t = SymbolicExpr::variable(tname);
667 auto inv_t = SymbolicExpr::divide(SymbolicExpr::number(1), t);
668 auto g = detail::make_expression_ptr(detail::substitute_node(detail::node(f), var, detail::node(inv_t), transform_budget));
669 if (!g) {
670 return nullptr;
671 }
673 auto taylor_t = g->series(tname, SymbolicExpr::number(0), order + 1);
674 if (!taylor_t) {
675 return nullptr;
676 }
677 /// 回代 t = 1/x
678 auto inv_x = SymbolicExpr::divide(SymbolicExpr::number(1), x);
679 auto back = detail::make_expression_ptr(detail::substitute_node(detail::node(taylor_t), tname, detail::node(inv_x), transform_budget));
680 if (!back) {
681 return nullptr;
682 }
683 return detail::make_expression_ptr(detail::normalize_node(detail::node(back), transform_budget));
684}
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)

引用了 asymptotic_expand(), context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), order, LMCAS::detail::substitute_node() , 以及 t.

被这些函数引用 asymptotic_expand().

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

◆ atan() [1/2]

ExprResult LMCAS::atan ( const ExprPtr & expression)

在文件 expr_elementary.cpp 第 105 行定义.

105 {
107 return atan(expression, context);
108}
ExprResult atan(const ExprPtr &expression, ComputationContext &context)

引用了 atan() , 以及 context.

函数调用图:

◆ atan() [2/2]

ExprResult LMCAS::atan ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_elementary.cpp 第 98 行定义.

98 {
99 auto valid = require_dimensionless(expression, "atan");
100 if (!valid) { return valid; }
101 return make_unary_function_expr(expression, context, "atan",
103}

引用了 LMCAS::FunctionNode::ArcTan, atan(), context, LMCAS::expr_detail::expr_common::make_unary_function_expr() , 以及 LMCAS::expr_detail::expr_common::require_dimensionless().

被这些函数引用 atan(), atan() , 以及 LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function().

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

◆ attach_unit() [1/2]

QuantityResult LMCAS::attach_unit ( const std::shared_ptr< SymbolicExpr > & value,
const std::string & unit,
ComputationContext & context )

在文件 quantity.cpp 第 91 行定义.

93 {
94 auto step = context.consume_steps(1, kOperation);
95 if (!step) return QuantityResult::failure(step.error());
96 if (!value || !detail::node(value)) {
97 return failure(CasErrc::InvalidArgument, "quantity value cannot be null");
98 }
99 if (std::dynamic_pointer_cast<const QuantityNode>(detail::node(value))) {
100 return failure(CasErrc::UnitInvalid, "a quantity cannot receive a second unit");
101 }
102 auto definition = context.units().resolve(unit);
103 if (!definition) return QuantityResult::failure(definition.error());
104 return make_quantity(detail::node(value), definition.value().dimension,
105 definition.value().scale_to_base, unit);
106}
QuantityResult make_quantity(std::shared_ptr< const SymbolicNode > value, DimensionSignature dimension, Rational scale, std::string display)
std::string UnitDefinition definition
const std::string & unit

引用了 attach_unit(), context, definition, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InvalidArgument, LMCAS::detail::node(), unit, UnitInvalid , 以及 value.

被这些函数引用 attach_unit(), attach_unit(), with_unit() , 以及 with_unit_definition().

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

◆ attach_unit() [2/2]

QuantityResult LMCAS::attach_unit ( const std::shared_ptr< SymbolicExpr > & value,
std::string display_unit,
UnitDefinition definition,
ComputationContext & context )

在文件 quantity.cpp 第 108 行定义.

111 {
112 auto step = context.consume_steps(1, kOperation);
113 if (!step) return QuantityResult::failure(step.error());
114 if (!value || !detail::node(value)) {
115 return failure(CasErrc::InvalidArgument, "quantity value cannot be null");
116 }
117 if (std::dynamic_pointer_cast<const QuantityNode>(detail::node(value))) {
118 return failure(CasErrc::UnitInvalid, "a quantity cannot receive a second unit");
119 }
120 if (display_unit.empty() || definition.scale_to_base <= Rational(0)) {
121 return failure(CasErrc::UnitInvalid, "resolved unit definition is invalid");
122 }
123 return make_quantity(detail::node(value), std::move(definition.dimension),
124 std::move(definition.scale_to_base),
125 std::move(display_unit));
126}
QuantityResult failure(CasErrc code, std::string message)
std::string display_unit

引用了 attach_unit(), context, definition, display_unit, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InvalidArgument, LMCAS::detail::node(), UnitInvalid , 以及 value.

函数调用图:

◆ berlekamp_factor()

BerlekampResult LMCAS::berlekamp_factor ( const Polynomial< Rational > & poly,
int64_t prime )

零多项式或常数多项式:无因子

显式和自动模数都必须保持次数且使约化多项式无平方。

将多项式约化到 F_p

首一化

线性多项式:本身不可约

构造 Berlekamp 矩阵 Q

计算 (Q - I)^T 的零空间

存储零空间信息

零空间维度 = 1:多项式在 F_p 上不可约

零空间维度 > 1:多项式可分解,使用基向量分裂

在文件 berlekamp.cpp 第 31 行定义.

33 {
34
35 BerlekampResult result;
36
37 /// 零多项式或常数多项式:无因子
38 if (poly.is_zero() || poly.degree() <= 0) {
39 return result;
40 }
41
42 /// 显式和自动模数都必须保持次数且使约化多项式无平方。
43 int64_t p = prime;
44 if (p > 0) {
45 if (!bk_is_suitable_prime(poly, p)) {
46 return result;
47 }
48 } else {
49 p = bk_select_prime(poly);
50 if (p < 0) {
51 return result;
52 }
53 }
54
55 result.prime = p;
56
57 /// 将多项式约化到 F_p
58 std::vector<int64_t> f_coeffs = bk_reduce_to_mod_coeffs(poly, p);
59
60 /// 首一化
61 if (!f_coeffs.empty()) {
62 int64_t lc = f_coeffs.back();
63 if (lc != 1) {
64 int64_t lc_inv = bk_mod_inverse(lc, p);
65 for (auto& c : f_coeffs) {
66 c = (c * lc_inv) % p;
67 }
68 }
69 }
70
71 /// 线性多项式:本身不可约
72 if (f_coeffs.size() <= 2) {
73 result.factors.push_back(bk_to_poly_modint(f_coeffs, p, poly.variable_name));
74 return result;
75 }
76
77 /// 构造 Berlekamp 矩阵 Q
78 auto Q = bk_build_q_matrix(f_coeffs, p);
79
80 /// 计算 (Q - I)^T 的零空间
81 auto null_basis = bk_null_space(Q, p);
82 int null_dim = static_cast<int>(null_basis.size());
83
84 /// 存储零空间信息
85 result.null_space_dim = null_dim;
86 result.null_space_basis = null_basis;
87
88 /// 零空间维度 = 1:多项式在 F_p 上不可约
89 if (null_dim <= 1) {
90 result.factors.push_back(bk_to_poly_modint(f_coeffs, p, poly.variable_name));
91 return result;
92 }
93
94 /// 零空间维度 > 1:多项式可分解,使用基向量分裂
95 auto split = bk_split_factors(f_coeffs, null_basis, null_dim, p);
96 for (const auto& factor_coeffs : split) {
97 result.factors.push_back(bk_to_poly_modint(factor_coeffs, p, poly.variable_name));
98 }
99 return result;
100}
std::string variable_name
变量名
bool is_zero() const
判断是否为零多项式
int64_t bk_mod_inverse(int64_t a, int64_t p)
模 p 下求乘法逆元.
std::vector< std::vector< int64_t > > bk_build_q_matrix(const std::vector< int64_t > &f, int64_t p)
构造 F_p 上的 Berlekamp 矩阵 Q。
bool bk_is_suitable_prime(const Polynomial< Rational > &poly, int64_t prime)
判断素数是否保持多项式次数和无平方性质。
std::vector< std::vector< int64_t > > bk_null_space(const std::vector< std::vector< int64_t > > &Q, int64_t p)
std::vector< std::vector< int64_t > > bk_split_factors(const std::vector< int64_t > &f_coeffs, const std::vector< std::vector< int64_t > > &null_basis, int null_dim, int64_t p)
std::vector< int64_t > bk_reduce_to_mod_coeffs(const Polynomial< Rational > &poly, int64_t p)
以系数分母的 LCM 清除分母,再逐项取模 p。
int64_t bk_select_prime(const Polynomial< Rational > &poly)
从小素数表中选取适合 Berlekamp 分解的素数。
const VectorField const VectorField & c
static Polynomial< ModInt > bk_to_poly_modint(const std::vector< int64_t > &coeffs, int64_t p, const std::string &var)
将模 p 系数向量转换为 Polynomial<ModInt>.
Berlekamp 分解结果。
int null_space_dim
零空间维度,等于不可约因子数。
std::vector< std::vector< int64_t > > null_space_basis
零空间基向量。
std::vector< Polynomial< ModInt > > factors
模 p 下的不可约因子。
int64_t prime
使用的素数。

引用了 berlekamp_factor(), LMCAS::berlekamp_detail::bk_build_q_matrix(), LMCAS::berlekamp_detail::bk_is_suitable_prime(), LMCAS::berlekamp_detail::bk_mod_inverse(), LMCAS::berlekamp_detail::bk_null_space(), LMCAS::berlekamp_detail::bk_reduce_to_mod_coeffs(), LMCAS::berlekamp_detail::bk_select_prime(), LMCAS::berlekamp_detail::bk_split_factors(), bk_to_poly_modint(), c, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::BerlekampResult::factors, LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::BerlekampResult::null_space_basis, LMCAS::BerlekampResult::null_space_dim, LMCAS::BerlekampResult::prime, prime , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 berlekamp_factor() , 以及 LMCAS::anonymous_namespace{univariate_factor_bridge.cpp}::bridge_reduction().

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

◆ bernoulli_integer_exponent()

std::optional< int > LMCAS::bernoulli_integer_exponent ( const NumberNode & number)
static

在文件 ode_classification.cpp 第 188 行定义.

189{
190 std::optional<std::int64_t> value;
191 if (std::holds_alternative<BigInt>(number.value())) {
192 value = std::get<BigInt>(number.value()).try_to_int64();
193 } else if (std::holds_alternative<Rational>(number.value())) {
194 const auto& rational = std::get<Rational>(number.value());
195 if (!rational.is_integer()) {
196 return std::nullopt;
197 }
198 value = rational.to_bigint().try_to_int64();
199 }
200 if (!value || *value < std::numeric_limits<int>::min() ||
201 *value > std::numeric_limits<int>::max()) {
202 return std::nullopt;
203 }
204 return static_cast<int>(*value);
205}
const std::variant< BigInt, Rational > & value() const noexcept
ExprResult rational(const Rational &value)

引用了 bernoulli_integer_exponent(), rational(), LMCAS::NumberNode::value() , 以及 value.

被这些函数引用 bernoulli_integer_exponent() , 以及 extract_bernoulli_factor().

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

◆ binding()

BindingResult LMCAS::binding ( ExprPtr symbol,
ExprPtr value )

在文件 expr_transform.cpp 第 84 行定义.

84 {
85 if (!symbol || !LMCAS::detail::node(symbol)) {
87 CasErrc::InvalidArgument, "binding symbol cannot be null",
89 }
92 CasErrc::InvalidArgument, "binding value cannot be null",
94 }
95 const auto variable = std::dynamic_pointer_cast<const VariableNode>(
96 LMCAS::detail::node(symbol));
97 if (!variable || variable->is_constant()) {
100 "binding left-hand side must be a symbol",
102 }
103 return BindingResult::success(Binding{std::move(symbol), std::move(value)});
104}
constexpr const char * kSubstituteOperation

引用了 binding, LMCAS::Result< Binding >::failure(), InvalidArgument, LMCAS::expr_detail::expr_common::kSubstituteOperation, LMCAS::detail::node(), LMCAS::Result< Binding >::success(), value , 以及 variable.

函数调用图:

◆ bisection_checked() [1/2]

NumericRootResult LMCAS::bisection_checked ( const std::shared_ptr< SymbolicExpr > & function,
const std::string & variable,
lmmc_real_t lower,
lmmc_real_t upper,
ComputationContext & context,
const SolveOptions & options )

在文件 newton_raphson.cpp 第 326 行定义.

332 {
333 auto valid = invalid_root_options(options, kBisectionOperation);
334 if (!valid) {
335 return valid;
336 }
337 if (!function || variable.empty() || !std::isfinite(lower) ||
338 !std::isfinite(upper) || lower > upper) {
341 "bisection function, variable, and ordered finite interval are required",
342 kBisectionOperation);
343 }
346 kBisectionOperation);
347}
NumericRootResult run_bisection_backend(const std::shared_ptr< SymbolicExpr > &function, const std::string &variable, double lower, double upper, ComputationContext &context, const SolveOptions &options, const char *operation)
const std::string ComputationContext const SolveOptions & options

引用了 bisection_checked(), context, LMCAS::Result< std::optional< NumericRoot > >::failure(), function(), InvalidArgument, lower, options, upper , 以及 variable.

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

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

◆ bisection_checked() [2/2]

NumericRootResult LMCAS::bisection_checked ( const std::shared_ptr< SymbolicExpr > & function,
const std::string & variable,
lmmc_real_t lower,
lmmc_real_t upper,
const SolveOptions & options )

在文件 newton_raphson.cpp 第 349 行定义.

354 {
356 return bisection_checked(
358}
NumericRootResult bisection_checked(const std::shared_ptr< SymbolicExpr > &function, const std::string &variable, lmmc_real_t lower, lmmc_real_t upper, ComputationContext &context, const SolveOptions &options)

引用了 bisection_checked(), context, function(), lower, options, upper , 以及 variable.

函数调用图:

◆ bk_to_poly_modint()

Polynomial< ModInt > LMCAS::bk_to_poly_modint ( const std::vector< int64_t > & coeffs,
int64_t p,
const std::string & var )
static

将模 p 系数向量转换为 Polynomial<ModInt>.

参数
[in]coeffs系数向量(升幂排列)
[in]p素数模数
[in]var变量名
返回
对应的 Polynomial<ModInt>

直接构造,不调用 trim()(已保证无高次零系数)

在文件 berlekamp.cpp 第 15 行定义.

18 {
19
20 std::vector<ModInt> mod_coeffs;
21 mod_coeffs.reserve(coeffs.size());
22 for (int64_t c : coeffs) {
23 mod_coeffs.emplace_back(c, p);
24 }
25 /// 直接构造,不调用 trim()(已保证无高次零系数)
26 Polynomial<ModInt> result(var);
27 result.coeffs = std::move(mod_coeffs);
28 return result;
29}

引用了 bk_to_poly_modint(), c , 以及 LMCAS::Polynomial< CoeffType >::coeffs.

被这些函数引用 berlekamp_factor() , 以及 bk_to_poly_modint().

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

◆ build_euler_solution()

std::shared_ptr< SymbolicExpr > LMCAS::build_euler_solution ( const std::vector< CharRoot > & roots,
const std::string & x,
std::vector< std::string > & constants )
static

在文件 ode_linear.cpp 第 175 行定义.

179{
180 auto x_var = SymbolicExpr::variable(x);
181 auto ln_x = SymbolicExpr::ln(x_var);
182 std::shared_ptr<SymbolicExpr> solution = nullptr;
183 int const_idx = 1;
184
185 for (const auto& root : roots) {
186 for (int k = 0; k < root.multiplicity; ++k) {
187 std::shared_ptr<SymbolicExpr> log_factor = nullptr;
188 if (k > 0) {
189 log_factor = SymbolicExpr::power(ln_x, SymbolicExpr::number(k));
190 }
191
192 if (!root.is_complex) {
193 std::string c_name = "C" + std::to_string(const_idx++);
194 constants.push_back(c_name);
195 auto term = SymbolicExpr::variable(c_name);
196
197 auto exponent = clean_number(root.real_part);
198 term = SymbolicExpr::multiply(
199 term,
200 SymbolicExpr::power(x_var, exponent));
201 if (log_factor) {
202 term = SymbolicExpr::multiply(term, log_factor);
203 }
204 solution = solution ? SymbolicExpr::add(solution, term) : term;
205 } else {
206 std::string ca_name = "C" + std::to_string(const_idx++);
207 std::string cb_name = "C" + std::to_string(const_idx++);
208 constants.push_back(ca_name);
209 constants.push_back(cb_name);
210
211 auto alpha_expr = clean_number(root.real_part);
212 auto beta_expr = clean_number(root.imag_part);
213 auto beta_ln_x = SymbolicExpr::multiply(beta_expr, ln_x);
214 auto trig = SymbolicExpr::add(
215 SymbolicExpr::multiply(SymbolicExpr::variable(ca_name),
216 SymbolicExpr::cos(beta_ln_x)),
217 SymbolicExpr::multiply(SymbolicExpr::variable(cb_name),
218 SymbolicExpr::sin(beta_ln_x)));
219 auto term = SymbolicExpr::multiply(
220 SymbolicExpr::power(x_var, alpha_expr),
221 trig);
222 if (log_factor) {
223 term = SymbolicExpr::multiply(term, log_factor);
224 }
225 solution = solution ? SymbolicExpr::add(solution, term) : term;
226 }
227 }
228 }
229
230 return solution;
231}
ExprSetResult roots(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)
static std::shared_ptr< SymbolicExpr > clean_number(double val)

引用了 build_euler_solution(), clean_number(), exponent , 以及 roots().

被这些函数引用 build_euler_solution() , 以及 solve_euler_ode_impl().

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

◆ build_homogeneous_solution()

std::shared_ptr< SymbolicExpr > LMCAS::build_homogeneous_solution ( const std::vector< CharRoot > & roots,
const std::string & x,
std::vector< std::string > & constants )
static

根据特征根构造齐次通解.

  • 实根 r(重数 m):C_k * x^k * e^(rx),k = 0, ..., m-1
  • 复根 alpha+/-betai(重数 m):x^k * e^(alphax) * (C_a*cos(betax) + C_b*sin(betax))

实根: C_i * x^k * e^(r*x)

x^k 因子

e^(r*x) 因子。精确零才可省略;小的非零根仍改变解。

复根 alpha+/-betai: 产生两个基本解 C_a * x^k * e^(alphax) * cos(betax) C_b * x^k * e^(alphax) * sin(betax)

e^(alphax) 因子。精确零才可省略。

x^k 因子

构造 cos 项: Ca * x^k * e^(alphax) * cos(betax)

构造 sin 项: Cb * x^k * e^(alphax) * sin(betax)

在文件 ode_linear.cpp 第 82 行定义.

86{
87 auto x_var = SymbolicExpr::variable(x);
88 std::shared_ptr<SymbolicExpr> solution = nullptr;
89 int const_idx = 1;
90
91 for (const auto& root : roots) {
92 for (int k = 0; k < root.multiplicity; ++k) {
93 if (!root.is_complex) {
94 /// 实根: C_i * x^k * e^(r*x)
95 std::string c_name = "C" + std::to_string(const_idx++);
96 constants.push_back(c_name);
97 auto C = SymbolicExpr::variable(c_name);
98
99 std::shared_ptr<SymbolicExpr> term = C;
100
101 /// x^k 因子
102 if (k > 0) {
103 auto x_pow = SymbolicExpr::power(x_var, SymbolicExpr::number(k));
104 term = SymbolicExpr::multiply(term, x_pow);
105 }
106
107 /// e^(r*x) 因子。精确零才可省略;小的非零根仍改变解。
108 if (root.real_part != 0.0) {
109 auto r_expr = clean_number(root.real_part);
110 auto exp_arg = SymbolicExpr::multiply(r_expr, x_var);
111 auto exp_term = SymbolicExpr::exp(exp_arg);
112 term = SymbolicExpr::multiply(term, exp_term);
113 }
114
115 solution = solution ? SymbolicExpr::add(solution, term) : term;
116 } else {
117 /// 复根 alpha+/-betai: 产生两个基本解
118 /// C_a * x^k * e^(alphax) * cos(betax)
119 /// C_b * x^k * e^(alphax) * sin(betax)
120 std::string ca_name = "C" + std::to_string(const_idx++);
121 std::string cb_name = "C" + std::to_string(const_idx++);
122 constants.push_back(ca_name);
123 constants.push_back(cb_name);
124 auto Ca = SymbolicExpr::variable(ca_name);
125 auto Cb = SymbolicExpr::variable(cb_name);
126
127 auto beta_expr = clean_number(root.imag_part);
128 auto beta_x = SymbolicExpr::multiply(beta_expr, x_var);
129 auto cos_term = SymbolicExpr::cos(beta_x);
130 auto sin_term = SymbolicExpr::sin(beta_x);
131
132 /// e^(alphax) 因子。精确零才可省略。
133 std::shared_ptr<SymbolicExpr> exp_factor = nullptr;
134 if (root.real_part != 0.0) {
135 auto alpha_expr = clean_number(root.real_part);
136 auto exp_arg = SymbolicExpr::multiply(alpha_expr, x_var);
137 exp_factor = SymbolicExpr::exp(exp_arg);
138 }
139
140 /// x^k 因子
141 std::shared_ptr<SymbolicExpr> x_pow_factor = nullptr;
142 if (k > 0) {
143 x_pow_factor = SymbolicExpr::power(x_var, SymbolicExpr::number(k));
144 }
145
146 /// 构造 cos 项: Ca * x^k * e^(alphax) * cos(betax)
147 auto term_cos = Ca;
148 if (x_pow_factor) {
149 term_cos = SymbolicExpr::multiply(term_cos, x_pow_factor);
150 }
151 if (exp_factor) {
152 term_cos = SymbolicExpr::multiply(term_cos, exp_factor);
153 }
154 term_cos = SymbolicExpr::multiply(term_cos, cos_term);
155
156 /// 构造 sin 项: Cb * x^k * e^(alphax) * sin(betax)
157 auto term_sin = Cb;
158 if (x_pow_factor) {
159 term_sin = SymbolicExpr::multiply(term_sin, x_pow_factor);
160 }
161 if (exp_factor) {
162 term_sin = SymbolicExpr::multiply(term_sin, exp_factor);
163 }
164 term_sin = SymbolicExpr::multiply(term_sin, sin_term);
165
166 solution = solution ? SymbolicExpr::add(solution, term_cos) : term_cos;
167 solution = SymbolicExpr::add(solution, term_sin);
168 }
169 }
170 }
171
172 return solution;
173}

引用了 build_homogeneous_solution(), clean_number() , 以及 roots().

被这些函数引用 build_homogeneous_solution() , 以及 solve_higher_order_ode_impl().

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

◆ calculate_residue_checked() [1/2]

ExpressionResult LMCAS::calculate_residue_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & z,
const std::shared_ptr< SymbolicExpr > & z0,
int order )

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

245{
247 return calculate_residue_checked(f, z, z0, order, context);
248}
ExpressionResult calculate_residue_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &z, const std::shared_ptr< SymbolicExpr > &z0, int order, ComputationContext &context)

引用了 calculate_residue_checked(), context , 以及 order.

函数调用图:

◆ calculate_residue_checked() [2/2]

ExpressionResult LMCAS::calculate_residue_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & z,
const std::shared_ptr< SymbolicExpr > & z0,
int order,
ComputationContext & context )

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

209{
210 const std::string operation = "calculate_residue";
211 auto input = validate_complex_expr_point_input(f, z, z0, order, context, operation);
212 if (!input) return ExpressionResult::failure(input.error());
213 auto budget = context.consume_steps(static_cast<std::size_t>(order) * 12 + 12,
214 operation);
215 if (!budget) return ExpressionResult::failure(budget.error());
216
217 try {
218 auto calculated =
220 if (!calculated) return calculated;
221 auto result = std::move(calculated.value());
222 if (!result || !LMCAS::detail::node(result)) {
225 "residue could not be constructed in the supported symbolic domain",
226 operation);
227 }
228 return result;
229 } catch (const std::bad_alloc&) {
231 "allocation failed while calculating residue",
232 operation);
233 } catch (const std::exception& ex) {
235 ex.what(),
236 operation);
237 }
238}
static ExpressionResult calculate_residue_impl(const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::shared_ptr< SymbolicExpr > &, int, ComputationContext &)

引用了 calculate_residue_checked(), calculate_residue_impl(), context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive, InternalInvariant, LMCAS::detail::node(), order , 以及 ResourceLimit.

被这些函数引用 calculate_residue_checked(), calculate_residue_checked(), residue_checked() , 以及 residue_checked().

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

◆ calculate_residue_impl()

ExpressionResult LMCAS::calculate_residue_impl ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & z,
const std::shared_ptr< SymbolicExpr > & z0,
int order,
ComputationContext & context )
static

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

255 {
256 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
257 (context).limits().max_ast_nodes, "transform");
258 if (order < 1) return SymbolicExpr::number(0);
259
260 auto var_z = SymbolicExpr::variable(z);
261 auto z_minus_z0 = SymbolicExpr::add(var_z, SymbolicExpr::multiply(z0, SymbolicExpr::number(-1)));
262 auto pow_term = SymbolicExpr::power(z_minus_z0, SymbolicExpr::number(order));
263
264 auto F = SymbolicExpr::multiply(pow_term, f);
265
266 for (int i = 0; i < order - 1; i++) {
268 }
269
270 auto fact = BigInt::factorial_checked(BigInt(order - 1), context);
271 if (!fact) return ExpressionResult::failure(fact.error());
272
273 F = SymbolicExpr::divide(F, SymbolicExpr::number(fact.value()));
274
277} catch (const CasError& error) {
278 return ExpressionResult::failure(error);
279} catch (const std::bad_alloc&) {
280 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "calculate_residue_impl");
281} catch (const std::length_error& error) {
282 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "calculate_residue_impl");
283} catch (const std::exception& error) {
284 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "calculate_residue_impl");
285}
SymbolicNodePtr differentiate_node(const SymbolicNodePtr &node, const std::string &variable, RewriteBudget &budget, const FactsQuery &facts, Domain domain)

引用了 Both, calculate_residue_impl(), Complex, context, LMCAS::detail::differentiate_node(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), limit_expression_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 order.

被这些函数引用 calculate_residue_checked() , 以及 calculate_residue_impl().

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

◆ calculus_utils_contains_complex()

bool LMCAS::calculus_utils_contains_complex ( const std::shared_ptr< const SymbolicNode > & node)
static

在文件 calculus_inverse.cpp 第 13 行定义.

14{
15 if (!node) {
16 return false;
17 }
18
19 if (std::dynamic_pointer_cast<const ComplexNode>(node)) {
20 return true;
21 }
22 if (auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
23 for (const auto& argument : function->arguments()) {
24 if (calculus_utils_contains_complex(argument)) {
25 return true;
26 }
27 }
28 return false;
29 }
30 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
31 for (const auto& operand : add->operands()) {
33 return true;
34 }
35 }
36 return false;
37 }
38 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
39 for (const auto& operand : multiply->operands()) {
41 return true;
42 }
43 }
44 return false;
45 }
46 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
47 return calculus_utils_contains_complex(power->base()) ||
48 calculus_utils_contains_complex(power->exponent());
49 }
50 return false;
51}
static bool calculus_utils_contains_complex(const std::shared_ptr< const SymbolicNode > &node)

引用了 add(), calculus_utils_contains_complex() , 以及 function().

被这些函数引用 calculus_utils_contains_complex() , 以及 calculus_utils_extract_real_candidate().

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

◆ calculus_utils_contains_nonreal_sqrt()

bool LMCAS::calculus_utils_contains_nonreal_sqrt ( const std::shared_ptr< const SymbolicNode > & node,
ComputationContext & context )
static

在文件 calculus_inverse.cpp 第 94 行定义.

95{
96 if (!node) {
97 return false;
98 }
99
100 if (auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
102 return true;
103 }
104 return any_nonreal_sqrt(function->arguments(), context);
105 }
106 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
107 return any_nonreal_sqrt(add->operands(), context);
108 }
109 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
110 return any_nonreal_sqrt(multiply->operands(), context);
111 }
112 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
113 return calculus_utils_contains_nonreal_sqrt(power->base(), context) ||
115 }
116 if (auto complex = std::dynamic_pointer_cast<const ComplexNode>(node)) {
119 }
120 return false;
121}
static bool is_nonreal_sqrt(const FunctionNode &function, ComputationContext &context)
static bool any_nonreal_sqrt(const std::vector< std::shared_ptr< const SymbolicNode > > &children, ComputationContext &context)
ExprResult complex(ExprPtr real, ExprPtr imag)

引用了 add(), any_nonreal_sqrt(), calculus_utils_contains_nonreal_sqrt(), complex(), context, function() , 以及 is_nonreal_sqrt().

被这些函数引用 any_nonreal_sqrt(), calculus_utils_contains_nonreal_sqrt() , 以及 calculus_utils_extract_real_candidate().

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

◆ calculus_utils_extract_denominator()

std::shared_ptr< SymbolicExpr > LMCAS::calculus_utils_extract_denominator ( const std::shared_ptr< SymbolicExpr > & expr)
static

在文件 calculus_asymptotes.cpp 第 38 行定义.

40{
41 if (!expr || !LMCAS::detail::node(expr)) {
42 return nullptr;
43 }
44 auto factor = denominator_factor(LMCAS::detail::node(expr));
45 if (factor) {
47 }
48 auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(LMCAS::detail::node(expr));
49 if (!multiply) {
50 return nullptr;
51 }
52 std::vector<std::shared_ptr<const SymbolicNode>> factors;
53 for (const auto& operand : multiply->operands()) {
54 auto denominator = denominator_factor(operand);
55 if (denominator) factors.push_back(std::move(denominator));
56 }
57 if (factors.empty()) {
58 return nullptr;
59 }
60 if (factors.size() == 1) {
61 return LMCAS::detail::make_expression_ptr(factors[0]);
62 }
65}
static std::shared_ptr< const SymbolicNode > denominator_factor(const std::shared_ptr< const SymbolicNode > &node)

引用了 calculus_utils_extract_denominator(), denominator, denominator_factor(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node() , 以及 LMCAS::detail::node().

被这些函数引用 calculus_utils_extract_denominator() , 以及 collect_vertical_asymptotes().

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

◆ calculus_utils_extract_real_candidate()

CalculusRealCandidateStatus LMCAS::calculus_utils_extract_real_candidate ( const std::shared_ptr< SymbolicExpr > & candidate,
std::shared_ptr< SymbolicExpr > & real_candidate,
ComputationContext & context )
static

在文件 calculus_inverse.cpp 第 129 行定义.

132{
133
134 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
135 (context).limits().max_ast_nodes, "transform");
136 real_candidate.reset();
137 auto simplified_candidate = rootof_simplify(candidate);
138 if (!simplified_candidate || !LMCAS::detail::node(simplified_candidate)) {
140 }
143 }
146 }
147
148 if (auto complex = std::dynamic_pointer_cast<const ComplexNode>(
149 LMCAS::detail::node(simplified_candidate))) {
150 auto imag = detail::make_expression_ptr(detail::normalize_node(complex->imag(), transform_budget));
151 if (!imag || !LMCAS::detail::node(imag)) {
153 }
154 if (imag->is_zero()) {
155 auto real = detail::make_expression_ptr(detail::normalize_node(complex->real(), transform_budget));
156 if (!real || !LMCAS::detail::node(real)) {
158 }
159 real_candidate = real;
161 }
163 }
164
165 if (calculus_utils_contains_complex(LMCAS::detail::node(simplified_candidate))) {
167 }
168
169 real_candidate = simplified_candidate;
171}

引用了 calculus_utils_contains_complex(), calculus_utils_contains_nonreal_sqrt(), calculus_utils_extract_real_candidate(), complex(), LMCAS::detail::contains_node_type(), context, imag, Inconclusive, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), NonReal, LMCAS::detail::normalize_node(), Real, real() , 以及 rootof_simplify().

被这些函数引用 calculus_utils_extract_real_candidate() , 以及 verified_real_inverse_candidates().

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

◆ calculus_utils_is_minus_one()

bool LMCAS::calculus_utils_is_minus_one ( const std::shared_ptr< const NumberNode > & number)
static

在文件 calculus_asymptotes.cpp 第 82 行定义.

83{
84 if (!number) {
85 return false;
86 }
87 if (std::holds_alternative<BigInt>(number->value())) {
88 return std::get<BigInt>(number->value()) == BigInt(-1);
89 }
90 return std::get<Rational>(number->value()) == Rational(-1);
91}

引用了 calculus_utils_is_minus_one().

被这些函数引用 calculus_utils_is_minus_one() , 以及 calculus_utils_split_rational().

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

◆ calculus_utils_is_negative_number()

bool LMCAS::calculus_utils_is_negative_number ( const std::shared_ptr< const NumberNode > & number)
static

在文件 calculus_inverse.cpp 第 53 行定义.

54{
55 if (!number) {
56 return false;
57 }
58 if (std::holds_alternative<BigInt>(number->value())) {
59 return std::get<BigInt>(number->value()) < BigInt(0);
60 }
61 return std::get<Rational>(number->value()) < Rational(0);
62}

引用了 calculus_utils_is_negative_number().

被这些函数引用 calculus_utils_is_negative_number() , 以及 is_nonreal_sqrt().

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

◆ calculus_utils_oblique_from_rational()

bool LMCAS::calculus_utils_oblique_from_rational ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
std::shared_ptr< SymbolicExpr > & slope,
std::shared_ptr< SymbolicExpr > & intercept,
ComputationContext & context )
static

在文件 calculus_asymptotes.cpp 第 130 行定义.

135{
136
137 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
138 (context).limits().max_ast_nodes, "transform");
139 std::shared_ptr<SymbolicExpr> numerator;
140 std::shared_ptr<SymbolicExpr> denominator;
142 return false;
143 }
144
145 try {
146 auto num_poly = symbolic_to_poly<Rational>(detail::make_expression_ptr(detail::expand_node(detail::node(numerator), transform_budget)), var);
147 auto den_poly = symbolic_to_poly<Rational>(detail::make_expression_ptr(detail::expand_node(detail::node(denominator), transform_budget)), var);
148 if (!num_poly || !den_poly || den_poly.value().is_zero()) {
149 return false;
150 }
151 auto [quotient, remainder] = num_poly.value().div_mod(den_poly.value());
152 (void)remainder;
153 if (quotient.degree() != 1 || quotient.coeffs.size() < 2) {
154 return false;
155 }
156 intercept = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::number(quotient.coeffs[0])), transform_budget));
157 slope = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::number(quotient.coeffs[1])), transform_budget));
158 return !slope->is_zero();
159 } catch (const std::invalid_argument&) {
160 return false;
161 } catch (const std::out_of_range&) {
162 return false;
163 }
164}
SymbolicNodePtr expand_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
static bool calculus_utils_split_rational(const std::shared_ptr< SymbolicExpr > &expr, std::shared_ptr< SymbolicExpr > &numerator, std::shared_ptr< SymbolicExpr > &denominator, ComputationContext &context)

引用了 calculus_utils_oblique_from_rational(), calculus_utils_split_rational(), context, denominator, LMCAS::detail::expand_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 calculus_utils_oblique_from_rational() , 以及 collect_infinite_asymptotes().

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

◆ calculus_utils_product()

std::shared_ptr< SymbolicExpr > LMCAS::calculus_utils_product ( const std::vector< std::shared_ptr< const SymbolicNode > > & factors,
ComputationContext & context )
static

在文件 calculus_asymptotes.cpp 第 67 行定义.

69{
70
71 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
72 (context).limits().max_ast_nodes, "transform");
73 if (factors.empty()) {
74 return SymbolicExpr::number(1);
75 }
76 if (factors.size() == 1) {
77 return LMCAS::detail::make_expression_ptr(factors[0]);
78 }
80}

引用了 calculus_utils_product(), context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 calculus_utils_product() , 以及 calculus_utils_split_rational().

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

◆ calculus_utils_split_rational()

bool LMCAS::calculus_utils_split_rational ( const std::shared_ptr< SymbolicExpr > & expr,
std::shared_ptr< SymbolicExpr > & numerator,
std::shared_ptr< SymbolicExpr > & denominator,
ComputationContext & context )
static

在文件 calculus_asymptotes.cpp 第 93 行定义.

97{
98 if (!expr || !LMCAS::detail::node(expr)) {
99 return false;
100 }
101
102 std::vector<std::shared_ptr<const SymbolicNode>> num_factors;
103 std::vector<std::shared_ptr<const SymbolicNode>> den_factors;
104
105 auto collect_factor = [&](const std::shared_ptr<const SymbolicNode>& factor) {
106 if (auto power = std::dynamic_pointer_cast<const PowerNode>(factor)) {
107 auto exponent = std::dynamic_pointer_cast<const NumberNode>(power->exponent());
109 den_factors.push_back(power->base());
110 return;
111 }
112 }
113 num_factors.push_back(factor);
114 };
115
116 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(LMCAS::detail::node(expr))) {
117 for (const auto& factor : multiply->operands()) collect_factor(factor);
118 } else {
119 collect_factor(LMCAS::detail::node(expr));
120 }
121
122 if (den_factors.empty()) {
123 return false;
124 }
125 numerator = calculus_utils_product(num_factors, context);
127 return numerator && denominator;
128}
static std::shared_ptr< SymbolicExpr > calculus_utils_product(const std::vector< std::shared_ptr< const SymbolicNode > > &factors, ComputationContext &context)
static bool calculus_utils_is_minus_one(const std::shared_ptr< const NumberNode > &number)

引用了 calculus_utils_is_minus_one(), calculus_utils_product(), calculus_utils_split_rational(), context, denominator, exponent , 以及 LMCAS::detail::node().

被这些函数引用 calculus_utils_oblique_from_rational() , 以及 calculus_utils_split_rational().

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

◆ calculus_utils_try_symbolic_definite()

ExpressionResult LMCAS::calculus_utils_try_symbolic_definite ( const std::shared_ptr< SymbolicExpr > & integrand,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context )
static

在文件 calculus_revolution.cpp 第 11 行定义.

17 {
18 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
19 (context).limits().max_ast_nodes, "transform");
20 Integrator integrator;
21 auto integrated = integrator.integrate_def_checked(
22 *integrand, var, *a, *b, context);
23 if (!integrated) {
24 return ExpressionResult::failure(integrated.error());
25 }
26 SymbolicExpr result = std::move(integrated.value());
27
29 return std::shared_ptr<SymbolicExpr>{};
30 }
31 auto res = LMCAS::detail::make_expression_ptr(result);
32 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(res), transform_budget));
33 if (simplified &&
35 return std::shared_ptr<SymbolicExpr>{};
36 }
37 return simplified ? simplified : res;
38} catch (const CasError& error) {
39 return ExpressionResult::failure(error);
40} catch (const std::bad_alloc&) {
41 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "calculus_utils_try_symbolic_definite");
42} catch (const std::length_error& error) {
43 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "calculus_utils_try_symbolic_definite");
44} catch (const std::exception& error) {
45 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "calculus_utils_try_symbolic_definite");
46}
bool contains_unevaluated_integral(const std::shared_ptr< const SymbolicNode > &node)

引用了 a, b, calculus_utils_try_symbolic_definite(), contains_unevaluated_integral(), context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), integrator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 calculus_utils_try_symbolic_definite(), surface_area_revolution_x_checked() , 以及 surface_area_revolution_y_checked().

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

◆ cauchy_integral_checked() [1/2]

ExpressionResult LMCAS::cauchy_integral_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & z,
const std::shared_ptr< SymbolicExpr > & z0,
int n )

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

328{
330 return cauchy_integral_checked(f, z, z0, n, context);
331}
ExpressionResult cauchy_integral_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &z, const std::shared_ptr< SymbolicExpr > &z0, int n, ComputationContext &context)

引用了 cauchy_integral_checked() , 以及 context.

函数调用图:

◆ cauchy_integral_checked() [2/2]

ExpressionResult LMCAS::cauchy_integral_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & z,
const std::shared_ptr< SymbolicExpr > & z0,
int n,
ComputationContext & context )

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

293{
294 const std::string operation = "cauchy_integral";
295 auto input = validate_complex_expr_point_input(f, z, z0, n, context, operation);
296 if (!input) return ExpressionResult::failure(input.error());
297 auto budget = context.consume_steps(static_cast<std::size_t>(n) * 12 + 12,
298 operation);
299 if (!budget) return ExpressionResult::failure(budget.error());
300
301 try {
302 auto calculated = cauchy_integral_impl(f, z, z0, n, context);
303 if (!calculated) return calculated;
304 auto result = std::move(calculated.value());
305 if (!result || !LMCAS::detail::node(result)) {
308 "Cauchy integral formula could not be constructed in the supported symbolic domain",
309 operation);
310 }
311 return ExpressionResult::success(result);
312 } catch (const std::bad_alloc&) {
314 "allocation failed while applying Cauchy integral formula",
315 operation);
316 } catch (const std::exception& ex) {
318 ex.what(),
319 operation);
320 }
321}
static ExpressionResult cauchy_integral_impl(const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::shared_ptr< SymbolicExpr > &, int, ComputationContext &)

引用了 cauchy_integral_checked(), cauchy_integral_impl(), context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive, InternalInvariant, LMCAS::detail::node(), ResourceLimit , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

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

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

◆ cauchy_integral_impl()

ExpressionResult LMCAS::cauchy_integral_impl ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & z,
const std::shared_ptr< SymbolicExpr > & z0,
int n,
ComputationContext & context )
static

n is the power in the denominator: \oint f(z)/(z-z0)^n dz

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

337 {
338 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
339 (context).limits().max_ast_nodes, "transform");
340
341 /// n is the power in the denominator: \oint f(z)/(z-z0)^n dz
342 if (n < 1) return SymbolicExpr::number(0);
343
344 auto deriv = f;
345 for (int i = 0; i < n - 1; i++) {
346 deriv = detail::make_expression_ptr(detail::differentiate_node(detail::node(deriv), z, transform_budget));
347 }
348
349 auto f_n_minus_1_z0 = detail::make_expression_ptr(detail::substitute_node(detail::node(deriv), z, detail::node(z0), transform_budget));
350
351 auto fact = BigInt::factorial_checked(BigInt(n - 1), context);
352 if (!fact) return ExpressionResult::failure(fact.error());
353
354 auto term = SymbolicExpr::divide(f_n_minus_1_z0, SymbolicExpr::number(fact.value()));
355
356 auto pi_node = LMCAS::detail::make_node<VariableNode>("pi", true);
358 LMCAS::detail::node(SymbolicExpr::number(0)),
359 LMCAS::detail::node(SymbolicExpr::number(1)));
360
361 auto pi_expr = LMCAS::detail::make_expression_ptr(pi_node);
362 auto i_expr = LMCAS::detail::make_expression_ptr(i_node);
363
364 auto two_pi_i = SymbolicExpr::multiply(SymbolicExpr::number(2), SymbolicExpr::multiply(pi_expr, i_expr));
365
366 return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(two_pi_i, term)), transform_budget));
367} catch (const CasError& error) {
368 return ExpressionResult::failure(error);
369} catch (const std::bad_alloc&) {
370 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "cauchy_integral_impl");
371} catch (const std::length_error& error) {
372 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "cauchy_integral_impl");
373} catch (const std::exception& error) {
374 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "cauchy_integral_impl");
375}
static std::shared_ptr< const SymbolicNode > create_complex(std::shared_ptr< const SymbolicNode > real, std::shared_ptr< const SymbolicNode > imag)
创建复数节点,自动简化(若虚部为 0,则返回实部).

引用了 cauchy_integral_impl(), context, LMCAS::SymbolicFactory::create_complex(), LMCAS::detail::differentiate_node(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::detail::substitute_node().

被这些函数引用 cauchy_integral_checked() , 以及 cauchy_integral_impl().

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

◆ cbrt_expr()

std::shared_ptr< SymbolicExpr > LMCAS::cbrt_expr ( const std::shared_ptr< SymbolicExpr > & x)
static

在文件 solve_polynomial_cubic.cpp 第 14 行定义.

14 {
15 return SymbolicExpr::power(x, SymbolicExpr::number(Rational(1, 3)));
16}

引用了 cbrt_expr().

被这些函数引用 cbrt_expr() , 以及 symbolic_cubic_roots().

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

◆ ceil() [1/2]

ExprResult LMCAS::ceil ( const ExprPtr & expression)

在文件 expr_elementary.cpp 第 184 行定义.

184 {
186 return ceil(expression, context);
187}
ExprResult ceil(const ExprPtr &expression, ComputationContext &context)

引用了 ceil() , 以及 context.

函数调用图:

◆ ceil() [2/2]

ExprResult LMCAS::ceil ( const ExprPtr & expression,
ComputationContext & context )

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

179 {
180 return make_unary_function_expr(expression, context, "ceil",
182}

引用了 LMCAS::FunctionNode::Ceil, ceil(), context , 以及 LMCAS::expr_detail::expr_common::make_unary_function_expr().

被这些函数引用 ceil(), ceil() , 以及 LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function().

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

◆ check_equivalent()

ResidualCheckResult LMCAS::check_equivalent ( const ExprPtr & left,
const ExprPtr & right,
ComputationContext & context,
const LMCAS::EqvOptions & options )

在文件 residual_comparison.cpp 第 17 行定义.

21 {
22 if (!left || !right || !detail::node(left) || !detail::node(right)) {
25 "equivalence check requires two expressions",
26 "residual.check_equivalent");
27 }
28 auto access = context.consume_steps(1, "residual.check_equivalent");
29 if (!access) return ResidualCheckResult::failure(access.error());
30 try {
31 detail::RewriteBudget budget(context, context.limits().max_recursion_depth,
32 context.limits().max_ast_nodes,
33 "residual.check_equivalent");
34 budget.measure(detail::node(left));
35 budget.measure(detail::node(right));
36 if (detail::node(left)->equals(*detail::node(right))) {
37 return ResidualCheckResult::success(ProvedZeroResidual{
38 ExactNormalizationProof{left}});
39 }
40 auto residual = SymbolicExpr::add(
41 left,
42 SymbolicExpr::multiply(SymbolicExpr::number(-1), right));
43 return check_zero_residual(residual, context, options);
44 } catch (const CasError& error) {
45 return ResidualCheckResult::failure(error);
46 } catch (const std::length_error& error) {
48 CasErrc::ResourceLimit, error.what(), "residual.check_equivalent");
49 } catch (const std::bad_alloc&) {
52 "equivalence residual allocation failed",
53 "residual.check_equivalent");
54 } catch (const std::exception& error) {
56 CasErrc::InternalInvariant, error.what(),
57 "residual.check_equivalent");
58 }
59}
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
const ExprPtr & right
ResidualCheckResult check_zero_residual(const ExprPtr &residual, ComputationContext &context, const LMCAS::EqvOptions &options)

引用了 check_equivalent(), check_zero_residual(), context, LMCAS::Result< ResidualCheck >::failure(), InternalInvariant, InvalidArgument, LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node(), options, ResourceLimit, right , 以及 LMCAS::Result< ResidualCheck >::success().

被这些函数引用 check_equivalent(), LMCAS::anonymous_namespace{residual_comparison.cpp}::compare_defined_values(), inverse_fourier_transform_checked(), inverse_laplace_checked(), solve_variation_of_parameters_core() , 以及 vector_calculus_constant_integrand().

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

◆ check_negative_arg()

bool LMCAS::check_negative_arg ( const std::shared_ptr< const SymbolicNode > & argument,
std::shared_ptr< const SymbolicNode > & positive,
detail::RewriteBudget * budget = nullptr )

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

22 {
23 if (budget) { budget->require_nodes(1); }
24 if (const auto number = std::dynamic_pointer_cast<const NumberNode>(argument)) {
25 auto absolute = positive_negative_number(*number);
26 if (!absolute) {
27 return false;
28 }
29 positive = std::move(absolute);
30 return true;
31 }
32 const auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(argument);
33 if (!multiply || multiply->operands().empty()) {
34 return false;
35 }
36 const auto number = std::dynamic_pointer_cast<const NumberNode>(multiply->operands().front());
37 if (!number) {
38 return false;
39 }
40 auto absolute = positive_negative_number(*number);
41 if (!absolute) {
42 return false;
43 }
44 std::vector<std::shared_ptr<const SymbolicNode>> operands;
45 std::size_t nodes = 0;
46 for (const auto& operand : multiply->operands()) {
47 normalization_append(budget, nodes, operands, operand);
48 }
49 if (number->is_negative_one()) {
50 operands.erase(operands.begin());
51 if (budget) { --nodes; }
52 } else {
53 operands.front() = std::move(absolute);
54 }
55 positive = make_normalized_multiply_node(operands, budget);
56 return true;
57}
void require_nodes(std::size_t nodes) const
std::shared_ptr< const NumberNode > positive_negative_number(const NumberNode &number)
std::shared_ptr< const SymbolicNode > make_normalized_multiply_node(const std::vector< std::shared_ptr< const SymbolicNode > > &operands, detail::RewriteBudget *budget=nullptr)
void normalization_append(detail::RewriteBudget *budget, std::size_t &nodes, std::vector< std::shared_ptr< const SymbolicNode > > &children, std::shared_ptr< const SymbolicNode > child)

引用了 check_negative_arg(), make_normalized_multiply_node(), normalization_append() , 以及 LMCAS::detail::RewriteBudget::require_nodes().

被这些函数引用 check_negative_arg() , 以及 LMCAS::NormalizationVisitor::normalize_function_parity().

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

◆ check_zero_residual()

ResidualCheckResult LMCAS::check_zero_residual ( const ExprPtr & residual,
ComputationContext & context,
const LMCAS::EqvOptions & options )

在文件 residual_verification.cpp 第 1036 行定义.

1039 {
1040 constexpr const char* operation = "residual.check_zero";
1041 if (!residual || !detail::node(residual)) {
1044 "residual expression cannot be null", operation);
1045 }
1046 auto access = context.consume_steps(1, operation);
1047 if (!access) { return ResidualCheckResult::failure(access.error()); }
1048
1049 try {
1050 detail::RewriteBudget budget(context, context.limits().max_recursion_depth,
1051 context.limits().max_ast_nodes, operation);
1052 budget.measure(detail::node(residual));
1053 if (auto piecewise = prove_piecewise_residual(residual, budget, options)) {
1054 return std::move(*piecewise);
1055 }
1056 auto root_proof = prove_exact_root_residual(residual, budget, operation);
1057 if (!root_proof ||
1058 std::holds_alternative<ProvedZeroResidual>(root_proof.value())) {
1059 return root_proof;
1060 }
1061 auto formal = FormalResidual(budget).prove(detail::node(residual));
1062 if (!formal) { return ResidualCheckResult::failure(formal.error()); }
1063 if (formal.value())
1065 return prove_normalized_residual(residual, budget, options, operation);
1066 } catch (const CasError& error) {
1067 return ResidualCheckResult::failure(error);
1068 } catch (const std::length_error& error) {
1069 return ResidualCheckResult::failure(CasErrc::ResourceLimit, error.what(), operation);
1070 } catch (const std::bad_alloc&) {
1073 "residual verification allocation failed", operation);
1074 } catch (const std::exception& error) {
1076 CasErrc::InternalInvariant, error.what(), operation);
1077 }
1078}
ResidualCheckResult prove_exact_root_residual(const ExprPtr &expression, detail::RewriteBudget &budget, const std::string &operation)
ResidualCheckResult prove_normalized_residual(const ExprPtr &residual, detail::RewriteBudget &budget, const EqvOptions &options, const std::string &operation)
std::optional< ResidualCheckResult > prove_piecewise_residual(const ExprPtr &residual, detail::RewriteBudget &budget, const EqvOptions &options)

引用了 check_zero_residual(), context, LMCAS::Result< ResidualCheck >::failure(), InternalInvariant, InvalidArgument, LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node(), options, ResourceLimit , 以及 LMCAS::Result< ResidualCheck >::success().

被这些函数引用 LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::accept_symbolic_witness(), check_equivalent(), check_zero_residual(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::equality_condition_truth(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::SolutionFinalizer::finalize_value(), find_integrating_factor_impl(), is_exact_ode(), is_homogeneous_ode(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::parameter_constraint(), parametric_residual_zero(), LMCAS::anonymous_namespace{residual_verification.cpp}::prove_piecewise_residual(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::prove_zero(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::substitute_basis(), verify_lagrange_solutions() , 以及 LMCAS::anonymous_namespace{solve_transcendental.cpp}::zero_difference().

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

◆ checked_derivative()

ExpressionResult LMCAS::checked_derivative ( const ExprPtr & expression,
const std::string & variable,
ComputationContext & context,
const char * operation )
static

在文件 calculus_curvature.cpp 第 12 行定义.

15 {
17 expression, context, operation, "differentiate",
18 [&variable, &context, operation](const SymbolicExpr& value) {
19 detail::RewriteBudget budget(context, context.limits().max_recursion_depth,
20 context.limits().max_ast_nodes, operation);
23 });
24} catch (const CasError& error) {
25 return ExpressionResult::failure(error);
26} catch (const std::bad_alloc&) {
27 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", operation);
28} catch (const std::length_error& error) {
29 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), operation);
30} catch (const std::exception& error) {
31 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), operation);
32}
ExpressionResult checked_transform_expr(const ExprPtr &expression, ComputationContext &context, const char *operation, const char *transform_name, Transform &&transform)

引用了 checked_derivative(), LMCAS::detail::checked_transform_expr(), context, LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), value , 以及 variable.

被这些函数引用 checked_derivative(), curvature_checked(), curvature_parametric_checked() , 以及 inflection_points_checked().

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

◆ checked_inference_result()

template<typename T>
Result< T > LMCAS::checked_inference_result ( const SymbolicExpr & expr,
const std::string & operation,
ComputationContext & context,
const std::function< Result< T >()> & query )

在文件 inference_engine_impl.hpp 第 62 行定义.

66 {
67 if (!detail::node(expr)) {
68 return Result<T>::failure(
70 "inference expression must not be null", operation);
71 }
72 try {
73 auto entered = context.enter_recursion(operation);
74 if (!entered) return Result<T>::failure(entered.error());
75 struct Leave {
76 ComputationContext& context;
77 ~Leave() { context.leave_recursion(); }
78 } leave{context};
79 return query();
80 } catch (const CasError& error) {
81 return Result<T>::failure(error);
82 } catch (const std::bad_alloc&) {
83 return Result<T>::failure(
85 "inference query allocation failed", operation);
86 } catch (const std::exception& error) {
87 return Result<T>::failure(
88 CasErrc::InternalInvariant, error.what(), operation);
89 }
90}

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

被这些函数引用 checked_inference_result(), LMCAS::anonymous_namespace{inference_engine_periodicity.cpp}::periodicity_checked() , 以及 LMCAS::InferenceEngine::Impl::query_natural().

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

◆ cholesky_decomposition_checked() [1/2]

CholeskyDecompositionResult LMCAS::cholesky_decomposition_checked ( const std::shared_ptr< SymbolicExpr > & A)

在文件 matrix_decomposition_cholesky.cpp 第 109 行定义.

111{
114}
CholeskyDecompositionResult cholesky_decomposition_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)

引用了 cholesky_decomposition_checked() , 以及 context.

函数调用图:

◆ cholesky_decomposition_checked() [2/2]

CholeskyDecompositionResult LMCAS::cholesky_decomposition_checked ( const std::shared_ptr< SymbolicExpr > & A,
ComputationContext & context )

在文件 matrix_decomposition_cholesky.cpp 第 74 行定义.

77{
78 const std::string operation = "cholesky_decomposition";
79 auto matrix = validate_decomposition_matrix(A, true, context, operation);
80 if (!matrix) return CholeskyDecompositionResult::failure(matrix.error());
81 auto budget = context.consume_steps(matrix.value()->rows() * matrix.value()->cols() * 10 + 8,
82 operation);
83 if (!budget) return CholeskyDecompositionResult::failure(budget.error());
84 auto spd = prove_exact_spd(matrix.value(), context, operation);
85 if (!spd) return CholeskyDecompositionResult::failure(spd.error());
86 try {
87 std::shared_ptr<SymbolicExpr> L;
88 if (!cholesky_decomposition_impl(A, L)) {
91 "Cholesky decomposition could not be constructed in the supported symbolic domain",
92 operation);
93 }
94 auto l_check = validate_decomposition_output(L, "L", operation);
95 if (!l_check) return CholeskyDecompositionResult::failure(l_check.error());
96 return CholeskyDecompositionResult::success(CholeskyDecomposition{L});
97 } catch (const std::bad_alloc&) {
100 "allocation failed while calculating Cholesky decomposition",
101 operation);
102 } catch (const std::exception& ex) {
104 ex.what(),
105 operation);
106 }
107}
Result< std::shared_ptr< const MatrixNode > > validate_decomposition_matrix(const std::shared_ptr< SymbolicExpr > &A, bool require_square, ComputationContext &context, const std::string &operation)
Result< void > validate_decomposition_output(const std::shared_ptr< SymbolicExpr > &expr, const std::string &name, const std::string &operation)

引用了 cholesky_decomposition_checked(), context, LMCAS::Result< CholeskyDecomposition >::failure(), Inconclusive, InternalInvariant, ResourceLimit, LMCAS::Result< CholeskyDecomposition >::success(), LMCAS::detail::matrix_decomposition::validate_decomposition_matrix() , 以及 LMCAS::detail::matrix_decomposition::validate_decomposition_output().

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

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

◆ choose_main_variable()

std::string LMCAS::choose_main_variable ( const MultiPoly & a,
const MultiPoly & b )
static

在文件 multivariate_factor.cpp 第 58 行定义.

59{
60 const auto& vars = a.variables();
61 if (vars.empty()) { return ""; }
62 std::string best_var = vars[0];
63 int best_deg = a.degree(vars[0]) + b.degree(vars[0]);
64 for (size_t i = 1; i < vars.size(); ++i) {
65 int deg = a.degree(vars[i]) + b.degree(vars[i]);
66 if (deg > best_deg) { best_deg = deg; best_var = vars[i]; }
67 }
68 return best_var;
69}

引用了 a, b, choose_main_variable() , 以及 vars.

被这些函数引用 choose_main_variable() , 以及 recursive_multivariate_gcd().

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

◆ christoffel_first_kind_checked() [1/2]

DifferentialGeometryExprResult LMCAS::christoffel_first_kind_checked ( const std::shared_ptr< SymbolicExpr > & g_ij,
const std::vector< std::string > & coords,
int k,
int i,
int j )

在文件 differential_geometry.cpp 第 414 行定义.

418{
420 return christoffel_first_kind_checked(g_ij, coords, k, i, j, context);
421}
DifferentialGeometryExprResult christoffel_first_kind_checked(const std::shared_ptr< SymbolicExpr > &g_ij, const std::vector< std::string > &coords, int k, int i, int j, ComputationContext &context)

引用了 christoffel_first_kind_checked() , 以及 context.

函数调用图:

◆ christoffel_first_kind_checked() [2/2]

DifferentialGeometryExprResult LMCAS::christoffel_first_kind_checked ( const std::shared_ptr< SymbolicExpr > & g_ij,
const std::vector< std::string > & coords,
int k,
int i,
int j,
ComputationContext & context )

在文件 differential_geometry.cpp 第 370 行定义.

375{
376 const std::string operation = "christoffel_first_kind";
377 auto metric = validate_metric_matrix(g_ij, &coords, context, operation);
378 if (!metric) {
379 return DifferentialGeometryExprResult::failure(metric.error());
380 }
381 const std::size_t dim = metric.value()->rows();
382 auto k_check = validate_index(k, dim, "k", operation);
383 if (!k_check) {
384 return DifferentialGeometryExprResult::failure(k_check.error());
385 }
386 auto i_check = validate_index(i, dim, "i", operation);
387 if (!i_check) {
388 return DifferentialGeometryExprResult::failure(i_check.error());
389 }
390 auto j_check = validate_index(j, dim, "j", operation);
391 if (!j_check) {
392 return DifferentialGeometryExprResult::failure(j_check.error());
393 }
394 auto budget = context.consume_steps(16, operation);
395 if (!budget) {
397 }
398 try {
399 auto result = christoffel_first_kind_impl(g_ij, coords, k, i, j, context);
400 return checked_geometry_expression(std::move(result), CasErrc::Inconclusive,
401 "Christoffel symbol could not be constructed",
402 operation);
403 } catch (const std::bad_alloc&) {
405 "allocation failed while calculating Christoffel symbol",
406 operation);
407 } catch (const std::exception& ex) {
409 ex.what(),
410 operation);
411 }
412}
DifferentialGeometryExprResult checked_geometry_expression(std::shared_ptr< SymbolicExpr > &&result, CasErrc error, const char *message, const std::string &operation)
Result< void > validate_index(int idx, std::size_t dim, const std::string &name, const std::string &operation)
static std::shared_ptr< SymbolicExpr > christoffel_first_kind_impl(const std::shared_ptr< SymbolicExpr > &, const std::vector< std::string > &, int, int, int, ComputationContext &context)
__attribute__((visibility("default"))) MatrixRankResult matrix_rank_checked(const std __attribute__((visibility("default"))) MatrixRankResult matrix_rank_checked(const std __attribute__((visibility("default"))) ExpressionResult matrix_rref_checked(const std __attribute__((visibility("default"))) ExpressionResult matrix_rref_checked(const std __attribute__((visibility("default"))) MatrixNullspaceResult matrix_nullspace_checked(const std __attribute__((visibility("default"))) MatrixNullspaceResult matrix_nullspace_checked(const std __attribute__((visibility("default"))) MatrixLinearSolveResult matrix_solve_linear_checked(const std __attribute__((visibility("default"))) MatrixLinearSolveResult matrix_solve_linear_checked(const std int dim

引用了 christoffel_first_kind_checked(), christoffel_first_kind_impl(), context, dim, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive, InternalInvariant, ResourceLimit , 以及 LMCAS::Result< T >::value().

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

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

◆ christoffel_first_kind_impl()

std::shared_ptr< SymbolicExpr > LMCAS::christoffel_first_kind_impl ( const std::shared_ptr< SymbolicExpr > & g_ij,
const std::vector< std::string > & coords,
int k,
int i,
int j,
ComputationContext & context )
static

在文件 differential_geometry.cpp 第 423 行定义.

426 {
427
428 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
429 (context).limits().max_ast_nodes, "transform");
430
431 auto mat = std::dynamic_pointer_cast<const MatrixNode>(LMCAS::detail::node(g_ij));
432 if (!mat) return SymbolicExpr::number(0);
433
434 auto g_jk = LMCAS::detail::make_expression_ptr(mat->get(j, k));
435 auto g_ik = LMCAS::detail::make_expression_ptr(mat->get(i, k));
436 auto g_ij_comp = LMCAS::detail::make_expression_ptr(mat->get(i, j));
437
438 auto term1 = detail::make_expression_ptr(detail::differentiate_node(detail::node(g_jk), coords[i], transform_budget));
439 auto term2 = detail::make_expression_ptr(detail::differentiate_node(detail::node(g_ik), coords[j], transform_budget));
440 auto term3 = detail::make_expression_ptr(detail::differentiate_node(detail::node(g_ij_comp), coords[k], transform_budget));
441
442 auto sum12 = SymbolicExpr::add(term1, term2);
443 auto diff = SymbolicExpr::add(sum12, SymbolicExpr::multiply(term3, SymbolicExpr::number(-1)));
444
446 SymbolicExpr::number(Rational(BigInt(1), BigInt(2))),
447 diff)), transform_budget));
448}

引用了 christoffel_first_kind_impl(), context, LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 christoffel_first_kind_checked(), christoffel_first_kind_impl() , 以及 christoffel_second_kind_impl().

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

◆ christoffel_second_kind_checked() [1/2]

DifferentialGeometryExprResult LMCAS::christoffel_second_kind_checked ( const std::shared_ptr< SymbolicExpr > & g_ij,
const std::shared_ptr< SymbolicExpr > & g_up_ij,
const std::vector< std::string > & coords,
int k,
int i,
int j )

在文件 differential_geometry.cpp 第 499 行定义.

504{
506 return christoffel_second_kind_checked(g_ij, g_up_ij, coords, k, i, j, context);
507}
DifferentialGeometryExprResult christoffel_second_kind_checked(const std::shared_ptr< SymbolicExpr > &g_ij, const std::shared_ptr< SymbolicExpr > &g_up_ij, const std::vector< std::string > &coords, int k, int i, int j, ComputationContext &context)

引用了 christoffel_second_kind_checked() , 以及 context.

函数调用图:

◆ christoffel_second_kind_checked() [2/2]

DifferentialGeometryExprResult LMCAS::christoffel_second_kind_checked ( const std::shared_ptr< SymbolicExpr > & g_ij,
const std::shared_ptr< SymbolicExpr > & g_up_ij,
const std::vector< std::string > & coords,
int k,
int i,
int j,
ComputationContext & context )

在文件 differential_geometry.cpp 第 450 行定义.

456{
457 const std::string operation = "christoffel_second_kind";
458 auto metric = validate_metric_matrix(g_ij, &coords, context, operation);
459 if (!metric) {
460 return DifferentialGeometryExprResult::failure(metric.error());
461 }
462 auto inverse_metric = validate_metric_matrix(g_up_ij, &coords, context, operation);
463 if (!inverse_metric) {
464 return DifferentialGeometryExprResult::failure(inverse_metric.error());
465 }
466 const std::size_t dim = metric.value()->rows();
467 auto k_check = validate_index(k, dim, "k", operation);
468 if (!k_check) {
469 return DifferentialGeometryExprResult::failure(k_check.error());
470 }
471 auto i_check = validate_index(i, dim, "i", operation);
472 if (!i_check) {
473 return DifferentialGeometryExprResult::failure(i_check.error());
474 }
475 auto j_check = validate_index(j, dim, "j", operation);
476 if (!j_check) {
477 return DifferentialGeometryExprResult::failure(j_check.error());
478 }
479 auto budget = context.consume_steps(dim * 20 + 12, operation);
480 if (!budget) {
482 }
483 try {
484 auto result = christoffel_second_kind_impl(g_ij, g_up_ij, coords, k, i, j, context);
485 return checked_geometry_expression(std::move(result), CasErrc::Inconclusive,
486 "Christoffel symbol could not be constructed",
487 operation);
488 } catch (const std::bad_alloc&) {
490 "allocation failed while calculating Christoffel symbol",
491 operation);
492 } catch (const std::exception& ex) {
494 ex.what(),
495 operation);
496 }
497}
static std::shared_ptr< SymbolicExpr > christoffel_second_kind_impl(const std::shared_ptr< SymbolicExpr > &, const std::shared_ptr< SymbolicExpr > &, const std::vector< std::string > &, int, int, int, ComputationContext &context)

引用了 christoffel_second_kind_checked(), christoffel_second_kind_impl(), context, dim, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive, InternalInvariant, ResourceLimit , 以及 LMCAS::Result< T >::value().

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

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

◆ christoffel_second_kind_impl()

std::shared_ptr< SymbolicExpr > LMCAS::christoffel_second_kind_impl ( const std::shared_ptr< SymbolicExpr > & g_ij,
const std::shared_ptr< SymbolicExpr > & g_up_ij,
const std::vector< std::string > & coords,
int k,
int i,
int j,
ComputationContext & context )
static

在文件 differential_geometry.cpp 第 509 行定义.

513 {
514
515 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
516 (context).limits().max_ast_nodes, "transform");
517
518 auto mat_up = std::dynamic_pointer_cast<const MatrixNode>(LMCAS::detail::node(g_up_ij));
519 if (!mat_up) return SymbolicExpr::number(0);
520
521 size_t dim = coords.size();
522 auto result = SymbolicExpr::number(0);
523
524 for (size_t m = 0; m < dim; m++) {
525 auto g_up_km = LMCAS::detail::make_expression_ptr(mat_up->get(k, m));
526 auto gamma_first = christoffel_first_kind_impl(g_ij, coords, m, i, j, context);
527 auto term = SymbolicExpr::multiply(g_up_km, gamma_first);
528 result = SymbolicExpr::add(result, term);
529 }
530
531 return detail::make_expression_ptr(detail::normalize_node(detail::node(result), transform_budget));
532}

引用了 christoffel_first_kind_impl(), christoffel_second_kind_impl(), context, dim, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 christoffel_second_kind_checked(), christoffel_second_kind_impl() , 以及 riemann_curvature_tensor_with_inverse().

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

◆ clamp() [1/2]

ExprResult LMCAS::clamp ( const ExprPtr & expression,
const ExprPtr & lower,
const ExprPtr & upper )

在文件 expr_elementary.cpp 第 233 行定义.

235 {
237 return clamp(expression, lower, upper, context);
238}
ExprResult clamp(const ExprPtr &expression, const ExprPtr &lower, const ExprPtr &upper, ComputationContext &context)

引用了 clamp(), context, lower , 以及 upper.

函数调用图:

◆ clamp() [2/2]

ExprResult LMCAS::clamp ( const ExprPtr & expression,
const ExprPtr & lower,
const ExprPtr & upper,
ComputationContext & context )

在文件 expr_elementary.cpp 第 199 行定义.

202 {
203 auto step = context.consume_steps(1, kMathOperation);
204 if (!step) { return ExprResult::failure(step.error()); }
205 if (!expression || !LMCAS::detail::node(expression) ||
209 "clamp arguments cannot be null",
211 }
212 try {
215 std::vector<std::shared_ptr<const SymbolicNode>>{
219 std::vector<std::shared_ptr<const SymbolicNode>>{
220 std::move(max_node), LMCAS::detail::node(upper)});
221 return ExprResult::success(
222 LMCAS::detail::make_expression_ptr(std::move(min_node)));
223 } catch (const std::bad_alloc&) {
225 "clamp expression allocation failed",
227 } catch (const std::exception& error) {
230 }
231}
@ Max
最大值 max(a, b)。
@ Min
最小值 min(a, b)。
constexpr const char * kMathOperation

引用了 clamp(), context, LMCAS::expr_detail::expr_common::expression_failure(), LMCAS::Result< ExprPtr >::failure(), InternalInvariant, InvalidArgument, LMCAS::expr_detail::expr_common::kMathOperation, lower, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::FunctionNode::Max, LMCAS::FunctionNode::Min, LMCAS::detail::node(), ResourceLimit, LMCAS::Result< ExprPtr >::success() , 以及 upper.

被这些函数引用 LMCAS::expr_detail::ExprParser::apply_clamp(), clamp() , 以及 clamp().

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

◆ classify_first_order_ode()

ODEClassification LMCAS::classify_first_order_ode ( const std::shared_ptr< SymbolicExpr > & rhs,
const std::string & x,
const std::string & y )
  1. 检测可分离变量
  1. 检测一阶线性
  1. 检测齐次方程
  1. 检测 Bernoulli
  1. 检测恰当方程 将 y' = rhs 改写为 M + N*y' = 0 形式: -rhs + y' = 0 即 M = -rhs, N = 1(标准形式 M*dx + N*dy = 0 → M + N*dy/dx = 0) 更一般地: 若 rhs = f(x,y),则 -f(x,y)*dx + dy = 0 M = -f(x,y), N = 1

在文件 ode_classification.cpp 第 490 行定义.

494{
496 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
497 (context).limits().max_ast_nodes, "transform");
498 ODEClassification result;
499 result.order = 1;
500
501 if (!rhs || !LMCAS::detail::node(rhs)) {
502 result.type = ODEType::Unknown;
503 return result;
504 }
505
506 /// 1. 检测可分离变量
507 if (is_separable(rhs, x, y)) {
508 result.type = ODEType::Separable;
509 return result;
510 }
511
512 /// 2. 检测一阶线性
513 std::shared_ptr<SymbolicExpr> P, Q;
514 if (is_linear_first_order(rhs, x, y, P, Q)) {
515 result.type = ODEType::Linear1;
516 result.P_coeff = P;
517 result.Q_coeff = Q;
518 return result;
519 }
520
521 /// 3. 检测齐次方程
522 if (is_homogeneous_ode(rhs, x, y)) {
523 result.type = ODEType::Homogeneous;
524 return result;
525 }
526
527 /// 4. 检测 Bernoulli
528 std::shared_ptr<SymbolicExpr> bP, bQ;
529 int bn;
530 if (is_bernoulli_ode(rhs, x, y, bP, bQ, bn)) {
531 result.type = ODEType::Bernoulli;
532 result.bernoulli_P = bP;
533 result.bernoulli_Q = bQ;
534 result.bernoulli_n = bn;
535 return result;
536 }
537
538 /// 5. 检测恰当方程
539 /// 将 y' = rhs 改写为 M + N*y' = 0 形式: -rhs + y' = 0
540 /// 即 M = -rhs, N = 1(标准形式 M*dx + N*dy = 0 → M + N*dy/dx = 0)
541 /// 更一般地: 若 rhs = f(x,y),则 -f(x,y)*dx + dy = 0
542 /// M = -f(x,y), N = 1
543 auto neg_rhs = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(SymbolicExpr::number(-1), rhs)), transform_budget));
544 auto one = SymbolicExpr::number(1);
545 if (is_exact_ode(neg_rhs, one, x, y)) {
546 result.type = ODEType::Exact;
547 result.exact_M = neg_rhs;
548 result.exact_N = one;
549 return result;
550 }
551
552 result.type = ODEType::Unknown;
553 return result;
554}
bool is_homogeneous_ode(const std::shared_ptr< SymbolicExpr > &rhs, const std::string &x, const std::string &y)
std::shared_ptr< SymbolicExpr > bernoulli_P
Bernoulli: P(x), Q(x), n 使得 y' + P(x)y = Q(x)y^n
@ Unknown
无法识别的类型
std::shared_ptr< SymbolicExpr > Q_coeff
bool is_linear_first_order(const std::shared_ptr< SymbolicExpr > &rhs, const std::string &x, const std::string &y, std::shared_ptr< SymbolicExpr > &P, std::shared_ptr< SymbolicExpr > &Q)
std::shared_ptr< SymbolicExpr > P_coeff
一阶线性: P(x), Q(x) 使得 y' + P(x)y = Q(x)
bool is_bernoulli_ode(const std::shared_ptr< SymbolicExpr > &rhs, const std::string &x, const std::string &y, std::shared_ptr< SymbolicExpr > &P, std::shared_ptr< SymbolicExpr > &Q, int &n)
std::shared_ptr< SymbolicExpr > exact_M
恰当方程: M(x,y), N(x,y)
ODEType type
识别出的 ODE 类型
std::shared_ptr< SymbolicExpr > bernoulli_Q
std::shared_ptr< SymbolicExpr > exact_N
bool is_exact_ode(const std::shared_ptr< SymbolicExpr > &M, const std::shared_ptr< SymbolicExpr > &N, const std::string &x, const std::string &y)
bool is_separable(const std::shared_ptr< SymbolicExpr > &rhs, const std::string &x, const std::string &y)
ODE 分类结果,包含类型及提取的结构信息.

引用了 Bernoulli, LMCAS::ODEClassification::bernoulli_n, LMCAS::ODEClassification::bernoulli_P, LMCAS::ODEClassification::bernoulli_Q, classify_first_order_ode(), context, Exact, LMCAS::ODEClassification::exact_M, LMCAS::ODEClassification::exact_N, Homogeneous, is_bernoulli_ode(), is_exact_ode(), is_homogeneous_ode(), is_linear_first_order(), is_separable(), Linear1, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::ODEClassification::order, LMCAS::ODEClassification::P_coeff, LMCAS::ODEClassification::Q_coeff, rhs, Separable, LMCAS::ODEClassification::type , 以及 Unknown.

被这些函数引用 classify_first_order_ode().

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

◆ classify_hessian_eigenvalues()

CriticalPointClassification LMCAS::classify_hessian_eigenvalues ( const std::vector< std::shared_ptr< SymbolicExpr > > & eigenvals,
double tol,
ComputationContext & context,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_extrema.cpp 第 122 行定义.

126{
127 bool all_positive = true;
128 bool all_negative = true;
129 bool has_zero = false;
130
131 for (const auto& ev : eigenvals) {
132 if (!ev) {
134 }
135 auto ev_simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(ev), transform_budget));
136 double val = 0.0;
137 if (!vector_calculus_checked_finite_numeric(ev_simplified, val, context)) {
139 }
140
141 if (std::abs(val) < tol) {
142 has_zero = true;
143 all_positive = false;
144 all_negative = false;
145 } else if (val > 0) {
146 all_negative = false;
147 } else {
148 all_positive = false;
149 }
150 }
151
152 if (has_zero) {
154 }
155 if (all_positive) {
157 }
158 if (all_negative) {
160 }
162}
bool vector_calculus_checked_finite_numeric(const std::shared_ptr< SymbolicExpr > &expr, double &value, ComputationContext &context)

引用了 classify_hessian_eigenvalues(), context, Degenerate, Inconclusive, LocalMaximum, LocalMinimum, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), Saddle , 以及 LMCAS::vector_calculus_detail::vector_calculus_checked_finite_numeric().

被这些函数引用 classify_hessian_eigenvalues() , 以及 vector_calculus_classify_critical_point().

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

◆ classify_hessian_pair()

CriticalPointClassification LMCAS::classify_hessian_pair ( const std::vector< double > & numeric_H,
double tol )
static

在文件 vector_calculus_extrema.cpp 第 75 行定义.

77{
78 double a = numeric_H[0], b = numeric_H[1];
79 double c = numeric_H[2], d = numeric_H[3];
80 double det = a * d - b * c;
81 double trace = a + d;
82
83 if (std::abs(det) < tol) {
85 }
86 if (det > 0 && trace > 0) {
88 }
89 if (det > 0 && trace < 0) {
91 }
93}

引用了 a, b, c, classify_hessian_pair(), Degenerate, LocalMaximum, LocalMinimum , 以及 Saddle.

被这些函数引用 classify_hessian_pair() , 以及 vector_calculus_classify_critical_point().

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

◆ classify_higher_order_ode()

ODEClassification LMCAS::classify_higher_order_ode ( const std::vector< std::shared_ptr< SymbolicExpr > > & coeffs,
const std::shared_ptr< SymbolicExpr > & forcing,
const std::string & x,
const std::string &  )
  1. 检测当前数值分类结果能够表示的常系数
  1. 检测 Euler 方程

在文件 ode_classification.cpp 第 557 行定义.

562{
563 ODEClassification result;
564 result.order = static_cast<int>(coeffs.size()) - 1;
565
566 if (coeffs.empty()) {
567 result.type = ODEType::Unknown;
568 return result;
569 }
570
571 /// 1. 检测当前数值分类结果能够表示的常系数
572 if (is_constant_coefficient(coeffs, x)) {
573 std::vector<double> numeric_coeffs;
574 numeric_coeffs.reserve(coeffs.size());
575 for (const auto& c : coeffs) {
576 double val = try_eval_double(c);
577 if (!std::isfinite(val)) {
578 result.type = ODEType::Unknown;
579 return result;
580 }
581 numeric_coeffs.push_back(val);
582 }
583
584 result.type = result.order == 2
587 result.const_coeffs = std::move(numeric_coeffs);
588 result.forcing_func = forcing;
589 return result;
590 }
591
592 /// 2. 检测 Euler 方程
593 std::vector<double> euler_consts;
594 if (is_euler_equation(coeffs, x, euler_consts)) {
595 result.type = ODEType::Euler;
596 result.euler_coeffs = euler_consts;
597 result.euler_forcing = forcing;
598 return result;
599 }
600
601 result.type = ODEType::Unknown;
602 return result;
603}
std::vector< double > const_coeffs
常系数: 系数列表 [a_n, a_{n-1}, ..., a_1, a_0] 和非齐次项 f(x)
std::shared_ptr< SymbolicExpr > forcing_func
double try_eval_double(const std::shared_ptr< SymbolicExpr > &expression)
尝试将表达式求值为 double。
std::shared_ptr< SymbolicExpr > euler_forcing
bool is_constant_coefficient(const std::vector< std::shared_ptr< SymbolicExpr > > &coeffs, const std::string &x)
bool is_euler_equation(const std::vector< std::shared_ptr< SymbolicExpr > > &coeffs, const std::string &x, std::vector< double > &euler_consts)
std::vector< double > euler_coeffs
Euler 方程: 系数列表 [a_n, ..., a_0] 对应 x^n*y^(n) + ... + a_0*y = f(x)

引用了 c, classify_higher_order_ode(), LMCAS::ODEClassification::const_coeffs, Euler, LMCAS::ODEClassification::euler_coeffs, LMCAS::ODEClassification::euler_forcing, LMCAS::ODEClassification::forcing_func, HigherOrder_ConstCoeff, is_constant_coefficient(), is_euler_equation(), Linear2_ConstCoeff, LMCAS::ODEClassification::order, try_eval_double(), LMCAS::ODEClassification::type , 以及 Unknown.

被这些函数引用 classify_higher_order_ode().

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

◆ classify_inflection_candidates()

SymbolicExprVectorResult LMCAS::classify_inflection_candidates ( const FiniteSolutions & finite,
const std::shared_ptr< SymbolicExpr > & f,
const std::shared_ptr< SymbolicExpr > & f_prime,
const std::shared_ptr< SymbolicExpr > & f_double_prime,
const std::string & var,
const FactsQuery & facts,
ComputationContext & context,
const std::string & operation )
static

在文件 calculus_curvature.cpp 第 208 行定义.

212 {
213 std::vector<std::shared_ptr<SymbolicExpr>> points;
214 points.reserve(finite.values.size());
215 for (const auto& solution : finite.values) {
216 auto step = context.consume_steps(1, operation);
217 if (!step) { return SymbolicExprVectorResult::failure(step.error()); }
218 if (!solution.value || !LMCAS::detail::node(solution.value)) {
220 "checked solver returned a null inflection candidate", operation);
221 }
222 auto real = detail::query_real_value(detail::node(solution.value), facts, context);
224 if (real.value() == Tribool::False) { continue; }
225 if (real.value() != Tribool::True || !solution.conditions.empty()) {
227 "inflection candidate is not proved unconditionally real", operation);
228 }
229 auto defined = inflection_curve_defined(
230 f, f_prime, f_double_prime, solution.value, var, facts, operation, context);
231 if (!defined) { return SymbolicExprVectorResult::failure(defined.error()); }
232 if (!defined.value()) { continue; }
233 points.push_back(solution.value);
234 }
235 return SymbolicExprVectorResult::success(std::move(points));
236}
Result< Tribool > query_real_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
static Result< bool > inflection_curve_defined(const std::shared_ptr< SymbolicExpr > &f, const std::shared_ptr< SymbolicExpr > &f_prime, const std::shared_ptr< SymbolicExpr > &f_double_prime, const std::shared_ptr< SymbolicExpr > &point, const std::string &var, const FactsQuery &facts, const std::string &operation, ComputationContext &context)

引用了 classify_inflection_candidates(), context, LMCAS::Result< T >::error(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), False, Inconclusive, inflection_curve_defined(), InternalInvariant, LMCAS::detail::node(), LMCAS::detail::query_real_value(), real(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success(), True, LMCAS::Result< T >::value() , 以及 LMCAS::FiniteSolutions::values.

被这些函数引用 classify_inflection_candidates() , 以及 inflection_points_checked().

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

◆ classify_quadratic_form()

std::string LMCAS::classify_quadratic_form ( const ExprPtr & A)

在文件 matrix_decomposition_eigen.cpp 第 243 行定义.

243 {
245 auto eigenvalues = matrix_eigenvalues_checked(A, context);
246 if (!eigenvalues || eigenvalues.value().empty()) { return "unknown"; }
247 AssumptionContext assumptions;
248 detail::AssumptionFacts facts(assumptions);
249 QuadraticSigns signs;
250 for (const auto& eigenvalue : eigenvalues.value()) {
251 auto sign = quadratic_eigenvalue_sign(eigenvalue, facts, context);
252 if (!sign) { return "unknown"; }
253 signs.include(*sign);
254 }
255 return signs.classification();
256}
MatrixEigenvalueResult matrix_eigenvalues_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)

引用了 classify_quadratic_form(), context , 以及 matrix_eigenvalues_checked().

被这些函数引用 classify_quadratic_form().

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

◆ classify_quadric_checked() [1/2]

VectorStringResult LMCAS::classify_quadric_checked ( const SurfaceSymbolic & surf)

在文件 symbolic_geometry_quadric.cpp 第 41 行定义.

41 {
44}
VectorStringResult classify_quadric_checked(const SurfaceSymbolic &surf, ComputationContext &context)

引用了 classify_quadric_checked() , 以及 context.

函数调用图:

◆ classify_quadric_checked() [2/2]

VectorStringResult LMCAS::classify_quadric_checked ( const SurfaceSymbolic & surf,
ComputationContext & context )

在文件 symbolic_geometry_quadric.cpp 第 10 行定义.

12 {
13 const std::string operation = "classify_quadric";
14 try {
15 auto valid = validate_surface_point(
16 surf,
17 std::vector<std::shared_ptr<SymbolicExpr>>(
18 surf.vars.size(), SymbolicExpr::number(0)),
19 context,
20 operation);
21 if (!valid) return VectorStringResult::failure(valid.error());
22 if (surf.vars.size() != 3) {
25 "quadric classification requires exactly three variables",
26 operation);
27 }
28 auto step = context.consume_steps(12, operation);
29 if (!step) return VectorStringResult::failure(step.error());
30 return detail::classify_quadric_impl(surf, context, operation);
31 } catch (const std::bad_alloc&) {
33 "vector geometry allocation failed",
34 operation);
35 } catch (const std::exception& e) {
37 e.what(), operation);
38 }
39}
VectorStringResult classify_quadric_impl(const SurfaceSymbolic &surf, ComputationContext &context, const std::string &operation)
Result< void > validate_surface_point(const SurfaceSymbolic &surf, const std::vector< std::shared_ptr< SymbolicExpr > > &point, ComputationContext &context, const std::string &operation)
std::vector< std::string > vars
坐标变量名 {x,y,z}。

引用了 classify_quadric_checked(), LMCAS::detail::classify_quadric_impl(), context, e(), LMCAS::Result< std::string >::failure(), Inconclusive, InvalidArgument, ResourceLimit, LMCAS::geometry_detail::validate_surface_point() , 以及 LMCAS::SurfaceSymbolic::vars.

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

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

◆ classify_ratio_limit()

ConvergenceInfo LMCAS::classify_ratio_limit ( const std::shared_ptr< SymbolicExpr > & lim,
ComputationContext & context )
static

在文件 series_convergence.cpp 第 316 行定义.

317 {
318
319 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
320 (context).limits().max_ast_nodes, "transform");
321 if (!lim) {
323 }
324 auto ls = detail::make_expression_ptr(detail::normalize_node(detail::node(lim), transform_budget));
325 auto infinity = ls
326 ? std::dynamic_pointer_cast<const FunctionNode>(detail::node(ls))
327 : nullptr;
328 if (infinity && infinity->type() == FunctionNode::FuncType::Infinity) {
329 return {ConvergenceResult::Divergent, "ratio"};
330 }
331 auto number = ls
332 ? std::dynamic_pointer_cast<const NumberNode>(LMCAS::detail::node(ls))
333 : nullptr;
334 if (!number) {
336 }
337 if (const auto* integer = std::get_if<BigInt>(&number->value())) {
338 return {*integer < BigInt(1) ? ConvergenceResult::Convergent
341 }
342 if (const auto* rational = std::get_if<Rational>(&number->value())) {
346 }
348}
ExprResult integer(Integer)=delete

引用了 classify_ratio_limit(), context, Convergent, Divergent, Inconclusive, LMCAS::FunctionNode::Infinity, integer, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 rational().

被这些函数引用 classify_ratio_limit() , 以及 ratio_convergence_test().

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

◆ classify_singular_point_checked() [1/2]

ODESingularityResult LMCAS::classify_singular_point_checked ( const std::shared_ptr< SymbolicExpr > & p,
const std::shared_ptr< SymbolicExpr > & q,
const std::shared_ptr< SymbolicExpr > & x0,
const std::string & x )

在文件 ode_frobenius.cpp 第 463 行定义.

468{
470 return classify_singular_point_checked(p, q, x0, x, context);
471}
ODESingularityResult classify_singular_point_checked(const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, ComputationContext &context)

引用了 classify_singular_point_checked() , 以及 context.

函数调用图:

◆ classify_singular_point_checked() [2/2]

ODESingularityResult LMCAS::classify_singular_point_checked ( const std::shared_ptr< SymbolicExpr > & p,
const std::shared_ptr< SymbolicExpr > & q,
const std::shared_ptr< SymbolicExpr > & x0,
const std::string & x,
ComputationContext & context )

在文件 ode_frobenius.cpp 第 395 行定义.

401 {
402 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
403 (context).limits().max_ast_nodes, "transform");
404 const std::string operation = "classify_singular_point";
405 auto valid = validate_ode_two_expr_point(p, q, x0, x, context, operation);
406 if (!valid) {
407 return ODESingularityResult::failure(valid.error());
408 }
409 try {
410 auto p_at_x0 = detail::make_expression_ptr(detail::substitute_node(detail::node(p), x, detail::node(x0), transform_budget));
411 auto q_at_x0 = detail::make_expression_ptr(detail::substitute_node(detail::node(q), x, detail::node(x0), transform_budget));
412 const double p_val = try_eval_double(p_at_x0);
413 const double q_val = try_eval_double(q_at_x0);
414 if (std::isfinite(p_val) && std::isfinite(q_val)) {
417 }
418 if ((!std::isfinite(p_val) &&
419 !free_variables(detail::node(p_at_x0)).empty()) ||
420 (!std::isfinite(q_val) &&
421 !free_variables(detail::node(q_at_x0)).empty())) {
424 "singularity classification requires numeric coefficient values",
425 operation);
426 }
427
428 auto x_var = SymbolicExpr::variable(x);
429 auto x_minus_x0 = SymbolicExpr::add(
430 x_var, SymbolicExpr::multiply(SymbolicExpr::number(-1), x0));
431 auto xp = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(x_minus_x0, p)), transform_budget));
432 auto x2q = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(
433 SymbolicExpr::power(x_minus_x0, SymbolicExpr::number(2)),
434 q)), transform_budget));
435 auto xp_limit = limit_checked(xp, x, x0, LimitDirection::Both, context);
436 if (!xp_limit) return ODESingularityResult::failure(xp_limit.error());
437 auto x2q_limit = limit_checked(x2q, x, x0, LimitDirection::Both, context);
438 if (!x2q_limit) return ODESingularityResult::failure(x2q_limit.error());
440 std::holds_alternative<FiniteLimit>(xp_limit.value().value) &&
441 std::holds_alternative<FiniteLimit>(x2q_limit.value().value)
444 } catch (const std::bad_alloc&) {
447 "allocation failed while classifying ODE singularity",
448 operation);
449 } catch (const std::length_error& error) { return ODESingularityResult::failure(CasErrc::ResourceLimit, error.what(), "classify_singular_point"); } catch (const std::exception& ex) {
451 CasErrc::InternalInvariant, ex.what(), operation);
452 }
453} catch (const CasError& error) {
454 return ODESingularityResult::failure(error);
455} catch (const std::bad_alloc&) {
456 return ODESingularityResult::failure(CasErrc::ResourceLimit, "allocation failed", "classify_singular_point");
457} catch (const std::length_error& error) {
458 return ODESingularityResult::failure(CasErrc::ResourceLimit, error.what(), "classify_singular_point");
459} catch (const std::exception& error) {
460 return ODESingularityResult::failure(CasErrc::InternalInvariant, error.what(), "classify_singular_point");
461}
LimitResult limit_checked(const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, Domain domain)
std::set< std::string > free_variables(const detail::SymbolicNodePtr &expression, detail::RewriteBudget *budget)
Result< void > validate_ode_two_expr_point(const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, ComputationContext &context, const std::string &operation)

引用了 Both, classify_singular_point_checked(), context, LMCAS::Result< ODESingularityType >::failure(), free_variables(), Inconclusive, InternalInvariant, IrregularSingular, limit_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), Ordinary, RegularSingular, ResourceLimit, LMCAS::detail::substitute_node(), LMCAS::Result< ODESingularityType >::success(), try_eval_double() , 以及 validate_ode_two_expr_point().

被这些函数引用 classify_singular_point_checked(), classify_singular_point_checked() , 以及 solve_frobenius_checked().

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

◆ clean_number()

std::shared_ptr< SymbolicExpr > LMCAS::clean_number ( double val)
static

只在转换可表示时提升为精确小整数,避免浮点到整数的越界转换。

检查可由简单分数 p/q (q <= 12) 精确表示的 double 值。

在文件 ode_linear.cpp 第 49 行定义.

49 {
50 /// 只在转换可表示时提升为精确小整数,避免浮点到整数的越界转换。
51 double rounded = std::round(val);
52 if (is_representable_small_integer(rounded) && val == rounded) {
53 return SymbolicExpr::number(static_cast<int>(rounded));
54 }
55
56 /// 检查可由简单分数 p/q (q <= 12) 精确表示的 double 值。
57 for (int q = 2; q <= 12; ++q) {
58 double p = val * q;
59 double p_rounded = std::round(p);
60 if (is_representable_small_integer(p_rounded) &&
61 val == p_rounded / q) {
62 return SymbolicExpr::divide(
63 SymbolicExpr::number(static_cast<int>(p_rounded)),
64 SymbolicExpr::number(q));
65 }
66 }
67
68 return SymbolicExpr::number(val);
69}
static bool is_representable_small_integer(double value)
将 double 值转为"干净"的数值表达式.

引用了 clean_number() , 以及 is_representable_small_integer().

被这些函数引用 build_euler_solution(), build_homogeneous_solution() , 以及 clean_number().

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

◆ coefficient_power_radius()

std::optional< std::shared_ptr< SymbolicExpr > > LMCAS::coefficient_power_radius ( const PowerNode & power,
const std::string & index_var,
ComputationContext & context )
static

在文件 series_convergence.cpp 第 77 行定义.

78 {
79
80 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
81 (context).limits().max_ast_nodes, "transform");
82 auto exponent_variable = std::dynamic_pointer_cast<const VariableNode>(
83 power.exponent());
84 if (series_index_variable(exponent_variable, index_var) &&
85 !expression_depends_on_variable(power.base(), index_var)) {
89 std::vector<std::shared_ptr<const SymbolicNode>>{
90 power.base()}));
91 return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(SymbolicExpr::number(1), absolute)), transform_budget));
92 }
93 auto base_variable = std::dynamic_pointer_cast<const VariableNode>(
94 power.base());
95 if (series_index_variable(base_variable, index_var) &&
96 !expression_depends_on_variable(power.exponent(), index_var)) {
97 return SymbolicExpr::number(1);
98 }
99 return std::nullopt;
100}
const std::shared_ptr< const SymbolicNode > & exponent() const noexcept
const std::shared_ptr< const SymbolicNode > & base() const noexcept
static bool series_index_variable(const std::shared_ptr< const VariableNode > &variable, const std::string &index_var)
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)

引用了 LMCAS::FunctionNode::Abs, LMCAS::PowerNode::base(), coefficient_power_radius(), context, LMCAS::PowerNode::exponent(), expression_depends_on_variable(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 series_index_variable().

被这些函数引用 coefficient_power_radius() , 以及 convergence_radius_checked().

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

◆ collect_bernoulli_coefficients()

bool LMCAS::collect_bernoulli_coefficients ( const std::vector< std::shared_ptr< const SymbolicNode > > & terms,
const std::string & y,
std::map< int, std::shared_ptr< SymbolicExpr > > & coefficients,
ComputationContext & context )
static

在文件 ode_classification.cpp 第 278 行定义.

281 {
282
283 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
284 (context).limits().max_ast_nodes, "transform");
285 for (const auto& term : terms) {
286 int exponent = 0;
287 std::shared_ptr<SymbolicExpr> coefficient;
289 term, y, exponent, coefficient, context)) {
290 return false;
291 }
292 auto& combined = coefficients[exponent];
293 combined = combined
294 ? detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(combined, coefficient)), transform_budget))
295 : detail::make_expression_ptr(detail::normalize_node(detail::node(coefficient), transform_budget));
296 }
297 return true;
298}
static bool extract_bernoulli_monomial(const std::shared_ptr< const SymbolicNode > &term, const std::string &y, int &exponent, std::shared_ptr< SymbolicExpr > &coefficient, ComputationContext &context)

引用了 collect_bernoulli_coefficients(), context, exponent, extract_bernoulli_monomial(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 collect_bernoulli_coefficients() , 以及 is_bernoulli_ode().

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

◆ collect_exact_solutions()

SolveResult LMCAS::collect_exact_solutions ( std::vector< std::shared_ptr< SymbolicExpr > > roots,
ComputationContext & context )
static

在文件 solve_visitor.cpp 第 319 行定义.

320 {
321 constexpr const char* operation = "solve_equation";
322 std::vector<FiniteSolution> solutions;
323 for (auto& root : roots) {
324 auto root_step = context.consume_steps(1, operation);
325 if (!root_step) {
326 return SolveResult::failure(root_step.error());
327 }
328 if (!root || !LMCAS::detail::node(root)) {
331 "polynomial solver produced a null root", operation);
332 }
333 auto existing = std::find_if(
334 solutions.begin(), solutions.end(),
335 [&](const FiniteSolution& solution) {
336 return LMCAS::detail::node(solution.value)->equals(
337 *LMCAS::detail::node(root));
338 });
339 if (existing != solutions.end()) {
340 ++existing->multiplicity;
341 } else {
342 solutions.push_back(
343 FiniteSolution{std::move(root), 1, {}});
344 }
345 }
347 SolutionSet{FiniteSolutions{std::move(solutions)}});
348}
std::variant< EmptySolutions, UniversalSolutions, FiniteSolutions, IntervalSolutions, ConditionalSolutions, ParametricSolutions > SolutionSet
成功的 SolveResult 表示操作定义域内的完整解集。 完备性未决时返回外层 Inconclusive 错误;EmptySolutions 表示已证明的空解集。
conditions 是在操作上下文假设下须同时满足的条件。 空条件保留原表达式定义域且不增加约束;整数参数遍历全体整数。

引用了 collect_exact_solutions(), context, LMCAS::Result< SolutionSet >::failure(), InternalInvariant, LMCAS::detail::node(), roots() , 以及 LMCAS::Result< SolutionSet >::success().

被这些函数引用 collect_exact_solutions() , 以及 solve_exact_polynomial_set().

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

◆ collect_gcd_samples()

void LMCAS::collect_gcd_samples ( const MultiPoly & a_prim,
const MultiPoly & b_prim,
const std::string & main_var,
const std::vector< Rational > & eval_pts,
int num_points,
GcdSamples & samples )
static

在文件 multivariate_factor.cpp 第 273 行定义.

275 {
276 auto& used_pts = samples.points;
277 auto& gcd_vals = samples.values;
278 auto& target_deg = samples.target_degree;
279 for (size_t pi = 0; pi < eval_pts.size() &&
280 static_cast<int>(used_pts.size()) < num_points; ++pi) {
281 Rational pt = eval_pts[pi];
282 MultiPoly lc_a = a_prim.leading_coeff(main_var);
283 MultiPoly lc_b = b_prim.leading_coeff(main_var);
284 MultiPoly lca_ev = lc_a.eval(main_var, pt);
285 MultiPoly lcb_ev = lc_b.eval(main_var, pt);
286 if (lca_ev.is_zero() || lcb_ev.is_zero()) { continue; }
287 MultiPoly a_ev = a_prim.eval(main_var, pt);
288 MultiPoly b_ev = b_prim.eval(main_var, pt);
289 MultiPoly g_ev = multivariate_gcd(a_ev, b_ev);
290 int gd = g_ev.is_zero() ? -1 : g_ev.total_degree();
291 if (target_deg < 0) { target_deg = gd; }
292 else if (gd < target_deg) { used_pts.clear(); gcd_vals.clear(); target_deg = gd; }
293 else if (gd > target_deg) { continue; }
294 if (!g_ev.is_zero()) { g_ev = g_ev.make_primitive(); }
295 used_pts.push_back(pt);
296 gcd_vals.push_back(g_ev);
297 }
298}
std::vector< MultiPoly > values
ExprResult pi()
MultiPoly multivariate_gcd(const MultiPoly &a, const MultiPoly &b)
const std::string & main_var
std::vector< Rational > points

引用了 collect_gcd_samples(), main_var, multivariate_gcd(), pi(), LMCAS::GcdSamples::points, LMCAS::GcdSamples::target_degree , 以及 LMCAS::GcdSamples::values.

被这些函数引用 collect_gcd_samples(), extended_gcd_interpolation() , 以及 recursive_multivariate_gcd().

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

◆ collect_infinite_asymptotes()

Result< void > LMCAS::collect_infinite_asymptotes ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & pos_inf,
const std::shared_ptr< SymbolicExpr > & neg_inf,
ComputationContext & context,
AsymptoteResult & result )
static

在文件 calculus_asymptotes.cpp 第 328 行定义.

333{
334 auto positive = limit_expression_checked(f, var, pos_inf, LimitDirection::Both, context);
335 if (!positive) {
336 return Result<void>::failure(positive.error());
337 }
338 auto negative = limit_expression_checked(f, var, neg_inf, LimitDirection::Both, context);
339 if (!negative) {
340 return Result<void>::failure(negative.error());
341 }
342 auto lim_pos = std::move(positive.value());
343 auto lim_neg = std::move(negative.value());
344 const bool horizontal_pos = simplify_finite_limit(lim_pos, context);
345 const bool horizontal_neg = simplify_finite_limit(lim_neg, context);
346 if (horizontal_pos) result.horizontal.push_back(lim_pos);
347 if (horizontal_neg) {
348 if (!horizontal_pos || !calculus_utils_expr_equal(lim_pos, lim_neg)) {
349 result.horizontal.push_back(lim_neg);
350 }
351 }
352 auto x_expr = SymbolicExpr::variable(var);
353 if (!horizontal_pos && !horizontal_neg) {
354 std::shared_ptr<SymbolicExpr> slope;
355 std::shared_ptr<SymbolicExpr> intercept;
356 if (calculus_utils_oblique_from_rational(f, var, slope, intercept, context)) {
357 result.oblique.emplace_back(slope, intercept);
358 return Result<void>::success();
359 }
360 }
361 if (!horizontal_pos) {
362 auto status = collect_oblique_asymptote(f, var, x_expr, pos_inf, context, result);
363 if (!status) {
364 return status;
365 }
366 }
367 if (!horizontal_neg) {
368 return collect_oblique_asymptote(f, var, x_expr, neg_inf, context, result);
369 }
370 return Result<void>::success();
371}
bool calculus_utils_expr_equal(const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b)
判断两个表达式是否结构相等.
static Result< void > collect_oblique_asymptote(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &x_expr, const std::shared_ptr< SymbolicExpr > &infinity, ComputationContext &context, AsymptoteResult &result)
static bool simplify_finite_limit(std::shared_ptr< SymbolicExpr > &value, ComputationContext &context)
static bool calculus_utils_oblique_from_rational(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, std::shared_ptr< SymbolicExpr > &slope, std::shared_ptr< SymbolicExpr > &intercept, ComputationContext &context)
std::vector< std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > > oblique
斜渐近线 (斜率, 截距)
std::vector< std::shared_ptr< SymbolicExpr > > horizontal
水平渐近线 y = L

引用了 Both, LMCAS::calculus_utils_detail::calculus_utils_expr_equal(), calculus_utils_oblique_from_rational(), collect_infinite_asymptotes(), collect_oblique_asymptote(), context, LMCAS::Result< T >::failure(), LMCAS::AsymptoteResult::horizontal, limit_expression_checked(), LMCAS::AsymptoteResult::oblique, simplify_finite_limit() , 以及 LMCAS::Result< T >::success().

被这些函数引用 asymptotes_checked() , 以及 collect_infinite_asymptotes().

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

◆ collect_oblique_asymptote()

Result< void > LMCAS::collect_oblique_asymptote ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & x_expr,
const std::shared_ptr< SymbolicExpr > & infinity,
ComputationContext & context,
AsymptoteResult & result )
static

在文件 calculus_asymptotes.cpp 第 271 行定义.

276 {
277 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
278 (context).limits().max_ast_nodes, "transform");
279 auto quotient = SymbolicExpr::multiply(f,
280 SymbolicExpr::power(x_expr, SymbolicExpr::number(-1)));
281 auto slope_result = limit_expression_checked(
282 quotient, var, infinity, LimitDirection::Both, context);
283 if (!slope_result) {
284 return Result<void>::failure(slope_result.error());
285 }
286 auto slope = std::move(slope_result.value());
287 if (slope) slope = detail::make_expression_ptr(detail::normalize_node(detail::node(slope), transform_budget));
288 if (!slope || calculus_utils_is_infinity(slope) || slope->is_zero()) {
289 return Result<void>::success();
290 }
291 auto linear = SymbolicExpr::multiply(slope, x_expr);
292 auto remainder = SymbolicExpr::add(f,
293 SymbolicExpr::multiply(SymbolicExpr::number(-1), linear));
294 auto intercept_result = limit_expression_checked(
295 remainder, var, infinity, LimitDirection::Both, context);
296 if (!intercept_result) {
297 return Result<void>::failure(intercept_result.error());
298 }
299 auto intercept = std::move(intercept_result.value());
300 if (intercept) intercept = detail::make_expression_ptr(detail::normalize_node(detail::node(intercept), transform_budget));
301 if (intercept && !calculus_utils_is_infinity(intercept)) {
302 if (!has_oblique_asymptote(result, slope, intercept)) {
303 result.oblique.emplace_back(slope, intercept);
304 }
305 }
306 return Result<void>::success();
307} catch (const CasError& error) {
308 return Result<void>::failure(error);
309} catch (const std::bad_alloc&) {
310 return Result<void>::failure(CasErrc::ResourceLimit, "allocation failed", "collect_oblique_asymptote");
311} catch (const std::length_error& error) {
312 return Result<void>::failure(CasErrc::ResourceLimit, error.what(), "collect_oblique_asymptote");
313} catch (const std::exception& error) {
314 return Result<void>::failure(CasErrc::InternalInvariant, error.what(), "collect_oblique_asymptote");
315}
bool calculus_utils_is_infinity(const std::shared_ptr< SymbolicExpr > &expr)
判断表达式是否包含无穷大节点.
static bool has_oblique_asymptote(const AsymptoteResult &result, const std::shared_ptr< SymbolicExpr > &slope, const std::shared_ptr< SymbolicExpr > &intercept)

引用了 Both, LMCAS::calculus_utils_detail::calculus_utils_is_infinity(), collect_oblique_asymptote(), context, LMCAS::Result< T >::failure(), has_oblique_asymptote(), limit_expression_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::AsymptoteResult::oblique , 以及 LMCAS::Result< T >::success().

被这些函数引用 collect_infinite_asymptotes() , 以及 collect_oblique_asymptote().

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

◆ collect_operand_denominators()

bool LMCAS::collect_operand_denominators ( const std::vector< std::shared_ptr< const SymbolicNode > > & operands,
std::vector< std::shared_ptr< const SymbolicNode > > & den_factors,
std::vector< std::shared_ptr< SymbolicExpr > > & den_constraints )
static

在文件 solver_linear.cpp 第 184 行定义.

187 {
188 for (const auto& operand : operands) {
189 if (!collect_denominator_factors(operand, den_factors, den_constraints)) {
190 return false;
191 }
192 }
193 return true;
194}
bool collect_denominator_factors(const std::shared_ptr< const SymbolicNode > &node, std::vector< std::shared_ptr< const SymbolicNode > > &denominator_factors, std::vector< std::shared_ptr< SymbolicExpr > > &denominator_constraints)

引用了 LMCAS::solver_detail::collect_denominator_factors() , 以及 collect_operand_denominators().

被这些函数引用 LMCAS::solver_detail::collect_denominator_factors() , 以及 collect_operand_denominators().

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

◆ collect_power_denominators()

bool LMCAS::collect_power_denominators ( const PowerNode & power,
std::vector< std::shared_ptr< const SymbolicNode > > & den_factors,
std::vector< std::shared_ptr< SymbolicExpr > > & den_constraints )
static

在文件 solver_linear.cpp 第 196 行定义.

199 {
200 BigInt exp(0);
201 if (!get_integer_value(power.exponent(), exp)) {
202 return false;
203 }
204
205 if (exp < 0) {
206 if (!is_polynomial_node(power.base())) {
207 return false;
208 }
209 BigInt k = -exp;
210 if (k == 1) {
211 den_factors.push_back(power.base());
212 } else {
213 den_factors.push_back(SymbolicFactory::create_power(power.base(), SymbolicFactory::create_number(k)));
214 }
215 den_constraints.push_back(LMCAS::detail::make_expression_ptr(power.base()));
216 return true;
217 }
218
219 if (!collect_denominator_factors(power.base(), den_factors, den_constraints)) {
220 return false;
221 }
222 return true;
223}
static std::shared_ptr< const SymbolicNode > create_power(std::shared_ptr< const SymbolicNode > base, std::shared_ptr< const SymbolicNode > exponent)
创建幂运算节点,自动处理指数为 0/1 及底数为 0/1 的情况.
static std::shared_ptr< const SymbolicNode > create_number(const ::LMCAS::BigInt &v)
bool is_polynomial_node(const std::shared_ptr< const SymbolicNode > &node)
ExprResult exp(const ExprPtr &expression, ComputationContext &context)
static bool get_integer_value(const std::shared_ptr< const SymbolicNode > &node, BigInt &value)

引用了 LMCAS::PowerNode::base(), LMCAS::solver_detail::collect_denominator_factors(), collect_power_denominators(), LMCAS::SymbolicFactory::create_number(), LMCAS::SymbolicFactory::create_power(), exp(), LMCAS::PowerNode::exponent(), get_integer_value(), LMCAS::solver_detail::is_polynomial_node() , 以及 LMCAS::detail::make_expression_ptr().

被这些函数引用 LMCAS::solver_detail::collect_denominator_factors() , 以及 collect_power_denominators().

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

◆ collect_scalar_radical()

bool LMCAS::collect_scalar_radical ( const SymbolicNode * node,
Rational & coefficient,
const NumberNode *& radicand )
static

在文件 solver_assumptions.cpp 第 122 行定义.

123 {
124 const auto* product = dynamic_cast<const MultiplyNode*>(node);
125 if (!product) {
126 radicand = exact_scalar_radicand(node);
127 return radicand != nullptr;
128 }
129 for (const auto& factor : product->operands()) {
130 if (const auto* number = exact_scalar_number(factor.get())) {
131 coefficient = coefficient * exact_number_as_rational(*number);
132 } else {
133 if (radicand) {
134 return false;
135 }
136 radicand = exact_scalar_radicand(factor.get());
137 if (!radicand) {
138 return false;
139 }
140 }
141 }
142 return radicand != nullptr;
143}
乘法节点,表示多个操作数的乘积。
static const NumberNode * exact_scalar_radicand(const SymbolicNode *node)
static const NumberNode * exact_scalar_number(const SymbolicNode *node)

引用了 collect_scalar_radical(), exact_number_as_rational(), exact_scalar_number() , 以及 exact_scalar_radicand().

被这些函数引用 collect_scalar_radical() , 以及 exact_radical_domain_excludes().

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

◆ collect_vertical_asymptotes()

Result< void > LMCAS::collect_vertical_asymptotes ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
ComputationContext & context,
AsymptoteResult & result,
const std::string & operation )
static

在文件 calculus_asymptotes.cpp 第 232 行定义.

236{
238 if (!denominator) {
239 return Result<void>::success();
240 }
241 auto zeros = asymptote_candidates(denominator, var, context, operation);
242 if (!zeros) {
243 return Result<void>::failure(zeros.error());
244 }
245 for (const auto& point : zeros.value()) {
247 continue;
248 }
249 auto vertical = is_vertical_asymptote(f, var, point, context);
250 if (!vertical) {
251 return Result<void>::failure(vertical.error());
252 }
253 if (vertical.value()) result.vertical.push_back(point);
254 }
255 return Result<void>::success();
256}
const std::string const LimitExprPtr & point
static SymbolicExprVectorResult asymptote_candidates(const std::shared_ptr< SymbolicExpr > &denominator, const std::string &var, ComputationContext &context, const std::string &operation)
static Result< bool > is_vertical_asymptote(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &point, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > calculus_utils_extract_denominator(const std::shared_ptr< SymbolicExpr > &expr)
std::vector< std::shared_ptr< SymbolicExpr > > vertical
垂直渐近线 x = a

引用了 asymptote_candidates(), calculus_utils_extract_denominator(), LMCAS::calculus_utils_detail::calculus_utils_is_infinity(), collect_vertical_asymptotes(), context, denominator, LMCAS::Result< T >::failure(), is_vertical_asymptote(), point, LMCAS::Result< T >::success() , 以及 LMCAS::AsymptoteResult::vertical.

被这些函数引用 asymptotes_checked() , 以及 collect_vertical_asymptotes().

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

◆ combine_operands()

template<typename Operation>
std::shared_ptr< const SymbolicNode > LMCAS::combine_operands ( std::vector< std::shared_ptr< const SymbolicNode > > operands)
static

在文件 matcher.cpp 第 68 行定义.

69 {
70 if constexpr (std::is_same_v<Operation, AddNode>) {
71 return SymbolicFactory::create_add(std::move(operands));
72 } else {
73 return SymbolicFactory::create_multiply(std::move(operands));
74 }
75}
static std::shared_ptr< const SymbolicNode > create_add(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建加法节点,自动扁平化嵌套加法并消除零项.
static std::shared_ptr< const SymbolicNode > create_multiply(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建乘法节点,自动扁平化嵌套乘法并消除单位元.

引用了 combine_operands(), LMCAS::SymbolicFactory::create_add() , 以及 LMCAS::SymbolicFactory::create_multiply().

被这些函数引用 combine_operands() , 以及 record_remainder().

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

◆ comparable_endpoint() [1/3]

Result< ComparableEndpoint > LMCAS::detail::comparable_endpoint ( const Endpoint & endpoint,
ComputationContext & context,
const std::string & operation )

在文件 interval_endpoint.cpp 第 310 行定义.

313 {
314 auto step = context.consume_steps(1, operation);
315 if (!step) {
316 return Result<ComparableEndpoint>::failure(step.error());
317 }
318
319 if (endpoint.is_neg_infinity && endpoint.is_pos_infinity) {
322 "an endpoint cannot be both negative and positive infinity",
323 operation);
324 }
325 if (endpoint.is_neg_infinity || endpoint.is_pos_infinity) {
326 if (endpoint.value) {
329 "infinite endpoints cannot also contain a finite value",
330 operation);
331 }
332 if (!endpoint.is_open) {
335 "infinite interval endpoints must be open",
336 operation);
337 }
339 ComparableEndpoint{endpoint.is_neg_infinity ? -1 : 1,
340 Rational(0), Rational(0), Rational(0)});
341 }
342 return comparable_finite_endpoint(endpoint, context, operation);
343}
Result< ComparableEndpoint > comparable_finite_endpoint(const Endpoint &endpoint, ComputationContext &context, const std::string &operation)

被这些函数引用 LMCAS::anonymous_namespace{interval_set_operations.cpp}::checked_interval_views(), LMCAS::anonymous_namespace{interval_normalization.cpp}::collect_nonempty_intervals(), interval_contains_checked() , 以及 interval_is_empty_checked().

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

◆ comparable_endpoint() [2/3]

Result< ComparableEndpoint > LMCAS::detail::comparable_endpoint ( const Endpoint & endpoint,
ComputationContext & context,
const std::string & operation )

在文件 interval_endpoint.cpp 第 310 行定义.

313 {
314 auto step = context.consume_steps(1, operation);
315 if (!step) {
316 return Result<ComparableEndpoint>::failure(step.error());
317 }
318
319 if (endpoint.is_neg_infinity && endpoint.is_pos_infinity) {
322 "an endpoint cannot be both negative and positive infinity",
323 operation);
324 }
325 if (endpoint.is_neg_infinity || endpoint.is_pos_infinity) {
326 if (endpoint.value) {
329 "infinite endpoints cannot also contain a finite value",
330 operation);
331 }
332 if (!endpoint.is_open) {
335 "infinite interval endpoints must be open",
336 operation);
337 }
339 ComparableEndpoint{endpoint.is_neg_infinity ? -1 : 1,
340 Rational(0), Rational(0), Rational(0)});
341 }
342 return comparable_finite_endpoint(endpoint, context, operation);
343}

◆ comparable_endpoint() [3/3]

Result< ComparableEndpoint > LMCAS::detail::comparable_endpoint ( const Endpoint & endpoint,
ComputationContext & context,
const std::string & operation )

在文件 interval_endpoint.cpp 第 310 行定义.

313 {
314 auto step = context.consume_steps(1, operation);
315 if (!step) {
316 return Result<ComparableEndpoint>::failure(step.error());
317 }
318
319 if (endpoint.is_neg_infinity && endpoint.is_pos_infinity) {
322 "an endpoint cannot be both negative and positive infinity",
323 operation);
324 }
325 if (endpoint.is_neg_infinity || endpoint.is_pos_infinity) {
326 if (endpoint.value) {
329 "infinite endpoints cannot also contain a finite value",
330 operation);
331 }
332 if (!endpoint.is_open) {
335 "infinite interval endpoints must be open",
336 operation);
337 }
339 ComparableEndpoint{endpoint.is_neg_infinity ? -1 : 1,
340 Rational(0), Rational(0), Rational(0)});
341 }
342 return comparable_finite_endpoint(endpoint, context, operation);
343}

◆ compare_comparable() [1/3]

在文件 interval_endpoint_order.cpp 第 71 行定义.

73 {
74 if (left.infinity < right.infinity) {
75 return Result<int>::success(-1);
76 }
77 if (left.infinity > right.infinity) {
78 return Result<int>::success(1);
79 }
80 if (left.infinity != 0) {
81 return Result<int>::success(0);
82 }
83
84 const bool left_radical =
85 left.radical_coefficient != Rational(0) || left.algebraic.has_value();
86 const bool right_radical =
87 right.radical_coefficient != Rational(0) || right.algebraic.has_value();
88 if (!left_radical && !right_radical) {
90 }
91 if (left.algebraic && !right_radical) {
94 }
95 if (right.algebraic && !left_radical) {
98 }
99 auto left_algebraic = to_algebraic(left, context);
100 if (!left_algebraic) {
101 return Result<int>::failure(left_algebraic.error());
102 }
103 auto right_algebraic = to_algebraic(right, context);
104 if (!right_algebraic) {
105 return Result<int>::failure(right_algebraic.error());
106 }
108 left_algebraic.value(), right_algebraic.value(), context);
109}
int compare_algebraic_to_rational(const ExactRealAlgebraic &algebraic, const Rational &rational)
ExactRealAlgebraicResult to_algebraic(const ComparableEndpoint &endpoint, ComputationContext &context)
Result< int > compare_exact_real_algebraic(ExactRealAlgebraic lhs, ExactRealAlgebraic rhs, ComputationContext &context)
std::optional< LMCAS::detail::ExactRealAlgebraic > algebraic

被这些函数引用 LMCAS::anonymous_namespace{interval_normalization.cpp}::collect_nonempty_intervals(), interval_contains_checked(), interval_is_empty_checked(), LMCAS::anonymous_namespace{interval_normalization.cpp}::merge_checked_intervals() , 以及 LMCAS::anonymous_namespace{interval_normalization.cpp}::sort_checked_intervals().

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

◆ compare_comparable() [2/3]

在文件 interval_endpoint_order.cpp 第 71 行定义.

73 {
74 if (left.infinity < right.infinity) {
75 return Result<int>::success(-1);
76 }
77 if (left.infinity > right.infinity) {
78 return Result<int>::success(1);
79 }
80 if (left.infinity != 0) {
81 return Result<int>::success(0);
82 }
83
84 const bool left_radical =
85 left.radical_coefficient != Rational(0) || left.algebraic.has_value();
86 const bool right_radical =
87 right.radical_coefficient != Rational(0) || right.algebraic.has_value();
88 if (!left_radical && !right_radical) {
90 }
91 if (left.algebraic && !right_radical) {
94 }
95 if (right.algebraic && !left_radical) {
98 }
99 auto left_algebraic = to_algebraic(left, context);
100 if (!left_algebraic) {
101 return Result<int>::failure(left_algebraic.error());
102 }
103 auto right_algebraic = to_algebraic(right, context);
104 if (!right_algebraic) {
105 return Result<int>::failure(right_algebraic.error());
106 }
108 left_algebraic.value(), right_algebraic.value(), context);
109}

◆ compare_comparable() [3/3]

在文件 interval_endpoint_order.cpp 第 71 行定义.

73 {
74 if (left.infinity < right.infinity) {
75 return Result<int>::success(-1);
76 }
77 if (left.infinity > right.infinity) {
78 return Result<int>::success(1);
79 }
80 if (left.infinity != 0) {
81 return Result<int>::success(0);
82 }
83
84 const bool left_radical =
85 left.radical_coefficient != Rational(0) || left.algebraic.has_value();
86 const bool right_radical =
87 right.radical_coefficient != Rational(0) || right.algebraic.has_value();
88 if (!left_radical && !right_radical) {
90 }
91 if (left.algebraic && !right_radical) {
94 }
95 if (right.algebraic && !left_radical) {
98 }
99 auto left_algebraic = to_algebraic(left, context);
100 if (!left_algebraic) {
101 return Result<int>::failure(left_algebraic.error());
102 }
103 auto right_algebraic = to_algebraic(right, context);
104 if (!right_algebraic) {
105 return Result<int>::failure(right_algebraic.error());
106 }
108 left_algebraic.value(), right_algebraic.value(), context);
109}

◆ complementary_square()

bool LMCAS::complementary_square ( const std::shared_ptr< const SymbolicNode > & node,
const TrigSquare & square )
static

在文件 transcendental_pythagorean.cpp 第 111 行定义.

112 {
113 TrigSquare other;
115 node, other.coefficient, other.type, other.argument)) {
116 return false;
117 }
118 const auto target = square.type == FunctionNode::FuncType::Sin
120 if (other.type != target || !square.argument || !other.argument ||
121 !square.argument->equals(*other.argument)) {
122 return false;
123 }
124 if (!square.coefficient || !other.coefficient) {
125 return !square.coefficient && !other.coefficient;
126 }
127 return square.coefficient->equals(*other.coefficient);
128}
bool equals(const SymbolicNode &other) const
判断两个节点是否结构相等.
const ExprPtr & target
std::shared_ptr< const SymbolicNode > argument
static bool tf_extract_coeff_trig_squared(const std::shared_ptr< const SymbolicNode > &node, std::shared_ptr< const SymbolicNode > &coeff, FunctionNode::FuncType &func_type, std::shared_ptr< const SymbolicNode > &argument)
从 a*sin^2(f) 或 a*cos^2(f) 提取系数和三角平方项。
std::shared_ptr< const SymbolicNode > coefficient

引用了 LMCAS::TrigSquare::argument, LMCAS::TrigSquare::coefficient, complementary_square(), LMCAS::FunctionNode::Cos, LMCAS::SymbolicNode::equals(), LMCAS::FunctionNode::Sin, target, tf_extract_coeff_trig_squared() , 以及 LMCAS::TrigSquare::type.

被这些函数引用 complementary_square() , 以及 find_complementary_square().

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

◆ complex()

ExprResult LMCAS::complex ( ExprPtr real,
ExprPtr imag )

在文件 expr_values.cpp 第 128 行定义.

128 {
129 if (!real || !imag) {
131 "complex expression parts cannot be null",
133 }
134 try {
138 } catch (const std::bad_alloc&) {
140 "complex expression allocation failed",
142 } catch (const std::exception& error) {
145 }
146}
constexpr const char * kComplexOperation

引用了 complex(), LMCAS::SymbolicFactory::create_complex(), LMCAS::expr_detail::expr_common::expression_failure(), imag, InternalInvariant, InvalidArgument, LMCAS::expr_detail::expr_common::kComplexOperation, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), real(), ResourceLimit , 以及 LMCAS::Result< ExprPtr >::success().

被这些函数引用 LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::ComplexProduct::accumulate(), calculus_utils_contains_nonreal_sqrt(), calculus_utils_extract_real_candidate(), LMCAS::equivalence_detail::canonicalize_complex_product(), LMCAS::anonymous_namespace{residual_verification.cpp}::collect_residual_profiles(), complex(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::complex_facts(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_node(), LMCAS::anonymous_namespace{limit_result.cpp}::elementary_continuous_structure(), LMCAS::detail::evaluate_root_complex(), LMCAS::NormalizationVisitor::expand_product(), imaginary_unit(), LMCAS::NormalizationVisitor::merge_complex_terms() , 以及 LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::structural().

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

◆ complex_abs_checked() [1/2]

ExpressionResult LMCAS::complex_abs_checked ( const ComplexSymbolic & z)

在文件 symbolic_complex.cpp 第 193 行定义.

193 {
195 return complex_abs_checked(z, context);
196}
ExpressionResult complex_abs_checked(const ComplexSymbolic &z, ComputationContext &context)

引用了 complex_abs_checked() , 以及 context.

函数调用图:

◆ complex_abs_checked() [2/2]

ExpressionResult LMCAS::complex_abs_checked ( const ComplexSymbolic & z,
ComputationContext & context )

在文件 symbolic_complex.cpp 第 182 行定义.

182 {
183 auto vz = validate_complex_symbolic(z, "z", context, kComplexAbsOperation);
184 if (!vz) return ExpressionResult::failure(vz.error());
185 auto budget = context.consume_steps(8, kComplexAbsOperation);
186 if (!budget) return ExpressionResult::failure(budget.error());
187 return checked_construct<std::shared_ptr<SymbolicExpr>>([&]() {
188 return SymbolicExpr::sqrt(SymbolicExpr::add(
189 SymbolicExpr::power(z.real, SymbolicExpr::number(2)),
190 SymbolicExpr::power(z.imag, SymbolicExpr::number(2))));
191 }, kComplexAbsOperation);
192}
std::shared_ptr< SymbolicExpr > real
实部
std::shared_ptr< SymbolicExpr > imag
虚部

引用了 complex_abs_checked(), context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::ComplexSymbolic::imag , 以及 LMCAS::ComplexSymbolic::real.

被这些函数引用 complex_abs_checked(), complex_abs_checked(), complex_locus_circle_checked() , 以及 complex_locus_perpendicular_bisector_checked().

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

◆ complex_add_checked() [1/2]

ComplexSymbolicResult LMCAS::complex_add_checked ( const ComplexSymbolic & a,
const ComplexSymbolic & b )

在文件 symbolic_complex.cpp 第 91 行定义.

91 {
94}
ComplexSymbolicResult complex_add_checked(const ComplexSymbolic &a, const ComplexSymbolic &b, ComputationContext &context)

引用了 a, b, complex_add_checked() , 以及 context.

函数调用图:

◆ complex_add_checked() [2/2]

ComplexSymbolicResult LMCAS::complex_add_checked ( const ComplexSymbolic & a,
const ComplexSymbolic & b,
ComputationContext & context )

在文件 symbolic_complex.cpp 第 79 行定义.

80 {
81 auto va = validate_complex_symbolic(a, "a", context, kComplexAddOperation);
82 if (!va) return ComplexSymbolicResult::failure(va.error());
83 auto vb = validate_complex_symbolic(b, "b", context, kComplexAddOperation);
84 if (!vb) return ComplexSymbolicResult::failure(vb.error());
85 auto budget = context.consume_steps(4, kComplexAddOperation);
86 if (!budget) return ComplexSymbolicResult::failure(budget.error());
87 return checked_construct<ComplexSymbolic>([&]() {
88 return make_complex(SymbolicExpr::add(a.real, b.real), SymbolicExpr::add(a.imag, b.imag));
89 }, kComplexAddOperation);
90}
ComplexSymbolic make_complex(std::shared_ptr< SymbolicExpr > real, std::shared_ptr< SymbolicExpr > imag)
构造符号复数

引用了 a, b, complex_add_checked(), context, LMCAS::Result< ComplexSymbolic >::failure() , 以及 make_complex().

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

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

◆ complex_arg_checked() [1/2]

ExpressionResult LMCAS::complex_arg_checked ( const ComplexSymbolic & z)

在文件 symbolic_complex.cpp 第 207 行定义.

207 {
209 return complex_arg_checked(z, context);
210}
ExpressionResult complex_arg_checked(const ComplexSymbolic &z, ComputationContext &context)

引用了 complex_arg_checked() , 以及 context.

函数调用图:

◆ complex_arg_checked() [2/2]

ExpressionResult LMCAS::complex_arg_checked ( const ComplexSymbolic & z,
ComputationContext & context )

在文件 symbolic_complex.cpp 第 198 行定义.

198 {
199 auto vz = validate_complex_symbolic(z, "z", context, kComplexArgOperation);
200 if (!vz) return ExpressionResult::failure(vz.error());
201 auto budget = context.consume_steps(4, kComplexArgOperation);
202 if (!budget) return ExpressionResult::failure(budget.error());
203 return checked_construct<std::shared_ptr<SymbolicExpr>>([&]() {
204 return SymbolicExpr::atan2(z.imag, z.real);
205 }, kComplexArgOperation);
206}

引用了 complex_arg_checked(), context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::ComplexSymbolic::imag , 以及 LMCAS::ComplexSymbolic::real.

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

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

◆ complex_conj_checked() [1/2]

ComplexSymbolicResult LMCAS::complex_conj_checked ( const ComplexSymbolic & z)

在文件 symbolic_complex.cpp 第 177 行定义.

177 {
179 return complex_conj_checked(z, context);
180}
ComplexSymbolicResult complex_conj_checked(const ComplexSymbolic &z, ComputationContext &context)

引用了 complex_conj_checked() , 以及 context.

函数调用图:

◆ complex_conj_checked() [2/2]

ComplexSymbolicResult LMCAS::complex_conj_checked ( const ComplexSymbolic & z,
ComputationContext & context )

在文件 symbolic_complex.cpp 第 168 行定义.

168 {
169 auto vz = validate_complex_symbolic(z, "z", context, kComplexConjOperation);
170 if (!vz) return ComplexSymbolicResult::failure(vz.error());
171 auto budget = context.consume_steps(3, kComplexConjOperation);
172 if (!budget) return ComplexSymbolicResult::failure(budget.error());
173 return checked_construct<ComplexSymbolic>([&]() {
174 return make_complex(z.real, SymbolicExpr::multiply(SymbolicExpr::number(-1), z.imag));
175 }, kComplexConjOperation);
176}

引用了 complex_conj_checked(), context, LMCAS::Result< ComplexSymbolic >::failure(), LMCAS::ComplexSymbolic::imag, make_complex() , 以及 LMCAS::ComplexSymbolic::real.

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

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

◆ complex_div_checked() [1/2]

ComplexSymbolicResult LMCAS::complex_div_checked ( const ComplexSymbolic & a,
const ComplexSymbolic & b )

在文件 symbolic_complex.cpp 第 163 行定义.

163 {
165 return complex_div_checked(a, b, context);
166}
ComplexSymbolicResult complex_div_checked(const ComplexSymbolic &a, const ComplexSymbolic &b, ComputationContext &context)

引用了 a, b, complex_div_checked() , 以及 context.

函数调用图:

◆ complex_div_checked() [2/2]

ComplexSymbolicResult LMCAS::complex_div_checked ( const ComplexSymbolic & a,
const ComplexSymbolic & b,
ComputationContext & context )

在文件 symbolic_complex.cpp 第 137 行定义.

138 {
139 auto va = validate_complex_symbolic(a, "a", context, kComplexDivOperation);
140 if (!va) return ComplexSymbolicResult::failure(va.error());
141 auto vb = validate_complex_symbolic(b, "b", context, kComplexDivOperation);
142 if (!vb) return ComplexSymbolicResult::failure(vb.error());
143 if (LMCAS::detail::node(b.real)->is_zero() && LMCAS::detail::node(b.imag)->is_zero()) {
145 CasErrc::DomainError, "complex division by zero", kComplexDivOperation);
146 }
147 auto budget = context.consume_steps(16, kComplexDivOperation);
148 if (!budget) return ComplexSymbolicResult::failure(budget.error());
149 return checked_construct<ComplexSymbolic>([&]() {
150 auto denom = SymbolicExpr::add(SymbolicExpr::power(b.real, SymbolicExpr::number(2)),
151 SymbolicExpr::power(b.imag, SymbolicExpr::number(2)));
152 auto real = SymbolicExpr::divide(
153 SymbolicExpr::add(SymbolicExpr::multiply(a.real, b.real), SymbolicExpr::multiply(a.imag, b.imag)),
154 denom);
155 auto imag = SymbolicExpr::divide(
156 SymbolicExpr::add(SymbolicExpr::multiply(a.imag, b.real),
157 SymbolicExpr::multiply(SymbolicExpr::number(-1),
158 SymbolicExpr::multiply(a.real, b.imag))),
159 denom);
160 return make_complex(real, imag);
162}
virtual bool is_zero() const

引用了 a, b, complex_div_checked(), context, DomainError, LMCAS::Result< ComplexSymbolic >::failure(), imag, LMCAS::SymbolicNode::is_zero(), make_complex(), LMCAS::detail::node() , 以及 real().

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

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

◆ complex_exp_form_checked() [1/2]

ComplexSymbolicResult LMCAS::complex_exp_form_checked ( std::shared_ptr< SymbolicExpr > r,
std::shared_ptr< SymbolicExpr > theta )

在文件 symbolic_complex.cpp 第 227 行定义.

228 {
230 return complex_exp_form_checked(std::move(r), std::move(theta), context);
231}
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > r
ComplexSymbolicResult complex_exp_form_checked(std::shared_ptr< SymbolicExpr > r, std::shared_ptr< SymbolicExpr > theta, ComputationContext &context)

引用了 complex_exp_form_checked(), context , 以及 r.

函数调用图:

◆ complex_exp_form_checked() [2/2]

ComplexSymbolicResult LMCAS::complex_exp_form_checked ( std::shared_ptr< SymbolicExpr > r,
std::shared_ptr< SymbolicExpr > theta,
ComputationContext & context )

在文件 symbolic_complex.cpp 第 212 行定义.

214 {
215 auto vr = validate_expr(r, "r", context, kComplexPolarOperation);
216 if (!vr) return ComplexSymbolicResult::failure(vr.error());
217 auto vt = validate_expr(theta, "theta", context, kComplexPolarOperation);
218 if (!vt) return ComplexSymbolicResult::failure(vt.error());
219 auto budget = context.consume_steps(6, kComplexPolarOperation);
220 if (!budget) return ComplexSymbolicResult::failure(budget.error());
221 return checked_construct<ComplexSymbolic>([&]() {
222 auto real = SymbolicExpr::multiply(r, SymbolicExpr::cos(theta));
223 auto imag = SymbolicExpr::multiply(r, SymbolicExpr::sin(theta));
224 return make_complex(real, imag);
225 }, kComplexPolarOperation);
226}

引用了 complex_exp_form_checked(), context, LMCAS::Result< ComplexSymbolic >::failure(), imag, make_complex(), r , 以及 real().

被这些函数引用 complex_exp_form_checked(), complex_exp_form_checked(), complex_trig_form_checked() , 以及 solve_complex_nth_root_checked().

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

◆ complex_locus_circle_checked() [1/2]

ExpressionResult LMCAS::complex_locus_circle_checked ( const ComplexSymbolic & a,
std::shared_ptr< SymbolicExpr > r,
const std::string & z_var )

在文件 symbolic_complex.cpp 第 347 行定义.

349 {
351 return complex_locus_circle_checked(a, std::move(r), z_var, context);
352}
ExpressionResult complex_locus_circle_checked(const ComplexSymbolic &a, std::shared_ptr< SymbolicExpr > r, const std::string &z_var, ComputationContext &context)
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > const std::string & z_var

引用了 a, complex_locus_circle_checked(), context, r , 以及 z_var.

函数调用图:

◆ complex_locus_circle_checked() [2/2]

ExpressionResult LMCAS::complex_locus_circle_checked ( const ComplexSymbolic & a,
std::shared_ptr< SymbolicExpr > r,
const std::string & z_var,
ComputationContext & context )

在文件 symbolic_complex.cpp 第 317 行定义.

319 {
320 auto va = validate_complex_symbolic(
321 a, "a", context, kComplexLocusCircleOperation);
322 if (!va) return ExpressionResult::failure(va.error());
323 auto vr = validate_expr(r, "r", context, kComplexLocusCircleOperation);
324 if (!vr) return ExpressionResult::failure(vr.error());
325 if (z_var.empty()) {
327 CasErrc::InvalidArgument, "complex variable must not be empty",
328 kComplexLocusCircleOperation);
329 }
330 return checked_construct<std::shared_ptr<SymbolicExpr>>(
331 [&]() -> ExpressionResult {
332 auto z = SymbolicExpr::variable(z_var);
333 auto difference = complex_sub_checked(
334 make_complex(z, SymbolicExpr::number(0)), a, context);
335 if (!difference) {
336 return ExpressionResult::failure(difference.error());
337 }
338 auto magnitude =
339 complex_abs_checked(difference.value(), context);
340 if (!magnitude) {
341 return ExpressionResult::failure(magnitude.error());
342 }
343 return SymbolicExpr::eq(magnitude.value(), r);
345}
ComplexSymbolicResult complex_sub_checked(const ComplexSymbolic &a, const ComplexSymbolic &b, ComputationContext &context)
Result< std::shared_ptr< SymbolicExpr > > ExpressionResult
Result of an operation that produces a symbolic expression.

引用了 a, complex_abs_checked(), complex_locus_circle_checked(), complex_sub_checked(), context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InvalidArgument, make_complex(), r , 以及 z_var.

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

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

◆ complex_locus_perpendicular_bisector_checked() [1/2]

ExpressionResult LMCAS::complex_locus_perpendicular_bisector_checked ( const ComplexSymbolic & a,
const ComplexSymbolic & b,
const std::string & z_var )

在文件 symbolic_complex.cpp 第 391 行定义.

393 {
396 a, b, z_var, context);
397}
ExpressionResult complex_locus_perpendicular_bisector_checked(const ComplexSymbolic &a, const ComplexSymbolic &b, const std::string &z_var, ComputationContext &context)

引用了 a, b, complex_locus_perpendicular_bisector_checked(), context , 以及 z_var.

函数调用图:

◆ complex_locus_perpendicular_bisector_checked() [2/2]

ExpressionResult LMCAS::complex_locus_perpendicular_bisector_checked ( const ComplexSymbolic & a,
const ComplexSymbolic & b,
const std::string & z_var,
ComputationContext & context )

在文件 symbolic_complex.cpp 第 354 行定义.

356 {
357 auto va = validate_complex_symbolic(
358 a, "a", context, kComplexLocusBisectorOperation);
359 if (!va) return ExpressionResult::failure(va.error());
360 auto vb = validate_complex_symbolic(
361 b, "b", context, kComplexLocusBisectorOperation);
362 if (!vb) return ExpressionResult::failure(vb.error());
363 if (z_var.empty()) {
365 CasErrc::InvalidArgument, "complex variable must not be empty",
366 kComplexLocusBisectorOperation);
367 }
368 return checked_construct<std::shared_ptr<SymbolicExpr>>(
369 [&]() -> ExpressionResult {
370 auto z = SymbolicExpr::variable(z_var);
371 auto z_as_complex =
372 make_complex(z, SymbolicExpr::number(0));
373 auto from_a = complex_sub_checked(z_as_complex, a, context);
374 if (!from_a) return ExpressionResult::failure(from_a.error());
375 auto from_b = complex_sub_checked(z_as_complex, b, context);
376 if (!from_b) return ExpressionResult::failure(from_b.error());
377 auto distance_a =
378 complex_abs_checked(from_a.value(), context);
379 if (!distance_a) {
380 return ExpressionResult::failure(distance_a.error());
381 }
382 auto distance_b =
383 complex_abs_checked(from_b.value(), context);
384 if (!distance_b) {
385 return ExpressionResult::failure(distance_b.error());
386 }
387 return SymbolicExpr::eq(distance_a.value(), distance_b.value());
389}

引用了 a, b, complex_abs_checked(), complex_locus_perpendicular_bisector_checked(), complex_sub_checked(), context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InvalidArgument, make_complex() , 以及 z_var.

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

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

◆ complex_mul_checked() [1/2]

ComplexSymbolicResult LMCAS::complex_mul_checked ( const ComplexSymbolic & a,
const ComplexSymbolic & b )

在文件 symbolic_complex.cpp 第 132 行定义.

132 {
134 return complex_mul_checked(a, b, context);
135}
ComplexSymbolicResult complex_mul_checked(const ComplexSymbolic &a, const ComplexSymbolic &b, ComputationContext &context)

引用了 a, b, complex_mul_checked() , 以及 context.

函数调用图:

◆ complex_mul_checked() [2/2]

ComplexSymbolicResult LMCAS::complex_mul_checked ( const ComplexSymbolic & a,
const ComplexSymbolic & b,
ComputationContext & context )

在文件 symbolic_complex.cpp 第 115 行定义.

116 {
117 auto va = validate_complex_symbolic(a, "a", context, kComplexMulOperation);
118 if (!va) return ComplexSymbolicResult::failure(va.error());
119 auto vb = validate_complex_symbolic(b, "b", context, kComplexMulOperation);
120 if (!vb) return ComplexSymbolicResult::failure(vb.error());
121 auto budget = context.consume_steps(10, kComplexMulOperation);
122 if (!budget) return ComplexSymbolicResult::failure(budget.error());
123 return checked_construct<ComplexSymbolic>([&]() {
124 auto real = SymbolicExpr::add(
125 SymbolicExpr::multiply(a.real, b.real),
126 SymbolicExpr::multiply(SymbolicExpr::number(-1), SymbolicExpr::multiply(a.imag, b.imag)));
127 auto imag = SymbolicExpr::add(SymbolicExpr::multiply(a.real, b.imag),
128 SymbolicExpr::multiply(a.imag, b.real));
129 return make_complex(real, imag);
130 }, kComplexMulOperation);
131}

引用了 a, b, complex_mul_checked(), context, LMCAS::Result< ComplexSymbolic >::failure(), imag, make_complex() , 以及 real().

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

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

◆ complex_sub_checked() [1/2]

ComplexSymbolicResult LMCAS::complex_sub_checked ( const ComplexSymbolic & a,
const ComplexSymbolic & b )

在文件 symbolic_complex.cpp 第 110 行定义.

110 {
112 return complex_sub_checked(a, b, context);
113}

引用了 a, b, complex_sub_checked() , 以及 context.

函数调用图:

◆ complex_sub_checked() [2/2]

ComplexSymbolicResult LMCAS::complex_sub_checked ( const ComplexSymbolic & a,
const ComplexSymbolic & b,
ComputationContext & context )

在文件 symbolic_complex.cpp 第 96 行定义.

97 {
98 auto va = validate_complex_symbolic(a, "a", context, kComplexSubOperation);
99 if (!va) return ComplexSymbolicResult::failure(va.error());
100 auto vb = validate_complex_symbolic(b, "b", context, kComplexSubOperation);
101 if (!vb) return ComplexSymbolicResult::failure(vb.error());
102 auto budget = context.consume_steps(6, kComplexSubOperation);
103 if (!budget) return ComplexSymbolicResult::failure(budget.error());
104 return checked_construct<ComplexSymbolic>([&]() {
105 return make_complex(
106 SymbolicExpr::add(a.real, SymbolicExpr::multiply(SymbolicExpr::number(-1), b.real)),
107 SymbolicExpr::add(a.imag, SymbolicExpr::multiply(SymbolicExpr::number(-1), b.imag)));
108 }, kComplexSubOperation);
109}

引用了 a, b, complex_sub_checked(), context, LMCAS::Result< ComplexSymbolic >::failure() , 以及 make_complex().

被这些函数引用 complex_locus_circle_checked(), complex_locus_perpendicular_bisector_checked(), complex_sub_checked() , 以及 complex_sub_checked().

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

◆ complex_trig_form_checked() [1/2]

ComplexSymbolicResult LMCAS::complex_trig_form_checked ( std::shared_ptr< SymbolicExpr > r,
std::shared_ptr< SymbolicExpr > theta )

在文件 symbolic_complex.cpp 第 238 行定义.

239 {
241 return complex_trig_form_checked(std::move(r), std::move(theta), context);
242}
ComplexSymbolicResult complex_trig_form_checked(std::shared_ptr< SymbolicExpr > r, std::shared_ptr< SymbolicExpr > theta, ComputationContext &context)

引用了 complex_trig_form_checked(), context , 以及 r.

函数调用图:

◆ complex_trig_form_checked() [2/2]

ComplexSymbolicResult LMCAS::complex_trig_form_checked ( std::shared_ptr< SymbolicExpr > r,
std::shared_ptr< SymbolicExpr > theta,
ComputationContext & context )

在文件 symbolic_complex.cpp 第 233 行定义.

235 {
236 return complex_exp_form_checked(std::move(r), std::move(theta), context);
237}

引用了 complex_exp_form_checked(), complex_trig_form_checked(), context , 以及 r.

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

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

◆ complexes()

NumberDomainSet LMCAS::complexes ( )

在文件 expr_number_domains.cpp 第 369 行定义.

369 {
370 return NumberDomainSet(NumberDomain::Complexes);
371}

引用了 Complexes , 以及 complexes().

被这些函数引用 complexes().

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

◆ composition_inner_powers()

Result< void > LMCAS::composition_inner_powers ( const std::vector< std::shared_ptr< SymbolicExpr > > & g,
std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > & gp,
int order,
ComputationContext & context,
const std::string & operation )
static

在文件 series_engine.cpp 第 243 行定义.

246 {
247 const size_t n = gp.size();
248 gp[0].resize(n, SymbolicExpr::number(0));
249 gp[0][0] = SymbolicExpr::number(1);
250 if (n > 1) {
251 gp[1].resize(n, SymbolicExpr::number(0));
252 for (size_t i = 0; i < std::min(g.size(), n); ++i) {
253 gp[1][i] = g[i] ? g[i] : SymbolicExpr::number(0);
254 }
255 }
256 for (size_t k = 2; k < n; ++k) {
257 auto step = context.consume_steps(1, operation);
258 if (!step) {
259 return step;
260 }
261 auto multiplied = power_series_multiply_checked(gp[k-1], gp[1], order, context);
262 if (!multiplied) {
263 return Result<void>::failure(multiplied.error());
264 }
265 gp[k] = std::move(multiplied.value());
266 }
267 return Result<void>::success();
268}
PowerSeriesResult power_series_multiply_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, int order, ComputationContext &context)

引用了 composition_inner_powers(), context, LMCAS::Result< T >::failure(), order, power_series_multiply_checked() , 以及 LMCAS::Result< T >::success().

被这些函数引用 composition_inner_powers() , 以及 power_series_compose_checked().

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

◆ conditional_equation()

SolveResult LMCAS::conditional_equation ( const ExprPtr & original,
const std::string & variable )
static

在文件 solve_visitor.cpp 第 55 行定义.

引用了 conditional_equation(), equation_predicate() , 以及 variable.

被这些函数引用 conditional_equation(), solve_product_set() , 以及 solve_symbolic_polynomial_set().

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

◆ conditional_linear_polynomial()

SolveResult LMCAS::conditional_linear_polynomial ( const Polynomial< SymbolicPolyCoeff > & polynomial,
const ExprPtr & leading,
const std::string & variable )
static

在文件 solve_visitor.cpp 第 74 行定义.

76 {
77 auto constant = get_coeff(polynomial, 0);
78 auto zero = SymbolicExpr::number(0);
79 auto generic = polynomial_logic(
82 SymbolicExpr::multiply(
83 leading, SymbolicExpr::variable(variable)),
84 SymbolicExpr::multiply(
85 SymbolicExpr::number(-1), constant),
88 auto degenerate = polynomial_logic(
89 polynomial_relation(leading, zero, RelationOp::EQ),
90 polynomial_relation(constant, zero, RelationOp::EQ),
94 polynomial_logic(generic, degenerate, LogicalNode::Op::Or),
95 {}}}};
96}
static ExprPtr polynomial_logic(const ExprPtr &left, const ExprPtr &right, LogicalNode::Op op)
static ExprPtr polynomial_relation(const ExprPtr &left, const ExprPtr &right, RelationOp op)
std::shared_ptr< SymbolicExpr > get_coeff(const Polynomial< SymbolicPolyCoeff > &p, int deg)

引用了 LMCAS::LogicalNode::And, conditional_linear_polynomial(), EQ, get_coeff(), NEQ, LMCAS::LogicalNode::Or, polynomial_logic(), polynomial_relation() , 以及 variable.

被这些函数引用 conditional_linear_polynomial() , 以及 solve_symbolic_polynomial_set().

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

◆ conj() [1/2]

ExprResult LMCAS::conj ( const ExprPtr & expression)

在文件 expr_arithmetic.cpp 第 123 行定义.

123 {
125 return conj(expression, context);
126}
ExprResult conj(const ExprPtr &expression, ComputationContext &context)

引用了 conj() , 以及 context.

函数调用图:

◆ conj() [2/2]

ExprResult LMCAS::conj ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_arithmetic.cpp 第 118 行定义.

118 {
121}
constexpr const char * kConjOperation
ExprResult expr_from_complex_result(const ExpressionResult &result, const char *operation)
ExpressionResult conjugate_checked(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)

引用了 conj(), conjugate_checked(), context, LMCAS::expr_detail::expr_common::expr_from_complex_result() , 以及 LMCAS::expr_detail::expr_common::kConjOperation.

被这些函数引用 conj(), conj() , 以及 LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function().

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

◆ conjugate_checked() [1/2]

ExpressionResult LMCAS::conjugate_checked ( const std::shared_ptr< SymbolicExpr > & expr)

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

621 {
623 return conjugate_checked(expr, context);
624}

引用了 conjugate_checked() , 以及 context.

函数调用图:

◆ conjugate_checked() [2/2]

ExpressionResult LMCAS::conjugate_checked ( const std::shared_ptr< SymbolicExpr > & expr,
ComputationContext & context )

conj(a+bi) = a - bi

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

572 {
573 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
574 (context).limits().max_ast_nodes, "transform");
575 const std::string operation = "conjugate";
576 auto input = validate_complex_expr_input(expr, context, operation);
577 if (!input) return ExpressionResult::failure(input.error());
578 if (has_function_of_explicit_complex(LMCAS::detail::node(expr))) {
581 "conjugate of functions with complex arguments is outside the current support domain",
582 operation);
583 }
584
585 std::shared_ptr<SymbolicExpr> re, im;
586 split_real_imag(LMCAS::detail::node(expr), re, im, context);
587 /// conj(a+bi) = a - bi
588 auto neg_im = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(SymbolicExpr::number(-1), im)), transform_budget));
589 if (!re || !LMCAS::detail::node(re) || !neg_im || !LMCAS::detail::node(neg_im)) {
591 "conjugate construction failed",
592 operation);
593 }
594 if (LMCAS::detail::node(neg_im) && LMCAS::detail::node(neg_im)->is_zero()) {
595 auto simplified_re = detail::make_expression_ptr(detail::normalize_node(detail::node(re), transform_budget));
596 if (!simplified_re || !LMCAS::detail::node(simplified_re)) {
598 "conjugate construction failed",
599 operation);
600 }
601 return ExpressionResult::success(simplified_re);
602 }
604 detail::normalize_node(detail::node(re), transform_budget), LMCAS::detail::node(neg_im));
605 if (!cn) {
607 "conjugate construction failed",
608 operation);
609 }
611} catch (const CasError& error) {
612 return ExpressionResult::failure(error);
613} catch (const std::bad_alloc&) {
614 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "conjugate");
615} catch (const std::length_error& error) {
616 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "conjugate");
617} catch (const std::exception& error) {
618 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "conjugate");
619}

引用了 conjugate_checked(), context, LMCAS::SymbolicFactory::create_complex(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive, InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

被这些函数引用 conj(), conjugate_checked() , 以及 conjugate_checked().

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

◆ consume_digits()

bool LMCAS::consume_digits ( const std::string & str,
size_t & pos )
static

在文件 interval_serialization.cpp 第 76 行定义.

76 {
77 const size_t start = pos;
78 while (pos < str.size() &&
79 std::isdigit(static_cast<unsigned char>(str[pos]))) {
80 ++pos;
81 }
82 return pos != start;
83}

引用了 consume_digits().

被这些函数引用 consume_digits(), parse_fraction() , 以及 parse_numeric_value().

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

◆ consume_sign()

void LMCAS::consume_sign ( const std::string & str,
size_t & pos )
static

在文件 interval_serialization.cpp 第 85 行定义.

85 {
86 if (pos < str.size() && (str[pos] == '-' || str[pos] == '+')) ++pos;
87}

引用了 consume_sign().

被这些函数引用 consume_sign() , 以及 parse_numeric_value().

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

◆ contains()

bool LMCAS::contains ( const SymbolicExpr & expression,
const std::string & variable )

在文件 poly_utils.cpp 第 110 行定义.

110 {
112 LMCAS::detail::node(expression), variable);
113}

引用了 contains(), expression_depends_on_variable(), LMCAS::detail::node() , 以及 variable.

被这些函数引用 __attribute__(), contains(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::depends_on_remaining(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::depends_on_remaining_unknown(), expr_set_subset_domain(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::select_equation() , 以及 LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::select_target().

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

◆ contains_inverse_candidate()

bool LMCAS::contains_inverse_candidate ( const std::vector< std::shared_ptr< SymbolicExpr > > & candidates,
const std::shared_ptr< SymbolicExpr > & candidate )
static

在文件 calculus_inverse.cpp 第 172 行定义.

175{
176 for (const auto& existing : candidates) {
177 if (existing && LMCAS::detail::node(existing) &&
178 LMCAS::detail::node(existing)->equals(*LMCAS::detail::node(candidate))) {
179 return true;
180 }
181 }
182 return false;
183}

引用了 contains_inverse_candidate() , 以及 LMCAS::detail::node().

被这些函数引用 contains_inverse_candidate() , 以及 verified_real_inverse_candidates().

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

◆ contains_transcendental_of_var()

bool LMCAS::contains_transcendental_of_var ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var )

在文件 mixed_transcendental_classification.cpp 第 250 行定义.

253{
254 if (!expr || !LMCAS::detail::node(expr)) {
255 return false;
256 }
257 TranscendentalDetector detector(var);
258 LMCAS::detail::node(expr)->accept(detector);
259 return detector.found;
260}
virtual void accept(LMCAS::detail::SymbolicVisitor &visitor) const =0

引用了 LMCAS::SymbolicNode::accept(), contains_transcendental_of_var() , 以及 LMCAS::detail::node().

被这些函数引用 contains_transcendental_of_var(), solve_finite_mixed() , 以及 LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::solve_polynomial_factor().

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

◆ contains_unevaluated_integral()

bool LMCAS::contains_unevaluated_integral ( const std::shared_ptr< const SymbolicNode > & node)
inline

◆ continuity_at_checked() [1/2]

ContinuityResult LMCAS::continuity_at_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & point )

在文件 calculus_continuity.cpp 第 144 行定义.

146 {
148 return continuity_at_checked(f, var, point, context);
149}
ContinuityResult continuity_at_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &point, ComputationContext &context)

引用了 context, continuity_at_checked() , 以及 point.

函数调用图:

◆ continuity_at_checked() [2/2]

ContinuityResult LMCAS::continuity_at_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & point,
ComputationContext & context )

在文件 calculus_continuity.cpp 第 121 行定义.

123 {
124 const std::string operation = "continuity_at";
125 try {
126 if (!f || !point || var.empty()) {
128 "continuity analysis requires an expression, point, and variable", operation);
129 }
130 auto input = calculus_utils_validate_expr(f, var, context, operation);
131 if (!input) { return ContinuityResult::failure(input.error()); }
133 if (!left) { return ContinuityResult::failure(left.error()); }
135 if (!right) { return ContinuityResult::failure(right.error()); }
136 return continuity_from_limits(f, var, point, left.value().value, right.value().value, context);
137 } catch (const std::bad_alloc&) {
138 return ContinuityResult::failure(CasErrc::ResourceLimit, "continuity analysis allocation failed", operation);
139 } catch (const std::exception& ex) {
140 return ContinuityResult::failure(CasErrc::InternalInvariant, ex.what(), operation);
141 }
142}
ContinuityResult continuity_from_limits(const ExprPtr &f, const std::string &var, const ExprPtr &point, const LimitOutcome &left, const LimitOutcome &right, ComputationContext &context)

引用了 LMCAS::calculus_utils_detail::calculus_utils_validate_expr(), context, continuity_at_checked(), LMCAS::Result< ContinuityType >::failure(), FromAbove, FromBelow, InternalInvariant, InvalidArgument, limit_checked(), point, ResourceLimit , 以及 right.

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

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

◆ convergence_radius_checked() [1/4]

ExpressionResult LMCAS::convergence_radius_checked ( const std::shared_ptr< SymbolicExpr > & general_coefficient,
const std::string & index_var )

在文件 series_convergence.cpp 第 136 行定义.

138 {
141 general_coefficient, index_var, context);
142}
ExpressionResult convergence_radius_checked(const std::shared_ptr< SymbolicExpr > &general_coefficient, const std::string &index_var, ComputationContext &context)

引用了 context , 以及 convergence_radius_checked().

函数调用图:

◆ convergence_radius_checked() [2/4]

ExpressionResult LMCAS::convergence_radius_checked ( const std::shared_ptr< SymbolicExpr > & general_coefficient,
const std::string & index_var,
ComputationContext & context )

在文件 series_convergence.cpp 第 102 行定义.

105 {
106 constexpr const char* operation = "convergence_radius";
107 if (!general_coefficient || !LMCAS::detail::node(general_coefficient) ||
108 index_var.empty()) {
111 "convergence radius requires a coefficient term and index variable",
112 operation);
113 }
114 auto step = context.consume_steps(2, operation);
115 if (!step) {
116 return ExpressionResult::failure(step.error());
117 }
118 auto node = LMCAS::detail::node(general_coefficient);
119 if (auto number = std::dynamic_pointer_cast<const NumberNode>(node)) {
121 number->is_zero() ? SymbolicExpr::infinity()
122 : SymbolicExpr::number(1));
123 }
124 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
125 auto radius = coefficient_power_radius(*power, index_var, context);
126 if (radius) {
127 return ExpressionResult::success(std::move(*radius));
128 }
129 }
132 "coefficient-term limit is outside the supported ratio/root-test domain",
133 operation);
134}
static std::optional< std::shared_ptr< SymbolicExpr > > coefficient_power_radius(const PowerNode &power, const std::string &index_var, ComputationContext &context)

引用了 coefficient_power_radius(), context, convergence_radius_checked(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive, InvalidArgument, LMCAS::detail::node() , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

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

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

◆ convergence_radius_checked() [3/4]

ExpressionResult LMCAS::convergence_radius_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & coefficients,
const std::string & var )

在文件 series_convergence.cpp 第 195 行定义.

198{
200 return convergence_radius_checked(coefficients, var, context);
201}

引用了 context , 以及 convergence_radius_checked().

函数调用图:

◆ convergence_radius_checked() [4/4]

ExpressionResult LMCAS::convergence_radius_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & coefficients,
const std::string & var,
ComputationContext & context )

有限系数列表完整地表示一个多项式,其收敛半径恒为无穷. 无限级数必须使用通项重载,有限前缀不能证明其尾项行为.

在文件 series_convergence.cpp 第 144 行定义.

148{
149 const std::string operation = "convergence_radius";
150 auto var_check = validate_series_variable(var, context, operation);
151 if (!var_check) {
152 return ExpressionResult::failure(var_check.error());
153 }
154 if (coefficients.empty()) {
156 "coefficient list cannot be empty",
157 operation);
158 }
159 auto coeff_check = validate_power_series_coefficients(
160 coefficients, operation, "polynomial");
161 if (!coeff_check) {
162 return ExpressionResult::failure(coeff_check.error());
163 }
164 auto budget = context.consume_steps(coefficients.size() + 1, operation);
165 if (!budget) {
166 return ExpressionResult::failure(budget.error());
167 }
168
169 for (size_t index = 0; index < coefficients.size(); ++index) {
171 LMCAS::detail::node(coefficients[index]), var)) {
174 "coefficient at index " + std::to_string(index) +
175 " depends on the series variable",
176 operation);
177 }
178 }
179
180 try {
181 /// 有限系数列表完整地表示一个多项式,其收敛半径恒为无穷.
182 /// 无限级数必须使用通项重载,有限前缀不能证明其尾项行为.
183 return ExpressionResult::success(SymbolicExpr::infinity());
184 } catch (const std::bad_alloc&) {
187 "allocation failed while constructing convergence radius",
188 operation);
189 } catch (const std::exception& ex) {
191 CasErrc::InternalInvariant, ex.what(), operation);
192 }
193}
Result< void > validate_power_series_coefficients(const std::vector< std::shared_ptr< SymbolicExpr > > &coefficients, const std::string &operation, const std::string &name)
Result< void > validate_series_variable(const std::string &variable, ComputationContext &context, const std::string &operation)

引用了 context, convergence_radius_checked(), expression_depends_on_variable(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, InvalidArgument, LMCAS::detail::node(), ResourceLimit, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success(), validate_power_series_coefficients() , 以及 validate_series_variable().

函数调用图:

◆ convergence_test_checked() [1/2]

ConvergenceInfoResult LMCAS::convergence_test_checked ( const std::shared_ptr< SymbolicExpr > & general_term,
const std::string & index_var )

在文件 series_convergence.cpp 第 250 行定义.

253{
255 return convergence_test_checked(general_term, index_var, context);
256}
ConvergenceInfoResult convergence_test_checked(const std::shared_ptr< SymbolicExpr > &general_term, const std::string &index_var, ComputationContext &context)

引用了 context , 以及 convergence_test_checked().

函数调用图:

◆ convergence_test_checked() [2/2]

ConvergenceInfoResult LMCAS::convergence_test_checked ( const std::shared_ptr< SymbolicExpr > & general_term,
const std::string & index_var,
ComputationContext & context )

在文件 series_convergence.cpp 第 204 行定义.

208{
209 const std::string operation = "convergence_test";
210 auto var_check = validate_series_variable(index_var, context, operation);
211 if (!var_check) {
212 return ConvergenceInfoResult::failure(var_check.error());
213 }
214 if (!general_term || !LMCAS::detail::node(general_term)) {
216 "general term cannot be null",
217 operation);
218 }
219 auto budget = context.consume_steps(32, operation);
220 if (!budget) {
222 }
223 try {
224 auto analyzed =
225 convergence_test_impl(general_term, index_var, context);
226 if (!analyzed) {
227 return analyzed;
228 }
229 auto info = std::move(analyzed.value());
230 if (info.result == ConvergenceResult::Inconclusive) {
233 "convergence test is outside the current supported domain",
234 operation);
235 }
236 return info;
237 } catch (const CasError& error) {
238 return ConvergenceInfoResult::failure(error);
239 } catch (const std::bad_alloc&) {
241 "allocation failed while testing convergence",
242 operation);
243 } catch (const std::exception& ex) {
245 ex.what(),
246 operation);
247 }
248}
static ConvergenceInfoResult convergence_test_impl(const std::shared_ptr< SymbolicExpr > &, const std::string &, ComputationContext &)

引用了 context, convergence_test_checked(), convergence_test_impl(), LMCAS::Result< ConvergenceInfo >::failure(), Inconclusive, InternalInvariant, InvalidArgument, LMCAS::detail::node(), ResourceLimit , 以及 validate_series_variable().

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

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

◆ convergence_test_impl()

ConvergenceInfoResult LMCAS::convergence_test_impl ( const std::shared_ptr< SymbolicExpr > & general_term,
const std::string & index_var,
ComputationContext & context )
static

对 Laurent 单项式 c*n^e 直接应用 p 级数判据。 倒数幂沿用线性规则,省去 Abs 比值极限的递归化简。

在文件 series_convergence.cpp 第 387 行定义.

390 {
391 if (!general_term || !LMCAS::detail::node(general_term)) {
392 return ConvergenceInfo{
394 }
395 if (auto geometric = geometric_term_convergence(
396 detail::node(general_term), index_var)) {
397 return std::move(*geometric);
398 }
399 auto power_info = power_term_convergence(detail::node(general_term), index_var);
400 if (power_info) {
401 return std::move(*power_info);
402 }
403 /**
404 * @brief 对 Laurent 单项式 c*n^e 直接应用 p 级数判据。
405 * 倒数幂沿用线性规则,省去 Abs 比值极限的递归化简。
406 */
407 if (const auto laurent_power = supported_laurent_integer_power(
408 LMCAS::detail::node(general_term), index_var)) {
409 if (*laurent_power < -1) {
410 return ConvergenceInfo{
412 }
413 if (*laurent_power >= -1) {
414 return ConvergenceInfo{
415 ConvergenceResult::Divergent, "p-series"};
416 }
417 }
418 return ratio_convergence_test(general_term, index_var, context);
419}
static ConvergenceInfoResult ratio_convergence_test(const std::shared_ptr< SymbolicExpr > &general_term, const std::string &index_var, ComputationContext &context)
static std::optional< ConvergenceInfo > power_term_convergence(const std::shared_ptr< const SymbolicNode > &node, const std::string &index_var)
static std::optional< ConvergenceInfo > geometric_term_convergence(const std::shared_ptr< const SymbolicNode > &node, const std::string &index_var)
std::optional< int > supported_laurent_integer_power(const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)
收敛性判定信息.

引用了 context, convergence_test_impl(), Convergent, Divergent, geometric_term_convergence(), Inconclusive, LMCAS::detail::node(), power_term_convergence(), ratio_convergence_test() , 以及 supported_laurent_integer_power().

被这些函数引用 convergence_test_checked() , 以及 convergence_test_impl().

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

◆ convert_to_unit()

ExprResult LMCAS::convert_to_unit ( const ExprPtr & quantity,
const std::string & unit,
ComputationContext & context )

在文件 value_facade.cpp 第 19 行定义.

20 {
21 return convert_unit(quantity, unit, context);
22}
QuantityResult convert_unit(const std::shared_ptr< SymbolicExpr > &expression, const std::string &target_unit, ComputationContext &context)

引用了 context, convert_to_unit(), convert_unit() , 以及 unit.

被这些函数引用 convert_to_unit().

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

◆ convert_to_unit_definition()

ExprResult LMCAS::convert_to_unit_definition ( const ExprPtr & quantity,
std::string display_unit,
UnitDefinition definition,
ComputationContext & context )

在文件 value_facade.cpp 第 24 行定义.

27 {
28 return convert_unit(quantity, std::move(display_unit), std::move(definition), context);
29}

引用了 context, convert_to_unit_definition(), convert_unit(), definition , 以及 display_unit.

被这些函数引用 convert_to_unit_definition().

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

◆ convert_unit() [1/2]

QuantityResult LMCAS::convert_unit ( const std::shared_ptr< SymbolicExpr > & expression,
const std::string & target_unit,
ComputationContext & context )

在文件 quantity.cpp 第 128 行定义.

130 {
131 auto step = context.consume_steps(1, kOperation);
132 if (!step) return QuantityResult::failure(step.error());
133 auto quantity = expression
134 ? std::dynamic_pointer_cast<const QuantityNode>(detail::node(expression))
135 : nullptr;
136 if (!quantity) {
137 return failure(CasErrc::UnitStripTypeMismatch,
138 "unit conversion requires a quantity expression");
139 }
140 auto target = context.units().resolve(target_unit);
141 if (!target) return QuantityResult::failure(target.error());
142 if (quantity->dimension() != target.value().dimension) {
143 return failure(CasErrc::DimensionMismatch,
144 "unit conversion requires equal dimensions");
145 }
146 const Rational factor = quantity->scale_to_base() / target.value().scale_to_base;
148 {quantity->value(), rational_node(factor)});
149 return make_quantity(std::move(value), target.value().dimension,
150 target.value().scale_to_base, target_unit);
151}
std::shared_ptr< const SymbolicNode > rational_node(const Rational &value)

引用了 context, convert_unit(), LMCAS::SymbolicFactory::create_multiply(), DimensionMismatch, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::detail::node(), target, UnitStripTypeMismatch , 以及 value.

被这些函数引用 convert_to_unit(), convert_to_unit_definition(), convert_unit() , 以及 convert_unit().

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

◆ convert_unit() [2/2]

QuantityResult LMCAS::convert_unit ( const std::shared_ptr< SymbolicExpr > & expression,
std::string display_unit,
UnitDefinition definition,
ComputationContext & context )

在文件 quantity.cpp 第 153 行定义.

156 {
157 auto step = context.consume_steps(1, kOperation);
158 if (!step) return QuantityResult::failure(step.error());
159 auto quantity = expression
160 ? std::dynamic_pointer_cast<const QuantityNode>(detail::node(expression))
161 : nullptr;
162 if (!quantity) {
163 return failure(CasErrc::UnitStripTypeMismatch,
164 "unit conversion requires a quantity expression");
165 }
166 if (display_unit.empty() || definition.scale_to_base <= Rational(0)) {
167 return failure(CasErrc::UnitInvalid, "resolved unit definition is invalid");
168 }
169 if (quantity->dimension() != definition.dimension) {
171 "unit conversion requires equal dimensions");
172 }
173 const Rational factor = quantity->scale_to_base() / definition.scale_to_base;
175 {quantity->value(), rational_node(factor)});
176 return make_quantity(std::move(value), std::move(definition.dimension),
177 std::move(definition.scale_to_base),
178 std::move(display_unit));
179}

引用了 context, convert_unit(), LMCAS::SymbolicFactory::create_multiply(), definition, DimensionMismatch, display_unit, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::detail::node(), UnitInvalid, UnitStripTypeMismatch , 以及 value.

函数调用图:

◆ convolve_checked() [1/2]

TransformEngineResult LMCAS::convolve_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::shared_ptr< SymbolicExpr > & g,
const std::string & var )

在文件 transform_convolution.cpp 第 162 行定义.

165 {
167 return convolve_checked(f, g, var, context);
168}
TransformEngineResult convolve_checked(const std::shared_ptr< SymbolicExpr > &f, const std::shared_ptr< SymbolicExpr > &g, const std::string &var, ComputationContext &context)

引用了 context , 以及 convolve_checked().

函数调用图:

◆ convolve_checked() [2/2]

TransformEngineResult LMCAS::convolve_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::shared_ptr< SymbolicExpr > & g,
const std::string & var,
ComputationContext & context )

在文件 transform_convolution.cpp 第 142 行定义.

146 {
147 const std::string operation = "convolve";
148 auto valid =
149 te_validate_convolution_inputs(f, g, var, context, operation);
150 if (!valid) return TransformEngineResult::failure(valid.error());
151 try {
152 return te_convolve_core(f, g, var, context);
153 } catch (const std::bad_alloc&) {
155 CasErrc::ResourceLimit, "双边卷积分配失败", operation);
156 } catch (const std::exception& error) {
158 CasErrc::InternalInvariant, error.what(), operation);
159 }
160}
static Result< void > te_validate_convolution_inputs(const std::shared_ptr< SymbolicExpr > &f, const std::shared_ptr< SymbolicExpr > &g, const std::string &var, ComputationContext &context, const std::string &operation)
static TransformEngineResult te_convolve_core(const std::shared_ptr< SymbolicExpr > &f, const std::shared_ptr< SymbolicExpr > &g, const std::string &variable, ComputationContext &context)

引用了 context, convolve_checked(), LMCAS::Result< Verified< EvaluatedTransform > >::failure(), InternalInvariant, ResourceLimit, te_convolve_core() , 以及 te_validate_convolution_inputs().

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

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

◆ cos() [1/2]

ExprResult LMCAS::cos ( const ExprPtr & expression)

在文件 expr_elementary.cpp 第 57 行定义.

57 {
59 return cos(expression, context);
60}
ExprResult cos(const ExprPtr &expression, ComputationContext &context)

引用了 context , 以及 cos().

函数调用图:

◆ cos() [2/2]

ExprResult LMCAS::cos ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_elementary.cpp 第 50 行定义.

50 {
51 auto valid = require_dimensionless(expression, "cos");
52 if (!valid) { return valid; }
53 return make_unary_math_expr(expression, context, "cos",
54 SymbolicExpr::cos);
55}
ExprResult make_unary_math_expr(const ExprPtr &expression, ComputationContext &context, const char *function_name, ExprPtr(*factory)(ExprPtr))

引用了 context, cos(), LMCAS::expr_detail::expr_common::make_unary_math_expr() , 以及 LMCAS::expr_detail::expr_common::require_dimensionless().

被这些函数引用 cos(), cos() , 以及 LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function().

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

◆ cross_product()

VectorCalculusFieldResult LMCAS::cross_product ( const VectorField & a,
const VectorField & b )

在文件 vector_calculus_algebra.cpp 第 152 行定义.

153 {
155 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
156 context.limits().max_ast_nodes, "cross_product");
157 return cross_product_impl(a, b, transform_budget);
158} catch (const CasError& error) {
160} catch (const std::bad_alloc&) {
162 "vector calculus allocation failed", "cross_product");
163} catch (const std::length_error& error) {
164 return VectorCalculusFieldResult::failure(CasErrc::ResourceLimit, error.what(), "cross_product");
165} catch (const std::exception& error) {
166 return VectorCalculusFieldResult::failure(CasErrc::InternalInvariant, error.what(), "cross_product");
167}
static VectorCalculusFieldResult cross_product_impl(const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)

引用了 a, b, context, cross_product() , 以及 cross_product_impl().

被这些函数引用 cross_product().

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

◆ cross_product_impl()

VectorCalculusFieldResult LMCAS::cross_product_impl ( const VectorField & a,
const VectorField & b,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_algebra.cpp 第 40 行定义.

41 {
42 if (a.size() != 3 || b.size() != 3) {
45 "vectors must be three-dimensional",
46 "cross_product");
47 }
48 VectorField result;
49 result.reserve(3);
50 for (std::size_t index = 0; index < 3; ++index) {
51 result.push_back(
53 }
54 return VectorCalculusFieldResult::success(std::move(result));
55}
std::shared_ptr< SymbolicExpr > vector_calculus_cross_component(const VectorField &left, const VectorField &right, std::size_t index)
std::vector< std::shared_ptr< SymbolicExpr > > VectorField
向量场由标量表达式组成。

引用了 a, b, cross_product_impl(), DimensionMismatch, LMCAS::Result< VectorField >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::Result< VectorField >::success() , 以及 LMCAS::vector_calculus_detail::vector_calculus_cross_component().

被这些函数引用 cross_product(), cross_product_impl() , 以及 mixed_product_impl().

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

◆ crt()

std::pair< int64_t, int64_t > LMCAS::crt ( int64_t r1,
int64_t m1,
int64_t r2,
int64_t m2 )
inline

中国剩余定理(两模数),返回规范余数与模数乘积。

异常
std::domain_error模数非正或不互素。
std::overflow_error合并模数超出机器内核范围。

在文件 modular_arithmetic.hpp 第 305 行定义.

306 {
307 auto merged = crt_checked(r1, m1, r2, m2);
308 if (merged) return merged.value();
309 if (merged.error().code == CasErrc::ResourceLimit) {
310 throw std::overflow_error(merged.error().message);
311 }
312 throw std::domain_error(merged.error().message);
313}
CrtResult crt_checked(int64_t r1, int64_t m1, int64_t r2, int64_t m2, ComputationContext &context)
Checked Chinese remainder theorem for two positive coprime moduli.

引用了 crt(), crt_checked() , 以及 ResourceLimit.

被这些函数引用 crt() , 以及 multi_crt().

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

◆ crt_checked() [1/2]

CrtResult LMCAS::crt_checked ( int64_t r1,
int64_t m1,
int64_t r2,
int64_t m2 )
inline

在文件 modular_arithmetic.hpp 第 296 行定义.

296 {
298 return crt_checked(r1, m1, r2, m2, context);
299}

引用了 context , 以及 crt_checked().

函数调用图:

◆ crt_checked() [2/2]

CrtResult LMCAS::crt_checked ( int64_t r1,
int64_t m1,
int64_t r2,
int64_t m2,
ComputationContext & context )
inline

Checked Chinese remainder theorem for two positive coprime moduli.

factor < m2 且 m1*m2 <= INT64_MAX,保证 m1*factor 在机器整数范围内。

在文件 modular_arithmetic.hpp 第 265 行定义.

267 {
268 constexpr const char* operation = "crt";
269 auto step = context.consume_steps(1, operation);
270 if (!step) return CrtResult::failure(step.error());
271 if (m1 <= 0 || m2 <= 0) {
273 "CRT moduli must be positive", operation);
274 }
275
276 int64_t product = 0;
277 if (!modular_detail::checked_positive_product(m1, m2, product)) {
279 "CRT modulus product exceeds int64 range", operation);
280 }
281
282 int64_t s = 0;
283 int64_t t = 0;
284 int64_t g = extended_gcd(m1, m2, s, t);
285 if (g != 1) {
287 "CRT moduli must be coprime", operation);
288 }
289
290 const auto factor = ((ModInt(r2, m2) - ModInt(r1, m2)) * ModInt(s, m2)).value();
291 /** @brief factor < m2 且 m1*m2 <= INT64_MAX,保证 m1*factor 在机器整数范围内。 */
292 const auto merged = ModInt(r1, product) + ModInt(m1 * factor, product);
293 return CrtResult::success({merged.value(), product});
294}
ModInt()
默认构造,值为 0,模为 2
bool checked_positive_product(int64_t a, int64_t b, int64_t &out)
int64_t extended_gcd(int64_t a, int64_t b, int64_t &s, int64_t &t)
用扩展欧几里得算法求 gcd(a,b) 及 Bezout 系数。

引用了 LMCAS::ModInt::ModInt(), LMCAS::modular_detail::checked_positive_product(), context, crt_checked(), extended_gcd(), LMCAS::Result< std::pair< int64_t, int64_t > >::failure(), InvalidArgument, ResourceLimit, LMCAS::Result< std::pair< int64_t, int64_t > >::success(), t , 以及 value.

被这些函数引用 crt(), crt_checked(), crt_checked() , 以及 multi_crt_checked().

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

◆ curl()

VectorField LMCAS::curl ( const VectorField & F,
const std::vector< std::string > & vars )

在文件 vector_calculus_differential.cpp 第 350 行定义.

352{
354 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
355 context.limits().max_ast_nodes, "curl");
356 return curl_impl(F, vars, transform_budget);
357}
VectorField curl_impl(const VectorField &F, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)

引用了 context, curl(), LMCAS::vector_calculus_detail::curl_impl() , 以及 vars.

被这些函数引用 curl().

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

◆ curl_checked() [1/2]

VectorCalculusFieldResult LMCAS::curl_checked ( const VectorField & F,
const std::vector< std::string > & vars )

在文件 vector_calculus_differential.cpp 第 186 行定义.

189{
191 return curl_checked(F, vars, context);
192}
VectorCalculusFieldResult curl_checked(const VectorField &F, const std::vector< std::string > &vars, ComputationContext &context)

引用了 context, curl_checked() , 以及 vars.

函数调用图:

◆ curl_checked() [2/2]

VectorCalculusFieldResult LMCAS::curl_checked ( const VectorField & F,
const std::vector< std::string > & vars,
ComputationContext & context )

在文件 vector_calculus_differential.cpp 第 149 行定义.

153{
154 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
155 context.limits().max_ast_nodes, "curl");
156 const std::string operation = "curl";
157 auto valid = vector_calculus_validate_field_vars(F, vars, context, operation);
158 if (!valid) {
159 return VectorCalculusFieldResult::failure(valid.error());
160 }
161 if (F.size() != 2 && F.size() != 3) {
164 "curl requires a 2D or 3D vector field",
165 operation);
166 }
167 auto step = context.consume_steps(F.size(), operation);
168 if (!step) {
169 return VectorCalculusFieldResult::failure(step.error());
170 }
171 try {
172 return vector_calculus_wrap_field(curl_impl(F, vars, transform_budget), operation);
173 } catch (const CasError& error) {
175 } catch (const std::bad_alloc&) {
177 "vector calculus allocation failed",
178 operation);
179 } catch (const std::length_error& error) {
180 return VectorCalculusFieldResult::failure(CasErrc::ResourceLimit, error.what(), operation);
181 } catch (const std::exception& e) {
183 }
184}
VectorCalculusFieldResult vector_calculus_wrap_field(VectorField field, const std::string &operation)
Result< void > vector_calculus_validate_field_vars(const VectorField &field, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation)

引用了 context, curl_checked(), LMCAS::vector_calculus_detail::curl_impl(), e(), LMCAS::Result< VectorField >::failure(), InternalInvariant, InvalidArgument, ResourceLimit, vars, LMCAS::vector_calculus_detail::vector_calculus_validate_field_vars() , 以及 LMCAS::vector_calculus_detail::vector_calculus_wrap_field().

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

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

◆ curvature_checked() [1/2]

ExpressionResult LMCAS::curvature_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var )

在文件 calculus_curvature.cpp 第 82 行定义.

84{
86 return curvature_checked(f, var, context);
87}
ExpressionResult curvature_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, ComputationContext &context)

引用了 context , 以及 curvature_checked().

函数调用图:

◆ curvature_checked() [2/2]

ExpressionResult LMCAS::curvature_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
ComputationContext & context )

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

37 {
38 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
39 (context).limits().max_ast_nodes, "transform");
40 const std::string operation = "curvature";
41 auto input = calculus_utils_validate_expr(f, var, context, operation);
42 if (!input) {
43 return ExpressionResult::failure(input.error());
44 }
45
46 auto first = checked_derivative(f, var, context, operation.c_str());
47 if (!first) {
48 return ExpressionResult::failure(first.error());
49 }
50 const auto& f_prime = first.value();
51 auto second = checked_derivative(f_prime, var, context, operation.c_str());
52 if (!second) {
53 return ExpressionResult::failure(second.error());
54 }
55 const auto& f_double_prime = second.value();
56
57 auto abs_f_pp = calculus_utils_make_abs(f_double_prime);
58 if (!abs_f_pp || !LMCAS::detail::node(abs_f_pp)) {
60 "absolute value node construction failed",
61 operation);
62 }
63
64 auto f_prime_sq = SymbolicExpr::power(f_prime, SymbolicExpr::number(2));
65 auto one_plus_fp_sq = SymbolicExpr::add(SymbolicExpr::number(1), f_prime_sq);
66
67 auto three_half = SymbolicExpr::number(Rational(3, 2));
68 auto denom = SymbolicExpr::power(one_plus_fp_sq, three_half);
69 auto result = SymbolicExpr::divide(abs_f_pp, denom);
70 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(result), transform_budget));
71 return ExpressionResult::success(simplified ? simplified : result);
72} catch (const CasError& error) {
73 return ExpressionResult::failure(error);
74} catch (const std::bad_alloc&) {
75 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "curvature");
76} catch (const std::length_error& error) {
77 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "curvature");
78} catch (const std::exception& error) {
79 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "curvature");
80}
std::shared_ptr< SymbolicExpr > calculus_utils_make_abs(const std::shared_ptr< SymbolicExpr > &expr)
static ExpressionResult checked_derivative(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const char *operation)

引用了 LMCAS::calculus_utils_detail::calculus_utils_make_abs(), LMCAS::calculus_utils_detail::calculus_utils_validate_expr(), checked_derivative(), context, curvature_checked(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

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

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

◆ curvature_parametric_checked() [1/2]

ExpressionResult LMCAS::curvature_parametric_checked ( const std::shared_ptr< SymbolicExpr > & x_t,
const std::shared_ptr< SymbolicExpr > & y_t,
const std::string & t )

在文件 calculus_curvature.cpp 第 163 行定义.

166{
168 return curvature_parametric_checked(x_t, y_t, t, context);
169}
ExpressionResult curvature_parametric_checked(const std::shared_ptr< SymbolicExpr > &x_t, const std::shared_ptr< SymbolicExpr > &y_t, const std::string &t, ComputationContext &context)

引用了 context, curvature_parametric_checked() , 以及 t.

函数调用图:

◆ curvature_parametric_checked() [2/2]

ExpressionResult LMCAS::curvature_parametric_checked ( const std::shared_ptr< SymbolicExpr > & x_t,
const std::shared_ptr< SymbolicExpr > & y_t,
const std::string & t,
ComputationContext & context )

在文件 calculus_curvature.cpp 第 90 行定义.

94 {
95 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
96 (context).limits().max_ast_nodes, "transform");
97 const std::string operation = "curvature_parametric";
98 auto input = calculus_utils_validate_two_exprs(x_t, y_t, t, context, operation);
99 if (!input) {
100 return ExpressionResult::failure(input.error());
101 }
102
103 auto x_first = checked_derivative(x_t, t, context, operation.c_str());
104 if (!x_first) {
105 return ExpressionResult::failure(x_first.error());
106 }
107 const auto& x_prime = x_first.value();
108 auto x_second = checked_derivative(x_prime, t, context, operation.c_str());
109 if (!x_second) {
110 return ExpressionResult::failure(x_second.error());
111 }
112 const auto& x_double_prime = x_second.value();
113
114 auto y_first = checked_derivative(y_t, t, context, operation.c_str());
115 if (!y_first) {
116 return ExpressionResult::failure(y_first.error());
117 }
118 const auto& y_prime = y_first.value();
119 auto y_second = checked_derivative(y_prime, t, context, operation.c_str());
120 if (!y_second) {
121 return ExpressionResult::failure(y_second.error());
122 }
123 const auto& y_double_prime = y_second.value();
124
125 if (x_prime->is_zero() && y_prime->is_zero()) {
127 "parametric curvature is undefined for zero velocity",
128 operation);
129 }
130
131 auto cross_term = SymbolicExpr::add(
132 SymbolicExpr::multiply(x_prime, y_double_prime),
133 SymbolicExpr::multiply(
134 SymbolicExpr::number(-1),
135 SymbolicExpr::multiply(y_prime, x_double_prime)));
136
137 auto abs_cross = calculus_utils_make_abs(cross_term);
138 if (!abs_cross || !LMCAS::detail::node(abs_cross)) {
140 "absolute value node construction failed",
141 operation);
142 }
143
144 auto x_prime_sq = SymbolicExpr::power(x_prime, SymbolicExpr::number(2));
145 auto y_prime_sq = SymbolicExpr::power(y_prime, SymbolicExpr::number(2));
146 auto sum_sq = SymbolicExpr::add(x_prime_sq, y_prime_sq);
147
148 auto three_half = SymbolicExpr::number(Rational(3, 2));
149 auto denom = SymbolicExpr::power(sum_sq, three_half);
150 auto result = SymbolicExpr::divide(abs_cross, denom);
151 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(result), transform_budget));
152 return ExpressionResult::success(simplified ? simplified : result);
153} catch (const CasError& error) {
154 return ExpressionResult::failure(error);
155} catch (const std::bad_alloc&) {
156 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "curvature_parametric");
157} catch (const std::length_error& error) {
158 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "curvature_parametric");
159} catch (const std::exception& error) {
160 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "curvature_parametric");
161}
Result< void > calculus_utils_validate_two_exprs(const std::shared_ptr< SymbolicExpr > &first, const std::shared_ptr< SymbolicExpr > &second, const std::string &var, ComputationContext &context, const std::string &operation)

引用了 LMCAS::calculus_utils_detail::calculus_utils_make_abs(), LMCAS::calculus_utils_detail::calculus_utils_validate_two_exprs(), checked_derivative(), context, curvature_parametric_checked(), DomainError, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success() , 以及 t.

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

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

◆ curve_integral_scalar()

std::shared_ptr< SymbolicExpr > LMCAS::curve_integral_scalar ( const std::shared_ptr< SymbolicExpr > & f,
const VectorField & parametrization,
const std::string & t,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b )

在文件 vector_calculus_curves.cpp 第 55 行定义.

59{
61 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
62 (context).limits().max_ast_nodes, "transform");
63 if (!f) {
64 throw std::invalid_argument("curve_integral_scalar: f must not be null");
65 }
66 if (parametrization.empty()) {
67 throw std::invalid_argument("curve_integral_scalar: parametrization must not be empty");
68 }
69 if (!a || !b) {
70 throw std::invalid_argument("curve_integral_scalar: bounds must not be null");
71 }
72
73 size_t dim = parametrization.size();
74 auto coord_vars = vector_calculus_coord_vars(dim);
75
76 auto f_composed = f;
77 for (size_t i = 0; i < dim; ++i) {
78 f_composed = detail::make_expression_ptr(detail::substitute_node(detail::node(f_composed), coord_vars[i], detail::node(parametrization[i]), transform_budget));
79 }
80 f_composed = detail::make_expression_ptr(detail::normalize_node(detail::node(f_composed), transform_budget));
81
82 std::shared_ptr<SymbolicExpr> speed_sq = nullptr;
83 for (size_t i = 0; i < dim; ++i) {
85 if (!deriv) {
86 continue;
87 }
88 deriv = detail::make_expression_ptr(detail::normalize_node(detail::node(deriv), transform_budget));
89 auto sq = SymbolicExpr::power(deriv, SymbolicExpr::number(2));
91 if (!speed_sq) {
92 speed_sq = sq;
93 } else {
94 speed_sq = SymbolicExpr::add(speed_sq, sq);
95 speed_sq = detail::make_expression_ptr(detail::normalize_node(detail::node(speed_sq), transform_budget));
96 }
97 }
98
99 if (!speed_sq) {
100 return SymbolicExpr::number(0);
101 }
102
103 auto speed = SymbolicExpr::sqrt(speed_sq);
104 speed = detail::make_expression_ptr(detail::normalize_node(detail::node(speed), transform_budget));
105
106 auto integrand = SymbolicExpr::multiply(f_composed, speed);
107 integrand = detail::make_expression_ptr(detail::normalize_node(detail::node(integrand), transform_budget));
108
109
110 return vector_calculus_integrate_with_fallback(integrand, t, a, b, context, transform_budget);
111}
std::vector< std::string > vector_calculus_coord_vars(std::size_t dimension)
std::shared_ptr< SymbolicExpr > vector_calculus_integrate_with_fallback(const std::shared_ptr< SymbolicExpr > &integrand, const std::string &variable, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, detail::RewriteBudget &transform_budget)
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField & parametrization

引用了 a, b, context, curve_integral_scalar(), LMCAS::detail::differentiate_node(), dim, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), parametrization, LMCAS::detail::substitute_node(), t, LMCAS::vector_calculus_detail::vector_calculus_coord_vars() , 以及 LMCAS::vector_calculus_detail::vector_calculus_integrate_with_fallback().

被这些函数引用 curve_integral_scalar().

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

◆ curve_integral_scalar_checked() [1/2]

VectorCalculusExprResult LMCAS::curve_integral_scalar_checked ( const std::shared_ptr< SymbolicExpr > & f,
const VectorField & parametrization,
const std::string & t,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b )

在文件 vector_calculus_curves.cpp 第 46 行定义.

50{
53}
VectorCalculusExprResult curve_integral_scalar_checked(const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)

引用了 a, b, context, curve_integral_scalar_checked(), parametrization , 以及 t.

函数调用图:

◆ curve_integral_scalar_checked() [2/2]

VectorCalculusExprResult LMCAS::curve_integral_scalar_checked ( const std::shared_ptr< SymbolicExpr > & f,
const VectorField & parametrization,
const std::string & t,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context )

在文件 vector_calculus_curves.cpp 第 11 行定义.

16{
17 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
18 context.limits().max_ast_nodes, "curve_integral_scalar");
19 const std::string operation = "curve_integral_scalar";
21 f, parametrization, t, a, b, context, operation);
22 if (!valid) {
23 return VectorCalculusExprResult::failure(valid.error());
24 }
25
26 auto step = context.consume_steps(parametrization.size() * 4 + 4, operation);
27 if (!step) {
28 return VectorCalculusExprResult::failure(step.error());
29 }
30
31 try {
32 return curve_integral_scalar_strict(f, parametrization, t, a, b, context, operation, transform_budget);
33 } catch (const CasError& error) {
35 } catch (const std::bad_alloc&) {
37 "curve integral allocation failed",
38 operation);
39 } catch (const std::length_error& error) {
40 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
41 } catch (const std::exception& e) {
43 }
44}
Result< void > vector_calculus_validate_curve_scalar_inputs(const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation)
VectorCalculusExprResult curve_integral_scalar_strict(const std::shared_ptr< SymbolicExpr > &function, const VectorField &parametrization, const std::string &parameter, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)

引用了 a, b, context, curve_integral_scalar_checked(), LMCAS::vector_calculus_detail::curve_integral_scalar_strict(), e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, parametrization, ResourceLimit, t , 以及 LMCAS::vector_calculus_detail::vector_calculus_validate_curve_scalar_inputs().

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

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

◆ curve_integral_vector()

std::shared_ptr< SymbolicExpr > LMCAS::curve_integral_vector ( const VectorField & F,
const VectorField & parametrization,
const std::string & t,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b )

在文件 vector_calculus_curves.cpp 第 160 行定义.

164{
166 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
167 (context).limits().max_ast_nodes, "transform");
168 if (F.empty()) {
169 throw std::invalid_argument("curve_integral_vector: F must not be empty");
170 }
171 if (parametrization.empty()) {
172 throw std::invalid_argument("curve_integral_vector: parametrization must not be empty");
173 }
174 if (F.size() != parametrization.size()) {
175 throw std::invalid_argument(
176 "curve_integral_vector: F and parametrization must have the same dimension");
177 }
178 if (!a || !b) {
179 throw std::invalid_argument("curve_integral_vector: bounds must not be null");
180 }
181
182 size_t dim = parametrization.size();
183 auto coord_vars = vector_calculus_coord_vars(dim);
184
185 std::shared_ptr<SymbolicExpr> dot_product = nullptr;
186 for (size_t i = 0; i < dim; ++i) {
187 if (!F[i]) {
188 continue;
189 }
190
191 auto Fi_composed = F[i];
192 for (size_t j = 0; j < dim; ++j) {
193 Fi_composed = detail::make_expression_ptr(detail::substitute_node(detail::node(Fi_composed), coord_vars[j], detail::node(parametrization[j]), transform_budget));
194 }
195 Fi_composed = detail::make_expression_ptr(detail::normalize_node(detail::node(Fi_composed), transform_budget));
196
198 if (!ri_prime) {
199 continue;
200 }
201 ri_prime = detail::make_expression_ptr(detail::normalize_node(detail::node(ri_prime), transform_budget));
202
203 auto term = SymbolicExpr::multiply(Fi_composed, ri_prime);
204 term = detail::make_expression_ptr(detail::normalize_node(detail::node(term), transform_budget));
205
206 if (!dot_product) {
207 dot_product = term;
208 } else {
209 dot_product = SymbolicExpr::add(dot_product, term);
211 }
212 }
213
214 if (!dot_product) {
215 return SymbolicExpr::number(0);
216 }
217
218
219 return vector_calculus_integrate_with_fallback(dot_product, t, a, b, context, transform_budget);
220}
VectorCalculusExprResult dot_product(const VectorField &a, const VectorField &b)

引用了 a, b, context, curve_integral_vector(), LMCAS::detail::differentiate_node(), dim, dot_product(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), parametrization, LMCAS::detail::substitute_node(), t, LMCAS::vector_calculus_detail::vector_calculus_coord_vars() , 以及 LMCAS::vector_calculus_detail::vector_calculus_integrate_with_fallback().

被这些函数引用 curve_integral_vector().

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

◆ curve_integral_vector_checked() [1/2]

VectorCalculusExprResult LMCAS::curve_integral_vector_checked ( const VectorField & F,
const VectorField & parametrization,
const std::string & t,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b )

在文件 vector_calculus_curves.cpp 第 151 行定义.

155{
158}
VectorCalculusExprResult curve_integral_vector_checked(const VectorField &F, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)

引用了 a, b, context, curve_integral_vector_checked(), parametrization , 以及 t.

函数调用图:

◆ curve_integral_vector_checked() [2/2]

VectorCalculusExprResult LMCAS::curve_integral_vector_checked ( const VectorField & F,
const VectorField & parametrization,
const std::string & t,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context )

在文件 vector_calculus_curves.cpp 第 114 行定义.

119{
120 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
121 context.limits().max_ast_nodes, "curve_integral_vector");
122 const std::string operation = "curve_integral_vector";
124 F, parametrization, t, a, b, context, operation);
125 if (!valid) {
126 return VectorCalculusExprResult::failure(valid.error());
127 }
128
129 auto step = context.consume_steps(F.size() * parametrization.size() +
130 parametrization.size() * 3 + 4,
131 operation);
132 if (!step) {
133 return VectorCalculusExprResult::failure(step.error());
134 }
135
136 try {
137 return curve_integral_vector_strict(F, parametrization, t, a, b, context, operation, transform_budget);
138 } catch (const CasError& error) {
140 } catch (const std::bad_alloc&) {
142 "curve integral allocation failed",
143 operation);
144 } catch (const std::length_error& error) {
145 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
146 } catch (const std::exception& e) {
148 }
149}
Result< void > vector_calculus_validate_curve_vector_inputs(const VectorField &F, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation)
VectorCalculusExprResult curve_integral_vector_strict(const VectorField &field, const VectorField &parametrization, const std::string &parameter, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)

引用了 a, b, context, curve_integral_vector_checked(), LMCAS::vector_calculus_detail::curve_integral_vector_strict(), e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, parametrization, ResourceLimit, t , 以及 LMCAS::vector_calculus_detail::vector_calculus_validate_curve_vector_inputs().

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

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

◆ deduplicate_roots()

std::vector< lmmc_real_t > LMCAS::deduplicate_roots ( std::vector< NumericRoot > & roots,
lmmc_real_t tolerance,
int max_roots )

在文件 mixed_transcendental_deduplication.cpp 第 7 行定义.

11{
12 if (roots.empty()) {
13 return {};
14 }
15
16 std::sort(roots.begin(), roots.end(),
17 [](const NumericRoot& a, const NumericRoot& b) {
18 return a.value < b.value;
19 });
20 lmmc_real_t threshold = 10.0 * tolerance;
21 std::vector<NumericRoot> survivors;
22 survivors.reserve(roots.size());
23 survivors.push_back(roots[0]);
24
25 for (size_t i = 1; i < roots.size(); ++i) {
26 NumericRoot& last = survivors.back();
27 if (std::fabs(roots[i].value - last.value) < threshold) {
28 if (roots[i].residual < last.residual) {
29 last = roots[i];
30 }
31 } else {
32 survivors.push_back(roots[i]);
33 }
34 }
35 std::vector<lmmc_real_t> result;
36 result.reserve(survivors.size());
37 for (const auto& r : survivors) {
38 result.push_back(r.value);
39 }
40
41 if (max_roots > 0 && result.size() > static_cast<std::size_t>(max_roots)) {
42 result.resize(static_cast<size_t>(max_roots));
43 }
44
45 return result;
46}
数值根结果,包含根值,残差和迭代次数.

引用了 a, b, deduplicate_roots(), r, LMCAS::NumericRoot::residual, roots(), LMCAS::NumericRoot::value, LMCAS::Result< T >::value() , 以及 value.

被这些函数引用 deduplicate_roots() , 以及 LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::finish().

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

◆ deflate_rational_root()

void LMCAS::deflate_rational_root ( Polynomial< Rational > & current,
const Rational & root,
std::vector< Rational > & roots )
static

在文件 rational_polynomial.cpp 第 56 行定义.

58 {
59 Polynomial<Rational> linear({-root, Rational(1)}, current.variable_name);
60 while (current.degree() >= 1) {
61 auto [quotient, remainder] = current.div_mod(linear);
62 if (!remainder.is_zero()) break;
63 roots.push_back(root);
64 current = std::move(quotient);
65 if (current.degree() < 1 || current.eval(root) != Rational(0)) break;
66 }
67}
一元多项式模板类
CoeffType eval(const CoeffType &val) const
对多项式求值(Horner 法)
std::pair< Polynomial, Polynomial > div_mod(const Polynomial &other) const
多项式带余除法

引用了 deflate_rational_root(), LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Polynomial< CoeffType >::div_mod(), LMCAS::Polynomial< CoeffType >::eval(), roots() , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 deflate_rational_root() , 以及 find_rational_roots().

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

◆ denominator_factor()

std::shared_ptr< const SymbolicNode > LMCAS::LimitVisitor::denominator_factor ( const std::shared_ptr< const SymbolicNode > & node)
static

在文件 calculus_asymptotes.cpp 第 14 行定义.

16{
17 auto power = std::dynamic_pointer_cast<const PowerNode>(node);
18 if (!power) {
19 return nullptr;
20 }
21 auto number = std::dynamic_pointer_cast<const NumberNode>(power->exponent());
22 if (!number) {
23 return nullptr;
24 }
25 const Rational exponent = std::holds_alternative<BigInt>(number->value())
26 ? Rational(std::get<BigInt>(number->value()))
27 : std::get<Rational>(number->value());
28 if (!(exponent < Rational(0))) {
29 return nullptr;
30 }
31 if (exponent == Rational(-1)) {
32 return power->base();
33 }
35 return LMCAS::detail::make_node<PowerNode>(power->base(), positive);
36}

引用了 denominator_factor(), exponent , 以及 LMCAS::detail::make_node().

被这些函数引用 calculus_utils_extract_denominator() , 以及 denominator_factor().

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

◆ dep_var_is_positive()

Result< bool > LMCAS::dep_var_is_positive ( const std::string & y,
const AssumptionContext * ctx,
ComputationContext & context )
static

Check if the dependent variable is known Positive in the given context.

在文件 symbolic_ode.cpp 第 52 行定义.

53 {
54 if (!ctx) {
55 return false;
56 }
57 auto y_expr = SymbolicExpr::variable(y);
58 auto positive = ctx->is_positive_checked(*y_expr, context);
59 if (!positive) { return Result<bool>::failure(positive.error()); }
60 return positive.value() == Tribool::True;
61}

引用了 context, dep_var_is_positive(), LMCAS::Result< T >::failure() , 以及 True.

被这些函数引用 dep_var_is_positive(), solve_linear1_ode(), solve_linear2_homogeneous() , 以及 solve_separable_ode().

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

◆ depends_on_integration_variable()

bool LMCAS::depends_on_integration_variable ( const SymbolicExpr & expression,
const std::string & variable )
inline

在文件 integration_support.hpp 第 56 行定义.

58 {
60}
bool integration_depends_on_variable(const SymbolicNodePtr &expression, const std::string &variable, RewriteBudget *budget=nullptr)

引用了 depends_on_integration_variable(), LMCAS::detail::integration_depends_on_variable(), LMCAS::detail::node() , 以及 variable.

被这些函数引用 depends_on_integration_variable(), LMCAS::detail::integrate_power_primitive(), LMCAS::anonymous_namespace{integration_by_parts.cpp}::integration_by_parts_choice(), LMCAS::anonymous_namespace{integration_by_parts.cpp}::integration_by_parts_score() , 以及 LMCAS::anonymous_namespace{integration_substitution.cpp}::substitute_candidate().

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

◆ detect_negation()

std::shared_ptr< const SymbolicNode > LMCAS::detect_negation ( const std::shared_ptr< const SymbolicNode > & node)
static

If the node is multiplication by exactly -1, returns the other operand.

在文件 inference_engine_monotonicity.cpp 第 173 行定义.

174 {
175 const auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node);
176 if (!multiply || multiply->operands().size() != 2) {
177 return nullptr;
178 }
179 for (std::size_t index = 0; index < 2; ++index) {
180 const auto number = std::dynamic_pointer_cast<const NumberNode>(
181 multiply->operands()[index]);
182 if (number && number->is_negative_one()) {
183 return multiply->operands()[1 - index];
184 }
185 }
186 return nullptr;
187}

引用了 detect_negation().

被这些函数引用 detect_negation().

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

◆ detect_parity()

int LMCAS::detect_parity ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
ComputationContext & context )
static

在文件 series_expansions.cpp 第 23 行定义.

23 {
24
25 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
26 (context).limits().max_ast_nodes, "transform");
27 if (!f) {
28 return 0;
29 }
30 auto neg_x = SymbolicExpr::multiply(SymbolicExpr::number(-1), SymbolicExpr::variable(var));
31 auto f_neg = detail::make_expression_ptr(detail::substitute_node(detail::node(f), var, detail::node(neg_x), transform_budget));
32 if (!f_neg) {
33 return 0;
34 }
35 f_neg = detail::make_expression_ptr(detail::normalize_node(detail::node(f_neg), transform_budget));
36 auto f_s = detail::make_expression_ptr(detail::normalize_node(detail::node(f), transform_budget));
37 auto diff_even = SymbolicExpr::add(f_neg, SymbolicExpr::multiply(SymbolicExpr::number(-1), f_s));
38 if (diff_even) { diff_even = detail::make_expression_ptr(detail::normalize_node(detail::node(diff_even), transform_budget)); if (diff_even->is_zero()) {
39 return 1;
40 } }
41 auto diff_odd = SymbolicExpr::add(f_neg, f_s);
42 if (diff_odd) { diff_odd = detail::make_expression_ptr(detail::normalize_node(detail::node(diff_odd), transform_budget)); if (diff_odd->is_zero()) {
43 return -1;
44 } }
45 return 0;
46}

引用了 context, detect_parity(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::detail::substitute_node().

被这些函数引用 detect_parity() , 以及 fourier_series_checked().

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

◆ detect_substitution()

Result< std::optional< SubstitutionResult > > LMCAS::detect_substitution ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var )

在文件 transcendental_solver_substitution.cpp 第 324 行定义.

326 {
328 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
329 (context).limits().max_ast_nodes, "transform");
330
331 if (!expr || !LMCAS::detail::node(expr)) {
332 return std::optional<SubstitutionResult>{};
333 }
334
336 return std::optional<SubstitutionResult>{};
337 }
338
339 const std::string u_var = "_u_subst";
340
341 std::vector<std::shared_ptr<SymbolicExpr>> candidates;
343 deduplicate_candidates(candidates);
344
345 for (auto& h : candidates) {
346
347 auto redundant = redundant_variable_candidate(h, expr, var);
348 if (!redundant) {
349 return Result<std::optional<SubstitutionResult>>::failure(redundant.error());
350 }
351 if (redundant.value()) {
352 continue;
353 }
354
355
356
357 SubstNodeVisitor visitor;
358 visitor.target = LMCAS::detail::node(h);
359 visitor.u_name = u_var;
360
361 auto substituted_node = visitor.replace(LMCAS::detail::node(expr));
362 auto substituted_expr = LMCAS::detail::make_expression_ptr(substituted_node);
363 substituted_expr = detail::make_expression_ptr(detail::normalize_node(detail::node(substituted_expr), transform_budget));
364
365 auto polynomial = is_substitution_polynomial(substituted_expr, var, u_var);
366 if (!polynomial) {
367 return Result<std::optional<SubstitutionResult>>::failure(polynomial.error());
368 }
369 if (polynomial.value()) {
370 return std::optional<SubstitutionResult>{{h, substituted_expr, u_var}};
371 }
372 }
373
375 auto rewritten_node = rewrite_exp_as_u_power(LMCAS::detail::node(expr), var, u_var);
376 auto rewritten_expr = LMCAS::detail::make_expression_ptr(rewritten_node);
377 rewritten_expr = detail::make_expression_ptr(detail::normalize_node(detail::node(rewritten_expr), transform_budget));
378
379 auto polynomial = is_substitution_polynomial(rewritten_expr, var, u_var);
380 if (!polynomial) {
381 return Result<std::optional<SubstitutionResult>>::failure(polynomial.error());
382 }
383 if (polynomial.value()) {
384 auto exp_x = SymbolicExpr::exp(SymbolicExpr::variable(var));
385 return std::optional<SubstitutionResult>{{exp_x, rewritten_expr, u_var}};
386 }
387 }
388
389 return std::optional<SubstitutionResult>{};
390} catch (const CasError& error) {
391 return Result<std::optional<SubstitutionResult>>::failure(error);
392} catch (const std::bad_alloc&) {
393 return Result<std::optional<SubstitutionResult>>::failure(CasErrc::ResourceLimit, "allocation failed", "detect_substitution");
394} catch (const std::length_error& error) {
395 return Result<std::optional<SubstitutionResult>>::failure(CasErrc::ResourceLimit, error.what(), "detect_substitution");
396} catch (const std::exception& error) {
397 return Result<std::optional<SubstitutionResult>>::failure(CasErrc::InternalInvariant, error.what(), "detect_substitution");
398}
static Result< bool > is_substitution_polynomial(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const std::string &u_var)
static bool has_exp_k_var_terms(const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
static void deduplicate_candidates(std::vector< std::shared_ptr< SymbolicExpr > > &candidates)
static Result< bool > redundant_variable_candidate(const std::shared_ptr< SymbolicExpr > &candidate, const std::shared_ptr< SymbolicExpr > &expr, const std::string &var)
static void collect_transcendental_subexprs(const std::shared_ptr< const SymbolicNode > &node, const std::string &var, std::vector< std::shared_ptr< SymbolicExpr > > &candidates)
static std::shared_ptr< const SymbolicNode > rewrite_exp_as_u_power(const std::shared_ptr< const SymbolicNode > &node, const std::string &var, const std::string &u_var)

引用了 context, detect_substitution(), expression_depends_on_variable(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 detect_substitution() , 以及 LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_transcendental_impl().

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

◆ detect_trans_substitutions()

TransSubstitutionResult LMCAS::detect_trans_substitutions ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var )

为依赖 var 的 Sin、Cos、Exp、Ln、Tan 子表达式构造换元结果。

按结构去重后,依次分配不定元 u0、u1、u2 等。

参数
[in]expr待检测的符号表达式
[in]var目标变量名
返回
换元映射、代数约束及替换后的表达式;无匹配时保留原表达式。

在文件 transcendental_substitution.cpp 第 264 行定义.

266 {
267
269 result.poly_expr = nullptr;
270
271 if (!expr || !LMCAS::detail::node(expr)) {
272 return result;
273 }
274
275 std::vector<std::shared_ptr<const SymbolicNode>> candidates;
276 tf_collect_transcendental(LMCAS::detail::node(expr), var, candidates);
277
278 tf_deduplicate(candidates);
279
280 for (size_t i = 0; i < candidates.size(); ++i) {
281 TransSubstitution mapping;
282 mapping.trans_expr = LMCAS::detail::make_expression_ptr(candidates[i]);
283 mapping.indeterminate = "u" + std::to_string(i);
284 result.mappings.push_back(std::move(mapping));
285 }
286
287 tf_detect_constraints(result);
288
289 if (!result.mappings.empty()) {
290 auto substituted = tf_substitute_expr(LMCAS::detail::node(expr), result.mappings);
291 result.poly_expr = LMCAS::detail::make_expression_ptr(substituted);
292 } else {
293 result.poly_expr = expr;
294 }
295
296 return result;
297}
std::shared_ptr< SymbolicExpr > poly_expr
换元后的多项式表达式
static std::shared_ptr< const SymbolicNode > tf_substitute_expr(const std::shared_ptr< const SymbolicNode > &node, const std::vector< TransSubstitution > &mappings)
按映射顺序将超越子表达式替换为不定元,递归重建未匹配节点。
static void tf_collect_transcendental(const std::shared_ptr< const SymbolicNode > &node, const std::string &var, std::vector< std::shared_ptr< const SymbolicNode > > &candidates)
按先序收集依赖 var 的超越函数子表达式。
static void tf_deduplicate(std::vector< std::shared_ptr< const SymbolicNode > > &candidates)
按结构哈希和 equals 比较去重,保留首次出现的顺序。
std::vector< TransSubstitution > mappings
所有换元映射
static void tf_detect_constraints(TransSubstitutionResult &result)

引用了 detect_trans_substitutions(), LMCAS::TransSubstitution::indeterminate, LMCAS::detail::make_expression_ptr(), LMCAS::TransSubstitutionResult::mappings, LMCAS::detail::node(), LMCAS::TransSubstitutionResult::poly_expr, tf_collect_transcendental(), tf_deduplicate(), tf_detect_constraints(), tf_substitute_expr() , 以及 LMCAS::TransSubstitution::trans_expr.

被这些函数引用 detect_trans_substitutions(), factor_transcendental() , 以及 solve_finite_mixed().

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

◆ determine_search_interval()

std::optional< SearchInterval > LMCAS::determine_search_interval ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
const SolveOptions & opts )

在文件 mixed_transcendental_search.cpp 第 143 行定义.

147{
148 if (opts.has_search_interval) {
149 if (opts.search_lo >= opts.search_hi) {
150 return std::nullopt;
151 }
152 if ((opts.search_hi - opts.search_lo) <= opts.tolerance) {
153 return std::nullopt;
154 }
155 return SearchInterval{opts.search_lo, opts.search_hi};
156 }
157
158 lmmc_real_t lo = -10.0;
159 lmmc_real_t hi = 10.0;
160
161 if (expr && LMCAS::detail::node(expr)) {
162 PeriodicCollector collector(var);
163 LMCAS::detail::node(expr)->accept(collector);
164
165 if (collector.found_periodic && !collector.has_nonlinear_periodic && collector.max_period > 0.0) {
166 // [-period, period] covers two complete periods around zero.
167 lmmc_real_t half_span = collector.max_period;
168 if (half_span > lo * -1.0 || half_span > hi) {
169 lo = -half_span;
170 hi = half_span;
171 }
172 // Cap automatic interval growth to keep numeric scanning bounded.
173 if (lo < -100.0) {
174 lo = -100.0;
175 }
176 if (hi > 100.0) {
177 hi = 100.0;
178 }
179 }
180 }
181
182 if (lo >= hi) {
183 return std::nullopt;
184 }
185 if ((hi - lo) <= opts.tolerance) {
186 return std::nullopt;
187 }
188
189 return SearchInterval{lo, hi};
190}
bool has_search_interval
是否指定了搜索区间
lmmc_real_t tolerance
收敛容差
lmmc_real_t search_lo
搜索区间下界(默认 -10)
lmmc_real_t search_hi
搜索区间上界(默认 10)

引用了 LMCAS::SymbolicNode::accept(), determine_search_interval(), LMCAS::SolveOptions::has_search_interval, LMCAS::detail::node(), LMCAS::SolveOptions::search_hi, LMCAS::SolveOptions::search_lo , 以及 LMCAS::SolveOptions::tolerance.

被这些函数引用 determine_search_interval() , 以及 LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::solve_mixed_equation().

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

◆ differential()

std::shared_ptr< SymbolicExpr > LMCAS::differential ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var )

微分 df = f'(var) * dx,返回系数 f'(var)

在文件 calculus_utils.cpp 第 168 行定义.

170{
172 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
173 (context).limits().max_ast_nodes, "transform");
174 if (!f || !LMCAS::detail::node(f)) {
175 return nullptr;
176 }
177
178 /// 微分 df = f'(var) * dx,返回系数 f'(var)
180}

引用了 context, differential(), LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr() , 以及 LMCAS::detail::node().

被这些函数引用 differential().

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

◆ differentiate() [1/2]

ExprResult LMCAS::differentiate ( const ExprPtr & expression,
const std::string & variable )

在文件 expr_transform.cpp 第 47 行定义.

48 {
50 return differentiate(expression, variable, context);
51}
ExprResult differentiate(const ExprPtr &expression, const std::string &variable, ComputationContext &context)

引用了 context, differentiate() , 以及 variable.

函数调用图:

◆ differentiate() [2/2]

ExprResult LMCAS::differentiate ( const ExprPtr & expression,
const std::string & variable,
ComputationContext & context )

在文件 expr_transform.cpp 第 36 行定义.

38 {
39 if (variable.empty()) {
41 "differentiate variable cannot be empty",
43 }
45}
ExpressionResult differentiate_expression(const ExprPtr &expression, const std::string &variable, ComputationContext &context)
constexpr const char * kDifferentiateOperation

引用了 context, differentiate(), LMCAS::detail::differentiate_expression(), LMCAS::expr_detail::expr_common::expression_failure(), InvalidArgument, LMCAS::expr_detail::expr_common::kDifferentiateOperation , 以及 variable.

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

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

◆ differentiate_if_dependent()

std::shared_ptr< SymbolicExpr > LMCAS::differentiate_if_dependent ( const std::shared_ptr< SymbolicExpr > & expression,
const std::string & variable,
ComputationContext & context )
static

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

671 {
672
673 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
674 (context).limits().max_ast_nodes, "transform");
676 return SymbolicExpr::number(0);
677 }
678 return detail::make_expression_ptr(detail::differentiate_node(detail::node(expression), variable, transform_budget));
679}

引用了 context, differentiate_if_dependent(), LMCAS::detail::differentiate_node(), expression_depends_on_variable(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 variable.

被这些函数引用 differentiate_if_dependent() , 以及 is_analytic_impl().

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

◆ dihedral_angle_checked() [1/2]

ExpressionResult LMCAS::dihedral_angle_checked ( const PlaneSymbolic & p1,
const PlaneSymbolic & p2 )

在文件 symbolic_geometry_plane.cpp 第 308 行定义.

310 {
312 return dihedral_angle_checked(p1, p2, context);
313}
ExpressionResult dihedral_angle_checked(const PlaneSymbolic &p1, const PlaneSymbolic &p2, ComputationContext &context)
__attribute__((visibility("default"))) LineSymbolicResult line_from_two_points_checked(const std __attribute__((visibility("default"))) LineSymbolicResult line_from_two_points_checked(const std __attribute__((visibility("default"))) PlaneSymbolicResult plane_from_three_points_checked(const std __attribute__((visibility("default"))) PlaneSymbolicResult plane_from_three_points_checked(const std const PlaneSymbolic & p2

引用了 context, dihedral_angle_checked() , 以及 p2.

函数调用图:

◆ dihedral_angle_checked() [2/2]

ExpressionResult LMCAS::dihedral_angle_checked ( const PlaneSymbolic & p1,
const PlaneSymbolic & p2,
ComputationContext & context )

在文件 symbolic_geometry_plane.cpp 第 280 行定义.

283 {
284 const std::string operation = "dihedral_angle";
285 try {
286 auto p1_valid = validate_plane_checked(p1, context, operation);
287 if (!p1_valid) return ExpressionResult::failure(p1_valid.error());
288 auto p2_valid = validate_plane_checked(p2, context, operation);
289 if (!p2_valid) return ExpressionResult::failure(p2_valid.error());
290
291 auto angle = vector_angle_checked(p1.normal, p2.normal, context);
292 if (!angle) return ExpressionResult::failure(angle.error());
293 const double pi = std::acos(-1.0);
294 const double acute_angle =
295 std::min(angle.value(), pi - angle.value());
297 SymbolicExpr::number(acute_angle));
298 } catch (const std::bad_alloc&) {
300 "vector geometry allocation failed",
301 operation);
302 } catch (const std::exception& e) {
304 e.what(), operation);
305 }
306}
Result< void > validate_plane_checked(const PlaneSymbolic &plane, ComputationContext &context, const std::string &operation)
std::vector< std::shared_ptr< SymbolicExpr > > normal
法向量。
VectorAngleResult vector_angle_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, ComputationContext &context)

引用了 context, dihedral_angle_checked(), e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, LMCAS::PlaneSymbolic::normal, p2, pi(), ResourceLimit, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success(), LMCAS::geometry_detail::validate_plane_checked(), LMCAS::Result< T >::value() , 以及 vector_angle_checked().

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

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

◆ dimension_of()

Result< DimensionSignature > LMCAS::dimension_of ( const SymbolicExpr & expression)

在文件 quantity.cpp 第 200 行定义.

200 {
201 if (!detail::node(expression)) {
203 CasErrc::InvalidArgument, "expression cannot be empty", kOperation);
204 }
205 if (auto quantity = std::dynamic_pointer_cast<const QuantityNode>(detail::node(expression))) {
206 return Result<DimensionSignature>::success(quantity->dimension());
207 }
208 return Result<DimensionSignature>::success(DimensionSignature{});
209}

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

被这些函数引用 dimension_of(), eq(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_checked_operands() , 以及 LMCAS::expr_detail::expr_common::require_dimensionless().

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

◆ diophantine_target()

bool LMCAS::diophantine_target ( const MultiPoly & target,
const std::string & var,
const Rational & eval_point,
const std::string & main_var,
Polynomial< Rational > & target_uni )
static

同一一元变量域内可直接转换。 仅含提升变量的目标须先在提升点求值。

在文件 multivariate_hensel.cpp 第 417 行定义.

419 {
420 try {
421 target_uni = target.to_univariate();
422 /**
423 * @brief 同一一元变量域内可直接转换。
424 * 仅含提升变量的目标须先在提升点求值。
425 */
426 if (target_uni.degree() > 0 &&
427 target_uni.variable_name != main_var) {
428 throw std::logic_error("target uses the lift variable");
429 }
430 } catch (const std::logic_error&) {
431 try {
432 MultiPoly target_eval = target.eval(var, eval_point);
433 target_uni = target_eval.to_univariate();
434 } catch (const std::invalid_argument&) {
435 if (target.is_constant()) {
436 Rational c = target.is_zero() ? Rational(0) : target.terms()[0].second;
437 target_uni = Polynomial<Rational>({c}, main_var);
438 } else {
439 return false;
440 }
441 }
442 }
443 if (target_uni.degree() <= 0) {
444 target_uni.variable_name = main_var;
445 } else if (target_uni.variable_name != main_var) {
446 return false;
447 }
448 return true;
449}

引用了 c, LMCAS::Polynomial< CoeffType >::degree(), diophantine_target(), main_var, target , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 diophantine_target() , 以及 solve_diophantine_pair().

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

◆ diophantine_univariate_factors()

bool LMCAS::diophantine_univariate_factors ( const std::vector< MultiPoly > & factors,
const std::string & var,
const Rational & eval_point,
Polynomial< Rational > & f1_uni,
Polynomial< Rational > & f2_uni )
static

常数转换的默认变量名不代表其系数环。 仅常数可嵌入另一变量环;不同活跃变量须保持区分。

在文件 multivariate_hensel.cpp 第 380 行定义.

383 {
384 bool converted = false;
385
386 try {
387 f1_uni = factors[0].to_univariate();
388 f2_uni = factors[1].to_univariate();
389 converted = true;
390 } catch (const std::invalid_argument&) {
391 try {
392 MultiPoly f1_eval = factors[0].eval(var, eval_point);
393 MultiPoly f2_eval = factors[1].eval(var, eval_point);
394 f1_uni = f1_eval.to_univariate();
395 f2_uni = f2_eval.to_univariate();
396 converted = true;
397 } catch (const std::invalid_argument&) {
398 converted = false;
399 }
400 }
401 if (converted && f1_uni.variable_name != f2_uni.variable_name) {
402 /**
403 * @brief 常数转换的默认变量名不代表其系数环。
404 * 仅常数可嵌入另一变量环;不同活跃变量须保持区分。
405 */
406 if (f1_uni.degree() <= 0) {
407 f1_uni = Polynomial<Rational>(f1_uni.coeffs, f2_uni.variable_name);
408 } else if (f2_uni.degree() <= 0) {
409 f2_uni = Polynomial<Rational>(f2_uni.coeffs, f1_uni.variable_name);
410 } else {
411 return false;
412 }
413 }
414 return converted;
415}
std::vector< CoeffType > coeffs
系数数组,coeffs[i] 为 x^i 的系数

引用了 LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::Polynomial< CoeffType >::degree(), diophantine_univariate_factors() , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 diophantine_univariate_factors() , 以及 solve_diophantine_pair().

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

◆ directional_derivative()

std::shared_ptr< SymbolicExpr > LMCAS::directional_derivative ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
const VectorField & direction,
int order )

在文件 vector_calculus_directional.cpp 第 178 行定义.

181{
183 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
184 context.limits().max_ast_nodes, "directional_derivative");
185 return directional_derivative_impl(f, vars, direction, order, transform_budget);
186}
std::shared_ptr< SymbolicExpr > directional_derivative_impl(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const VectorField &direction, int order, detail::RewriteBudget &transform_budget)
const std::string const LimitExprPtr LimitDirection direction

引用了 context, direction, directional_derivative(), LMCAS::vector_calculus_detail::directional_derivative_impl(), order , 以及 vars.

被这些函数引用 directional_derivative().

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

◆ directional_derivative_checked() [1/2]

VectorCalculusExprResult LMCAS::directional_derivative_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
const VectorField & direction,
int order )

在文件 vector_calculus_directional.cpp 第 118 行定义.

123{
126}
VectorCalculusExprResult directional_derivative_checked(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const VectorField &direction, int order, ComputationContext &context)

引用了 context, direction, directional_derivative_checked(), order , 以及 vars.

函数调用图:

◆ directional_derivative_checked() [2/2]

VectorCalculusExprResult LMCAS::directional_derivative_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
const VectorField & direction,
int order,
ComputationContext & context )

在文件 vector_calculus_directional.cpp 第 62 行定义.

68{
69 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
70 context.limits().max_ast_nodes, "directional_derivative");
71 const std::string operation = "directional_derivative";
72 auto valid = vector_calculus_validate_expr_vars(f, vars, context, operation);
73 if (!valid) {
74 return VectorCalculusExprResult::failure(valid.error());
75 }
76 auto dir_valid = vector_calculus_validate_field_vars(direction, vars, context, operation);
77 if (!dir_valid) {
78 return VectorCalculusExprResult::failure(dir_valid.error());
79 }
80 if (order < 1) {
82 "directional derivative order must be positive",
83 operation);
84 }
85 try {
86 auto mag_sq = vector_calculus_magnitude_squared(direction, transform_budget);
87 if (!mag_sq || !LMCAS::detail::node(mag_sq)) {
90 "direction magnitude construction failed",
91 operation);
92 }
93 if (mag_sq->is_zero()) {
95 "direction vector cannot be zero",
96 operation);
97 }
98 auto step = context.consume_steps(vars.size() * static_cast<std::size_t>(order),
99 operation);
100 if (!step) {
101 return VectorCalculusExprResult::failure(step.error());
102 }
104 directional_derivative_impl(f, vars, direction, order, transform_budget), operation);
105 } catch (const CasError& error) {
107 } catch (const std::bad_alloc&) {
109 "vector calculus allocation failed",
110 operation);
111 } catch (const std::length_error& error) {
112 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
113 } catch (const std::exception& e) {
115 }
116}
Result< void > vector_calculus_validate_expr_vars(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation)
VectorCalculusExprResult vector_calculus_wrap_expr(std::shared_ptr< SymbolicExpr > expr, const std::string &operation)
static std::shared_ptr< SymbolicExpr > vector_calculus_magnitude_squared(const VectorField &v, detail::RewriteBudget &transform_budget)

引用了 context, direction, directional_derivative_checked(), LMCAS::vector_calculus_detail::directional_derivative_impl(), DomainError, e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, InvalidArgument, LMCAS::detail::node(), order, ResourceLimit, vars, vector_calculus_magnitude_squared(), LMCAS::vector_calculus_detail::vector_calculus_validate_expr_vars(), LMCAS::vector_calculus_detail::vector_calculus_validate_field_vars() , 以及 LMCAS::vector_calculus_detail::vector_calculus_wrap_expr().

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

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

◆ dispatch_equation()

SolveResult LMCAS::dispatch_equation ( const ExprPtr & expr,
const ExprPtr & f_expr,
const std::string & var,
ComputationContext & context,
const SolveOptions & opts )
static

在文件 solve_visitor.cpp 第 429 行定义.

430 {
431 auto polynomial = recognize_rational_polynomial(*f_expr, var, context);
432 if (!polynomial) { return SolveResult::failure(polynomial.error()); }
433 if (polynomial.value()) {
434 auto solved = solve_exact_polynomial_set(*polynomial.value(), var, context);
435 if (!solved) { return solved; }
436 return detail::finalize_solution_set(expr, var, std::move(solved.value()), context, Domain::Complex, opts);
437 }
438 auto symbolic = symbolic_to_poly<SymbolicPolyCoeff>(f_expr, var);
439 if (symbolic) {
440 auto solved = solve_symbolic_polynomial_set(symbolic.value(), f_expr, var, context);
441 if (!solved) { return solved; }
442 return detail::finalize_solution_set(expr, var, std::move(solved.value()), context, Domain::Complex, opts);
443 }
444 if (symbolic.error().code != CasErrc::UnsupportedExpression) {
445 return SolveResult::failure(symbolic.error());
446 }
447 if (auto product = solve_product_set(f_expr, var, context, opts)) {
448 if (!*product) { return std::move(*product); }
449 return detail::finalize_solution_set(expr, var, std::move(product->value()), context, Domain::Real, opts);
450 }
451 auto solved = solve_set_core(f_expr, var, context, opts);
452 if (!solved) { return solved; }
453 return detail::finalize_solution_set(expr, var, std::move(solved.value()), context, Domain::Real, opts);
454}
SolveResult finalize_solution_set(const ExprPtr &original, const std::string &variable, SolutionSet solutions, ComputationContext &context, Domain domain, const SolveOptions &options)
static SolveResult solve_exact_polynomial_set(const Polynomial< Rational > &exact, const std::string &var, ComputationContext &context)
static SolveResult solve_symbolic_polynomial_set(const Polynomial< SymbolicPolyCoeff > &polynomial, const ExprPtr &original, const std::string &variable, ComputationContext &context)
static std::optional< SolveResult > solve_product_set(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)
Result< OptionalRationalPolynomial > recognize_rational_polynomial(const SymbolicExpr &expression, const std::string &variable, ComputationContext &context)
static SolveResult solve_set_core(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)

引用了 Complex, context, dispatch_equation(), LMCAS::Result< SolutionSet >::failure(), LMCAS::detail::finalize_solution_set(), Real, recognize_rational_polynomial(), solve_exact_polynomial_set(), solve_product_set(), solve_set_core(), solve_symbolic_polynomial_set() , 以及 UnsupportedExpression.

被这些函数引用 dispatch_equation() , 以及 solve_equation().

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

◆ div() [1/2]

ExprResult LMCAS::div ( const ExprPtr & numerator,
const ExprPtr & denominator )

在文件 expr_arithmetic.cpp 第 46 行定义.

46 {
48 return div(numerator, denominator, context);
49}
ExprResult div(const ExprPtr &numerator, const ExprPtr &denominator, ComputationContext &context)

引用了 context, denominator , 以及 div().

函数调用图:

◆ div() [2/2]

ExprResult LMCAS::div ( const ExprPtr & numerator,
const ExprPtr & denominator,
ComputationContext & context )

在文件 expr_arithmetic.cpp 第 40 行定义.

42 {
43 return quantity_divide(numerator, denominator, context);
44}
QuantityResult quantity_divide(const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs, ComputationContext &context)

引用了 context, denominator, div() , 以及 quantity_divide().

被这些函数引用 div(), div() , 以及 LMCAS::expr_detail::ExprParser::parse_multiplicative().

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

◆ divergence()

std::shared_ptr< SymbolicExpr > LMCAS::divergence ( const VectorField & F,
const std::vector< std::string > & vars )

在文件 vector_calculus_differential.cpp 第 341 行定义.

343{
345 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
346 context.limits().max_ast_nodes, "divergence");
347 return divergence_impl(F, vars, transform_budget);
348}
std::shared_ptr< SymbolicExpr > divergence_impl(const VectorField &F, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)

引用了 context, divergence(), LMCAS::vector_calculus_detail::divergence_impl() , 以及 vars.

被这些函数引用 divergence(), LMCAS::detail::definite::include_divergence(), LMCAS::detail::definite::rational_divergence_checked(), LMCAS::detail::definite::rational_pole_divergence() , 以及 LMCAS::anonymous_namespace{integration_definite.cpp}::reduced_integrand_checked().

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

◆ divergence_checked() [1/2]

VectorCalculusExprResult LMCAS::divergence_checked ( const VectorField & F,
const std::vector< std::string > & vars )

在文件 vector_calculus_differential.cpp 第 104 行定义.

107{
109 return divergence_checked(F, vars, context);
110}
VectorCalculusExprResult divergence_checked(const VectorField &F, const std::vector< std::string > &vars, ComputationContext &context)

引用了 context, divergence_checked() , 以及 vars.

函数调用图:

◆ divergence_checked() [2/2]

VectorCalculusExprResult LMCAS::divergence_checked ( const VectorField & F,
const std::vector< std::string > & vars,
ComputationContext & context )

在文件 vector_calculus_differential.cpp 第 73 行定义.

77{
78 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
79 context.limits().max_ast_nodes, "divergence");
80 const std::string operation = "divergence";
81 auto valid = vector_calculus_validate_field_vars(F, vars, context, operation);
82 if (!valid) {
83 return VectorCalculusExprResult::failure(valid.error());
84 }
85 auto step = context.consume_steps(F.size(), operation);
86 if (!step) {
87 return VectorCalculusExprResult::failure(step.error());
88 }
89 try {
90 return vector_calculus_wrap_expr(divergence_impl(F, vars, transform_budget), operation);
91 } catch (const CasError& error) {
93 } catch (const std::bad_alloc&) {
95 "vector calculus allocation failed",
96 operation);
97 } catch (const std::length_error& error) {
98 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
99 } catch (const std::exception& e) {
101 }
102}

引用了 context, divergence_checked(), LMCAS::vector_calculus_detail::divergence_impl(), e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, ResourceLimit, vars, LMCAS::vector_calculus_detail::vector_calculus_validate_field_vars() , 以及 LMCAS::vector_calculus_detail::vector_calculus_wrap_expr().

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

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

◆ divergence_theorem()

std::shared_ptr< SymbolicExpr > LMCAS::divergence_theorem ( const VectorField & F,
const std::vector< std::string > & vars,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & x_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & y_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & z_bounds )

计算散度 ∇·F = ∂F₁/∂x + ∂F₂/∂y + ∂F₃/∂z

在文件 vector_calculus_integral_api.cpp 第 269 行定义.

275{
277 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
278 context.limits().max_ast_nodes, "divergence_theorem");
279 if (F.size() != 3) {
280 throw std::invalid_argument("divergence_theorem: F must have 3 components");
281 }
282 if (vars.size() != 3) {
283 throw std::invalid_argument("divergence_theorem: vars must have exactly 3 elements");
284 }
285 if (!x_bounds.first || !x_bounds.second ||
286 !y_bounds.first || !y_bounds.second ||
287 !z_bounds.first || !z_bounds.second) {
288 throw std::invalid_argument("divergence_theorem: bounds must not be null");
289 }
290
291 /// 计算散度 ∇·F = ∂F₁/∂x + ∂F₂/∂y + ∂F₃/∂z
292 auto div_F = divergence_impl(F, vars, transform_budget);
293
294 Integrator integrator;
295 std::vector<IntegrationStep> steps = {
296 {vars[2], z_bounds.first, z_bounds.second},
297 {vars[1], y_bounds.first, y_bounds.second},
298 {vars[0], x_bounds.first, x_bounds.second},
299 };
300 auto result = integrate_multiple_checked(*div_F, steps, integrator, context);
301 if (!result) throw result.error();
302 return LMCAS::detail::make_expression_ptr(result.value());
303}
__attribute__((visibility("default"))) std const std::vector< std::string > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & z_bounds
__attribute__((visibility("default"))) std const std::vector< std::string > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & x_bounds
__attribute__((visibility("default"))) std const std::vector< std::string > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & y_bounds
Result< SymbolicExpr > integrate_multiple_checked(const SymbolicExpr &integrand, const std::vector< IntegrationStep > &steps, Integrator &integrator, ComputationContext &context)

引用了 context, LMCAS::vector_calculus_detail::divergence_impl(), divergence_theorem(), integrate_multiple_checked(), integrator, LMCAS::detail::make_expression_ptr(), steps, vars, x_bounds, y_bounds , 以及 z_bounds.

被这些函数引用 divergence_theorem().

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

◆ divergence_theorem_checked() [1/2]

VectorCalculusExprResult LMCAS::divergence_theorem_checked ( const VectorField & F,
const std::vector< std::string > & vars,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & x_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & y_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & z_bounds )

在文件 vector_calculus_integral_api.cpp 第 258 行定义.

264{
267}
VectorCalculusExprResult divergence_theorem_checked(const VectorField &F, const std::vector< std::string > &vars, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &x_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &y_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &z_bounds, ComputationContext &context)

引用了 context, divergence_theorem_checked(), vars, x_bounds, y_bounds , 以及 z_bounds.

函数调用图:

◆ divergence_theorem_checked() [2/2]

VectorCalculusExprResult LMCAS::divergence_theorem_checked ( const VectorField & F,
const std::vector< std::string > & vars,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & x_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & y_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & z_bounds,
ComputationContext & context )

在文件 vector_calculus_integral_api.cpp 第 207 行定义.

214{
215 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
216 context.limits().max_ast_nodes, "divergence_theorem");
217 const std::string operation = "divergence_theorem";
218 auto field_valid = vector_calculus_validate_field_vars(F, vars, context, operation);
219 if (!field_valid) {
220 return VectorCalculusExprResult::failure(field_valid.error());
221 }
222 auto vars_valid = vector_calculus_validate_distinct_vars(vars, 3, context, operation);
223 if (!vars_valid) {
224 return VectorCalculusExprResult::failure(vars_valid.error());
225 }
226 auto x_valid = vector_calculus_validate_bound_pair(x_bounds, context, operation, "x");
227 if (!x_valid) {
228 return VectorCalculusExprResult::failure(x_valid.error());
229 }
230 auto y_valid = vector_calculus_validate_bound_pair(y_bounds, context, operation, "y");
231 if (!y_valid) {
232 return VectorCalculusExprResult::failure(y_valid.error());
233 }
234 auto z_valid = vector_calculus_validate_bound_pair(z_bounds, context, operation, "z");
235 if (!z_valid) {
236 return VectorCalculusExprResult::failure(z_valid.error());
237 }
238 auto step = context.consume_steps(14, operation);
239 if (!step) {
240 return VectorCalculusExprResult::failure(step.error());
241 }
242
243 try {
244 return divergence_theorem_strict(F, vars, x_bounds, y_bounds, z_bounds, context, operation, transform_budget);
245 } catch (const CasError& error) {
247 } catch (const std::bad_alloc&) {
249 "divergence theorem allocation failed",
250 operation);
251 } catch (const std::length_error& error) {
252 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
253 } catch (const std::exception& e) {
255 }
256}
Result< void > vector_calculus_validate_distinct_vars(const std::vector< std::string > &vars, std::size_t expected, ComputationContext &context, const std::string &operation)
Result< void > vector_calculus_validate_bound_pair(const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &bounds, ComputationContext &context, const std::string &operation, const std::string &label)
VectorCalculusExprResult divergence_theorem_strict(const VectorField &field, const std::vector< std::string > &variables, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &x_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &y_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &z_bounds, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)

引用了 context, divergence_theorem_checked(), LMCAS::vector_calculus_detail::divergence_theorem_strict(), e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, ResourceLimit, vars, LMCAS::vector_calculus_detail::vector_calculus_validate_bound_pair(), LMCAS::vector_calculus_detail::vector_calculus_validate_distinct_vars(), LMCAS::vector_calculus_detail::vector_calculus_validate_field_vars(), x_bounds, y_bounds , 以及 z_bounds.

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

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

◆ divides_monomial()

bool LMCAS::divides_monomial ( const Monomial & divisor,
const Monomial & target )
inline

判断 divisor 是否整除 target

参数
divisor除数单项式
target被除数单项式
返回
divisor 的每个分量都不超过 target 对应分量时返回 true

在文件 monomial_order.hpp 第 55 行定义.

55 {
56 if (divisor.size() > target.size()) {
57 for (size_t i = target.size(); i < divisor.size(); ++i)
58 if (divisor[i] != 0) return false;
59 }
60 for (size_t i = 0; i < std::min(divisor.size(), target.size()); ++i) {
61 if (divisor[i] > target[i]) return false;
62 }
63 return true;
64}

引用了 divides_monomial() , 以及 target.

被这些函数引用 divides_monomial(), LMCAS::fglm_detail::is_standard() , 以及 LMCAS::anonymous_namespace{fglm_polynomial.cpp}::reduce_leading_term().

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

◆ divides_poly()

bool LMCAS::divides_poly ( const MultiPoly & dividend,
const MultiPoly & divisor )
static

在文件 multivariate_factor.cpp 第 51 行定义.

52{
53 if (divisor.is_zero()) { return false; }
54 if (dividend.is_zero()) { return true; }
55 try { dividend.exact_div(divisor); return true; }
56 catch (const std::runtime_error&) { return false; }
57}

引用了 divides_poly().

被这些函数引用 divides_poly(), extended_gcd_interpolation() , 以及 recursive_multivariate_gcd().

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

◆ domain_contains()

Result< bool > LMCAS::domain_contains ( const NumberDomainSet & domain,
const ExprPtr & element )

在文件 expr_number_domains.cpp 第 377 行定义.

377 {
378 return domain.contains(element);
379}
const ExprPtr & element

引用了 domain, domain_contains() , 以及 element.

被这些函数引用 domain_contains().

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

◆ domain_requires_real()

bool LMCAS::domain_requires_real ( Domain domain)
static

在文件 solver_assumptions.cpp 第 53 行定义.

53 {
57}
@ Algebraic
Algebraic numbers (roots of polynomials with rational coefficients)

引用了 Algebraic, domain, domain_requires_real(), Integer, Natural, PositiveInt, Rational , 以及 Real.

被这些函数引用 domain_requires_real() , 以及 solution_is_excluded().

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

◆ domain_subset()

Result< bool > LMCAS::domain_subset ( const NumberDomainSet & lhs,
const NumberDomainSet & rhs )

在文件 expr_number_domains.cpp 第 381 行定义.

381 {
382 return Result<bool>::success(lhs.subset_of(rhs));
383}

引用了 domain_subset(), rhs , 以及 LMCAS::Result< T >::success().

被这些函数引用 domain_subset().

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

◆ dot_product()

VectorCalculusExprResult LMCAS::dot_product ( const VectorField & a,
const VectorField & b )

在文件 vector_calculus_algebra.cpp 第 136 行定义.

136 {
138 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
139 context.limits().max_ast_nodes, "dot_product");
140 return dot_product_impl(a, b, transform_budget);
141} catch (const CasError& error) {
143} catch (const std::bad_alloc&) {
145 "vector calculus allocation failed", "dot_product");
146} catch (const std::length_error& error) {
147 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), "dot_product");
148} catch (const std::exception& error) {
149 return VectorCalculusExprResult::failure(CasErrc::InternalInvariant, error.what(), "dot_product");
150}
static VectorCalculusExprResult dot_product_impl(const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)

引用了 a, b, context, dot_product() , 以及 dot_product_impl().

被这些函数引用 curve_integral_vector(), LMCAS::vector_calculus_detail::curve_integral_vector_strict(), dot_product(), stokes_theorem(), LMCAS::vector_calculus_detail::stokes_theorem_strict(), surface_integral_vector(), LMCAS::vector_calculus_detail::surface_integral_vector_strict() , 以及 vector_calculus_surface_dot_strict().

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

◆ dot_product_impl()

VectorCalculusExprResult LMCAS::dot_product_impl ( const VectorField & a,
const VectorField & b,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_algebra.cpp 第 11 行定义.

12{
13 if (a.size() != b.size()) {
16 "vectors must have the same dimension",
17 "dot_product");
18 }
19 std::shared_ptr<SymbolicExpr> sum = SymbolicExpr::number(0);
20 for (size_t i = 0; i < a.size(); ++i) {
21 if (!a[i] || !b[i]) continue;
22 sum = SymbolicExpr::add(sum, SymbolicExpr::multiply(a[i], b[i]));
23 }
25}

引用了 a, b, DimensionMismatch, dot_product_impl(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

被这些函数引用 dot_product(), dot_product_impl(), mixed_product_impl(), scalar_project_impl(), vector_angle_symbolic_impl() , 以及 vector_project_impl().

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

◆ double_root_inequality_intervals()

Result< std::vector< Interval > > LMCAS::double_root_inequality_intervals ( const Polynomial< Rational > & polynomial,
const Rational & rational_part,
bool wants_positive,
bool leading_positive,
bool strict,
detail::RewriteBudget & budget )
static

在文件 inequality_solver_polynomial.cpp 第 95 行定义.

98 {
99 auto& context = budget.context();
100 auto root = SymbolicExpr::number(rational_part);
101 auto verified = verify_quadratic_boundary(
102 polynomial, root, rational_part, Rational(0), Rational(0), context);
103 if (!verified) {
104 return Result<std::vector<Interval>>::failure(verified.error());
105 }
106
107 if (wants_positive == leading_positive) {
108 if (!strict) {
109 return Result<std::vector<Interval>>::success({Interval::entire_line()});
110 }
111 std::vector<Interval> rays{
112 Interval{Endpoint::neg_inf(), Endpoint::open(root)},
113 Interval{Endpoint::open(root), Endpoint::pos_inf()}
114 };
115 check_interval_forest(rays, budget);
116 return Result<std::vector<Interval>>::success(std::move(rays));
117 }
118 if (strict) {
119 return Result<std::vector<Interval>>::success({});
120 }
121 std::vector<Interval> point{Interval::point(root)};
123 return Result<std::vector<Interval>>::success(std::move(point));
124}
ComputationContext & context() const noexcept
void check_interval_forest(const std::vector< Interval > &intervals, detail::RewriteBudget &budget)

引用了 context, LMCAS::detail::RewriteBudget::context(), double_root_inequality_intervals() , 以及 point.

被这些函数引用 double_root_inequality_intervals().

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

◆ e()

ExprResult LMCAS::e ( )

在文件 expr_values.cpp 第 112 行定义.

112 {
113 return detail::constant_expression("e");
114}
ExpressionResult constant_expression(const char *name)

引用了 LMCAS::detail::constant_expression() , 以及 e().

被这些函数引用 LMCAS::PowerNode::PowerNode(), LMCAS::RewriteVisitor::RewriteVisitor(), LMCAS::anonymous_namespace{matrix_decomposition.cpp}::abs_expression(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::arc_length_checked_impl(), assemble_frobenius_polynomial(), LMCAS::berlekamp_detail::bk_poly_pow_mod(), classify_quadric_checked(), LMCAS::MatrixNode::clone(), LMCAS::detail::compare_exact_real_algebraic(), LMCAS::groebner_detail::compute_spoly_sugar(), curl_checked(), curve_integral_scalar_checked(), curve_integral_vector_checked(), dihedral_angle_checked(), directional_derivative_checked(), divergence_checked(), divergence_theorem_checked(), e(), find_extrema_checked(), fourier_transform_checked(), frobenius_indicial_roots(), get_node_degree_helper(), gradient_checked(), greens_theorem_area_checked(), greens_theorem_checked(), hessian_checked(), hl_two_factor_lift(), LMCAS::anonymous_namespace{integration_by_parts.cpp}::integration_by_parts_score(), inverse_derivative_checked(), inverse_fourier_transform_checked(), inverse_function_checked(), inverse_laplace_checked(), LMCAS::anonymous_namespace{solver_assumptions.cpp}::is_integer_value(), LMCAS::ode_root_detail::anonymous_namespace{ode_characteristic_roots.cpp}::iterate_characteristic_roots(), jacobian_checked(), lagrange_multipliers_checked(), laplace_transform_checked(), laplacian_checked(), line_from_two_points_checked(), line_plane_intersection_checked(), matrix_norm(), LMCAS::detail::anonymous_namespace{mixed_transcendental_refinement.cpp}::RootRefinement::newton(), LMCAS::ode_root_detail::Complex::operator/(), LMCAS::expr_detail::ExprParser::parse_identifier_or_call(), plane_from_three_points_checked(), point_plane_distance_checked(), LMCAS::ode_root_detail::polynomial_remainder_is_small(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_rectangles.cpp}::refine_projection_interval(), LMCAS::detail::inequality_support::anonymous_namespace{inequality_solver_ordering.cpp}::root_power_sign(), separable_reciprocal(), singular_series_recurrence(), skew_lines_distance_checked(), solve_bernoulli_ode_checked(), solve_closed_form_from_poly(), solve_exact_ode_checked(), solve_homogeneous_ode_checked(), solve_quartic(), LMCAS::polynomial_solver_detail::solve_quartic_impl(), stokes_theorem_checked(), surface_area_revolution_x_checked(), surface_area_revolution_y_checked(), surface_integral_scalar_checked(), surface_integral_vector_checked(), LMCAS::polynomial_solver_detail::symbolic_quartic_depression(), te_extract_exp(), te_is_hyp(), te_is_power_of_var(), LMCAS::transform_detail::te_is_zero(), LMCAS::transform_detail::te_split_coeff(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::trig_extract_nonneg_int(), LMCAS::ode_root_detail::trim_polynomial(), validate_frobenius_regular_singular_domain(), vector_calculus_classify_critical_point(), LMCAS::vector_calculus_detail::vector_calculus_expr_zero_after_substitution(), LMCAS::anonymous_namespace{mixed_transcendental_classification.cpp}::TranscendentalDetector::visit(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::volume_of_revolution_checked_impl() , 以及 z_transform_checked().

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

◆ eliminate_parametric_column()

void LMCAS::eliminate_parametric_column ( ParametricMatrix & A,
ParametricVector & b,
size_t current_row,
size_t col,
size_t n,
ComputationContext & context )
static

在文件 parametric_solver.cpp 第 115 行定义.

116 {
117
118 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
119 (context).limits().max_ast_nodes, "transform");
120 size_t m = A.size();
121 auto pivot = A[current_row][col];
122
123 for (size_t r = 0; r < m; ++r) {
124 if (r == current_row) {
125 continue;
126 }
127 auto entry = detail::make_expression_ptr(detail::normalize_node(detail::node(A[r][col]), transform_budget));
128 if (entry->is_zero()) {
129 continue;
130 }
131
132 auto factor = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(entry, pivot)), transform_budget));
133
134 for (size_t k = col; k < n; ++k) {
135 auto term = SymbolicExpr::multiply(factor, A[current_row][k]);
136 A[r][k] = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(A[r][k], SymbolicExpr::multiply(term, SymbolicExpr::number(-1)))), transform_budget));
137 }
138
139 auto b_term = SymbolicExpr::multiply(factor, b[current_row]);
140 b[r] = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(b[r], SymbolicExpr::multiply(b_term, SymbolicExpr::number(-1)))), transform_budget));
141 }
142}

引用了 b, context, eliminate_parametric_column(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 r.

被这些函数引用 eliminate_parametric_column().

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

◆ embed_hensel_terms()

MultiPoly LMCAS::embed_hensel_terms ( const MultiPoly & polynomial,
const std::vector< std::string > & variables )
static

在文件 multivariate_hensel.cpp 第 18 行定义.

19 {
20 if (polynomial.variables() == variables) { return polynomial; }
21 if (polynomial.is_constant()) {
22 return MultiPoly(
23 polynomial.is_zero() ? Rational(0) : polynomial.terms().front().second,
24 variables);
25 }
26 std::vector<size_t> coordinates;
27 coordinates.reserve(polynomial.variables().size());
28 for (const auto& variable : polynomial.variables()) {
29 auto position = std::find(variables.begin(), variables.end(), variable);
30 if (position == variables.end()) {
31 throw std::invalid_argument("Hensel embedding: variable is absent from target ring");
32 }
33 coordinates.push_back(static_cast<size_t>(position - variables.begin()));
34 }
35 std::vector<MultiPoly::Term> terms;
36 terms.reserve(polynomial.terms().size());
37 for (const auto& term : polynomial.terms()) {
38 Monomial monomial(variables.size(), 0);
39 for (size_t i = 0; i < term.first.size(); ++i) {
40 monomial[coordinates[i]] = term.first[i];
41 }
42 terms.emplace_back(std::move(monomial), term.second);
43 }
44 return MultiPoly(std::move(terms), variables);
45}
std::vector< Rational > coordinates(const FGLMPoly &polynomial, const std::map< Monomial, size_t > &index)

引用了 embed_hensel_terms() , 以及 variable.

被这些函数引用 embed_hensel_terms(), embed_without_lifting(), evaluated_lifting_cofactors(), lifting_error_coefficient() , 以及 solve_diophantine_pair().

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

◆ embed_univariate_gcd()

MultiPoly LMCAS::embed_univariate_gcd ( const MultiPoly & result,
const std::string & a_var,
const std::vector< std::string > & vars )
static

在文件 multivariate_factor.cpp 第 215 行定义.

216 {
217 int avi = -1;
218 for (size_t i = 0; i < vars.size(); ++i) {
219 if (vars[i] == a_var) { avi = static_cast<int>(i); break; }
220 }
221 std::vector<MultiPoly::Term> nt;
222 for (const auto& term : result.terms()) {
223 Monomial fm(vars.size(), 0);
224 if (avi >= 0 && !term.first.empty()) { fm[static_cast<size_t>(avi)] = term.first[0]; }
225 nt.emplace_back(std::move(fm), term.second);
226 }
227 return MultiPoly(std::move(nt), vars);
228}

引用了 embed_univariate_gcd() , 以及 vars.

被这些函数引用 embed_univariate_gcd() , 以及 univariate_gcd().

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

◆ embed_without_lifting()

std::vector< MultiPoly > LMCAS::embed_without_lifting ( const std::vector< Polynomial< Rational > > & univariate_factors,
const std::vector< std::string > & vars )
static

在文件 multivariate_hensel.cpp 第 48 行定义.

50 {
51 std::vector<MultiPoly> result;
52 result.reserve(univariate_factors.size());
53 for (const auto& uf : univariate_factors) {
54 result.push_back(embed_hensel_terms(
55 MultiPoly::from_univariate(uf, uf.variable_name), vars));
56 }
57 return result;
58}
static MultiPoly embed_hensel_terms(const MultiPoly &polynomial, const std::vector< std::string > &variables)

引用了 embed_hensel_terms(), embed_without_lifting() , 以及 vars.

被这些函数引用 embed_without_lifting() , 以及 multivariate_hensel_lift().

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

◆ endpoints_equivalent()

bool LMCAS::endpoints_equivalent ( const Endpoint & left,
const Endpoint & right )
static

在文件 property_intervals.cpp 第 26 行定义.

26 {
27 if (left.is_open != right.is_open ||
28 left.is_neg_infinity != right.is_neg_infinity ||
29 left.is_pos_infinity != right.is_pos_infinity) {
30 return false;
31 }
32 if (!left.value || !right.value) {
33 return left.value == right.value;
34 }
35 if (!LMCAS::detail::node(left.value) || !LMCAS::detail::node(right.value)) {
36 return LMCAS::detail::node(left.value) == LMCAS::detail::node(right.value);
37 }
38 return LMCAS::detail::node(left.value)->compare(*LMCAS::detail::node(right.value)) == 0;
39}
int compare(const SymbolicNode &other) const
与另一个节点进行全序比较.

引用了 LMCAS::SymbolicNode::compare(), endpoints_equivalent(), LMCAS::detail::node() , 以及 right.

被这些函数引用 endpoints_equivalent() , 以及 intervals_equivalent().

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

◆ eq() [1/2]

ExprResult LMCAS::eq ( const ExprPtr & lhs,
const ExprPtr & rhs )

在文件 expr_arithmetic.cpp 第 92 行定义.

92 {
94 return eq(lhs, rhs, context);
95}
ExprResult eq(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)

引用了 context, eq() , 以及 rhs.

函数调用图:

◆ eq() [2/2]

ExprResult LMCAS::eq ( const ExprPtr & lhs,
const ExprPtr & rhs,
ComputationContext & context )

在文件 expr_arithmetic.cpp 第 73 行定义.

75 {
76 if (!lhs || !rhs) {
78 "eq operands cannot be null", kExprOperation);
79 }
80 auto left_dimension = dimension_of(*lhs);
81 if (!left_dimension) { return ExprResult::failure(left_dimension.error()); }
82 auto right_dimension = dimension_of(*rhs);
83 if (!right_dimension) { return ExprResult::failure(right_dimension.error()); }
84 if (left_dimension.value() != right_dimension.value()) { return integer(0); }
85 auto left = comparison_value(lhs, context);
86 if (!left) { return left; }
88 if (!right) { return right; }
89 return make_binary_expr(left.value(), right.value(), context, "eq", SymbolicExpr::eq);
90}
ExprResult make_binary_expr(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context, const char *operation_name, Factory &&factory)
constexpr const char * kExprOperation
ExprResult comparison_value(const ExprPtr &expression, ComputationContext &context)
Result< DimensionSignature > dimension_of(const SymbolicExpr &expression)

引用了 LMCAS::expr_detail::expr_common::comparison_value(), context, dimension_of(), eq(), LMCAS::expr_detail::expr_common::expression_failure(), LMCAS::Result< ExprPtr >::failure(), integer, InvalidArgument, LMCAS::expr_detail::expr_common::kExprOperation, LMCAS::expr_detail::expr_common::make_binary_expr(), rhs , 以及 right.

被这些函数引用 eq(), eq(), find_extrema_impl(), frobenius_indicial_roots(), inverse_derivative_checked(), inverse_function_checked(), LMCAS::anonymous_namespace{solver_assumptions.cpp}::is_integer_value(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::parametric_input_polynomials(), solve_lagrange_strict() , 以及 verify_lagrange_solutions().

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

◆ equation_predicate()

在文件 solve_solution_finalization.cpp 第 9 行定义.

12 {
13 if (std::dynamic_pointer_cast<const RelationalNode>(detail::node(expression))) {
14 return expression;
15 }
17 detail::node(expression), detail::node(SymbolicExpr::number(0)), RelationOp::EQ));
18}

被这些函数引用 conditional_equation().

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

◆ equivalent()

Result< bool > LMCAS::equivalent ( const SymbolicExpr & lhs,
const SymbolicExpr & rhs,
ComputationContext & context,
const EqvOptions & options )

在文件 expr_equivalence.cpp 第 7 行定义.

10 {
12}
Result< bool > equivalent_impl(const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context, const EqvOptions &options)

引用了 context, equivalent(), LMCAS::detail::equivalent_impl(), options , 以及 rhs.

被这些函数引用 equivalent() , 以及 LMCAS::anonymous_namespace{residual_verification.cpp}::prove_with_profiles().

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

◆ eqv_profile_from_name()

Result< EqvProfile > LMCAS::eqv_profile_from_name ( const std::string & name)

在文件 equivalence_options.cpp 第 42 行定义.

42 {
43 if (name == "Core") {
45 }
46 if (name == "Trig-Basic") {
48 }
49 if (name == "ExpLog-Basic") {
51 }
52 return eqv_profile_failure("unsupported equivalence profile: " + name);
53}
Result< EqvProfile > eqv_profile_failure(std::string message)
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name

引用了 Core, eqv_profile_from_name(), ExpLogBasic, name, LMCAS::Result< T >::success() , 以及 TrigBasic.

被这些函数引用 eqv_profile_from_name() , 以及 set_eqv_profile().

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

◆ error_name() [1/2]

const char * LMCAS::error_name ( CasErrc code)
noexcept

在文件 expr_errors.cpp 第 52 行定义.

52 {
53 switch (code) {
55 return "InvalidArgument";
56 }
58 return "ParseError";
59 }
61 return "UnboundSymbol";
62 }
64 return "DomainError";
65 }
67 return "UnsupportedExpression";
68 }
70 return "Inconclusive";
71 }
73 return "ResourceLimit";
74 }
75 case CasErrc::Cancelled: {
76 return "Cancelled";
77 }
79 return "NumericFailure";
80 }
82 return "InternalInvariant";
83 }
84 default: {
85 return unit_set_error_name(code);
86 }
87 }
88}
const char * unit_set_error_name(CasErrc code) noexcept

引用了 Cancelled, DomainError, error_name(), Inconclusive, InternalInvariant, InvalidArgument, NumericFailure, ParseError, ResourceLimit, UnboundSymbol , 以及 UnsupportedExpression.

被这些函数引用 LMCAS::anonymous_namespace{expr_errors.cpp}::equivalence_error_name(), error_name() , 以及 error_name().

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

◆ error_name() [2/2]

const char * LMCAS::error_name ( const CasError & error)
noexcept

在文件 expr_errors.cpp 第 90 行定义.

90 {
91 if (error.operation == kSymOperation &&
93 error.message.find("imaginary unit") != std::string::npos) {
94 return "ImaginaryUnitReserved";
95 }
96 if (error.operation == kEvalComplexOperation &&
98 return "ComplexEvalUnboundSymbol";
99 }
100 if (error.operation == kComplexOperation &&
102 return "ComplexTypeMismatch";
103 }
104 if (error.operation == kExprSetOperation &&
106 return "SetElementTypeMismatch";
107 }
108 if (error.operation == kSolveExprSetOperation &&
109 error.code == CasErrc::Inconclusive) {
110 return "SetResultInconclusive";
111 }
112 return equivalence_error_name(error);
113}
const char * equivalence_error_name(const CasError &error) noexcept
constexpr const char * kSymOperation
constexpr const char * kEvalComplexOperation
constexpr const char * kSolveExprSetOperation
std::string message
std::string operation
constexpr const char * kExprSetOperation

引用了 error_name(), Inconclusive, InvalidArgument, LMCAS::expr_detail::expr_common::kComplexOperation, kEvalComplexOperation, kExprSetOperation, kSolveExprSetOperation, LMCAS::expr_detail::expr_common::kSymOperation , 以及 UnboundSymbol.

函数调用图:

◆ essential_exponent()

std::optional< int > LMCAS::essential_exponent ( const std::shared_ptr< SymbolicExpr > & f,
const std::shared_ptr< SymbolicExpr > & shift,
ComputationContext & context )
static

在文件 series_expansions.cpp 第 85 行定义.

87 {
88
89 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
90 (context).limits().max_ast_nodes, "transform");
91 auto fn = std::dynamic_pointer_cast<const FunctionNode>(detail::node(f));
92 if (!fn || fn->type() != FunctionNode::FuncType::Exp ||
93 fn->arguments().size() != 1) {
94 return std::nullopt;
95 }
96 auto argument = detail::make_expression_ptr(detail::normalize_node(fn->arguments()[0], transform_budget));
97 auto power = std::dynamic_pointer_cast<const PowerNode>(detail::node(argument));
98 if (!power) {
99 return std::nullopt;
100 }
102 power->exponent(), -std::numeric_limits<int>::max(), std::numeric_limits<int>::max());
103 if (!exponent) {
104 return std::nullopt;
105 }
106 auto base = detail::make_expression_ptr(detail::normalize_node(power->base(), transform_budget));
107 auto delta = detail::make_expression_ptr(detail::normalize_node(detail::node(shift), transform_budget));
108 if (base->compare(delta) == 0 && *exponent < 0) {
109 return -*exponent;
110 }
111 auto nested = std::dynamic_pointer_cast<const PowerNode>(detail::node(base));
112 if (nested && *exponent == -1) {
114 nested->exponent(), 1, std::numeric_limits<int>::max());
115 auto nested_base = detail::make_expression_ptr(detail::normalize_node(nested->base(), transform_budget));
116 if (m && nested_base->compare(delta) == 0) {
117 return m;
118 }
119 }
120 return std::nullopt;
121}
std::optional< int > exact_small_integer_node(const detail::SymbolicNodePtr &node, int min_value, int max_value)

引用了 context, essential_exponent(), exact_small_integer_node(), LMCAS::FunctionNode::Exp, exponent, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 essential_exponent() , 以及 laurent_series_full_impl().

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

◆ essential_laurent()

LaurentSeriesResult LMCAS::essential_laurent ( const std::shared_ptr< SymbolicExpr > & shift,
int m,
int order_neg,
ComputationContext & context )
static

在文件 series_expansions.cpp 第 123 行定义.

125 {
126 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
127 (context).limits().max_ast_nodes, "transform");
128 constexpr const char* operation = "laurent_series_full";
129 auto series = SymbolicExpr::number(1);
130 BigInt factorial(1);
131 for (int k = 1; k <= order_neg / m; ++k) {
132 auto step = context.consume_steps(1, operation);
133 if (!step) {
134 return LaurentSeriesResult::failure(step.error());
135 }
136 factorial *= BigInt(k);
137 auto term = SymbolicExpr::divide(
138 SymbolicExpr::number(1),
139 SymbolicExpr::multiply(
140 SymbolicExpr::number(factorial),
141 SymbolicExpr::power(shift, SymbolicExpr::number(m * k))));
142 series = SymbolicExpr::add(series, term);
143 }
144 return LaurentResult{
146 SymbolicExpr::number(m == 1 ? 1 : 0)};
147} catch (const CasError& error) {
148 return LaurentSeriesResult::failure(error);
149} catch (const std::bad_alloc&) {
150 return LaurentSeriesResult::failure(CasErrc::ResourceLimit, "allocation failed", "laurent_series_full");
151} catch (const std::length_error& error) {
152 return LaurentSeriesResult::failure(CasErrc::ResourceLimit, error.what(), "laurent_series_full");
153} catch (const std::exception& error) {
154 return LaurentSeriesResult::failure(CasErrc::InternalInvariant, error.what(), "laurent_series_full");
155}
洛朗级数展开结果.

引用了 context, Essential, essential_laurent(), LMCAS::Result< LaurentResult >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 essential_laurent() , 以及 laurent_series_full_impl().

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

◆ eval_complex() [1/2]

Result< ApproxComplex > LMCAS::eval_complex ( const SymbolicExpr & expression,
const NumericBindings & bindings )

在文件 expr_complex_evaluation.cpp 第 333 行定义.

334 {
336 return eval_complex(expression, bindings, context);
337}
Result< ApproxComplex > eval_complex(const SymbolicExpr &expression, const NumericBindings &bindings, ComputationContext &context)
const std::vector< Binding > & bindings

引用了 bindings, context , 以及 eval_complex().

函数调用图:

◆ eval_complex() [2/2]

Result< ApproxComplex > LMCAS::eval_complex ( const SymbolicExpr & expression,
const NumericBindings & bindings,
ComputationContext & context )

在文件 expr_complex_evaluation.cpp 第 312 行定义.

314 {
315 try {
316 if (!LMCAS::detail::node(expression)) {
317 return complex_failure(CasErrc::InvalidArgument,
318 "cannot evaluate an empty expression as complex",
320 }
321 return evaluate_complex_node(LMCAS::detail::node(expression),
323 } catch (const std::bad_alloc&) {
325 "complex evaluation allocation failed",
327 } catch (const std::exception& error) {
328 return complex_failure(CasErrc::InternalInvariant, error.what(),
330 }
331}
Result< ApproxComplex > complex_failure(CasErrc code, std::string message, const char *operation)

引用了 bindings, context, eval_complex(), InternalInvariant, InvalidArgument, kEvalComplexOperation, LMCAS::detail::node() , 以及 ResourceLimit.

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

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

◆ evalf() [1/2]

Result< ApproxReal > LMCAS::evalf ( const SymbolicExpr & expression,
const NumericBindings & bindings )

在文件 expr_complex_evaluation.cpp 第 306 行定义.

307 {
309 return evalf(expression, bindings, context);
310}
Result< ApproxReal > evalf(const SymbolicExpr &expression, const NumericBindings &bindings, ComputationContext &context)

引用了 bindings, context , 以及 evalf().

函数调用图:

◆ evalf() [2/2]

Result< ApproxReal > LMCAS::evalf ( const SymbolicExpr & expression,
const NumericBindings & bindings,
ComputationContext & context )

在文件 expr_complex_evaluation.cpp 第 291 行定义.

293 {
294 auto evaluated = evaluate_numeric(expression, bindings, context);
295 if (!evaluated) { return evaluated; }
296 if (!evaluated.value().is_finite() ||
297 !std::isfinite(evaluated.value().value)) {
300 "LMCAS evalf produced a non-finite result",
301 kEvalfOperation);
302 }
303 return evaluated;
304}
Result< ApproxReal > evaluate_numeric(const SymbolicExpr &expression, const NumericBindings &bindings={})

引用了 bindings, context, evalf(), evaluate_numeric(), LMCAS::Result< T >::failure() , 以及 NumericFailure.

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

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

◆ evaluate_numeric() [1/2]

Result< ApproxReal > LMCAS::evaluate_numeric ( const SymbolicExpr & expression,
const NumericBindings & bindings,
ComputationContext & context )

在文件 numeric_evaluation.cpp 第 128 行定义.

130 {
131 if (!detail::node(expression)) {
133 "cannot evaluate an empty expression", kOperation);
134 }
135 detail::NumericEvaluator evaluator(bindings, context);
136 return evaluator.evaluate(detail::node(expression));
137}
138catch (const CasError& error) {
139 return Result<ApproxReal>::failure(error);
140} catch (const std::bad_alloc&) {
142 CasErrc::ResourceLimit, "numeric evaluation allocation failed", kOperation);
143} catch (const std::length_error& error) {
144 return Result<ApproxReal>::failure(CasErrc::ResourceLimit, error.what(), kOperation);
145} catch (const std::exception& error) {
146 return Result<ApproxReal>::failure(CasErrc::InternalInvariant, error.what(), kOperation);
147}

引用了 bindings, context, LMCAS::detail::NumericEvaluator::evaluate(), evaluate_numeric(), LMCAS::Result< T >::failure(), InvalidArgument , 以及 LMCAS::detail::node().

函数调用图:

◆ evaluate_numeric() [2/2]

Result< ApproxReal > LMCAS::evaluate_numeric ( const SymbolicExpr & expression,
const NumericBindings & bindings = {} )
inline

在文件 numeric_evaluation.hpp 第 44 行定义.

45 {}) {
46 ComputationContext context;
47 return evaluate_numeric(expression, bindings, context);
48}

引用了 bindings , 以及 evaluate_numeric().

被这些函数引用 LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::accept_symbolic(), LMCAS::geometry_detail::checked_nonzero_numeric_or_exact(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::classify_constant_equation(), LMCAS::anonymous_namespace{numerical_integration.cpp}::eval_bound_checked(), evalf(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_components(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_node(), evaluate_numeric(), evaluate_numeric(), LMCAS::anonymous_namespace{numerical_integration.cpp}::evaluate_quadrature_callback(), LMCAS::anonymous_namespace{newton_raphson.cpp}::evaluate_root_function(), LMCAS::detail::anonymous_namespace{symbolic_quadric_classification.cpp}::finite_numeric_coeff(), line_plane_intersection_checked(), LMCAS::geometry_detail::numeric_vector_scale_checked(), LMCAS::anonymous_namespace{symbolic_geometry_vector.cpp}::symbolic_vector_finite_numeric() , 以及 LMCAS::detail::try_finite_numeric().

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

◆ evaluated_lifting_cofactors()

std::vector< MultiPoly > LMCAS::evaluated_lifting_cofactors ( const std::vector< MultiPoly > & factors,
const std::string & lift_var,
const Rational & eval_point,
const std::vector< std::string > & vars )
static

在文件 multivariate_hensel.cpp 第 134 行定义.

136 {
137 const int r = static_cast<int>(factors.size());
138 std::vector<MultiPoly> cofactors;
139 cofactors.reserve(r);
140 for (int i = 0; i < r; ++i) {
141 MultiPoly cof(Rational(1), vars);
142 for (int j = 0; j < r; ++j) {
143 if (j == i) { continue; }
144 MultiPoly fj_eval = embed_hensel_terms(
145 factors[j].eval(lift_var, eval_point), vars);
146 cof = cof * fj_eval;
147 }
148 cofactors.push_back(cof);
149 }
150 return cofactors;
151}

引用了 embed_hensel_terms(), evaluated_lifting_cofactors(), r , 以及 vars.

被这些函数引用 apply_hensel_lift_steps() , 以及 evaluated_lifting_cofactors().

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

◆ exact_double_rational()

Result< Rational > LMCAS::detail::exact_double_rational ( double value,
ComputationContext & context,
const std::string & operation )

在文件 interval_endpoint.cpp 第 11 行定义.

13 {
14 if (!std::isfinite(value)) {
17 "finite interval endpoint evaluated to NaN or infinity",
18 operation);
19 }
20 if (value == 0.0) {
21 return Result<Rational>::success(Rational(0));
22 }
23
24 int exponent = 0;
25 std::frexp(value, &exponent);
26 const int binary_exponent = exponent - 53;
27 const std::size_t required_bits = binary_exponent < 0
28 ? static_cast<std::size_t>(-binary_exponent) + 1
29 : static_cast<std::size_t>(binary_exponent) + 54;
30 auto bit_budget = context.require_integer_bits(required_bits, operation);
31 if (!bit_budget) {
32 return Result<Rational>::failure(bit_budget.error());
33 }
34
35 return Result<Rational>::success(Rational::from_double(value));
36}

被这些函数引用 interval_contains_checked().

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

◆ exact_factor_roots()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::exact_factor_roots ( Polynomial< Rational > polynomial,
ComputationContext & context )
static

在文件 solve_polynomial_cubic.cpp 第 121 行定义.

122 {
123
124 std::vector<std::shared_ptr<SymbolicExpr>> roots;
125 while (polynomial.degree() >= 3 && polynomial.coeffs[0] == Rational(0)) {
126 roots.push_back(SymbolicExpr::number(0));
127 polynomial.coeffs.erase(polynomial.coeffs.begin());
128 }
129 if (polynomial.degree() >= 3) {
130 if (bounded_rational_root_search(polynomial)) {
131 for (const auto& root : find_rational_roots(polynomial)) {
132 Polynomial<Rational> linear(
133 {-root, Rational(1)}, polynomial.variable_name);
134 auto [quotient, remainder] = polynomial.div_mod(linear);
135 if (!remainder.is_zero()) {
136 throw std::logic_error("polynomial solver: inexact rational root division");
137 }
138 roots.push_back(SymbolicExpr::number(root));
139 polynomial = std::move(quotient);
140 }
141 }
142 }
143 if (polynomial.degree() == 1) {
144 roots.push_back(SymbolicExpr::number(
145 -polynomial.coeffs[0] / polynomial.coeffs[1]));
146 } else if (polynomial.degree() == 2) {
147 auto quadratic = solve_quadratic_internal(
148 SymbolicExpr::number(polynomial.coeffs[2]),
149 SymbolicExpr::number(polynomial.coeffs[1]),
150 SymbolicExpr::number(polynomial.coeffs[0]), context);
151 roots.insert(roots.end(), quadratic.begin(), quadratic.end());
152 } else if (polynomial.degree() == 4 &&
153 polynomial.coeffs[3] == Rational(0) &&
154 polynomial.coeffs[1] == Rational(0)) {
155 auto biquadratic = solve_biquadratic_impl(
156 SymbolicExpr::number(polynomial.coeffs[4]),
157 SymbolicExpr::number(polynomial.coeffs[2]),
158 SymbolicExpr::number(polynomial.coeffs[0]),
159 polynomial.variable_name, context);
160 roots.insert(roots.end(), biquadratic.begin(), biquadratic.end());
161 } else if (polynomial.degree() >= 3) {
162 auto expression = poly_to_symbolic(polynomial);
163 for (int index = 0; index < polynomial.degree(); ++index) {
164 auto root = make_rootof_checked(expression, polynomial.variable_name,
165 static_cast<std::size_t>(index), context);
166 if (!root) throw root.error();
167 roots.push_back(std::move(root.value()));
168 }
169 }
170 return roots;
171}
bool bounded_rational_root_search(const Polynomial< Rational > &polynomial)
std::vector< std::shared_ptr< SymbolicExpr > > solve_biquadratic_impl(const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, const std::shared_ptr< SymbolicExpr > &c, const std::string &variable, ComputationContext &context)
std::vector< std::shared_ptr< SymbolicExpr > > solve_quadratic_internal(const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, const std::shared_ptr< SymbolicExpr > &c, ComputationContext &context)
RootOfConstructionResult make_rootof_checked(const std::shared_ptr< SymbolicExpr > &polynomial, const std::string &variable, std::size_t index, ComputationContext &context)
std::vector< Rational > find_rational_roots(const Polynomial< Rational > &poly)

引用了 LMCAS::polynomial_solver_detail::bounded_rational_root_search(), LMCAS::Polynomial< CoeffType >::coeffs, context, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Polynomial< CoeffType >::div_mod(), exact_factor_roots(), find_rational_roots(), make_rootof_checked(), roots(), LMCAS::polynomial_solver_detail::solve_biquadratic_impl(), LMCAS::polynomial_solver_detail::solve_quadratic_internal() , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 exact_factor_roots() , 以及 LMCAS::polynomial_solver_detail::exact_polynomial_roots().

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

◆ exact_number_as_rational()

◆ exact_numeric_sign()

int LMCAS::detail::inequality_support::exact_numeric_sign ( const std::shared_ptr< SymbolicExpr > & expr,
ComputationContext & context )

在文件 inequality_solver_numeric.cpp 第 26 行定义.

27 {
28 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
29 (context).limits().max_ast_nodes, "transform");
30 if (!expr || !LMCAS::detail::node(expr)) {
31 return 0;
32 }
33 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(expr), transform_budget));
34 if (!simplified || !LMCAS::detail::node(simplified)) {
35 return 0;
36 }
37 auto num = std::dynamic_pointer_cast<const NumberNode>(LMCAS::detail::node(simplified));
38 if (!num) {
39 return 0;
40 }
41 if (std::holds_alternative<BigInt>(num->value())) {
42 const auto& value = std::get<BigInt>(num->value());
43 if (value.is_zero()) {
44 return 0;
45 }
46 return value.is_negative() ? -1 : 1;
47 }
48 const auto& value = std::get<Rational>(num->value());
49 if (value.get_numerator().is_zero()) {
50 return 0;
51 }
52 return value.get_numerator().is_negative() ? -1 : 1;
53}
std::shared_ptr< SymbolicExpr > num(int value)

◆ exact_radical_domain_excludes()

bool LMCAS::exact_radical_domain_excludes ( const SymbolicNode * node,
Domain domain )
static

在文件 solver_assumptions.cpp 第 161 行定义.

161 {
164 return false;
165 }
166 Rational coefficient(1);
167 const NumberNode* radicand = nullptr;
168 if (!collect_scalar_radical(node, coefficient, radicand)) {
169 return false;
170 }
171 if (coefficient == Rational(0)) {
172 return exact_rational_domain_excludes(coefficient, domain);
173 }
174 if (exact_number_as_rational(*radicand) < Rational(0)) {
175 return false;
176 }
177 const auto root = normalization_exact_square_root(*radicand);
178 if (!root) {
179 return true;
180 }
182 coefficient * exact_number_as_rational(*root), domain);
183}
static bool collect_scalar_radical(const SymbolicNode *node, Rational &coefficient, const NumberNode *&radicand)
std::shared_ptr< const NumberNode > normalization_exact_square_root(const NumberNode &number)
static bool exact_rational_domain_excludes(const Rational &value, Domain domain)

引用了 collect_scalar_radical(), domain, exact_number_as_rational(), exact_radical_domain_excludes(), exact_rational_domain_excludes(), Integer, Natural, normalization_exact_square_root(), PositiveInt , 以及 Rational.

被这些函数引用 exact_radical_domain_excludes() , 以及 solution_is_excluded().

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

◆ exact_rational_domain_excludes()

bool LMCAS::exact_rational_domain_excludes ( const Rational & value,
Domain domain )
static

在文件 solver_assumptions.cpp 第 145 行定义.

145 {
146 if (domain == Domain::Rational) {
147 return false;
148 }
149 if (!value.is_integer()) {
150 return true;
151 }
152 if (domain == Domain::Natural) {
153 return value < Rational(0);
154 }
156 return value <= Rational(0);
157 }
158 return false;
159}

引用了 domain, exact_rational_domain_excludes(), Natural, PositiveInt, Rational , 以及 value.

被这些函数引用 exact_radical_domain_excludes() , 以及 exact_rational_domain_excludes().

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

◆ exact_scalar_number()

const NumberNode * LMCAS::exact_scalar_number ( const SymbolicNode * node)
static

在文件 solver_assumptions.cpp 第 102 行定义.

102 {
103 return dynamic_cast<const NumberNode*>(node);
104}

引用了 exact_scalar_number().

被这些函数引用 collect_scalar_radical(), exact_scalar_number() , 以及 exact_scalar_radicand().

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

◆ exact_scalar_radicand()

const NumberNode * LMCAS::exact_scalar_radicand ( const SymbolicNode * node)
static

在文件 solver_assumptions.cpp 第 106 行定义.

106 {
107 if (const auto* power = dynamic_cast<const PowerNode*>(node)) {
108 const auto* exponent = exact_scalar_number(power->exponent().get());
109 if (exponent && exact_number_as_rational(*exponent) == Rational(1, 2)) {
110 return exact_scalar_number(power->base().get());
111 }
112 }
113 if (const auto* function = dynamic_cast<const FunctionNode*>(node)) {
114 if (function->type() == FunctionNode::FuncType::Sqrt &&
115 function->arguments().size() == 1) {
116 return exact_scalar_number(function->arguments()[0].get());
117 }
118 }
119 return nullptr;
120}
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
@ Sqrt
对数、绝对值、平方根。
幂运算节点,表示 base^exponent。

引用了 exact_number_as_rational(), exact_scalar_number(), exact_scalar_radicand(), exponent, function() , 以及 LMCAS::FunctionNode::Sqrt.

被这些函数引用 collect_scalar_radical() , 以及 exact_scalar_radicand().

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

◆ exact_small_integer_node()

std::optional< int > LMCAS::exact_small_integer_node ( const detail::SymbolicNodePtr & node,
int min_value,
int max_value )

在文件 expression_analysis.cpp 第 279 行定义.

280 {
281 auto number = std::dynamic_pointer_cast<const NumberNode>(node);
282 if (!number) return std::nullopt;
283
284 BigInt value;
285 if (std::holds_alternative<BigInt>(number->value())) {
286 value = std::get<BigInt>(number->value());
287 } else if (std::holds_alternative<Rational>(number->value())) {
288 const Rational& rational = std::get<Rational>(number->value());
289 if (!rational.is_integer()) return std::nullopt;
290 value = rational.to_bigint();
291 } else {
292 return std::nullopt;
293 }
294
295 const auto exact = value.try_to_int64();
296 if (!exact || *exact < min_value || *exact > max_value) {
297 return std::nullopt;
298 }
299 return static_cast<int>(*exact);
300}

引用了 exact_small_integer_node(), rational() , 以及 value.

被这些函数引用 LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::canonicalize_power(), essential_exponent(), LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::exact_polynomial_nodes(), exact_small_integer_node(), LMCAS::transform_detail::anonymous_namespace{transform_support.cpp}::te_is_variable_square() , 以及 LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::trigonometric_periodic_values().

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

◆ exp() [1/2]

ExprResult LMCAS::exp ( const ExprPtr & expression)

在文件 expr_elementary.cpp 第 117 行定义.

117 {
119 return exp(expression, context);
120}

引用了 context , 以及 exp().

函数调用图:

◆ exp() [2/2]

ExprResult LMCAS::exp ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_elementary.cpp 第 110 行定义.

110 {
111 auto valid = require_dimensionless(expression, "exp");
112 if (!valid) { return valid; }
113 return make_unary_math_expr(expression, context, "exp",
114 SymbolicExpr::exp);
115}

引用了 context, exp(), LMCAS::expr_detail::expr_common::make_unary_math_expr() , 以及 LMCAS::expr_detail::expr_common::require_dimensionless().

被这些函数引用 LMCAS::anonymous_namespace{bigint_number_theory.cpp}::binary_modular_power(), LMCAS::berlekamp_detail::bk_poly_pow_mod(), collect_power_denominators(), exp(), exp(), extract_coefficients(), LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function(), formal_derivative(), LMCAS::solver_detail::is_polynomial_node(), lifting_error_coefficient(), lifting_residual_is_zero(), LMCAS::solver_detail::multiply_no_expand(), LMCAS::ModInt::pow(), LMCAS::anonymous_namespace{integration_rational_terms.cpp}::rd_integrate_linear_term() , 以及 truncate_mod_var().

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

◆ expand() [1/2]

ExprResult LMCAS::expand ( const ExprPtr & expression)

在文件 expr_transform.cpp 第 31 行定义.

31 {
33 return expand(expression, context);
34}
ExprResult expand(const ExprPtr &expression, ComputationContext &context)

引用了 context , 以及 expand().

函数调用图:

◆ expand() [2/2]

ExprResult LMCAS::expand ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_transform.cpp 第 27 行定义.

27 {
28 return detail::expand_expression(expression, context);
29}
ExpressionResult expand_expression(const ExprPtr &expression, ComputationContext &context)

引用了 context, expand() , 以及 LMCAS::detail::expand_expression().

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

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

◆ explicit_inverse_candidates()

SymbolicExprVectorResult LMCAS::explicit_inverse_candidates ( const FiniteSolutions & finite,
const std::string & operation )
static

在文件 calculus_inverse.cpp 第 295 行定义.

297{
298 std::vector<std::shared_ptr<SymbolicExpr>> values;
299 values.reserve(finite.values.size());
300 for (const auto& solution : finite.values) {
301 if (!solution.value || !LMCAS::detail::node(solution.value)) {
304 "checked solver returned a null inverse candidate",
305 operation);
306 }
307 auto candidate = rootof_simplify(solution.value);
308 if (!candidate || !LMCAS::detail::node(candidate)) {
311 "checked solver returned a malformed inverse candidate",
312 operation);
313 }
314 values.push_back(candidate);
315 }
316 return SymbolicExprVectorResult::success(std::move(values));
317}

引用了 explicit_inverse_candidates(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), InternalInvariant, LMCAS::detail::node(), rootof_simplify(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success() , 以及 LMCAS::FiniteSolutions::values.

被这些函数引用 explicit_inverse_candidates() , 以及 inverse_function_checked().

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

◆ expr_match() [1/2]

ExprMatchResult LMCAS::expr_match ( const ExprPtr & pattern,
const ExprPtr & target,
const std::vector< std::string > & wildcards )

在文件 expr_transform.cpp 第 207 行定义.

209 {
211 return expr_match(pattern, target, wildcards, context);
212}
const ExprPtr const std::vector< std::string > & wildcards
ExprMatchResult expr_match(const ExprPtr &pattern, const ExprPtr &target, const std::vector< std::string > &wildcards, ComputationContext &context)

引用了 context, expr_match(), target , 以及 wildcards.

函数调用图:

◆ expr_match() [2/2]

ExprMatchResult LMCAS::expr_match ( const ExprPtr & pattern,
const ExprPtr & target,
const std::vector< std::string > & wildcards,
ComputationContext & context )

在文件 expr_transform.cpp 第 134 行定义.

137 {
138 auto step = context.consume_steps(1, kExprMatchOperation);
139 if (!step) return ExprMatchResult::failure(step.error());
140 if (!pattern || !LMCAS::detail::node(pattern)) {
142 "match pattern cannot be null",
144 }
147 "match target cannot be null",
149 }
150
151 std::unordered_set<std::string> wildcard_set;
152 wildcard_set.reserve(wildcards.size());
153 for (const auto& wildcard : wildcards) {
154 if (wildcard.empty()) {
156 "wildcard names cannot be empty",
158 }
159 if (!wildcard_set.insert(wildcard).second) {
161 "wildcard names must be unique",
163 }
164 }
165
166 try {
167 MatchMap raw_bindings;
168 const bool matched = Matcher::match(
169 *pattern, *target, wildcard_set, raw_bindings);
170 if (!matched) {
171 return ExprMatchResult::success(ExprMatch{false, {}});
172 }
173
174 std::vector<std::string> names;
175 names.reserve(raw_bindings.size());
176 for (const auto& binding : raw_bindings) {
177 names.push_back(binding.first);
178 }
179 std::sort(names.begin(), names.end());
180
181 ExprMatch result;
182 result.matched = true;
183 result.bindings.reserve(names.size());
184 for (const auto& name : names) {
185 const auto& value = raw_bindings.at(name);
187 if (!node) {
189 "matcher produced a null binding",
191 }
192 result.bindings.push_back(
195 }
196 return ExprMatchResult::success(std::move(result));
197 } catch (const std::bad_alloc&) {
199 "expression matching allocation failed",
201 } catch (const std::exception& error) {
204 }
205}
constexpr const char * kExprMatchOperation
ExprMatchResult expr_match_failure(CasErrc code, std::string message, const char *operation)
SymbolicExpr wildcard(const std::string &name)
const Binding & binding
std::unordered_map< std::string, SymbolicExpr > MatchMap
匹配结果映射,通配符名称 → 绑定的表达式

引用了 binding, LMCAS::ExprMatch::bindings, context, expr_match(), LMCAS::expr_detail::expr_common::expr_match_failure(), LMCAS::Result< ExprMatch >::failure(), InternalInvariant, InvalidArgument, LMCAS::expr_detail::expr_common::kExprMatchOperation, LMCAS::detail::make_expression_ptr(), LMCAS::ExprMatch::matched, name, LMCAS::detail::node(), ResourceLimit, LMCAS::Result< ExprMatch >::success(), target, value, wildcard() , 以及 wildcards.

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

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

◆ expr_set()

ExprSetResult LMCAS::expr_set ( std::vector< ExprPtr > elements)

在文件 expr_sets.cpp 第 82 行定义.

82 {
83 try {
84 return ExprSet::make(std::move(elements));
85 } catch (const std::bad_alloc&) {
87 "set<Expr> allocation failed",
89 } catch (const std::exception& error) {
92 }
93}
ExprSetResult expr_set_failure(CasErrc code, std::string message, const char *operation)

引用了 expr_set(), expr_set_failure(), InternalInvariant, kExprSetOperation , 以及 ResourceLimit.

被这些函数引用 expr_set() , 以及 project_finite_expr_set().

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

◆ expr_set_contains()

Result< bool > LMCAS::expr_set_contains ( const ExprSet & set,
const ExprPtr & element )

在文件 expr_sets.cpp 第 96 行定义.

97 {
98 if (!element) {
100 "set<Expr> membership element cannot be null",
102 }
103 return Result<bool>::success(set.contains(*element));
104}
const ExprPtr & set

引用了 element, expr_set_contains(), LMCAS::Result< T >::failure(), InvalidArgument, kExprSetOperation, set , 以及 LMCAS::Result< T >::success().

被这些函数引用 expr_set_contains() , 以及 expr_set_not_contains().

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

◆ expr_set_difference()

ExprSetResult LMCAS::expr_set_difference ( const ExprSet & lhs,
const ExprSet & rhs )

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

173{
174 try {
176 auto expression =
177 finite_set_difference(*lhs.expression_, *rhs.expression_, context);
178 if (!expression) {
179 return ExprSetResult::failure(expression.error());
180 }
181 return ExprSetResult::success(ExprSet(
182 std::make_shared<const SymbolicExpr>(*expression.value())));
183 } catch (const std::bad_alloc&) {
184 return expr_set_failure(
186 "set<Expr> difference allocation failed",
188 }
189}
SymbolicSetResult finite_set_difference(const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)

引用了 context, expr_set_difference(), expr_set_failure(), LMCAS::Result< ExprSet >::failure(), finite_set_difference(), kExprSetOperation, ResourceLimit, rhs , 以及 LMCAS::Result< ExprSet >::success().

被这些函数引用 expr_set_difference().

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

◆ expr_set_failure()

ExprSetResult LMCAS::expr_set_failure ( CasErrc code,
std::string message,
const char * operation )
inline

在文件 expr_internal.hpp 第 18 行定义.

19 {
20 return ExprSetResult::failure(code, std::move(message), operation);
21}

引用了 expr_set_failure() , 以及 LMCAS::Result< ExprSet >::failure().

被这些函数引用 expr_set(), expr_set_difference(), expr_set_failure(), expr_set_intersection(), expr_set_symmetric_difference(), expr_set_union() , 以及 project_finite_expr_set().

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

◆ expr_set_intersection()

ExprSetResult LMCAS::expr_set_intersection ( const ExprSet & lhs,
const ExprSet & rhs )

在文件 expr_sets.cpp 第 151 行定义.

153{
154 try {
156 auto expression = finite_set_intersection(
157 *lhs.expression_, *rhs.expression_, context);
158 if (!expression) {
159 return ExprSetResult::failure(expression.error());
160 }
161 return ExprSetResult::success(ExprSet(
162 std::make_shared<const SymbolicExpr>(*expression.value())));
163 } catch (const std::bad_alloc&) {
164 return expr_set_failure(
166 "set<Expr> intersection allocation failed",
168 }
169}
SymbolicSetResult finite_set_intersection(const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)

引用了 context, expr_set_failure(), expr_set_intersection(), LMCAS::Result< ExprSet >::failure(), finite_set_intersection(), kExprSetOperation, ResourceLimit, rhs , 以及 LMCAS::Result< ExprSet >::success().

被这些函数引用 expr_set_intersection().

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

◆ expr_set_not_contains()

Result< bool > LMCAS::expr_set_not_contains ( const ExprSet & set,
const ExprPtr & element )

在文件 expr_sets.cpp 第 106 行定义.

107 {
108 auto result = expr_set_contains(set, element);
109 if (!result) { return result; }
110 return Result<bool>::success(!result.value());
111}
Result< bool > expr_set_contains(const ExprSet &set, const ExprPtr &element)

引用了 element, expr_set_contains(), expr_set_not_contains(), set , 以及 LMCAS::Result< T >::success().

被这些函数引用 expr_set_not_contains().

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

◆ expr_set_subset()

Result< bool > LMCAS::expr_set_subset ( const ExprSet & lhs,
const ExprSet & rhs )

在文件 expr_sets.cpp 第 113 行定义.

114 {
115 return Result<bool>::success(lhs.subset_of(rhs));
116}

引用了 expr_set_subset(), rhs , 以及 LMCAS::Result< T >::success().

被这些函数引用 expr_set_subset().

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

◆ expr_set_subset_domain()

Result< bool > LMCAS::expr_set_subset_domain ( const ExprSet & set,
const NumberDomainSet & domain )

在文件 expr_sets.cpp 第 118 行定义.

119 {
120 for (const auto& element : set.elements()) {
121 auto contains = domain.contains(element);
122 if (!contains) {
123 return contains;
124 }
125 if (!contains.value()) {
126 return Result<bool>::success(false);
127 }
128 }
129 return Result<bool>::success(true);
130}
bool contains(const SymbolicExpr &expression, const std::string &variable)

引用了 contains(), domain, element, expr_set_subset_domain(), set , 以及 LMCAS::Result< T >::success().

被这些函数引用 expr_set_subset_domain().

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

◆ expr_set_symmetric_difference()

ExprSetResult LMCAS::expr_set_symmetric_difference ( const ExprSet & lhs,
const ExprSet & rhs )

在文件 expr_sets.cpp 第 191 行定义.

193{
194 try {
196 auto expression = finite_set_symmetric_difference(
197 *lhs.expression_, *rhs.expression_, context);
198 if (!expression) {
199 return ExprSetResult::failure(expression.error());
200 }
201 return ExprSetResult::success(ExprSet(
202 std::make_shared<const SymbolicExpr>(*expression.value())));
203 } catch (const std::bad_alloc&) {
204 return expr_set_failure(
206 "set<Expr> symmetric difference allocation failed",
208 }
209}
SymbolicSetResult finite_set_symmetric_difference(const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)

引用了 context, expr_set_failure(), expr_set_symmetric_difference(), LMCAS::Result< ExprSet >::failure(), finite_set_symmetric_difference(), kExprSetOperation, ResourceLimit, rhs , 以及 LMCAS::Result< ExprSet >::success().

被这些函数引用 expr_set_symmetric_difference().

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

◆ expr_set_union()

ExprSetResult LMCAS::expr_set_union ( const ExprSet & lhs,
const ExprSet & rhs )

在文件 expr_sets.cpp 第 132 行定义.

134{
135 try {
137 auto expression =
138 finite_set_union(*lhs.expression_, *rhs.expression_, context);
139 if (!expression) {
140 return ExprSetResult::failure(expression.error());
141 }
142 return ExprSetResult::success(ExprSet(
143 std::make_shared<const SymbolicExpr>(*expression.value())));
144 } catch (const std::bad_alloc&) {
145 return expr_set_failure(
146 CasErrc::ResourceLimit, "set<Expr> union allocation failed",
148 }
149}
SymbolicSetResult finite_set_union(const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)

引用了 context, expr_set_failure(), expr_set_union(), LMCAS::Result< ExprSet >::failure(), finite_set_union(), kExprSetOperation, ResourceLimit, rhs , 以及 LMCAS::Result< ExprSet >::success().

被这些函数引用 expr_set_union().

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

◆ expression_depends_on_variable()

bool LMCAS::expression_depends_on_variable ( const detail::SymbolicNodePtr & expression,
const std::string & variable,
detail::RewriteBudget * budget )

在文件 expression_analysis.cpp 第 319 行定义.

321 {
322 if (!expression || variable.empty()) return false;
323 FreeVariableFinder finder(variable, budget);
324 expression->accept(finder);
325 return finder.found;
326}

引用了 LMCAS::SymbolicNode::accept(), expression_depends_on_variable() , 以及 variable.

被这些函数引用 LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::additive_function_pattern(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::additive_lambert_pattern(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::additive_power_pattern(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_limit_result(), LMCAS::anonymous_namespace{integration_substitution.cpp}::classify_linear_wrapper(), coefficient_power_radius(), LMCAS::anonymous_namespace{mixed_transcendental_search.cpp}::PeriodicCollector::collect_period(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::compatible_periodic_conditions(), contains(), convergence_radius_checked(), LMCAS::anonymous_namespace{mixed_transcendental_classification.cpp}::degree_in_var(), LMCAS::detail::inequality_support::depends_on_any_param(), detect_substitution(), differentiate_if_dependent(), LMCAS::anonymous_namespace{limit_result.cpp}::evaluate_one_sided_node(), expression_depends_on_variable(), extract_bernoulli_factor(), LMCAS::anonymous_namespace{mixed_transcendental_search.cpp}::extract_linear_coefficient(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::function_candidate(), LMCAS::groebner_detail::PolyBuilder::function_depends_on_variables(), LMCAS::anonymous_namespace{matrix_quadratic_form.cpp}::independent_of_variables(), integrating_factor_from_ratio(), is_bernoulli_ode(), is_constant_coefficient(), is_euler_equation(), is_linear_first_order(), is_polynomial_after_substitution(), is_separable(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::is_substitution_polynomial(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::lambert_inner(), laurent_series_full_impl(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_complex_at_point(), LMCAS::integration_table_detail::load_polynomial_rules(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::opposite_exponential_lambert_pattern(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::power_candidate(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::power_pattern(), prepare_fourier_period(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::rewrite_scoped(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::scaled_function(), LMCAS::anonymous_namespace{limit_result.cpp}::scaled_one_sided_limit(), separable_product(), separable_reciprocal(), LMCAS::detail::ScopedFacts::shadows(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::solve_factor(), solve_separable_ode(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_transcendental_impl(), symbolic_to_poly_recursive(), LMCAS::transform_detail::te_depends_on(), te_is_denominator_factor(), LMCAS::transform_detail::te_linear_coefficient(), LMCAS::transform_detail::te_split_coeff(), tf_back_substitute(), tf_collect_transcendental(), tf_contains_transcendental(), tf_degree_in(), tf_is_linear_irreducible(), tf_is_variable_exponential(), tf_polynomial_variables(), tf_validate_polynomial(), LMCAS::integration_table_detail::u_is_var_a_indep(), LMCAS::anonymous_namespace{limit_result.cpp}::validate_limit_input(), vector_calculus_constant_integrand(), LMCAS::anonymous_namespace{mixed_transcendental_classification.cpp}::TranscendentalDetector::visit(), LMCAS::anonymous_namespace{complex_analysis.cpp}::FunctionDependencyFinder::visit_function() , 以及 LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_rational_function().

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

◆ expressions()

NumberDomainSet LMCAS::expressions ( )

在文件 expr_number_domains.cpp 第 373 行定义.

373 {
374 return NumberDomainSet(NumberDomain::Expressions);
375}

引用了 Expressions , 以及 expressions().

被这些函数引用 LMCAS::geometry_detail::checked_nonzero_numeric_vector(), LMCAS::anonymous_namespace{solver_groebner.cpp}::convert_polynomials(), expressions(), LMCAS::geometry_detail::numeric_vector_scale_checked() , 以及 LMCAS::anonymous_namespace{solver_groebner.cpp}::reconstruct_basis().

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

◆ extended_gcd()

int64_t LMCAS::extended_gcd ( int64_t a,
int64_t b,
int64_t & s,
int64_t & t )
inline

用扩展欧几里得算法求 gcd(a,b) 及 Bezout 系数。

参数
a第一个有符号机器整数
b第二个有符号机器整数
s输出 Bezout 系数 s,满足 a*s + b*t = gcd(a,b)
t输出 Bezout 系数 t
返回
非负的 gcd(a, b)
异常
std::overflow_error任一输入为 INT64_MIN,其绝对值无法由返回类型表示

输出参数仅在计算成功后写入。

余数及交替 Bezout 系数以 max(|a|,|b|) 为界,包括余数归零的最后一步。

在文件 modular_arithmetic.hpp 第 55 行定义.

55 {
56 const uint64_t magnitude_a = modular_detail::abs_to_u64(a);
57 const uint64_t magnitude_b = modular_detail::abs_to_u64(b);
58 const auto maximum =
59 static_cast<uint64_t>(std::numeric_limits<int64_t>::max());
60 if (magnitude_a > maximum || magnitude_b > maximum) {
61 throw std::overflow_error(
62 "modular extended_gcd does not support INT64_MIN");
63 }
64
65 /** @brief 余数及交替 Bezout 系数以 max(|a|,|b|) 为界,包括余数归零的最后一步。 */
66 int64_t old_r = static_cast<int64_t>(magnitude_a);
67 int64_t r = static_cast<int64_t>(magnitude_b);
68 int64_t old_s = 1;
69 int64_t next_s = 0;
70 int64_t old_t = 0;
71 int64_t next_t = 1;
72
73 while (r != 0) {
74 const int64_t quotient = old_r / r;
75 int64_t temporary = r;
76 r = old_r - quotient * r;
77 old_r = temporary;
78
79 temporary = next_s;
80 next_s = old_s - quotient * next_s;
81 old_s = temporary;
82
83 temporary = next_t;
84 next_t = old_t - quotient * next_t;
85 old_t = temporary;
86 }
87
88 const int64_t result_s = a < 0 ? -old_s : old_s;
89 const int64_t result_t = b < 0 ? -old_t : old_t;
90 s = result_s;
91 t = result_t;
92 return old_r;
93}
uint64_t abs_to_u64(int64_t value)

引用了 a, LMCAS::modular_detail::abs_to_u64(), b, extended_gcd(), r , 以及 t.

被这些函数引用 LMCAS::berlekamp_detail::bk_mod_inverse(), crt_checked(), extended_gcd(), LMCAS::ModInt::inverse() , 以及 rational_reconstruction_checked().

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

◆ extended_gcd_interpolation()

MultiPoly LMCAS::extended_gcd_interpolation ( const MultiPoly & a_prim,
const MultiPoly & b_prim,
const std::string & main_var,
const std::vector< std::string > & vars,
int degree_bound,
const Rational & nc_gcd )
static

在文件 multivariate_factor.cpp 第 310 行定义.

313 {
314 int ext_bound = degree_bound + 5;
315 auto all_pts = gcd_evaluation_points(ext_bound + 10);
316 GcdSamples samples;
317 collect_gcd_samples(a_prim, b_prim, main_var, all_pts, ext_bound + 1, samples);
318 if (samples.target_degree <= 0 || samples.points.empty()) {
319 return MultiPoly(nc_gcd, vars);
320 }
321 auto cand = lagrange_interpolate(samples.points, samples.values, main_var, vars);
322 if (cand.is_zero()) { return MultiPoly(nc_gcd, vars); }
323 cand = cand.make_primitive();
324 if (divides_poly(a_prim, cand) && divides_poly(b_prim, cand)) {
325 return normalize_gcd_candidate(std::move(cand), nc_gcd);
326 }
327 return MultiPoly(nc_gcd, vars);
328}
static std::vector< Rational > gcd_evaluation_points(int bound)
static void collect_gcd_samples(const MultiPoly &a_prim, const MultiPoly &b_prim, const std::string &main_var, const std::vector< Rational > &eval_pts, int num_points, GcdSamples &samples)
static MultiPoly lagrange_interpolate(const std::vector< Rational > &points, const std::vector< MultiPoly > &values, const std::string &main_var, const std::vector< std::string > &all_vars)
static MultiPoly normalize_gcd_candidate(MultiPoly candidate, const Rational &content)
static bool divides_poly(const MultiPoly &dividend, const MultiPoly &divisor)

引用了 collect_gcd_samples(), divides_poly(), extended_gcd_interpolation(), gcd_evaluation_points(), lagrange_interpolate(), main_var, normalize_gcd_candidate(), LMCAS::GcdSamples::points, LMCAS::GcdSamples::target_degree, LMCAS::GcdSamples::values , 以及 vars.

被这些函数引用 extended_gcd_interpolation() , 以及 recursive_multivariate_gcd().

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

◆ extended_gcd_poly()

Polynomial< Rational > LMCAS::extended_gcd_poly ( const Polynomial< Rational > & a,
const Polynomial< Rational > & b,
Polynomial< Rational > & s,
Polynomial< Rational > & t )
static

一元多项式扩展 GCD(有理数域上)

给定 a, b in Q[x],计算 gcd(a, b) 及 Bezout 系数 s, t, 使得 s*a + t*b = gcd(a, b).

参数
[in]a第一个多项式
[in]b第二个多项式
[out]sBezout 系数 s
[out]tBezout 系数 t
返回
gcd(a, b)

r0 = a, r1 = b s0*a + t0*b = r0 s1*a + t1*b = r1

归一化使 gcd 为首一多项式

在文件 multivariate_hensel.cpp 第 300 行定义.

305{
306 std::string var = a.variable_name;
307
308 /// r0 = a, r1 = b
309 /// s0*a + t0*b = r0
310 /// s1*a + t1*b = r1
311 Polynomial<Rational> r0 = a, r1 = b;
312 Polynomial<Rational> s0({Rational(1)}, var), s1(var); // s0=1, s1=0
313 Polynomial<Rational> t0(var), t1({Rational(1)}, var); // t0=0, t1=1
314
315 while (!r1.is_zero()) {
316 auto [q, r] = r0.div_mod(r1);
317
318 Polynomial<Rational> r_new = r;
319 Polynomial<Rational> s_new = s0 - q * s1;
320 Polynomial<Rational> t_new = t0 - q * t1;
321
322 r0 = r1; r1 = r_new;
323 s0 = s1; s1 = s_new;
324 t0 = t1; t1 = t_new;
325 }
326
327 /// 归一化使 gcd 为首一多项式
328 if (!r0.is_zero()) {
329 Rational lc = r0.lead_coeff();
330 if (lc != Rational(1)) {
331 Rational inv = Rational(1) / lc;
332 for (auto& c : r0.coeffs) c = c * inv;
333 for (auto& c : s0.coeffs) c = c * inv;
334 for (auto& c : t0.coeffs) c = c * inv;
335 }
336 }
337
338 s = s0;
339 t = t0;
340 return r0;
341}
CoeffType lead_coeff() const
获取首项系数

引用了 a, b, c, LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::Polynomial< CoeffType >::div_mod(), extended_gcd_poly(), LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::Polynomial< CoeffType >::lead_coeff(), r , 以及 t.

被这些函数引用 extended_gcd_poly() , 以及 solve_diophantine_pair().

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

◆ exterior_derivative_checked() [1/2]

DifferentialGeometryVectorResult LMCAS::exterior_derivative_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & form_coeffs,
int degree,
const std::vector< std::string > & vars )

在文件 differential_geometry.cpp 第 770 行定义.

774{
776 return exterior_derivative_checked(form_coeffs, degree, vars, context);
777}
DifferentialGeometryVectorResult exterior_derivative_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &form_coeffs, int degree, const std::vector< std::string > &vars, ComputationContext &context)

引用了 context, exterior_derivative_checked() , 以及 vars.

函数调用图:

◆ exterior_derivative_checked() [2/2]

DifferentialGeometryVectorResult LMCAS::exterior_derivative_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & form_coeffs,
int degree,
const std::vector< std::string > & vars,
ComputationContext & context )

在文件 differential_geometry.cpp 第 709 行定义.

714{
715 const std::string operation = "exterior_derivative";
716 auto step = context.consume_steps(1, operation);
717 if (!step) return DifferentialGeometryVectorResult::failure(step.error());
718 const auto input_count =
719 validate_form_coefficients(form_coeffs, degree, vars, context, operation);
720 if (!input_count) return DifferentialGeometryVectorResult::failure(input_count.error());
721 const auto output_count = bounded_binomial(vars.size(),
722 static_cast<std::size_t>(degree) + 1,
723 context.limits().max_expansion_terms,
724 operation);
725 if (!output_count) return DifferentialGeometryVectorResult::failure(output_count.error());
726 try {
727 detail::RewriteBudget budget(context, context.limits().max_recursion_depth,
728 context.limits().max_ast_nodes, operation.c_str());
729 std::size_t input_nodes = 0;
730 for (const auto& coefficient : form_coeffs) {
731 input_nodes = budget.append_size(
732 input_nodes, budget.measure(detail::node(coefficient)));
733 }
734 const auto input_indices = index_combinations(vars.size(),
735 static_cast<std::size_t>(degree),
736 input_count.value());
737 const auto output_indices = index_combinations(vars.size(),
738 static_cast<std::size_t>(degree) + 1,
739 output_count.value());
740 std::map<std::vector<std::size_t>, std::size_t> coefficient_index;
741 for (std::size_t i = 0; i < input_indices.size(); ++i) {
742 coefficient_index.emplace(input_indices[i], i);
743 }
744
745 std::vector<std::shared_ptr<SymbolicExpr>> result;
746 result.reserve(output_count.value());
747 std::size_t output_nodes = 0;
748 for (const auto& output_index : output_indices) {
749 auto component = exterior_derivative_component(
750 form_coeffs, vars, coefficient_index, output_index, budget, operation);
751 if (!component) return DifferentialGeometryVectorResult::failure(component.error());
752 output_nodes = budget.append_size(
753 output_nodes, budget.measure(detail::node(component.value())));
754 result.push_back(std::move(component.value()));
755 }
756 return DifferentialGeometryVectorResult::success(std::move(result));
757 } catch (const CasError& error) {
759 } catch (const std::bad_alloc&) {
761 "allocation failed while calculating exterior derivative",
762 operation);
763 } catch (const std::exception& ex) {
765 ex.what(),
766 operation);
767 }
768}
std::size_t append_size(std::size_t current, std::size_t child)
DifferentialGeometryExprResult exterior_derivative_component(const std::vector< std::shared_ptr< SymbolicExpr > > &form_coeffs, const std::vector< std::string > &vars, const std::map< std::vector< std::size_t >, std::size_t > &coefficient_index, const std::vector< std::size_t > &output_index, detail::RewriteBudget &budget, const std::string &operation)

引用了 LMCAS::detail::RewriteBudget::append_size(), context, exterior_derivative_checked(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), InternalInvariant, LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node(), ResourceLimit, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success(), LMCAS::Result< T >::value() , 以及 vars.

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

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

◆ extract_bernoulli_factor()

bool LMCAS::extract_bernoulli_factor ( const std::shared_ptr< const SymbolicNode > & factor,
const std::string & y,
int & exponent,
std::shared_ptr< SymbolicExpr > & coefficient,
ComputationContext & context )
static

在文件 ode_classification.cpp 第 218 行定义.

220 {
221
222 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
223 (context).limits().max_ast_nodes, "transform");
224 if (auto variable =
225 std::dynamic_pointer_cast<const VariableNode>(factor);
226 variable && !variable->is_constant() && variable->name() == y) {
227 if (exponent == std::numeric_limits<int>::max()) {
228 return false;
229 }
230 ++exponent;
231 return true;
232 }
233
234 if (auto power = std::dynamic_pointer_cast<const PowerNode>(factor)) {
235 auto base =
236 std::dynamic_pointer_cast<const VariableNode>(power->base());
237 auto power_value =
238 std::dynamic_pointer_cast<const NumberNode>(power->exponent());
239 if (base && !base->is_constant() && base->name() == y && power_value) {
240 auto value = bernoulli_integer_exponent(*power_value);
241 if (!value) {
242 return false;
243 }
245 }
246 }
247 if (expression_depends_on_variable(factor, y)) {
248 return false;
249 }
250 coefficient = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(
251 coefficient, LMCAS::detail::make_expression_ptr(factor))), transform_budget));
252 return true;
253}
static bool accumulate_bernoulli_exponent(int value, int &exponent)
static std::optional< int > bernoulli_integer_exponent(const NumberNode &number)

引用了 accumulate_bernoulli_exponent(), bernoulli_integer_exponent(), context, exponent, expression_depends_on_variable(), extract_bernoulli_factor(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), value , 以及 variable.

被这些函数引用 extract_bernoulli_factor() , 以及 extract_bernoulli_monomial().

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

◆ extract_bernoulli_monomial()

bool LMCAS::extract_bernoulli_monomial ( const std::shared_ptr< const SymbolicNode > & term,
const std::string & y,
int & exponent,
std::shared_ptr< SymbolicExpr > & coefficient,
ComputationContext & context )
static

在文件 ode_classification.cpp 第 255 行定义.

260{
261 exponent = 0;
262 coefficient = SymbolicExpr::number(1);
263 std::vector<std::shared_ptr<const SymbolicNode>> factors;
264 if (auto product = std::dynamic_pointer_cast<const MultiplyNode>(term)) {
265 factors = product->operands();
266 } else {
267 factors.push_back(term);
268 }
269
270 for (const auto& factor : factors) {
271 if (!extract_bernoulli_factor(factor, y, exponent, coefficient, context)) {
272 return false;
273 }
274 }
275 return true;
276}
static bool extract_bernoulli_factor(const std::shared_ptr< const SymbolicNode > &factor, const std::string &y, int &exponent, std::shared_ptr< SymbolicExpr > &coefficient, ComputationContext &context)

引用了 context, exponent, extract_bernoulli_factor() , 以及 extract_bernoulli_monomial().

被这些函数引用 collect_bernoulli_coefficients() , 以及 extract_bernoulli_monomial().

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

◆ extract_coeff_value()

template<typename T>
Result< T > LMCAS::extract_coeff_value ( const std::shared_ptr< SymbolicExpr > & coefficient)

精确提取系数;不支持的值返回错误,保持数值完整。

引用了 extract_coeff_value() , 以及 LMCAS_API.

被这些函数引用 LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_power(), LMCAS::anonymous_namespace{poly_utils.cpp}::constant_to_poly(), extract_coeff_value(), LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::rewrite_square_absolute(), tf_build_polynomial_impl() , 以及 LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visit().

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

◆ extract_coeff_value< BigInt >()

template<>
Result< BigInt > LMCAS::extract_coeff_value< BigInt > ( const std::shared_ptr< SymbolicExpr > & coefficient)

在文件 poly_utils.cpp 第 20 行定义.

44 {
46 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
47 (context).limits().max_ast_nodes, "transform");
48 if (!coefficient || !detail::node(coefficient)) {
50 "Coefficient must have an expression", "polynomial.coefficient");
51 }
52 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(coefficient), transform_budget));
53 if (auto number = std::dynamic_pointer_cast<const NumberNode>(
54 LMCAS::detail::node(simplified))) {
55 if (std::holds_alternative<BigInt>(number->value())) {
56 return std::get<BigInt>(number->value());
57 }
58 if (std::holds_alternative<Rational>(number->value())) {
59 const Rational& value = std::get<Rational>(number->value());
60 if (value.is_integer()) return value.to_bigint();
61 }
62 }
64 "Coefficient is not an integer", "polynomial.coefficient");
65}
66catch (const CasError& error) {
67 return Result<BigInt>::failure(error);
68} catch (const std::bad_alloc&) {
69 return Result<BigInt>::failure(CasErrc::ResourceLimit, "allocation failed", "extract_coeff_value");
70} catch (const std::length_error& error) {
71 return Result<BigInt>::failure(CasErrc::ResourceLimit, error.what(), "extract_coeff_value");
72} catch (const std::exception& error) {
73 return Result<BigInt>::failure(CasErrc::InternalInvariant, error.what(), "extract_coeff_value");
74}

引用了 context, LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::SymbolicPolyCoeff::val.

函数调用图:

◆ extract_coeff_value< Rational >()

template<>
Result< Rational > LMCAS::extract_coeff_value< Rational > ( const std::shared_ptr< SymbolicExpr > & coefficient)

在文件 poly_utils.cpp 第 66 行定义.

78 {
80 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
81 (context).limits().max_ast_nodes, "transform");
82 if (!coefficient || !detail::node(coefficient)) {
84 "Coefficient must have an expression", "polynomial.coefficient");
85 }
86 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(coefficient), transform_budget));
87 if (auto number = std::dynamic_pointer_cast<const NumberNode>(
88 LMCAS::detail::node(simplified))) {
89 if (std::holds_alternative<Rational>(number->value())) {
90 return std::get<Rational>(number->value());
91 }
92 if (std::holds_alternative<BigInt>(number->value())) {
93 return Rational(std::get<BigInt>(number->value()));
94 }
95 }
96 if (simplified->is_one()) return Rational(1);
98 "Coefficient is not representable as a rational", "polynomial.coefficient");
99}
100catch (const CasError& error) {
101 return Result<Rational>::failure(error);
102} catch (const std::bad_alloc&) {
103 return Result<Rational>::failure(CasErrc::ResourceLimit, "allocation failed", "extract_coeff_value");
104} catch (const std::length_error& error) {
105 return Result<Rational>::failure(CasErrc::ResourceLimit, error.what(), "extract_coeff_value");
106} catch (const std::exception& error) {
107 return Result<Rational>::failure(CasErrc::InternalInvariant, error.what(), "extract_coeff_value");
108}

引用了 LMCAS::Result< T >::failure().

函数调用图:

◆ extract_coeff_value< SymbolicPolyCoeff >()

template<>
Result< SymbolicPolyCoeff > LMCAS::extract_coeff_value< SymbolicPolyCoeff > ( const std::shared_ptr< SymbolicExpr > & coefficient)

在文件 poly_utils.cpp 第 20 行定义.

34 {
35 if (!coefficient || !detail::node(coefficient)) {
37 "Coefficient must have an expression", "polynomial.coefficient");
38 }
39 return SymbolicPolyCoeff(coefficient);
40}

◆ extract_coefficient()

std::shared_ptr< SymbolicExpr > LMCAS::extract_coefficient ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
ComputationContext & context )
static

在文件 parametric_solver.cpp 第 12 行定义.

15{
16
17 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
18 (context).limits().max_ast_nodes, "transform");
19
20 return detail::make_expression_ptr(detail::differentiate_node(detail::node(expr), var, transform_budget));
21}

引用了 context, LMCAS::detail::differentiate_node(), extract_coefficient(), LMCAS::detail::make_expression_ptr() , 以及 LMCAS::detail::node().

被这些函数引用 extract_coefficient().

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

◆ extract_coefficients()

std::map< int, MultiPoly > LMCAS::extract_coefficients ( const MultiPoly & poly,
const std::string & main_var )
static

在文件 multivariate_factor.cpp 第 20 行定义.

21{
22 const auto& vars = poly.variables();
23 int var_idx = -1;
24 for (size_t i = 0; i < vars.size(); ++i) {
25 if (vars[i] == main_var) { var_idx = static_cast<int>(i); break; }
26 }
27 std::vector<std::string> remaining_vars;
28 for (size_t i = 0; i < vars.size(); ++i) {
29 if (static_cast<int>(i) != var_idx) { remaining_vars.push_back(vars[i]); }
30 }
31 std::map<int, MultiPoly> coeffs;
32 if (var_idx < 0) { coeffs[0] = poly; return coeffs; }
33 for (const auto& term : poly.terms()) {
34 const Monomial& mono = term.first;
35 int exp = (static_cast<size_t>(var_idx) < mono.size()) ? mono[var_idx] : 0;
36 Monomial reduced_mono;
37 reduced_mono.reserve(vars.size() - 1);
38 for (size_t i = 0; i < mono.size(); ++i) {
39 if (static_cast<int>(i) != var_idx) { reduced_mono.push_back(mono[i]); }
40 }
41 std::vector<MultiPoly::Term> t_vec = {{reduced_mono, term.second}};
42 MultiPoly term_poly(std::move(t_vec), remaining_vars);
43 if (coeffs.find(exp) == coeffs.end()) {
44 coeffs[exp] = term_poly;
45 } else {
46 coeffs[exp] = coeffs[exp] + term_poly;
47 }
48 }
49 return coeffs;
50}

引用了 exp(), extract_coefficients(), main_var , 以及 vars.

被这些函数引用 extract_coefficients() , 以及 multivariate_content().

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

◆ extract_constant_term()

std::shared_ptr< SymbolicExpr > LMCAS::extract_constant_term ( const std::shared_ptr< SymbolicExpr > & expr,
const std::vector< std::string > & unknowns,
ComputationContext & context )
static

在文件 parametric_solver.cpp 第 23 行定义.

26{
27
28 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
29 (context).limits().max_ast_nodes, "transform");
30
31
32 auto constant = expr;
33 for (const auto& var : unknowns) {
34 constant = detail::make_expression_ptr(detail::substitute_node(detail::node(constant), var, detail::node(SymbolicExpr::number(0)), transform_budget));
35 }
36 return detail::make_expression_ptr(detail::normalize_node(detail::node(constant), transform_budget));
37}

引用了 context, extract_constant_term(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::detail::substitute_node().

被这些函数引用 extract_constant_term().

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

◆ extract_laurent_regular_part()

Result< int > LMCAS::extract_laurent_regular_part ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & center,
const std::shared_ptr< SymbolicExpr > & shift,
std::shared_ptr< SymbolicExpr > & regular,
ComputationContext & context )
static

在文件 series_expansions.cpp 第 513 行定义.

517 {
518 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
519 (context).limits().max_ast_nodes, "transform");
520 constexpr const char* operation = "laurent_series_full";
521 auto center_number = std::dynamic_pointer_cast<const NumberNode>(detail::node(center));
522 if (!center_number) {
524 "Laurent center must be an exact number", operation);
525 }
526 Rational point = std::holds_alternative<BigInt>(center_number->value())
527 ? Rational(std::get<BigInt>(center_number->value()))
528 : std::get<Rational>(center_number->value());
529 Polynomial<Rational> numerator(var), denominator(var);
530 auto recognized = detail::extract_rational(*f, var, numerator, denominator);
531 if (!recognized) {
532 return Result<int>::failure(recognized.error());
533 }
534 if (!recognized.value()) {
535 return recognize_regular_laurent(f, var, context);
536 }
537 if (numerator.is_zero()) {
538 return 0;
539 }
540 const Polynomial<Rational> factor({Rational(0) - point, Rational(1)}, var);
541 int pole_order = 0;
542 while (denominator.eval(point) == Rational(0)) {
543 auto step = context.consume_steps(1, operation);
544 if (!step) {
545 return Result<int>::failure(step.error());
546 }
547 if (pole_order >= 64) {
549 "Laurent pole order exceeds supported range", operation);
550 }
551 denominator = denominator.div_mod(factor).first;
552 ++pole_order;
553 }
554 if (pole_order > 0) {
555 regular = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(
556 SymbolicExpr::power(shift, SymbolicExpr::number(pole_order)), f)->cancel()), transform_budget));
557 }
558 return pole_order;
559} catch (const CasError& error) {
560 return Result<int>::failure(error);
561} catch (const std::bad_alloc&) {
562 return Result<int>::failure(CasErrc::ResourceLimit, "allocation failed", "laurent_series_full");
563} catch (const std::length_error& error) {
564 return Result<int>::failure(CasErrc::ResourceLimit, error.what(), "laurent_series_full");
565} catch (const std::exception& error) {
566 return Result<int>::failure(CasErrc::InternalInvariant, error.what(), "laurent_series_full");
567}
Result< bool > extract_rational(const SymbolicExpr &expr, const std::string &var, Polynomial< Rational > &numerator, Polynomial< Rational > &denominator)
static Result< int > recognize_regular_laurent(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, ComputationContext &context)

引用了 context, denominator, extract_laurent_regular_part(), LMCAS::detail::extract_rational(), LMCAS::Result< T >::failure(), Inconclusive, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), point , 以及 recognize_regular_laurent().

被这些函数引用 extract_laurent_regular_part() , 以及 laurent_series_full_impl().

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

◆ factor_common_polynomial()

std::optional< ExpressionResult > LMCAS::factor_common_polynomial ( const std::shared_ptr< const AddNode > & add_node,
ComputationContext & context )
static

在文件 symbolic_factor.cpp 第 194 行定义.

195 {
196 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
197 (context).limits().max_ast_nodes, "transform");
198 std::shared_ptr<SymbolicExpr> common = nullptr;
199 for (const auto& op : add_node->operands()) {
201 if (!common) {
202 common = expr_op;
203 } else {
204 auto gcd = LMCAS::symbolic_polynomial_gcd(*common, *expr_op, context);
205 if (!gcd) {
206 if (gcd.error().code == CasErrc::UnsupportedExpression) {
207 return std::nullopt;
208 }
209 return gcd;
210 }
211 common = std::move(gcd.value());
212 }
213 }
214
215 if (common && !common->is_one() && !common->is_zero()) {
216 std::vector<std::shared_ptr<const SymbolicNode>> new_ops;
217 for (const auto& op : add_node->operands()) {
219
220 auto inv_common = SymbolicExpr::power(common, SymbolicExpr::number(-1));
221 auto quot = SymbolicExpr::multiply(term, inv_common);
222 quot = detail::make_expression_ptr(detail::normalize_node(detail::node(quot), transform_budget));
223 new_ops.push_back(LMCAS::detail::node(quot));
224 }
226
227 auto factored_sum = new_sum->factor_checked(context);
228 if (!factored_sum) { return factored_sum; }
229
230 std::vector<std::shared_ptr<const SymbolicNode>> final_ops = {
231 LMCAS::detail::node(common),
232 LMCAS::detail::node(factored_sum.value())};
234 }
235 return std::nullopt;
236}
SymbolicGcdResult symbolic_polynomial_gcd(const SymbolicExpr &lhs, const SymbolicExpr &rhs, ComputationContext &context)

引用了 context, factor_common_polynomial(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), op, symbolic_polynomial_gcd() , 以及 UnsupportedExpression.

被这些函数引用 factor_common_polynomial().

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

◆ factor_integer_polynomial()

Polynomial< BigInt > LMCAS::factor_integer_polynomial ( const Polynomial< Rational > & polynomial)

在文件 univariate_factor_bridge.cpp 第 9 行定义.

9 {
10 BigInt denominator_lcm(1);
11 for (const auto& coefficient : poly.coeffs) {
12 denominator_lcm = BigInt::lcm(
13 denominator_lcm, coefficient.get_denominator());
14 }
15 std::vector<BigInt> coefficients;
16 coefficients.reserve(poly.coeffs.size());
17 for (const auto& coefficient : poly.coeffs) {
18 coefficients.push_back(coefficient.get_numerator() *
19 (denominator_lcm / coefficient.get_denominator()));
20 }
21 return Polynomial<BigInt>(coefficients, poly.variable_name);
22}

引用了 LMCAS::Polynomial< CoeffType >::coeffs, factor_integer_polynomial() , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 LMCAS::anonymous_namespace{univariate_factor_bridge.cpp}::bridge_lift_and_combine() , 以及 factor_integer_polynomial().

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

◆ factor_multivariate_checked() [1/2]

MultiFactorCheckedResult LMCAS::factor_multivariate_checked ( const MultiPoly & poly)

在文件 multivariate_factor_checked.cpp 第 332 行定义.

333{
336}
MultiFactorCheckedResult factor_multivariate_checked(const MultiPoly &poly, ComputationContext &context)

引用了 context , 以及 factor_multivariate_checked().

函数调用图:

◆ factor_multivariate_checked() [2/2]

MultiFactorCheckedResult LMCAS::factor_multivariate_checked ( const MultiPoly & poly,
ComputationContext & context )

在文件 multivariate_factor_checked.cpp 第 309 行定义.

312{
313 try {
314 auto factored = factor_multivariate_impl(poly, context);
315 if (factored && factored.value().completeness == Completeness::Inconclusive) {
317 poly, {poly}, {1}, Completeness::Inconclusive,
318 std::move(factored.value().reason));
319 }
320 return factored;
321 } catch (const std::bad_alloc&) {
323 CasErrc::ResourceLimit, "多元分解分配失败",
324 "factor_multivariate");
325 } catch (const std::exception& error) {
327 CasErrc::InternalInvariant, error.what(),
328 "factor_multivariate");
329 }
330}
MultiFactorCheckedResult assemble_checked_factorization(const MultiPoly &original, const std::vector< MultiPoly > &factors, const std::vector< int > &multiplicities, Completeness completeness, std::string reason)

引用了 LMCAS::multivariate_checked_detail::assemble_checked_factorization(), context, factor_multivariate_checked(), LMCAS::Result< MathResult< MultiFactorResult > >::failure(), Inconclusive, InternalInvariant , 以及 ResourceLimit.

被这些函数引用 factor_multivariate_checked(), factor_multivariate_checked() , 以及 factor_multivariate_expression().

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

◆ factor_multivariate_expression()

std::optional< ExpressionResult > LMCAS::factor_multivariate_expression ( const std::shared_ptr< SymbolicExpr > & simp,
const std::set< std::string > & factor_variables,
ComputationContext & context )
static

在文件 symbolic_factor.cpp 第 415 行定义.

417 {
418 if (!is_poly_expr_node(detail::node(simp))) { return std::nullopt; }
419 try {
420 std::vector<std::string> var_list(
421 factor_variables.begin(), factor_variables.end());
422 auto mpoly = symbolic_node_to_multipoly(LMCAS::detail::node(simp), var_list);
423
424 if (!mpoly.is_zero() && !mpoly.is_constant()) {
425 auto factorization =
427 mpoly, context);
428 if (!factorization) {
430 factorization.error());
431 }
432 const auto& checked = factorization.value();
433 if (checked.completeness !=
435 return simp;
436 }
437 const auto& result = checked.value;
438
439 if (!result.factors.empty()) {
440 auto expression = multivariate_factor_expression(result, context);
441 if (expression) { return expression; }
442 }
443 }
444 } catch (const std::invalid_argument&) {
445 return std::nullopt;
446 } catch (const std::out_of_range&) {
447 return std::nullopt;
448 }
449 return std::nullopt;
450}
static LMCAS::MultiPoly symbolic_node_to_multipoly(const std::shared_ptr< const SymbolicNode > &node, const std::vector< std::string > &vars)
static std::shared_ptr< SymbolicExpr > multivariate_factor_expression(const MultiFactorResult &result, ComputationContext &context)

引用了 Complete, context, factor_multivariate_checked(), factor_multivariate_expression(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), multivariate_factor_expression(), LMCAS::detail::node() , 以及 symbolic_node_to_multipoly().

被这些函数引用 factor_multivariate_expression().

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

◆ factor_numeric_content()

std::optional< ExpressionResult > LMCAS::factor_numeric_content ( const std::shared_ptr< SymbolicExpr > & simp,
const std::shared_ptr< const AddNode > & add_node,
ComputationContext & context )
static

在文件 symbolic_factor.cpp 第 153 行定义.

155 {
156 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
157 (context).limits().max_ast_nodes, "transform");
158 auto content_result =
160 if (!content_result) {
161 if (content_result.error().code == CasErrc::UnsupportedExpression) {
162 return std::nullopt;
163 }
165 content_result.error());
166 }
167 const Rational content_value = content_result.value();
168 if (content_value != Rational(0) && content_value != Rational(1)) {
169 auto content = content_value.is_integer()
170 ? SymbolicExpr::number(content_value.to_bigint())
171 : SymbolicExpr::number(content_value);
172 const Rational inverse_value = Rational(1) / content_value;
173 auto inverse_content = inverse_value.is_integer()
174 ? SymbolicExpr::number(inverse_value.to_bigint())
175 : SymbolicExpr::number(inverse_value);
176 std::vector<std::shared_ptr<const SymbolicNode>> primitive_terms;
177 primitive_terms.reserve(add_node->operands().size());
178 for (const auto& operand : add_node->operands()) {
179 auto term = LMCAS::detail::make_expression_ptr(operand);
180 auto primitive_term = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(term, inverse_content)), transform_budget));
181 primitive_terms.push_back(LMCAS::detail::node(primitive_term));
182 }
183 auto primitive_sum = LMCAS::detail::make_expression_ptr(
184 LMCAS::detail::make_node<AddNode>(primitive_terms));
185 auto factored_primitive =
186 primitive_sum->factor_checked(context);
187 if (!factored_primitive) { return factored_primitive; }
189 content, factored_primitive.value())), transform_budget));
190 }
191 return std::nullopt;
192}
Result< Rational > symbolic_polynomial_content(const SymbolicExpr &expression, ComputationContext &context)

引用了 context, factor_numeric_content(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), symbolic_polynomial_content() , 以及 UnsupportedExpression.

被这些函数引用 factor_numeric_content().

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

◆ factor_rational_univariate()

std::optional< ExpressionResult > LMCAS::factor_rational_univariate ( const std::shared_ptr< SymbolicExpr > & simp,
const std::string & var,
ComputationContext & context )
static

在文件 symbolic_factor.cpp 第 293 行定义.

295 {
296 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
297 (context).limits().max_ast_nodes, "transform");
298 try {
299 auto converted = symbolic_to_poly<Rational>(simp, var);
300 if (!converted) {
301 if (converted.error().code == CasErrc::UnsupportedExpression) return std::nullopt;
302 return ExpressionResult::failure(converted.error());
303 }
304 const auto& poly = converted.value();
305 if (poly.degree() < 2) { return std::nullopt; }
306 auto roots = find_rational_roots(poly);
307 if (roots.empty()) { return std::nullopt; }
308 auto reconstruction =
310 if (!reconstruction.remainder.is_zero()) return std::nullopt;
311 auto& factors = reconstruction.factors;
312 auto& quotient = reconstruction.quotient;
313 if (quotient.degree() >= 1) {
314 auto q_expr = detail::make_expression_ptr(detail::normalize_node(detail::node(poly_to_symbolic(quotient)), transform_budget));
315 if (quotient.degree() >= 2) {
316 auto q_factored = q_expr->factor_checked(context);
317 if (!q_factored) { return q_factored; }
318 factors.push_back(detail::node(q_factored.value()));
319 } else {
320 factors.push_back(detail::node(q_expr));
321 }
322 }
323 if (factors.size() > 1) {
325 }
326 if (factors.size() == 1) { return detail::make_expression_ptr(factors[0]); }
327 } catch (const std::invalid_argument&) {
328 return std::nullopt;
329 } catch (const std::out_of_range&) {
330 return std::nullopt;
331 }
332 return std::nullopt;
333}
static RationalRootReconstruction reconstruct_rational_roots(const Polynomial< Rational > &polynomial, const std::vector< Rational > &roots, const std::string &variable, ComputationContext &context)

引用了 context, factor_rational_univariate(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), find_rational_roots(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), reconstruct_rational_roots(), roots() , 以及 UnsupportedExpression.

被这些函数引用 factor_rational_univariate().

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

◆ factor_symbolic_quadratic()

std::optional< ExpressionResult > LMCAS::factor_symbolic_quadratic ( const std::shared_ptr< SymbolicExpr > & simp,
const std::string & var,
ComputationContext & context )
static

在文件 symbolic_factor.cpp 第 335 行定义.

337 {
338 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
339 (context).limits().max_ast_nodes, "transform");
340 try {
341 auto converted = LMCAS::symbolic_to_poly<LMCAS::SymbolicPolyCoeff>(simp, var);
342 if (!converted) {
343 if (converted.error().code == CasErrc::UnsupportedExpression) return std::nullopt;
344 return ExpressionResult::failure(converted.error());
345 }
346 const auto& poly = converted.value();
347 if (poly.degree() == 2) {
348 auto solved =
350 if (!solved) {
352 solved.error());
353 }
354 auto solutions = std::move(solved.value());
355 if (solutions.size() == 2) {
356 auto leading = poly.coeffs[2].val;
357 if (!leading) { leading = SymbolicExpr::number(1); }
358 leading = detail::make_expression_ptr(detail::normalize_node(detail::node(leading), transform_budget));
359
361
362 auto t1 = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(x_node, SymbolicExpr::multiply(solutions[0], SymbolicExpr::number(-1)))), transform_budget));
363 auto t2 = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(x_node, SymbolicExpr::multiply(solutions[1], SymbolicExpr::number(-1)))), transform_budget));
364
365 std::vector<std::shared_ptr<const SymbolicNode>> factors;
366 if (!leading->is_one()) { factors.push_back(LMCAS::detail::node(leading)); }
367 factors.push_back(LMCAS::detail::node(t1));
368 factors.push_back(LMCAS::detail::node(t2));
369
371 }
372 }
373 } catch (const std::invalid_argument&) {
374 return std::nullopt;
375 } catch (const std::out_of_range&) {
376 return std::nullopt;
377 }
378 return std::nullopt;
379}
LMCAS::FiniteSolveResult solve_finite_checked(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)

引用了 context, factor_symbolic_quadratic(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), solve_finite_checked() , 以及 UnsupportedExpression.

被这些函数引用 factor_symbolic_quadratic().

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

◆ factor_transcendental() [1/2]

Result< std::vector< std::shared_ptr< SymbolicExpr > > > LMCAS::factor_transcendental ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var )

在文件 transcendental_factor.cpp 第 136 行定义.

138 {
140 return factor_transcendental(expr, var, context);
141}
Result< std::vector< std::shared_ptr< SymbolicExpr > > > factor_transcendental(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context)

引用了 context , 以及 factor_transcendental().

函数调用图:

◆ factor_transcendental() [2/2]

Result< std::vector< std::shared_ptr< SymbolicExpr > > > LMCAS::factor_transcendental ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
ComputationContext & context )

在文件 transcendental_factor.cpp 第 88 行定义.

91 {
92
94 if (!expr || !LMCAS::detail::node(expr) || var.empty()) {
95 return FactorsResult::failure(CasErrc::InvalidArgument,
96 "expression and variable must be nonempty", "factor_transcendental");
97 }
98 auto step = context.consume_steps(1, "factor_transcendental");
99 if (!step) {
100 return FactorsResult::failure(step.error());
101 }
102 auto pyth_simplified = tf_simplify_pythagorean(expr, var);
103 auto mult_factors = tf_detect_multiplicative_structure(pyth_simplified);
104 if (!mult_factors.empty()) {
105 return mult_factors;
106 }
107 auto exp_factors = tf_detect_exponential_separation(pyth_simplified, var, context);
108 if (!exp_factors.empty()) {
109 return exp_factors;
110 }
111
112 if (!tf_contains_transcendental(LMCAS::detail::node(pyth_simplified), var)) {
113 return FactorsResult::success({pyth_simplified});
114 }
115
116 TransSubstitutionResult sub_result = detect_trans_substitutions(pyth_simplified, var);
117 if (sub_result.mappings.empty()) {
118 return FactorsResult::success({pyth_simplified});
119 }
120 if (tf_is_linear_irreducible(sub_result, var)) {
121 return FactorsResult::success({pyth_simplified});
122 }
123
125 sub_result, var, pyth_simplified, context);
126}
127catch (const std::bad_alloc&) {
129 CasErrc::ResourceLimit, "allocation failed while factoring expression",
130 "factor_transcendental");
131} catch (const std::exception& ex) {
133 CasErrc::InternalInvariant, ex.what(), "factor_transcendental");
134}
std::shared_ptr< SymbolicExpr > tf_simplify_pythagorean(const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable)
在因式分解前用 sin^2(f) + cos^2(f) = 1 化简表达式。
bool tf_is_linear_irreducible(const TransSubstitutionResult &substitution, const std::string &variable)
判断换元后的表达式是否对所有不定元和原始变量均为线性.
std::vector< std::shared_ptr< SymbolicExpr > > tf_detect_multiplicative_structure(const std::shared_ptr< SymbolicExpr > &expression)
检测表达式是否已为独立子表达式的乘积形式.
TransSubstitutionResult detect_trans_substitutions(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var)
为依赖 var 的 Sin、Cos、Exp、Ln、Tan 子表达式构造换元结果。
std::vector< std::shared_ptr< SymbolicExpr > > tf_detect_exponential_separation(const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable, ComputationContext &context)
检测加法表达式中的公共指数因子并执行分离.
static Result< std::vector< std::shared_ptr< SymbolicExpr > > > tf_factor_substitution(const TransSubstitutionResult &sub_result, const std::string &var, const std::shared_ptr< SymbolicExpr > &pyth_simplified, ComputationContext &context)

引用了 context, detect_trans_substitutions(), factor_transcendental(), InvalidArgument, LMCAS::TransSubstitutionResult::mappings, LMCAS::detail::node(), tf_contains_transcendental(), tf_detect_exponential_separation(), tf_detect_multiplicative_structure(), tf_factor_substitution(), tf_is_linear_irreducible() , 以及 tf_simplify_pythagorean().

被这些函数引用 factor_transcendental(), factor_transcendental(), factor_transcendental_expression() , 以及 LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::solve().

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

◆ factor_transcendental_expression()

ExpressionResult LMCAS::factor_transcendental_expression ( const std::shared_ptr< SymbolicExpr > & simp,
ComputationContext & context )
static

在文件 symbolic_factor.cpp 第 507 行定义.

509 {
510 const auto transform_variables = LMCAS::free_variables(LMCAS::detail::node(simp));
511 if (transform_variables.empty()) { return simp; }
512
513 auto converted = LMCAS::factor_transcendental(
514 simp, *transform_variables.begin(), context);
515 if (!converted) { return ExpressionResult::failure(converted.error()); }
516 const auto& trans_factors = converted.value();
517 if (trans_factors.size() > 1) {
518 std::vector<std::shared_ptr<const SymbolicNode>> factor_nodes;
519 factor_nodes.reserve(trans_factors.size());
520 for (const auto& factor : trans_factors) {
521 if (factor && LMCAS::detail::node(factor)) {
522 factor_nodes.push_back(LMCAS::detail::node(factor));
523 }
524 }
525 if (factor_nodes.size() > 1) {
527 LMCAS::detail::make_node<MultiplyNode>(std::move(factor_nodes)));
528 }
529 }
530 return simp;
531}

引用了 context, factor_transcendental(), factor_transcendental_expression(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), free_variables(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node() , 以及 LMCAS::detail::node().

被这些函数引用 factor_transcendental_expression().

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

◆ factor_univariate_bridge_checked()

UnivariateFactorResult LMCAS::factor_univariate_bridge_checked ( const Polynomial< Rational > & polynomial,
ComputationContext & context )

在文件 univariate_factor_bridge.cpp 第 166 行定义.

167 {
168 auto step = context.consume_steps(1, bridge_operation);
169 if (!step) return UnivariateFactorResult::failure(step.error());
170 if (poly.is_zero() || poly.degree() <= 0) {
172 MathResult<std::vector<Polynomial<Rational>>>{
173 poly.is_zero() ? std::vector<Polynomial<Rational>>{}
174 : std::vector<Polynomial<Rational>>{poly},
176 }
177 if (poly.degree() == 1) {
179 MathResult<std::vector<Polynomial<Rational>>>{
180 {poly.make_monic()}, Completeness::Complete, {}});
181 }
182 try {
183 return bridge_factor(poly, context);
184 } catch (const std::bad_alloc&) {
186 CasErrc::ResourceLimit, "一元分解分配失败", bridge_operation);
187 } catch (const std::exception& error) {
189 CasErrc::InternalInvariant, error.what(), bridge_operation);
190 }
191}
UnivariateFactorResult bridge_factor(const Polynomial< Rational > &poly, ComputationContext &context)

引用了 Complete, context, LMCAS::Polynomial< CoeffType >::degree(), factor_univariate_bridge_checked(), LMCAS::Result< MathResult< std::vector< Polynomial< Rational > > > >::failure(), InternalInvariant, LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::Polynomial< CoeffType >::make_monic(), ResourceLimit , 以及 LMCAS::Result< MathResult< std::vector< Polynomial< Rational > > > >::success().

被这些函数引用 LMCAS::anonymous_namespace{univariate_factor_bridge.cpp}::bridge_append_repeated(), LMCAS::multivariate_checked_detail::collect_linear_samples(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_embedded_univariate(), LMCAS::multivariate_checked_detail::factor_evaluated_linear(), LMCAS::detail::factor_homogeneous_bivariate(), factor_univariate_bridge_checked(), LMCAS::detail::anonymous_namespace{complex_root_isolation.cpp}::strict_factors() , 以及 tf_factor_substitution().

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

◆ factor_variable_rational_roots()

std::optional< ExpressionResult > LMCAS::factor_variable_rational_roots ( const std::shared_ptr< SymbolicExpr > & simp,
const std::string & var,
ComputationContext & context )
static

在文件 symbolic_factor.cpp 第 479 行定义.

480 {
481 try {
482 auto poly = LMCAS::symbolic_to_poly<LMCAS::SymbolicPolyCoeff>(simp, var);
483 if (!poly) {
484 if (poly.error().code == CasErrc::UnsupportedExpression) { return std::nullopt; }
485 return ExpressionResult::failure(poly.error());
486 }
487 if (poly.value().degree() >= 2) {
488 auto converted = LMCAS::symbolic_to_poly<Rational>(simp, var);
489 if (!converted) {
490 if (converted.error().code == CasErrc::UnsupportedExpression) { return std::nullopt; }
491 return ExpressionResult::failure(converted.error());
492 }
493 const auto& poly_r = converted.value();
494 auto roots = LMCAS::find_rational_roots(poly_r);
495 if (!roots.empty()) {
496 return reconstruct_rational_root_factors(poly_r, roots, var, context);
497 }
498 }
499 } catch (const std::invalid_argument&) {
500 return std::nullopt;
501 } catch (const std::out_of_range&) {
502 return std::nullopt;
503 }
504 return std::nullopt;
505}
static std::optional< ExpressionResult > reconstruct_rational_root_factors(const Polynomial< Rational > &polynomial, const std::vector< Rational > &roots, const std::string &var, ComputationContext &context)

引用了 context, factor_variable_rational_roots(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), find_rational_roots(), reconstruct_rational_root_factors(), roots() , 以及 UnsupportedExpression.

被这些函数引用 factor_variable_rational_roots().

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

◆ fglm_convert()

std::vector< FGLMPoly > LMCAS::fglm_convert ( const std::vector< FGLMPoly > & source_basis,
const MonomialOrder & source_order,
const MonomialOrder & target_order,
size_t num_vars )

在文件 fglm.cpp 第 88 行定义.

91 {
92 int dimension = checked_dimension(source_basis, num_vars);
93 std::vector<FGLMPoly> target_basis;
94 std::vector<Monomial> basis_monomials;
95 auto standard = standard_basis(source_basis, num_vars, dimension);
96 std::map<Monomial, size_t> monomial_index;
97 for (size_t index = 0; index < standard.size(); ++index) {
98 monomial_index[standard[index]] = index;
99 }
100 fglm_detail::GaussianEliminator gauss;
101 fglm_detail::MonomialEnumerator enumerator(num_vars, target_order, dimension + 5);
102 std::vector<Monomial> target_leading;
103 const int max_iterations = dimension * 10 + 50;
104 int iterations = 0;
105 Monomial monomial;
106 while (iterations < max_iterations && enumerator.next(monomial)) {
107 ++iterations;
108 if (!fglm_detail::is_standard(monomial, target_leading)) continue;
109 auto polynomial = FGLMPoly::from_monomial(monomial, num_vars);
110 auto normal = normal_form(polynomial, source_basis, source_order);
111 auto vector = coordinates(normal, monomial_index);
112 std::vector<Rational> combination;
113 if (gauss.add_vector(vector, combination)) {
114 basis_monomials.push_back(monomial);
115 } else {
116 auto dependent = dependent_polynomial(monomial, combination,
117 basis_monomials, target_order,
118 num_vars);
119 if (!dependent.is_zero()) {
120 target_leading.push_back(dependent.lead_monomial());
121 target_basis.push_back(std::move(dependent));
122 }
123 }
124 if (static_cast<int>(basis_monomials.size()) == dimension &&
125 fglm_detail::has_pure_generators(target_leading, num_vars)) {
126 return target_basis;
127 }
128 }
129 throw std::runtime_error(
130 "FGLM: enumeration ended before the target basis was complete");
131}
FGLMPoly dependent_polynomial(const Monomial &monomial, const std::vector< Rational > &combination, const std::vector< Monomial > &basis, const MonomialOrder &order, size_t num_vars)
bool is_standard(const Monomial &monomial, const std::vector< Monomial > &leading)
bool has_pure_generators(const std::vector< Monomial > &leading, size_t num_vars)
FGLMPoly normal_form(const FGLMPoly &f, const std::vector< FGLMPoly > &basis, const MonomialOrder &order)

引用了 LMCAS::fglm_detail::GaussianEliminator::add_vector(), fglm_convert(), LMCAS::fglm_detail::has_pure_generators(), LMCAS::fglm_detail::is_standard(), LMCAS::fglm_detail::MonomialEnumerator::next() , 以及 normal_form().

被这些函数引用 fglm_convert() , 以及 grevlex_to_lex().

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

◆ find_complementary_square()

std::size_t LMCAS::find_complementary_square ( const std::vector< std::shared_ptr< const SymbolicNode > > & operands,
const std::vector< bool > & consumed,
std::size_t start,
const TrigSquare & square )
static

在文件 transcendental_pythagorean.cpp 第 130 行定义.

132 {
133 for (std::size_t i = start; i < operands.size(); ++i) {
134 if (!consumed[i] && complementary_square(operands[i], square)) {
135 return i;
136 }
137 }
138 return operands.size();
139}
static bool complementary_square(const std::shared_ptr< const SymbolicNode > &node, const TrigSquare &square)

引用了 complementary_square() , 以及 find_complementary_square().

被这些函数引用 find_complementary_square() , 以及 simplify_pythagorean_sum().

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

◆ find_extrema()

std::vector< CriticalPoint > LMCAS::find_extrema ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars )

在文件 vector_calculus_extrema.cpp 第 373 行定义.

374 {
376 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
377 context.limits().max_ast_nodes, "find_extrema");
378 return find_extrema_impl(f, vars, context, transform_budget);
379}
static std::vector< CriticalPoint > find_extrema_impl(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context, detail::RewriteBudget &transform_budget)

引用了 context, find_extrema(), find_extrema_impl() , 以及 vars.

被这些函数引用 find_extrema().

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

◆ find_extrema_checked() [1/2]

ExtremaResult LMCAS::find_extrema_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars )

在文件 vector_calculus_extrema.cpp 第 274 行定义.

277{
280}
ExtremaResult find_extrema_checked(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context)

引用了 context, find_extrema_checked() , 以及 vars.

函数调用图:

◆ find_extrema_checked() [2/2]

ExtremaResult LMCAS::find_extrema_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
ComputationContext & context )

在文件 vector_calculus_extrema.cpp 第 197 行定义.

201{
202 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
203 context.limits().max_ast_nodes, "find_extrema");
204 const std::string operation = "find_extrema";
205 auto valid = vector_calculus_validate_expr_vars(f, vars, context, operation);
206 if (!valid) {
207 return ExtremaResult::failure(valid.error());
208 }
209 auto distinct = vector_calculus_validate_distinct_vars(vars, vars.size(), context, operation);
210 if (!distinct) {
211 return ExtremaResult::failure(distinct.error());
212 }
213 auto step = context.consume_steps(vars.size() * vars.size() + vars.size() * 8 + 8,
214 operation);
215 if (!step) {
216 return ExtremaResult::failure(step.error());
217 }
218
219 try {
220 std::vector<std::shared_ptr<SymbolicExpr>> gradient;
221 gradient.reserve(vars.size());
222 for (const auto& var : vars) {
223 auto partial = vector_calculus_differentiate_strict(f, var, operation, transform_budget);
224 if (!partial) {
225 return ExtremaResult::failure(partial.error());
226 }
227 gradient.push_back(std::move(partial.value()));
228 }
229
230 auto extrema = find_extrema_impl(f, vars, context, transform_budget);
231 if (extrema.empty()) {
234 "extrema solver produced no verifiable critical points in the supported domain",
235 operation);
236 }
237
238 for (const auto& cp : extrema) {
239 if (!vector_calculus_point_has_vars(cp.point, vars)) {
242 "extrema candidate omits one or more variables",
243 operation);
244 }
245 for (const auto& partial : gradient) {
246 if (!vector_calculus_expr_zero_after_substitution(partial, cp.point, context, transform_budget)) {
249 "extrema candidate does not verify against the gradient",
250 operation);
251 }
252 }
253 if (cp.classification == CriticalPointClassification::Inconclusive) {
256 "extrema candidate has no verified classification",
257 operation);
258 }
259 }
260 return ExtremaResult::success(std::move(extrema));
261 } catch (const CasError& error) {
262 return ExtremaResult::failure(error);
263 } catch (const std::bad_alloc&) {
265 "extrema allocation failed",
266 operation);
267 } catch (const std::length_error& error) {
268 return ExtremaResult::failure(CasErrc::ResourceLimit, error.what(), operation);
269 } catch (const std::exception& e) {
270 return ExtremaResult::failure(CasErrc::InternalInvariant, e.what(), operation);
271 }
272}
bool vector_calculus_point_has_vars(const std::map< std::string, std::shared_ptr< SymbolicExpr > > &point, const std::vector< std::string > &vars)
VectorCalculusExprResult vector_calculus_differentiate_strict(const std::shared_ptr< SymbolicExpr > &expr, const std::string &variable, const std::string &operation, detail::RewriteBudget &transform_budget)
bool vector_calculus_expr_zero_after_substitution(const std::shared_ptr< SymbolicExpr > &expr, const std::map< std::string, std::shared_ptr< SymbolicExpr > > &point, ComputationContext &context, detail::RewriteBudget &transform_budget)
VectorField gradient(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars)

引用了 context, e(), LMCAS::Result< std::vector< CriticalPoint > >::failure(), find_extrema_checked(), find_extrema_impl(), gradient(), Inconclusive, InternalInvariant, ResourceLimit, LMCAS::Result< std::vector< CriticalPoint > >::success(), vars, LMCAS::vector_calculus_detail::vector_calculus_differentiate_strict(), LMCAS::vector_calculus_detail::vector_calculus_expr_zero_after_substitution(), LMCAS::vector_calculus_detail::vector_calculus_point_has_vars(), LMCAS::vector_calculus_detail::vector_calculus_validate_distinct_vars() , 以及 LMCAS::vector_calculus_detail::vector_calculus_validate_expr_vars().

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

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

◆ find_extrema_impl()

std::vector< CriticalPoint > LMCAS::find_extrema_impl ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
ComputationContext & context,
detail::RewriteBudget & transform_budget )
static

计算梯度 gradf

求解 gradf = 0 系统(使用多项式系统求解器)

如果多项式求解器失败,尝试线性求解器

计算海森矩阵

对每个临界点进行分类

在临界点处求值海森矩阵

在文件 vector_calculus_extrema.cpp 第 282 行定义.

286{
287 if (!f || vars.empty()) {
288 return {};
289 }
290
291 size_t n = vars.size();
292
293 /// 计算梯度 gradf
294 std::vector<std::shared_ptr<SymbolicExpr>> grad_eqs;
295 grad_eqs.reserve(n);
296 for (const auto& var : vars) {
297 auto partial = detail::make_expression_ptr(detail::differentiate_node(detail::node(f), var, transform_budget));
298 if (partial) {
299 partial = detail::make_expression_ptr(detail::normalize_node(detail::node(partial), transform_budget));
300 }
301 grad_eqs.push_back(partial);
302 }
303
304 /// 求解 gradf = 0 系统(使用多项式系统求解器)
305 std::vector<std::map<std::string, std::shared_ptr<SymbolicExpr>>> solutions;
306
307 std::vector<SymbolicExpr> poly_eqs;
308 poly_eqs.reserve(n);
309 for (const auto& eq : grad_eqs) {
310 if (eq) poly_eqs.push_back(*eq);
311 }
312 if (poly_eqs.size() == n) {
313 auto checked_solutions =
314 Solver::solve_polynomial_system_checked(poly_eqs, vars, context);
315 if (!checked_solutions &&
316 checked_solutions.error().code != CasErrc::Inconclusive &&
317 checked_solutions.error().code != CasErrc::UnsupportedExpression) {
318 throw checked_solutions.error();
319 }
320 const auto poly_solutions = checked_solutions
321 ? std::move(checked_solutions.value())
322 : std::vector<std::map<std::string, SymbolicExpr>>{};
323 for (const auto& sol : poly_solutions) {
324 std::map<std::string, std::shared_ptr<SymbolicExpr>> pt;
325 for (const auto& [name, val] : sol) {
327 }
328 solutions.push_back(pt);
329 }
330 }
331
332 /// 如果多项式求解器失败,尝试线性求解器
333 if (solutions.empty()) {
334 auto solved = solver_detail::solve_linear_system_impl(poly_eqs, vars, context);
335 if (!solved.empty()) {
336 std::map<std::string, std::shared_ptr<SymbolicExpr>> point;
337 for (auto& [variable, value] : solved) {
338 point.emplace(variable, detail::make_expression_ptr(std::move(value)));
339 }
340 solutions.push_back(std::move(point));
341 }
342 }
343
344 if (solutions.empty()) {
345 return {};
346 }
347
348 /// 计算海森矩阵
349 auto H = hessian_impl(f, vars, transform_budget);
350
351 /// 对每个临界点进行分类
352 std::vector<CriticalPoint> result;
353 result.reserve(solutions.size());
354
355 for (const auto& sol : solutions) {
356 CriticalPoint cp;
357 cp.point = sol;
358
359 /// 在临界点处求值海森矩阵
360 std::vector<double> numeric_H;
361 if (vector_calculus_evaluate_hessian_at_point(H, vars, sol, n, numeric_H, context, transform_budget)) {
362 cp.classification = vector_calculus_classify_critical_point(numeric_H, n, context, transform_budget);
363 } else {
364 cp.classification = CriticalPointClassification::Inconclusive;
365 }
366
367 result.push_back(std::move(cp));
368 }
369
370 return result;
371}
std::shared_ptr< SymbolicExpr > hessian_impl(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)
static CriticalPointClassification vector_calculus_classify_critical_point(const std::vector< double > &numeric_H, size_t n, ComputationContext &context, detail::RewriteBudget &transform_budget)
static bool vector_calculus_evaluate_hessian_at_point(const std::shared_ptr< SymbolicExpr > &H, const std::vector< std::string > &, const std::map< std::string, std::shared_ptr< SymbolicExpr > > &pt, size_t n, std::vector< double > &numeric_H, ComputationContext &context, detail::RewriteBudget &transform_budget)

引用了 LMCAS::CriticalPoint::classification, context, LMCAS::detail::differentiate_node(), eq(), find_extrema_impl(), LMCAS::vector_calculus_detail::hessian_impl(), Inconclusive, LMCAS::detail::make_expression_ptr(), name, LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::CriticalPoint::point, point, LMCAS::solver_detail::solve_linear_system_impl(), UnsupportedExpression, value, variable, vars, vector_calculus_classify_critical_point() , 以及 vector_calculus_evaluate_hessian_at_point().

被这些函数引用 find_extrema(), find_extrema_checked() , 以及 find_extrema_impl().

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

◆ find_integrating_factor()

std::shared_ptr< SymbolicExpr > LMCAS::find_integrating_factor ( const std::shared_ptr< SymbolicExpr > & M,
const std::shared_ptr< SymbolicExpr > & N,
const std::string & x,
const std::string & y )

在文件 ode_first_order.cpp 第 368 行定义.

372{
374 auto result = find_integrating_factor_impl(M, N, x, y, context);
375 if (!result) { throw result.error(); }
376 return std::move(result.value());
377}
static ExpressionResult find_integrating_factor_impl(const std::shared_ptr< SymbolicExpr > &M, const std::shared_ptr< SymbolicExpr > &N, const std::string &x, const std::string &y, ComputationContext &context)

引用了 context, find_integrating_factor() , 以及 find_integrating_factor_impl().

被这些函数引用 find_integrating_factor().

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

◆ find_integrating_factor_impl()

ExpressionResult LMCAS::find_integrating_factor_impl ( const std::shared_ptr< SymbolicExpr > & M,
const std::shared_ptr< SymbolicExpr > & N,
const std::string & x,
const std::string & y,
ComputationContext & context )
static

计算 partialM/partialy - partialN/partialx

已经恰当,积分因子为 1

尝试 mu = mu(x): (partialM/partialy - partialN/partialx) / N 仅依赖 x

尝试 mu = mu(y): (partialN/partialx - partialM/partialy) / M 仅依赖 y

在文件 ode_first_order.cpp 第 323 行定义.

327{
328 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
329 (context).limits().max_ast_nodes, "transform");
330 if (!M || !N) {
331 return std::shared_ptr<SymbolicExpr>{};
332 }
333
334 /// 计算 partialM/partialy - partialN/partialx
335 auto dM_dy = detail::make_expression_ptr(detail::differentiate_node(detail::node(M), y, transform_budget));
336 auto dN_dx = detail::make_expression_ptr(detail::differentiate_node(detail::node(N), x, transform_budget));
337
338 auto diff = SymbolicExpr::add(dM_dy,
339 SymbolicExpr::multiply(SymbolicExpr::number(-1), dN_dx));
340 diff = detail::make_expression_ptr(detail::normalize_node(detail::node(diff), transform_budget));
341
342 auto exact = check_zero_residual(diff, context);
343 if (!exact) { return ExpressionResult::failure(exact.error()); }
344 if (std::holds_alternative<ProvedZeroResidual>(exact.value())) {
345 /// 已经恰当,积分因子为 1
346 return SymbolicExpr::number(1);
347 }
348
349 Integrator integrator;
350 /// 尝试 mu = mu(x): (partialM/partialy - partialN/partialx) / N 仅依赖 x
351 if (N && !N->is_zero()) {
352 auto ratio_x = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(diff, N)), transform_budget));
353 auto factor = integrating_factor_from_ratio(ratio_x, x, y, integrator, context);
354 if (!factor || factor.value()) { return factor; }
355 }
356
357 /// 尝试 mu = mu(y): (partialN/partialx - partialM/partialy) / M 仅依赖 y
358 if (M && !M->is_zero()) {
359 auto neg_diff = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(SymbolicExpr::number(-1), diff)), transform_budget));
360 auto ratio_y = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(neg_diff, M)), transform_budget));
361 auto factor = integrating_factor_from_ratio(ratio_y, y, x, integrator, context);
362 if (!factor || factor.value()) { return factor; }
363 }
364
365 return std::shared_ptr<SymbolicExpr>{};
366}
static ExpressionResult integrating_factor_from_ratio(const std::shared_ptr< SymbolicExpr > &ratio, const std::string &variable, const std::string &excluded_variable, Integrator &integrator, ComputationContext &context)

引用了 check_zero_residual(), context, LMCAS::detail::differentiate_node(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), find_integrating_factor_impl(), integrating_factor_from_ratio(), integrator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 find_integrating_factor(), find_integrating_factor_impl() , 以及 solve_exact_ode_impl().

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

◆ find_parametric_pivot()

size_t LMCAS::find_parametric_pivot ( ParametricMatrix & matrix,
size_t row,
size_t column,
ComputationContext & context )
static

在文件 parametric_solver.cpp 第 100 行定义.

101 {
102 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
103 (context).limits().max_ast_nodes, "transform");
104 while (row < matrix.size()) {
105 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(matrix[row][column]), transform_budget));
106 matrix[row][column] = simplified;
107 if (!parametric_zero(simplified, context)) {
108 break;
109 }
110 ++row;
111 }
112 return row;
113}
static bool parametric_zero(const std::shared_ptr< SymbolicExpr > &expression, ComputationContext &context)

引用了 context, find_parametric_pivot(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 parametric_zero().

被这些函数引用 find_parametric_pivot().

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

◆ find_rational_roots()

std::vector< Rational > LMCAS::find_rational_roots ( const Polynomial< Rational > & poly)

在文件 rational_polynomial.cpp 第 69 行定义.

69 {
70 std::vector<Rational> roots;
71 if (poly.is_zero() || poly.degree() < 1) return roots;
72 Polynomial<Rational> current = poly.make_monic();
73 while (current.degree() >= 1) {
74 if (current.coeffs[0] == Rational(0)) {
75 roots.push_back(Rational(0));
76 std::vector<Rational> coefficients(
77 current.coeffs.begin() + 1, current.coeffs.end());
78 current = Polynomial<Rational>(coefficients, current.variable_name);
79 continue;
80 }
81 if (current.degree() == 1) {
82 roots.push_back(-current.coeffs[0] / current.lead_coeff());
83 break;
84 }
85 auto candidate = rational_root_candidate(current);
86 if (!candidate) break;
87 deflate_rational_root(current, *candidate, roots);
88 }
89 return roots;
90}
Polynomial make_monic() const
首一化(使首项系数为 1)
static void deflate_rational_root(Polynomial< Rational > &current, const Rational &root, std::vector< Rational > &roots)
static std::optional< Rational > rational_root_candidate(const Polynomial< Rational > &current)

引用了 LMCAS::Polynomial< CoeffType >::coeffs, deflate_rational_root(), LMCAS::Polynomial< CoeffType >::degree(), find_rational_roots(), LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::Polynomial< CoeffType >::lead_coeff(), LMCAS::Polynomial< CoeffType >::make_monic(), rational_root_candidate(), roots() , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 exact_factor_roots(), factor_rational_univariate(), factor_variable_rational_roots(), find_rational_roots(), LMCAS::detail::make_exact_real_algebraic(), LMCAS::anonymous_namespace{integration_rational_factorization.cpp}::rd_factor_piece(), LMCAS::anonymous_namespace{integration_rational_factorization.cpp}::rd_factor_quadratic(), LMCAS::polynomial_solver_detail::solve_by_factoring_impl() , 以及 solve_exact_factor().

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

◆ find_roots_with_multiplicity()

std::vector< std::pair< std::shared_ptr< SymbolicExpr >, int > > LMCAS::detail::inequality_support::find_roots_with_multiplicity ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & variable,
ComputationContext & context )

在文件 inequality_solver_numeric.cpp 第 197 行定义.

199 {
200
201 std::vector<std::pair<std::shared_ptr<SymbolicExpr>, int>> result;
202
203 auto converted = symbolic_to_poly<Rational>(expr, variable);
204 if (!converted) throw std::invalid_argument(converted.error().message);
205 const auto& poly_rat = converted.value();
206 if (poly_rat.is_zero() || poly_rat.degree() <= 0) {
207 return result;
208 }
209
210 auto factors = square_free_factorization(poly_rat);
211 if (factors.empty()) {
212 auto symbolic = symbolic_to_poly<SymbolicPolyCoeff>(expr, variable);
213 if (!symbolic) throw std::invalid_argument(symbolic.error().message);
214 const auto& poly_spc = symbolic.value();
215 if (!poly_spc.is_zero() && poly_spc.degree() >= 1) {
217 poly_spc, variable, context);
218 append_verified_roots(result, poly_rat, roots, 1, context);
219 }
220 return result;
221 }
222 for (const auto& [factor, mult] : factors) {
223 if (factor.degree() <= 0) {
224 continue;
225 }
226 if (factor.degree() == 1) {
227 append_affine_root(result, factor, mult, context);
228 } else if (factor.degree() == 2) {
229 append_quadratic_roots(result, factor, mult, context);
230 } else {
231 append_factor_roots(result, factor, mult, variable, context);
232 }
233 }
234 return result;
235}
static void append_affine_root(RootMultiplicityList &result, const Polynomial< Rational > &factor, int mult, ComputationContext &context)
static void append_quadratic_roots(RootMultiplicityList &result, const Polynomial< Rational > &factor, int mult, ComputationContext &context)
static void append_verified_roots(RootMultiplicityList &result, const Polynomial< Rational > &polynomial, const std::vector< std::shared_ptr< SymbolicExpr > > &roots, int multiplicity, ComputationContext &context)
static void append_factor_roots(RootMultiplicityList &result, const Polynomial< Rational > &factor, int mult, const std::string &variable, ComputationContext &context)
std::vector< std::shared_ptr< SymbolicExpr > > solve_by_factoring_impl(const Polynomial< SymbolicPolyCoeff > &polynomial, const std::string &variable, ComputationContext &context)
std::vector< std::pair< Polynomial< Rational >, int > > square_free_factorization(const Polynomial< Rational > &poly)

◆ finite_set() [1/2]

ExprResult LMCAS::finite_set ( std::vector< ExprPtr > elements)

在文件 expr_facade.cpp 第 163 行定义.

163 {
165 return finite_set(std::move(elements), context);
166}
ExprResult finite_set(std::vector< ExprPtr > elements)

引用了 context , 以及 finite_set().

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

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

◆ finite_set() [2/2]

ExprResult LMCAS::finite_set ( std::vector< ExprPtr > elements,
ComputationContext & context )

在文件 value_facade.cpp 第 41 行定义.

42 {
43 return make_finite_set(std::move(elements), context);
44}
SymbolicSetResult make_finite_set(std::vector< std::shared_ptr< SymbolicExpr > > elements, ComputationContext &context)

引用了 context, finite_set() , 以及 make_finite_set().

函数调用图:

◆ finite_set_difference()

SymbolicSetResult LMCAS::finite_set_difference ( const SymbolicExpr & lhs,
const SymbolicExpr & rhs,
ComputationContext & context )

在文件 symbolic_set.cpp 第 175 行定义.

177 {
178 auto step = consume(context);
179 if (!step) return SymbolicSetResult::failure(step.error());
180 auto left = finite_set_node(lhs);
181 auto right = finite_set_node(rhs);
182 if (!left || !right) return failure(CasErrc::SetOperandTypeMismatch,
183 "set difference requires two finite sets");
184 std::vector<std::shared_ptr<const SymbolicNode>> elements;
185 for (const auto& element : left->elements()) {
186 if (!right->contains(*element)) elements.push_back(element);
187 }
188 return from_nodes(std::move(elements));
189}

引用了 context, element, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), finite_set_difference(), rhs, right , 以及 SetOperandTypeMismatch.

被这些函数引用 expr_set_difference(), finite_set_difference() , 以及 finite_set_symmetric_difference().

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

◆ finite_set_intersection()

SymbolicSetResult LMCAS::finite_set_intersection ( const SymbolicExpr & lhs,
const SymbolicExpr & rhs,
ComputationContext & context )

在文件 symbolic_set.cpp 第 159 行定义.

161 {
162 auto step = consume(context);
163 if (!step) return SymbolicSetResult::failure(step.error());
164 auto left = finite_set_node(lhs);
165 auto right = finite_set_node(rhs);
166 if (!left || !right) return failure(CasErrc::SetOperandTypeMismatch,
167 "set intersection requires two finite sets");
168 std::vector<std::shared_ptr<const SymbolicNode>> elements;
169 for (const auto& element : left->elements()) {
170 if (right->contains(*element)) elements.push_back(element);
171 }
172 return from_nodes(std::move(elements));
173}

引用了 context, element, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), finite_set_intersection(), rhs, right , 以及 SetOperandTypeMismatch.

被这些函数引用 expr_set_intersection() , 以及 finite_set_intersection().

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

◆ finite_set_symmetric_difference()

SymbolicSetResult LMCAS::finite_set_symmetric_difference ( const SymbolicExpr & lhs,
const SymbolicExpr & rhs,
ComputationContext & context )

在文件 symbolic_set.cpp 第 191 行定义.

193 {
194 auto left = finite_set_difference(lhs, rhs, context);
195 if (!left) return left;
197 if (!right) return right;
198 return finite_set_union(*left.value(), *right.value(), context);
199}

引用了 context, finite_set_difference(), finite_set_symmetric_difference(), finite_set_union(), rhs , 以及 right.

被这些函数引用 expr_set_symmetric_difference() , 以及 finite_set_symmetric_difference().

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

◆ finite_set_union()

SymbolicSetResult LMCAS::finite_set_union ( const SymbolicExpr & lhs,
const SymbolicExpr & rhs,
ComputationContext & context )

在文件 symbolic_set.cpp 第 145 行定义.

147 {
148 auto step = consume(context);
149 if (!step) return SymbolicSetResult::failure(step.error());
150 auto left = finite_set_node(lhs);
151 auto right = finite_set_node(rhs);
152 if (!left || !right) return failure(CasErrc::SetOperandTypeMismatch,
153 "set union requires two finite sets");
154 auto elements = left->elements();
155 elements.insert(elements.end(), right->elements().begin(), right->elements().end());
156 return from_nodes(std::move(elements));
157}

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), finite_set_union(), rhs, right , 以及 SetOperandTypeMismatch.

被这些函数引用 expr_set_union(), finite_set_symmetric_difference() , 以及 finite_set_union().

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

◆ finite_values_to_set()

SolveResult LMCAS::finite_values_to_set ( SolveVectorResult result)
static

在文件 solve_visitor.cpp 第 542 行定义.

542 {
543 if (!result) return SolveResult::failure(result.error());
544 if (result.value().empty()) {
546 }
547 std::vector<FiniteSolution> solutions;
548 solutions.reserve(result.value().size());
549 for (auto& value : result.value()) {
550 solutions.push_back(FiniteSolution{std::move(value), 1, {}});
551 }
552 return SolveResult::success(SolutionSet{FiniteSolutions{std::move(solutions)}});
553}

引用了 LMCAS::Result< T >::error(), LMCAS::Result< SolutionSet >::failure(), finite_values_to_set(), LMCAS::Result< SolutionSet >::success(), LMCAS::Result< T >::value() , 以及 value.

被这些函数引用 finite_values_to_set() , 以及 solve_set_core().

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

◆ floor() [1/2]

ExprResult LMCAS::floor ( const ExprPtr & expression)

在文件 expr_elementary.cpp 第 174 行定义.

174 {
176 return floor(expression, context);
177}
ExprResult floor(const ExprPtr &expression, ComputationContext &context)

引用了 context , 以及 floor().

函数调用图:

◆ floor() [2/2]

ExprResult LMCAS::floor ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_elementary.cpp 第 169 行定义.

169 {
170 return make_unary_function_expr(expression, context, "floor",
172}

引用了 context, LMCAS::FunctionNode::Floor, floor() , 以及 LMCAS::expr_detail::expr_common::make_unary_function_expr().

被这些函数引用 LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function(), floor() , 以及 floor().

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

◆ formal_derivative()

MultiPoly LMCAS::formal_derivative ( const MultiPoly & poly,
const std::string & main_var )
static

计算多元多项式关于指定变量的形式偏导数

对每个含 main_var 的项,新系数 = 原系数 x 指数,新指数 = 原指数 - 1. 指数为 0 的项被丢弃.

参数
[in]poly输入多元多项式
[in]main_var求导变量名
返回
partialpoly/partialmain_var

main_var 不在变量列表中,导数为零

在文件 multivariate_factor.cpp 第 389 行定义.

390{
391 if (poly.is_zero()) { return poly; }
392
393 const auto& vars = poly.variables();
394 int var_idx = -1;
395 for (size_t i = 0; i < vars.size(); ++i) {
396 if (vars[i] == main_var) { var_idx = static_cast<int>(i); break; }
397 }
398 if (var_idx < 0) {
399 /// main_var 不在变量列表中,导数为零
400 return MultiPoly(Rational(0), vars);
401 }
402
403 std::vector<MultiPoly::Term> result_terms;
404 for (const auto& term : poly.terms()) {
405 const Monomial& mono = term.first;
406 int exp = (static_cast<size_t>(var_idx) < mono.size()) ? mono[var_idx] : 0;
407 if (exp == 0) { continue; } /**< 常数项关于该变量的导数为零。 */
408
409 Rational new_coeff = term.second * Rational(exp);
410 Monomial new_mono = mono;
411 new_mono[var_idx] = exp - 1;
412 result_terms.emplace_back(std::move(new_mono), std::move(new_coeff));
413 }
414
415 if (result_terms.empty()) { return MultiPoly(Rational(0), vars); }
416 return MultiPoly(std::move(result_terms), vars);
417}

引用了 exp(), formal_derivative(), main_var , 以及 vars.

被这些函数引用 formal_derivative() , 以及 square_free_decompose().

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

◆ fourier_constant_coefficient()

ExpressionResult LMCAS::fourier_constant_coefficient ( Integrator & integrator,
const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const FourierPeriod & period,
ComputationContext & context )
static

在文件 series_expansions.cpp 第 229 行定义.

231 {
232 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
233 (context).limits().max_ast_nodes, "transform");
234 auto a0_integral = integrator.integrate_def_checked(
235 *f, var, *period.lower, *period.upper, context);
236 if (!a0_integral) { return ExpressionResult::failure(a0_integral.error()); }
238 LMCAS::detail::make_expression_ptr(a0_integral.value()), period.half_length)), transform_budget));
239 return SymbolicExpr::divide(a0, period.two);
240} catch (const CasError& error) {
241 return ExpressionResult::failure(error);
242} catch (const std::bad_alloc&) {
243 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "fourier_constant_coefficient");
244} catch (const std::length_error& error) {
245 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "fourier_constant_coefficient");
246} catch (const std::exception& error) {
247 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "fourier_constant_coefficient");
248}
std::shared_ptr< SymbolicExpr > half_length
std::shared_ptr< SymbolicExpr > upper
std::shared_ptr< SymbolicExpr > two
std::shared_ptr< SymbolicExpr > lower

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), fourier_constant_coefficient(), LMCAS::FourierPeriod::half_length, integrator, LMCAS::FourierPeriod::lower, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::FourierPeriod::two , 以及 LMCAS::FourierPeriod::upper.

被这些函数引用 fourier_constant_coefficient() , 以及 fourier_series_checked().

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

◆ fourier_harmonics()

Result< void > LMCAS::fourier_harmonics ( Integrator & integrator,
const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const FourierPeriod & period,
const std::shared_ptr< SymbolicExpr > & x,
int n_terms,
int parity,
std::shared_ptr< SymbolicExpr > & result,
ComputationContext & context )
static

在文件 series_expansions.cpp 第 250 行定义.

253 {
254 for (int k = 1; k <= n_terms; ++k) {
255 auto kw = SymbolicExpr::multiply(SymbolicExpr::number(k), period.frequency);
256 auto arg = SymbolicExpr::multiply(kw, x);
257 if (parity != -1) {
258 auto added = add_fourier_harmonic(integrator, f, var, period.lower,
259 period.upper, period.half_length, arg, true, result, context);
260 if (!added) { return added; }
261 }
262 if (parity != 1) {
263 auto added = add_fourier_harmonic(integrator, f, var, period.lower,
264 period.upper, period.half_length, arg, false, result, context);
265 if (!added) { return added; }
266 }
267 }
268 return Result<void>::success();
269}
std::shared_ptr< SymbolicExpr > frequency
static Result< void > add_fourier_harmonic(Integrator &integrator, const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &half_lo, const std::shared_ptr< SymbolicExpr > &half_hi, const std::shared_ptr< SymbolicExpr > &L, const std::shared_ptr< SymbolicExpr > &arg, bool cosine, std::shared_ptr< SymbolicExpr > &result, ComputationContext &context)

引用了 add_fourier_harmonic(), context, fourier_harmonics(), LMCAS::FourierPeriod::frequency, LMCAS::FourierPeriod::half_length, integrator, LMCAS::FourierPeriod::lower, LMCAS::Result< T >::success() , 以及 LMCAS::FourierPeriod::upper.

被这些函数引用 fourier_harmonics() , 以及 fourier_series_checked().

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

◆ fourier_series_checked() [1/2]

ExpressionResult LMCAS::fourier_series_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & period,
int n_terms )

在文件 series_expansions.cpp 第 330 行定义.

332 {
334 return fourier_series_checked(f, var, period, n_terms, context);
335}
ExpressionResult fourier_series_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &period, int n_terms, ComputationContext &context)

引用了 context , 以及 fourier_series_checked().

函数调用图:

◆ fourier_series_checked() [2/2]

ExpressionResult LMCAS::fourier_series_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & period,
int n_terms,
ComputationContext & context )

在文件 series_expansions.cpp 第 271 行定义.

274 {
275 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
276 (context).limits().max_ast_nodes, "transform");
277 constexpr const char* operation = "fourier_series";
278 if (!f || !period || var.empty() || n_terms < 0) {
281 "Fourier expansion requires an expression, variable, positive period, and non-negative term count",
282 operation);
283 }
284 const std::size_t expansion_terms =
285 1 + 2 * static_cast<std::size_t>(n_terms);
286 if (expansion_terms > context.limits().max_expansion_terms) {
289 "Fourier term count exceeds the expansion budget", operation);
290 }
291
292 try {
293 auto access = context.consume_steps(1, operation);
294 if (!access) {
295 return ExpressionResult::failure(access.error());
296 }
297
298 auto prepared = prepare_fourier_period(period, var, context);
299 if (!prepared) { return ExpressionResult::failure(prepared.error()); }
300
301 int parity = detect_parity(f, var, context);
302 Integrator integrator;
303 auto x = SymbolicExpr::variable(var);
304
305 auto constant = fourier_constant_coefficient(integrator, f, var, prepared.value(), context);
306 if (!constant) { return constant; }
307 auto result = std::move(constant.value());
308 auto harmonics = fourier_harmonics(
309 integrator, f, var, prepared.value(), x, n_terms, parity, result, context);
310 if (!harmonics) { return ExpressionResult::failure(harmonics.error()); }
312 } catch (const std::bad_alloc&) {
315 "Fourier expansion allocation failed", operation);
316 } catch (const std::length_error& error) { return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "fourier_series"); } catch (const std::exception& error) {
318 CasErrc::InternalInvariant, error.what(), operation);
319 }
320} catch (const CasError& error) {
321 return ExpressionResult::failure(error);
322} catch (const std::bad_alloc&) {
323 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "fourier_series");
324} catch (const std::length_error& error) {
325 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "fourier_series");
326} catch (const std::exception& error) {
327 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "fourier_series");
328}
static int detect_parity(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, ComputationContext &context)
static Result< FourierPeriod > prepare_fourier_period(const std::shared_ptr< SymbolicExpr > &period, const std::string &var, ComputationContext &context)
static Result< void > fourier_harmonics(Integrator &integrator, const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const FourierPeriod &period, const std::shared_ptr< SymbolicExpr > &x, int n_terms, int parity, std::shared_ptr< SymbolicExpr > &result, ComputationContext &context)
static ExpressionResult fourier_constant_coefficient(Integrator &integrator, const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const FourierPeriod &period, ComputationContext &context)

引用了 context, detect_parity(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), fourier_constant_coefficient(), fourier_harmonics(), fourier_series_checked(), integrator, InternalInvariant, InvalidArgument, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), prepare_fourier_period(), ResourceLimit , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

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

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

◆ fourier_transform_checked() [1/2]

TransformEngineResult LMCAS::fourier_transform_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & t,
const std::string & omega )

在文件 transform_fourier.cpp 第 208 行定义.

211 {
213 return fourier_transform_checked(f, t, omega, context);
214}
TransformEngineResult fourier_transform_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &omega, ComputationContext &context)

引用了 context, fourier_transform_checked() , 以及 t.

函数调用图:

◆ fourier_transform_checked() [2/2]

TransformEngineResult LMCAS::fourier_transform_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & t,
const std::string & omega,
ComputationContext & context )

在文件 transform_fourier.cpp 第 174 行定义.

178 {
179 const std::string operation = "fourier_transform";
180 auto valid = te_validate_expr_vars(f, t, omega, context, operation);
181 if (!valid) return TransformEngineResult::failure(valid.error());
182 auto step = context.consume_steps(8, operation);
183 if (!step) return TransformEngineResult::failure(step.error());
184 try {
185 AssumptionContext empty_assumptions;
186 const auto& assumptions = context.assumptions() ? *context.assumptions() : empty_assumptions;
187 std::vector<std::shared_ptr<SymbolicExpr>> conditions;
188 auto expression = fourier_transform_core(f, t, omega, context, assumptions, conditions);
189 auto final_access = context.consume_steps(0, operation);
190 if (!final_access) {
191 return TransformEngineResult::failure(final_access.error());
192 }
193 auto result = te_wrap_transform_result(std::move(expression), operation);
194 if (result) result.value().value.conditions = std::move(conditions);
195 return result;
196 } catch (const CasError& error) {
197 return TransformEngineResult::failure(error);
198 } catch (const std::bad_alloc&) {
200 "transform allocation failed",
201 operation);
202 } catch (const std::exception& e) {
204 e.what(), operation);
205 }
206}
Result< void > te_validate_expr_vars(const std::shared_ptr< SymbolicExpr > &expression, const std::string &input_var, const std::string &output_var, ComputationContext &context, const std::string &operation)
TransformEngineResult te_wrap_transform_result(std::shared_ptr< SymbolicExpr > expression, const std::string &operation)
static std::shared_ptr< SymbolicExpr > fourier_transform_core(const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &omega, ComputationContext &context, const AssumptionContext &assumptions, std::vector< std::shared_ptr< SymbolicExpr > > &conditions)

引用了 context, e(), LMCAS::Result< Verified< EvaluatedTransform > >::failure(), fourier_transform_checked(), fourier_transform_core(), InternalInvariant, ResourceLimit, t, LMCAS::transform_detail::te_validate_expr_vars() , 以及 LMCAS::transform_detail::te_wrap_transform_result().

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

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

◆ fourier_transform_core()

std::shared_ptr< SymbolicExpr > LMCAS::fourier_transform_core ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & t,
const std::string & omega,
ComputationContext & context,
const AssumptionContext & assumptions,
std::vector< std::shared_ptr< SymbolicExpr > > & conditions )
static

在文件 transform_fourier.cpp 第 135 行定义.

139 {
140 auto step = context.consume_steps(1, "fourier_transform.recursive");
141 if (!step) {
142 return nullptr;
143 }
144 if (!f || !detail::node(f)) {
145 return nullptr;
146 }
147 if (!te_depends_on(f, t)) {
148 return te_fourier_unevaluated(f, t, omega);
149 }
150 auto addition = std::dynamic_pointer_cast<const AddNode>(detail::node(f));
151 if (addition) {
152 return te_fourier_sum(*addition, t, omega, context, assumptions, conditions);
153 }
154 auto [coefficient, body] = te_split_coeff(f, t);
155 if (!coefficient->is_one()) {
156 auto transformed = fourier_transform_core(body, t, omega, context, assumptions, conditions);
157 if (transformed) {
158 return SymbolicExpr::multiply(coefficient, transformed);
159 }
160 }
161 if (const auto gaussian_rate = te_match_pure_gaussian(f, t)) {
162 return te_gaussian_fourier(*gaussian_rate, omega);
163 }
164 auto decay = te_abs_decay(f, t, context);
165 if (decay) {
166 if (te_accept_decay(decay, assumptions, conditions, context)) {
167 return te_abs_fourier(decay, omega, context);
168 }
169 return te_fourier_unevaluated(f, t, omega);
170 }
171 return te_fourier_unevaluated(f, t, omega);
172}
std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > te_split_coeff(const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable)
bool te_depends_on(const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable)
std::optional< Rational > te_match_pure_gaussian(const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable)
static std::shared_ptr< SymbolicExpr > te_fourier_unevaluated(const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &omega)
static std::shared_ptr< SymbolicExpr > te_gaussian_fourier(const Rational &rate, const std::string &omega)
static std::shared_ptr< SymbolicExpr > te_abs_fourier(const std::shared_ptr< SymbolicExpr > &rate, const std::string &omega, ComputationContext &context)
static bool te_accept_decay(const std::shared_ptr< SymbolicExpr > &rate, const AssumptionContext &assumptions, std::vector< std::shared_ptr< SymbolicExpr > > &conditions, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > te_abs_decay(const std::shared_ptr< SymbolicExpr > &f, const std::string &t, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > te_fourier_sum(const AddNode &addition, const std::string &t, const std::string &omega, ComputationContext &context, const AssumptionContext &assumptions, std::vector< std::shared_ptr< SymbolicExpr > > &conditions)

引用了 context, fourier_transform_core(), LMCAS::detail::node(), t, te_abs_decay(), te_abs_fourier(), te_accept_decay(), LMCAS::transform_detail::te_depends_on(), te_fourier_sum(), te_fourier_unevaluated(), te_gaussian_fourier(), LMCAS::transform_detail::te_match_pure_gaussian() , 以及 LMCAS::transform_detail::te_split_coeff().

被这些函数引用 fourier_transform_checked(), fourier_transform_core(), inverse_fourier_transform_checked() , 以及 te_fourier_sum().

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

◆ free_variables()

std::set< std::string > LMCAS::free_variables ( const detail::SymbolicNodePtr & expression,
detail::RewriteBudget * budget )

在文件 expression_analysis.cpp 第 312 行定义.

313 {
314 FreeVariableCollector collector(budget);
315 if (expression) expression->accept(collector);
316 return std::move(collector.variables);
317}

引用了 LMCAS::SymbolicNode::accept() , 以及 free_variables().

被这些函数引用 LMCAS::anonymous_namespace{residual_verification.cpp}::classify_residual(), classify_singular_point_checked(), LMCAS::detail::AssumptionFacts::collect_names(), factor_transcendental_expression(), free_variables(), LMCAS::anonymous_namespace{inference_engine_periodicity.cpp}::PeriodInference::independent(), LMCAS::polynomial_solver_detail::is_purely_numeric(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::reduce_fraction(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::solve_mixed_equation() , 以及 substitute_free().

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

◆ frobenius_arithmetic_failure()

CasError LMCAS::frobenius_arithmetic_failure ( )
static

在文件 ode_frobenius.cpp 第 37 行定义.

37 {
39 "Frobenius coefficient recurrence produced a non-finite value",
40 "solve_frobenius"};
41}

引用了 frobenius_arithmetic_failure() , 以及 NumericFailure.

被这些函数引用 frobenius_arithmetic_failure(), frobenius_indicial_roots(), ordinary_series_recurrence() , 以及 singular_series_recurrence().

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

◆ frobenius_coefficient_limit()

Result< double > LMCAS::frobenius_coefficient_limit ( const std::shared_ptr< SymbolicExpr > & coefficient,
const std::string & x,
const std::shared_ptr< SymbolicExpr > & x0,
double value,
ComputationContext & context )
static

在文件 ode_frobenius.cpp 第 166 行定义.

169 {
170 if (std::isfinite(value)) {
171 return value;
172 }
173 auto limited = limit_expression_checked(
174 coefficient, x, x0, LimitDirection::Both, context);
175 if (!limited) {
176 return Result<double>::failure(limited.error());
177 }
178 const auto& lim = limited.value();
179 return lim ? try_eval_double(lim)
180 : std::numeric_limits<double>::quiet_NaN();
181}

引用了 Both, context, LMCAS::Result< T >::failure(), frobenius_coefficient_limit(), limit_expression_checked(), try_eval_double() , 以及 value.

被这些函数引用 frobenius_coefficient_limit() , 以及 singular_taylor_coefficients().

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

◆ frobenius_indicial_roots()

Result< std::pair< double, double > > LMCAS::frobenius_indicial_roots ( double P0,
double Q0 )
static

在文件 ode_frobenius.cpp 第 137 行定义.

138 {
139 double ind_b = P0 - 1.0;
140 double ind_c = Q0;
141 double ind_D = ind_b * ind_b - 4.0 * ind_c;
142 if (!std::isfinite(ind_D)) {
144 }
145
146 double r1, r2;
147 int eq;
148 lmmc_double_nearly_equal_tol(ind_D, 0.0, 1e-12, 1e-12, &eq);
149 if (!eq && ind_D > 0) {
150 r1 = (-ind_b + std::sqrt(ind_D)) / 2.0;
151 r2 = (-ind_b - std::sqrt(ind_D)) / 2.0;
152 } else if (eq) {
153 r1 = -ind_b / 2.0;
154 r2 = r1;
155 } else {
156 r1 = -ind_b / 2.0;
157 r2 = r1;
158 }
159 if (r1 < r2) {
160 std::swap(r1, r2);
161 }
162
163 return std::make_pair(r1, r2);
164}
static CasError frobenius_arithmetic_failure()

引用了 e(), eq(), frobenius_arithmetic_failure() , 以及 frobenius_indicial_roots().

被这些函数引用 frobenius_indicial_roots() , 以及 singular_frobenius_solution().

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

◆ frobenius_unsupported_numeric()

CasError LMCAS::frobenius_unsupported_numeric ( )
static

在文件 ode_frobenius.cpp 第 31 行定义.

31 {
33 "Frobenius series coefficients are outside the checked numeric support domain",
34 "solve_frobenius"};
35}

引用了 frobenius_unsupported_numeric() , 以及 Inconclusive.

被这些函数引用 frobenius_unsupported_numeric(), ordinary_taylor_coefficients(), singular_frobenius_solution() , 以及 singular_taylor_coefficients().

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

◆ function()

ExprResult LMCAS::function ( const std::string & name,
std::vector< ExprPtr > arguments )

在文件 expr_facade.cpp 第 135 行定义.

135 {
136 constexpr const char* operation = "LMCAS.function";
137 if (name.empty()) {
139 "function name cannot be empty", operation);
140 }
141 std::vector<std::shared_ptr<const SymbolicNode>> nodes;
142 nodes.reserve(arguments.size());
143 for (const auto& argument : arguments) {
144 if (!argument || !LMCAS::detail::node(argument)) {
146 "function arguments cannot be null", operation);
147 }
148 nodes.push_back(LMCAS::detail::node(argument));
149 }
150 try {
153 name, std::move(nodes))));
154 } catch (const std::bad_alloc&) {
156 "function allocation failed", operation);
157 } catch (const std::exception& error) {
159 error.what(), operation);
160 }
161}

引用了 LMCAS::expr_detail::expr_common::expression_failure(), function(), InternalInvariant, InvalidArgument, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), name, LMCAS::detail::node(), ResourceLimit , 以及 LMCAS::Result< ExprPtr >::success().

被这些函数引用 LMCAS::detail::definite::absolute_argument(), adaptive_simpson_numeric(), adaptive_simpson_numeric(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::additive_function_pattern(), bisection_checked(), bisection_checked(), calculus_utils_contains_complex(), calculus_utils_contains_nonreal_sqrt(), LMCAS::detail::anonymous_namespace{exact_constant_bounds.cpp}::checked_bounds(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_function(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_limit_result(), LMCAS::detail::anonymous_namespace{exact_matrix_support.cpp}::classify_numeric_sqrt(), LMCAS::anonymous_namespace{residual_verification.cpp}::collect_function_profile(), LMCAS::anonymous_namespace{residual_verification.cpp}::collect_residual_profiles(), LMCAS::UninterpretedFunctionNode::compare_same_type(), LMCAS::MultiplyNode::contains_matrix(), LMCAS::detail::transcendental::decompose_trig_exp_pattern(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_function(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_node(), LMCAS::anonymous_namespace{limit_result.cpp}::elementary_continuous_structure(), exact_scalar_radicand(), LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function(), function(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::function_bounds(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::function_candidate(), LMCAS::anonymous_namespace{inference_engine_periodicity.cpp}::PeriodInference::function_period(), infinity_sign(), integrating_factor_from_antiderivative(), LMCAS::anonymous_namespace{integration_linearity.cpp}::integration_exponential_argument(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::invertible_function(), LMCAS::calculus_utils_detail::is_infinity_node(), is_nonreal_sqrt(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::lambert_inner(), LMCAS::anonymous_namespace{integration_substitution.cpp}::linear_reduced_expression(), LMCAS::anonymous_namespace{integration_substitution.cpp}::linear_substitutable_function(), match_recursive(), LMCAS::detail::definite::needs_segment_expression(), newton_raphson_checked(), newton_raphson_checked(), newton_raphson_checked(), newton_raphson_checked(), LMCAS::NormalizationVisitor::normalize_function_parity(), LMCAS::NormalizationVisitor::normalize_natural_logarithm(), LMCAS::detail::definite::original_conditions_checked(), LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::outside_real_function_domain(), LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::parse_quadratic_surd(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::propagate(), quadrature_gaussian_numeric(), quadrature_gaussian_numeric(), quadrature_simpson_numeric(), quadrature_simpson_numeric(), LMCAS::equivalence_detail::rewrite_exp_log_basic_identity(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_exp_log.cpp}::rewrite_exp_log_function(), LMCAS::equivalence_detail::rewrite_trig_basic_identity(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_trig.cpp}::rewrite_trig_function(), LMCAS::detail::inequality_support::anonymous_namespace{inequality_solver_ordering.cpp}::root_node_sign(), LMCAS::anonymous_namespace{newton_raphson.cpp}::run_bisection_backend(), LMCAS::anonymous_namespace{newton_raphson.cpp}::run_newton_backend(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::scaled_function(), LMCAS::detail::anonymous_namespace{squared_norm.cpp}::square_root_argument(), LMCAS::solver_detail::anonymous_namespace{solver_imaginary.cpp}::square_root_is_imaginary(), LMCAS::detail::definite::structurally_continuous(), LMCAS::anonymous_namespace{integration_substitution.cpp}::substitution_argument(), LMCAS::anonymous_namespace{integration_substitution.cpp}::substitution_primitive(), te_abs_decay(), te_is_abs_variable(), LMCAS::transform_detail::te_is_trig(), LMCAS::transform_detail::te_match_pure_gaussian(), LMCAS::transform_detail::te_match_scaled_gaussian(), tf_is_variable_exponential(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_trig.cpp}::trig_square(), LMCAS::NormalizationVisitor::try_assumption_simplify(), LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::unsupported_endpoint(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::validate_geometry_inputs(), LMCAS::anonymous_namespace{numerical_integration.cpp}::validate_quadrature_args(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), LMCAS::vector_calculus_detail::vector_calculus_validate_functions_vars(), LMCAS::NormalizationVisitor::visit() , 以及 LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_trig_of_variable().

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

◆ gcd_coeff_impl()

template<typename T>
T LMCAS::gcd_coeff_impl ( const T & a,
const T & b )

计算两个系数的最大公约数(泛型实现)

模板参数
T系数类型
参数
a第一个系数
b第二个系数
返回
gcd(a, b)

在文件 polynomial.hpp 第 26 行定义.

26 {
27 if constexpr (std::is_integral_v<T>) {
28 return std::abs(std::gcd(a, b));
29 }
30 else if constexpr (std::is_same_v<T, BigInt>) {
31 return BigInt::gcd(a, b);
32 }
33 else if constexpr (std::is_same_v<T, Rational>) {
34 return Rational(1);
35 }
36 else {
37 return T(1);
38 }
39}

引用了 a, b , 以及 gcd_coeff_impl().

被这些函数引用 LMCAS::Polynomial< CoeffType >::gcd() , 以及 gcd_coeff_impl().

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

◆ gcd_evaluation_points()

std::vector< Rational > LMCAS::gcd_evaluation_points ( int bound)
static

在文件 multivariate_factor.cpp 第 263 行定义.

263 {
264 std::vector<Rational> points;
265 points.push_back(Rational(0));
266 for (int k = 1; static_cast<int>(points.size()) < bound; ++k) {
267 points.push_back(Rational(k));
268 points.push_back(Rational(-k));
269 }
270 return points;
271}

引用了 gcd_evaluation_points().

被这些函数引用 extended_gcd_interpolation(), gcd_evaluation_points() , 以及 recursive_multivariate_gcd().

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

◆ ge()

ExprResult LMCAS::ge ( const ExprPtr & lhs,
const ExprPtr & rhs )

在文件 expr_facade.cpp 第 209 行定义.

209 {
210 return relation(lhs, rhs, RelationOp::GEQ);
211}

引用了 ge(), GEQ, relation() , 以及 rhs.

被这些函数引用 ge().

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

◆ generate_good_primes()

std::vector< int64_t > LMCAS::generate_good_primes ( int count,
const std::vector< BigInt > & leading_coeffs,
uint64_t start_from = UINT64_C(1000000000) )
inline

生成指定数量的好素数

参数
count需要的素数个数
leading_coeffs首项系数列表(用于过滤)
start_from搜索起始值
返回
好素数列表

在文件 modular_arithmetic.hpp 第 491 行定义.

493 {
494 if (count < 0) {
495 throw std::invalid_argument("prime count must be nonnegative");
496 }
497 const auto requested = static_cast<std::size_t>(count);
498 const auto maximum = static_cast<uint64_t>(std::numeric_limits<int64_t>::max());
499 std::vector<int64_t> result;
500 result.reserve(requested);
501 uint64_t candidate = start_from;
502 while (result.size() < requested) {
503 if (candidate >= maximum) {
504 throw std::overflow_error("prime search exceeds the signed residue range");
505 }
506 const uint64_t next = lmmp_next_prime_ulong_(candidate);
507 if (next <= candidate || next > maximum) {
508 throw std::overflow_error("prime search exhausted the signed residue range");
509 }
510 candidate = next;
511 const auto prime = static_cast<int64_t>(candidate);
512 if (is_good_prime(prime, leading_coeffs)) {
513 result.push_back(prime);
514 }
515 }
516 return result;
517}
bool is_good_prime(int64_t p, const std::vector< BigInt > &leading_coeffs)
判断素数 p 是否为"好素数"(不整除任何首项系数)

引用了 generate_good_primes(), is_good_prime() , 以及 prime.

被这些函数引用 generate_good_primes().

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

◆ geometric_term_convergence()

std::optional< ConvergenceInfo > LMCAS::geometric_term_convergence ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & index_var )
static

在文件 series_convergence.cpp 第 258 行定义.

260 {
261 auto power = std::dynamic_pointer_cast<const PowerNode>(node);
262 if (!power) {
263 return std::nullopt;
264 }
265 auto exponent = std::dynamic_pointer_cast<const VariableNode>(power->exponent());
266 auto base = std::dynamic_pointer_cast<const NumberNode>(power->base());
267 if (!exponent || exponent->is_constant() || exponent->name() != index_var || !base) {
268 return std::nullopt;
269 }
270
271 bool inside_unit_circle = false;
272 if (const auto* integer = std::get_if<BigInt>(&base->value())) {
273 inside_unit_circle = *integer > BigInt(-1) && *integer < BigInt(1);
274 } else if (const auto* rational = std::get_if<Rational>(&base->value())) {
275 inside_unit_circle = *rational > Rational(-1) && *rational < Rational(1);
276 }
277 return ConvergenceInfo{
278 inside_unit_circle ? ConvergenceResult::Convergent
280 "geometric"};
281}

引用了 Convergent, Divergent, exponent, geometric_term_convergence(), integer , 以及 rational().

被这些函数引用 convergence_test_impl() , 以及 geometric_term_convergence().

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

◆ get_coeff()

std::shared_ptr< SymbolicExpr > LMCAS::get_coeff ( const Polynomial< SymbolicPolyCoeff > & p,
int deg )

在文件 solve_visitor.cpp 第 41 行定义.

41 {
42 if (deg < 0 || deg > p.degree()) {
43 return SymbolicExpr::number(0);
44 }
45 return p.coeffs[deg].val;
46}

引用了 LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::Polynomial< CoeffType >::degree() , 以及 get_coeff().

被这些函数引用 conditional_linear_polynomial(), get_coeff(), solve_closed_form_from_poly(), solve_closed_form_poly(), LMCAS::detail::inequality_support::solve_symbolic_poly(), solve_symbolic_polynomial_set() , 以及 solve_symbolic_quadratic().

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

◆ get_integer_value()

bool LMCAS::get_integer_value ( const std::shared_ptr< const SymbolicNode > & node,
BigInt & value )
static

在文件 solver_linear.cpp 第 30 行定义.

30 {
31 auto num = std::dynamic_pointer_cast<const NumberNode>(node);
32 if (!num) {
33 return false;
34 }
35 if (std::holds_alternative<BigInt>(num->value())) {
36 value = std::get<BigInt>(num->value());
37 return true;
38 }
39 if (std::holds_alternative<Rational>(num->value())) {
40 const auto& r = std::get<Rational>(num->value());
41 if (!r.is_integer()) {
42 return false;
43 }
44 value = r.to_bigint();
45 return true;
46 }
47 return false;
48}

引用了 get_integer_value(), LMCAS::polynomial_solver_detail::num(), r , 以及 value.

被这些函数引用 collect_power_denominators(), get_integer_value() , 以及 LMCAS::solver_detail::is_polynomial_node().

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

◆ get_node_degree_helper()

BigInt LMCAS::get_node_degree_helper ( const std::shared_ptr< const SymbolicNode > & node)

计算 AST 节点的多项式次数

参数
node输入节点
返回
节点对应的多项式次数

在文件 normalization_utils.cpp 第 61 行定义.

61 {
62 if (!node) {
63 return BigInt(0);
64 }
65 if (std::dynamic_pointer_cast<const VariableNode>(node)) {
66 return BigInt(1);
67 }
68 if (auto p = std::dynamic_pointer_cast<const PowerNode>(node)) {
69 const auto e = std::dynamic_pointer_cast<const NumberNode>(p->exponent());
70 BigInt degree;
71 if (try_get_integer_value(e, degree)) {
72 return degree;
73 }
74 return BigInt(1);
75 }
76 if (auto m = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
77 BigInt d(0);
78 for (auto& op : m->operands()) d += get_node_degree_helper(op);
79 return d;
80 }
81 return BigInt(0);
82}
bool try_get_integer_value(const std::shared_ptr< const NumberNode > &node, BigInt &value)
BigInt get_node_degree_helper(const std::shared_ptr< const SymbolicNode > &node)
计算 AST 节点的多项式次数

引用了 e(), get_node_degree_helper(), op , 以及 try_get_integer_value().

被这些函数引用 get_node_degree_helper(), normalization_factor_less(), LMCAS::NodeCompare::operator()() , 以及 LMCAS::anonymous_namespace{normalization_arithmetic.cpp}::sum_term_less().

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

◆ get_pi_coeff()

bool LMCAS::get_pi_coeff ( const std::shared_ptr< const SymbolicNode > & node,
Rational & coefficient )

在文件 normalization_utils.cpp 第 182 行定义.

182 {
183 const auto variable = std::dynamic_pointer_cast<const VariableNode>(node);
185 k = Rational(1);
186 return true;
187 }
188 const auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node);
189 if (!multiply) {
190 return false;
191 }
192 bool has_pi = false;
193 k = Rational(1);
194 for (const auto& operand : multiply->operands()) {
195 if (const auto variable = std::dynamic_pointer_cast<const VariableNode>(operand)) {
196 if (has_pi || !is_pi_variable(*variable)) return false;
197 has_pi = true;
198 continue;
199 }
200 const auto number = std::dynamic_pointer_cast<const NumberNode>(operand);
201 if (!number) {
202 return false;
203 }
204 if (const auto* rational = std::get_if<Rational>(&number->value())) {
205 k = k * *rational;
206 continue;
207 }
208 const auto* integer = std::get_if<BigInt>(&number->value());
209 if (!integer) {
210 return false;
211 }
212 k = k * Rational(*integer);
213 }
214 return has_pi;
215}
static bool is_pi_variable(const VariableNode &variable)

引用了 get_pi_coeff(), integer, is_pi_variable(), rational() , 以及 variable.

被这些函数引用 get_pi_coeff() , 以及 LMCAS::NormalizationVisitor::normalize_unary_function().

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

◆ gradient()

VectorField LMCAS::gradient ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars )

在文件 vector_calculus_differential.cpp 第 332 行定义.

334{
336 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
337 context.limits().max_ast_nodes, "gradient");
338 return gradient_impl(f, vars, transform_budget);
339}
VectorField gradient_impl(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)

引用了 context, gradient(), LMCAS::vector_calculus_detail::gradient_impl() , 以及 vars.

被这些函数引用 find_extrema_checked(), gradient(), lagrange_gradient_strict(), lagrange_multipliers_strict(), lagrange_stationarity_equation(), LMCAS::anonymous_namespace{symbolic_geometry_surface.cpp}::surface_gradient_at_point_checked(), LMCAS::anonymous_namespace{symbolic_geometry_surface.cpp}::surface_gradient_scale_checked(), surface_normal_checked() , 以及 tangent_plane_checked().

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

◆ gradient_checked() [1/2]

VectorCalculusFieldResult LMCAS::gradient_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars )

在文件 vector_calculus_differential.cpp 第 41 行定义.

44{
46 return gradient_checked(f, vars, context);
47}
VectorCalculusFieldResult gradient_checked(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context)

引用了 context, gradient_checked() , 以及 vars.

函数调用图:

◆ gradient_checked() [2/2]

VectorCalculusFieldResult LMCAS::gradient_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
ComputationContext & context )

在文件 vector_calculus_differential.cpp 第 10 行定义.

14{
15 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
16 context.limits().max_ast_nodes, "gradient");
17 const std::string operation = "gradient";
18 auto valid = vector_calculus_validate_expr_vars(f, vars, context, operation);
19 if (!valid) {
20 return VectorCalculusFieldResult::failure(valid.error());
21 }
22 auto step = context.consume_steps(vars.size(), operation);
23 if (!step) {
24 return VectorCalculusFieldResult::failure(step.error());
25 }
26 try {
27 return vector_calculus_wrap_field(gradient_impl(f, vars, transform_budget), operation);
28 } catch (const CasError& error) {
30 } catch (const std::bad_alloc&) {
32 "vector calculus allocation failed",
33 operation);
34 } catch (const std::length_error& error) {
35 return VectorCalculusFieldResult::failure(CasErrc::ResourceLimit, error.what(), operation);
36 } catch (const std::exception& e) {
38 }
39}

引用了 context, e(), LMCAS::Result< VectorField >::failure(), gradient_checked(), LMCAS::vector_calculus_detail::gradient_impl(), InternalInvariant, ResourceLimit, vars, LMCAS::vector_calculus_detail::vector_calculus_validate_expr_vars() , 以及 LMCAS::vector_calculus_detail::vector_calculus_wrap_field().

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

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

◆ gram_schmidt()

std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > LMCAS::gram_schmidt ( const std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > & vectors,
bool normalize )

在文件 matrix_decomposition_qr.cpp 第 148 行定义.

150 {
152 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
153 (context).limits().max_ast_nodes, "transform");
154 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> basis;
155 for (const auto& v : vectors) {
156 std::vector<std::shared_ptr<SymbolicExpr>> u = v;
157 for (const auto& b : basis) {
158 auto vb = SymbolicExpr::number(0);
159 auto bb = SymbolicExpr::number(0);
160 for (size_t k = 0; k < u.size(); ++k) {
161 vb = SymbolicExpr::add(vb, SymbolicExpr::multiply(v[k], b[k]));
162 bb = SymbolicExpr::add(bb, SymbolicExpr::multiply(b[k], b[k]));
163 }
164 if (LMCAS::detail::node(bb) && LMCAS::detail::node(bb)->is_zero()) continue;
165 auto coeff = SymbolicExpr::divide(vb, bb);
166 for (size_t k = 0; k < u.size(); ++k) {
168 SymbolicExpr::multiply(SymbolicExpr::number(-1),
169 SymbolicExpr::multiply(coeff, b[k])))), transform_budget));
170 }
171 }
172 auto norm_sq = SymbolicExpr::number(0);
173 for (auto& x : u) norm_sq = SymbolicExpr::add(norm_sq, SymbolicExpr::multiply(x, x));
174 norm_sq = detail::make_expression_ptr(detail::normalize_node(detail::node(norm_sq), transform_budget));
175 if (LMCAS::detail::node(norm_sq) && LMCAS::detail::node(norm_sq)->is_zero()) continue;
176 basis.push_back(u);
177 }
178 if (normalize) {
179 for (auto& u : basis) {
180 auto norm_sq = SymbolicExpr::number(0);
181 for (auto& x : u) norm_sq = SymbolicExpr::add(norm_sq, SymbolicExpr::multiply(x, x));
182 auto norm = SymbolicExpr::sqrt(norm_sq);
183 for (auto& x : u) x = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(x, norm)), transform_budget));
184 }
185 }
186 return basis;
187}
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string & v
const std::vector< FGLMPoly > & basis
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & u

引用了 b, basis, context, gram_schmidt(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), u , 以及 v.

被这些函数引用 gram_schmidt().

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

◆ greens_theorem()

std::shared_ptr< SymbolicExpr > LMCAS::greens_theorem ( const std::shared_ptr< SymbolicExpr > & P,
const std::shared_ptr< SymbolicExpr > & Q,
const std::vector< std::string > & vars,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & x_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & y_bounds )

计算被积函数: ∂Q/∂x - ∂P/∂y

在文件 vector_calculus_integral_api.cpp 第 72 行定义.

78{
80 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
81 (context).limits().max_ast_nodes, "transform");
82 if (!P || !Q) {
83 throw std::invalid_argument("greens_theorem: P and Q must not be null");
84 }
85 if (vars.size() != 2) {
86 throw std::invalid_argument("greens_theorem: vars must have exactly 2 elements");
87 }
88 if (!x_bounds.first || !x_bounds.second ||
89 !y_bounds.first || !y_bounds.second) {
90 throw std::invalid_argument("greens_theorem: bounds must not be null");
91 }
92
93 const std::string& x_var = vars[0];
94 const std::string& y_var = vars[1];
95
96 /// 计算被积函数: ∂Q/∂x - ∂P/∂y
97 auto dQ_dx = detail::make_expression_ptr(detail::differentiate_node(detail::node(Q), x_var, transform_budget));
98 auto dP_dy = detail::make_expression_ptr(detail::differentiate_node(detail::node(P), y_var, transform_budget));
99
100 if (!dQ_dx) dQ_dx = SymbolicExpr::number(0);
101 if (!dP_dy) dP_dy = SymbolicExpr::number(0);
102
103 dQ_dx = detail::make_expression_ptr(detail::normalize_node(detail::node(dQ_dx), transform_budget));
104 dP_dy = detail::make_expression_ptr(detail::normalize_node(detail::node(dP_dy), transform_budget));
105
106 auto integrand = SymbolicExpr::add(
107 dQ_dx,
108 SymbolicExpr::multiply(SymbolicExpr::number(-1), dP_dy));
109 integrand = detail::make_expression_ptr(detail::normalize_node(detail::node(integrand), transform_budget));
110
111 Integrator integrator;
112
113 std::vector<IntegrationStep> steps = {
114 {y_var, y_bounds.first, y_bounds.second},
115 {x_var, x_bounds.first, x_bounds.second},
116 };
117 auto result = integrate_multiple_checked(*integrand, steps, integrator, context);
118 if (!result) throw result.error();
119 return LMCAS::detail::make_expression_ptr(result.value());
120}

引用了 context, LMCAS::detail::differentiate_node(), greens_theorem(), integrate_multiple_checked(), integrator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), steps, vars, x_bounds , 以及 y_bounds.

被这些函数引用 greens_theorem().

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

◆ greens_theorem_area()

std::shared_ptr< SymbolicExpr > LMCAS::greens_theorem_area ( const VectorField & parametrization,
const std::string & t,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b )

在文件 vector_calculus_integral_api.cpp 第 174 行定义.

179{
180 if (parametrization.size() != 2) {
181 throw std::invalid_argument(
182 "greens_theorem_area: parametrization must have 2 components (x(t), y(t))");
183 }
184 if (!a || !b) {
185 throw std::invalid_argument("greens_theorem_area: bounds must not be null");
186 }
187
188 auto x_t = parametrization[0];
189 auto y_t = parametrization[1];
190
191 if (!x_t || !y_t) {
192 throw std::invalid_argument("greens_theorem_area: parametrization components must not be null");
193 }
194
196 auto area = greens_theorem_area_checked(
198 if (!area && area.error().code != CasErrc::Inconclusive &&
199 area.error().code != CasErrc::UnsupportedExpression &&
200 area.error().code != CasErrc::DomainError) {
201 throw area.error();
202 }
203 return area ? std::move(area.value()) : nullptr;
204}
VectorCalculusExprResult greens_theorem_area_checked(const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)

引用了 a, b, context, DomainError, greens_theorem_area(), greens_theorem_area_checked(), Inconclusive, parametrization, t , 以及 UnsupportedExpression.

被这些函数引用 greens_theorem_area().

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

◆ greens_theorem_area_checked() [1/2]

VectorCalculusExprResult LMCAS::greens_theorem_area_checked ( const VectorField & parametrization,
const std::string & t,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b )

在文件 vector_calculus_integral_api.cpp 第 164 行定义.

引用了 a, b, context, greens_theorem_area_checked(), parametrization , 以及 t.

函数调用图:

◆ greens_theorem_area_checked() [2/2]

VectorCalculusExprResult LMCAS::greens_theorem_area_checked ( const VectorField & parametrization,
const std::string & t,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context )

在文件 vector_calculus_integral_api.cpp 第 123 行定义.

129{
130 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
131 context.limits().max_ast_nodes, "greens_theorem_area");
132 const std::string operation = "greens_theorem_area";
134 parametrization, t, a, b, context, operation);
135 if (!valid) {
136 return VectorCalculusExprResult::failure(valid.error());
137 }
138 if (parametrization.size() != 2) {
141 "Green's area parametrization must be two-dimensional",
142 operation);
143 }
144 auto step = context.consume_steps(10, operation);
145 if (!step) {
146 return VectorCalculusExprResult::failure(step.error());
147 }
148
149 try {
150 return greens_theorem_area_strict(parametrization, t, a, b, context, operation, transform_budget);
151 } catch (const CasError& error) {
153 } catch (const std::bad_alloc&) {
155 "Green's area allocation failed",
156 operation);
157 } catch (const std::length_error& error) {
158 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
159 } catch (const std::exception& e) {
161 }
162}
VectorCalculusExprResult greens_theorem_area_strict(const VectorField &parametrization, const std::string &parameter, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
Result< void > vector_calculus_validate_curve_parametrization(const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation)

引用了 a, b, context, e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), greens_theorem_area_checked(), LMCAS::vector_calculus_detail::greens_theorem_area_strict(), InternalInvariant, InvalidArgument, parametrization, ResourceLimit, t , 以及 LMCAS::vector_calculus_detail::vector_calculus_validate_curve_parametrization().

被这些函数引用 greens_theorem_area(), greens_theorem_area_checked() , 以及 greens_theorem_area_checked().

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

◆ greens_theorem_checked() [1/2]

VectorCalculusExprResult LMCAS::greens_theorem_checked ( const std::shared_ptr< SymbolicExpr > & P,
const std::shared_ptr< SymbolicExpr > & Q,
const std::vector< std::string > & vars,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & x_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & y_bounds )

在文件 vector_calculus_integral_api.cpp 第 61 行定义.

67{
70}
VectorCalculusExprResult greens_theorem_checked(const std::shared_ptr< SymbolicExpr > &P, const std::shared_ptr< SymbolicExpr > &Q, const std::vector< std::string > &vars, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &x_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &y_bounds, ComputationContext &context)

引用了 context, greens_theorem_checked(), vars, x_bounds , 以及 y_bounds.

函数调用图:

◆ greens_theorem_checked() [2/2]

VectorCalculusExprResult LMCAS::greens_theorem_checked ( const std::shared_ptr< SymbolicExpr > & P,
const std::shared_ptr< SymbolicExpr > & Q,
const std::vector< std::string > & vars,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & x_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & y_bounds,
ComputationContext & context )

在文件 vector_calculus_integral_api.cpp 第 12 行定义.

19{
20 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
21 context.limits().max_ast_nodes, "greens_theorem");
22 const std::string operation = "greens_theorem";
23 auto vars_valid = vector_calculus_validate_distinct_vars(vars, 2, context, operation);
24 if (!vars_valid) {
25 return VectorCalculusExprResult::failure(vars_valid.error());
26 }
27 if (!P || !LMCAS::detail::node(P) || !Q || !LMCAS::detail::node(Q)) {
30 "Green's theorem vector-field components cannot be null",
31 operation);
32 }
33 auto x_valid = vector_calculus_validate_bound_pair(x_bounds, context, operation, "x");
34 if (!x_valid) {
35 return VectorCalculusExprResult::failure(x_valid.error());
36 }
37 auto y_valid = vector_calculus_validate_bound_pair(y_bounds, context, operation, "y");
38 if (!y_valid) {
39 return VectorCalculusExprResult::failure(y_valid.error());
40 }
41 auto step = context.consume_steps(10, operation);
42 if (!step) {
43 return VectorCalculusExprResult::failure(step.error());
44 }
45
46 try {
47 return greens_theorem_strict(P, Q, vars, x_bounds, y_bounds, context, operation, transform_budget);
48 } catch (const CasError& error) {
50 } catch (const std::bad_alloc&) {
52 "Green's theorem allocation failed",
53 operation);
54 } catch (const std::length_error& error) {
55 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
56 } catch (const std::exception& e) {
58 }
59}
VectorCalculusExprResult greens_theorem_strict(const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::vector< std::string > &variables, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &x_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &y_bounds, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)

引用了 context, e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), greens_theorem_checked(), LMCAS::vector_calculus_detail::greens_theorem_strict(), InternalInvariant, InvalidArgument, LMCAS::detail::node(), ResourceLimit, vars, LMCAS::vector_calculus_detail::vector_calculus_validate_bound_pair(), LMCAS::vector_calculus_detail::vector_calculus_validate_distinct_vars(), x_bounds , 以及 y_bounds.

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

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

◆ grevlex_to_lex()

std::vector< FGLMPoly > LMCAS::grevlex_to_lex ( const std::vector< FGLMPoly > & grevlex_basis,
size_t num_vars )

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

134 {
135 return fglm_convert(grevlex_basis, MonomialOrder::grevlex(),
136 MonomialOrder::lex(), num_vars);
137}
static MonomialOrder lex()
创建字典序
static MonomialOrder grevlex()
创建分次逆字典序
std::vector< FGLMPoly > fglm_convert(const std::vector< FGLMPoly > &source_basis, const MonomialOrder &source_order, const MonomialOrder &target_order, size_t num_vars)

引用了 fglm_convert(), LMCAS::MonomialOrder::grevlex(), grevlex_to_lex() , 以及 LMCAS::MonomialOrder::lex().

被这些函数引用 grevlex_to_lex().

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

◆ gt()

ExprResult LMCAS::gt ( const ExprPtr & lhs,
const ExprPtr & rhs )

在文件 expr_facade.cpp 第 205 行定义.

205 {
206 return relation(lhs, rhs, RelationOp::GT);
207}

引用了 GT, gt(), relation() , 以及 rhs.

被这些函数引用 LMCAS::InferenceEngine::Impl::accumulate_sum_relation_sign(), gt() , 以及 LMCAS::InferenceEngine::Impl::product_relation_sign().

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

◆ has_nonzero_forcing()

bool LMCAS::has_nonzero_forcing ( const std::shared_ptr< SymbolicExpr > & forcing)
static

在文件 ode_linear.cpp 第 71 行定义.

71 {
72 return forcing && LMCAS::detail::node(forcing) && !forcing->is_zero();
73}

引用了 has_nonzero_forcing() , 以及 LMCAS::detail::node().

被这些函数引用 has_nonzero_forcing(), solve_euler_ode_checked(), solve_euler_ode_impl(), solve_higher_order_ode_checked() , 以及 solve_higher_order_ode_impl().

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

◆ has_oblique_asymptote()

bool LMCAS::has_oblique_asymptote ( const AsymptoteResult & result,
const std::shared_ptr< SymbolicExpr > & slope,
const std::shared_ptr< SymbolicExpr > & intercept )
static

在文件 calculus_asymptotes.cpp 第 258 行定义.

261{
262 for (const auto& entry : result.oblique) {
263 if (calculus_utils_expr_equal(entry.first, slope) &&
264 calculus_utils_expr_equal(entry.second, intercept)) {
265 return true;
266 }
267 }
268 return false;
269}

引用了 LMCAS::calculus_utils_detail::calculus_utils_expr_equal(), has_oblique_asymptote() , 以及 LMCAS::AsymptoteResult::oblique.

被这些函数引用 collect_oblique_asymptote() , 以及 has_oblique_asymptote().

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

◆ hash_combine()

void LMCAS::hash_combine ( std::size_t & seed,
std::size_t value )
inline

将一个哈希值混合到种子中,用于组合多个字段的哈希.

参数
seed当前哈希种子,混合后就地更新
value要混合的哈希值

在文件 base.hpp 第 144 行定义.

144 {
145 seed ^= value + 0x9e3779b9 + (seed << 6) + (seed >> 2);
146}

引用了 hash_combine() , 以及 value.

被这些函数引用 LMCAS::AddNode::compute_hash(), LMCAS::ComplexNode::compute_hash(), LMCAS::FiniteSetNode::compute_hash(), LMCAS::FunctionNode::compute_hash(), LMCAS::IntegralNode::compute_hash(), LMCAS::IntervalNode::compute_hash(), LMCAS::LimitNode::compute_hash(), LMCAS::LogicalNode::compute_hash(), LMCAS::MatrixNode::compute_hash(), LMCAS::MembershipNode::compute_hash(), LMCAS::MultiplyNode::compute_hash(), LMCAS::PiecewiseNode::compute_hash(), LMCAS::PowerNode::compute_hash(), LMCAS::ProductNode::compute_hash(), LMCAS::QuantifierNode::compute_hash(), LMCAS::QuantityNode::compute_hash(), LMCAS::RelationalNode::compute_hash(), LMCAS::RootOfNode::compute_hash(), LMCAS::SetBuilderNode::compute_hash(), LMCAS::SummationNode::compute_hash(), LMCAS::TransformNode::compute_hash(), LMCAS::UninterpretedFunctionNode::compute_hash(), LMCAS::VariableNode::compute_hash() , 以及 hash_combine().

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

◆ hensel_lift_checked()

HenselLiftResult LMCAS::hensel_lift_checked ( const Polynomial< BigInt > & poly,
const std::vector< Polynomial< ModInt > > & mod_factors,
int64_t prime,
int lift_bound )

Hensel 提升:将模 p 因子提升到 mod p^k.

将 Berlekamp 分解得到的模 p 不可约因子通过二次 Hensel 提升 升至 mod p^k,其中 k 由 Mignotte 界确定.

流程:

  1. 将 Polynomial<ModInt> 因子转换为 vector<BigInt> 内部表示
  2. 调用 hl_multi_factor_lift 执行多因子提升
  3. 将结果转换回 Polynomial<BigInt>
参数
[in]poly整系数多项式
[in]mod_factors模 p 下的不可约因子
[in]prime素数 p
[in]lift_bound提升次数上界 k(若为 0 则自动计算)
返回
提升后的整系数因子列表(系数在对称表示 [-p^k/2, p^k/2] 下)

将原始多项式转换为系数向量

将 Polynomial<ModInt> 因子转换为 vector<BigInt> 表示

若调用方未指定提升界,则自动计算

执行多因子 Hensel 提升

将结果转换回 Polynomial<BigInt>

在文件 hensel_lift.cpp 第 695 行定义.

699 {
700 constexpr const char* operation = "hensel_lift";
701
702 /// 将原始多项式转换为系数向量
703 std::vector<BigInt> f_vec = poly.coeffs;
704
705 /// 将 Polynomial<ModInt> 因子转换为 vector<BigInt> 表示
706 std::vector<std::vector<BigInt>> factor_vecs;
707 factor_vecs.reserve(mod_factors.size());
708 for (const auto& mf : mod_factors) {
709 std::vector<BigInt> fv;
710 fv.reserve(mf.coeffs.size());
711 for (const auto& c : mf.coeffs) {
712 fv.push_back(BigInt(static_cast<std::int64_t>(c.value())));
713 }
714 factor_vecs.push_back(std::move(fv));
715 }
716
717 auto valid = hl_validate_lift_inputs(poly, factor_vecs, prime);
718 if (!valid) return HenselLiftResult::failure(valid.error());
719
720 /// 若调用方未指定提升界,则自动计算
721 int k = lift_bound;
722 if (k <= 0) {
723 k = hl_compute_lift_height(poly, prime);
724 }
725
726 /// 执行多因子 Hensel 提升
727 std::vector<std::vector<BigInt>> lifted_vecs;
728 try {
729 lifted_vecs = hl_multi_factor_lift(f_vec, factor_vecs, prime, k);
730 } catch (const std::exception& ex) {
732 ex.what(),
733 operation);
734 }
735
736 /// 将结果转换回 Polynomial<BigInt>
737 std::vector<Polynomial<BigInt>> result;
738 result.reserve(lifted_vecs.size());
739 for (auto& lv : lifted_vecs) {
740 result.emplace_back(std::move(lv), poly.variable_name);
741 }
742
743 return HenselLiftResult::success(std::move(result));
744}
static int hl_compute_lift_height(const Polynomial< BigInt > &poly, int64_t prime)
计算 Hensel 提升所需的高度 k.
static Result< void > hl_validate_lift_inputs(const Polynomial< BigInt > &poly, const std::vector< std::vector< BigInt > > &factor_vecs, int64_t prime)
static std::vector< std::vector< BigInt > > hl_multi_factor_lift(const std::vector< BigInt > &f, const std::vector< std::vector< BigInt > > &factors, int64_t prime, int target_k)
多因子 Hensel 提升:将 k 个模 p 因子同时提升到 mod p^target_k.
const std::vector< Polynomial< ModInt > > & mod_factors
const std::vector< Polynomial< ModInt > > int64_t int lift_bound

引用了 c, LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::Result< std::vector< Polynomial< BigInt > > >::failure(), hensel_lift_checked(), hl_compute_lift_height(), hl_multi_factor_lift(), hl_validate_lift_inputs(), InternalInvariant, lift_bound, mod_factors, prime, LMCAS::Result< std::vector< Polynomial< BigInt > > >::success() , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 LMCAS::anonymous_namespace{univariate_factor_bridge.cpp}::bridge_lift_and_combine() , 以及 hensel_lift_checked().

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

◆ hessian()

std::shared_ptr< SymbolicExpr > LMCAS::hessian ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars )

在文件 vector_calculus_matrices.cpp 第 164 行定义.

166{
168 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
169 context.limits().max_ast_nodes, "hessian");
170 return hessian_impl(f, vars, transform_budget);
171}

引用了 context, hessian(), LMCAS::vector_calculus_detail::hessian_impl() , 以及 vars.

被这些函数引用 hessian().

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

◆ hessian_checked() [1/2]

VectorCalculusExprResult LMCAS::hessian_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars )

在文件 vector_calculus_matrices.cpp 第 111 行定义.

114{
116 return hessian_checked(f, vars, context);
117}
VectorCalculusExprResult hessian_checked(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context)

引用了 context, hessian_checked() , 以及 vars.

函数调用图:

◆ hessian_checked() [2/2]

VectorCalculusExprResult LMCAS::hessian_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
ComputationContext & context )

在文件 vector_calculus_matrices.cpp 第 80 行定义.

84{
85 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
86 context.limits().max_ast_nodes, "hessian");
87 const std::string operation = "hessian";
88 auto valid = vector_calculus_validate_expr_vars(f, vars, context, operation);
89 if (!valid) {
90 return VectorCalculusExprResult::failure(valid.error());
91 }
92 auto step = context.consume_steps(vars.size() * vars.size(), operation);
93 if (!step) {
94 return VectorCalculusExprResult::failure(step.error());
95 }
96 try {
97 return vector_calculus_wrap_expr(hessian_impl(f, vars, transform_budget), operation);
98 } catch (const CasError& error) {
100 } catch (const std::bad_alloc&) {
102 "vector calculus allocation failed",
103 operation);
104 } catch (const std::length_error& error) {
105 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
106 } catch (const std::exception& e) {
108 }
109}

引用了 context, e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), hessian_checked(), LMCAS::vector_calculus_detail::hessian_impl(), InternalInvariant, ResourceLimit, vars, LMCAS::vector_calculus_detail::vector_calculus_validate_expr_vars() , 以及 LMCAS::vector_calculus_detail::vector_calculus_wrap_expr().

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

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

◆ hl_binomial()

BigInt LMCAS::hl_binomial ( int n,
int k )
static

计算二项式系数 C(n, k).

使用乘法公式 C(n, k) = n! / (k! * (n-k)!) 逐步计算; BigInt 承载全部中间结果,k = min(k, n-k) 缩短迭代路径.

参数
[in]n上标(非负整数)
[in]k下标(0 <= k <= n)
返回
C(n, k) 的精确值

利用对称性 C(n, k) = C(n, n-k)

在文件 hensel_lift.cpp 第 39 行定义.

39 {
40 if (k < 0 || k > n) return BigInt(0);
41 if (k == 0 || k == n) return BigInt(1);
42
43 /// 利用对称性 C(n, k) = C(n, n-k)
44 if (k > n - k) {
45 k = n - k;
46 }
47
48 BigInt result(1);
49 for (int i = 0; i < k; ++i) {
50 result = result * BigInt(n - i);
51 result = result / BigInt(i + 1);
52 }
53 return result;
54}

引用了 hl_binomial().

被这些函数引用 hl_binomial() , 以及 hl_mignotte_bound().

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

◆ hl_coeff_vectors_equal()

bool LMCAS::hl_coeff_vectors_equal ( std::vector< BigInt > left,
std::vector< BigInt > right )
static

在文件 hensel_lift.cpp 第 367 行定义.

368 {
369 while (!left.empty() && left.back().is_zero()) left.pop_back();
370 while (!right.empty() && right.back().is_zero()) right.pop_back();
371 const std::size_t size = std::max(left.size(), right.size());
372 left.resize(size, BigInt(0));
373 right.resize(size, BigInt(0));
374 return left == right;
375}

引用了 hl_coeff_vectors_equal() , 以及 right.

被这些函数引用 hl_coeff_vectors_equal() , 以及 hl_validate_lift_inputs().

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

◆ hl_compute_lift_height()

int LMCAS::hl_compute_lift_height ( const Polynomial< BigInt > & poly,
int64_t prime )
static

计算 Hensel 提升所需的高度 k.

提升高度 k 需满足 p^k > 2 * B * |lc(f)|,其中:

  • B 为 Mignotte 界
  • lc(f) 为多项式首项系数
  • p 为选定的素数

通过连续乘以 p 直至超过阈值确定 k,使界计算保持在整数域内.

参数
[in]poly整系数多项式(非零,次数 >= 1)
[in]prime选定的素数 p
返回
所需的提升高度 k(正整数)

阈值 threshold = 2 * B * |lc(f)|

计算最小 k 使得 p^k > threshold

至少提升 1 次

在文件 hensel_lift.cpp 第 129 行定义.

129 {
130 if (poly.is_zero() || poly.degree() <= 0) return 1;
131
132 BigInt B = hl_mignotte_bound(poly);
133 BigInt lc = poly.lead_coeff().abs();
134
135 /// 阈值 threshold = 2 * B * |lc(f)|
136 BigInt threshold = BigInt(2) * B * lc;
137
138 /// 计算最小 k 使得 p^k > threshold
139 BigInt p_power(1);
140 BigInt big_p(static_cast<std::int64_t>(prime));
141 int k = 0;
142
143 while (p_power <= threshold) {
144 p_power = p_power * big_p;
145 k++;
146 }
147
148 /// 至少提升 1 次
149 if (k < 1) k = 1;
150
151 return k;
152}
static BigInt hl_mignotte_bound(const Polynomial< BigInt > &poly)
计算多项式的 Mignotte 界.

引用了 LMCAS::Polynomial< CoeffType >::degree(), hl_compute_lift_height(), hl_mignotte_bound(), LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::Polynomial< CoeffType >::lead_coeff() , 以及 prime.

被这些函数引用 hensel_lift_checked() , 以及 hl_compute_lift_height().

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

◆ hl_extended_gcd_poly()

std::pair< std::vector< BigInt >, std::vector< BigInt > > LMCAS::hl_extended_gcd_poly ( const std::vector< BigInt > & g,
const std::vector< BigInt > & h,
const BigInt & m )
static

计算两个多项式在模 m 下的扩展 GCD 的 Bezout 系数.

给定互素多项式 g, h(mod m),求 s, t 使得 s*g + t*h == 1 (mod m), 且 deg(s) < deg(h), deg(t) < deg(g).

使用扩展欧几里得算法在 Z/mZ[x] 上运算.

参数
[in]g第一个多项式系数向量
[in]h第二个多项式系数向量
[in]m模数
返回
pair(s, t) 满足 s*g + t*h == 1 (mod m)

扩展欧几里得算法:r0 = g, r1 = h s0*g + t0*h = r0, s1*g + t1*h = r1

r_new = r0 - q*r1

s_new = s0 - q*s1

t_new = t0 - q*t1

r0 = gcd,应为常数(可逆元) 归一化使 gcd = 1

去除高次零系数

在文件 hensel_lift.cpp 第 526 行定义.

528 {
529 /// 扩展欧几里得算法:r0 = g, r1 = h
530 /// s0*g + t0*h = r0, s1*g + t1*h = r1
531 std::vector<BigInt> r0 = g, r1 = h;
532 std::vector<BigInt> s0 = {BigInt(1)}, s1 = {}; // s0=1, s1=0
533 std::vector<BigInt> t0 = {}, t1 = {BigInt(1)}; // t0=0, t1=1
534
535 while (!r1.empty()) {
536 auto [q, r] = hl_poly_divmod(r0, r1, m);
537
538 /// r_new = r0 - q*r1
539 std::vector<BigInt> r_new = r;
540
541 /// s_new = s0 - q*s1
542 std::vector<BigInt> qs1 = hl_poly_mul_mod(q, s1, m);
543 std::vector<BigInt> s_new = hl_poly_sub_mod(s0, qs1, m);
544
545 /// t_new = t0 - q*t1
546 std::vector<BigInt> qt1 = hl_poly_mul_mod(q, t1, m);
547 std::vector<BigInt> t_new = hl_poly_sub_mod(t0, qt1, m);
548
549 r0 = r1; r1 = r_new;
550 s0 = s1; s1 = s_new;
551 t0 = t1; t1 = t_new;
552 }
553
554 /// r0 = gcd,应为常数(可逆元)
555 /// 归一化使 gcd = 1
556 if (!r0.empty() && r0[0] != BigInt(1)) {
557 BigInt inv = hl_mod_inverse(r0[0], m);
558 for (auto& c : s0) {
559 c = detail::symmetric_remainder(c * inv, m);
560 }
561 for (auto& c : t0) {
562 c = detail::symmetric_remainder(c * inv, m);
563 }
564 }
565
566 /// 去除高次零系数
567 while (!s0.empty() && s0.back().is_zero()) s0.pop_back();
568 while (!t0.empty() && t0.back().is_zero()) t0.pop_back();
569
570 return {s0, t0};
571}
BigInt symmetric_remainder(const BigInt &value, const BigInt &modulus)
static std::vector< BigInt > hl_poly_sub_mod(const std::vector< BigInt > &a, const std::vector< BigInt > &b, const BigInt &m)
多项式减法(BigInt 系数),结果模 m 归约.
static BigInt hl_mod_inverse(const BigInt &a, const BigInt &m)
计算 BigInt 在模 m 下的乘法逆元.
static std::pair< std::vector< BigInt >, std::vector< BigInt > > hl_poly_divmod(const std::vector< BigInt > &a, const std::vector< BigInt > &b, const BigInt &m)
多项式带余除法(BigInt 系数),模 m 下运算.
static std::vector< BigInt > hl_poly_mul_mod(const std::vector< BigInt > &a, const std::vector< BigInt > &b, const BigInt &m)
多项式乘法(BigInt 系数),结果模 m 归约.

引用了 c, hl_extended_gcd_poly(), hl_mod_inverse(), hl_poly_divmod(), hl_poly_mul_mod(), hl_poly_sub_mod(), r , 以及 LMCAS::detail::symmetric_remainder().

被这些函数引用 hl_extended_gcd_poly() , 以及 hl_multi_factor_lift().

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

◆ hl_is_prime()

bool LMCAS::hl_is_prime ( int64_t value)
static

在文件 hensel_lift.cpp 第 357 行定义.

357 {
358 if (value < 2) return false;
359 if (value == 2) return true;
360 if (value % 2 == 0) return false;
361 for (int64_t divisor = 3; divisor <= value / divisor; divisor += 2) {
362 if (value % divisor == 0) return false;
363 }
364 return true;
365}

引用了 hl_is_prime() , 以及 value.

被这些函数引用 hl_is_prime() , 以及 hl_validate_lift_inputs().

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

◆ hl_l2_norm_squared()

BigInt LMCAS::hl_l2_norm_squared ( const Polynomial< BigInt > & poly)
static

计算多项式系数的 L2 范数的平方.

即 ||f||_2^2 = sum(a_i^2),其中 a_i 为多项式各项系数.

参数
[in]poly整系数多项式
返回
系数平方和(BigInt 精确值)

在文件 hensel_lift.cpp 第 65 行定义.

65 {
66 BigInt sum(0);
67 for (const auto& c : poly.coeffs) {
68 sum = sum + c * c;
69 }
70 return sum;
71}

引用了 c, LMCAS::Polynomial< CoeffType >::coeffs , 以及 hl_l2_norm_squared().

被这些函数引用 hl_l2_norm_squared() , 以及 hl_mignotte_bound().

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

◆ hl_mignotte_bound()

BigInt LMCAS::hl_mignotte_bound ( const Polynomial< BigInt > & poly)
static

计算多项式的 Mignotte 界.

对于次数为 n 的多项式 f(x),其任意因子的系数绝对值上界为: B = C(n, floor(n/2)) * ||f||_2

其中 C(n, k) 为二项式系数,||f||_2 为系数向量的 L2 范数.

实现使用 B^2 = C(n, floor(n/2))^2 * ||f||_2^2 在整数域内计算, 最后由 BigInt::sqrt() 求向上取整的整数平方根.

参数
[in]poly整系数多项式(非零,次数 >= 1)
返回
Mignotte 界 B
参见
Mignotte, M. "An inequality about factors of polynomials." Mathematics of Computation, 28(128), 1974.

C(n, floor(n/2))

||f||_2^2

B^2 = binom^2 * norm_sq

B = ceil(sqrt(B^2)) BigInt::sqrt() 返回 floor(sqrt(x)),需要检查是否精确

在文件 hensel_lift.cpp 第 91 行定义.

91 {
92 int n = poly.degree();
93 if (n <= 0) return BigInt(1);
94
95 /// C(n, floor(n/2))
96 BigInt binom = hl_binomial(n, n / 2);
97
98 /// ||f||_2^2
99 BigInt norm_sq = hl_l2_norm_squared(poly);
100
101 /// B^2 = binom^2 * norm_sq
102 BigInt b_squared = binom * binom * norm_sq;
103
104 /// B = ceil(sqrt(B^2))
105 /// BigInt::sqrt() 返回 floor(sqrt(x)),需要检查是否精确
106 BigInt b = b_squared.sqrt();
107 if (b * b < b_squared) {
108 b = b + BigInt(1);
109 }
110
111 return b;
112}
static BigInt hl_binomial(int n, int k)
计算二项式系数 C(n, k).
static BigInt hl_l2_norm_squared(const Polynomial< BigInt > &poly)
计算多项式系数的 L2 范数的平方.

引用了 b, LMCAS::Polynomial< CoeffType >::degree(), hl_binomial(), hl_l2_norm_squared() , 以及 hl_mignotte_bound().

被这些函数引用 hl_compute_lift_height() , 以及 hl_mignotte_bound().

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

◆ hl_mod_inverse()

BigInt LMCAS::hl_mod_inverse ( const BigInt & a,
const BigInt & m )
static

计算 BigInt 在模 m 下的乘法逆元.

使用扩展欧几里得算法求 a 在 Z/mZ 中的逆元. 要求 gcd(a, m) = 1.

参数
[in]a待求逆的整数
[in]m模数
返回
a 的模逆元,归约到 [0, m)
异常
std::domain_error若 a 不可逆

扩展欧几里得:求 s 使得 a*s == 1 (mod m)

r0 应为 gcd(a, m) = 1

若 gcd 为 -1,调整符号

在文件 hensel_lift.cpp 第 267 行定义.

267 {
268 /// 扩展欧几里得:求 s 使得 a*s == 1 (mod m)
269 BigInt r0 = m, r1 = a % m;
270 if (r1.is_negative()) r1 = r1 + m;
271
272 BigInt s0(0), s1(1);
273
274 while (!r1.is_zero()) {
275 BigInt q = r0 / r1;
276 BigInt r_new = r0 - q * r1;
277 BigInt s_new = s0 - q * s1;
278
279 r0 = r1;
280 r1 = r_new;
281 s0 = s1;
282 s1 = s_new;
283 }
284
285 /// r0 应为 gcd(a, m) = 1
286 if (r0 != BigInt(1) && r0 != BigInt(-1)) {
287 throw std::domain_error("hl_mod_inverse: element not invertible");
288 }
289
290 /// 若 gcd 为 -1,调整符号
291 if (r0.is_negative()) {
292 s0 = s0.negate();
293 }
294
295 BigInt result = s0 % m;
296 if (result.is_negative()) result = result + m;
297 return result;
298}

引用了 a , 以及 hl_mod_inverse().

被这些函数引用 hl_extended_gcd_poly(), hl_mod_inverse() , 以及 hl_poly_divmod().

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

◆ hl_multi_factor_lift()

std::vector< std::vector< BigInt > > LMCAS::hl_multi_factor_lift ( const std::vector< BigInt > & f,
const std::vector< std::vector< BigInt > > & factors,
int64_t prime,
int target_k )
static

多因子 Hensel 提升:将 k 个模 p 因子同时提升到 mod p^target_k.

使用顺序剥离策略:

  1. 将 f 分解为 g_1 和 h_1 = g_2*g₃*...*gₖ
  2. 对 (g_1, h_1) 执行二因子提升
  3. 递归对 h_1 继续剥离下一个因子

每步提升通过反复调用 hl_two_factor_lift 实现二次提升(mod p -> p^2 -> p^4 -> ...), 直到模数达到或超过 p^target_k.

参数
[in]f原始多项式系数向量(升幂排列)
[in]factors模 p 下的因子列表(各因子系数向量)
[in]prime素数 p
[in]target_k目标提升高度(提升到 mod p^target_k)
返回
提升后的因子列表(各因子系数在对称表示下)
前置条件
f == factors[0] * factors[1] * ... * factors[k-1] (mod p)
各因子两两互素 (mod p)
参见
Zassenhaus, H. "On Hensel factorization, I." Journal of Number Theory, 1(3), 1969.

单因子:直接归约到目标模数

计算目标模数 p^target_k

顺序剥离策略:逐个提升因子

当前待分解的多项式(初始为 f)

剩余因子列表

取出第一个因子 g

计算 h = 剩余因子的乘积 (mod p)

计算 Bezout 系数 s, t 使得 s*g + t*h == 1 (mod p)

构造初始提升状态

反复二次提升直到模数 >= target_mod

提取提升后的 g(已提升到 target_mod)

更新 remaining 为提升后的 h

更新 remaining_factors:去掉第一个,后续因子保持不变

最后一个因子就是 remaining

在文件 hensel_lift.cpp 第 597 行定义.

601 {
602
603 if (factors.empty()) return {};
604 if (factors.size() == 1) {
605 /// 单因子:直接归约到目标模数
606 BigInt target_mod(1);
607 BigInt big_p(static_cast<std::int64_t>(prime));
608 for (int i = 0; i < target_k; ++i) {
609 target_mod = target_mod * big_p;
610 }
611 std::vector<BigInt> result = f;
612 hl_reduce_coeffs(result, target_mod);
613 return {result};
614 }
615
616 BigInt big_p(static_cast<std::int64_t>(prime));
617 BigInt initial_mod(static_cast<std::int64_t>(prime));
618
619 /// 计算目标模数 p^target_k
620 BigInt target_mod(1);
621 for (int i = 0; i < target_k; ++i) {
622 target_mod = target_mod * big_p;
623 }
624
625 /// 顺序剥离策略:逐个提升因子
626 std::vector<std::vector<BigInt>> lifted_factors;
627 lifted_factors.reserve(factors.size());
628
629 /// 当前待分解的多项式(初始为 f)
630 std::vector<BigInt> remaining = f;
631 hl_reduce_coeffs(remaining, target_mod);
632
633 /// 剩余因子列表
634 std::vector<std::vector<BigInt>> remaining_factors = factors;
635
636 for (size_t i = 0; i < factors.size() - 1; ++i) {
637 /// 取出第一个因子 g
638 std::vector<BigInt> g = remaining_factors[0];
639
640 /// 计算 h = 剩余因子的乘积 (mod p)
641 std::vector<BigInt> h = remaining_factors[1];
642 for (size_t j = 2; j < remaining_factors.size(); ++j) {
643 h = hl_poly_mul_mod(h, remaining_factors[j], initial_mod);
644 }
645
646 /// 计算 Bezout 系数 s, t 使得 s*g + t*h == 1 (mod p)
647 auto [s, t] = hl_extended_gcd_poly(g, h, initial_mod);
648
649 /// 构造初始提升状态
650 HenselLiftPair state{g, h, s, t, initial_mod};
651
652 /// 反复二次提升直到模数 >= target_mod
653 while (state.modulus < target_mod) {
654 state = hl_two_factor_lift(remaining, state);
655 }
656
657 /// 提取提升后的 g(已提升到 target_mod)
658 std::vector<BigInt> lifted_g = state.g;
659 hl_reduce_coeffs(lifted_g, target_mod);
660 lifted_factors.push_back(lifted_g);
661
662 /// 更新 remaining 为提升后的 h
663 remaining = state.h;
664 hl_reduce_coeffs(remaining, target_mod);
665
666 /// 更新 remaining_factors:去掉第一个,后续因子保持不变
667 remaining_factors.erase(remaining_factors.begin());
668 }
669
670 /// 最后一个因子就是 remaining
671 hl_reduce_coeffs(remaining, target_mod);
672 lifted_factors.push_back(remaining);
673
674 return lifted_factors;
675}
std::vector< BigInt > g
第一个因子的系数。
static void hl_reduce_coeffs(std::vector< BigInt > &poly, const BigInt &m)
对多项式系数向量执行模归约(对称表示).
const std::vector< Polynomial< BigInt > > & lifted_factors
static std::pair< std::vector< BigInt >, std::vector< BigInt > > hl_extended_gcd_poly(const std::vector< BigInt > &g, const std::vector< BigInt > &h, const BigInt &m)
计算两个多项式在模 m 下的扩展 GCD 的 Bezout 系数.
HenselLiftPair hl_two_factor_lift(const std::vector< BigInt > &f, const HenselLiftPair &current)
执行一步二次 Hensel 提升:mod m -> mod m^2.
二因子二次 Hensel 提升的状态结构.

引用了 LMCAS::HenselLiftPair::g, LMCAS::HenselLiftPair::h, hl_extended_gcd_poly(), hl_multi_factor_lift(), hl_poly_mul_mod(), hl_reduce_coeffs(), hl_two_factor_lift(), lifted_factors, LMCAS::HenselLiftPair::modulus, prime , 以及 t.

被这些函数引用 hensel_lift_checked() , 以及 hl_multi_factor_lift().

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

◆ hl_poly_add_mod()

std::vector< BigInt > LMCAS::hl_poly_add_mod ( const std::vector< BigInt > & a,
const std::vector< BigInt > & b,
const BigInt & m )
static

多项式加法(BigInt 系数),结果模 m 归约.

参数
[in]a第一个多项式系数向量
[in]b第二个多项式系数向量
[in]m模数
返回
和多项式的系数向量

在文件 hensel_lift.cpp 第 239 行定义.

241 {
242 size_t n = std::max(a.size(), b.size());
243 std::vector<BigInt> result(n, BigInt(0));
244
245 for (size_t i = 0; i < n; ++i) {
246 BigInt ai = (i < a.size()) ? a[i] : BigInt(0);
247 BigInt bi = (i < b.size()) ? b[i] : BigInt(0);
248 result[i] = ai + bi;
249 }
250
251 hl_reduce_coeffs(result, m);
252 return result;
253}

引用了 a, b, hl_poly_add_mod() , 以及 hl_reduce_coeffs().

被这些函数引用 hl_poly_add_mod() , 以及 hl_two_factor_lift().

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

◆ hl_poly_divmod()

std::pair< std::vector< BigInt >, std::vector< BigInt > > LMCAS::hl_poly_divmod ( const std::vector< BigInt > & a,
const std::vector< BigInt > & b,
const BigInt & m )
static

多项式带余除法(BigInt 系数),模 m 下运算.

计算 a(x) = q(x) * b(x) + r(x),其中 deg(r) < deg(b). 要求 b 的首项系数在 Z/mZ 中可逆. 所有系数归约到对称表示.

参数
[in]a被除数多项式系数向量
[in]b除数多项式系数向量
[in]m模数
返回
pair(商, 余数) 的系数向量

首项系数的逆元

余数截断到 deg < deg_b

在文件 hensel_lift.cpp 第 314 行定义.

316 {
317 if (b.empty()) {
318 throw std::runtime_error("hl_poly_divmod: division by zero polynomial");
319 }
320
321 int deg_a = static_cast<int>(a.size()) - 1;
322 int deg_b = static_cast<int>(b.size()) - 1;
323
324 if (deg_a < deg_b) {
325 std::vector<BigInt> r = a;
327 return {{}, r};
328 }
329
330 /// 首项系数的逆元
331 BigInt lc_inv = hl_mod_inverse(b.back(), m);
332
333 std::vector<BigInt> remainder = a;
334 std::vector<BigInt> quotient(deg_a - deg_b + 1, BigInt(0));
335
336 for (int i = deg_a; i >= deg_b; --i) {
337 BigInt coeff = detail::symmetric_remainder(remainder[i], m);
338 if (coeff.is_zero()) continue;
339
340 BigInt factor = detail::symmetric_remainder(coeff * lc_inv, m);
341 quotient[i - deg_b] = factor;
342
343 for (int j = 0; j <= deg_b; ++j) {
344 remainder[i - deg_b + j] = remainder[i - deg_b + j] - factor * b[j];
345 remainder[i - deg_b + j] =
346 detail::symmetric_remainder(remainder[i - deg_b + j], m);
347 }
348 }
349
350 /// 余数截断到 deg < deg_b
351 std::vector<BigInt> rem(remainder.begin(), remainder.begin() + deg_b);
352 hl_reduce_coeffs(quotient, m);
353 hl_reduce_coeffs(rem, m);
354 return {quotient, rem};
355}

引用了 a, b, hl_mod_inverse(), hl_poly_divmod(), hl_reduce_coeffs(), r , 以及 LMCAS::detail::symmetric_remainder().

被这些函数引用 hl_extended_gcd_poly(), hl_poly_divmod() , 以及 hl_two_factor_lift().

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

◆ hl_poly_mul_mod()

std::vector< BigInt > LMCAS::hl_poly_mul_mod ( const std::vector< BigInt > & a,
const std::vector< BigInt > & b,
const BigInt & m )
static

多项式乘法(BigInt 系数),结果模 m 归约.

计算两个系数向量表示的多项式之积,所有系数归约到对称表示 [-m/2, m/2).

参数
[in]a第一个多项式的系数向量
[in]b第二个多项式的系数向量
[in]m模数
返回
乘积多项式的系数向量

在文件 hensel_lift.cpp 第 185 行定义.

187 {
188 if (a.empty() || b.empty()) return {};
189
190 size_t n = a.size() + b.size() - 1;
191 std::vector<BigInt> result(n, BigInt(0));
192
193 for (size_t i = 0; i < a.size(); ++i) {
194 if (a[i].is_zero()) continue;
195 for (size_t j = 0; j < b.size(); ++j) {
196 if (b[j].is_zero()) continue;
197 result[i + j] = result[i + j] + a[i] * b[j];
198 }
199 }
200
201 hl_reduce_coeffs(result, m);
202 return result;
203}

引用了 a, b, hl_poly_mul_mod() , 以及 hl_reduce_coeffs().

被这些函数引用 hl_extended_gcd_poly(), hl_multi_factor_lift(), hl_poly_mul_mod(), hl_two_factor_lift() , 以及 hl_validate_lift_inputs().

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

◆ hl_poly_sub_mod()

std::vector< BigInt > LMCAS::hl_poly_sub_mod ( const std::vector< BigInt > & a,
const std::vector< BigInt > & b,
const BigInt & m )
static

多项式减法(BigInt 系数),结果模 m 归约.

参数
[in]a被减数多项式系数向量
[in]b减数多项式系数向量
[in]m模数
返回
差多项式的系数向量

在文件 hensel_lift.cpp 第 214 行定义.

216 {
217 size_t n = std::max(a.size(), b.size());
218 std::vector<BigInt> result(n, BigInt(0));
219
220 for (size_t i = 0; i < n; ++i) {
221 BigInt ai = (i < a.size()) ? a[i] : BigInt(0);
222 BigInt bi = (i < b.size()) ? b[i] : BigInt(0);
223 result[i] = ai - bi;
224 }
225
226 hl_reduce_coeffs(result, m);
227 return result;
228}

引用了 a, b, hl_poly_sub_mod() , 以及 hl_reduce_coeffs().

被这些函数引用 hl_extended_gcd_poly(), hl_poly_sub_mod() , 以及 hl_two_factor_lift().

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

◆ hl_reduce_coeffs()

void LMCAS::hl_reduce_coeffs ( std::vector< BigInt > & poly,
const BigInt & m )
static

对多项式系数向量执行模归约(对称表示).

将向量中每个系数归约到 [-m/2, m/2) 区间,并去除高次零系数.

参数
[in,out]poly系数向量(就地修改)
[in]m模数

去除高次零系数

在文件 hensel_lift.cpp 第 164 行定义.

164 {
165 for (auto& c : poly) {
167 }
168 /// 去除高次零系数
169 while (!poly.empty() && poly.back().is_zero()) {
170 poly.pop_back();
171 }
172}

引用了 c, hl_reduce_coeffs() , 以及 LMCAS::detail::symmetric_remainder().

被这些函数引用 hl_multi_factor_lift(), hl_poly_add_mod(), hl_poly_divmod(), hl_poly_mul_mod(), hl_poly_sub_mod(), hl_reduce_coeffs(), hl_two_factor_lift() , 以及 hl_validate_lift_inputs().

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

◆ hl_two_factor_lift()

HenselLiftPair LMCAS::hl_two_factor_lift ( const std::vector< BigInt > & f,
const HenselLiftPair & current )

执行一步二次 Hensel 提升:mod m -> mod m^2.

给定 f == g*h (mod m) 且 s*g + t*h == 1 (mod m), 计算 g', h', s', t' 使得 f == g'*h' (mod m^2) 且 s'*g' + t'*h' == 1 (mod m^2).

算法步骤:

  1. 计算误差 e = f - g*h(所有系数应被 m 整除)
  2. 计算修正项:(q, r) = divmod(s*e, h) over Z/m^2Z
    • h' = h + r (mod m^2)
    • g' = g + t*e + q*g (mod m^2)
  3. 更新 Bezout 系数:
    • b = s*g' + t*h' - 1 (mod m^2)
    • (c, d) = divmod(s*b, h') over Z/m^2Z
    • s' = s - d (mod m^2)
    • t' = t - t*b - c*g' (mod m^2)
参数
[in]f原始多项式系数向量
[in]current当前提升状态(g, h, s, t, modulus=m)
返回
提升后的状态(g', h', s', t', modulus=m^2)
前置条件
f == g*h (mod m)
s*g + t*h == 1 (mod m)
deg(s) < deg(h), deg(t) < deg(g)
参见
Zassenhaus, H. "On Hensel factorization, I." Journal of Number Theory, 1(3), 1969.

新模数 m^2 = m * m

步骤 1:计算误差 e = f - g*h (mod m^2)

步骤 2:计算修正项 se = s * e (mod m^2)

(q, r) = divmod(se, h) over Z/m^2Z,其中 deg(r) < deg(h)

g' = g + t*e + q*g (mod m^2)

h' = h + r (mod m^2)

步骤 3:更新 Bezout 系数 b = s*g' + t*h' - 1 (mod m^2)

减去常数 1

(c, d) = divmod(s*b, h') over Z/m^2Z

s' = s - d (mod m^2)

t' = t - t*b - c*g' (mod m^2)

在文件 hensel_lift.cpp 第 450 行定义.

452 {
453
454 const auto& g = current.g;
455 const auto& h = current.h;
456 const auto& s = current.s;
457 const auto& t = current.t;
458 const BigInt& m = current.modulus;
459
460 /// 新模数 m^2 = m * m
461 BigInt m2 = m * m;
462
463 /// 步骤 1:计算误差 e = f - g*h (mod m^2)
464 std::vector<BigInt> gh = hl_poly_mul_mod(g, h, m2);
465 std::vector<BigInt> e = hl_poly_sub_mod(f, gh, m2);
466
467 /// 步骤 2:计算修正项
468 /// se = s * e (mod m^2)
469 std::vector<BigInt> se = hl_poly_mul_mod(s, e, m2);
470
471 /// (q, r) = divmod(se, h) over Z/m^2Z,其中 deg(r) < deg(h)
472 auto [q, r] = hl_poly_divmod(se, h, m2);
473
474 /// g' = g + t*e + q*g (mod m^2)
475 std::vector<BigInt> te = hl_poly_mul_mod(t, e, m2);
476 std::vector<BigInt> qg = hl_poly_mul_mod(q, g, m2);
477 std::vector<BigInt> g_new = hl_poly_add_mod(g, hl_poly_add_mod(te, qg, m2), m2);
478 hl_reduce_coeffs(g_new, m2);
479
480 /// h' = h + r (mod m^2)
481 std::vector<BigInt> h_new = hl_poly_add_mod(h, r, m2);
482 hl_reduce_coeffs(h_new, m2);
483
484 /// 步骤 3:更新 Bezout 系数
485 /// b = s*g' + t*h' - 1 (mod m^2)
486 std::vector<BigInt> sg_new = hl_poly_mul_mod(s, g_new, m2);
487 std::vector<BigInt> th_new = hl_poly_mul_mod(t, h_new, m2);
488 std::vector<BigInt> sg_plus_th = hl_poly_add_mod(sg_new, th_new, m2);
489
490 /// 减去常数 1
491 std::vector<BigInt> one_poly = {BigInt(1)};
492 std::vector<BigInt> b = hl_poly_sub_mod(sg_plus_th, one_poly, m2);
493
494 /// (c, d) = divmod(s*b, h') over Z/m^2Z
495 std::vector<BigInt> sb = hl_poly_mul_mod(s, b, m2);
496 auto [c, d] = hl_poly_divmod(sb, h_new, m2);
497
498 /// s' = s - d (mod m^2)
499 std::vector<BigInt> s_new = hl_poly_sub_mod(s, d, m2);
500 hl_reduce_coeffs(s_new, m2);
501
502 /// t' = t - t*b - c*g' (mod m^2)
503 std::vector<BigInt> tb = hl_poly_mul_mod(t, b, m2);
504 std::vector<BigInt> cg_new = hl_poly_mul_mod(c, g_new, m2);
505 std::vector<BigInt> t_new = hl_poly_sub_mod(t, hl_poly_add_mod(tb, cg_new, m2), m2);
506 hl_reduce_coeffs(t_new, m2);
507
508 return HenselLiftPair{g_new, h_new, s_new, t_new, m2};
509}
static std::vector< BigInt > hl_poly_add_mod(const std::vector< BigInt > &a, const std::vector< BigInt > &b, const BigInt &m)
多项式加法(BigInt 系数),结果模 m 归约.
std::vector< BigInt > t
h 的 Bezout 系数。
std::vector< BigInt > h
第二个因子的系数。
std::vector< BigInt > s
g 的 Bezout 系数。

引用了 b, c, e(), LMCAS::HenselLiftPair::g, LMCAS::HenselLiftPair::h, hl_poly_add_mod(), hl_poly_divmod(), hl_poly_mul_mod(), hl_poly_sub_mod(), hl_reduce_coeffs(), hl_two_factor_lift(), LMCAS::HenselLiftPair::modulus, r, LMCAS::HenselLiftPair::s, LMCAS::HenselLiftPair::t , 以及 t.

被这些函数引用 hl_multi_factor_lift() , 以及 hl_two_factor_lift().

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

◆ hl_validate_lift_inputs()

Result< void > LMCAS::hl_validate_lift_inputs ( const Polynomial< BigInt > & poly,
const std::vector< std::vector< BigInt > > & factor_vecs,
int64_t prime )
static

在文件 hensel_lift.cpp 第 377 行定义.

380 {
381 constexpr const char* operation = "hensel_lift";
382 if (!hl_is_prime(prime)) {
384 "Hensel lifting requires a prime modulus",
385 operation);
386 }
387 if (poly.is_zero() || poly.degree() <= 0) {
389 "Hensel lifting requires a non-constant polynomial",
390 operation);
391 }
392 if (factor_vecs.empty()) {
394 "Hensel lifting requires at least one mod-p factor",
395 operation);
396 }
397 for (const auto& factor : factor_vecs) {
398 if (factor.empty()) {
400 "Hensel lifting factor cannot be zero",
401 operation);
402 }
403 }
404
405 const BigInt modulus(static_cast<std::int64_t>(prime));
406 std::vector<BigInt> product{BigInt(1)};
407 for (const auto& factor : factor_vecs) {
408 product = hl_poly_mul_mod(product, factor, modulus);
409 }
410 std::vector<BigInt> reduced_f = poly.coeffs;
411 hl_reduce_coeffs(reduced_f, modulus);
412 if (!hl_coeff_vectors_equal(product, reduced_f)) {
414 "mod-p factors do not multiply to the input polynomial",
415 operation);
416 }
417 return Result<void>::success();
418}
static bool hl_is_prime(int64_t value)
static bool hl_coeff_vectors_equal(std::vector< BigInt > left, std::vector< BigInt > right)

引用了 LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Result< T >::failure(), hl_coeff_vectors_equal(), hl_is_prime(), hl_poly_mul_mod(), hl_reduce_coeffs(), hl_validate_lift_inputs(), InvalidArgument, LMCAS::Polynomial< CoeffType >::is_zero(), prime , 以及 LMCAS::Result< T >::success().

被这些函数引用 hensel_lift_checked() , 以及 hl_validate_lift_inputs().

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

◆ imag() [1/2]

ExprResult LMCAS::imag ( const ExprPtr & expression)

在文件 expr_arithmetic.cpp 第 113 行定义.

113 {
115 return imag(expression, context);
116}

引用了 context , 以及 imag.

◆ imag() [2/2]

ExprResult LMCAS::imag ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_arithmetic.cpp 第 108 行定义.

108 {
111}
constexpr const char * kImagOperation
ExpressionResult imag_part_checked(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)

引用了 context, LMCAS::expr_detail::expr_common::expr_from_complex_result(), imag, imag_part_checked() , 以及 LMCAS::expr_detail::expr_common::kImagOperation.

函数调用图:

◆ imag_part_checked() [1/2]

ExpressionResult LMCAS::imag_part_checked ( const std::shared_ptr< SymbolicExpr > & expr)

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

565 {
567 return imag_part_checked(expr, context);
568}

引用了 context , 以及 imag_part_checked().

函数调用图:

◆ imag_part_checked() [2/2]

ExpressionResult LMCAS::imag_part_checked ( const std::shared_ptr< SymbolicExpr > & expr,
ComputationContext & context )

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

533 {
534 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
535 (context).limits().max_ast_nodes, "transform");
536 const std::string operation = "imag_part";
537 auto input = validate_complex_expr_input(expr, context, operation);
538 if (!input) return ExpressionResult::failure(input.error());
539 if (has_function_of_explicit_complex(LMCAS::detail::node(expr))) {
542 "imaginary part of functions with complex arguments is outside the current support domain",
543 operation);
544 }
545
546 std::shared_ptr<SymbolicExpr> re, im;
547 split_real_imag(LMCAS::detail::node(expr), re, im, context);
548 auto simplified = im ? detail::make_expression_ptr(detail::normalize_node(detail::node(im), transform_budget)) : nullptr;
549 if (!simplified || !LMCAS::detail::node(simplified)) {
551 "imaginary part construction failed",
552 operation);
553 }
554 return ExpressionResult::success(simplified);
555} catch (const CasError& error) {
556 return ExpressionResult::failure(error);
557} catch (const std::bad_alloc&) {
558 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "imag_part");
559} catch (const std::length_error& error) {
560 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "imag_part");
561} catch (const std::exception& error) {
562 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "imag_part");
563}

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), imag_part_checked(), Inconclusive, InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

被这些函数引用 imag(), imag_part_checked() , 以及 imag_part_checked().

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

◆ imaginary_unit()

ExprResult LMCAS::imaginary_unit ( )

在文件 expr_values.cpp 第 120 行定义.

120 {
121 auto zero = integer(0);
122 if (!zero) return ExprResult::failure(zero.error());
123 auto one = integer(1);
124 if (!one) return ExprResult::failure(one.error());
125 return complex(zero.value(), one.value());
126}

引用了 complex(), LMCAS::Result< ExprPtr >::failure(), imaginary_unit() , 以及 integer.

被这些函数引用 imaginary_unit() , 以及 LMCAS::expr_detail::ExprParser::parse_identifier_or_call().

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

◆ implicit_diff()

std::shared_ptr< SymbolicExpr > LMCAS::implicit_diff ( std::shared_ptr< SymbolicExpr > expression,
const std::string & independent_variable,
const std::string & dependent_variable )

在文件 symbolic_implicit_diff.cpp 第 6 行定义.

9 {
11 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
12 (context).limits().max_ast_nodes, "transform");
13 if (!expression || independent_variable.empty() || dependent_variable.empty()) {
14 return nullptr;
15 }
16
17 auto numerator = SymbolicExpr::multiply(
18 SymbolicExpr::number(-1),
19 detail::make_expression_ptr(detail::differentiate_node(detail::node(expression), independent_variable, transform_budget)));
20 auto denominator = detail::make_expression_ptr(detail::differentiate_node(detail::node(expression), dependent_variable, transform_budget));
21 return SymbolicExpr::divide(numerator, denominator);
22}

引用了 context, denominator, LMCAS::detail::differentiate_node(), implicit_diff(), LMCAS::detail::make_expression_ptr() , 以及 LMCAS::detail::node().

被这些函数引用 implicit_diff().

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

◆ infinity_sign()

int LMCAS::infinity_sign ( const SymbolicExpr & expression,
ComputationContext & context )
inline

在文件 inference_engine_impl.hpp 第 33 行定义.

33 {
34 const auto& node = detail::node(expression);
35 if (auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
36 return function->type() == FunctionNode::FuncType::Infinity ? 1 : 0;
37 }
38 auto product = std::dynamic_pointer_cast<const MultiplyNode>(node);
39 if (!product) {
40 return 0;
41 }
42
43 bool has_infinity = false;
44 int sign = 1;
45 for (const auto& operand : product->operands()) {
46 auto step = context.consume_steps(1, "inference.infinity");
47 if (!step) throw step.error();
48 if (auto function = std::dynamic_pointer_cast<const FunctionNode>(operand)) {
51 }
52 if (auto number = std::dynamic_pointer_cast<const NumberNode>(operand)) {
54 sign = -sign;
55 }
56 }
57 }
58 return has_infinity ? sign : 0;
59}
bool is_negative_infinity_coefficient(const NumberNode &number)

引用了 context, function(), LMCAS::FunctionNode::Infinity, infinity_sign(), is_negative_infinity_coefficient() , 以及 LMCAS::detail::node().

被这些函数引用 infinity_sign() , 以及 limit_expression_checked().

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

◆ inflection_curve_defined()

Result< bool > LMCAS::inflection_curve_defined ( const std::shared_ptr< SymbolicExpr > & f,
const std::shared_ptr< SymbolicExpr > & f_prime,
const std::shared_ptr< SymbolicExpr > & f_double_prime,
const std::shared_ptr< SymbolicExpr > & point,
const std::string & var,
const FactsQuery & facts,
const std::string & operation,
ComputationContext & context )
static

在文件 calculus_curvature.cpp 第 173 行定义.

178 {
179 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
180 (context).limits().max_ast_nodes, "transform");
182 auto first = detail::make_expression_ptr(detail::substitute_node(detail::node(f_prime), var, detail::node(point), transform_budget));
183 auto second = detail::make_expression_ptr(detail::substitute_node(detail::node(f_double_prime), var, detail::node(point), transform_budget));
184 for (const auto& expression : {value, first, second}) {
185 auto defined = detail::query_definedness(detail::node(expression), facts, Domain::Real, context);
186 if (!defined) { return Result<bool>::failure(defined.error()); }
187 if (defined.value() == Tribool::False) { return false; }
188 auto real_value = detail::query_real_value(detail::node(expression), facts, context);
189 if (!real_value) { return Result<bool>::failure(real_value.error()); }
190 if (real_value.value() == Tribool::False) { return false; }
191 if (defined.value() != Tribool::True || real_value.value() != Tribool::True) {
193 "real curve domain at an inflection candidate is unproved",
194 operation);
195 }
196 }
197 return true;
198} catch (const CasError& error) {
199 return Result<bool>::failure(error);
200} catch (const std::bad_alloc&) {
201 return Result<bool>::failure(CasErrc::ResourceLimit, "allocation failed", operation);
202} catch (const std::length_error& error) {
203 return Result<bool>::failure(CasErrc::ResourceLimit, error.what(), operation);
204} catch (const std::exception& error) {
205 return Result<bool>::failure(CasErrc::InternalInvariant, error.what(), operation);
206}
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)

引用了 context, LMCAS::Result< T >::failure(), False, Inconclusive, inflection_curve_defined(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), point, LMCAS::detail::query_definedness(), LMCAS::detail::query_real_value(), Real, LMCAS::detail::substitute_node(), True , 以及 value.

被这些函数引用 classify_inflection_candidates() , 以及 inflection_curve_defined().

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

◆ inflection_points_checked() [1/2]

SymbolicExprVectorResult LMCAS::inflection_points_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var )

在文件 calculus_curvature.cpp 第 298 行定义.

300{
302 return inflection_points_checked(f, var, context);
303}
SymbolicExprVectorResult inflection_points_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, ComputationContext &context)

引用了 context , 以及 inflection_points_checked().

函数调用图:

◆ inflection_points_checked() [2/2]

SymbolicExprVectorResult LMCAS::inflection_points_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
ComputationContext & context )

在文件 calculus_curvature.cpp 第 238 行定义.

241 {
242 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
243 (context).limits().max_ast_nodes, "transform");
244 const std::string operation = "inflection_points";
245 auto input = calculus_utils_validate_expr(f, var, context, operation);
246 if (!input) {
247 return SymbolicExprVectorResult::failure(input.error());
248 }
249
250 auto first = checked_derivative(f, var, context, operation.c_str());
251 if (!first) {
252 return SymbolicExprVectorResult::failure(first.error());
253 }
254 const auto& f_prime = first.value();
255
256 auto second = checked_derivative(f_prime, var, context, operation.c_str());
257 if (!second) {
258 return SymbolicExprVectorResult::failure(second.error());
259 }
260 const auto& f_double_prime = second.value();
261
262 auto equation = detail::make_expression_ptr(detail::normalize_node(detail::node(f_double_prime), transform_budget));
263 if (!equation || !LMCAS::detail::node(equation)) { equation = f_double_prime; }
264
265 auto solved = solve_equation(equation, var, context, SolveOptions{});
266 if (!solved) {
267 return SymbolicExprVectorResult::failure(solved.error());
268 }
269
270 const auto& solutions = solved.value();
271 if (std::holds_alternative<EmptySolutions>(solutions)) {
273 }
274 std::optional<detail::AssumptionFacts> assumed_facts;
275 if (context.assumptions()) { assumed_facts.emplace(*context.assumptions()); }
276 const FactsQuery& facts = assumed_facts
277 ? static_cast<const FactsQuery&>(*assumed_facts) : detail::no_facts();
278 if (const auto* finite = std::get_if<FiniteSolutions>(&solutions)) {
280 *finite, f, f_prime, f_double_prime, var, facts, context, operation);
281 }
282
283
286 "inflection equation is outside the finite exact support domain",
287 operation);
288} catch (const CasError& error) {
290} catch (const std::bad_alloc&) {
291 return SymbolicExprVectorResult::failure(CasErrc::ResourceLimit, "allocation failed", "inflection_points");
292} catch (const std::length_error& error) {
293 return SymbolicExprVectorResult::failure(CasErrc::ResourceLimit, error.what(), "inflection_points");
294} catch (const std::exception& error) {
295 return SymbolicExprVectorResult::failure(CasErrc::InternalInvariant, error.what(), "inflection_points");
296}
const FactsQuery & no_facts() noexcept
RewriteBudget const FactsQuery & facts
static SymbolicExprVectorResult classify_inflection_candidates(const FiniteSolutions &finite, const std::shared_ptr< SymbolicExpr > &f, const std::shared_ptr< SymbolicExpr > &f_prime, const std::shared_ptr< SymbolicExpr > &f_double_prime, const std::string &var, const FactsQuery &facts, ComputationContext &context, const std::string &operation)

引用了 LMCAS::calculus_utils_detail::calculus_utils_validate_expr(), checked_derivative(), classify_inflection_candidates(), context, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), Inconclusive, inflection_points_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::no_facts(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), solve_equation(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success() , 以及 LMCAS::Result< T >::value().

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

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

◆ integer() [1/2]

ExprResult LMCAS::integer ( const BigInt & value)

在文件 expr_values.cpp 第 71 行定义.

71 {
72 try {
73 return ExprResult::success(SymbolicExpr::number(value));
74 } catch (const std::bad_alloc&) {
76 "integer allocation failed", kIntegerOperation);
77 } catch (const std::exception& error) {
79 }
80}
constexpr const char * kIntegerOperation

引用了 LMCAS::expr_detail::expr_common::expression_failure(), integer, InternalInvariant, LMCAS::expr_detail::expr_common::kIntegerOperation, ResourceLimit, LMCAS::Result< ExprPtr >::success() , 以及 value.

函数调用图:

◆ integer() [2/2]

ExprResult LMCAS::integer ( int value)

在文件 expr_values.cpp 第 60 行定义.

60 {
61 try {
62 return ExprResult::success(SymbolicExpr::number(value));
63 } catch (const std::bad_alloc&) {
65 "integer allocation failed", kIntegerOperation);
66 } catch (const std::exception& error) {
68 }
69}

引用了 LMCAS::expr_detail::expr_common::expression_failure(), integer, InternalInvariant, LMCAS::expr_detail::expr_common::kIntegerOperation, ResourceLimit, LMCAS::Result< ExprPtr >::success() , 以及 value.

函数调用图:

◆ integers()

NumberDomainSet LMCAS::integers ( )

在文件 expr_number_domains.cpp 第 357 行定义.

357 {
358 return NumberDomainSet(NumberDomain::Integers);
359}

引用了 Integers , 以及 integers().

被这些函数引用 integers().

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

◆ integrate_multiple_checked()

Result< SymbolicExpr > LMCAS::integrate_multiple_checked ( const SymbolicExpr & integrand,
const std::vector< IntegrationStep > & steps,
Integrator & integrator,
ComputationContext & context )

在文件 multiple_integral.cpp 第 27 行定义.

31 {
32 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
33 (context).limits().max_ast_nodes, "transform");
34
37 CasErrc::InvalidArgument, "invalid multiple integration steps",
38 "integrate.multiple");
39 }
40 auto access = context.consume_steps(0, "integrate.multiple");
41 if (!access) return Result<SymbolicExpr>::failure(access.error());
42
43 auto current = LMCAS::detail::make_expression_ptr(integrand);
44
45 for (const auto& step : steps) {
46 auto step_access = context.consume_steps(1, "integrate.multiple");
47 if (!step_access) {
48 return Result<SymbolicExpr>::failure(step_access.error());
49 }
50 if (!current) {
52 CasErrc::InternalInvariant, "multiple integration lost its expression",
53 "integrate.multiple");
54 }
55
56
57 const bool definite = static_cast<bool>(step.lower) && static_cast<bool>(step.upper);
58
59 if (!definite) {
60 auto result = integrator.integrate_checked(*current, step.variable, context);
61 if (!result) return result;
62 current = LMCAS::detail::make_expression_ptr(result.value());
63 } else {
64 auto result = integrator.integrate_def_checked(
65 *current, step.variable, *step.lower, *step.upper, context);
66 if (!result) return result;
67 auto res_ptr = LMCAS::detail::make_expression_ptr(result.value());
68 auto simp = detail::make_expression_ptr(detail::normalize_node(detail::node(res_ptr), transform_budget));
69 current = simp ? simp : res_ptr;
70 }
71 }
72 auto final_access = context.consume_steps(0, "integrate.multiple");
73 if (!final_access) return Result<SymbolicExpr>::failure(final_access.error());
74
75 return Result<SymbolicExpr>::success(*current);
76} catch (const CasError& error) {
78} catch (const std::bad_alloc&) {
79 return Result<SymbolicExpr>::failure(CasErrc::ResourceLimit, "allocation failed", "integrate_multiple_checked");
80} catch (const std::length_error& error) {
81 return Result<SymbolicExpr>::failure(CasErrc::ResourceLimit, error.what(), "integrate_multiple_checked");
82} catch (const std::exception& error) {
83 return Result<SymbolicExpr>::failure(CasErrc::InternalInvariant, error.what(), "integrate_multiple_checked");
84}
static bool validate_integration_steps(const std::vector< IntegrationStep > &steps)

引用了 context, LMCAS::Result< T >::failure(), integrate_multiple_checked(), integrator, InternalInvariant, InvalidArgument, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), steps, LMCAS::Result< T >::success() , 以及 validate_integration_steps().

被这些函数引用 divergence_theorem(), greens_theorem(), integrate_multiple_checked(), stokes_theorem(), surface_integral_scalar(), surface_integral_vector() , 以及 vector_calculus_multiple_integral_strict().

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

◆ integrating_factor_from_antiderivative()

std::shared_ptr< SymbolicExpr > LMCAS::integrating_factor_from_antiderivative ( const std::shared_ptr< SymbolicExpr > & antiderivative,
const std::string & variable,
ComputationContext & context )
static

在文件 ode_first_order.cpp 第 35 行定义.

38{
39
40 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
41 (context).limits().max_ast_nodes, "transform");
42 const auto logarithm_of_variable =
43 [&variable](const std::shared_ptr<const SymbolicNode>& node) {
44 const auto function =
45 std::dynamic_pointer_cast<const FunctionNode>(node);
46 if (!function ||
48 function->arguments().size() != 1) {
49 return false;
50 }
51 const auto argument = std::dynamic_pointer_cast<const VariableNode>(
52 function->arguments().front());
53 return argument && !argument->is_constant() && argument->name() == variable;
54 };
55
56 const auto& root = detail::node(antiderivative);
57 if (logarithm_of_variable(root)) {
58 return SymbolicExpr::variable(variable);
59 }
60 const auto product = std::dynamic_pointer_cast<const MultiplyNode>(root);
61 if (product && product->operands().size() == 2) {
62 for (std::size_t index = 0; index < 2; ++index) {
63 if (logarithm_of_variable(product->operands()[index])) {
65 product->operands()[1 - index]);
67 SymbolicExpr::variable(variable), exponent)), transform_budget));
68 }
69 }
70 }
71 return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::exp(antiderivative)), transform_budget));
72}

引用了 context, exponent, function(), integrating_factor_from_antiderivative(), LMCAS::FunctionNode::Ln, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 variable.

被这些函数引用 integrating_factor_from_antiderivative(), integrating_factor_from_ratio() , 以及 solve_bernoulli_ode_impl().

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

◆ integrating_factor_from_ratio()

ExpressionResult LMCAS::integrating_factor_from_ratio ( const std::shared_ptr< SymbolicExpr > & ratio,
const std::string & variable,
const std::string & excluded_variable,
Integrator & integrator,
ComputationContext & context )
static

在文件 ode_first_order.cpp 第 308 行定义.

311 {
313 LMCAS::detail::node(ratio), excluded_variable)) {
314 return std::shared_ptr<SymbolicExpr>{};
315 }
316 auto integrated = integrator.integrate_checked(*ratio, variable, context);
317 if (!integrated) { return ExpressionResult::failure(integrated.error()); }
319 std::make_shared<SymbolicExpr>(std::move(integrated.value())),
321}
static std::shared_ptr< SymbolicExpr > integrating_factor_from_antiderivative(const std::shared_ptr< SymbolicExpr > &antiderivative, const std::string &variable, ComputationContext &context)

引用了 context, expression_depends_on_variable(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), integrating_factor_from_antiderivative(), integrating_factor_from_ratio(), integrator, LMCAS::detail::node() , 以及 variable.

被这些函数引用 find_integrating_factor_impl() , 以及 integrating_factor_from_ratio().

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

◆ integration_bounded_exponent()

std::optional< int > LMCAS::integration_bounded_exponent ( const NumberNode & number,
int minimum_exponent,
int maximum_exponent )
inline

在文件 integration_support.hpp 第 74 行定义.

75 {
76 const auto narrow = [minimum_exponent, maximum_exponent](const BigInt& exponent)
77 -> std::optional<int> {
78 if (exponent < BigInt(minimum_exponent) || exponent > BigInt(maximum_exponent)) {
79 return std::nullopt;
80 }
81 const auto bounded_exponent = exponent.try_to_int64();
82 if (!bounded_exponent) { return std::nullopt; }
83 return static_cast<int>(*bounded_exponent);
84 };
85 const auto& value = number.value();
86 if (const auto* exponent = std::get_if<BigInt>(&value)) { return narrow(*exponent); }
87 if (const auto* exponent = std::get_if<Rational>(&value)) {
88 if (!exponent->is_integer()) { return std::nullopt; }
89 return narrow(exponent->to_bigint());
90 }
91 return std::nullopt;
92}

引用了 exponent, integration_bounded_exponent(), LMCAS::NumberNode::value() , 以及 value.

被这些函数引用 integration_bounded_exponent(), LMCAS::anonymous_namespace{integration_rational_collection.cpp}::rd_collect_power(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::trig_extract_nonneg_int() , 以及 LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_rational_power().

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

◆ interval() [1/2]

ExprResult LMCAS::interval ( const ExprPtr & lower,
const ExprPtr & upper,
bool lower_closed,
bool upper_closed,
ComputationContext & context )

在文件 value_facade.cpp 第 46 行定义.

48 {
50}
SymbolicSetResult make_interval(const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, bool lower_closed, bool upper_closed, ComputationContext &context)
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr bool lower_closed
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr bool bool upper_closed

引用了 context, interval(), lower, lower_closed, make_interval(), upper , 以及 upper_closed.

函数调用图:

◆ interval() [2/2]

ExprResult LMCAS::interval ( ExprPtr lower,
ExprPtr upper,
bool lower_closed,
bool upper_closed )

在文件 expr_facade.cpp 第 168 行定义.

引用了 context, interval(), lower, lower_closed, upper , 以及 upper_closed.

被这些函数引用 LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::MixedRootCollection(), LMCAS::detail::anonymous_namespace{mixed_transcendental_refinement.cpp}::RootRefinement::RootRefinement(), LMCAS::detail::anonymous_namespace{mixed_transcendental_isolation.cpp}::RootIsolation::accept(), adaptive_simpson_numeric(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::cauchy_index_on_edge(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_rectangles.cpp}::certify_conjugate_projections(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::check_interval_forest(), LMCAS::anonymous_namespace{interval_set_operations.cpp}::checked_interval_views(), LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::checked_piecewise(), LMCAS::detail::anonymous_namespace{exact_sturm.cpp}::clear_isolation_endpoints(), LMCAS::anonymous_namespace{interval_normalization.cpp}::collect_nonempty_intervals(), LMCAS::detail::anonymous_namespace{exact_algebraic.cpp}::common_root_in_enclosures(), LMCAS::IntervalNode::compare_same_type(), LMCAS::detail::definite::defined_on_interval(), LMCAS::anonymous_namespace{integration_definite.cpp}::equal_endpoint_integral(), LMCAS::anonymous_namespace{numerical_integration.cpp}::evaluate_interval(), LMCAS::detail::evaluate_root_real(), LMCAS::anonymous_namespace{symbolic_set.cpp}::exact_interval_membership(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::find_interval_comma(), LMCAS::InferenceEngine::Impl::function_monotonicity(), LMCAS::detail::inequality_support::include_numeric_root(), LMCAS::detail::inequality_support::include_symbolic_root(), LMCAS::detail::anonymous_namespace{mixed_transcendental_isolation.cpp}::RootIsolation::initialize(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_interval_checked(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_ordered_interval(), interval(), interval(), interval_contains_checked(), interval_contains_checked(), interval_is_empty_checked(), interval_is_empty_checked(), interval_to_expr(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_rectangles.cpp}::isolate_grid_row(), isolate_roots(), LMCAS::detail::isolate_roots_with_context(), LMCAS::InferenceEngine::Impl::logarithm_monotonicity(), make_membership(), LMCAS::anonymous_namespace{interval_normalization.cpp}::merge_checked_intervals(), LMCAS::detail::mixed_numerical_path(), LMCAS::assumption_detail::parse_interval(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::parse_interval_endpoint(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::parse_interval_expression(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::pole_index(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::pole_interval_is_clear(), LMCAS::detail::anonymous_namespace{mixed_transcendental_isolation.cpp}::RootIsolation::process(), quadrature_gaussian_numeric(), quadrature_simpson_numeric(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::rational_bounds(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::rational_sign_intervals(), LMCAS::anonymous_namespace{integration_definite.cpp}::reduced_integrand_checked(), LMCAS::detail::complex_root::refine_interval(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::refine_pole_interval(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_rectangles.cpp}::refine_projection_interval(), refine_root(), LMCAS::detail::refine_root_with_context(), LMCAS::detail::anonymous_namespace{mixed_transcendental_isolation.cpp}::RootIsolation::resample_endpoints(), LMCAS::detail::inequality_support::select_open_intervals(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_rectangles.cpp}::separate_imaginary_axis(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::solve_exact_affine_inequality_impl(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::solve_mixed_equation(), LMCAS::anonymous_namespace{interval_normalization.cpp}::sort_checked_intervals(), LMCAS::detail::anonymous_namespace{mixed_transcendental_isolation.cpp}::RootIsolation::subdivide(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::sum_bounds(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::trim_interval_endpoint(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::validate_interval_endpoints(), validate_property_interval() , 以及 LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::variable_bounds().

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

◆ interval_contains_checked() [1/2]

Result< bool > LMCAS::interval_contains_checked ( const Interval & interval,
double value )

在文件 interval.cpp 第 166 行定义.

168 {
171}
Result< bool > interval_contains_checked(const Interval &interval, double value, ComputationContext &context)

引用了 context, interval(), interval_contains_checked() , 以及 value.

函数调用图:

◆ interval_contains_checked() [2/2]

Result< bool > LMCAS::interval_contains_checked ( const Interval & interval,
double value,
ComputationContext & context )

在文件 interval.cpp 第 122 行定义.

125 {
126 constexpr const char* operation = "interval_contains";
127 auto point_step = context.consume_steps(1, operation);
128 if (!point_step) {
129 return Result<bool>::failure(point_step.error());
130 }
131 auto point = exact_double_rational(value, context, operation);
132 if (!point) {
133 return Result<bool>::failure(point.error());
134 }
135 const ComparableEndpoint point_key{
136 0, std::move(point.value()), Rational(0), Rational(0)};
137
138 auto lower = comparable_endpoint(interval.lower, context, operation);
139 if (!lower) {
140 return Result<bool>::failure(lower.error());
141 }
142 auto upper = comparable_endpoint(interval.upper, context, operation);
143 if (!upper) {
145 }
146
147 auto lower_cmp = compare_comparable(point_key, lower.value(), context);
148 if (!lower_cmp) {
149 return Result<bool>::failure(lower_cmp.error());
150 }
151 if (lower_cmp.value() < 0 ||
152 (lower_cmp.value() == 0 && interval.lower.is_open)) {
153 return Result<bool>::success(false);
154 }
155 auto upper_cmp = compare_comparable(point_key, upper.value(), context);
156 if (!upper_cmp) {
157 return Result<bool>::failure(upper_cmp.error());
158 }
159 if (upper_cmp.value() > 0 ||
160 (upper_cmp.value() == 0 && interval.upper.is_open)) {
161 return Result<bool>::success(false);
162 }
163 return Result<bool>::success(true);
164}
Result< ComparableEndpoint > comparable_endpoint(const Endpoint &endpoint, ComputationContext &context, const std::string &operation)
Result< Rational > exact_double_rational(double value, ComputationContext &context, const std::string &operation)
Result< int > compare_comparable(const ComparableEndpoint &left, const ComparableEndpoint &right, ComputationContext &context)

引用了 comparable_endpoint(), compare_comparable(), context, LMCAS::Result< T >::error(), exact_double_rational(), LMCAS::Result< T >::failure(), interval(), interval_contains_checked(), lower, point, LMCAS::Result< T >::success(), upper, LMCAS::Result< T >::value() , 以及 value.

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

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

◆ interval_covers_checked_impl()

Result< bool > LMCAS::interval_covers_checked_impl ( const Interval & outer,
const Interval & inner,
ComputationContext & context )
static

判断 outer 是否完全包含 inner。 包含条件为 outer.lower <= inner.lower 且 inner.upper <= outer.upper, 并结合端点的开闭属性判断边界。

在文件 property_intervals.cpp 第 68 行定义.

71 {
72 auto normalized_outer = IntervalUnion::from_intervals_checked({outer}, context);
73 if (!normalized_outer) {
74 return Result<bool>::failure(normalized_outer.error());
75 }
76 auto normalized_inner = IntervalUnion::from_intervals_checked({inner}, context);
77 if (!normalized_inner) {
78 return Result<bool>::failure(normalized_inner.error());
79 }
80 if (normalized_inner.value().is_empty()) return Result<bool>::success(true);
81 if (normalized_outer.value().is_empty()) return Result<bool>::success(false);
82
83 auto intersection = normalized_outer.value().intersect_checked(
84 normalized_inner.value(), context);
85 if (!intersection) {
86 return Result<bool>::failure(intersection.error());
87 }
88 const auto& intersection_intervals = intersection.value().intervals();
89 const auto& inner_intervals = normalized_inner.value().intervals();
90 if (intersection_intervals.size() != inner_intervals.size()) {
91 return Result<bool>::success(false);
92 }
93 for (std::size_t i = 0; i < inner_intervals.size(); ++i) {
94 if (!intervals_equivalent(intersection_intervals[i], inner_intervals[i])) {
95 return Result<bool>::success(false);
96 }
97 }
98 return Result<bool>::success(true);
99}
static bool intervals_equivalent(const Interval &left, const Interval &right)

引用了 context, LMCAS::Result< T >::failure(), interval_covers_checked_impl(), intervals_equivalent() , 以及 LMCAS::Result< T >::success().

被这些函数引用 interval_covers_checked_impl().

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

◆ interval_is_empty_checked() [1/2]

Result< bool > LMCAS::interval_is_empty_checked ( const Interval & interval)

在文件 interval.cpp 第 195 行定义.

195 {
198}
Result< bool > interval_is_empty_checked(const Interval &interval, ComputationContext &context)

引用了 context, interval() , 以及 interval_is_empty_checked().

函数调用图:

◆ interval_is_empty_checked() [2/2]

Result< bool > LMCAS::interval_is_empty_checked ( const Interval & interval,
ComputationContext & context )

在文件 interval.cpp 第 173 行定义.

175 {
176 constexpr const char* operation = "interval_is_empty";
177 auto lower = comparable_endpoint(interval.lower, context, operation);
178 if (!lower) {
179 return Result<bool>::failure(lower.error());
180 }
181 auto upper = comparable_endpoint(interval.upper, context, operation);
182 if (!upper) {
184 }
185 auto comparison = compare_comparable(lower.value(), upper.value(), context);
186 if (!comparison) {
187 return Result<bool>::failure(comparison.error());
188 }
190 comparison.value() > 0 ||
191 (comparison.value() == 0 &&
192 (interval.lower.is_open || interval.upper.is_open)));
193}

引用了 comparable_endpoint(), compare_comparable(), context, LMCAS::Result< T >::error(), LMCAS::Result< T >::failure(), interval(), interval_is_empty_checked(), lower, LMCAS::Result< T >::success(), upper , 以及 LMCAS::Result< T >::value().

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

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

◆ interval_to_expr()

std::shared_ptr< const SymbolicNode > LMCAS::interval_to_expr ( const Interval & interval,
const std::shared_ptr< const SymbolicNode > & variable )
static

在文件 interval_serialization.cpp 第 316 行定义.

317 {
318 std::shared_ptr<const SymbolicNode> lower;
319 std::shared_ptr<const SymbolicNode> upper;
320 if (!interval.lower.is_neg_infinity) {
321 auto bound = interval.lower.value ? LMCAS::detail::node(interval.lower.value)
322 : LMCAS::detail::make_node<NumberNode>(0.0);
323 const auto op = interval.lower.is_open ? RelationalNode::Op::GT
324 : RelationalNode::Op::GEQ;
326 }
327 if (!interval.upper.is_pos_infinity) {
328 auto bound = interval.upper.value ? LMCAS::detail::node(interval.upper.value)
329 : LMCAS::detail::make_node<NumberNode>(0.0);
330 const auto op = interval.upper.is_open ? RelationalNode::Op::LT
331 : RelationalNode::Op::LEQ;
333 }
334 if (lower && upper) {
336 }
337 return lower ? lower : upper;
338}
多元 Hensel 提升(单变量步)

引用了 LMCAS::LogicalNode::And, interval(), interval_to_expr(), lower, LMCAS::detail::make_node(), LMCAS::detail::node(), op, upper, LMCAS::Result< T >::value() , 以及 variable.

被这些函数引用 interval_to_expr().

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

◆ intervals_equivalent()

bool LMCAS::intervals_equivalent ( const Interval & left,
const Interval & right )
static

在文件 property_intervals.cpp 第 41 行定义.

41 {
42 return endpoints_equivalent(left.lower, right.lower) &&
43 endpoints_equivalent(left.upper, right.upper);
44}
static bool endpoints_equivalent(const Endpoint &left, const Endpoint &right)

引用了 endpoints_equivalent(), intervals_equivalent() , 以及 right.

被这些函数引用 interval_covers_checked_impl() , 以及 intervals_equivalent().

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

◆ intervals_overlap_checked_impl()

Result< bool > LMCAS::intervals_overlap_checked_impl ( const Interval & a,
const Interval & b,
ComputationContext & context )
static

判断两个区间是否存在已证明的交集。 端点排序采用受检区间运算;超出支持域时,交集判定仍为未决。

在文件 property_intervals.cpp 第 50 行定义.

53 {
54 auto left = IntervalUnion::from_intervals_checked({a}, context);
55 if (!left) return Result<bool>::failure(left.error());
56 auto right = IntervalUnion::from_intervals_checked({b}, context);
57 if (!right) return Result<bool>::failure(right.error());
58 auto intersection = left.value().intersect_checked(right.value(), context);
59 if (!intersection) return Result<bool>::failure(intersection.error());
60 return Result<bool>::success(!intersection.value().is_empty());
61}

引用了 a, b, context, LMCAS::Result< T >::failure(), intervals_overlap_checked_impl(), right , 以及 LMCAS::Result< T >::success().

被这些函数引用 intervals_overlap_checked_impl().

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

◆ inverse_branch_derivative()

ExpressionResult LMCAS::inverse_branch_derivative ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::vector< std::shared_ptr< SymbolicExpr > > & candidates,
const std::string & operation,
ComputationContext & context )
static

在文件 calculus_inverse.cpp 第 231 行定义.

235 {
236
237 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
238 (context).limits().max_ast_nodes, "transform");
239 if (candidates.empty()) {
242 "inverse point is outside the proven range",
243 operation);
244 }
245 if (candidates.size() != 1) {
248 "inverse derivative requires a unique inverse branch",
249 operation);
250 }
251
252 auto f_prime = detail::make_expression_ptr(detail::differentiate_node(detail::node(f), var, transform_budget));
253 if (!f_prime || !LMCAS::detail::node(f_prime)) {
256 "inverse derivative could not construct the derivative",
257 operation);
258 }
259
260 auto f_prime_at_x0 = detail::make_expression_ptr(detail::substitute_node(detail::node(f_prime), var, detail::node(candidates[0]), transform_budget));
261 auto simplified_derivative = f_prime_at_x0 ? detail::make_expression_ptr(detail::normalize_node(detail::node(f_prime_at_x0), transform_budget)) : nullptr;
262 if (!simplified_derivative || !LMCAS::detail::node(simplified_derivative)) {
265 "inverse derivative substitution produced a null expression",
266 operation);
267 }
268
269 if (simplified_derivative->is_zero()) {
272 "inverse derivative is undefined where f' is zero",
273 operation);
274 }
275
276 auto result = SymbolicExpr::divide(SymbolicExpr::number(1), simplified_derivative);
277 auto simplified = result ? detail::make_expression_ptr(detail::normalize_node(detail::node(result), transform_budget)) : nullptr;
278 if (!simplified || !LMCAS::detail::node(simplified)) {
281 "inverse derivative result construction failed",
282 operation);
283 }
284 return ExpressionResult::success(simplified);
285} catch (const CasError& error) {
286 return ExpressionResult::failure(error);
287} catch (const std::bad_alloc&) {
288 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", operation);
289} catch (const std::length_error& error) {
290 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), operation);
291} catch (const std::exception& error) {
292 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), operation);
293}

引用了 context, LMCAS::detail::differentiate_node(), DomainError, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive, InternalInvariant, inverse_branch_derivative(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::substitute_node() , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

被这些函数引用 inverse_branch_derivative() , 以及 inverse_derivative_checked().

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

◆ inverse_derivative_checked() [1/2]

ExpressionResult LMCAS::inverse_derivative_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & point )

在文件 calculus_inverse.cpp 第 360 行定义.

363{
366}
ExpressionResult inverse_derivative_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &point, ComputationContext &context)

引用了 context, inverse_derivative_checked() , 以及 point.

函数调用图:

◆ inverse_derivative_checked() [2/2]

ExpressionResult LMCAS::inverse_derivative_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & point,
ComputationContext & context )

在文件 calculus_inverse.cpp 第 319 行定义.

323{
324 const std::string operation = "inverse_derivative";
325 auto input = calculus_utils_validate_expr_target(f, var, point, context, operation);
326 if (!input) {
327 return ExpressionResult::failure(input.error());
328 }
329 auto step = context.consume_steps(4, operation);
330 if (!step) {
331 return ExpressionResult::failure(step.error());
332 }
333
334 try {
335 auto eq = SymbolicExpr::add(
336 f, SymbolicExpr::multiply(SymbolicExpr::number(-1), point));
337
338 std::vector<std::shared_ptr<SymbolicExpr>> candidates;
339 auto inverse = inverse_function_checked(f, var, point, context);
340 if (inverse) {
341 candidates = inverse.value();
342 } else {
343 return ExpressionResult::failure(inverse.error());
344 }
345 auto verified = verified_real_inverse_candidates(candidates, eq, var, operation, context);
346 if (!verified) {
347 return ExpressionResult::failure(verified.error());
348 }
349 return inverse_branch_derivative(f, var, verified.value(), operation, context);
350 } catch (const std::bad_alloc&) {
352 "inverse derivative allocation failed",
353 operation);
354 } catch (const std::exception& e) {
356 e.what(), operation);
357 }
358}
Result< void > calculus_utils_validate_expr_target(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const std::shared_ptr< SymbolicExpr > &target, ComputationContext &context, const std::string &operation)
SymbolicExprVectorResult inverse_function_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &y, ComputationContext &context)
static ExpressionResult inverse_branch_derivative(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::vector< std::shared_ptr< SymbolicExpr > > &candidates, const std::string &operation, ComputationContext &context)
static SymbolicExprVectorResult verified_real_inverse_candidates(const std::vector< std::shared_ptr< SymbolicExpr > > &candidates, const std::shared_ptr< SymbolicExpr > &equation, const std::string &var, const std::string &operation, ComputationContext &context)

引用了 LMCAS::calculus_utils_detail::calculus_utils_validate_expr_target(), context, e(), eq(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, inverse_branch_derivative(), inverse_derivative_checked(), inverse_function_checked(), point, ResourceLimit , 以及 verified_real_inverse_candidates().

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

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

◆ inverse_fourier_transform_checked() [1/2]

TransformEngineResult LMCAS::inverse_fourier_transform_checked ( const std::shared_ptr< SymbolicExpr > & F,
const std::string & omega,
const std::string & t )

在文件 transform_fourier.cpp 第 323 行定义.

326 {
329}
TransformEngineResult inverse_fourier_transform_checked(const std::shared_ptr< SymbolicExpr > &F, const std::string &omega, const std::string &t, ComputationContext &context)

引用了 context, inverse_fourier_transform_checked() , 以及 t.

函数调用图:

◆ inverse_fourier_transform_checked() [2/2]

TransformEngineResult LMCAS::inverse_fourier_transform_checked ( const std::shared_ptr< SymbolicExpr > & F,
const std::string & omega,
const std::string & t,
ComputationContext & context )

在文件 transform_fourier.cpp 第 271 行定义.

275 {
276 const std::string operation = "inverse_fourier_transform";
277 auto valid = te_validate_expr_vars(F, omega, t, context, operation);
278 if (!valid) return TransformEngineResult::failure(valid.error());
279 auto step = context.consume_steps(8, operation);
280 if (!step) return TransformEngineResult::failure(step.error());
281 try {
282 auto expression = inverse_fourier_transform_core(
283 F, omega, t, context);
284 auto final_access = context.consume_steps(0, operation);
285 if (!final_access) {
286 return TransformEngineResult::failure(final_access.error());
287 }
288 auto result = te_wrap_transform_result(expression, operation);
289 if (!result) return result;
290 AssumptionContext empty_assumptions;
291 const auto& assumptions = context.assumptions() ? *context.assumptions() : empty_assumptions;
292 std::vector<std::shared_ptr<SymbolicExpr>> conditions;
293 auto round_trip = fourier_transform_core(
294 expression, t, omega, context, assumptions, conditions);
295 if (!round_trip || !conditions.empty() ||
299 "inverse Fourier round trip is not proved", operation);
300 }
301 auto verified = check_equivalent(round_trip, F, context);
302 if (!verified) return TransformEngineResult::failure(verified.error());
303 if (!std::holds_alternative<ProvedZeroResidual>(verified.value())) {
306 "inverse Fourier round trip is not proved", operation);
307 }
308 result.value().certificate =
309 ExactRoundTripProof{SymbolicExpr::number(0)};
310 return result;
311 } catch (const CasError& error) {
312 return TransformEngineResult::failure(error);
313 } catch (const std::bad_alloc&) {
315 "transform allocation failed",
316 operation);
317 } catch (const std::exception& e) {
319 e.what(), operation);
320 }
321}
bool te_contains_transform(const std::shared_ptr< const SymbolicNode > &node)
ResidualCheckResult check_equivalent(const ExprPtr &left, const ExprPtr &right, ComputationContext &context, const LMCAS::EqvOptions &options)
static std::shared_ptr< SymbolicExpr > inverse_fourier_transform_core(const std::shared_ptr< SymbolicExpr > &F, const std::string &omega, const std::string &t, ComputationContext &context)

引用了 check_equivalent(), context, e(), LMCAS::Result< Verified< EvaluatedTransform > >::failure(), fourier_transform_core(), Inconclusive, InternalInvariant, inverse_fourier_transform_checked(), inverse_fourier_transform_core(), LMCAS::detail::node(), ResourceLimit, t, LMCAS::transform_detail::te_contains_transform(), LMCAS::transform_detail::te_validate_expr_vars() , 以及 LMCAS::transform_detail::te_wrap_transform_result().

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

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

◆ inverse_fourier_transform_core()

std::shared_ptr< SymbolicExpr > LMCAS::inverse_fourier_transform_core ( const std::shared_ptr< SymbolicExpr > & F,
const std::string & omega,
const std::string & t,
ComputationContext & context )
static

在文件 transform_fourier.cpp 第 216 行定义.

218 {
219 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
220 (context).limits().max_ast_nodes, "transform");
221 auto step = context.consume_steps(1, "inverse_fourier_transform.recursive");
222 if (!step) return nullptr;
223 if (!F || !LMCAS::detail::node(F)) return nullptr;
224 auto tv = SymbolicExpr::variable(t);
225 if (!te_depends_on(F, omega)) {
229 }
230 auto add_node = std::dynamic_pointer_cast<const AddNode>(LMCAS::detail::node(F));
231 if (add_node) {
232 std::shared_ptr<SymbolicExpr> result;
233 for (auto& op : add_node->operands()) {
236 if (!ift) {
240 }
241 result = result ? SymbolicExpr::add(result, ift) : ift;
242 }
243 return result;
244 }
245
246 auto canonical = te_abs_fourier(SymbolicExpr::number(1), omega, context);
247 if (detail::normalize_node(detail::node(F), transform_budget)->equals(*detail::node(canonical))) {
250 std::vector<std::shared_ptr<const SymbolicNode>>{detail::node(tv)}));
251 return SymbolicExpr::exp(SymbolicExpr::multiply(
252 SymbolicExpr::number(-1), abs_t));
253 }
254
255 if (const auto rate = te_match_pure_gaussian(F, omega)) {
257 auto coefficient = SymbolicExpr::divide(SymbolicExpr::number(1),
258 SymbolicExpr::sqrt(SymbolicExpr::multiply(
259 SymbolicExpr::number(Rational(4) * *rate), pi)));
260 auto exponent = SymbolicExpr::multiply(
261 SymbolicExpr::number(-Rational(1) / (Rational(4) * *rate)),
262 SymbolicExpr::power(tv, SymbolicExpr::number(2)));
263 return SymbolicExpr::multiply(
264 coefficient, SymbolicExpr::exp(exponent));
265 }
269}
static std::shared_ptr< const SymbolicNode > create_variable(const std::string &name)
@ InverseFourier
逆 Fourier 变换 F-¹{F(omega)}(t)。

引用了 LMCAS::FunctionNode::Abs, context, LMCAS::SymbolicFactory::create_variable(), exponent, inverse_fourier_transform_core(), LMCAS::TransformNode::InverseFourier, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), op, pi(), t, te_abs_fourier(), LMCAS::transform_detail::te_depends_on() , 以及 LMCAS::transform_detail::te_match_pure_gaussian().

被这些函数引用 inverse_fourier_transform_checked() , 以及 inverse_fourier_transform_core().

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

◆ inverse_function_checked() [1/2]

SymbolicExprVectorResult LMCAS::inverse_function_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & y )

在文件 calculus_inverse.cpp 第 412 行定义.

415{
417 return inverse_function_checked(f, var, y, context);
418}

引用了 context , 以及 inverse_function_checked().

函数调用图:

◆ inverse_function_checked() [2/2]

SymbolicExprVectorResult LMCAS::inverse_function_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & y,
ComputationContext & context )

在文件 calculus_inverse.cpp 第 368 行定义.

371{
372 const std::string operation = "inverse_function";
373 auto input = calculus_utils_validate_expr_target(f, var, y, context, operation);
374 if (!input) {
375 return SymbolicExprVectorResult::failure(input.error());
376 }
377 auto step = context.consume_steps(4, operation);
378 if (!step) {
379 return SymbolicExprVectorResult::failure(step.error());
380 }
381
382 try {
383 auto eq = SymbolicExpr::eq(f, y);
384
385 auto solved = solve_equation(eq, var, context, SolveOptions{});
386 if (!solved) {
387 return SymbolicExprVectorResult::failure(solved.error());
388 }
389
390 const auto& solutions = solved.value();
391 if (std::holds_alternative<EmptySolutions>(solutions)) {
393 }
394 if (const auto* finite = std::get_if<FiniteSolutions>(&solutions)) {
395 return explicit_inverse_candidates(*finite, operation);
396 }
397
400 "inverse equation is outside the finite exact support domain",
401 operation);
402 } catch (const std::bad_alloc&) {
404 "inverse function allocation failed",
405 operation);
406 } catch (const std::exception& e) {
408 e.what(), operation);
409 }
410}
static SymbolicExprVectorResult explicit_inverse_candidates(const FiniteSolutions &finite, const std::string &operation)

引用了 LMCAS::calculus_utils_detail::calculus_utils_validate_expr_target(), context, e(), eq(), explicit_inverse_candidates(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), Inconclusive, InternalInvariant, inverse_function_checked(), ResourceLimit, solve_equation(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success() , 以及 LMCAS::Result< T >::value().

被这些函数引用 inverse_derivative_checked(), inverse_function_checked() , 以及 inverse_function_checked().

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

◆ inverse_laplace_checked() [1/2]

TransformEngineResult LMCAS::inverse_laplace_checked ( const std::shared_ptr< SymbolicExpr > & F,
const std::string & s,
const std::string & t )

在文件 transform_inverse_laplace.cpp 第 222 行定义.

225 {
227 return inverse_laplace_checked(F, s, t, context);
228}
TransformEngineResult inverse_laplace_checked(const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t, ComputationContext &context)

引用了 context, inverse_laplace_checked() , 以及 t.

函数调用图:

◆ inverse_laplace_checked() [2/2]

TransformEngineResult LMCAS::inverse_laplace_checked ( const std::shared_ptr< SymbolicExpr > & F,
const std::string & s,
const std::string & t,
ComputationContext & context )

在文件 transform_inverse_laplace.cpp 第 174 行定义.

178 {
179 const std::string operation = "inverse_laplace";
180 auto valid = te_validate_expr_vars(F, s, t, context, operation);
181 if (!valid) return TransformEngineResult::failure(valid.error());
182 auto step = context.consume_steps(8, operation);
183 if (!step) return TransformEngineResult::failure(step.error());
184 try {
185 auto expression = inverse_laplace_core(F, s, t, context);
186 auto final_access = context.consume_steps(0, operation);
187 if (!final_access) {
188 return TransformEngineResult::failure(final_access.error());
189 }
190 auto result = te_wrap_transform_result(expression, operation);
191 if (!result) return result;
192 auto round_trip = laplace_transform_core(
193 expression, t, s, context);
194 if (!round_trip ||
198 "inverse Laplace round trip is not proved", operation);
199 }
200 auto verified = check_equivalent(round_trip, F, context);
201 if (!verified) return TransformEngineResult::failure(verified.error());
202 if (!std::holds_alternative<ProvedZeroResidual>(verified.value())) {
205 "inverse Laplace round trip is not proved", operation);
206 }
207 result.value().certificate =
208 ExactRoundTripProof{SymbolicExpr::number(0)};
209 return result;
210 } catch (const CasError& error) {
211 return TransformEngineResult::failure(error);
212 } catch (const std::bad_alloc&) {
214 "transform allocation failed",
215 operation);
216 } catch (const std::exception& e) {
218 e.what(), operation);
219 }
220}
std::shared_ptr< SymbolicExpr > laplace_transform_core(const std::shared_ptr< SymbolicExpr > &expression, const std::string &input_var, const std::string &output_var, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > inverse_laplace_core(const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t, ComputationContext &context)

引用了 check_equivalent(), context, e(), LMCAS::Result< Verified< EvaluatedTransform > >::failure(), Inconclusive, InternalInvariant, inverse_laplace_checked(), inverse_laplace_core(), LMCAS::transform_detail::laplace_transform_core(), LMCAS::detail::node(), ResourceLimit, t, LMCAS::transform_detail::te_contains_transform(), LMCAS::transform_detail::te_validate_expr_vars() , 以及 LMCAS::transform_detail::te_wrap_transform_result().

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

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

◆ inverse_laplace_core()

std::shared_ptr< SymbolicExpr > LMCAS::inverse_laplace_core ( const std::shared_ptr< SymbolicExpr > & F,
const std::string & s,
const std::string & t,
ComputationContext & context )
static

在文件 transform_inverse_laplace.cpp 第 130 行定义.

132 {
133 auto step = context.consume_steps(1, "inverse_laplace.recursive");
134 if (!step) {
135 return nullptr;
136 }
137 if (!F || !LMCAS::detail::node(F)) {
138 return nullptr;
139 }
140 if (te_is_zero(F)) {
141 return SymbolicExpr::number(0);
142 }
143 auto add = std::dynamic_pointer_cast<const AddNode>(LMCAS::detail::node(F));
144 if (add) {
145 std::shared_ptr<SymbolicExpr> result;
146 for (auto& op : add->operands()) {
147 auto ilt = inverse_laplace_core(
149 if (!ilt) {
150 return te_unevaluated_inv_laplace(F, s, t);
151 }
152 result = result ? SymbolicExpr::add(result, ilt) : ilt;
153 }
154 return result;
155 }
156 auto [coeff, body] = te_split_coeff(F, s);
157 if (!coeff->is_one()) {
158 auto ilt_body = inverse_laplace_core(body, s, t, context);
159 if (ilt_body) {
160 return SymbolicExpr::multiply(coeff, ilt_body);
161 }
162 }
163 auto pw_res = te_inv_power(F, s, t, context);
164 if (pw_res) {
165 return pw_res;
166 }
167 auto prod_res = te_inv_product(F, s, t, context);
168 if (prod_res) {
169 return prod_res;
170 }
171 return te_unevaluated_inv_laplace(F, s, t);
172}
bool te_is_zero(const std::shared_ptr< SymbolicExpr > &expression)
static std::shared_ptr< SymbolicExpr > te_unevaluated_inv_laplace(const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t)
static std::shared_ptr< SymbolicExpr > te_inv_product(const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > te_inv_power(const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t, ComputationContext &context)

引用了 add(), context, inverse_laplace_core(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), op, t, te_inv_power(), te_inv_product(), LMCAS::transform_detail::te_is_zero(), LMCAS::transform_detail::te_split_coeff() , 以及 te_unevaluated_inv_laplace().

被这些函数引用 inverse_laplace_checked() , 以及 inverse_laplace_core().

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

◆ is_alternating_factor()

bool LMCAS::is_alternating_factor ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & n )
static

在文件 series_sequence_limits.cpp 第 15 行定义.

16 {
17 auto power = std::dynamic_pointer_cast<const PowerNode>(node);
18 if (!power) {
19 return false;
20 }
21 auto base = std::dynamic_pointer_cast<const NumberNode>(power->base());
22 auto exponent = std::dynamic_pointer_cast<const VariableNode>(power->exponent());
23 if (!base || !exponent || exponent->is_constant() || exponent->name() != n) {
24 return false;
25 }
26 return base->is_negative_one();
27}

引用了 exponent , 以及 is_alternating_factor().

被这些函数引用 is_alternating_factor() , 以及 series_extract_alternating().

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

◆ is_analytic_checked() [1/2]

ComplexBoolResult LMCAS::is_analytic_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & z )

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

664 {
666 return is_analytic_checked(f, z, context);
667}
ComplexBoolResult is_analytic_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &z, ComputationContext &context)

引用了 context , 以及 is_analytic_checked().

函数调用图:

◆ is_analytic_checked() [2/2]

ComplexBoolResult LMCAS::is_analytic_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & z,
ComputationContext & context )

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

629 {
630 const std::string operation = "is_analytic";
631 auto input = validate_complex_expr_input(f, context, operation);
632 if (!input) return ComplexBoolResult::failure(input.error());
633 if (z.empty()) {
635 "complex variable name cannot be empty",
636 operation);
637 }
638 try {
639 if (has_z_dependent_function(LMCAS::detail::node(f), z)) {
642 "analyticity of functions depending on the complex variable is outside the current support domain",
643 operation);
644 }
645 auto budget = context.consume_steps(24, operation);
646 if (!budget) return ComplexBoolResult::failure(budget.error());
648 } catch (const CasError& error) {
649 return ComplexBoolResult::failure(error);
650 } catch (const std::bad_alloc&) {
652 "allocation failed while checking analyticity",
653 operation);
654 } catch (const std::length_error& error) {
655 return ComplexBoolResult::failure(CasErrc::ResourceLimit, error.what(), operation);
656 } catch (const std::exception& ex) {
658 ex.what(),
659 operation);
660 }
661}
static bool is_analytic_impl(const std::shared_ptr< SymbolicExpr > &, const std::string &, ComputationContext &context)

引用了 context, LMCAS::Result< bool >::failure(), Inconclusive, InternalInvariant, InvalidArgument, is_analytic_checked(), is_analytic_impl(), LMCAS::detail::node(), ResourceLimit , 以及 LMCAS::Result< bool >::success().

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

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

◆ is_analytic_impl()

bool LMCAS::is_analytic_impl ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & z,
ComputationContext & context )
static

将 z 替换为 (z_re + i·z_im),分离 u、v,检验 Cauchy-Riemann。

CR1: ux - vy == 0 ; CR2: uy + vx == 0

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

681 {
682
683 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
684 (context).limits().max_ast_nodes, "transform");
685 if (!f) return false;
686 /// 将 z 替换为 (z_re + i·z_im),分离 u、v,检验 Cauchy-Riemann。
687 std::string xr = z + "_re";
688 std::string xi = z + "_im";
689 auto zr = SymbolicExpr::variable(xr);
690 auto zi = SymbolicExpr::variable(xi);
693 LMCAS::detail::node(SymbolicExpr::number(0)),
694 LMCAS::detail::node(SymbolicExpr::number(1))));
695 auto z_sub = SymbolicExpr::add(zr, SymbolicExpr::multiply(i_unit, zi));
696
697 auto fz = detail::make_expression_ptr(detail::substitute_node(detail::node(f), z, detail::node(z_sub), transform_budget));
698 if (!fz) return false;
700
701 std::shared_ptr<SymbolicExpr> u, v;
702 split_real_imag(LMCAS::detail::node(fz), u, v, context);
703
704 auto ux = differentiate_if_dependent(u, xr, context);
705 auto uy = differentiate_if_dependent(u, xi, context);
706 auto vx = differentiate_if_dependent(v, xr, context);
707 auto vy = differentiate_if_dependent(v, xi, context);
708
709 /// CR1: ux - vy == 0 ; CR2: uy + vx == 0
710 auto cr1 = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(ux, SymbolicExpr::multiply(SymbolicExpr::number(-1), vy))), transform_budget));
711 auto cr2 = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(uy, vx)), transform_budget));
712
714}
static std::shared_ptr< SymbolicExpr > differentiate_if_dependent(const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable, ComputationContext &context)

引用了 context, LMCAS::SymbolicFactory::create_complex(), differentiate_if_dependent(), is_analytic_impl(), LMCAS::SymbolicNode::is_zero(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::substitute_node(), u , 以及 v.

被这些函数引用 is_analytic_checked() , 以及 is_analytic_impl().

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

◆ is_bernoulli_ode()

bool LMCAS::is_bernoulli_ode ( const std::shared_ptr< SymbolicExpr > & rhs,
const std::string & x,
const std::string & y,
std::shared_ptr< SymbolicExpr > & P,
std::shared_ptr< SymbolicExpr > & Q,
int & n )

在文件 ode_classification.cpp 第 300 行定义.

307{
309 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
310 (context).limits().max_ast_nodes, "transform");
311 P.reset();
312 Q.reset();
313 n = 0;
314 if (!rhs || !LMCAS::detail::node(rhs) ||
316 return false;
317 }
319 return false;
320 }
321
322 std::vector<std::shared_ptr<const SymbolicNode>> terms;
323 if (auto sum =
324 std::dynamic_pointer_cast<const AddNode>(LMCAS::detail::node(rhs))) {
325 terms = sum->operands();
326 } else {
327 terms.push_back(LMCAS::detail::node(rhs));
328 }
329
330 std::map<int, std::shared_ptr<SymbolicExpr>> coefficients;
331 if (!collect_bernoulli_coefficients(terms, y, coefficients, context)) {
332 return false;
333 }
334 auto linear_coefficient = SymbolicExpr::number(0);
335 std::shared_ptr<SymbolicExpr> nonlinear_coefficient;
336 int nonlinear_exponent = 0;
337 for (auto& [exponent, coefficient] : coefficients) {
338 coefficient = detail::make_expression_ptr(detail::normalize_node(detail::node(coefficient), transform_budget));
339 if (coefficient->is_zero()) {
340 continue;
341 }
342 if (exponent == 1) {
343 linear_coefficient = coefficient;
344 continue;
345 }
346 if (exponent == 0 || nonlinear_coefficient) {
347 return false;
348 }
349 nonlinear_exponent = exponent;
350 nonlinear_coefficient = coefficient;
351 }
352
353 if (!nonlinear_coefficient ||
354 nonlinear_exponent == 0 || nonlinear_exponent == 1) {
355 return false;
356 }
357
359 SymbolicExpr::number(-1), linear_coefficient)), transform_budget));
360 Q = detail::make_expression_ptr(detail::normalize_node(detail::node(nonlinear_coefficient), transform_budget));
361 n = nonlinear_exponent;
362 return true;
363}
static bool valid_classifier_variables(const std::string &x, const std::string &y)
static bool collect_bernoulli_coefficients(const std::vector< std::shared_ptr< const SymbolicNode > > &terms, const std::string &y, std::map< int, std::shared_ptr< SymbolicExpr > > &coefficients, ComputationContext &context)

引用了 collect_bernoulli_coefficients(), context, exponent, expression_depends_on_variable(), is_bernoulli_ode(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), rhs , 以及 valid_classifier_variables().

被这些函数引用 classify_first_order_ode() , 以及 is_bernoulli_ode().

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

◆ is_constant_coefficient()

bool LMCAS::is_constant_coefficient ( const std::vector< std::shared_ptr< SymbolicExpr > > & coeffs,
const std::string & x )

在文件 ode_classification.cpp 第 412 行定义.

415{
416 if (coeffs.empty() || x.empty()) {
417 return false;
418 }
419 for (const auto& c : coeffs) {
420 if (!c || !LMCAS::detail::node(c)) {
421 return false;
422 }
424 return false;
425 }
426 }
427 return true;
428}

引用了 c, expression_depends_on_variable(), is_constant_coefficient() , 以及 LMCAS::detail::node().

被这些函数引用 classify_higher_order_ode() , 以及 is_constant_coefficient().

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

◆ is_euler_equation()

bool LMCAS::is_euler_equation ( const std::vector< std::shared_ptr< SymbolicExpr > > & coeffs,
const std::string & x,
std::vector< double > & euler_consts )

在文件 ode_classification.cpp 第 431 行定义.

435{
437 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
438 (context).limits().max_ast_nodes, "transform");
439 euler_consts.clear();
440 if (coeffs.empty() || x.empty()) {
441 return false;
442 }
443 if (!coeffs.front() || !LMCAS::detail::node(coeffs.front()) ||
444 coeffs.front()->is_zero()) {
445 return false;
446 }
447
448 const int highest_order = static_cast<int>(coeffs.size()) - 1;
449 std::vector<double> extracted(coeffs.size(), 0.0);
450 for (int index = 0; index <= highest_order; ++index) {
451 const int derivative_order = highest_order - index;
452 if (!coeffs[index] || !LMCAS::detail::node(coeffs[index])) {
453 return false;
454 }
455 if (coeffs[index]->is_zero()) {
456 continue;
457 }
458
459 std::shared_ptr<SymbolicExpr> ratio;
460 if (derivative_order == 0) {
461 ratio = detail::make_expression_ptr(detail::normalize_node(detail::node(coeffs[index]), transform_budget));
462 } else {
463 auto x_power = SymbolicExpr::power(
464 SymbolicExpr::variable(x),
465 SymbolicExpr::number(derivative_order));
467 coeffs[index], x_power)), transform_budget));
468 }
469 if (!ratio || !LMCAS::detail::node(ratio)) {
470 return false;
471 }
472
474 LMCAS::detail::node(ratio), x)) {
475 return false;
476 }
477
478 const double value = try_eval_double(ratio);
479 if (!std::isfinite(value)) {
480 return false;
481 }
482 extracted[index] = value;
483 }
484
485 euler_consts = std::move(extracted);
486 return true;
487}

引用了 context, expression_depends_on_variable(), is_euler_equation(), LMCAS::SymbolicNode::is_zero(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), try_eval_double() , 以及 value.

被这些函数引用 classify_higher_order_ode() , 以及 is_euler_equation().

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

◆ is_even_integer_number()

bool LMCAS::is_even_integer_number ( const NumberNode & num)

在文件 inference_engine_facts.cpp 第 313 行定义.

313 {
314 if (!is_integer_number(num)) {
315 return false;
316 }
317
318 if (std::holds_alternative<BigInt>(num.value())) {
319 return std::get<BigInt>(num.value()).is_even();
320 }
321 return std::get<Rational>(num.value()).get_numerator().is_even();
322}
bool is_integer_number(const NumberNode &num)

引用了 is_even_integer_number(), is_integer_number() , 以及 LMCAS::polynomial_solver_detail::num().

被这些函数引用 LMCAS::InferenceEngine::Impl::even_power_sign(), LMCAS::InferenceEngine::Impl::integer_power_sign() , 以及 is_even_integer_number().

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

◆ is_exact_ode()

bool LMCAS::is_exact_ode ( const std::shared_ptr< SymbolicExpr > & M,
const std::shared_ptr< SymbolicExpr > & N,
const std::string & x,
const std::string & y )

恰当条件: ∂M/∂y = ∂N/∂x

计算差值并化简

在文件 ode_classification.cpp 第 366 行定义.

371{
373 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
374 (context).limits().max_ast_nodes, "transform");
375 if (!M || !LMCAS::detail::node(M) ||
376 !N || !LMCAS::detail::node(N) ||
378 return false;
379 }
380
381 /// 恰当条件: ∂M/∂y = ∂N/∂x
382 auto dM_dy = detail::make_expression_ptr(detail::differentiate_node(detail::node(M), y, transform_budget));
383 auto dN_dx = detail::make_expression_ptr(detail::differentiate_node(detail::node(N), x, transform_budget));
384
385 if (!dM_dy || !dN_dx) {
386 return false;
387 }
388
389 dM_dy = detail::make_expression_ptr(detail::normalize_node(detail::node(dM_dy), transform_budget));
390 dN_dx = detail::make_expression_ptr(detail::normalize_node(detail::node(dN_dx), transform_budget));
391 if (dM_dy->compare(dN_dx) == 0) {
392 return true;
393 }
394
395 /// 计算差值并化简
396 auto diff = SymbolicExpr::add(dM_dy,
397 SymbolicExpr::multiply(SymbolicExpr::number(-1), dN_dx));
398 diff = detail::make_expression_ptr(detail::normalize_node(detail::node(diff), transform_budget));
399
400 if (diff->is_zero()) {
401 return true;
402 }
403
404
405 auto verified = check_zero_residual(diff, context);
406 return verified &&
407 std::holds_alternative<ProvedZeroResidual>(verified.value());
408
409}

引用了 check_zero_residual(), context, LMCAS::detail::differentiate_node(), is_exact_ode(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 valid_classifier_variables().

被这些函数引用 classify_first_order_ode() , 以及 is_exact_ode().

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

◆ is_good_prime()

bool LMCAS::is_good_prime ( int64_t p,
const std::vector< BigInt > & leading_coeffs )
inline

判断素数 p 是否为"好素数"(不整除任何首项系数)

参数
p待检测素数
leading_coeffs首项系数列表
返回
若 p 不整除任何系数则返回 true

在文件 modular_arithmetic.hpp 第 473 行定义.

473 {
474 if (p < 2) {
475 throw std::domain_error("prime modulus must be at least two");
476 }
477 const BigInt modulus(p);
478 return std::none_of(leading_coeffs.begin(), leading_coeffs.end(),
479 [&modulus](const BigInt& coefficient) {
480 return (coefficient % modulus).is_zero();
481 });
482}

引用了 is_good_prime().

被这些函数引用 generate_good_primes() , 以及 is_good_prime().

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

◆ is_homogeneous_ode()

bool LMCAS::is_homogeneous_ode ( const std::shared_ptr< SymbolicExpr > & rhs,
const std::string & x,
const std::string & y )

齐次方程: f(tx, ty) = f(x, y) 对所有 t 成立 用 t=2 进行数值测试:f(2x, 2y) 应等于 f(x, y)

计算 f_scaled - rhs,若化简为零则齐次

在文件 ode_classification.cpp 第 147 行定义.

151{
153 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
154 (context).limits().max_ast_nodes, "transform");
155 if (!rhs || !LMCAS::detail::node(rhs)) {
156 return false;
157 }
158 if (!valid_classifier_variables(x, y)) {
159 return false;
160 }
161
162 /// 齐次方程: f(tx, ty) = f(x, y) 对所有 t 成立
163 /// 用 t=2 进行数值测试:f(2x, 2y) 应等于 f(x, y)
164 auto t_val = SymbolicExpr::number(2);
165 auto tx = SymbolicExpr::multiply(t_val, SymbolicExpr::variable(x));
166 auto ty = SymbolicExpr::multiply(t_val, SymbolicExpr::variable(y));
167
168 auto f_scaled = detail::make_expression_ptr(detail::substitute_node(detail::node(rhs), x, detail::node(tx), transform_budget));
169 f_scaled = detail::make_expression_ptr(detail::substitute_node(detail::node(f_scaled), y, detail::node(ty), transform_budget));
170 f_scaled = detail::make_expression_ptr(detail::normalize_node(detail::node(f_scaled), transform_budget));
171
172 /// 计算 f_scaled - rhs,若化简为零则齐次
173 auto diff = SymbolicExpr::add(f_scaled,
174 SymbolicExpr::multiply(SymbolicExpr::number(-1), rhs));
175 diff = detail::make_expression_ptr(detail::normalize_node(detail::node(diff), transform_budget));
176
177 if (diff->is_zero()) {
178 return true;
179 }
180
181
182 auto verified = check_zero_residual(diff, context);
183 return verified &&
184 std::holds_alternative<ProvedZeroResidual>(verified.value());
185}

引用了 check_zero_residual(), context, is_homogeneous_ode(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), rhs, LMCAS::detail::substitute_node() , 以及 valid_classifier_variables().

被这些函数引用 classify_first_order_ode() , 以及 is_homogeneous_ode().

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

◆ is_integer_number()

bool LMCAS::is_integer_number ( const NumberNode & num)

在文件 inference_engine_facts.cpp 第 307 行定义.

307 {
308 if (std::holds_alternative<BigInt>(num.value())) {
309 return true;
310 }
311 return std::get<Rational>(num.value()).is_integer();
312}

引用了 is_integer_number() , 以及 LMCAS::polynomial_solver_detail::num().

被这些函数引用 LMCAS::InferenceEngine::Impl::integer_power_sign(), is_even_integer_number(), is_integer_number(), is_positive_integer_number(), LMCAS::InferenceEngine::Impl::natural_number(), LMCAS::InferenceEngine::Impl::nonzero_power_sign() , 以及 LMCAS::InferenceEngine::Impl::number_integer().

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

◆ is_linear_first_order()

bool LMCAS::is_linear_first_order ( const std::shared_ptr< SymbolicExpr > & rhs,
const std::string & x,
const std::string & y,
std::shared_ptr< SymbolicExpr > & P,
std::shared_ptr< SymbolicExpr > & Q )

方程形式: y' = rhs(x, y) 线性形式: y' + P(x)*y = Q(x) → y' = Q(x) - P(x)*y → rhs = Q(x) - P(x)*y 即 rhs 关于 y 是线性的: rhs = A(x) + B(x)*y,其中 Q = A, P = -B

若 rhs 不依赖 y,则 P=0, Q=rhs

对 rhs 关于 y 求导,若结果不依赖 y,则 rhs 关于 y 是线性的

rhs = A(x) + B(x)*y,其中 B(x) = ∂rhs/∂y 计算 A(x) = rhs|_{y=0}

验证 A 不依赖 y

B(x) = drhs_dy(已验证不依赖 y) 线性形式: y' = A(x) + B(x)*y → y' - B(x)*y = A(x) → y' + (-B(x))*y = A(x) 所以 P = -B(x), Q = A(x)

在文件 ode_classification.cpp 第 92 行定义.

98{
100 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
101 (context).limits().max_ast_nodes, "transform");
102 P.reset();
103 Q.reset();
104 if (!rhs || !LMCAS::detail::node(rhs) ||
106 return false;
107 }
108
109 /// 方程形式: y' = rhs(x, y)
110 /// 线性形式: y' + P(x)*y = Q(x) → y' = Q(x) - P(x)*y → rhs = Q(x) - P(x)*y
111 /// 即 rhs 关于 y 是线性的: rhs = A(x) + B(x)*y,其中 Q = A, P = -B
112
113 /// 若 rhs 不依赖 y,则 P=0, Q=rhs
115 P = SymbolicExpr::number(0);
116 Q = rhs;
117 return true;
118 }
119
120 /// 对 rhs 关于 y 求导,若结果不依赖 y,则 rhs 关于 y 是线性的
121 auto drhs_dy = detail::make_expression_ptr(detail::differentiate_node(detail::node(rhs), y, transform_budget));
122 if (!drhs_dy || expression_depends_on_variable(LMCAS::detail::node(drhs_dy), y)) {
123 return false;
124 }
125
126 /// rhs = A(x) + B(x)*y,其中 B(x) = ∂rhs/∂y
127 /// 计算 A(x) = rhs|_{y=0}
128 auto A = detail::make_expression_ptr(detail::substitute_node(detail::node(rhs), y, detail::node(SymbolicExpr::number(0)), transform_budget));
129 if (!A) {
130 return false;
131 }
132
133 /// 验证 A 不依赖 y
135 return false;
136 }
137
138 /// B(x) = drhs_dy(已验证不依赖 y)
139 /// 线性形式: y' = A(x) + B(x)*y → y' - B(x)*y = A(x) → y' + (-B(x))*y = A(x)
140 /// 所以 P = -B(x), Q = A(x)
141 P = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(SymbolicExpr::number(-1), drhs_dy)), transform_budget));
143 return true;
144}

引用了 context, LMCAS::detail::differentiate_node(), expression_depends_on_variable(), is_linear_first_order(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), rhs, LMCAS::detail::substitute_node() , 以及 valid_classifier_variables().

被这些函数引用 classify_first_order_ode() , 以及 is_linear_first_order().

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

◆ is_negative_infinity_coefficient()

bool LMCAS::is_negative_infinity_coefficient ( const NumberNode & number)
inline

在文件 inference_engine_impl.hpp 第 26 行定义.

26 {
27 if (std::holds_alternative<BigInt>(number.value())) {
28 return std::get<BigInt>(number.value()) < BigInt(0);
29 }
30 return std::get<Rational>(number.value()) < Rational(0);
31}

引用了 is_negative_infinity_coefficient() , 以及 LMCAS::NumberNode::value().

被这些函数引用 infinity_sign() , 以及 is_negative_infinity_coefficient().

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

◆ is_nonreal_sqrt()

bool LMCAS::is_nonreal_sqrt ( const FunctionNode & function,
ComputationContext & context )
static

在文件 calculus_inverse.cpp 第 64 行定义.

65{
66
67 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
68 (context).limits().max_ast_nodes, "transform");
70 function.arguments().size() != 1) {
71 return false;
72 }
73 auto argument = detail::make_expression_ptr(detail::normalize_node(function.arguments()[0], transform_budget));
74 auto number = argument
75 ? std::dynamic_pointer_cast<const NumberNode>(LMCAS::detail::node(argument))
76 : nullptr;
78}
static bool calculus_utils_is_negative_number(const std::shared_ptr< const NumberNode > &number)

引用了 calculus_utils_is_negative_number(), context, function(), is_nonreal_sqrt(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::FunctionNode::Sqrt.

被这些函数引用 calculus_utils_contains_nonreal_sqrt() , 以及 is_nonreal_sqrt().

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

◆ is_pi_variable()

bool LMCAS::is_pi_variable ( const VariableNode & variable)
static

在文件 normalization_utils.cpp 第 177 行定义.

177 {
178 return variable.is_constant() &&
179 (variable.name() == "pi" || variable.name() == "π");
180}

引用了 is_pi_variable() , 以及 variable.

被这些函数引用 get_pi_coeff() , 以及 is_pi_variable().

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

◆ is_polynomial_after_substitution()

bool LMCAS::is_polynomial_after_substitution ( const TransSubstitutionResult & sub_result)

在调用方计算上下文中执行混合超越方程求解.

参数
[in]expr待求解表达式(视为 = 0)
[in]var求解变量名
[in]opts求解选项
[in]context计算预算与取消状态
返回
受检的完整或未决结果

使用默认计算上下文执行受检混合超越方程求解.

判断表达式是否包含依赖指定变量的超越函数.

遍历 AST,检测 sin/cos/tan/exp/ln 节点的参数是否依赖 var. 若超越函数的参数不含 var(即为常数),则不计入.

参数
[in]expr待检测的符号表达式
[in]var目标变量名
返回
包含依赖 var 的超越函数时返回 true,否则返回 false

判断换元结果是否为关于换元变量的多项式.

检查 detect_trans_substitutions 的输出:若映射为空或换元后表达式 仍非多项式形式,则返回 false.

参数
[in]sub_result换元分析结果
返回
换元后为多项式时返回 true,否则返回 false

在文件 mixed_transcendental_classification.cpp 第 262 行定义.

264{
265 if (sub_result.mappings.empty()) {
266 return false;
267 }
268 if (!sub_result.poly_expr || !LMCAS::detail::node(sub_result.poly_expr)) {
269 return false;
270 }
271
272 const auto& root = LMCAS::detail::node(sub_result.poly_expr);
273
274 for (const auto& m : sub_result.mappings) {
275 if (expression_depends_on_variable(root, m.indeterminate) &&
276 degree_in_var(root, m.indeterminate).is_negative()) {
277 return false;
278 }
279 }
280
281 return true;
282}
static BigInt degree_in_var(const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
计算节点关于指定变量的多项式次数。 与 var 无关的子表达式次数为 0。

引用了 expression_depends_on_variable(), is_polynomial_after_substitution(), LMCAS::TransSubstitutionResult::mappings, LMCAS::detail::node() , 以及 LMCAS::TransSubstitutionResult::poly_expr.

被这些函数引用 is_polynomial_after_substitution() , 以及 solve_finite_mixed().

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

◆ is_positive_integer_number()

bool LMCAS::is_positive_integer_number ( const NumberNode & num)

在文件 inference_engine_facts.cpp 第 323 行定义.

323 {
324 return is_integer_number(num) && num.is_positive();
325}

引用了 is_integer_number(), is_positive_integer_number() , 以及 LMCAS::polynomial_solver_detail::num().

被这些函数引用 LMCAS::InferenceEngine::Impl::integral_power_domain(), is_positive_integer_number() , 以及 LMCAS::InferenceEngine::Impl::positive_integer_power_sign().

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

◆ is_representable_small_integer()

bool LMCAS::is_representable_small_integer ( double value)
static

将 double 值转为"干净"的数值表达式.

仅在精确保持 double 值时使用小整数或简单分数表示.

在文件 ode_linear.cpp 第 42 行定义.

42 {
43 return std::isfinite(value) &&
44 value >= static_cast<double>(std::numeric_limits<int>::min()) &&
45 value <= static_cast<double>(std::numeric_limits<int>::max());
46}

引用了 is_representable_small_integer() , 以及 value.

被这些函数引用 clean_number() , 以及 is_representable_small_integer().

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

◆ is_separable()

bool LMCAS::is_separable ( const std::shared_ptr< SymbolicExpr > & rhs,
const std::string & x,
const std::string & y )

若只依赖一个变量或都不依赖,则可分离

检查乘法形式 f(x)*g(y)

在文件 ode_classification.cpp 第 63 行定义.

67{
68 if (!rhs || !LMCAS::detail::node(rhs)) {
69 return false;
70 }
71 if (!valid_classifier_variables(x, y)) {
72 return false;
73 }
74
77
78 /// 若只依赖一个变量或都不依赖,则可分离
79 if (!has_x || !has_y) {
80 return true;
81 }
82
83 /// 检查乘法形式 f(x)*g(y)
84 auto mul = std::dynamic_pointer_cast<const MultiplyNode>(LMCAS::detail::node(rhs));
85 if (mul && separable_product(*mul, x, y)) {
86 return true;
87 }
88 auto power = std::dynamic_pointer_cast<const PowerNode>(LMCAS::detail::node(rhs));
89 return power && separable_reciprocal(*power, x, y);
90}
ExprResult mul(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
static bool separable_product(const MultiplyNode &product, const std::string &x, const std::string &y)
static bool separable_reciprocal(const PowerNode &power, const std::string &x, const std::string &y)

引用了 expression_depends_on_variable(), is_separable(), mul(), LMCAS::detail::node(), rhs, separable_product(), separable_reciprocal() , 以及 valid_classifier_variables().

被这些函数引用 classify_first_order_ode(), is_separable() , 以及 solve_separable_ode().

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

◆ is_variable_operand()

bool LMCAS::is_variable_operand ( const std::shared_ptr< const VariableNode > & node)
static

在文件 inference_engine_monotonicity.cpp 第 189 行定义.

189 {
190 return node && !node->is_constant();
191}

引用了 is_variable_operand().

被这些函数引用 is_variable_operand().

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

◆ is_vertical_asymptote()

Result< bool > LMCAS::is_vertical_asymptote ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & point,
ComputationContext & context )
static

在文件 calculus_asymptotes.cpp 第 210 行定义.

213{
215 if (!right && right.error().code != CasErrc::Inconclusive) {
216 return Result<bool>::failure(right.error());
217 }
219 if (!left && left.error().code != CasErrc::Inconclusive) {
220 return Result<bool>::failure(left.error());
221 }
222 auto infinite = [](const LimitResult& value) {
223 return value && (std::holds_alternative<PositiveInfinityLimit>(value.value().value) ||
224 std::holds_alternative<NegativeInfinityLimit>(value.value().value));
225 };
226 if (infinite(right) || infinite(left)) { return true; }
227 if (!right) { return Result<bool>::failure(right.error()); }
228 if (!left) { return Result<bool>::failure(left.error()); }
229 return false;
230}
Result< Verified< LimitOutcome > > LimitResult

引用了 context, LMCAS::Result< T >::failure(), FromAbove, FromBelow, Inconclusive, is_vertical_asymptote(), limit_checked(), point, right , 以及 value.

被这些函数引用 collect_vertical_asymptotes() , 以及 is_vertical_asymptote().

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

◆ is_wildcard()

bool LMCAS::is_wildcard ( const std::shared_ptr< const SymbolicNode > & node,
const std::unordered_set< std::string > & wildcards,
std::string & name_out )
static

在文件 matcher.cpp 第 52 行定义.

54 {
55 if (!node) return false;
56
57 auto var = std::dynamic_pointer_cast<const VariableNode>(node);
58 if (var && !var->is_constant()) {
59 if (wildcards.count(var->name())) {
60 name_out = var->name();
61 return true;
62 }
63 }
64 return false;
65}

引用了 is_wildcard() , 以及 wildcards.

被这些函数引用 is_wildcard() , 以及 match_recursive().

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

◆ is_zero_dimensional()

bool LMCAS::is_zero_dimensional ( const std::vector< FGLMPoly > & basis,
size_t num_vars )

在文件 fglm_dimension.cpp 第 64 行定义.

64 {
65 if (basis.empty()) return false;
66 for (size_t variable = 0; variable < num_vars; ++variable) {
67 bool found = false;
68 for (const auto& polynomial : basis) {
69 if (polynomial.is_zero()) continue;
70 if (fglm_detail::is_pure_power(polynomial.terms.front().first,
71 variable, num_vars)) {
72 found = true;
73 break;
74 }
75 }
76 if (!found) return false;
77 }
78 return true;
79}

引用了 basis, is_zero_dimensional() , 以及 variable.

被这些函数引用 LMCAS::anonymous_namespace{fglm.cpp}::checked_dimension(), is_zero_dimensional() , 以及 LMCAS::anonymous_namespace{solver_groebner_system.cpp}::simplified_basis().

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

◆ is_zero_number()

bool LMCAS::is_zero_number ( const NumberNode & num)

在文件 inference_engine_facts.cpp 第 326 行定义.

326 {
327 return num.is_zero();
328}

引用了 is_zero_number() , 以及 LMCAS::polynomial_solver_detail::num().

被这些函数引用 LMCAS::InferenceEngine::Impl::integral_power_domain(), is_zero_number() , 以及 LMCAS::InferenceEngine::Impl::zero_power_sign().

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

◆ isolate_linear_coeff()

std::pair< SymbolicExpr, SymbolicExpr > LMCAS::isolate_linear_coeff ( const SymbolicExpr & expr,
const std::string & var,
ComputationContext & context )
static

在文件 solver_linear.cpp 第 257 行定义.

257 {
258
259 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
260 (context).limits().max_ast_nodes, "transform");
261
262 auto expr_ptr = to_ptr(expr);
263 auto A_ptr = detail::make_expression_ptr(detail::differentiate_node(detail::node(expr_ptr), var, transform_budget));
264
265 std::vector<std::shared_ptr<const SymbolicNode>> mops;
266 mops.push_back(LMCAS::detail::node(A_ptr));
267 mops.push_back(SymbolicFactory::create_variable(var));
268 auto term_Ax = SymbolicFactory::create_multiply(mops);
269
270 std::vector<std::shared_ptr<const SymbolicNode>> nops;
271 nops.push_back(SymbolicFactory::create_number(BigInt(-1)));
272 nops.push_back(term_Ax);
273 auto neg_term = SymbolicFactory::create_multiply(nops);
274
275 std::vector<std::shared_ptr<const SymbolicNode>> aops;
276 aops.push_back(LMCAS::detail::node(expr));
277 aops.push_back(neg_term);
278 auto B_node = SymbolicFactory::create_add(aops);
279
280 auto B_expr = LMCAS::detail::expression_from_node(B_node);
281 auto B_simp = detail::make_expression_ptr(detail::normalize_node(detail::node(to_ptr(B_expr)), transform_budget));
282
284 auto A_simp = detail::make_expression_ptr(detail::normalize_node(detail::node(to_ptr(A_expr)), transform_budget));
285
288}
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
std::shared_ptr< SymbolicExpr > to_ptr(const SymbolicExpr &expression)

引用了 context, LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_multiply(), LMCAS::SymbolicFactory::create_number(), LMCAS::SymbolicFactory::create_variable(), LMCAS::detail::differentiate_node(), LMCAS::detail::expression_from_node(), isolate_linear_coeff(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::solver_detail::to_ptr().

被这些函数引用 isolate_linear_coeff() , 以及 LMCAS::solver_detail::solve_linear_system_impl().

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

◆ isolate_real_roots_checked() [1/2]

Result< std::vector< std::pair< Rational, Rational > > > LMCAS::isolate_real_roots_checked ( const Polynomial< Rational > & polynomial)

在文件 newton_raphson.cpp 第 321 行定义.

321 {
323 return isolate_real_roots_checked(polynomial, context);
324}
Result< std::vector< std::pair< Rational, Rational > > > isolate_real_roots_checked(const Polynomial< Rational > &polynomial, ComputationContext &context)

引用了 context , 以及 isolate_real_roots_checked().

函数调用图:

◆ isolate_real_roots_checked() [2/2]

Result< std::vector< std::pair< Rational, Rational > > > LMCAS::isolate_real_roots_checked ( const Polynomial< Rational > & polynomial,
ComputationContext & context )

在文件 newton_raphson.cpp 第 313 行定义.

315 {
317 polynomial, context, "isolate_real_roots");
318}
Result< std::vector< RationalInterval > > isolate_real_roots_exact(const Polynomial< Rational > &polynomial, ComputationContext &context, const std::string &operation)

引用了 context, isolate_real_roots_checked() , 以及 LMCAS::detail::isolate_real_roots_exact().

被这些函数引用 LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::append_exact_factor_roots(), isolate_real_roots_checked(), isolate_real_roots_checked() , 以及 LMCAS::anonymous_namespace{newton_raphson.cpp}::solve_isolated_polynomial().

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

◆ isolate_roots()

std::vector< IsolatedInterval > LMCAS::isolate_roots ( const std::shared_ptr< SymbolicExpr > & expr,
const std::shared_ptr< SymbolicExpr > & derivative,
const std::string & var,
const SearchInterval & interval,
const SolveOptions & opts )

在文件 mixed_transcendental_isolation.cpp 第 205 行定义.

209 {
211 detail::RewriteBudget budget(context, context.limits().max_recursion_depth,
212 context.limits().max_ast_nodes, "isolate_roots");
213 std::optional<CasError> failure;
215 expr, derivative, var, interval, opts, budget, &failure, nullptr);
216 if (failure) throw *failure;
217 return result;
218}
std::vector< IsolatedInterval > isolate_roots_with_context(const std::shared_ptr< SymbolicExpr > &expr, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &var, const SearchInterval &interval, const SolveOptions &opts, RewriteBudget &budget, std::optional< CasError > *failure, bool *complete)

引用了 context, interval(), isolate_roots() , 以及 LMCAS::detail::isolate_roots_with_context().

被这些函数引用 isolate_roots().

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

◆ jacobian()

std::shared_ptr< SymbolicExpr > LMCAS::jacobian ( const std::vector< std::shared_ptr< SymbolicExpr > > & functions,
const std::vector< std::string > & vars )

在文件 vector_calculus_matrices.cpp 第 154 行定义.

157{
159 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
160 context.limits().max_ast_nodes, "jacobian");
161 return jacobian_impl(functions, vars, transform_budget);
162}
std::shared_ptr< SymbolicExpr > jacobian_impl(const std::vector< std::shared_ptr< SymbolicExpr > > &functions, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)

引用了 context, jacobian(), LMCAS::vector_calculus_detail::jacobian_impl() , 以及 vars.

被这些函数引用 jacobian().

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

◆ jacobian_checked() [1/2]

VectorCalculusExprResult LMCAS::jacobian_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & functions,
const std::vector< std::string > & vars )

在文件 vector_calculus_matrices.cpp 第 42 行定义.

45{
47 return jacobian_checked(functions, vars, context);
48}
VectorCalculusExprResult jacobian_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &functions, const std::vector< std::string > &vars, ComputationContext &context)

引用了 context, jacobian_checked() , 以及 vars.

函数调用图:

◆ jacobian_checked() [2/2]

VectorCalculusExprResult LMCAS::jacobian_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & functions,
const std::vector< std::string > & vars,
ComputationContext & context )

在文件 vector_calculus_matrices.cpp 第 10 行定义.

14{
15 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
16 context.limits().max_ast_nodes, "jacobian");
17 const std::string operation = "jacobian";
18 auto valid = vector_calculus_validate_functions_vars(functions, vars,
19 context, operation);
20 if (!valid) {
21 return VectorCalculusExprResult::failure(valid.error());
22 }
23 auto step = context.consume_steps(functions.size() * vars.size(), operation);
24 if (!step) {
25 return VectorCalculusExprResult::failure(step.error());
26 }
27 try {
28 return vector_calculus_wrap_expr(jacobian_impl(functions, vars, transform_budget), operation);
29 } catch (const CasError& error) {
31 } catch (const std::bad_alloc&) {
33 "vector calculus allocation failed",
34 operation);
35 } catch (const std::length_error& error) {
36 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
37 } catch (const std::exception& e) {
39 }
40}
Result< void > vector_calculus_validate_functions_vars(const std::vector< std::shared_ptr< SymbolicExpr > > &functions, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation)

引用了 context, e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, jacobian_checked(), LMCAS::vector_calculus_detail::jacobian_impl(), ResourceLimit, vars, LMCAS::vector_calculus_detail::vector_calculus_validate_functions_vars() , 以及 LMCAS::vector_calculus_detail::vector_calculus_wrap_expr().

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

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

◆ jordan_form_checked() [1/2]

JordanDecompositionResult LMCAS::jordan_form_checked ( const ExprPtr & A)

在文件 matrix_decomposition_eigen.cpp 第 197 行定义.

197 {
199 return jordan_form_checked(A, context);
200}
JordanDecompositionResult jordan_form_checked(const ExprPtr &A, ComputationContext &context)

引用了 context , 以及 jordan_form_checked().

函数调用图:

◆ jordan_form_checked() [2/2]

JordanDecompositionResult LMCAS::jordan_form_checked ( const ExprPtr & A,
ComputationContext & context )

在文件 matrix_decomposition_eigen.cpp 第 165 行定义.

166 {
167 const std::string operation = "jordan_form";
168 auto matrix = validate_decomposition_matrix(A, true, context, operation);
169 if (!matrix) { return JordanDecompositionResult::failure(matrix.error()); }
170 auto budget = context.consume_steps(matrix.value()->rows() * matrix.value()->cols() * 48 + 32,
171 operation);
172 if (!budget) { return JordanDecompositionResult::failure(budget.error()); }
173 try {
174 if (auto diagonal = exact_diagonal_entries(matrix.value(), context)) {
176 matrix.value()->rows(), matrix.value()->cols(), *diagonal),
177 identity_matrix_expr(matrix.value()->rows())}, context);
178 }
179 auto exact = exact_rational_matrix(matrix.value(), context);
180 if (exact && is_defective_upper_pair(*exact)) {
181 auto zero = SymbolicExpr::number(0);
182 auto one = SymbolicExpr::number(1);
183 auto lambda = exact_number_expr((*exact)[0][0]);
184 auto j = SymbolicExpr::matrix({{lambda, one}, {zero, lambda}});
185 auto p = SymbolicExpr::matrix({{exact_number_expr((*exact)[0][1]), zero}, {zero, one}});
186 return certified_jordan(A, {std::move(j), std::move(p)}, context);
187 }
189 } catch (const std::bad_alloc&) {
191 "allocation failed while calculating Jordan form", operation);
192 } catch (const std::exception& ex) {
194 }
195}
JordanDecompositionResult certified_jordan(const ExprPtr &A, JordanDecomposition value, ComputationContext &context)
JordanDecompositionResult diagonalization_checked(const ExprPtr &A, ComputationContext &context)
bool is_defective_upper_pair(const std::vector< std::vector< Rational > > &matrix)
std::shared_ptr< SymbolicExpr > identity_matrix_expr(std::size_t n)
std::shared_ptr< SymbolicExpr > exact_number_expr(const Rational &value)
std::optional< std::vector< Rational > > exact_diagonal_entries(const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context)
std::shared_ptr< SymbolicExpr > rectangular_diagonal_expr(std::size_t rows, std::size_t cols, const std::vector< Rational > &diagonal)
std::optional< std::vector< std::vector< Rational > > > exact_rational_matrix(const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context)

引用了 context, LMCAS::detail::matrix_decomposition::exact_diagonal_entries(), LMCAS::detail::matrix_decomposition::exact_number_expr(), LMCAS::detail::matrix_decomposition::exact_rational_matrix(), LMCAS::Result< JordanDecomposition >::failure(), LMCAS::detail::matrix_decomposition::identity_matrix_expr(), InternalInvariant, jordan_form_checked(), LMCAS::detail::matrix_decomposition::rectangular_diagonal_expr(), ResourceLimit , 以及 LMCAS::detail::matrix_decomposition::validate_decomposition_matrix().

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

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

◆ kronecker()

std::shared_ptr< SymbolicExpr > LMCAS::kronecker ( const std::shared_ptr< SymbolicExpr > & A,
const std::shared_ptr< SymbolicExpr > & B )

在文件 matrix_decomposition.cpp 第 82 行定义.

83 {
85 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
86 (context).limits().max_ast_nodes, "transform");
87 auto a = std::dynamic_pointer_cast<const MatrixNode>(LMCAS::detail::node(A));
88 auto b = std::dynamic_pointer_cast<const MatrixNode>(LMCAS::detail::node(B));
89 if (!a || !b) {
90 return nullptr;
91 }
92 size_t m = a->rows(), n = a->cols(), p = b->rows(), q = b->cols();
93 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> grid(m * p,
94 std::vector<std::shared_ptr<SymbolicExpr>>(n * q));
95 for (size_t i = 0; i < m; ++i)
96 for (size_t j = 0; j < n; ++j) {
97 auto aij = LMCAS::detail::make_expression_ptr(a->get(i, j));
98 for (size_t k = 0; k < p; ++k)
99 for (size_t l = 0; l < q; ++l) {
100 auto bkl = LMCAS::detail::make_expression_ptr(b->get(k, l));
101 grid[i * p + k][j * q + l] = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(aij, bkl)), transform_budget));
102 }
103 }
104 return SymbolicExpr::matrix(grid);
105}

引用了 a, b, context, kronecker(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 kronecker().

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

◆ lagrange_basis_coefficients()

std::vector< Rational > LMCAS::lagrange_basis_coefficients ( const std::vector< Rational > & points,
size_t i,
const Rational & denom )
static

在文件 multivariate_factor.cpp 第 94 行定义.

95 {
96 const size_t n = points.size();
97 std::vector<Rational> basis_coeffs = {Rational(1)};
98 for (size_t j = 0; j < n; ++j) {
99 if (j == i) { continue; }
100 std::vector<Rational> nc(basis_coeffs.size() + 1, Rational(0));
101 for (size_t k = 0; k < basis_coeffs.size(); ++k) {
102 nc[k + 1] = nc[k + 1] + basis_coeffs[k];
103 nc[k] = nc[k] - points[j] * basis_coeffs[k];
104 }
105 basis_coeffs = std::move(nc);
106 }
107 for (auto& c : basis_coeffs) c = c / denom;
108 return basis_coeffs;
109}

引用了 c , 以及 lagrange_basis_coefficients().

被这些函数引用 lagrange_basis_coefficients() , 以及 lagrange_interpolate().

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

◆ lagrange_gradient_strict()

VectorCalculusFieldResult LMCAS::lagrange_gradient_strict ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
const std::string & operation,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_lagrange.cpp 第 25 行定义.

29{
31 gradient.reserve(vars.size());
32 for (const auto& var : vars) {
33 auto partial = vector_calculus_differentiate_strict(f, var, operation, transform_budget);
34 if (!partial) {
35 return VectorCalculusFieldResult::failure(partial.error());
36 }
37 gradient.push_back(std::move(partial.value()));
38 }
40}

引用了 LMCAS::Result< VectorField >::failure(), gradient(), lagrange_gradient_strict(), LMCAS::Result< VectorField >::success(), vars , 以及 LMCAS::vector_calculus_detail::vector_calculus_differentiate_strict().

被这些函数引用 lagrange_gradient_strict() , 以及 lagrange_multipliers_strict().

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

◆ lagrange_interpolate()

MultiPoly LMCAS::lagrange_interpolate ( const std::vector< Rational > & points,
const std::vector< MultiPoly > & values,
const std::string & main_var,
const std::vector< std::string > & all_vars )
static

在文件 multivariate_factor.cpp 第 126 行定义.

129{
130 size_t n = points.size();
131 if (n == 0) { return MultiPoly(Rational(0), all_vars); }
132 int var_idx = -1;
133 for (size_t i = 0; i < all_vars.size(); ++i) {
134 if (all_vars[i] == main_var) { var_idx = static_cast<int>(i); break; }
135 }
136 MultiPoly result(Rational(0), all_vars);
137 for (size_t i = 0; i < n; ++i) {
138 if (values[i].is_zero()) { continue; }
139 Rational denom(1);
140 for (size_t j = 0; j < n; ++j) {
141 if (j == i) { continue; }
142 denom = denom * (points[i] - points[j]);
143 }
144 if (denom.is_zero()) { continue; }
145 auto basis_coeffs = lagrange_basis_coefficients(points, i, denom);
146 add_lagrange_value(result, values[i], basis_coeffs, all_vars, var_idx);
147 }
148 return result;
149}
static std::vector< Rational > lagrange_basis_coefficients(const std::vector< Rational > &points, size_t i, const Rational &denom)
static void add_lagrange_value(MultiPoly &result, const MultiPoly &value, const std::vector< Rational > &basis_coeffs, const std::vector< std::string > &all_vars, int var_idx)

引用了 add_lagrange_value(), lagrange_basis_coefficients(), lagrange_interpolate() , 以及 main_var.

被这些函数引用 extended_gcd_interpolation(), lagrange_interpolate() , 以及 recursive_multivariate_gcd().

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

◆ lagrange_multiplier_names()

std::vector< std::string > LMCAS::lagrange_multiplier_names ( size_t count)
static

在文件 vector_calculus_lagrange.cpp 第 43 行定义.

44{
45 std::vector<std::string> names;
46 names.reserve(count);
47 for (size_t k = 0; k < count; ++k) {
48 names.push_back("lambda_" + std::to_string(k + 1));
49 }
50 return names;
51}

引用了 lagrange_multiplier_names().

被这些函数引用 lagrange_multiplier_names() , 以及 lagrange_multipliers_strict().

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

◆ lagrange_multipliers()

std::vector< std::map< std::string, std::shared_ptr< SymbolicExpr > > > LMCAS::lagrange_multipliers ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::shared_ptr< SymbolicExpr > > & constraints,
const std::vector< std::string > & vars )

在文件 vector_calculus_lagrange.cpp 第 252 行定义.

256{
257 auto result = lagrange_multipliers_checked(f, constraints, vars);
258 if (!result && result.error().code != CasErrc::Inconclusive &&
259 result.error().code != CasErrc::UnsupportedExpression &&
260 result.error().code != CasErrc::DomainError) {
261 throw result.error();
262 }
263 return result ? std::move(result.value()) :
264 std::vector<std::map<std::string, std::shared_ptr<SymbolicExpr>>>{};
265}
LagrangeResult lagrange_multipliers_checked(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::shared_ptr< SymbolicExpr > > &constraints, const std::vector< std::string > &vars, ComputationContext &context)

引用了 DomainError, Inconclusive, lagrange_multipliers(), lagrange_multipliers_checked(), UnsupportedExpression , 以及 vars.

被这些函数引用 lagrange_multipliers().

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

◆ lagrange_multipliers_checked() [1/2]

LagrangeResult LMCAS::lagrange_multipliers_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::shared_ptr< SymbolicExpr > > & constraints,
const std::vector< std::string > & vars )

在文件 vector_calculus_lagrange.cpp 第 244 行定义.

248{
250 return lagrange_multipliers_checked(f, constraints, vars, context);
251}

引用了 context, lagrange_multipliers_checked() , 以及 vars.

函数调用图:

◆ lagrange_multipliers_checked() [2/2]

LagrangeResult LMCAS::lagrange_multipliers_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::shared_ptr< SymbolicExpr > > & constraints,
const std::vector< std::string > & vars,
ComputationContext & context )

在文件 vector_calculus_lagrange.cpp 第 193 行定义.

198{
199 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
200 context.limits().max_ast_nodes, "lagrange_multipliers");
201 const std::string operation = "lagrange_multipliers";
202 auto valid = vector_calculus_validate_expr_vars(f, vars, context, operation);
203 if (!valid) {
204 return LagrangeResult::failure(valid.error());
205 }
206 auto distinct = vector_calculus_validate_distinct_vars(vars, vars.size(), context, operation);
207 if (!distinct) {
208 return LagrangeResult::failure(distinct.error());
209 }
210 if (constraints.empty()) {
212 "constraint list cannot be empty",
213 operation);
214 }
215 for (const auto& constraint : constraints) {
216 if (!constraint || !LMCAS::detail::node(constraint)) {
218 "constraint expressions cannot be null",
219 operation);
220 }
221 }
222 auto step = context.consume_steps(vars.size() * constraints.size() * 6 +
223 vars.size() * 6 + constraints.size() * 4 + 8,
224 operation);
225 if (!step) {
226 return LagrangeResult::failure(step.error());
227 }
228
229 try {
230 return lagrange_multipliers_strict(f, constraints, vars, context, operation, transform_budget);
231 } catch (const CasError& error) {
232 return LagrangeResult::failure(error);
233 } catch (const std::bad_alloc&) {
235 "Lagrange multiplier allocation failed",
236 operation);
237 } catch (const std::length_error& error) {
238 return LagrangeResult::failure(CasErrc::ResourceLimit, error.what(), operation);
239 } catch (const std::exception& e) {
240 return LagrangeResult::failure(CasErrc::InternalInvariant, e.what(), operation);
241 }
242}
static LagrangeResult lagrange_multipliers_strict(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::shared_ptr< SymbolicExpr > > &constraints, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)

引用了 context, e(), LMCAS::Result< std::vector< std::map< std::string, std::shared_ptr< SymbolicExpr > > > >::failure(), InternalInvariant, InvalidArgument, lagrange_multipliers_checked(), lagrange_multipliers_strict(), LMCAS::detail::node(), ResourceLimit, vars, LMCAS::vector_calculus_detail::vector_calculus_validate_distinct_vars() , 以及 LMCAS::vector_calculus_detail::vector_calculus_validate_expr_vars().

被这些函数引用 lagrange_multipliers(), lagrange_multipliers_checked() , 以及 lagrange_multipliers_checked().

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

◆ lagrange_multipliers_strict()

LagrangeResult LMCAS::lagrange_multipliers_strict ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::shared_ptr< SymbolicExpr > > & constraints,
const std::vector< std::string > & vars,
ComputationContext & context,
const std::string & operation,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_lagrange.cpp 第 147 行定义.

152{
153 const size_t n = vars.size();
154 const size_t m = constraints.size();
155 auto gradient = lagrange_gradient_strict(f, vars, operation, transform_budget);
156 if (!gradient) {
157 return LagrangeResult::failure(gradient.error());
158 }
159 std::vector<VectorField> grad_constraints;
160 grad_constraints.reserve(m);
161 for (const auto& constraint : constraints) {
162 auto partials = lagrange_gradient_strict(constraint, vars, operation, transform_budget);
163 if (!partials) {
164 return LagrangeResult::failure(partials.error());
165 }
166 grad_constraints.push_back(std::move(partials.value()));
167 }
168 auto lambda_names = lagrange_multiplier_names(m);
169 VectorField equations;
170 equations.reserve(n + m);
171 for (size_t i = 0; i < n; ++i) {
172 auto equation = lagrange_stationarity_equation(
173 gradient.value(), grad_constraints, lambda_names, i);
174 auto checked = vector_calculus_simplify_strict(equation, operation,
175 "Lagrange stationarity equation is outside the supported domain", transform_budget);
176 if (!checked) {
177 return LagrangeResult::failure(checked.error());
178 }
179 equations.push_back(std::move(checked.value()));
180 }
181 for (const auto& constraint : constraints) equations.push_back(constraint);
182 std::vector<std::string> all_vars;
183 all_vars.reserve(n + m);
184 all_vars.insert(all_vars.end(), vars.begin(), vars.end());
185 all_vars.insert(all_vars.end(), lambda_names.begin(), lambda_names.end());
186 auto solutions = solve_lagrange_strict(equations, all_vars, context, operation);
187 if (!solutions) {
188 return solutions;
189 }
190 return verify_lagrange_solutions(solutions.value(), equations, all_vars, vars, context, operation, transform_budget);
191}
VectorCalculusExprResult vector_calculus_simplify_strict(const std::shared_ptr< SymbolicExpr > &expr, const std::string &operation, const std::string &message, detail::RewriteBudget &transform_budget)
static LagrangeResult solve_lagrange_strict(const VectorField &equations, const std::vector< std::string > &all_vars, ComputationContext &context, const std::string &operation)
static VectorCalculusFieldResult lagrange_gradient_strict(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const std::string &operation, detail::RewriteBudget &transform_budget)
static std::vector< std::string > lagrange_multiplier_names(size_t count)
static LagrangeResult verify_lagrange_solutions(const std::vector< std::map< std::string, std::shared_ptr< SymbolicExpr > > > &full_solutions, const VectorField &equations, const std::vector< std::string > &all_vars, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
static std::shared_ptr< SymbolicExpr > lagrange_stationarity_equation(const VectorField &gradient, const std::vector< VectorField > &constraints, const std::vector< std::string > &multipliers, size_t index)

引用了 context, LMCAS::Result< std::vector< std::map< std::string, std::shared_ptr< SymbolicExpr > > > >::failure(), gradient(), lagrange_gradient_strict(), lagrange_multiplier_names(), lagrange_multipliers_strict(), lagrange_stationarity_equation(), solve_lagrange_strict(), vars, LMCAS::vector_calculus_detail::vector_calculus_simplify_strict() , 以及 verify_lagrange_solutions().

被这些函数引用 lagrange_multipliers_checked() , 以及 lagrange_multipliers_strict().

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

◆ lagrange_stationarity_equation()

std::shared_ptr< SymbolicExpr > LMCAS::lagrange_stationarity_equation ( const VectorField & gradient,
const std::vector< VectorField > & constraints,
const std::vector< std::string > & multipliers,
size_t index )
static

在文件 vector_calculus_lagrange.cpp 第 53 行定义.

56{
57 auto equation = gradient[index];
58 for (size_t k = 0; k < multipliers.size(); ++k) {
59 auto multiplier = SymbolicExpr::variable(multipliers[k]);
60 auto term = SymbolicExpr::multiply(multiplier, constraints[k][index]);
61 equation = SymbolicExpr::add(equation,
62 SymbolicExpr::multiply(SymbolicExpr::number(-1), term));
63 }
64 return equation;
65}

引用了 gradient() , 以及 lagrange_stationarity_equation().

被这些函数引用 lagrange_multipliers_strict() , 以及 lagrange_stationarity_equation().

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

◆ lammp_gcd()

uint64_t LMCAS::lammp_gcd ( uint64_t a,
uint64_t b )
inline

计算两个无符号整数的最大公约数(调用 LMMP)

参数
a第一个无符号整数
b第二个无符号整数
返回
gcd(a, b)

在文件 modular_arithmetic.hpp 第 101 行定义.

101 {
102 if (a == 0) return b;
103 if (b == 0) return a;
104 return lmmp_gcd_11_(a, b);
105}

引用了 a, b , 以及 lammp_gcd().

被这些函数引用 lammp_gcd().

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

◆ lammp_is_prime()

bool LMCAS::lammp_is_prime ( uint64_t n)
inline

判断无符号整数是否为素数

参数
n待判断的整数
返回
是素数返回 true

在文件 modular_arithmetic.hpp 第 112 行定义.

112 {
113 return lmmp_is_prime_ulong_(n);
114}

引用了 lammp_is_prime().

被这些函数引用 lammp_is_prime().

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

◆ lammp_next_prime()

uint64_t LMCAS::lammp_next_prime ( uint64_t n)
inline

求大于 n 的下一个素数

参数
n起始值
返回
大于 n 的最小素数

在文件 modular_arithmetic.hpp 第 121 行定义.

121 {
122 return lmmp_next_prime_ulong_(n);
123}

引用了 lammp_next_prime().

被这些函数引用 lammp_next_prime().

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

◆ laplace_transform_checked() [1/2]

TransformEngineResult LMCAS::laplace_transform_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & t,
const std::string & s )

在文件 transform_laplace.cpp 第 233 行定义.

236 {
238 return laplace_transform_checked(f, t, s, context);
239}
TransformEngineResult laplace_transform_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &s, ComputationContext &context)

引用了 context, laplace_transform_checked() , 以及 t.

函数调用图:

◆ laplace_transform_checked() [2/2]

TransformEngineResult LMCAS::laplace_transform_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & t,
const std::string & s,
ComputationContext & context )

在文件 transform_laplace.cpp 第 200 行定义.

204 {
205 const std::string operation = "laplace_transform";
206 auto valid = te_validate_expr_vars(f, t, s, context, operation);
207 if (!valid) return TransformEngineResult::failure(valid.error());
208 auto step = context.consume_steps(8, operation);
209 if (!step) return TransformEngineResult::failure(step.error());
210 try {
211 auto expression = laplace_transform_core(f, t, s, context);
212 auto final_access = context.consume_steps(0, operation);
213 if (!final_access) {
214 return TransformEngineResult::failure(final_access.error());
215 }
216 auto result = te_wrap_transform_result(std::move(expression), operation);
217 if (result) {
218 result.value().value.roc = te_laplace_roc(f, t, s);
219 }
220 return result;
221 } catch (const CasError& error) {
222 return TransformEngineResult::failure(error);
223 } catch (const std::bad_alloc&) {
225 "transform allocation failed",
226 operation);
227 } catch (const std::exception& e) {
229 e.what(), operation);
230 }
231}
static std::vector< std::shared_ptr< SymbolicExpr > > te_laplace_roc(const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &s)

引用了 context, e(), LMCAS::Result< Verified< EvaluatedTransform > >::failure(), InternalInvariant, laplace_transform_checked(), LMCAS::transform_detail::laplace_transform_core(), ResourceLimit, t, te_laplace_roc(), LMCAS::transform_detail::te_validate_expr_vars() , 以及 LMCAS::transform_detail::te_wrap_transform_result().

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

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

◆ laplacian()

std::shared_ptr< SymbolicExpr > LMCAS::laplacian ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars )

在文件 vector_calculus_differential.cpp 第 359 行定义.

361{
363 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
364 context.limits().max_ast_nodes, "laplacian");
365 return laplacian_impl(f, vars, transform_budget);
366}
std::shared_ptr< SymbolicExpr > laplacian_impl(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)

引用了 context, laplacian(), LMCAS::vector_calculus_detail::laplacian_impl() , 以及 vars.

被这些函数引用 laplacian().

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

◆ laplacian_checked() [1/2]

VectorCalculusExprResult LMCAS::laplacian_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars )

在文件 vector_calculus_differential.cpp 第 287 行定义.

290{
292 return laplacian_checked(f, vars, context);
293}
VectorCalculusExprResult laplacian_checked(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context)

引用了 context, laplacian_checked() , 以及 vars.

函数调用图:

◆ laplacian_checked() [2/2]

VectorCalculusExprResult LMCAS::laplacian_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
ComputationContext & context )

在文件 vector_calculus_differential.cpp 第 256 行定义.

260{
261 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
262 context.limits().max_ast_nodes, "laplacian");
263 const std::string operation = "laplacian";
264 auto valid = vector_calculus_validate_expr_vars(f, vars, context, operation);
265 if (!valid) {
266 return VectorCalculusExprResult::failure(valid.error());
267 }
268 auto step = context.consume_steps(vars.size() * 2, operation);
269 if (!step) {
270 return VectorCalculusExprResult::failure(step.error());
271 }
272 try {
273 return vector_calculus_wrap_expr(laplacian_impl(f, vars, transform_budget), operation);
274 } catch (const CasError& error) {
276 } catch (const std::bad_alloc&) {
278 "vector calculus allocation failed",
279 operation);
280 } catch (const std::length_error& error) {
281 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
282 } catch (const std::exception& e) {
284 }
285}

引用了 context, e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, laplacian_checked(), LMCAS::vector_calculus_detail::laplacian_impl(), ResourceLimit, vars, LMCAS::vector_calculus_detail::vector_calculus_validate_expr_vars() , 以及 LMCAS::vector_calculus_detail::vector_calculus_wrap_expr().

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

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

◆ laurent_series_checked() [1/2]

ExpressionResult LMCAS::laurent_series_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & center,
int order_neg,
int order_pos )

在文件 series_expansions.cpp 第 372 行定义.

378{
380 return laurent_series_checked(f, var, center, order_neg, order_pos, context);
381}
ExpressionResult laurent_series_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &center, int order_neg, int order_pos, ComputationContext &context)

引用了 context , 以及 laurent_series_checked().

函数调用图:

◆ laurent_series_checked() [2/2]

ExpressionResult LMCAS::laurent_series_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & center,
int order_neg,
int order_pos,
ComputationContext & context )

在文件 series_expansions.cpp 第 338 行定义.

345 {
346 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
347 (context).limits().max_ast_nodes, "transform");
348 auto full = laurent_series_full_checked(
349 f, var, center, order_neg, order_pos, context);
350 if (!full) {
351 return ExpressionResult::failure(full.error());
352 }
353 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(f), transform_budget));
354 auto supported_power = simplified
356 LMCAS::detail::node(simplified), var)
357 : std::nullopt;
358 if (center->is_zero() && supported_power && *supported_power < 0) {
359 return ExpressionResult::success(std::move(simplified));
360 }
361 return ExpressionResult::success(std::move(full.value().series));
362} catch (const CasError& error) {
363 return ExpressionResult::failure(error);
364} catch (const std::bad_alloc&) {
365 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "laurent_series_checked");
366} catch (const std::length_error& error) {
367 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "laurent_series_checked");
368} catch (const std::exception& error) {
369 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "laurent_series_checked");
370}
LaurentSeriesResult laurent_series_full_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &center, int order_neg, int order_pos, ComputationContext &context)

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), laurent_series_checked(), laurent_series_full_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success() , 以及 supported_laurent_integer_power().

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

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

◆ laurent_series_full_checked() [1/2]

LaurentSeriesResult LMCAS::laurent_series_full_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & center,
int order_neg,
int order_pos )

在文件 series_expansions.cpp 第 477 行定义.

483{
485 return laurent_series_full_checked(f, var, center, order_neg, order_pos, context);
486}

引用了 context , 以及 laurent_series_full_checked().

函数调用图:

◆ laurent_series_full_checked() [2/2]

LaurentSeriesResult LMCAS::laurent_series_full_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & center,
int order_neg,
int order_pos,
ComputationContext & context )

在文件 series_expansions.cpp 第 411 行定义.

418 {
419 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
420 (context).limits().max_ast_nodes, "transform");
421 const std::string operation = "laurent_series_full";
422 auto input = validate_series_expr_point(f, center, var, context, operation);
423 if (!input) {
424 return LaurentSeriesResult::failure(input.error());
425 }
426 auto order_check = validate_laurent_orders(order_neg, order_pos, operation);
427 if (!order_check) {
428 return LaurentSeriesResult::failure(order_check.error());
429 }
430 auto budget = context.consume_steps(static_cast<std::size_t>(order_neg + order_pos + 1) * 16 + 16,
431 operation);
432 if (!budget) {
433 return LaurentSeriesResult::failure(budget.error());
434 }
435 try {
436 auto simplified_input = detail::make_expression_ptr(detail::normalize_node(detail::node(f), transform_budget));
437 if (!simplified_input || !LMCAS::detail::node(simplified_input)) {
440 "checked Laurent input could not be simplified in the supported domain",
441 operation);
442 }
443 auto supported_power = supported_laurent_integer_power(
444 LMCAS::detail::node(simplified_input), var);
445 auto built = laurent_series_full_impl(
446 f, var, center, order_neg, order_pos, context);
447 if (!built) {
448 return built;
449 }
450 auto result = std::move(built.value());
451 auto valid = validate_laurent_result(result, supported_power, center, operation);
452 if (!valid) {
453 return LaurentSeriesResult::failure(valid.error());
454 }
455 return LaurentSeriesResult::success(std::move(result));
456 } catch (const CasError& error) {
457 return LaurentSeriesResult::failure(error);
458 } catch (const std::bad_alloc&) {
460 "allocation failed while calculating Laurent series",
461 operation);
462 } catch (const std::length_error& error) { return LaurentSeriesResult::failure(CasErrc::ResourceLimit, error.what(), "laurent_series_full"); } catch (const std::exception& ex) {
464 ex.what(),
465 operation);
466 }
467} catch (const CasError& error) {
468 return LaurentSeriesResult::failure(error);
469} catch (const std::bad_alloc&) {
470 return LaurentSeriesResult::failure(CasErrc::ResourceLimit, "allocation failed", "laurent_series_full");
471} catch (const std::length_error& error) {
472 return LaurentSeriesResult::failure(CasErrc::ResourceLimit, error.what(), "laurent_series_full");
473} catch (const std::exception& error) {
474 return LaurentSeriesResult::failure(CasErrc::InternalInvariant, error.what(), "laurent_series_full");
475}
static Result< void > validate_laurent_result(const LaurentResult &result, const std::optional< int > &supported_power, const std::shared_ptr< SymbolicExpr > &center, const std::string &operation)
static LaurentSeriesResult laurent_series_full_impl(const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::shared_ptr< SymbolicExpr > &, int, int, ComputationContext &)
Result< void > validate_series_expr_point(const std::shared_ptr< SymbolicExpr > &expr, const std::shared_ptr< SymbolicExpr > &center, const std::string &var, ComputationContext &context, const std::string &operation)
Result< void > validate_laurent_orders(int order_neg, int order_pos, const std::string &operation)

引用了 context, LMCAS::Result< LaurentResult >::failure(), Inconclusive, InternalInvariant, laurent_series_full_checked(), laurent_series_full_impl(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), ResourceLimit, LMCAS::Result< LaurentResult >::success(), supported_laurent_integer_power(), validate_laurent_orders(), validate_laurent_result() , 以及 validate_series_expr_point().

被这些函数引用 laurent_series_checked(), laurent_series_full_checked() , 以及 laurent_series_full_checked().

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

◆ laurent_series_full_impl()

LaurentSeriesResult LMCAS::laurent_series_full_impl ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & center,
int order_neg,
int order_pos,
ComputationContext & context )
static

对 regular(解析部分)做 Taylor 展开

Laurent = taylor / (x-c)^pole_order

留数 = Taylor 展开中 (x-c)^(pole_order-1) 的系数

a_{m-1} = (1/(m-1)!) lim_{x->c} d^{m-1}/dx^{m-1} [regular]

用极限求值,稳健处理 0/0 形式(如 z/(z(z+1)) 在 z=0).

在文件 series_expansions.cpp 第 569 行定义.

572 {
573 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
574 (context).limits().max_ast_nodes, "transform");
575 LaurentResult res{nullptr, SingularityType::Removable, 0, SymbolicExpr::number(0)};
576 if (!f || !center) {
577 return res;
578 }
579
580 auto x = SymbolicExpr::variable(var);
581 auto shift = SymbolicExpr::add(x, SymbolicExpr::multiply(SymbolicExpr::number(-1), center));
582 if (!expression_depends_on_variable(detail::node(center), var)) {
583 if (auto m = essential_exponent(f, shift, context)) {
584 return essential_laurent(shift, *m, order_neg, context);
585 }
586 }
587
588 std::shared_ptr<SymbolicExpr> regular = f;
589 auto extracted = extract_laurent_regular_part(
590 f, var, center, shift, regular, context);
591 if (!extracted) {
592 return LaurentSeriesResult::failure(extracted.error());
593 }
594 const int pole_order = extracted.value();
595
596 /// 对 regular(解析部分)做 Taylor 展开
597 int taylor_order = order_pos + pole_order + 1;
598 if (taylor_order < 1) {
599 taylor_order = 1;
600 }
601 auto taylor = regular->series(var, center, taylor_order);
602 if (!taylor) {
603 return res;
604 }
605
606 /// Laurent = taylor / (x-c)^pole_order
607 std::shared_ptr<SymbolicExpr> laurent = taylor;
608 if (pole_order > 0) {
609 auto powm = SymbolicExpr::power(shift, SymbolicExpr::number(pole_order));
610 laurent = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(taylor, powm)), transform_budget));
611 }
612
614 res.pole_order = pole_order;
615 if (pole_order == 0) {
617 } else {
619 }
620
621 /// 留数 = Taylor 展开中 (x-c)^(pole_order-1) 的系数
622 if (pole_order >= 1) {
623 /// a_{m-1} = (1/(m-1)!) lim_{x->c} d^{m-1}/dx^{m-1} [regular]
624 auto deriv = regular;
625 for (int i = 0; i < pole_order - 1; ++i) deriv = detail::make_expression_ptr(detail::differentiate_node(detail::node(deriv), var, transform_budget));
626 /// 用极限求值,稳健处理 0/0 形式(如 z/(z(z+1)) 在 z=0).
627 auto limited = limit_expression_checked(
628 deriv, var, center, LimitDirection::Both, context);
629 if (!limited) {
630 return LaurentSeriesResult::failure(limited.error());
631 }
632 auto val = std::move(limited.value());
633 if (!val) {
634 val = detail::make_expression_ptr(detail::substitute_node(detail::node(deriv), var, detail::node(center), transform_budget));
635 }
636 auto fact = BigInt::factorial_checked(BigInt(pole_order - 1), context);
637 if (!fact) {
638 return LaurentSeriesResult::failure(fact.error());
639 }
640 res.residue = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(val, SymbolicExpr::number(fact.value()))), transform_budget));
641 }
642
643 return res;
644} catch (const CasError& error) {
645 return LaurentSeriesResult::failure(error);
646} catch (const std::bad_alloc&) {
647 return LaurentSeriesResult::failure(CasErrc::ResourceLimit, "allocation failed", "laurent_series_full_impl");
648} catch (const std::length_error& error) {
649 return LaurentSeriesResult::failure(CasErrc::ResourceLimit, error.what(), "laurent_series_full_impl");
650} catch (const std::exception& error) {
651 return LaurentSeriesResult::failure(CasErrc::InternalInvariant, error.what(), "laurent_series_full_impl");
652}
static LaurentSeriesResult essential_laurent(const std::shared_ptr< SymbolicExpr > &shift, int m, int order_neg, ComputationContext &context)
SingularityType singularity
奇点类型
int pole_order
极点阶数(非极点时为 0)
static std::optional< int > essential_exponent(const std::shared_ptr< SymbolicExpr > &f, const std::shared_ptr< SymbolicExpr > &shift, ComputationContext &context)
std::shared_ptr< SymbolicExpr > residue
留数((z-z_0)-¹ 的系数)
std::shared_ptr< SymbolicExpr > series
洛朗级数表达式
static Result< int > extract_laurent_regular_part(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &center, const std::shared_ptr< SymbolicExpr > &shift, std::shared_ptr< SymbolicExpr > &regular, ComputationContext &context)

引用了 Both, context, LMCAS::detail::differentiate_node(), essential_exponent(), essential_laurent(), expression_depends_on_variable(), extract_laurent_regular_part(), LMCAS::Result< LaurentResult >::failure(), laurent_series_full_impl(), limit_expression_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), Pole, LMCAS::LaurentResult::pole_order, Removable, LMCAS::LaurentResult::residue, LMCAS::LaurentResult::series, LMCAS::LaurentResult::singularity , 以及 LMCAS::detail::substitute_node().

被这些函数引用 laurent_series_full_checked() , 以及 laurent_series_full_impl().

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

◆ lcm_monomial()

Monomial LMCAS::lcm_monomial ( const Monomial & a,
const Monomial & b )
inline

计算两个单项式的最小公倍单项式

参数
a第一个单项式
b第二个单项式
返回
各分量取最大值构成的单项式

在文件 monomial_order.hpp 第 40 行定义.

40 {
41 Monomial result(std::max(a.size(), b.size()), 0);
42 for (size_t i = 0; i < a.size(); ++i)
43 result[i] = std::max(result[i], a[i]);
44 for (size_t i = 0; i < b.size(); ++i)
45 result[i] = std::max(result[i], b[i]);
46 return result;
47}

引用了 a, b , 以及 lcm_monomial().

被这些函数引用 lcm_monomial().

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

◆ le()

ExprResult LMCAS::le ( const ExprPtr & lhs,
const ExprPtr & rhs )

在文件 expr_facade.cpp 第 201 行定义.

201 {
202 return relation(lhs, rhs, RelationOp::LEQ);
203}

引用了 le(), LEQ, relation() , 以及 rhs.

被这些函数引用 le().

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

◆ lie_derivative_checked() [1/2]

DifferentialGeometryExprResult LMCAS::lie_derivative_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::shared_ptr< SymbolicExpr > > & X,
const std::vector< std::string > & vars,
int order )

在文件 differential_geometry.cpp 第 678 行定义.

683{
686}
DifferentialGeometryExprResult lie_derivative_checked(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::shared_ptr< SymbolicExpr > > &X, const std::vector< std::string > &vars, int order, ComputationContext &context)

引用了 context, lie_derivative_checked(), order , 以及 vars.

函数调用图:

◆ lie_derivative_checked() [2/2]

DifferentialGeometryExprResult LMCAS::lie_derivative_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::shared_ptr< SymbolicExpr > > & X,
const std::vector< std::string > & vars,
int order,
ComputationContext & context )

在文件 differential_geometry.cpp 第 637 行定义.

643{
644 const std::string operation = "lie_derivative";
645 auto step = context.consume_steps(1, operation);
646 if (!step) return DifferentialGeometryExprResult::failure(step.error());
647 if (!f || !LMCAS::detail::node(f)) {
649 "scalar function cannot be null",
650 operation);
651 }
652 if (order < 0 || order > 64) {
654 "Lie derivative order must be between 0 and 64",
655 operation);
656 }
657 auto vector_check = validate_expr_vector(X, vars, "vector field", operation);
658 if (!vector_check) return DifferentialGeometryExprResult::failure(vector_check.error());
659 auto budget = context.consume_steps(static_cast<std::size_t>(order + 1) * vars.size() * 8 + 8,
660 operation);
661 if (!budget) return DifferentialGeometryExprResult::failure(budget.error());
662 try {
663 auto result = lie_derivative_impl(f, X, vars, order, context);
664 return checked_geometry_expression(std::move(result), CasErrc::Inconclusive,
665 "Lie derivative could not be constructed",
666 operation);
667 } catch (const std::bad_alloc&) {
669 "allocation failed while calculating Lie derivative",
670 operation);
671 } catch (const std::exception& ex) {
673 ex.what(),
674 operation);
675 }
676}
Result< void > validate_expr_vector(const std::vector< std::shared_ptr< SymbolicExpr > > &values, const std::vector< std::string > &vars, const std::string &value_name, const std::string &operation)
static std::shared_ptr< SymbolicExpr > lie_derivative_impl(const std::shared_ptr< SymbolicExpr > &, const std::vector< std::shared_ptr< SymbolicExpr > > &, const std::vector< std::string > &, int, ComputationContext &context)

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive, InternalInvariant, InvalidArgument, lie_derivative_checked(), lie_derivative_impl(), LMCAS::detail::node(), order, ResourceLimit , 以及 vars.

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

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

◆ lie_derivative_impl()

std::shared_ptr< SymbolicExpr > LMCAS::lie_derivative_impl ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::shared_ptr< SymbolicExpr > > & X,
const std::vector< std::string > & vars,
int order,
ComputationContext & context )
static

在文件 differential_geometry.cpp 第 688 行定义.

692 {
693
694 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
695 (context).limits().max_ast_nodes, "transform");
696 if (!f || X.size() != vars.size()) return SymbolicExpr::number(0);
697 auto result = f;
698 for (int it = 0; it < order; ++it) {
699 auto acc = SymbolicExpr::number(0);
700 for (size_t i = 0; i < vars.size(); ++i) {
701 auto partial = detail::make_expression_ptr(detail::differentiate_node(detail::node(result), vars[i], transform_budget));
702 acc = SymbolicExpr::add(acc, SymbolicExpr::multiply(X[i], partial));
703 }
704 result = detail::make_expression_ptr(detail::normalize_node(detail::node(acc), transform_budget));
705 }
706 return result;
707}

引用了 context, LMCAS::detail::differentiate_node(), lie_derivative_impl(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), order , 以及 vars.

被这些函数引用 lie_derivative_checked() , 以及 lie_derivative_impl().

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

◆ lifting_error_coefficient()

MultiPoly LMCAS::lifting_error_coefficient ( const MultiPoly & error,
const std::string & lift_var,
int lift_var_idx,
const Rational & eval_point,
int k,
const std::vector< MultiPoly > & shift_powers,
const std::vector< std::string > & vars )
static

逐次除以 (lift_var - eval_point),再在 eval_point 处求值。 得到 error / (lift_var - eval_point)^k 的值, 等价于 error 的 k 阶导数在该点的值除以 k!。

在文件 multivariate_hensel.cpp 第 89 行定义.

92 {
93 MultiPoly error_k;
94 if (eval_point.is_zero()) {
95 std::vector<MultiPoly::Term> error_k_terms;
96 for (const auto& term : error.terms()) {
97 const Monomial& mono = term.first;
98 int exp = (lift_var_idx >= 0 && static_cast<size_t>(lift_var_idx) < mono.size())
99 ? mono[lift_var_idx] : 0;
100 if (exp == k) {
101 Monomial reduced = mono;
102 reduced[lift_var_idx] = 0;
103 error_k_terms.emplace_back(std::move(reduced), term.second);
104 }
105 }
106 if (error_k_terms.empty()) { return MultiPoly(Rational(0), vars); }
107 error_k = MultiPoly(std::move(error_k_terms), vars);
108 } else {
109 /**
110 * @brief 逐次除以 (lift_var - eval_point),再在 eval_point 处求值。
111 * 得到 error / (lift_var - eval_point)^k 的值,
112 * 等价于 error 的 k 阶导数在该点的值除以 k!。
113 */
114 MultiPoly remainder = error;
115 for (int j = 0; j < k; ++j) {
116 MultiPoly eval_check = remainder.eval(lift_var, eval_point);
117 if (!eval_check.is_zero()) {
118 remainder = MultiPoly(Rational(0), vars);
119 break;
120 }
121 try {
122 remainder = remainder.exact_div(shift_powers[1]);
123 } catch (const std::runtime_error&) {
124 remainder = MultiPoly(Rational(0), vars);
125 break;
126 }
127 }
128 error_k = embed_hensel_terms(remainder.eval(lift_var, eval_point), vars);
129 if (error_k.is_zero()) { return error_k; }
130 }
131 return error_k;
132}

引用了 embed_hensel_terms(), exp(), lifting_error_coefficient() , 以及 vars.

被这些函数引用 apply_hensel_lift_steps() , 以及 lifting_error_coefficient().

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

◆ lifting_residual_is_zero()

bool LMCAS::lifting_residual_is_zero ( const MultiPoly & verify_error,
int lift_var_idx,
int k )
static

在文件 multivariate_hensel.cpp 第 153 行定义.

154 {
155 if (verify_error.is_zero()) { return true; }
156 bool residual_ok = true;
157 for (const auto& term : verify_error.terms()) {
158 const Monomial& mono = term.first;
159 int exp = (lift_var_idx >= 0 &&
160 static_cast<size_t>(lift_var_idx) < mono.size())
161 ? mono[lift_var_idx] : 0;
162 if (exp <= k) {
163 residual_ok = false;
164 break;
165 }
166 }
167 return residual_ok;
168}

引用了 exp() , 以及 lifting_residual_is_zero().

被这些函数引用 apply_hensel_lift_steps() , 以及 lifting_residual_is_zero().

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

◆ lifting_shift_powers()

std::vector< MultiPoly > LMCAS::lifting_shift_powers ( const std::vector< std::string > & vars,
int lift_var_idx,
const Rational & eval_point,
int degree_bound )
static

< 零次幂 (lift_var - eval_point)^0 = 1。

在文件 multivariate_hensel.cpp 第 61 行定义.

63 {
64 std::vector<MultiPoly> shift_powers;
65 shift_powers.reserve(degree_bound + 1);
66 shift_powers.push_back(MultiPoly(Rational(1), vars)); /**< 零次幂 (lift_var - eval_point)^0 = 1。 */
67 if (lift_var_idx >= 0) {
68 Monomial var_mono(vars.size(), 0);
69 var_mono[lift_var_idx] = 1;
70 std::vector<MultiPoly::Term> lin_terms;
71 lin_terms.emplace_back(var_mono, Rational(1));
72 if (!eval_point.is_zero()) {
73 Monomial const_mono(vars.size(), 0);
74 lin_terms.emplace_back(const_mono, -eval_point);
75 }
76 MultiPoly shift_lin(std::move(lin_terms), vars);
77 shift_powers.push_back(shift_lin);
78 for (int k = 2; k <= degree_bound; ++k) {
79 shift_powers.push_back(shift_powers[k - 1] * shift_lin);
80 }
81 } else {
82 for (int k = 1; k <= degree_bound; ++k) {
83 shift_powers.push_back(MultiPoly(Rational(1), vars));
84 }
85 }
86 return shift_powers;
87}

引用了 lifting_shift_powers() , 以及 vars.

被这些函数引用 apply_hensel_lift_steps() , 以及 lifting_shift_powers().

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

◆ lim_inf_checked() [1/2]

ExpressionResult LMCAS::lim_inf_checked ( const std::shared_ptr< SymbolicExpr > & a_n,
const std::string & n )

在文件 series_sequence_limits.cpp 第 207 行定义.

208 {
210 return lim_inf_checked(a_n, n, context);
211}
ExpressionResult lim_inf_checked(const std::shared_ptr< SymbolicExpr > &a_n, const std::string &n, ComputationContext &context)

引用了 context , 以及 lim_inf_checked().

函数调用图:

◆ lim_inf_checked() [2/2]

ExpressionResult LMCAS::lim_inf_checked ( const std::shared_ptr< SymbolicExpr > & a_n,
const std::string & n,
ComputationContext & context )

在文件 series_sequence_limits.cpp 第 181 行定义.

183 {
184 constexpr const char* operation = "lim_inf";
185 if (!a_n || !detail::node(a_n) || n.empty()) {
188 "lower limit requires a sequence term and index variable",
189 operation);
190 }
191 auto budget = context.consume_steps(1, operation);
192 if (!budget) {
193 return ExpressionResult::failure(budget.error());
194 }
195 try {
196 return sequence_extreme_limit(a_n, n, false, context);
197 } catch (const std::bad_alloc&) {
200 "allocation failed while calculating lower limit", operation);
201 } catch (const std::exception& ex) {
203 CasErrc::InternalInvariant, ex.what(), operation);
204 }
205}
static ExpressionResult sequence_extreme_limit(const std::shared_ptr< SymbolicExpr > &a_n, const std::string &n, bool upper, ComputationContext &context)

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, InvalidArgument, lim_inf_checked(), LMCAS::detail::node(), ResourceLimit , 以及 sequence_extreme_limit().

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

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

◆ lim_sup_checked() [1/2]

ExpressionResult LMCAS::lim_sup_checked ( const std::shared_ptr< SymbolicExpr > & a_n,
const std::string & n )

在文件 series_sequence_limits.cpp 第 175 行定义.

176 {
178 return lim_sup_checked(a_n, n, context);
179}
ExpressionResult lim_sup_checked(const std::shared_ptr< SymbolicExpr > &a_n, const std::string &n, ComputationContext &context)

引用了 context , 以及 lim_sup_checked().

函数调用图:

◆ lim_sup_checked() [2/2]

ExpressionResult LMCAS::lim_sup_checked ( const std::shared_ptr< SymbolicExpr > & a_n,
const std::string & n,
ComputationContext & context )

在文件 series_sequence_limits.cpp 第 149 行定义.

151 {
152 constexpr const char* operation = "lim_sup";
153 if (!a_n || !detail::node(a_n) || n.empty()) {
156 "upper limit requires a sequence term and index variable",
157 operation);
158 }
159 auto budget = context.consume_steps(1, operation);
160 if (!budget) {
161 return ExpressionResult::failure(budget.error());
162 }
163 try {
164 return sequence_extreme_limit(a_n, n, true, context);
165 } catch (const std::bad_alloc&) {
168 "allocation failed while calculating upper limit", operation);
169 } catch (const std::exception& ex) {
171 CasErrc::InternalInvariant, ex.what(), operation);
172 }
173}

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, InvalidArgument, lim_sup_checked(), LMCAS::detail::node(), ResourceLimit , 以及 sequence_extreme_limit().

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

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

◆ limit_checked() [1/2]

LimitResult LMCAS::limit_checked ( const LimitExprPtr & expression,
const std::string & variable,
const LimitExprPtr & point,
LimitDirection direction,
ComputationContext & context,
Domain domain )

在文件 limit_result.cpp 第 633 行定义.

634 {
635 auto valid = validate_limit_input(expression, variable, point, direction, domain);
636 if (!valid) { return LimitResult::failure(valid.error()); }
637 auto step = context.consume_steps(1, "limit");
638 if (!step) { return LimitResult::failure(step.error()); }
639 try {
640 std::optional<detail::AssumptionFacts> assumed;
641 if (context.assumptions()) { assumed.emplace(*context.assumptions()); }
642 const auto& facts = assumed ? static_cast<const FactsQuery&>(*assumed) : detail::no_facts();
643 return limit_at_checked_point(expression, variable, point, direction, context, facts, domain);
644 } catch (const CasError& error) {
645 return LimitResult::failure(error);
646 } catch (const std::bad_alloc&) {
647 return LimitResult::failure(CasErrc::ResourceLimit, "limit allocation failed", "limit");
648 } catch (const std::exception& error) {
649 return LimitResult::failure(CasErrc::InternalInvariant, error.what(), "limit");
650 }
651}
LimitResult limit_at_checked_point(const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, const FactsQuery &facts, Domain domain)

引用了 context, direction, domain, LMCAS::Result< Verified< LimitOutcome > >::failure(), InternalInvariant, limit_checked(), LMCAS::detail::no_facts(), point, ResourceLimit , 以及 variable.

被这些函数引用 LMCAS::detail::definite::boundary_value_checked(), classify_singular_point_checked(), continuity_at_checked(), is_vertical_asymptote(), limit_checked(), limit_checked(), limit_expression_checked(), LMCAS::anonymous_namespace{limit_result.cpp}::oscillatory_one_sided_limit() , 以及 LMCAS::anonymous_namespace{limit_result.cpp}::scaled_one_sided_limit().

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

◆ limit_checked() [2/2]

LimitResult LMCAS::limit_checked ( const LimitExprPtr & expression,
const std::string & variable,
const LimitExprPtr & point,
LimitDirection direction,
Domain domain )

在文件 limit_result.cpp 第 652 行定义.

653 {
655 return limit_checked(expression, variable, point, direction, context, domain);
656}

引用了 context, direction, domain, limit_checked(), point , 以及 variable.

函数调用图:

◆ limit_expression_checked() [1/2]

LimitExpressionResult LMCAS::limit_expression_checked ( const LimitExprPtr & expression,
const std::string & variable,
const LimitExprPtr & point,
LimitDirection direction,
ComputationContext & context,
Domain domain )

在文件 limit_result.cpp 第 657 行定义.

658 {
659 auto result = limit_checked(expression, variable, point, direction, context, domain);
660 if (!result) return LimitExpressionResult::failure(result.error());
661 const auto& value = result.value().value;
662 if (auto finite = std::get_if<FiniteLimit>(&value)) return LimitExpressionResult::success(finite->value);
663 if (int sign = infinity_sign(value)) return LimitExpressionResult::success(SymbolicExpr::infinity(sign));
664 return LimitExpressionResult::failure(CasErrc::Inconclusive, "limit does not exist", "limit");
665}
int infinity_sign(const SymbolicExpr &expression, ComputationContext &context)

引用了 context, direction, domain, LMCAS::Result< LimitExprPtr >::failure(), Inconclusive, infinity_sign(), limit_checked(), limit_expression_checked(), point, LMCAS::Result< LimitExprPtr >::success(), value , 以及 variable.

被这些函数引用 alternating_sequence_bound(), calculate_residue_impl(), collect_infinite_asymptotes(), collect_oblique_asymptote(), frobenius_coefficient_limit(), laurent_series_full_impl(), limit_expression_checked(), limit_expression_checked(), ratio_convergence_test(), sequence_extreme_limit(), singular_frobenius_solution() , 以及 validate_frobenius_regular_singular_domain().

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

◆ limit_expression_checked() [2/2]

LimitExpressionResult LMCAS::limit_expression_checked ( const LimitExprPtr & expression,
const std::string & variable,
const LimitExprPtr & point,
LimitDirection direction,
Domain domain )

在文件 limit_result.cpp 第 666 行定义.

引用了 context, direction, domain, limit_expression_checked(), point , 以及 variable.

函数调用图:

◆ line_from_two_points_checked() [1/2]

LineSymbolicResult LMCAS::line_from_two_points_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & p1,
const std::vector< std::shared_ptr< SymbolicExpr > > & p2 )

在文件 symbolic_geometry_line.cpp 第 239 行定义.

241 {
244}
LineSymbolicResult line_from_two_points_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &p1, const std::vector< std::shared_ptr< SymbolicExpr > > &p2, ComputationContext &context)

引用了 context, line_from_two_points_checked() , 以及 p2.

函数调用图:

◆ line_from_two_points_checked() [2/2]

LineSymbolicResult LMCAS::line_from_two_points_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & p1,
const std::vector< std::shared_ptr< SymbolicExpr > > & p2,
ComputationContext & context )

在文件 symbolic_geometry_line.cpp 第 181 行定义.

184 {
185 const std::string operation = "line_from_two_points";
186 try {
187 auto valid = validate_same_dimension_vectors(p1, p2, context, operation);
188 if (!valid) return LineSymbolicResult::failure(valid.error());
189 if (p1.size() != 3) {
192 "line construction requires 3-dimensional points",
193 operation);
194 }
195 auto step = context.consume_steps(4, operation);
196 if (!step) return LineSymbolicResult::failure(step.error());
197
198 std::vector<double> p1_values;
199 std::vector<double> p2_values;
200 auto difference_scale = point_difference_scale_checked(
201 p1, p2, context, operation, p1_values, p2_values);
202 if (!difference_scale) {
203 return LineSymbolicResult::failure(difference_scale.error());
204 }
205 const double point_scale = difference_scale.value();
206
207 LineSymbolic line;
208 line.point = p1;
209 line.direction.reserve(3);
210 for (size_t i = 0; i < p1.size(); ++i) {
211 if (point_scale != 0.0) {
212 line.direction.push_back(SymbolicExpr::number(
213 p2_values[i] / point_scale -
214 p1_values[i] / point_scale));
215 continue;
216 }
217 auto component = SymbolicExpr::add(
218 p2[i],
219 SymbolicExpr::multiply(SymbolicExpr::number(-1), p1[i]));
220 auto simplified = simplify_checked(
221 component, operation,
222 "line direction component is outside the supported domain", context);
223 if (!simplified) return LineSymbolicResult::failure(simplified.error());
224 line.direction.push_back(std::move(simplified.value()));
225 }
226 auto line_valid = validate_line_checked(line, context, operation);
227 if (!line_valid) return LineSymbolicResult::failure(line_valid.error());
228 return LineSymbolicResult::success(std::move(line));
229 } catch (const std::bad_alloc&) {
231 "vector geometry allocation failed",
232 operation);
233 } catch (const std::exception& e) {
235 e.what(), operation);
236 }
237}
ExpressionResult simplify_checked(const std::shared_ptr< SymbolicExpr > &expr, const std::string &operation, const std::string &message, ComputationContext &context)
Result< void > validate_line_checked(const LineSymbolic &line, ComputationContext &context, const std::string &operation)
Result< void > validate_same_dimension_vectors(const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, ComputationContext &context, const std::string &operation)
std::vector< std::shared_ptr< SymbolicExpr > > point
直线上一点。
由一点和方向向量定义的符号直线。

引用了 context, LMCAS::LineSymbolic::direction, e(), LMCAS::Result< LineSymbolic >::failure(), InternalInvariant, InvalidArgument, line_from_two_points_checked(), p2, LMCAS::LineSymbolic::point, ResourceLimit, LMCAS::geometry_detail::simplify_checked(), LMCAS::Result< LineSymbolic >::success(), LMCAS::geometry_detail::validate_line_checked() , 以及 LMCAS::geometry_detail::validate_same_dimension_vectors().

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

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

◆ line_plane_intersection_checked() [1/2]

VectorExprListResult LMCAS::line_plane_intersection_checked ( const LineSymbolic & line,
const PlaneSymbolic & plane )

在文件 symbolic_geometry_line_plane.cpp 第 294 行定义.

297 {
300}
const PlaneSymbolic & plane
VectorExprListResult line_plane_intersection_checked(const LineSymbolic &line, const PlaneSymbolic &plane, ComputationContext &context)

引用了 context, line_plane_intersection_checked() , 以及 plane.

函数调用图:

◆ line_plane_intersection_checked() [2/2]

VectorExprListResult LMCAS::line_plane_intersection_checked ( const LineSymbolic & line,
const PlaneSymbolic & plane,
ComputationContext & context )

在文件 symbolic_geometry_line_plane.cpp 第 218 行定义.

222 {
223 const std::string operation = "line_plane_intersection";
224 try {
225 auto valid = validate_intersection_inputs(line, plane, context, operation);
226 if (!valid) {
227 return VectorExprListResult::failure(valid.error());
228 }
229
230 std::vector<double> normal_values;
231 std::vector<double> direction_values;
232 auto normal_scale = numeric_vector_scale_checked(
233 plane.normal, context, operation, &normal_values);
234 if (!normal_scale) {
235 return VectorExprListResult::failure(normal_scale.error());
236 }
237 auto direction_scale = numeric_vector_scale_checked(
238 line.direction, context, operation, &direction_values);
239 if (!direction_scale) {
240 return VectorExprListResult::failure(direction_scale.error());
241 }
242 std::vector<double> point_values;
243 auto point_scale = numeric_vector_scale_checked(
244 line.point, context, operation, &point_values);
245 if (!point_scale && interrupts_optional_numeric_evaluation(point_scale.error())) {
246 return VectorExprListResult::failure(point_scale.error());
247 }
248 auto plane_offset = evaluate_numeric(*plane.d, NumericBindings{}, context);
249 const bool numeric_plane_offset = finite_plane_offset(plane_offset);
250 if (!plane_offset && interrupts_optional_numeric_evaluation(plane_offset.error())) {
251 return VectorExprListResult::failure(plane_offset.error());
252 }
253
254 const bool scale_direction_products = direction_products_need_scaling(
255 normal_scale.value(), direction_scale.value());
256 const bool protect_point_dot =
257 point_dot_needs_protection(normal_scale.value(), point_scale);
258 const std::vector<std::shared_ptr<SymbolicExpr>>* effective_normal = &plane.normal;
259 const std::vector<std::shared_ptr<SymbolicExpr>>* effective_direction = &line.direction;
260 std::vector<std::shared_ptr<SymbolicExpr>> scaled_normal;
261 std::vector<std::shared_ptr<SymbolicExpr>> scaled_direction;
262 std::shared_ptr<SymbolicExpr> effective_d = plane.d;
263 if (scale_direction_products || protect_point_dot) {
265 normal_values, normal_scale.value(), protect_point_dot, scaled_normal);
266 effective_normal = &scaled_normal;
267 effective_d = scale_plane_offset(plane.d, normal_scale.value(), protect_point_dot);
268 }
269 if (scale_direction_products) {
271 direction_values, direction_scale.value(), false, scaled_direction);
272 effective_direction = &scaled_direction;
273 }
274
275 if (coordinate_update_needs_protection(point_scale, numeric_plane_offset)) {
277 normal_values, normal_scale.value(),
278 direction_values, direction_scale.value(),
279 point_values, point_scale.value(), plane_offset.value().value, operation);
280 }
282 *effective_normal, *effective_direction, line.point, effective_d,
283 context, operation);
284 } catch (const std::bad_alloc&) {
286 "vector geometry allocation failed",
287 operation);
288 } catch (const std::exception& e) {
290 e.what(), operation);
291 }
292}
std::shared_ptr< SymbolicExpr > scale_plane_offset(const std::shared_ptr< SymbolicExpr > &offset, double normal_scale, bool protect_point_dot)
bool point_dot_needs_protection(double normal_scale, const Result< double > &point_scale)
void scale_symbolic_components(const std::vector< double > &values, double scale, bool protect_point_dot, std::vector< std::shared_ptr< SymbolicExpr > > &scaled)
VectorExprListResult protected_coordinate_intersection(const std::vector< double > &normal_values, double normal_scale, const std::vector< double > &direction_values, double direction_scale, const std::vector< double > &point_values, double point_scale, double plane_offset, const std::string &operation)
VectorExprListResult symbolic_line_plane_intersection(const std::vector< std::shared_ptr< SymbolicExpr > > &normal, const std::vector< std::shared_ptr< SymbolicExpr > > &direction, const std::vector< std::shared_ptr< SymbolicExpr > > &point, const std::shared_ptr< SymbolicExpr > &offset, ComputationContext &context, const std::string &operation)
bool coordinate_update_needs_protection(const Result< double > &point_scale, bool numeric_plane_offset)
bool direction_products_need_scaling(double normal_scale, double direction_scale)
Result< double > numeric_vector_scale_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &expressions, ComputationContext &context, const std::string &operation, std::vector< double > *values=nullptr)
std::vector< std::shared_ptr< SymbolicExpr > > direction
方向向量。
std::unordered_map< std::string, double > NumericBindings
std::shared_ptr< SymbolicExpr > d
常数项。

引用了 context, LMCAS::PlaneSymbolic::d, LMCAS::LineSymbolic::direction, e(), evaluate_numeric(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), InternalInvariant, line_plane_intersection_checked(), LMCAS::PlaneSymbolic::normal, LMCAS::geometry_detail::numeric_vector_scale_checked(), plane, LMCAS::LineSymbolic::point , 以及 ResourceLimit.

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

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

◆ linear2_root_basis()

std::shared_ptr< SymbolicExpr > LMCAS::linear2_root_basis ( const std::vector< ode_root_detail::CharRoot > & roots,
const std::string & x )
static

在文件 symbolic_ode.cpp 第 162 行定义.

164 {
165 auto variable = SymbolicExpr::variable(x);
166 auto solution = SymbolicExpr::number(0);
167 int constant_index = 1;
168 for (const auto& root : roots) {
169 auto exponential = SymbolicExpr::exp(
170 SymbolicExpr::multiply(
171 SymbolicExpr::number(root.real_part), variable));
172 if (root.is_complex) {
173 auto argument = SymbolicExpr::multiply(
174 SymbolicExpr::number(root.imag_part), variable);
175 auto cosine_basis = SymbolicExpr::multiply(
176 exponential, SymbolicExpr::cos(argument));
177 auto sine_basis = SymbolicExpr::multiply(
178 exponential, SymbolicExpr::sin(argument));
179 auto cosine_term = SymbolicExpr::multiply(
180 SymbolicExpr::variable(
181 "C" + std::to_string(constant_index++)),
182 cosine_basis);
183 auto sine_term = SymbolicExpr::multiply(
184 SymbolicExpr::variable(
185 "C" + std::to_string(constant_index++)),
186 sine_basis);
187 solution = SymbolicExpr::add(
188 solution, SymbolicExpr::add(cosine_term, sine_term));
189 continue;
190 }
191 for (int power = 0; power < root.multiplicity; ++power) {
192 auto basis = exponential;
193 if (power > 0) {
194 basis = SymbolicExpr::multiply(
195 SymbolicExpr::power(
196 variable, SymbolicExpr::number(power)),
197 exponential);
198 }
199 solution = SymbolicExpr::add(
200 solution,
201 SymbolicExpr::multiply(
202 SymbolicExpr::variable(
203 "C" + std::to_string(constant_index++)),
204 basis));
205 }
206 }
207 return solution;
208}

引用了 basis, linear2_root_basis(), roots() , 以及 variable.

被这些函数引用 linear2_root_basis() , 以及 solve_linear2_homogeneous().

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

◆ log() [1/2]

ExprResult LMCAS::log ( const ExprPtr & expression)

在文件 expr_elementary.cpp 第 129 行定义.

129 {
131 return log(expression, context);
132}
ExprResult log(const ExprPtr &expression, ComputationContext &context)

引用了 context , 以及 log().

函数调用图:

◆ log() [2/2]

ExprResult LMCAS::log ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_elementary.cpp 第 122 行定义.

122 {
123 auto valid = require_dimensionless(expression, "log");
124 if (!valid) { return valid; }
125 return make_unary_math_expr(expression, context, "log",
126 SymbolicExpr::ln);
127}

引用了 context, log(), LMCAS::expr_detail::expr_common::make_unary_math_expr() , 以及 LMCAS::expr_detail::expr_common::require_dimensionless().

被这些函数引用 LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function(), log() , 以及 log().

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

◆ log10() [1/2]

ExprResult LMCAS::log10 ( const ExprPtr & expression)

在文件 expr_elementary.cpp 第 164 行定义.

164 {
166 return log10(expression, context);
167}
ExprResult log10(const ExprPtr &expression, ComputationContext &context)

引用了 context , 以及 log10().

函数调用图:

◆ log10() [2/2]

ExprResult LMCAS::log10 ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_elementary.cpp 第 134 行定义.

134 {
135 auto valid = require_dimensionless(expression, "log10");
136 if (!valid) { return valid; }
137 auto step = context.consume_steps(1, kMathOperation);
138 if (!step) { return ExprResult::failure(step.error()); }
139 if (!expression || !LMCAS::detail::node(expression)) {
141 "log10 argument cannot be null",
143 }
144 try {
145 auto numerator = SymbolicExpr::ln(expression);
146 auto denominator = SymbolicExpr::ln(SymbolicExpr::number(10));
147 auto result = SymbolicExpr::divide(numerator, denominator);
148 if (!result || !LMCAS::detail::node(result)) {
150 "log10 expression construction failed",
152 }
153 return ExprResult::success(std::move(result));
154 } catch (const std::bad_alloc&) {
156 "log10 expression allocation failed",
158 } catch (const std::exception& error) {
161 }
162}

引用了 context, denominator, LMCAS::expr_detail::expr_common::expression_failure(), LMCAS::Result< ExprPtr >::failure(), InternalInvariant, InvalidArgument, LMCAS::expr_detail::expr_common::kMathOperation, log10(), LMCAS::detail::node(), LMCAS::expr_detail::expr_common::require_dimensionless(), ResourceLimit , 以及 LMCAS::Result< ExprPtr >::success().

被这些函数引用 LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function(), log10() , 以及 log10().

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

◆ log_differentiate()

std::shared_ptr< SymbolicExpr > LMCAS::log_differentiate ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var )

计算 ln(f)

对 ln(f) 求导 - 化简器会自动应用对数规则 (ln(a*b) = ln(a)+ln(b), ln(a^n) = n*ln(a))

结果 = f * d/dx[ln(f)]

在文件 calculus_utils.cpp 第 145 行定义.

147{
149 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
150 (context).limits().max_ast_nodes, "transform");
151 if (!f || !LMCAS::detail::node(f)) {
152 return nullptr;
153 }
154
155 /// 计算 ln(f)
156 auto ln_f = SymbolicExpr::ln(f);
157
158 /// 对 ln(f) 求导 - 化简器会自动应用对数规则
159 /// (ln(a*b) = ln(a)+ln(b), ln(a^n) = n*ln(a))
160 auto ln_f_simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(ln_f), transform_budget));
161 auto d_ln_f = detail::make_expression_ptr(detail::differentiate_node(detail::node(ln_f_simplified), var, transform_budget));
162
163 /// 结果 = f * d/dx[ln(f)]
164 auto result = SymbolicExpr::multiply(f, d_ln_f);
165 return detail::make_expression_ptr(detail::normalize_node(detail::node(result), transform_budget));
166}

引用了 context, LMCAS::detail::differentiate_node(), log_differentiate(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 log_differentiate().

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

◆ logical_and()

ExprResult LMCAS::logical_and ( const ExprPtr & lhs,
const ExprPtr & rhs )

在文件 expr_facade.cpp 第 236 行定义.

236 {
237 return logical_expression(lhs, rhs, LogicalNode::Op::And, "LMCAS.logical_and");
238}

引用了 LMCAS::LogicalNode::And, logical_and() , 以及 rhs.

被这些函数引用 logical_and().

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

◆ logical_not()

ExprResult LMCAS::logical_not ( const ExprPtr & expression)

在文件 expr_facade.cpp 第 244 行定义.

244 {
245 return logical_expression(expression, nullptr, LogicalNode::Op::Not,
246 "LMCAS.logical_not");
247}
@ Not
一元逻辑非,right 为 nullptr。

引用了 logical_not() , 以及 LMCAS::LogicalNode::Not.

被这些函数引用 logical_not() , 以及 membership().

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

◆ logical_or()

ExprResult LMCAS::logical_or ( const ExprPtr & lhs,
const ExprPtr & rhs )

在文件 expr_facade.cpp 第 240 行定义.

240 {
241 return logical_expression(lhs, rhs, LogicalNode::Op::Or, "LMCAS.logical_or");
242}

引用了 logical_or(), LMCAS::LogicalNode::Or , 以及 rhs.

被这些函数引用 logical_or().

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

◆ lookup_integral()

template<typename Transform>
std::shared_ptr< SymbolicExpr > LMCAS::lookup_integral ( const std::vector< detail::IntegrationEntry > & table,
const SymbolicExpr & matched,
const std::string & matched_variable,
detail::RewriteBudget & budget,
Transform && transform )

在文件 integration_support.hpp 第 116 行定义.

118 {
119 for (const auto& rule : table) {
120 const auto* entry = &rule;
121 budget.consume();
123 if (!Matcher::match(entry->pattern, matched, entry->wildcards, bindings)) { continue; }
124 if (bindings.find("__Add_REST__") != bindings.end() ||
125 bindings.find("__Mul_REST__") != bindings.end()) {
126 continue;
127 }
128 const bool complete = std::all_of(entry->wildcards.begin(), entry->wildcards.end(),
129 [&](const std::string& name) { return bindings.find(name) != bindings.end(); });
130 if (!complete || (entry->condition && !entry->condition(bindings, matched_variable, budget.context()))) {
131 continue;
132 }
133 auto instantiated = detail::make_expression_ptr(
134 Matcher::replace(entry->result, bindings, false));
135 budget.measure(detail::node(instantiated));
136 if (contains_unevaluated_integral(detail::node(instantiated))) {
137 continue;
138 }
139 auto candidate = transform(std::move(instantiated));
140 if (!candidate) { continue; }
142 }
143 return nullptr;
144}

引用了 bindings, LMCAS::detail::RewriteBudget::consume(), contains_unevaluated_integral(), LMCAS::detail::RewriteBudget::context(), lookup_integral(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::RewriteBudget::measure(), name, LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 lookup_integral().

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

◆ lt()

ExprResult LMCAS::lt ( const ExprPtr & lhs,
const ExprPtr & rhs )

在文件 expr_facade.cpp 第 197 行定义.

197 {
198 return relation(lhs, rhs, RelationOp::LT);
199}

引用了 LT, lt(), relation() , 以及 rhs.

被这些函数引用 lt() , 以及 LMCAS::groebner_detail::reduce().

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

◆ lu_decomposition_checked() [1/2]

LUDecompositionResult LMCAS::lu_decomposition_checked ( const std::shared_ptr< SymbolicExpr > & A)

在文件 matrix_decomposition_lu.cpp 第 107 行定义.

109{
112}
LUDecompositionResult lu_decomposition_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)

引用了 context , 以及 lu_decomposition_checked().

函数调用图:

◆ lu_decomposition_checked() [2/2]

LUDecompositionResult LMCAS::lu_decomposition_checked ( const std::shared_ptr< SymbolicExpr > & A,
ComputationContext & context )

在文件 matrix_decomposition_lu.cpp 第 67 行定义.

70{
71 const std::string operation = "lu_decomposition";
72 auto matrix = validate_decomposition_matrix(A, true, context, operation);
73 if (!matrix) return LUDecompositionResult::failure(matrix.error());
74 auto budget = context.consume_steps(matrix.value()->rows() * matrix.value()->cols() * 8 + 8,
75 operation);
76 if (!budget) return LUDecompositionResult::failure(budget.error());
77 auto values = exact_rational_matrix(matrix.value(), context);
78 if (!values) {
81 "exact PLU requires a rational matrix or proved symbolic pivots",
82 operation);
83 }
84 try {
85 const std::size_t n = values->size();
86 auto U_values = *values;
87 std::vector<std::vector<Rational>> L_values(
88 n, std::vector<Rational>(n, Rational(0)));
89 std::vector<std::vector<Rational>> P_values(
90 n, std::vector<Rational>(n, Rational(0)));
91 auto factored = factor_lu(L_values, U_values, P_values, operation);
92 if (!factored) return LUDecompositionResult::failure(factored.error());
93 return LUDecompositionResult::success(LUDecomposition{
94 rational_rows_expression(P_values),
95 rational_rows_expression(L_values),
96 rational_rows_expression(U_values)});
97 } catch (const std::bad_alloc&) {
99 "allocation failed while calculating LU decomposition",
100 operation);
101 } catch (const std::exception& ex) {
103 ex.what(),
104 operation);
105 }
106}

引用了 context, LMCAS::detail::matrix_decomposition::exact_rational_matrix(), LMCAS::Result< LUDecomposition >::failure(), Inconclusive, InternalInvariant, lu_decomposition_checked(), ResourceLimit, LMCAS::Result< LUDecomposition >::success() , 以及 LMCAS::detail::matrix_decomposition::validate_decomposition_matrix().

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

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

◆ make_abs()

std::shared_ptr< SymbolicExpr > LMCAS::make_abs ( std::shared_ptr< SymbolicExpr > expr)
static

Wrap an expression in abs() to signal positive-branch preference.

在文件 symbolic_ode.cpp 第 64 行定义.

64 {
68 std::vector<std::shared_ptr<const SymbolicNode>>{LMCAS::detail::node(expr)}));
69}

引用了 LMCAS::FunctionNode::Abs, make_abs(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node() , 以及 LMCAS::detail::node().

被这些函数引用 make_abs(), solve_linear1_ode(), solve_linear2_homogeneous() , 以及 solve_separable_ode().

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

◆ make_arctan()

std::shared_ptr< SymbolicExpr > LMCAS::make_arctan ( const std::shared_ptr< SymbolicExpr > & operand)
inline

在文件 integration_support.hpp 第 104 行定义.

105 {
107}
std::shared_ptr< SymbolicExpr > make_unary_function(FunctionNode::FuncType type, const std::shared_ptr< SymbolicExpr > &operand)

引用了 LMCAS::FunctionNode::ArcTan, make_arctan() , 以及 make_unary_function().

被这些函数引用 make_arctan() , 以及 LMCAS::anonymous_namespace{integration_rational_terms.cpp}::rd_integrate_negative_discriminant().

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

◆ make_complex()

ComplexSymbolic LMCAS::make_complex ( std::shared_ptr< SymbolicExpr > real,
std::shared_ptr< SymbolicExpr > imag )
inline

构造符号复数

参数
real实部表达式
imag虚部表达式
返回
符号复数对象

在文件 symbolic_complex.hpp 第 30 行定义.

33 {
34 return ComplexSymbolic{real, imag};
35}
符号复数,由实部和虚部组成

引用了 imag, make_complex() , 以及 real().

被这些函数引用 complex_add_checked(), complex_conj_checked(), complex_div_checked(), complex_exp_form_checked(), complex_locus_circle_checked(), complex_locus_perpendicular_bisector_checked(), complex_mul_checked(), complex_sub_checked() , 以及 make_complex().

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

◆ make_finite_set()

SymbolicSetResult LMCAS::make_finite_set ( std::vector< std::shared_ptr< SymbolicExpr > > elements,
ComputationContext & context )

在文件 symbolic_set.cpp 第 74 行定义.

76 {
77 auto step = consume(context);
78 if (!step) return SymbolicSetResult::failure(step.error());
79 std::vector<std::shared_ptr<const SymbolicNode>> nodes;
80 nodes.reserve(elements.size());
81 for (const auto& element : elements) {
82 if (!element || !detail::node(element)) {
83 return failure(CasErrc::InvalidArgument,
84 "finite set elements cannot be null");
85 }
86 nodes.push_back(detail::node(element));
87 }
88 return from_nodes(std::move(nodes));
89}
SymbolicSetResult from_nodes(std::vector< std::shared_ptr< const SymbolicNode > > elements)

引用了 context, element, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InvalidArgument, make_finite_set() , 以及 LMCAS::detail::node().

被这些函数引用 finite_set() , 以及 make_finite_set().

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

◆ make_interval()

SymbolicSetResult LMCAS::make_interval ( const std::shared_ptr< SymbolicExpr > & lower,
const std::shared_ptr< SymbolicExpr > & upper,
bool lower_closed,
bool upper_closed,
ComputationContext & context )

在文件 symbolic_set.cpp 第 91 行定义.

96 {
97 auto step = consume(context);
98 if (!step) {
99 return SymbolicSetResult::failure(step.error());
100 }
101 if (!lower || !upper || !detail::node(lower) || !detail::node(upper)) {
102 return failure(CasErrc::InvalidArgument, "interval endpoints cannot be null");
103 }
104 Rational lower_value;
105 Rational upper_value;
106 if (exact_value(detail::node(lower), lower_value) &&
107 exact_value(detail::node(upper), upper_value) &&
108 upper_value < lower_value) {
110 "interval lower endpoint exceeds upper endpoint");
111 }
112 try {
116 } catch (const std::bad_alloc&) {
117 return failure(CasErrc::ResourceLimit, "interval allocation failed");
118 }
119}
bool exact_value(const std::shared_ptr< const SymbolicNode > &node, Rational &value)

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InvalidArgument, lower, lower_closed, LMCAS::detail::make_expression_ptr(), make_interval(), LMCAS::detail::make_node(), LMCAS::detail::node(), ResourceLimit, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success(), upper , 以及 upper_closed.

被这些函数引用 interval() , 以及 make_interval().

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

◆ make_membership()

SymbolicSetResult LMCAS::make_membership ( const std::shared_ptr< SymbolicExpr > & element,
const std::shared_ptr< SymbolicExpr > & set,
ComputationContext & context )

在文件 symbolic_set.cpp 第 121 行定义.

124 {
125 auto step = consume(context);
126 if (!step) {
127 return SymbolicSetResult::failure(step.error());
128 }
129 if (!element || !set || !detail::node(element) || !detail::node(set)) {
130 return failure(CasErrc::InvalidArgument, "membership operands cannot be null");
131 }
132 if (auto finite = finite_set_node(*set)) {
133 return SymbolicSetResult::success(SymbolicExpr::number(
134 finite->contains(*detail::node(element)) ? 1 : 0));
135 }
136 if (auto interval = std::dynamic_pointer_cast<const IntervalNode>(detail::node(set))) {
137 if (auto contained = exact_interval_membership(detail::node(element), *interval)) {
138 return SymbolicSetResult::success(SymbolicExpr::number(*contained ? 1 : 0));
139 }
140 }
143}
std::shared_ptr< const FiniteSetNode > finite_set_node(const SymbolicExpr &expression)
std::optional< bool > exact_interval_membership(const std::shared_ptr< const SymbolicNode > &element, const IntervalNode &interval)

引用了 context, element, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), interval(), InvalidArgument, LMCAS::detail::make_expression_ptr(), make_membership(), LMCAS::detail::make_node(), LMCAS::detail::node(), set , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

被这些函数引用 make_membership() , 以及 member().

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

◆ make_normalized_multiply_node()

std::shared_ptr< const SymbolicNode > LMCAS::make_normalized_multiply_node ( const std::vector< std::shared_ptr< const SymbolicNode > > & operands,
detail::RewriteBudget * budget = nullptr )

在文件 normalization_utils.cpp 第 83 行定义.

85 {
86 std::size_t nodes = 0;
87 if (budget) {
88 for (const auto& op : ops) {
89 nodes = budget->append_size(nodes, budget->measure(op));
90 }
91 }
92 normalization_check_arithmetic<MultiplyNode>(budget, ops, nodes, ops.size() != 1);
93 if (ops.empty()) {
95 }
96 if (ops.size() == 1) {
97 return ops[0];
98 }
100}
std::size_t normalization_check_arithmetic(detail::RewriteBudget *budget, std::size_t extra_nodes, const std::shared_ptr< const Nodes > &... children)

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::detail::make_node(), make_normalized_multiply_node(), LMCAS::detail::RewriteBudget::measure(), normalization_check_arithmetic() , 以及 op.

被这些函数引用 check_negative_arg(), LMCAS::NormalizationVisitor::distribute_power(), LMCAS::NormalizationVisitor::extract_term_coefficient(), LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::finish(), LMCAS::anonymous_namespace{integration_linearity.cpp}::integration_exponential_argument(), make_normalized_multiply_node(), LMCAS::NormalizationVisitor::matrix_product_element(), normalization_imaginary_power(), LMCAS::NormalizationVisitor::normalize_function_parity(), LMCAS::NormalizationVisitor::normalize_logarithm(), LMCAS::NormalizationVisitor::normalize_matrix_product(), LMCAS::NormalizationVisitor::normalize_natural_logarithm(), LMCAS::NormalizationVisitor::normalize_nested_power(), LMCAS::anonymous_namespace{normalization_trigonometric.cpp}::scaled_radical(), LMCAS::NormalizationVisitor::simplify_assumed_absolute(), LMCAS::NormalizationVisitor::visit() , 以及 LMCAS::anonymous_namespace{normalization_arithmetic.cpp}::weighted_term().

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

◆ make_rootof_checked() [1/2]

RootOfConstructionResult LMCAS::make_rootof_checked ( const std::shared_ptr< SymbolicExpr > & polynomial,
const std::string & variable,
std::size_t index )

在文件 root_of_identity.cpp 第 44 行定义.

47 {
49 return make_rootof_checked(polynomial, variable, index, context);
50}

引用了 context, make_rootof_checked() , 以及 variable.

函数调用图:

◆ make_rootof_checked() [2/2]

RootOfConstructionResult LMCAS::make_rootof_checked ( const std::shared_ptr< SymbolicExpr > & polynomial,
const std::string & variable,
std::size_t index,
ComputationContext & context )

在文件 root_of_identity.cpp 第 10 行定义.

14 {
15 constexpr const char* operation = "rootof.construct";
16 if (!polynomial || !LMCAS::detail::node(polynomial) ||
17 variable.empty()) {
20 "RootOf requires a polynomial and named variable", operation);
21 }
22 auto recognized = recognize_rational_polynomial(
23 *polynomial, variable, context);
24 if (!recognized) {
25 return RootOfConstructionResult::failure(recognized.error());
26 }
27 if (!recognized.value()) {
30 "RootOf coefficients must be exact rational constants",
31 operation);
32 }
33 auto identity = detail::make_exact_root_id(
34 std::move(*recognized.value()), index, context, operation);
35 if (!identity) {
36 return RootOfConstructionResult::failure(identity.error());
37 }
41 std::move(identity.value()), variable)));
42}
Result< ExactRootId > make_exact_root_id(Polynomial< Rational > polynomial, std::size_t index, ComputationContext &context, const std::string &operation)

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive, InvalidArgument, LMCAS::detail::make_exact_root_id(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), make_rootof_checked(), LMCAS::detail::node(), recognize_rational_polynomial(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success() , 以及 variable.

被这些函数引用 LMCAS::expr_detail::ExprParser::apply_rootof(), LMCAS::detail::definite::definite_partition_checked(), exact_factor_roots(), make_rootof_checked(), make_rootof_checked() , 以及 solve_higher_exact_roots().

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

◆ make_rootof_solutions()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::make_rootof_solutions ( const Polynomial< SymbolicPolyCoeff > & poly,
const std::string & var )

在文件 root_of_identity.cpp 第 96 行定义.

98 {
101}
std::vector< std::shared_ptr< SymbolicExpr > > make_rootof_solutions_impl(const Polynomial< SymbolicPolyCoeff > &polynomial, const std::string &variable, ComputationContext &context)

引用了 context, make_rootof_solutions() , 以及 LMCAS::detail::make_rootof_solutions_impl().

被这些函数引用 make_rootof_solutions().

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

◆ make_unary_function()

std::shared_ptr< SymbolicExpr > LMCAS::make_unary_function ( FunctionNode::FuncType type,
const std::shared_ptr< SymbolicExpr > & operand )
inline

◆ match_commutative_recursive()

bool LMCAS::match_commutative_recursive ( const std::vector< std::shared_ptr< const SymbolicNode > > & p_ops,
const std::vector< std::shared_ptr< const SymbolicNode > > & t_ops,
std::vector< bool > & used_t,
size_t p_index,
const std::unordered_set< std::string > & wildcards,
MatchMap & results )
static

在文件 matcher.cpp 第 18 行定义.

23 {
24
25 if (p_index == p_ops.size()) {
26 return true;
27 }
28
29 for (size_t j = 0; j < t_ops.size(); ++j) {
30 if (!used_t[j]) {
31
32 MatchMap saved_results = results;
33
34 if (match_recursive(p_ops[p_index], t_ops[j], wildcards, results)) {
35 used_t[j] = true;
36 if (match_commutative_recursive(p_ops, t_ops, used_t, p_index + 1, wildcards, results)) {
37 return true;
38 }
39
40 used_t[j] = false;
41 results = saved_results;
42 } else {
43
44 results = saved_results;
45 }
46 }
47 }
48
49 return false;
50}
static bool match_commutative_recursive(const std::vector< std::shared_ptr< const SymbolicNode > > &p_ops, const std::vector< std::shared_ptr< const SymbolicNode > > &t_ops, std::vector< bool > &used_t, size_t p_index, const std::unordered_set< std::string > &wildcards, MatchMap &results)
static bool match_recursive(const std::shared_ptr< const SymbolicNode > &p_node, const std::shared_ptr< const SymbolicNode > &t_node, const std::unordered_set< std::string > &wildcards, MatchMap &results)

引用了 match_commutative_recursive(), match_recursive() , 以及 wildcards.

被这些函数引用 match_commutative_recursive() , 以及 match_operation().

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

◆ match_function()

bool LMCAS::match_function ( const FunctionNode & pattern,
const FunctionNode & target,
const std::unordered_set< std::string > & wildcards,
MatchMap & results )
static

在文件 matcher.cpp 第 120 行定义.

121 {
122 if (pattern.type() != target.type() || pattern.arguments().size() != target.arguments().size()) {
123 return false;
124 }
125 for (size_t index = 0; index < pattern.arguments().size(); ++index) {
126 if (!match_recursive(pattern.arguments()[index], target.arguments()[index], wildcards, results)) {
127 return false;
128 }
129 }
130 return true;
131}
FuncType type() const noexcept
const std::vector< std::shared_ptr< const SymbolicNode > > & arguments() const noexcept

引用了 LMCAS::FunctionNode::arguments(), match_function(), match_recursive(), target, LMCAS::FunctionNode::type() , 以及 wildcards.

被这些函数引用 match_function() , 以及 match_recursive().

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

◆ match_operation()

template<typename Operation>
bool LMCAS::match_operation ( const Operation & pattern,
const Operation & target,
const std::unordered_set< std::string > & wildcards,
const char * rest_key,
MatchMap & results )
static

在文件 matcher.cpp 第 106 行定义.

108 {
109 if (pattern.operands().size() > target.operands().size()) {
110 return false;
111 }
112 std::vector<bool> used(target.operands().size(), false);
113 if (!match_commutative_recursive(pattern.operands(), target.operands(), used, 0, wildcards, results)) {
114 return false;
115 }
116 record_remainder(target, used, rest_key, results);
117 return true;
118}
static void record_remainder(const Operation &target, const std::vector< bool > &used, const char *key, MatchMap &results)

引用了 match_commutative_recursive(), match_operation(), record_remainder(), target , 以及 wildcards.

被这些函数引用 match_operation() , 以及 match_recursive().

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

◆ match_recursive()

bool LMCAS::match_recursive ( const std::shared_ptr< const SymbolicNode > & p_node,
const std::shared_ptr< const SymbolicNode > & t_node,
const std::unordered_set< std::string > & wildcards,
MatchMap & results )
static

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

135 {
136 if (!pattern) {
137 return !target;
138 }
139 if (!target) {
140 return false;
141 }
142 std::string name;
143 if (is_wildcard(pattern, wildcards, name)) {
144 const auto existing = results.find(name);
145 if (existing != results.end()) {
146 return detail::node(existing->second)->equals(*target);
147 }
148 results.emplace(name, detail::expression_from_node(target));
149 return true;
150 }
151 if (pattern->type_priority() != target->type_priority()) {
152 return false;
153 }
154 if (pattern->is_number() || dynamic_cast<const VariableNode*>(pattern.get())) {
155 return pattern->equals(*target);
156 }
157 if (const auto* add = dynamic_cast<const AddNode*>(pattern.get())) {
158 return match_operation(*add, static_cast<const AddNode&>(*target), wildcards, "__Add_REST__", results);
159 }
160 if (const auto* multiply = dynamic_cast<const MultiplyNode*>(pattern.get())) {
161 return match_operation(*multiply, static_cast<const MultiplyNode&>(*target), wildcards, "__Mul_REST__", results);
162 }
163 if (const auto* power = dynamic_cast<const PowerNode*>(pattern.get())) {
164 const auto& other = static_cast<const PowerNode&>(*target);
165 return match_recursive(power->base(), other.base(), wildcards, results) &&
166 match_recursive(power->exponent(), other.exponent(), wildcards, results);
167 }
168 if (const auto* function = dynamic_cast<const FunctionNode*>(pattern.get())) {
169 return match_function(*function, static_cast<const FunctionNode&>(*target), wildcards, results);
170 }
171 return pattern->equals(*target);
172}
加法节点,表示多个操作数的求和。
变量节点,表示一个符号变量。
static bool match_operation(const Operation &pattern, const Operation &target, const std::unordered_set< std::string > &wildcards, const char *rest_key, MatchMap &results)
static bool match_function(const FunctionNode &pattern, const FunctionNode &target, const std::unordered_set< std::string > &wildcards, MatchMap &results)
static bool is_wildcard(const std::shared_ptr< const SymbolicNode > &node, const std::unordered_set< std::string > &wildcards, std::string &name_out)

引用了 add(), LMCAS::SymbolicNode::equals(), LMCAS::detail::expression_from_node(), function(), is_wildcard(), match_function(), match_operation(), match_recursive(), name, LMCAS::detail::node(), target , 以及 wildcards.

被这些函数引用 match_commutative_recursive(), match_function() , 以及 match_recursive().

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

◆ matrix_characteristic_polynomial_checked() [1/2]

ExpressionResult LMCAS::matrix_characteristic_polynomial_checked ( const std::shared_ptr< SymbolicExpr > & A,
const std::string & variable )

在文件 symbolic_matrix_eigen.cpp 第 58 行定义.

59 {
62}
ExpressionResult matrix_characteristic_polynomial_checked(const std::shared_ptr< SymbolicExpr > &A, const std::string &variable, ComputationContext &context)

引用了 context, matrix_characteristic_polynomial_checked() , 以及 variable.

函数调用图:

◆ matrix_characteristic_polynomial_checked() [2/2]

ExpressionResult LMCAS::matrix_characteristic_polynomial_checked ( const std::shared_ptr< SymbolicExpr > & A,
const std::string & variable,
ComputationContext & context )

在文件 symbolic_matrix_eigen.cpp 第 13 行定义.

15 {
16 constexpr const char* operation = "matrix_characteristic_polynomial";
17 auto matrix_result = require_square_matrix(A, context, operation);
18 if (!matrix_result) return ExpressionResult::failure(matrix_result.error());
19 if (variable.empty()) {
22 "characteristic polynomial variable cannot be empty", operation);
23 }
24 try {
25 const auto& matrix = *matrix_result.value();
26 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> entries(
27 matrix.rows(),
28 std::vector<std::shared_ptr<SymbolicExpr>>(matrix.cols()));
29 auto lambda = SymbolicExpr::variable(variable);
30 for (std::size_t row = 0; row < matrix.rows(); ++row) {
31 for (std::size_t column = 0; column < matrix.cols(); ++column) {
33 matrix.get(row, column));
34 entries[row][column] = row == column
35 ? SymbolicExpr::add(
36 value,
37 SymbolicExpr::multiply(
38 lambda, SymbolicExpr::number(-1)))
39 : std::move(value);
40 }
41 }
42 auto determinant = matrix_determinant_checked(
43 SymbolicExpr::matrix(entries), context);
44 if (!determinant) return ExpressionResult::failure(determinant.error());
46 std::move(determinant.value()));
47 } catch (const std::bad_alloc&) {
50 "allocation failed while constructing characteristic polynomial",
51 operation);
52 } catch (const std::exception& ex) {
54 CasErrc::InternalInvariant, ex.what(), operation);
55 }
56}
Result< std::shared_ptr< const MatrixNode > > require_square_matrix(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context, const std::string &operation)
ExpressionResult matrix_determinant_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, InvalidArgument, LMCAS::detail::make_expression_ptr(), matrix_characteristic_polynomial_checked(), matrix_determinant_checked(), LMCAS::detail::matrix_api::require_square_matrix(), ResourceLimit, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success(), value , 以及 variable.

被这些函数引用 matrix_characteristic_polynomial_checked(), matrix_characteristic_polynomial_checked() , 以及 matrix_eigenvalues_checked().

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

◆ matrix_determinant_checked() [1/2]

ExpressionResult LMCAS::matrix_determinant_checked ( const std::shared_ptr< SymbolicExpr > & A)

在文件 symbolic_matrix.cpp 第 72 行定义.

引用了 context , 以及 matrix_determinant_checked().

函数调用图:

◆ matrix_determinant_checked() [2/2]

ExpressionResult LMCAS::matrix_determinant_checked ( const std::shared_ptr< SymbolicExpr > & A,
ComputationContext & context )

在文件 symbolic_matrix.cpp 第 60 行定义.

62 {
63 const std::string operation = "matrix_determinant";
64 auto matrix = require_square_matrix(A, context, operation);
65 if (!matrix) return ExpressionResult::failure(matrix.error());
66 auto determinant = detail::determinant_exact(
67 exact_matrix_data(*matrix.value()), context, operation);
68 if (!determinant) return ExpressionResult::failure(determinant.error());
69 return ExpressionResult::success(std::move(determinant.value()));
70}
ExactMatrixData exact_matrix_data(const MatrixNode &matrix)
Result< ExprPtr > determinant_exact(const ExactMatrixData &input, ComputationContext &context, const std::string &operation)

引用了 context, LMCAS::detail::determinant_exact(), LMCAS::detail::matrix_api::exact_matrix_data(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), matrix_determinant_checked(), LMCAS::detail::matrix_api::require_square_matrix() , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

被这些函数引用 matrix_characteristic_polynomial_checked(), matrix_determinant_checked() , 以及 matrix_determinant_checked().

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

◆ matrix_eigenvalues_checked() [1/2]

MatrixEigenvalueResult LMCAS::matrix_eigenvalues_checked ( const std::shared_ptr< SymbolicExpr > & A)

在文件 symbolic_matrix_eigen.cpp 第 125 行定义.

引用了 context , 以及 matrix_eigenvalues_checked().

函数调用图:

◆ matrix_eigenvalues_checked() [2/2]

MatrixEigenvalueResult LMCAS::matrix_eigenvalues_checked ( const std::shared_ptr< SymbolicExpr > & A,
ComputationContext & context )

在文件 symbolic_matrix_eigen.cpp 第 64 行定义.

65 {
66 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
67 (context).limits().max_ast_nodes, "transform");
68 constexpr const char* operation = "matrix_eigenvalues";
69 auto matrix_result = require_square_matrix(A, context, operation);
70 if (!matrix_result) {
71 return MatrixEigenvalueResult::failure(matrix_result.error());
72 }
73 const auto& matrix = *matrix_result.value();
74 bool triangular = true;
75 for (std::size_t row = 0; row < matrix.rows() && triangular; ++row) {
76 for (std::size_t column = 0; column < row; ++column) {
77 auto value =
78 detail::make_expression_ptr(detail::normalize_node(matrix.get(row, column), transform_budget));
79 if (!detail::node(value)->is_zero()) {
80 triangular = false;
81 break;
82 }
83 }
84 }
85 if (triangular) {
86 std::vector<std::shared_ptr<SymbolicExpr>> values;
87 values.reserve(matrix.rows());
88 for (std::size_t index = 0; index < matrix.rows(); ++index) {
89 values.push_back(
90 detail::make_expression_ptr(detail::normalize_node(matrix.get(index, index), transform_budget)));
91 }
92 return MatrixEigenvalueResult::success(std::move(values));
93 }
94
96 A, "lambda", context);
97 if (!polynomial) {
98 return MatrixEigenvalueResult::failure(polynomial.error());
99 }
101 polynomial.value(), "lambda", context, SolveOptions{});
103 std::vector<std::shared_ptr<SymbolicExpr>> values;
104 std::set<std::string> seen;
105 for (auto& root : roots.value()) {
106 const auto key = root->to_string();
107 if (seen.insert(key).second) values.push_back(std::move(root));
108 }
109 if (values.empty()) {
112 "eigenvalue solver produced no finite roots", operation);
113 }
114 return MatrixEigenvalueResult::success(std::move(values));
115} catch (const CasError& error) {
117} catch (const std::bad_alloc&) {
118 return MatrixEigenvalueResult::failure(CasErrc::ResourceLimit, "allocation failed", "matrix_eigenvalues");
119} catch (const std::length_error& error) {
120 return MatrixEigenvalueResult::failure(CasErrc::ResourceLimit, error.what(), "matrix_eigenvalues");
121} catch (const std::exception& error) {
122 return MatrixEigenvalueResult::failure(CasErrc::InternalInvariant, error.what(), "matrix_eigenvalues");
123}

引用了 context, LMCAS::Result< T >::error(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), Inconclusive, LMCAS::detail::make_expression_ptr(), matrix_characteristic_polynomial_checked(), matrix_eigenvalues_checked(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::matrix_api::require_square_matrix(), roots(), solve_finite_checked(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success(), LMCAS::Result< T >::value() , 以及 value.

被这些函数引用 classify_quadratic_form(), LMCAS::detail::matrix_eigenspaces_checked(), matrix_eigenvalues_checked(), matrix_eigenvalues_checked() , 以及 vector_calculus_classify_critical_point().

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

◆ matrix_eigenvectors_checked() [1/2]

MatrixEigenvectorResult LMCAS::matrix_eigenvectors_checked ( const std::shared_ptr< SymbolicExpr > & A)

在文件 symbolic_matrix_eigen.cpp 第 255 行定义.

256 {
259}
MatrixEigenvectorResult matrix_eigenvectors_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)

引用了 context , 以及 matrix_eigenvectors_checked().

函数调用图:

◆ matrix_eigenvectors_checked() [2/2]

MatrixEigenvectorResult LMCAS::matrix_eigenvectors_checked ( const std::shared_ptr< SymbolicExpr > & A,
ComputationContext & context )

在文件 symbolic_matrix_eigen.cpp 第 240 行定义.

241 {
243 if (!spaces) return MatrixEigenvectorResult::failure(spaces.error());
244 try {
245 std::vector<std::vector<ExprPtr>> vectors;
246 for (auto& space : spaces.value())
247 for (auto& vector : space.second) vectors.push_back(std::move(vector));
248 return MatrixEigenvectorResult::success(std::move(vectors));
249 } catch (const std::bad_alloc&) {
251 "allocation failed while collecting eigenvectors", "matrix_eigenvectors");
252 }
253}
Result< std::vector< std::pair< ExprPtr, std::vector< std::vector< ExprPtr > > > > > matrix_eigenspaces_checked(const ExprPtr &matrix, ComputationContext &context)

引用了 context, LMCAS::Result< std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > >::failure(), LMCAS::detail::matrix_eigenspaces_checked(), matrix_eigenvectors_checked(), ResourceLimit , 以及 LMCAS::Result< std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > >::success().

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

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

◆ matrix_exp()

ExprPtr LMCAS::matrix_exp ( const ExprPtr & A)

在文件 matrix_decomposition_eigen.cpp 第 202 行定义.

202 {
204 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
205 (context).limits().max_ast_nodes, "transform");
206
207 auto decomposition = diagonalization_checked(A, context);
208 if (!decomposition) return SymbolicExpr::exp(A);
209 auto inverse = matrix_inverse_checked(decomposition.value().P, context);
210 if (!inverse) return SymbolicExpr::exp(A);
211 auto diagonal = std::dynamic_pointer_cast<const MatrixNode>(detail::node(decomposition.value().J));
212 const auto n = diagonal->rows();
213 std::vector<std::vector<ExprPtr>> values(n, std::vector<ExprPtr>(n, SymbolicExpr::number(0)));
214 for (std::size_t i = 0; i < n; ++i)
215 values[i][i] = SymbolicExpr::exp(detail::make_expression_ptr(diagonal->get(i, i)));
216 return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(decomposition.value().P,
217 SymbolicExpr::multiply(SymbolicExpr::matrix(values), inverse.value()))), transform_budget));
218}
ExpressionResult matrix_inverse_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)

引用了 context, LMCAS::detail::make_expression_ptr(), matrix_exp(), matrix_inverse_checked(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 matrix_exp().

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

◆ matrix_inverse_checked() [1/2]

ExpressionResult LMCAS::matrix_inverse_checked ( const std::shared_ptr< SymbolicExpr > & A)

在文件 symbolic_matrix.cpp 第 91 行定义.

引用了 context , 以及 matrix_inverse_checked().

函数调用图:

◆ matrix_inverse_checked() [2/2]

ExpressionResult LMCAS::matrix_inverse_checked ( const std::shared_ptr< SymbolicExpr > & A,
ComputationContext & context )

在文件 symbolic_matrix.cpp 第 78 行定义.

80 {
81 const std::string operation = "matrix_inverse";
82 auto matrix = require_square_matrix(A, context, operation);
83 if (!matrix) return ExpressionResult::failure(matrix.error());
84 auto inverse = detail::inverse_exact(
85 exact_matrix_data(*matrix.value()), context, operation);
86 if (!inverse) return ExpressionResult::failure(inverse.error());
88 exact_matrix_expression(inverse.value()));
89}
std::shared_ptr< SymbolicExpr > exact_matrix_expression(const ExactMatrixData &matrix)
Result< ExactMatrixData > inverse_exact(const ExactMatrixData &input, ComputationContext &context, const std::string &operation)

引用了 context, LMCAS::detail::matrix_api::exact_matrix_data(), LMCAS::detail::matrix_api::exact_matrix_expression(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::detail::inverse_exact(), matrix_inverse_checked(), LMCAS::detail::matrix_api::require_square_matrix() , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

被这些函数引用 matrix_exp(), matrix_inverse_checked(), matrix_inverse_checked(), matrix_log() , 以及 metric_inverse_checked().

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

◆ matrix_log()

ExprPtr LMCAS::matrix_log ( const ExprPtr & A)

在文件 matrix_decomposition_eigen.cpp 第 220 行定义.

220 {
222 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
223 (context).limits().max_ast_nodes, "transform");
224
225 auto decomposition = diagonalization_checked(A, context);
226 if (!decomposition) return nullptr;
227 auto inverse = matrix_inverse_checked(decomposition.value().P, context);
228 if (!inverse) return nullptr;
229 auto diagonal = std::dynamic_pointer_cast<const MatrixNode>(detail::node(decomposition.value().J));
230 const auto n = diagonal->rows();
231 AssumptionContext assumptions;
232 detail::AssumptionFacts facts(assumptions);
233 std::vector<std::vector<ExprPtr>> values(n, std::vector<ExprPtr>(n, SymbolicExpr::number(0)));
234 for (std::size_t i = 0; i < n; ++i) {
235 auto positive = detail::query_positive_value(diagonal->get(i, i), facts, context);
236 if (!positive || positive.value() != Tribool::True) return nullptr;
237 values[i][i] = SymbolicExpr::ln(detail::make_expression_ptr(diagonal->get(i, i)));
238 }
239 return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(decomposition.value().P,
240 SymbolicExpr::multiply(SymbolicExpr::matrix(values), inverse.value()))), transform_budget));
241}
Result< Tribool > query_positive_value(const Node &node, const FactsQuery &facts, ComputationContext &context)

引用了 context, LMCAS::detail::make_expression_ptr(), matrix_inverse_checked(), matrix_log(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::query_positive_value() , 以及 True.

被这些函数引用 matrix_log().

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

◆ matrix_multiply_checked() [1/2]

ExpressionResult LMCAS::matrix_multiply_checked ( const std::shared_ptr< SymbolicExpr > & A,
const std::shared_ptr< SymbolicExpr > & B )

在文件 symbolic_matrix.cpp 第 53 行定义.

54 {
56 return matrix_multiply_checked(A, B, context);
57}
ExpressionResult matrix_multiply_checked(const std::shared_ptr< SymbolicExpr > &A, const std::shared_ptr< SymbolicExpr > &B, ComputationContext &context)

引用了 context , 以及 matrix_multiply_checked().

函数调用图:

◆ matrix_multiply_checked() [2/2]

ExpressionResult LMCAS::matrix_multiply_checked ( const std::shared_ptr< SymbolicExpr > & A,
const std::shared_ptr< SymbolicExpr > & B,
ComputationContext & context )

在文件 symbolic_matrix.cpp 第 10 行定义.

12 {
13 const std::string operation = "matrix_multiply";
14 auto left = require_matrix(A, context, operation);
15 if (!left) return ExpressionResult::failure(left.error());
16 auto right = require_matrix(B, context, operation);
17 if (!right) return ExpressionResult::failure(right.error());
18 if (left.value()->cols() != right.value()->rows()) {
20 CasErrc::InvalidArgument, "matrix dimensions are not compatible", operation);
21 }
22 try {
23 detail::RewriteBudget budget(context, context.limits().max_recursion_depth,
24 context.limits().max_ast_nodes, "matrix_multiply");
25 const auto count = normalization_check_count(
26 &budget, left.value()->rows(), right.value()->cols());
27 auto output_terms = context.require_expansion_terms(count, operation);
28 if (!output_terms) { return ExpressionResult::failure(output_terms.error()); }
29 auto inner_terms = context.require_expansion_terms(left.value()->cols(), operation);
30 if (!inner_terms) { return ExpressionResult::failure(inner_terms.error()); }
31 normalization_check_arithmetic<MultiplyNode>(&budget, 0, left.value(), right.value());
33 std::vector<std::shared_ptr<const SymbolicNode>>{left.value(), right.value()});
35 product->accept(visitor);
36 auto result = visitor.get_result();
37 budget.measure(result);
38 if (!std::dynamic_pointer_cast<const MatrixNode>(result)) {
40 "matrix multiplication did not produce an explicit matrix", operation);
41 }
42 return detail::make_expression_ptr(std::move(result));
43 } catch (const CasError& error) {
44 return ExpressionResult::failure(error);
45 } catch (const std::bad_alloc&) {
47 "allocation failed while multiplying matrices", operation);
48 } catch (const std::exception& ex) {
49 return ExpressionResult::failure(CasErrc::InternalInvariant, ex.what(), operation);
50 }
51}
统一规范化数值幂。 精确操作数保留整数和有理数运算;近似求根要求指数精确等于 1/2。 有限浮点幂直接折叠,省去倒数中间值;非有限结果保留幂表达式。
Result< std::shared_ptr< const MatrixNode > > require_matrix(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context, const std::string &operation)
std::size_t normalization_check_count(detail::RewriteBudget *budget, std::size_t rows, std::size_t cols=1, bool wrapped=true)

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, InvalidArgument, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), matrix_multiply_checked(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::no_facts(), normalization_check_arithmetic(), normalization_check_count(), Real, LMCAS::detail::matrix_api::require_matrix(), ResourceLimit , 以及 right.

被这些函数引用 matrix_multiply_checked(), matrix_multiply_checked() , 以及 LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::verify_jordan_identity().

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

◆ matrix_norm()

std::shared_ptr< SymbolicExpr > LMCAS::matrix_norm ( const std::shared_ptr< SymbolicExpr > & A,
const std::string & type )

在文件 matrix_decomposition.cpp 第 106 行定义.

107 {
109 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
110 (context).limits().max_ast_nodes, "transform");
111 auto mat = std::dynamic_pointer_cast<const MatrixNode>(LMCAS::detail::node(A));
112 if (!mat) {
113 return nullptr;
114 }
115 size_t m = mat->rows(), n = mat->cols();
116
117 if (type == "frobenius") {
118 auto sum = SymbolicExpr::number(0);
119 for (size_t i = 0; i < m; ++i)
120 for (size_t j = 0; j < n; ++j) {
121 auto e = LMCAS::detail::make_expression_ptr(mat->get(i, j));
122 sum = SymbolicExpr::add(sum, SymbolicExpr::multiply(e, e));
123 }
124 return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::sqrt(sum)), transform_budget));
125 }
126 if (type == "1") {
127 return maximum_axis_sum(*mat, true, context);
128 }
129 if (type == "inf") {
130 return maximum_axis_sum(*mat, false, context);
131 }
132 return nullptr;
133}
std::shared_ptr< SymbolicExpr > maximum_axis_sum(const MatrixNode &matrix, bool columns, ComputationContext &context)

引用了 context, e(), LMCAS::detail::make_expression_ptr(), matrix_norm(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 matrix_norm().

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

◆ matrix_nullspace_checked() [1/2]

MatrixNullspaceResult LMCAS::matrix_nullspace_checked ( const std::shared_ptr< SymbolicExpr > & A)

在文件 symbolic_matrix_solve.cpp 第 17 行定义.

18 {
21}
MatrixNullspaceResult matrix_nullspace_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)

引用了 context , 以及 matrix_nullspace_checked().

函数调用图:

◆ matrix_nullspace_checked() [2/2]

MatrixNullspaceResult LMCAS::matrix_nullspace_checked ( const std::shared_ptr< SymbolicExpr > & A,
ComputationContext & context )

在文件 symbolic_matrix_solve.cpp 第 5 行定义.

7 {
8 const std::string operation = "matrix_nullspace";
9 auto matrix = require_matrix(A, context, operation);
10 if (!matrix) return MatrixNullspaceResult::failure(matrix.error());
11 auto nullspace = detail::nullspace_exact(
12 exact_matrix_data(*matrix.value()), context, operation);
13 if (!nullspace) return MatrixNullspaceResult::failure(nullspace.error());
14 return MatrixNullspaceResult::success(std::move(nullspace.value()));
15}
Result< std::vector< std::vector< ExprPtr > > > nullspace_exact(ExactMatrixData coefficients, ComputationContext &context, const std::string &operation)

引用了 context, LMCAS::detail::matrix_api::exact_matrix_data(), LMCAS::Result< std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > >::failure(), matrix_nullspace_checked(), LMCAS::detail::nullspace_exact(), LMCAS::detail::matrix_api::require_matrix() , 以及 LMCAS::Result< std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > >::success().

被这些函数引用 LMCAS::anonymous_namespace{symbolic_matrix_eigen.cpp}::eigenvalue_nullspace(), matrix_nullspace_checked() , 以及 matrix_nullspace_checked().

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

◆ matrix_rank_checked() [1/2]

MatrixRankResult LMCAS::matrix_rank_checked ( const std::shared_ptr< SymbolicExpr > & A)

在文件 symbolic_matrix.cpp 第 110 行定义.

111 {
113 return matrix_rank_checked(A, context);
114}
MatrixRankResult matrix_rank_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)

引用了 context , 以及 matrix_rank_checked().

函数调用图:

◆ matrix_rank_checked() [2/2]

MatrixRankResult LMCAS::matrix_rank_checked ( const std::shared_ptr< SymbolicExpr > & A,
ComputationContext & context )

在文件 symbolic_matrix.cpp 第 97 行定义.

99 {
100 const std::string operation = "matrix_rank";
101 auto matrix = require_matrix(A, context, operation);
102 if (!matrix) return MatrixRankResult::failure(matrix.error());
103 auto rank = detail::rank_exact(
104 exact_matrix_data(*matrix.value()), matrix.value()->cols(),
105 context, operation);
106 if (!rank) return MatrixRankResult::failure(rank.error());
107 return MatrixRankResult::success(rank.value());
108}
Result< std::size_t > rank_exact(ExactMatrixData input, std::size_t coefficient_columns, ComputationContext &context, const std::string &operation)

引用了 LMCAS::detail::ExactMatrixData::cols, context, LMCAS::detail::matrix_api::exact_matrix_data(), LMCAS::Result< std::size_t >::failure(), matrix_rank_checked(), LMCAS::detail::rank_exact(), LMCAS::detail::matrix_api::require_matrix() , 以及 LMCAS::Result< std::size_t >::success().

被这些函数引用 matrix_rank_checked(), matrix_rank_checked() , 以及 LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::verify_jordan_decomposition().

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

◆ matrix_reflection_checked() [1/2]

ExpressionResult LMCAS::matrix_reflection_checked ( double angle,
int dim )

在文件 symbolic_matrix_transform.cpp 第 81 行定义.

81 {
84}
ExpressionResult matrix_reflection_checked(double angle, int dim, ComputationContext &context)

引用了 context, dim , 以及 matrix_reflection_checked().

函数调用图:

◆ matrix_reflection_checked() [2/2]

ExpressionResult LMCAS::matrix_reflection_checked ( double angle,
int dim,
ComputationContext & context )

在文件 symbolic_matrix_transform.cpp 第 50 行定义.

51 {
52 const std::string operation = "matrix_reflection";
53 auto step = context.consume_steps(1, operation);
54 if (!step) return ExpressionResult::failure(step.error());
55 if (dim == 2) {
56 if (!std::isfinite(angle)) {
58 "reflection angle must be finite", operation);
59 }
60 const double cosine = std::cos(angle);
61 const double sine = std::sin(angle);
62 try {
63 auto c = SymbolicExpr::number(cosine * cosine - sine * sine);
64 auto s = SymbolicExpr::number(2.0 * sine * cosine);
66 SymbolicExpr::matrix({{c, s}, {s, SymbolicExpr::multiply(SymbolicExpr::number(-1), c)}}),
67 operation);
68 } catch (const CasError& error) {
69 return ExpressionResult::failure(error);
70 } catch (const std::bad_alloc&) {
72 "allocation failed while constructing reflection matrix", operation);
73 } catch (const std::exception& error) {
75 error.what(), operation);
76 }
77 }
78 return unsupported_matrix_dimension(operation);
79}
ExpressionResult unsupported_matrix_dimension(const std::string &operation)
ExpressionResult require_matrix_result(std::shared_ptr< SymbolicExpr > result, const std::string &operation)

引用了 c, context, dim, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, InvalidArgument, matrix_reflection_checked(), LMCAS::detail::matrix_api::require_matrix_result() , 以及 ResourceLimit.

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

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

◆ matrix_rotation_checked() [1/2]

ExpressionResult LMCAS::matrix_rotation_checked ( double theta,
int dim )

在文件 symbolic_matrix_transform.cpp 第 44 行定义.

44 {
46 return matrix_rotation_checked(theta, dim, context);
47}
ExpressionResult matrix_rotation_checked(double theta, int dim, ComputationContext &context)

引用了 context, dim , 以及 matrix_rotation_checked().

函数调用图:

◆ matrix_rotation_checked() [2/2]

ExpressionResult LMCAS::matrix_rotation_checked ( double theta,
int dim,
ComputationContext & context )

在文件 symbolic_matrix_transform.cpp 第 24 行定义.

25 {
26 const std::string operation = "matrix_rotation";
27 auto step = context.consume_steps(1, operation);
28 if (!step) return ExpressionResult::failure(step.error());
29 if (dim != 2) return invalid_matrix_dimension(operation);
30 if (!std::isfinite(theta)) {
33 "rotation angle must be finite", operation);
34 }
35 auto c = SymbolicExpr::number(std::cos(theta));
36 auto s = SymbolicExpr::number(std::sin(theta));
38 SymbolicExpr::matrix(
39 {{c, SymbolicExpr::multiply(SymbolicExpr::number(-1), s)},
40 {s, c}}),
41 operation);
42}

引用了 c, context, dim, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InvalidArgument, matrix_rotation_checked() , 以及 LMCAS::detail::matrix_api::require_matrix_result().

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

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

◆ matrix_rref_checked() [1/2]

ExpressionResult LMCAS::matrix_rref_checked ( const std::shared_ptr< SymbolicExpr > & A)

在文件 symbolic_matrix.cpp 第 129 行定义.

130 {
132 return matrix_rref_checked(A, context);
133}
ExpressionResult matrix_rref_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)

引用了 context , 以及 matrix_rref_checked().

函数调用图:

◆ matrix_rref_checked() [2/2]

ExpressionResult LMCAS::matrix_rref_checked ( const std::shared_ptr< SymbolicExpr > & A,
ComputationContext & context )

在文件 symbolic_matrix.cpp 第 116 行定义.

118 {
119 const std::string operation = "matrix_rref";
120 auto matrix = require_matrix(A, context, operation);
121 if (!matrix) return ExpressionResult::failure(matrix.error());
122 auto rref = detail::rref_exact(
123 exact_matrix_data(*matrix.value()), matrix.value()->cols(),
124 context, operation);
125 if (!rref) return ExpressionResult::failure(rref.error());
127}
Result< ExactMatrixData > rref_exact(ExactMatrixData input, std::size_t coefficient_columns, ComputationContext &context, const std::string &operation)

引用了 LMCAS::detail::ExactMatrixData::cols, context, LMCAS::detail::matrix_api::exact_matrix_data(), LMCAS::detail::matrix_api::exact_matrix_expression(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), matrix_rref_checked(), LMCAS::detail::matrix_api::require_matrix(), LMCAS::detail::rref_exact() , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

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

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

◆ matrix_scaling_checked() [1/2]

ExpressionResult LMCAS::matrix_scaling_checked ( double sx,
double sy,
int dim )

在文件 symbolic_matrix_transform.cpp 第 105 行定义.

105 {
107 return matrix_scaling_checked(sx, sy, dim, context);
108}
ExpressionResult matrix_scaling_checked(double sx, double sy, int dim, ComputationContext &context)

引用了 context, dim, matrix_scaling_checked() , 以及 sy.

函数调用图:

◆ matrix_scaling_checked() [2/2]

ExpressionResult LMCAS::matrix_scaling_checked ( double sx,
double sy,
int dim,
ComputationContext & context )

在文件 symbolic_matrix_transform.cpp 第 87 行定义.

88 {
89 const std::string operation = "matrix_scaling";
90 auto step = context.consume_steps(1, operation);
91 if (!step) return ExpressionResult::failure(step.error());
92 if (dim != 2) return invalid_matrix_dimension(operation);
93 if (!std::isfinite(sx) || !std::isfinite(sy)) {
96 "scaling factors must be finite", operation);
97 }
99 SymbolicExpr::matrix(
100 {{SymbolicExpr::number(sx), SymbolicExpr::number(0)},
101 {SymbolicExpr::number(0), SymbolicExpr::number(sy)}}),
102 operation);
103}

引用了 context, dim, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InvalidArgument, matrix_scaling_checked(), LMCAS::detail::matrix_api::require_matrix_result() , 以及 sy.

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

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

◆ matrix_solve_linear_checked() [1/2]

MatrixLinearSolveResult LMCAS::matrix_solve_linear_checked ( const std::shared_ptr< SymbolicExpr > & coefficients,
const std::shared_ptr< SymbolicExpr > & right_hand_side )

在文件 symbolic_matrix_solve.cpp 第 72 行定义.

74 {
77 coefficients, right_hand_side, context);
78}
MatrixLinearSolveResult matrix_solve_linear_checked(const std::shared_ptr< SymbolicExpr > &coefficients, const std::shared_ptr< SymbolicExpr > &right_hand_side, ComputationContext &context)

引用了 context , 以及 matrix_solve_linear_checked().

函数调用图:

◆ matrix_solve_linear_checked() [2/2]

MatrixLinearSolveResult LMCAS::matrix_solve_linear_checked ( const std::shared_ptr< SymbolicExpr > & coefficients,
const std::shared_ptr< SymbolicExpr > & right_hand_side,
ComputationContext & context )

在文件 symbolic_matrix_solve.cpp 第 23 行定义.

26 {
27 const std::string operation = "matrix_solve_linear";
28 auto matrix = require_matrix(coefficients, context, operation);
29 if (!matrix) return MatrixLinearSolveResult::failure(matrix.error());
30 auto rhs = require_matrix(right_hand_side, context, operation);
31 if (!rhs) return MatrixLinearSolveResult::failure(rhs.error());
32 if (rhs.value()->rows() != matrix.value()->rows() ||
33 rhs.value()->cols() != 1) {
36 "right-hand side must be a matching column matrix", operation);
37 }
38
39 detail::ExactMatrixData augmented{
40 matrix.value()->rows(), matrix.value()->cols() + 1, {}};
41 augmented.entries.reserve(augmented.rows * augmented.cols);
42 for (std::size_t row = 0; row < augmented.rows; ++row) {
43 for (std::size_t column = 0;
44 column < matrix.value()->cols(); ++column) {
45 augmented.entries.push_back(
47 matrix.value()->get(row, column)));
48 }
49 augmented.entries.push_back(
50 LMCAS::detail::make_expression_ptr(rhs.value()->get(row, 0)));
51 }
52 auto solved = detail::solve_linear_exact(
53 std::move(augmented), matrix.value()->cols(), context, operation);
54 if (!solved) return MatrixLinearSolveResult::failure(solved.error());
55 if (auto* unique =
56 std::get_if<detail::UniqueLinearSolution>(&solved.value())) {
58 MatrixUniqueLinearSolution{std::move(unique->values)});
59 }
60 if (auto* parametric =
61 std::get_if<detail::ParametricLinearSolution>(&solved.value())) {
64 std::move(parametric->particular),
65 std::move(parametric->nullspace_basis),
66 std::move(parametric->free_columns)});
67 }
70}
Result< ExactLinearSolution > solve_linear_exact(ExactMatrixData augmented, std::size_t coefficient_columns, ComputationContext &context, const std::string &operation)

引用了 LMCAS::detail::ExactMatrixData::cols, context, LMCAS::detail::ExactMatrixData::entries, LMCAS::Result< MatrixLinearSolution >::failure(), InvalidArgument, LMCAS::detail::make_expression_ptr(), matrix_solve_linear_checked(), LMCAS::detail::matrix_api::require_matrix(), rhs, LMCAS::detail::ExactMatrixData::rows, LMCAS::detail::solve_linear_exact() , 以及 LMCAS::Result< MatrixLinearSolution >::success().

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

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

◆ matrix_trace()

std::shared_ptr< SymbolicExpr > LMCAS::matrix_trace ( const std::shared_ptr< SymbolicExpr > & A)

在文件 matrix_decomposition.cpp 第 68 行定义.

68 {
70 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
71 (context).limits().max_ast_nodes, "transform");
72 auto mat = std::dynamic_pointer_cast<const MatrixNode>(LMCAS::detail::node(A));
73 if (!mat || mat->rows() != mat->cols()) {
74 return nullptr;
75 }
76 auto sum = SymbolicExpr::number(0);
77 for (size_t i = 0; i < mat->rows(); ++i) {
78 sum = SymbolicExpr::add(sum, LMCAS::detail::make_expression_ptr(mat->get(i, i)));
79 }
81}

引用了 context, LMCAS::detail::make_expression_ptr(), matrix_trace(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 matrix_trace().

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

◆ member()

ExprResult LMCAS::member ( const ExprPtr & element,
const ExprPtr & set,
ComputationContext & context )

在文件 value_facade.cpp 第 52 行定义.

53 {
55}
SymbolicSetResult make_membership(const std::shared_ptr< SymbolicExpr > &element, const std::shared_ptr< SymbolicExpr > &set, ComputationContext &context)

引用了 context, element, make_membership(), member() , 以及 set.

被这些函数引用 LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_operands(), member(), membership(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::query_value() , 以及 LMCAS::detail::anonymous_namespace{exact_sturm.cpp}::variations_at().

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

◆ membership()

ExprResult LMCAS::membership ( const ExprPtr & element,
const ExprPtr & set,
bool negated )

在文件 expr_facade.cpp 第 249 行定义.

249 {
251 auto result = member(element, set, context);
252 if (!result || !negated) return result;
253 return logical_not(result.value());
254}
ExprResult logical_not(const ExprPtr &expression)
ExprResult member(const ExprPtr &element, const ExprPtr &set, ComputationContext &context)
const ExprPtr bool negated

引用了 context, element, logical_not(), member(), membership(), negated , 以及 set.

被这些函数引用 LMCAS::MembershipNode::compare_same_type() , 以及 membership().

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

◆ metric_inverse_checked() [1/2]

DifferentialGeometryExprResult LMCAS::metric_inverse_checked ( const std::shared_ptr< SymbolicExpr > & g_ij)

在文件 differential_geometry.cpp 第 362 行定义.

364{
366 return metric_inverse_checked(g_ij, context);
367}
DifferentialGeometryExprResult metric_inverse_checked(const std::shared_ptr< SymbolicExpr > &g_ij, ComputationContext &context)

引用了 context , 以及 metric_inverse_checked().

函数调用图:

◆ metric_inverse_checked() [2/2]

DifferentialGeometryExprResult LMCAS::metric_inverse_checked ( const std::shared_ptr< SymbolicExpr > & g_ij,
ComputationContext & context )

在文件 differential_geometry.cpp 第 336 行定义.

339{
340 const std::string operation = "metric_inverse";
341 auto metric = validate_metric_matrix(g_ij, nullptr, context, operation);
342 if (!metric) return DifferentialGeometryExprResult::failure(metric.error());
343 auto budget = context.consume_steps(12, operation);
344 if (!budget) return DifferentialGeometryExprResult::failure(budget.error());
345 try {
346 auto result = matrix_inverse_checked(g_ij, context);
347 if (!result) {
348 return DifferentialGeometryExprResult::failure(result.error());
349 }
350 return DifferentialGeometryExprResult::success(result.value());
351 } catch (const std::bad_alloc&) {
353 "allocation failed while inverting metric",
354 operation);
355 } catch (const std::exception& ex) {
357 ex.what(),
358 operation);
359 }
360}

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, matrix_inverse_checked(), metric_inverse_checked(), ResourceLimit , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

被这些函数引用 metric_inverse_checked(), metric_inverse_checked() , 以及 riemann_curvature_tensor_checked().

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

◆ mixed_product()

VectorCalculusExprResult LMCAS::mixed_product ( const VectorField & a,
const VectorField & b,
const VectorField & c )

在文件 vector_calculus_algebra.cpp 第 217 行定义.

218 {
220 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
221 context.limits().max_ast_nodes, "mixed_product");
222 return mixed_product_impl(a, b, c, transform_budget);
223} catch (const CasError& error) {
225} catch (const std::bad_alloc&) {
227 "vector calculus allocation failed", "mixed_product");
228} catch (const std::length_error& error) {
229 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), "mixed_product");
230} catch (const std::exception& error) {
231 return VectorCalculusExprResult::failure(CasErrc::InternalInvariant, error.what(), "mixed_product");
232}
static VectorCalculusExprResult mixed_product_impl(const VectorField &a, const VectorField &b, const VectorField &c, detail::RewriteBudget &transform_budget)

引用了 a, b, c, context, mixed_product() , 以及 mixed_product_impl().

被这些函数引用 mixed_product().

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

◆ mixed_product_impl()

VectorCalculusExprResult LMCAS::mixed_product_impl ( const VectorField & a,
const VectorField & b,
const VectorField & c,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_algebra.cpp 第 127 行定义.

129{
130 auto cross = cross_product_impl(b, c, transform_budget);
131 if (!cross) return VectorCalculusExprResult::failure(cross.error());
132 return dot_product_impl(a, cross.value(), transform_budget);
133}

引用了 a, b, c, cross_product_impl(), dot_product_impl(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), mixed_product_impl() , 以及 LMCAS::Result< T >::value().

被这些函数引用 mixed_product() , 以及 mixed_product_impl().

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

◆ mul() [1/2]

ExprResult LMCAS::mul ( const ExprPtr & lhs,
const ExprPtr & rhs )

在文件 expr_arithmetic.cpp 第 35 行定义.

35 {
37 return mul(lhs, rhs, context);
38}

引用了 context, mul() , 以及 rhs.

函数调用图:

◆ mul() [2/2]

ExprResult LMCAS::mul ( const ExprPtr & lhs,
const ExprPtr & rhs,
ComputationContext & context )

在文件 expr_arithmetic.cpp 第 29 行定义.

31 {
32 return quantity_multiply(lhs, rhs, context);
33}
QuantityResult quantity_multiply(const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs, ComputationContext &context)

引用了 context, mul(), quantity_multiply() , 以及 rhs.

被这些函数引用 LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::coefficient(), LMCAS::solver_detail::collect_denominator_factors(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::collect_transcendental_subexprs(), LMCAS::InferenceEngine::Impl::composite_integer(), LMCAS::InferenceEngine::Impl::composite_negative(), LMCAS::InferenceEngine::Impl::composite_nonnegative(), LMCAS::InferenceEngine::Impl::composite_nonpositive(), LMCAS::InferenceEngine::Impl::composite_nonzero(), LMCAS::InferenceEngine::Impl::composite_positive(), LMCAS::InferenceEngine::Impl::composite_real(), LMCAS::SymbolicFactory::create_multiply(), LMCAS::anonymous_namespace{mixed_transcendental_classification.cpp}::degree_in_var(), LMCAS::detail::matrix_decomposition::exact_rational_expr(), LMCAS::detail::matrix_decomposition::anonymous_namespace{matrix_decomposition_support.cpp}::exact_rational_product(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::extract_exp_multiplier(), LMCAS::anonymous_namespace{mixed_transcendental_search.cpp}::extract_linear_coefficient(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::extract_sin_cos_powers(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::has_exp_k_var_terms(), LMCAS::InferenceEngine::Impl::has_negated_operand(), LMCAS::anonymous_namespace{symbolic_factor.cpp}::is_poly_expr_node(), LMCAS::solver_detail::is_polynomial_node(), is_separable(), mul(), mul(), LMCAS::solver_detail::multiply_no_expand(), neg(), LMCAS::MultiplyNode::normalize_operands(), LMCAS::expr_detail::ExprParser::parse_multiplicative(), LMCAS::anonymous_namespace{query_conditions.cpp}::product_conditions(), LMCAS::InferenceEngine::Impl::product_relation_sign(), LMCAS::anonymous_namespace{integration_rational_collection.cpp}::rd_collect_rational(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::SubstNodeVisitor::replace(), LMCAS::anonymous_namespace{residual_verification.cpp}::residual_piecewise(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::rewrite_exp_as_u_power(), LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_split_inv_var(), LMCAS::anonymous_namespace{complex_analysis.cpp}::split_real_imag(), LMCAS::anonymous_namespace{query_conditions.cpp}::subtracted_operand(), LMCAS::InferenceEngine::Impl::subtrahend(), symbolic_node_to_multipoly(), te_extract_exp(), te_inv_product(), LMCAS::transform_detail::te_split_coeff(), tf_collect_transcendental(), tf_contains_transcendental(), tf_degree_in(), tf_detect_multiplicative_structure(), tf_extract_coeff_trig_squared(), tf_extract_exp_factor(), tf_is_negation_of(), tf_remove_exp_factor(), tf_simplify_pythagorean_node(), tf_substitute_expr(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_has_trig_of_var(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_is_rational_trig(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_replace() , 以及 LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_to_rational().

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

◆ multi_crt()

std::pair< int64_t, int64_t > LMCAS::multi_crt ( const std::vector< int64_t > & residues,
const std::vector< int64_t > & primes )
inline

多模数中国剩余定理

参数
residues余数列表
primes对应的模数列表(两两互素)
返回
pair(合并余数, 合并模数)
异常
std::invalid_argument若输入为空或大小不匹配

在文件 modular_arithmetic.hpp 第 323 行定义.

324 {
325 if (residues.empty() || residues.size() != primes.size()) {
326 throw std::invalid_argument("multi_crt(): residues and primes must be non-empty and same size");
327 }
328
329 int64_t modulus = primes[0];
330 int64_t combined = ModInt(residues[0], modulus).value();
331
332 for (size_t i = 1; i < residues.size(); ++i) {
333 auto [x, m] = crt(combined, modulus, residues[i], primes[i]);
334 combined = x;
335 modulus = m;
336 }
337
338 return {combined, modulus};
339}
std::pair< int64_t, int64_t > crt(int64_t r1, int64_t m1, int64_t r2, int64_t m2)
中国剩余定理(两模数),返回规范余数与模数乘积。

引用了 LMCAS::ModInt::ModInt(), crt() , 以及 multi_crt().

被这些函数引用 multi_crt().

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

◆ multi_crt_checked() [1/2]

CrtResult LMCAS::multi_crt_checked ( const std::vector< int64_t > & residues,
const std::vector< int64_t > & primes )
inline

在文件 modular_arithmetic.hpp 第 375 行定义.

376 {
378 return multi_crt_checked(residues, primes, context);
379}
CrtResult multi_crt_checked(const std::vector< int64_t > &residues, const std::vector< int64_t > &primes, ComputationContext &context)
Checked CRT for a non-empty list of pairwise coprime positive moduli.

引用了 context , 以及 multi_crt_checked().

函数调用图:

◆ multi_crt_checked() [2/2]

CrtResult LMCAS::multi_crt_checked ( const std::vector< int64_t > & residues,
const std::vector< int64_t > & primes,
ComputationContext & context )
inline

Checked CRT for a non-empty list of pairwise coprime positive moduli.

在文件 modular_arithmetic.hpp 第 344 行定义.

346 {
347 constexpr const char* operation = "multi_crt";
348 auto step = context.consume_steps(residues.size() + 1, operation);
349 if (!step) return CrtResult::failure(step.error());
350 if (residues.empty() || residues.size() != primes.size()) {
351 return CrtResult::failure(
353 "multi_crt residues and moduli must be non-empty and the same size",
354 operation);
355 }
356 for (int64_t modulus : primes) {
357 if (modulus <= 0) {
359 "multi_crt moduli must be positive", operation);
360 }
361 }
362
363 int64_t modulus = primes[0];
364 int64_t combined = ModInt(residues[0], modulus).value();
365 for (size_t i = 1; i < residues.size(); ++i) {
366 auto merged = crt_checked(combined, modulus, residues[i], primes[i], context);
367 if (!merged) return merged;
368 combined = merged.value().first;
369 modulus = merged.value().second;
370 }
371
372 return CrtResult::success({combined, modulus});
373}

引用了 LMCAS::ModInt::ModInt(), context, crt_checked(), LMCAS::Result< std::pair< int64_t, int64_t > >::failure(), InvalidArgument, multi_crt_checked() , 以及 LMCAS::Result< std::pair< int64_t, int64_t > >::success().

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

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

◆ multiply_number_nodes()

std::shared_ptr< const NumberNode > LMCAS::multiply_number_nodes ( const std::shared_ptr< const NumberNode > & a,
const std::shared_ptr< const NumberNode > & b )
static

在文件 solver_linear.cpp 第 60 行定义.

60 {
61 if (std::holds_alternative<Rational>(a->value()) || std::holds_alternative<Rational>(b->value())) {
62 Rational r1 = std::holds_alternative<Rational>(a->value()) ? std::get<Rational>(a->value()) : Rational(std::get<BigInt>(a->value()));
63 Rational r2 = std::holds_alternative<Rational>(b->value()) ? std::get<Rational>(b->value()) : Rational(std::get<BigInt>(b->value()));
65 }
66
67 return LMCAS::detail::make_node<NumberNode>(std::get<BigInt>(a->value()) * std::get<BigInt>(b->value()));
68}

引用了 a, b, LMCAS::detail::make_node(), multiply_number_nodes() , 以及 LMCAS::Result< T >::value().

被这些函数引用 LMCAS::solver_detail::multiply_no_expand() , 以及 multiply_number_nodes().

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

◆ multiply_numbers()

std::shared_ptr< const NumberNode > LMCAS::multiply_numbers ( const std::shared_ptr< const NumberNode > & a,
const std::shared_ptr< const NumberNode > & b )

两个数值节点相乘

参数
a乘数节点
b乘数节点
返回
积的数值节点

在文件 normalization_utils.cpp 第 167 行定义.

167 {
168 if (std::holds_alternative<Rational>(a->value()) || std::holds_alternative<Rational>(b->value())) {
169 const Rational r1 = exact_number_as_rational(*a);
170 const Rational r2 = exact_number_as_rational(*b);
172 }
173
175 std::get<BigInt>(a->value()) * std::get<BigInt>(b->value()));
176}

引用了 a, b, exact_number_as_rational(), LMCAS::detail::make_node(), multiply_numbers() , 以及 LMCAS::Result< T >::value().

被这些函数引用 LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::add_number(), multiply_numbers() , 以及 LMCAS::NormalizationVisitor::normalize_matrix_product().

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

◆ multipoly_to_symbolic()

std::shared_ptr< SymbolicExpr > LMCAS::multipoly_to_symbolic ( const LMCAS::MultiPoly & poly,
ComputationContext & context )
static

在文件 symbolic_factor.cpp 第 126 行定义.

126 {
127
128 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
129 (context).limits().max_ast_nodes, "transform");
130 if (poly.is_zero()) { return SymbolicExpr::number(0); }
131
132 const auto& vars = poly.variables();
133 const auto& terms = poly.terms();
134
135 std::vector<std::shared_ptr<SymbolicExpr>> term_exprs;
136 term_exprs.reserve(terms.size());
137
138 for (const auto& [mono, coeff] : terms) {
139 term_exprs.push_back(
141 }
142
143 if (term_exprs.empty()) { return SymbolicExpr::number(0); }
144 if (term_exprs.size() == 1) { return detail::make_expression_ptr(detail::normalize_node(detail::node(term_exprs[0]), transform_budget)); }
145
146 auto result = term_exprs[0];
147 for (size_t i = 1; i < term_exprs.size(); ++i) {
148 result = SymbolicExpr::add(result, term_exprs[i]);
149 }
150 return detail::make_expression_ptr(detail::normalize_node(detail::node(result), transform_budget));
151}
std::shared_ptr< SymbolicExpr > multipoly_term_to_expression(const Monomial &monomial, const Rational &coefficient, const std::vector< std::string > &variables)

引用了 context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::multipoly_term_to_expression(), multipoly_to_symbolic(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 vars.

被这些函数引用 multipoly_to_symbolic() , 以及 multivariate_factor_expression().

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

◆ multivariate_content()

MultiPoly LMCAS::multivariate_content ( const MultiPoly & poly,
const std::string & main_var )

若 main_var 不在变量列表中,或多项式在 main_var 上次数为 0,容度就是多项式本身

在文件 multivariate_factor.cpp 第 151 行定义.

152{
153 if (poly.is_zero()) { return MultiPoly(); }
154 /// 若 main_var 不在变量列表中,或多项式在 main_var 上次数为 0,容度就是多项式本身
155 const auto& vars = poly.variables();
156 int var_idx = -1;
157 for (size_t i = 0; i < vars.size(); ++i) {
158 if (vars[i] == main_var) { var_idx = static_cast<int>(i); break; }
159 }
160 if (var_idx < 0) { return poly; }
161 if (poly.degree(main_var) <= 0) { return poly; }
162 auto coeffs = extract_coefficients(poly, main_var);
163 if (coeffs.empty()) { return MultiPoly(); }
164 auto it = coeffs.begin();
165 MultiPoly content_gcd = it->second;
166 ++it;
167 for (; it != coeffs.end(); ++it) {
168 if (it->second.is_zero()) { continue; }
169 content_gcd = multivariate_gcd(content_gcd, it->second);
170 if (content_gcd.is_constant()) {
171 Rational nc = content_gcd.numeric_content();
172 if (nc == Rational(1)) { return content_gcd; }
173 }
174 }
175 if (!content_gcd.is_zero() && !content_gcd.terms().empty()) {
176 if (content_gcd.terms()[0].second < Rational(0)) { content_gcd = content_gcd * Rational(-1); }
177 }
178 return content_gcd;
179}
static std::map< int, MultiPoly > extract_coefficients(const MultiPoly &poly, const std::string &main_var)

引用了 extract_coefficients(), main_var, multivariate_content(), multivariate_gcd() , 以及 vars.

被这些函数引用 multivariate_content() , 以及 multivariate_primitive_part().

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

◆ multivariate_diophantine()

std::vector< MultiPoly > LMCAS::multivariate_diophantine ( const std::vector< MultiPoly > & factors,
const MultiPoly & target,
const std::string & var,
const Rational & eval_point,
int degree_bound )

多元丢番图方程求解器

求解 s_1*f_1 + s_2*f_2 + ... + sᵣ*fᵣ == target (mod (var - eval_point)^degree_bound), 其中各 fᵢ 两两互素.用于 Hensel 提升过程中计算修正项.

算法:

  1. 二因子情形(r=2):使用扩展 GCD 求 Bezout 系数
  2. 一般情形(r>2):递归归约–令 g = f_2*...*fᵣ, 先解 s_1*f_1 + t*g == target,再递归解 s_2*f_2 + ... + sᵣ*fᵣ == t
  3. 对每个解截断为关于 var 的次数 < degree_bound
参数
[in]factors互素因子列表 [f_1, ..., fᵣ]
[in]target目标多项式 c
[in]var变量名
[in]eval_point求值点
[in]degree_bound次数上界
返回
解多项式列表 [s_1, s_2, ..., sᵣ]
参见
Geddes, Czapor, Labahn. "Algorithms for Computer Algebra." Section15.5.

单因子情形:s_1 = target / f_1(精确除法后截断)

一般情形(r > 2):递归归约 令 g = f_2 * f₃ * ... * fᵣ

解二因子方程:s_1*f_1 + t*g == target

退化情形

s_1 已确定

递归解:s_2*f_2 + ... + sᵣ*fᵣ == t_poly * g 因为原方程为 s_1*f_1 + t*g = target, 我们需要 s_2*f_2 + ... + sᵣ*fᵣ = t*g = target - s_1*f_1

组装完整解

在文件 multivariate_hensel.cpp 第 529 行定义.

535{
536 int r = static_cast<int>(factors.size());
537 if (r == 0) { return {}; }
538 if (r == 1) {
539 /// 单因子情形:s_1 = target / f_1(精确除法后截断)
540 try {
541 MultiPoly s1 = target.exact_div(factors[0]);
542 s1 = truncate_mod_var(s1, var, degree_bound);
543 return {s1};
544 } catch (const std::runtime_error&) {
545 return {};
546 }
547 }
548
549 const auto& vars = factors[0].variables();
550
551 if (r == 2) {
552 return solve_diophantine_pair(factors, target, var, eval_point,
553 degree_bound);
554 }
555
556 /// 一般情形(r > 2):递归归约
557 /// 令 g = f_2 * f₃ * ... * fᵣ
558 MultiPoly g = factors[1];
559 for (int i = 2; i < r; ++i) {
560 g = g * factors[i];
561 }
562
563 /// 解二因子方程:s_1*f_1 + t*g == target
564 std::vector<MultiPoly> two_factors = {factors[0], g};
565 std::vector<MultiPoly> two_solution = multivariate_diophantine(
566 two_factors, target, var, eval_point, degree_bound);
567
568 if (two_solution.size() != 2) {
569 /// 退化情形
570 std::vector<MultiPoly> result(r, MultiPoly(Rational(0), vars));
571 return result;
572 }
573
574 /// s_1 已确定
575 MultiPoly s1 = two_solution[0];
576 MultiPoly t_poly = two_solution[1];
577
578 /// 递归解:s_2*f_2 + ... + sᵣ*fᵣ == t_poly * g
579 /// 因为原方程为 s_1*f_1 + t*g = target,
580 /// 我们需要 s_2*f_2 + ... + sᵣ*fᵣ = t*g = target - s_1*f_1
581 MultiPoly remaining_target = t_poly * g;
582 remaining_target = truncate_mod_var(remaining_target, var, degree_bound);
583
584 std::vector<MultiPoly> remaining_factors(factors.begin() + 1, factors.end());
585 std::vector<MultiPoly> remaining_solution = multivariate_diophantine(
586 remaining_factors, remaining_target, var, eval_point, degree_bound);
587
588 /// 组装完整解
589 std::vector<MultiPoly> result;
590 result.push_back(std::move(s1));
591 for (auto& sol : remaining_solution) {
592 result.push_back(std::move(sol));
593 }
594
595 return result;
596}
static std::vector< MultiPoly > solve_diophantine_pair(const std::vector< MultiPoly > &factors, const MultiPoly &target, const std::string &var, const Rational &eval_point, int degree_bound)

引用了 multivariate_diophantine(), r, solve_diophantine_pair(), target, truncate_mod_var() , 以及 vars.

被这些函数引用 apply_hensel_lift_steps() , 以及 multivariate_diophantine().

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

◆ multivariate_factor_expression()

std::shared_ptr< SymbolicExpr > LMCAS::multivariate_factor_expression ( const MultiFactorResult & result,
ComputationContext & context )
static

在文件 symbolic_factor.cpp 第 381 行定义.

382 {
383 std::vector<std::shared_ptr<const SymbolicNode>> factor_nodes;
384
385 if (!(result.constant == Rational(1))) {
386 factor_nodes.push_back(
387 LMCAS::detail::node(SymbolicExpr::number(result.constant)));
388 }
389
390 for (size_t i = 0; i < result.factors.size(); ++i) {
391 auto factor_expr = multipoly_to_symbolic(result.factors[i], context);
392 if (!factor_expr || factor_expr->is_zero()) { continue; }
393
394 int mult = (i < result.multiplicities.size())
395 ? result.multiplicities[i] : 1;
396
397 if (mult == 1) {
398 factor_nodes.push_back(LMCAS::detail::node(factor_expr));
399 } else {
400 auto pow_expr = SymbolicExpr::power(
401 factor_expr, SymbolicExpr::number(mult));
402 factor_nodes.push_back(LMCAS::detail::node(pow_expr));
403 }
404 }
405
406 if (factor_nodes.size() > 1) {
408 LMCAS::detail::make_node<MultiplyNode>(std::move(factor_nodes)));
409 } else if (factor_nodes.size() == 1) {
410 return LMCAS::detail::make_expression_ptr(factor_nodes[0]);
411 }
412 return nullptr;
413}
std::vector< MultiPoly > factors
精确因子列表(各因子本原)
static std::shared_ptr< SymbolicExpr > multipoly_to_symbolic(const LMCAS::MultiPoly &poly, ComputationContext &context)
Rational constant
数值常数因子
std::vector< int > multiplicities
各因子的重数

引用了 LMCAS::MultiFactorResult::constant, context, LMCAS::MultiFactorResult::factors, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::MultiFactorResult::multiplicities, multipoly_to_symbolic(), multivariate_factor_expression() , 以及 LMCAS::detail::node().

被这些函数引用 factor_multivariate_expression() , 以及 multivariate_factor_expression().

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

◆ multivariate_gcd()

MultiPoly LMCAS::multivariate_gcd ( const MultiPoly & a,
const MultiPoly & b )

在文件 multivariate_factor.cpp 第 364 行定义.

365{
366 if (a.is_zero()) { return b.is_zero() ? MultiPoly() : b.make_primitive(); }
367 if (b.is_zero()) { return a.make_primitive(); }
368 const auto& vars = a.variables().empty() ? b.variables() : a.variables();
369 if (a.is_constant() && b.is_constant()) {
370 Rational g = rational_gcd(a.numeric_content(), b.numeric_content());
371 return MultiPoly(g, vars);
372 }
373 if (a.is_univariate() && b.is_univariate()) {
374 return univariate_gcd(a, b, vars);
375 }
377}
static MultiPoly recursive_multivariate_gcd(const MultiPoly &a, const MultiPoly &b, const std::vector< std::string > &vars)
static Rational rational_gcd(const Rational &a, const Rational &b)
static MultiPoly univariate_gcd(const MultiPoly &a, const MultiPoly &b, const std::vector< std::string > &vars)

引用了 a, b, multivariate_gcd(), rational_gcd(), recursive_multivariate_gcd(), univariate_gcd() , 以及 vars.

被这些函数引用 collect_gcd_samples(), multivariate_content(), multivariate_gcd(), square_free_decompose(), symbolic_polynomial_gcd() , 以及 LMCAS::anonymous_namespace{symbolic_gcd.cpp}::verify_gcd_candidate().

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

◆ multivariate_hensel_lift()

std::vector< MultiPoly > LMCAS::multivariate_hensel_lift ( const MultiPoly & poly,
const std::vector< Polynomial< Rational > > & univariate_factors,
const std::string & lift_var,
const Rational & eval_point,
int degree_bound )

多元 Hensel 提升(单变量步)

将一元因子逐变量提升,从 f(x_1, a_2, ..., a_n) 的因子恢复到包含 lift_var 的因子. 每次引入一个辅助变量,计算修正项直到达到次数上界.

算法(参考 Geddes, Czapor, Labahn Section15.6):

  1. 将一元因子嵌入到完整变量集中
  2. 对 k = 1, ..., degree_bound: a. 计算当前因子乘积(截断到 lift_var 次数 <= k) b. 计算误差 E = poly - product(提取 lift_var 次数恰为 k 的部分) c. 若误差为零则继续 d. 用丢番图求解器分配误差到各因子 e. 将修正项加到各因子上 f. 验证:product of lifted factors == poly mod (lift_var - eval_point)^(k+1)
  3. 返回提升后的因子
参数
[in]poly原始多元多项式
[in]univariate_factors一元分解得到的因子列表
[in]lift_var当前提升的变量名
[in]eval_point该变量的求值点
[in]degree_bound提升次数上界
返回
提升后的多元因子列表
参见
Geddes, Czapor, Labahn. "Algorithms for Computer Algebra." Section15.6.

确定主变量(一元因子的变量)和提升变量在完整变量集中的位置

lift_var 位于变量域之外时,返回嵌入后的原因子.

在文件 multivariate_hensel.cpp 第 237 行定义.

243{
244 int r = static_cast<int>(univariate_factors.size());
245 if (r == 0) { return {}; }
246 if (r == 1) {
247 return {poly};
248 }
249 if (degree_bound <= 0) {
250 return embed_without_lifting(univariate_factors, poly.variables());
251 }
252
253 const auto& vars = poly.variables();
254
255 /// 确定主变量(一元因子的变量)和提升变量在完整变量集中的位置
256 std::string main_var = univariate_factors[0].variable_name;
257 int lift_var_idx = -1;
258 for (size_t i = 0; i < vars.size(); ++i) {
259 if (vars[i] == lift_var) { lift_var_idx = static_cast<int>(i); }
260 }
261
262 for (const auto& factor : univariate_factors) {
263 if (factor.variable_name != main_var) {
264 throw std::invalid_argument("Hensel lifting: univariate factor ring mismatch");
265 }
266 }
267 auto factors = embed_without_lifting(univariate_factors, vars);
268
269 /// lift_var 位于变量域之外时,返回嵌入后的原因子.
270 if (lift_var_idx < 0) {
271 return factors;
272 }
273
274 MultiPoly base_product(Rational(1), vars);
275 for (const auto& factor : factors) { base_product = base_product * factor; }
276 if (base_product.eval(lift_var, eval_point) != poly.eval(lift_var, eval_point)) {
277 return {};
278 }
279
281 poly, factors, lift_var, lift_var_idx, eval_point, degree_bound, r)) {
282 return {};
283 }
284
285 return factors;
286}
static bool apply_hensel_lift_steps(const MultiPoly &poly, std::vector< MultiPoly > &factors, const std::string &lift_var, int lift_var_idx, const Rational &eval_point, int degree_bound, int factor_count)
static std::vector< MultiPoly > embed_without_lifting(const std::vector< Polynomial< Rational > > &univariate_factors, const std::vector< std::string > &vars)

引用了 apply_hensel_lift_steps(), embed_without_lifting(), main_var, multivariate_hensel_lift(), r , 以及 vars.

被这些函数引用 LMCAS::multivariate_checked_detail::factor_linear_hensel() , 以及 multivariate_hensel_lift().

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

◆ multivariate_primitive_part()

MultiPoly LMCAS::multivariate_primitive_part ( const MultiPoly & poly,
const std::string & main_var )

content 的变量集是去掉 main_var 后的辅助变量集, 需要将其嵌入到 poly 的完整变量集中才能正确执行 exact_div.

在文件 multivariate_factor.cpp 第 180 行定义.

181{
182 if (poly.is_zero()) { return poly; }
183 MultiPoly content = multivariate_content(poly, main_var);
184 if (content.is_zero()) { return MultiPoly(); }
185 if (content.is_constant() && content.numeric_content() == Rational(1)) { return poly; }
186
187 /// content 的变量集是去掉 main_var 后的辅助变量集,
188 /// 需要将其嵌入到 poly 的完整变量集中才能正确执行 exact_div.
189 const auto& full_vars = poly.variables();
190 int var_idx = -1;
191 for (size_t i = 0; i < full_vars.size(); ++i) {
192 if (full_vars[i] == main_var) { var_idx = static_cast<int>(i); break; }
193 }
194
195 MultiPoly content_in_full_vars = content;
196 if (var_idx >= 0 && content.variables().size() < full_vars.size()) {
197 std::vector<MultiPoly::Term> new_terms;
198 for (const auto& term : content.terms()) {
200 term.first, full_vars.size(), var_idx, 0);
201 new_terms.emplace_back(std::move(full_mono), term.second);
202 }
203 content_in_full_vars = MultiPoly(std::move(new_terms), full_vars);
204 }
205
206 return poly.exact_div(content_in_full_vars);
207}
MultiPoly multivariate_content(const MultiPoly &poly, const std::string &main_var)

引用了 main_var, multivariate_content(), multivariate_primitive_part() , 以及 restore_main_exponent().

被这些函数引用 multivariate_primitive_part().

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

◆ ne()

ExprResult LMCAS::ne ( const ExprPtr & lhs,
const ExprPtr & rhs )

在文件 expr_facade.cpp 第 193 行定义.

193 {
194 return relation(lhs, rhs, RelationOp::NEQ);
195}

引用了 ne(), NEQ, relation() , 以及 rhs.

被这些函数引用 ne().

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

◆ neg() [1/2]

ExprResult LMCAS::neg ( const ExprPtr & expression)

在文件 expr_arithmetic.cpp 第 57 行定义.

57 {
59 return neg(expression, context);
60}
ExprResult neg(const ExprPtr &expression, ComputationContext &context)

引用了 context , 以及 neg().

函数调用图:

◆ neg() [2/2]

ExprResult LMCAS::neg ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_arithmetic.cpp 第 51 行定义.

51 {
52 auto minus_one = integer(-1);
53 if (!minus_one) { return ExprResult::failure(minus_one.error()); }
54 return mul(minus_one.value(), expression, context);
55}

引用了 context, LMCAS::Result< ExprPtr >::failure(), integer, mul() , 以及 neg().

被这些函数引用 neg(), neg(), LMCAS::expr_detail::ExprParser::parse_unary() , 以及 LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_rational_power().

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

◆ newton_raphson_checked() [1/4]

NumericRootResult LMCAS::newton_raphson_checked ( const std::shared_ptr< SymbolicExpr > & function,
const std::shared_ptr< SymbolicExpr > & derivative,
const std::string & variable,
lmmc_real_t initial,
ComputationContext & context,
const SolveOptions & options )

在文件 newton_raphson.cpp 第 414 行定义.

420 {
421 auto valid = invalid_root_options(options, kNewtonOperation);
422 if (!valid) {
423 return valid;
424 }
425 if (!function || !derivative || variable.empty() ||
426 !std::isfinite(initial)) {
429 "Newton function, derivative, variable, and finite initial value are required",
430 kNewtonOperation);
431 }
432 return run_newton_backend(
433 function, derivative, variable, initial, context, options, false, 0.0,
434 0.0);
435}
NumericRootResult run_newton_backend(const std::shared_ptr< SymbolicExpr > &function, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &variable, double initial, ComputationContext &context, const SolveOptions &options, bool enforce_bracket, double bracket_lower, double bracket_upper)

引用了 context, LMCAS::Result< std::optional< NumericRoot > >::failure(), function(), InvalidArgument, newton_raphson_checked(), options , 以及 variable.

函数调用图:

◆ newton_raphson_checked() [2/4]

NumericRootResult LMCAS::newton_raphson_checked ( const std::shared_ptr< SymbolicExpr > & function,
const std::shared_ptr< SymbolicExpr > & derivative,
const std::string & variable,
lmmc_real_t initial,
const SolveOptions & options )

在文件 newton_raphson.cpp 第 437 行定义.

442 {
445 function, derivative, variable, initial, context, options);
446}
NumericRootResult newton_raphson_checked(const std::shared_ptr< SymbolicExpr > &function, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &variable, lmmc_real_t initial, lmmc_real_t bracket_lower, lmmc_real_t bracket_upper, ComputationContext &context, const SolveOptions &options)

引用了 context, function(), newton_raphson_checked(), options , 以及 variable.

函数调用图:

◆ newton_raphson_checked() [3/4]

NumericRootResult LMCAS::newton_raphson_checked ( const std::shared_ptr< SymbolicExpr > & function,
const std::shared_ptr< SymbolicExpr > & derivative,
const std::string & variable,
lmmc_real_t initial,
lmmc_real_t bracket_lower,
lmmc_real_t bracket_upper,
ComputationContext & context,
const SolveOptions & options )

在文件 newton_raphson.cpp 第 369 行定义.

377 {
378 auto valid = invalid_root_options(options, kNewtonOperation);
379 if (!valid) {
380 return valid;
381 }
382 if (!function || !derivative || variable.empty() ||
383 !valid_newton_bracket(initial, bracket_lower, bracket_upper)) {
386 "Newton function, derivative, variable, bracket, and initial value are invalid",
387 kNewtonOperation);
388 }
389 auto newton = run_newton_backend(
390 function, derivative, variable, initial, context, options, true,
391 bracket_lower, bracket_upper);
392 if (!newton || newton.value()) {
393 return newton;
394 }
396 function, variable, bracket_lower, bracket_upper, context, options,
397 kBisectionOperation);
398}
static bool valid_newton_bracket(lmmc_real_t initial, lmmc_real_t lower, lmmc_real_t upper)

引用了 context, LMCAS::Result< std::optional< NumericRoot > >::failure(), function(), InvalidArgument, newton_raphson_checked(), options, valid_newton_bracket() , 以及 variable.

被这些函数引用 newton_raphson_checked(), newton_raphson_checked(), newton_raphson_checked(), newton_raphson_checked(), LMCAS::anonymous_namespace{newton_raphson.cpp}::solve_initial_guess() , 以及 LMCAS::anonymous_namespace{newton_raphson.cpp}::solve_isolated_polynomial().

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

◆ newton_raphson_checked() [4/4]

NumericRootResult LMCAS::newton_raphson_checked ( const std::shared_ptr< SymbolicExpr > & function,
const std::shared_ptr< SymbolicExpr > & derivative,
const std::string & variable,
lmmc_real_t initial,
lmmc_real_t bracket_lower,
lmmc_real_t bracket_upper,
const SolveOptions & options )

在文件 newton_raphson.cpp 第 400 行定义.

407 {
410 function, derivative, variable, initial, bracket_lower, bracket_upper,
412}

引用了 context, function(), newton_raphson_checked(), options , 以及 variable.

函数调用图:

◆ norm_subst_index()

std::shared_ptr< const SymbolicNode > LMCAS::norm_subst_index ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & index_var,
const std::shared_ptr< const SymbolicNode > & value,
detail::RewriteBudget * budget = nullptr )

在文件 normalization_utils.cpp 第 101 行定义.

104 {
105 normalization_check_children(budget, 0, node);
106 return LMCAS::substitute_free(node, index_var, value, budget);
107}
void normalization_check_children(detail::RewriteBudget *budget, std::size_t roots, const std::shared_ptr< const Nodes > &... children)
detail::SymbolicNodePtr substitute_free(const detail::SymbolicNodePtr &expression, const std::string &variable, const detail::SymbolicNodePtr &replacement, detail::RewriteBudget *budget)

引用了 norm_subst_index(), normalization_check_children(), substitute_free() , 以及 value.

被这些函数引用 norm_subst_index(), LMCAS::NormalizationVisitor::visit() , 以及 LMCAS::NormalizationVisitor::visit().

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

◆ normal_form()

FGLMPoly LMCAS::normal_form ( const FGLMPoly & f,
const std::vector< FGLMPoly > & basis,
const MonomialOrder & order )

在文件 fglm_polynomial.cpp 第 127 行定义.

129 {
130 return f.reduce(basis, order);
131}

引用了 basis, normal_form() , 以及 order.

被这些函数引用 fglm_convert() , 以及 normal_form().

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

◆ normalization_append()

void LMCAS::normalization_append ( detail::RewriteBudget * budget,
std::size_t & nodes,
std::vector< std::shared_ptr< const SymbolicNode > > & children,
std::shared_ptr< const SymbolicNode > child )

在文件 normalization_utils.cpp 第 7 行定义.

9 {
10 if (budget) {
11 nodes = budget->append_size(nodes, budget->measure(child));
12 }
13 children.push_back(std::move(child));
14}

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::detail::RewriteBudget::measure() , 以及 normalization_append().

被这些函数引用 LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::add_base(), check_negative_arg(), LMCAS::NormalizationVisitor::collect_sum(), LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::collect_variables(), LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_multiply(), LMCAS::NormalizationVisitor::distribute_power(), LMCAS::NormalizationVisitor::distribute_product(), LMCAS::NormalizationVisitor::extract_term_coefficient(), LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::finish(), LMCAS::NormalizationVisitor::fuse_matrix_product(), LMCAS::NormalizationVisitor::matrix_product_element(), LMCAS::NormalizationVisitor::merge_complex_terms(), normalization_append(), LMCAS::NormalizationVisitor::normalize_matrix_product(), LMCAS::NormalizationVisitor::normalize_matrix_sum(), LMCAS::anonymous_namespace{normalization_norms.cpp}::normalized_norm_argument(), LMCAS::NormalizationVisitor::scale_matrix(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit() , 以及 LMCAS::anonymous_namespace{normalization_arithmetic.cpp}::weighted_term().

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

◆ normalization_can_discard()

bool LMCAS::normalization_can_discard ( const std::shared_ptr< const SymbolicNode > & node,
const FactsQuery & facts,
Domain domain,
ComputationContext & context )
inline

◆ normalization_check_arithmetic() [1/2]

template<class Parent>
std::size_t LMCAS::normalization_check_arithmetic ( detail::RewriteBudget * budget,
const std::vector< std::shared_ptr< const SymbolicNode > > & children,
std::size_t nodes,
bool wrapped = true )

在文件 normalization_utils.hpp 第 65 行定义.

67 {
68 if (!budget) {
69 return 0;
70 }
71 budget->require_nodes(nodes);
72 if (!wrapped) {
73 return nodes;
74 }
75 for (const auto& child : children) {
76 if (dynamic_cast<const Parent*>(child.get())) {
77 --nodes;
78 }
79 }
80 return budget->append_size(1, nodes);
81}

引用了 LMCAS::detail::RewriteBudget::append_size(), normalization_check_arithmetic() , 以及 LMCAS::detail::RewriteBudget::require_nodes().

函数调用图:

◆ normalization_check_arithmetic() [2/2]

template<class Parent, class... Nodes>
std::size_t LMCAS::normalization_check_arithmetic ( detail::RewriteBudget * budget,
std::size_t extra_nodes,
const std::shared_ptr< const Nodes > &... children )

在文件 normalization_utils.hpp 第 48 行定义.

49 {
50 if (!budget) {
51 return 0;
52 }
53 std::size_t nodes = extra_nodes, flattened = 0;
54 const auto append = [&](const auto& child) {
55 nodes = budget->append_size(nodes, budget->measure(child));
56 if (dynamic_cast<const Parent*>(child.get())) {
57 ++flattened;
58 }
59 };
60 (append(children), ...);
61 return budget->append_size(1, nodes - flattened);
62}

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::detail::RewriteBudget::measure() , 以及 normalization_check_arithmetic().

被这些函数引用 LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::ComplexProduct::accumulate(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::canonicalize_power(), LMCAS::anonymous_namespace{poly_utils.cpp}::coefficient_arithmetic(), LMCAS::NormalizationVisitor::collect_sum(), LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_multiply(), LMCAS::NormalizationVisitor::distribute_product(), make_normalized_multiply_node(), matrix_multiply_checked(), LMCAS::NormalizationVisitor::matrix_product_element(), normalization_check_arithmetic(), normalization_check_arithmetic(), LMCAS::NormalizationVisitor::normalize_matrix_sum(), LMCAS::anonymous_namespace{normalization_norms.cpp}::normalized_norm_argument(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prepare_operands(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_operands(), LMCAS::NormalizationVisitor::scale_matrix(), LMCAS::ExpandVisitor::visit() , 以及 LMCAS::NormalizationVisitor::visit().

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

◆ normalization_check_children() [1/2]

template<class... Nodes>
void LMCAS::normalization_check_children ( detail::RewriteBudget * budget,
std::size_t roots,
const std::shared_ptr< const Nodes > &... children )

在文件 normalization_utils.hpp 第 27 行定义.

28 {
29 if (!budget) {
30 return;
31 }
32 budget->require_nodes(roots);
33 ((roots = budget->append_size(roots, budget->measure(children))), ...);
34}

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::detail::RewriteBudget::measure(), normalization_check_children(), LMCAS::detail::RewriteBudget::require_nodes() , 以及 roots().

被这些函数引用 LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::collect_variables(), LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_multiply(), LMCAS::NormalizationVisitor::distribute_power(), LMCAS::NormalizationVisitor::expand_complex_product(), LMCAS::NormalizationVisitor::finish_squared_norm(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::function(), LMCAS::NormalizationVisitor::merge_complex_terms(), norm_subst_index(), normalization_check_children(), normalization_check_children(), LMCAS::NormalizationVisitor::normalize_function_parity(), LMCAS::NormalizationVisitor::normalize_logarithm(), LMCAS::NormalizationVisitor::normalize_natural_logarithm(), LMCAS::NormalizationVisitor::normalize_nested_power(), LMCAS::NormalizationVisitor::normalize_power_identity(), LMCAS::anonymous_namespace{normalization_norms.cpp}::normalized_norm_argument(), LMCAS::anonymous_namespace{normalization_numeric_functions.cpp}::numeric_square_root(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::power(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::register_new_atom(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_exp_log.cpp}::rewrite_exp_log_function(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::rewrite_function(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::rewrite_radical(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_trig.cpp}::rewrite_trig_function(), LMCAS::NormalizationVisitor::simplify_assumed_square_root(), symbolic_power_to_poly(), symbolic_product_to_poly(), symbolic_to_poly_recursive(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit() , 以及 LMCAS::NormalizationVisitor::visit().

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

◆ normalization_check_children() [2/2]

void LMCAS::normalization_check_children ( detail::RewriteBudget * budget,
std::size_t roots,
const std::vector< std::shared_ptr< const SymbolicNode > > & children )
inline

在文件 normalization_utils.hpp 第 36 行定义.

38 {
39 if (!budget) {
40 return;
41 }
42 budget->require_nodes(roots);
43 for (const auto& child : children) {
44 roots = budget->append_size(roots, budget->measure(child));
45 }
46}

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::detail::RewriteBudget::measure(), normalization_check_children(), LMCAS::detail::RewriteBudget::require_nodes() , 以及 roots().

函数调用图:

◆ normalization_check_count()

std::size_t LMCAS::normalization_check_count ( detail::RewriteBudget * budget,
std::size_t rows,
std::size_t cols = 1,
bool wrapped = true )

在文件 normalization_utils.cpp 第 16 行定义.

17 {
18 if (budget) {
19 const auto maximum = std::numeric_limits<std::size_t>::max();
20 if (cols != 0 && rows > maximum / cols) {
21 budget->append_size(maximum, 1);
22 }
23 budget->append_size(wrapped ? 1 : 0, rows * cols);
24 }
25 return rows * cols;
26}

引用了 LMCAS::detail::RewriteBudget::append_size() , 以及 normalization_check_count().

被这些函数引用 LMCAS::NormalizationVisitor::distribute_power(), LMCAS::NormalizationVisitor::distribute_product(), LMCAS::NormalizationVisitor::extract_term_coefficient(), LMCAS::NormalizationVisitor::fuse_matrix_product(), matrix_multiply_checked(), LMCAS::NormalizationVisitor::matrix_product_element(), normalization_check_count(), LMCAS::NormalizationVisitor::normalize_matrix_sum(), LMCAS::NormalizationVisitor::scale_matrix(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit() , 以及 LMCAS::NormalizationVisitor::visit().

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

◆ normalization_exact_square_root()

std::shared_ptr< const NumberNode > LMCAS::normalization_exact_square_root ( const NumberNode & number)

在文件 normalization_numeric_powers.cpp 第 103 行定义.

103 {
104 if (const auto* integer = std::get_if<BigInt>(&number.value())) {
105 if (*integer < BigInt(0)) {
106 return nullptr;
107 }
108 const BigInt root = integer->sqrt();
109 if (root * root == *integer) {
111 }
112 return nullptr;
113 }
114 const auto* rational = std::get_if<Rational>(&number.value());
115 if (!rational || *rational < Rational(0)) {
116 return nullptr;
117 }
118 const BigInt numerator = rational->get_numerator().sqrt();
119 const BigInt denominator = rational->get_denominator().sqrt();
120 if (numerator * numerator != rational->get_numerator()) {
121 return nullptr;
122 }
123 if (denominator * denominator != rational->get_denominator()) {
124 return nullptr;
125 }
127}

引用了 denominator, integer, LMCAS::detail::make_node(), normalization_exact_square_root(), rational() , 以及 LMCAS::NumberNode::value().

被这些函数引用 exact_radical_domain_excludes(), LMCAS::anonymous_namespace{normalization_numeric_powers.cpp}::half_numeric_power(), normalization_exact_square_root(), LMCAS::anonymous_namespace{normalization_numeric_functions.cpp}::numeric_square_root() , 以及 LMCAS::NormalizationVisitor::try_normalize_squared_norm().

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

◆ normalization_factor_less()

bool LMCAS::normalization_factor_less ( const std::shared_ptr< const SymbolicNode > & left,
const std::shared_ptr< const SymbolicNode > & right )

在文件 normalization_utils.cpp 第 29 行定义.

30 {
31 const BigInt a = get_node_degree_helper(left);
32 const BigInt b = get_node_degree_helper(right);
33 if (a != b) {
34 return a > b;
35 }
36 return left->compare(*right) < 0;
37}

引用了 a, b, get_node_degree_helper(), normalization_factor_less() , 以及 right.

被这些函数引用 LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::finish() , 以及 normalization_factor_less().

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

◆ normalization_imaginary_power()

std::shared_ptr< const SymbolicNode > LMCAS::normalization_imaginary_power ( const BigInt & exponent,
detail::RewriteBudget * budget = nullptr )

在文件 normalization_numeric_powers.cpp 第 129 行定义.

130 {
131 BigInt remainder = exponent % BigInt(4);
132 if (remainder.is_negative()) remainder += BigInt(4);
133 if (budget) { budget->require_nodes(3); }
134 if (remainder.is_zero()) {
135 return detail::make_node<NumberNode>(BigInt(1));
136 }
137 if (remainder == BigInt(2)) {
138 return detail::make_node<NumberNode>(BigInt(-1));
139 }
140 auto imaginary = detail::make_node<PowerNode>(
143 if (remainder == BigInt(1)) {
144 return imaginary;
145 }
147 {detail::make_node<NumberNode>(BigInt(-1)), imaginary}, budget);
148}

引用了 exponent, LMCAS::detail::make_node(), make_normalized_multiply_node(), normalization_imaginary_power() , 以及 LMCAS::detail::RewriteBudget::require_nodes().

被这些函数引用 normalization_imaginary_power(), normalization_numeric_power() , 以及 LMCAS::NormalizationVisitor::normalize_nested_imaginary_power().

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

◆ normalization_numeric_function()

std::shared_ptr< const SymbolicNode > LMCAS::normalization_numeric_function ( FunctionNode::FuncType type,
const std::shared_ptr< const NumberNode > & number,
detail::RewriteBudget * budget = nullptr )

在文件 normalization_numeric_functions.cpp 第 55 行定义.

57 {
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) {
70 case FunctionNode::FuncType::Sqrt: return numeric_square_root(number, budget);
72 default: return nullptr;
73 }
74}
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)

引用了 LMCAS::FunctionNode::Abs, LMCAS::FunctionNode::LambertW, LMCAS::FunctionNode::Ln, LMCAS::detail::make_node(), normalization_numeric_function(), LMCAS::detail::RewriteBudget::require_nodes(), LMCAS::FunctionNode::Sqrt , 以及 value.

被这些函数引用 normalization_numeric_function() , 以及 LMCAS::NormalizationVisitor::visit().

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

◆ normalization_numeric_power()

std::shared_ptr< const SymbolicNode > LMCAS::normalization_numeric_power ( const std::shared_ptr< const NumberNode > & base,
const std::shared_ptr< const NumberNode > & exponent,
detail::RewriteBudget * budget = nullptr )

在文件 normalization_numeric_powers.cpp 第 150 行定义.

152 {
153 if (budget) { budget->require_nodes(1); }
154 BigInt integer;
156 if (auto value = integer_numeric_power(base, integer)) {
157 return value;
158 }
159 } else if (is_half_exponent(*exponent)) {
160 if (auto value = half_numeric_power(*base, budget)) {
161 return value;
162 }
163 }
164 const auto* rational = std::get_if<Rational>(&exponent->value());
165 if (!rational || !base->is_negative_one()) {
166 return nullptr;
167 }
168 if (rational->get_denominator() != BigInt(2)) {
169 return nullptr;
170 }
171 return normalization_imaginary_power(rational->get_numerator(), budget);
172}
std::shared_ptr< const SymbolicNode > half_numeric_power(const NumberNode &base, detail::RewriteBudget *budget)
std::shared_ptr< const SymbolicNode > normalization_imaginary_power(const BigInt &exponent, detail::RewriteBudget *budget=nullptr)

引用了 exponent, integer, normalization_imaginary_power(), normalization_numeric_power(), rational(), LMCAS::detail::RewriteBudget::require_nodes(), try_get_integer_value() , 以及 value.

被这些函数引用 normalization_numeric_power() , 以及 LMCAS::NormalizationVisitor::visit().

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

◆ normalization_pi_function()

std::shared_ptr< const SymbolicNode > LMCAS::normalization_pi_function ( FunctionNode::FuncType type,
const Rational & coefficient,
detail::RewriteBudget * budget = nullptr )

在文件 normalization_trigonometric.cpp 第 94 行定义.

95 {
96 if (budget) { budget->require_nodes(1); }
97 const BigInt& denominator = coefficient.get_denominator();
98 const BigInt period = denominator * BigInt(2);
99 BigInt numerator = coefficient.get_numerator() % period;
100 if (numerator.is_negative()) numerator += period;
101 if (denominator == BigInt(1)) {
102 return integer_pi(type, numerator);
103 }
104 if (denominator == BigInt(2)) {
105 return halves_pi(type, numerator);
106 }
107 if (denominator == BigInt(3)) {
108 return thirds_pi(type, numerator, budget);
109 }
110 if (denominator == BigInt(4)) {
111 return quarters_pi(type, numerator, budget);
112 }
113 if (denominator == BigInt(6)) {
114 return sixths_pi(type, numerator, budget);
115 }
116 return nullptr;
117}
std::shared_ptr< const SymbolicNode > thirds_pi(FunctionNode::FuncType type, const BigInt &numerator, detail::RewriteBudget *budget)
std::shared_ptr< const SymbolicNode > halves_pi(FunctionNode::FuncType type, const BigInt &numerator)
std::shared_ptr< const SymbolicNode > sixths_pi(FunctionNode::FuncType type, const BigInt &numerator, detail::RewriteBudget *budget)
std::shared_ptr< const SymbolicNode > quarters_pi(FunctionNode::FuncType type, const BigInt &numerator, detail::RewriteBudget *budget)

引用了 denominator, normalization_pi_function() , 以及 LMCAS::detail::RewriteBudget::require_nodes().

被这些函数引用 normalization_pi_function() , 以及 LMCAS::NormalizationVisitor::normalize_unary_function().

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

◆ normalization_proved()

bool LMCAS::normalization_proved ( const Result< Tribool > & result)
inline

◆ normalize_gcd_candidate()

MultiPoly LMCAS::normalize_gcd_candidate ( MultiPoly candidate,
const Rational & content )
static

在文件 multivariate_factor.cpp 第 301 行定义.

302 {
303 if (content != Rational(1)) { candidate = candidate * content; }
304 if (!candidate.terms().empty() && candidate.terms()[0].second < Rational(0)) {
305 candidate = candidate * Rational(-1);
306 }
307 return candidate;
308}

引用了 normalize_gcd_candidate().

被这些函数引用 extended_gcd_interpolation(), normalize_gcd_candidate() , 以及 recursive_multivariate_gcd().

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

◆ normalize_intervals_checked() [1/2]

Result< std::vector< Interval > > LMCAS::normalize_intervals_checked ( std::vector< Interval > intervals)

在文件 interval_normalization.cpp 第 119 行定义.

120 {
122 return normalize_intervals_checked(std::move(intervals), context);
123}
Result< std::vector< Interval > > normalize_intervals_checked(std::vector< Interval > intervals, ComputationContext &context)

引用了 context , 以及 normalize_intervals_checked().

函数调用图:

◆ normalize_intervals_checked() [2/2]

Result< std::vector< Interval > > LMCAS::normalize_intervals_checked ( std::vector< Interval > intervals,
ComputationContext & context )

在文件 interval_normalization.cpp 第 109 行定义.

111 {
112 auto checked = collect_nonempty_intervals(std::move(intervals), context);
113 if (!checked) return Result<std::vector<Interval>>::failure(checked.error());
114 auto sorted = sort_checked_intervals(checked.value(), context);
115 if (!sorted) return Result<std::vector<Interval>>::failure(sorted.error());
116 return merge_checked_intervals(std::move(checked.value()), context);
117}

引用了 context , 以及 normalize_intervals_checked().

被这些函数引用 LMCAS::anonymous_namespace{interval_set_operations.cpp}::checked_interval_views(), normalize_intervals_checked(), normalize_intervals_checked() , 以及 validate_property_interval().

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

◆ numeric_domain_excludes()

bool LMCAS::numeric_domain_excludes ( double value,
Domain domain )
static

在文件 solver_assumptions.cpp 第 59 行定义.

59 {
61 if (!is_integer_value(value)) {
62 return true;
63 }
64 }
66 if (value < 0.0) {
67 return true;
68 }
69 }
71 int equal;
72 lmmc_double_nearly_equal(value, 0.0, &equal);
73 if (equal || value <= 0.0) {
74 return true;
75 }
76 }
77 return false;
78}

引用了 domain, Integer, Natural, numeric_domain_excludes(), PositiveInt , 以及 value.

被这些函数引用 numeric_domain_excludes() , 以及 solution_is_excluded().

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

◆ numeric_sign_excludes()

bool LMCAS::numeric_sign_excludes ( double value,
const AssumptionContext & ctx,
const std::string & variable )
static

在文件 solver_assumptions.cpp 第 80 行定义.

81 {
82 bool exclude = false;
83 if (ctx.has_sign(variable, Sign::NonNegative) && value < 0.0) {
84 exclude = true;
85 }
86 if (ctx.has_sign(variable, Sign::Positive)) {
87 int equal;
88 lmmc_double_nearly_equal(value, 0.0, &equal);
89 if (equal || value <= 0.0) {
90 exclude = true;
91 }
92 }
93 if (ctx.has_sign(variable, Sign::Negative) && value >= 0.0) {
94 exclude = true;
95 }
96 if (ctx.has_sign(variable, Sign::NonPositive) && value > 0.0) {
97 exclude = true;
98 }
99 return exclude;
100}

引用了 Negative, NonNegative, NonPositive, numeric_sign_excludes(), Positive, value , 以及 variable.

被这些函数引用 numeric_sign_excludes() , 以及 solution_is_excluded().

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

◆ numeric_token_value()

std::shared_ptr< SymbolicExpr > LMCAS::numeric_token_value ( const std::string & str,
size_t start,
size_t & pos,
bool decimal )
static

在文件 interval_serialization.cpp 第 106 行定义.

107 {
108 const std::string token = str.substr(start, pos - start);
109 if (!decimal) {
110 return SymbolicExpr::number(BigInt(token));
111 }
112 return SymbolicExpr::number(Rational(token));
113}

引用了 numeric_token_value().

被这些函数引用 numeric_token_value() , 以及 parse_numeric_value().

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

◆ operator<<() [1/2]

std::ostream & LMCAS::operator<< ( std::ostream & os,
const Irrational & value )

在文件 irrational_representation.cpp 第 82 行定义.

82 {
83 return os << value.to_string();
84}

引用了 operator<<() , 以及 value.

函数调用图:

◆ operator<<() [2/2]

template<typename T>
std::ostream & LMCAS::operator<< ( std::ostream & os,
const Polynomial< T > & p )

多项式流输出运算符

模板参数
T系数类型
参数
os输出流
p多项式
返回
输出流引用

在文件 polynomial.hpp 第 428 行定义.

428 {
429 if (p.is_zero()) {
430 return os << "0";
431 }
432 for (int i = p.degree(); i >= 0; --i) {
433 T c = p.coeffs[i];
434 if (c == T(0)) {
435 continue;
436 }
437
438 if (i < p.degree()) {
439 if (c > T(0)) {
440 os << " + ";
441 } else {
442 os << " - ";
443 }
444 } else if (c < T(0)) {
445 os << "-";
446 }
447
448 T abs_c = (c < T(0)) ? (c * T(-1)) : c;
449 if (abs_c != T(1) || i == 0) {
450 os << abs_c;
451 }
452
453 if (i > 0) {
454 os << p.variable_name;
455 }
456 if (i > 1) {
457 os << "^" << i;
458 }
459 }
460 return os;
461}

引用了 c, LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Polynomial< CoeffType >::is_zero(), operator<<() , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 operator<<() , 以及 operator<<().

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

◆ ordinary_frobenius_solution()

FrobeniusSolutionResult LMCAS::ordinary_frobenius_solution ( const std::shared_ptr< SymbolicExpr > & p,
const std::shared_ptr< SymbolicExpr > & q,
const std::shared_ptr< SymbolicExpr > & x0,
const std::string & x,
const std::shared_ptr< SymbolicExpr > & x_minus_x0,
FrobeniusSolution result,
ComputationContext & context )
static

在文件 ode_frobenius.cpp 第 293 行定义.

298 {
299
300 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
301 (context).limits().max_ast_nodes, "transform");
302 auto coefficients = ordinary_taylor_coefficients(p, q, x0, x, result.truncation_order, context);
303 if (!coefficients) {
304 return FrobeniusSolutionResult::failure(coefficients.error());
305 }
306 auto recurrence = ordinary_series_recurrence(coefficients.value(), result.truncation_order);
307 if (!recurrence) {
308 return FrobeniusSolutionResult::failure(recurrence.error());
309 }
311 recurrence.value(), x_minus_x0)), transform_budget));
312 result.indicial_roots = {0.0};
313 return result;
314} catch (const CasError& error) {
316} catch (const std::bad_alloc&) {
317 return FrobeniusSolutionResult::failure(CasErrc::ResourceLimit, "allocation failed", "ordinary_frobenius_solution");
318} catch (const std::length_error& error) {
319 return FrobeniusSolutionResult::failure(CasErrc::ResourceLimit, error.what(), "ordinary_frobenius_solution");
320} catch (const std::exception& error) {
321 return FrobeniusSolutionResult::failure(CasErrc::InternalInvariant, error.what(), "ordinary_frobenius_solution");
322}
static std::shared_ptr< SymbolicExpr > assemble_frobenius_polynomial(const std::vector< double > &a, const std::shared_ptr< SymbolicExpr > &x_minus_x0)
static Result< OdeTaylorCoefficients > ordinary_taylor_coefficients(const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, int order, ComputationContext &context)
std::vector< double > indicial_roots
指标方程的根(正则奇点时)
std::shared_ptr< SymbolicExpr > series_solution
截断级数解
static Result< std::vector< double > > ordinary_series_recurrence(const OdeTaylorCoefficients &coefficients, int order)

引用了 assemble_frobenius_polynomial(), context, LMCAS::Result< FrobeniusSolution >::failure(), LMCAS::FrobeniusSolution::indicial_roots, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), ordinary_frobenius_solution(), ordinary_series_recurrence(), ordinary_taylor_coefficients(), LMCAS::FrobeniusSolution::series_solution , 以及 LMCAS::FrobeniusSolution::truncation_order.

被这些函数引用 ordinary_frobenius_solution() , 以及 solve_frobenius_impl().

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

◆ ordinary_series_recurrence()

Result< std::vector< double > > LMCAS::ordinary_series_recurrence ( const OdeTaylorCoefficients & coefficients,
int order )
static

在文件 ode_frobenius.cpp 第 96 行定义.

97 {
98 const auto& p_coeffs = coefficients.p;
99 const auto& q_coeffs = coefficients.q;
100 std::vector<double> a(order + 1, 0.0);
101 a[0] = 1.0;
102 for (int n_idx = 0; n_idx + 2 <= order; ++n_idx) {
103 double sum = 0.0;
104 for (int k = 0; k <= n_idx; ++k) {
105 sum += (k + 1) * a[k + 1] * p_coeffs[n_idx - k];
106 sum += a[k] * q_coeffs[n_idx - k];
107 }
108 double denom = static_cast<double>((n_idx + 2) * (n_idx + 1));
109 a[n_idx + 2] = -sum / denom;
110 if (!std::isfinite(a[n_idx + 2])) {
111 return Result<std::vector<double>>::failure(frobenius_arithmetic_failure());
112 }
113 }
114
115 return a;
116}

引用了 a, frobenius_arithmetic_failure(), order, ordinary_series_recurrence(), LMCAS::OdeTaylorCoefficients::p , 以及 LMCAS::OdeTaylorCoefficients::q.

被这些函数引用 ordinary_frobenius_solution() , 以及 ordinary_series_recurrence().

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

◆ ordinary_taylor_coefficients()

Result< OdeTaylorCoefficients > LMCAS::ordinary_taylor_coefficients ( const std::shared_ptr< SymbolicExpr > & p,
const std::shared_ptr< SymbolicExpr > & q,
const std::shared_ptr< SymbolicExpr > & x0,
const std::string & x,
int order,
ComputationContext & context )
static

在文件 ode_frobenius.cpp 第 48 行定义.

52 {
53
54 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
55 (context).limits().max_ast_nodes, "transform");
56 std::vector<double> p_coeffs(order + 2, 0.0);
57 std::vector<double> q_coeffs(order + 2, 0.0);
58
59 auto p_current = p;
60 auto q_current = q;
61 double factorial = 1.0;
62 for (int k = 0; k <= order + 1; ++k) {
63 if (k > 0) {
64 factorial *= k;
65 }
66 auto p_val_expr = detail::make_expression_ptr(detail::substitute_node(detail::node(p_current), x, detail::node(x0), transform_budget));
67 auto q_val_expr = detail::make_expression_ptr(detail::substitute_node(detail::node(q_current), x, detail::node(x0), transform_budget));
68 double pv = try_eval_double(p_val_expr);
69 double qv = try_eval_double(q_val_expr);
70 if (!std::isfinite(pv) || !std::isfinite(qv)) {
72 }
73 p_coeffs[k] = pv / factorial;
74 q_coeffs[k] = qv / factorial;
75 p_current = detail::make_expression_ptr(detail::differentiate_node(detail::node(p_current), x, transform_budget));
76 q_current = detail::make_expression_ptr(detail::differentiate_node(detail::node(q_current), x, transform_budget));
77 if (!p_current) {
78 p_current = SymbolicExpr::number(0);
79 }
80 if (!q_current) {
81 q_current = SymbolicExpr::number(0);
82 }
83 }
84
85 return OdeTaylorCoefficients{std::move(p_coeffs), std::move(q_coeffs)};
86} catch (const CasError& error) {
88} catch (const std::bad_alloc&) {
89 return Result<OdeTaylorCoefficients>::failure(CasErrc::ResourceLimit, "allocation failed", "ordinary_taylor_coefficients");
90} catch (const std::length_error& error) {
91 return Result<OdeTaylorCoefficients>::failure(CasErrc::ResourceLimit, error.what(), "ordinary_taylor_coefficients");
92} catch (const std::exception& error) {
93 return Result<OdeTaylorCoefficients>::failure(CasErrc::InternalInvariant, error.what(), "ordinary_taylor_coefficients");
94}
static CasError frobenius_unsupported_numeric()

引用了 context, LMCAS::detail::differentiate_node(), LMCAS::Result< T >::failure(), frobenius_unsupported_numeric(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), order, ordinary_taylor_coefficients(), LMCAS::detail::substitute_node() , 以及 try_eval_double().

被这些函数引用 ordinary_frobenius_solution() , 以及 ordinary_taylor_coefficients().

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

◆ parametric_linear_solution()

std::map< std::string, std::shared_ptr< SymbolicExpr > > LMCAS::parametric_linear_solution ( const ParametricMatrix & A,
const ParametricVector & b,
const std::vector< size_t > & pivot_cols,
const std::vector< size_t > & pivot_rows,
const std::vector< std::string > & unknowns,
ComputationContext & context )
static

在文件 parametric_solver.cpp 第 144 行定义.

147 {
148 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
149 (context).limits().max_ast_nodes, "transform");
150 size_t n = unknowns.size();
151 std::map<std::string, std::shared_ptr<SymbolicExpr>> solution;
152
153 std::set<size_t> pivot_col_set(pivot_cols.begin(), pivot_cols.end());
154 for (size_t col = 0; col < n; ++col) {
155 if (pivot_col_set.find(col) == pivot_col_set.end()) {
156
157 solution[unknowns[col]] = SymbolicExpr::variable(unknowns[col]);
158 }
159 }
160
161 for (size_t k = 0; k < pivot_cols.size(); ++k) {
162 size_t col = pivot_cols[k];
163 size_t row = pivot_rows[k];
164
165 auto value = b[row];
166
167 for (size_t j = col + 1; j < n; ++j) {
168 if (pivot_col_set.find(j) != pivot_col_set.end()) {
169 continue;
170 }
171 auto coeff = detail::make_expression_ptr(detail::normalize_node(detail::node(A[row][j]), transform_budget));
172 if (!parametric_zero(coeff, context)) {
173
174 auto term = SymbolicExpr::multiply(coeff, SymbolicExpr::variable(unknowns[j]));
175 value = SymbolicExpr::add(value, SymbolicExpr::multiply(term, SymbolicExpr::number(-1)));
176 }
177 }
178
179 auto pivot_val = A[row][col];
180 value = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(value, pivot_val)), transform_budget));
181
182 solution[unknowns[col]] = value;
183 }
184 return solution;
185}

引用了 b, context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), parametric_linear_solution(), parametric_zero() , 以及 value.

被这些函数引用 parametric_linear_solution().

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

◆ parametric_nonzero_value()

Tribool LMCAS::parametric_nonzero_value ( const std::shared_ptr< SymbolicExpr > & expression,
ComputationContext & context )
static

在文件 parametric_solver.cpp 第 81 行定义.

82 {
83 std::optional<detail::AssumptionFacts> assumptions;
84 if (context.assumptions()) assumptions.emplace(*context.assumptions());
85 const FactsQuery& facts = assumptions ? static_cast<const FactsQuery&>(*assumptions) : detail::no_facts();
86 auto nonzero = detail::query_nonzero_value(detail::node(expression), facts, Domain::Complex, context);
87 if (!nonzero) throw nonzero.error();
88 return nonzero.value();
89}
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)

引用了 Complex, context, LMCAS::detail::no_facts(), LMCAS::detail::node(), parametric_nonzero_value() , 以及 LMCAS::detail::query_nonzero_value().

被这些函数引用 parametric_nonzero_value() , 以及 parametric_zero().

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

◆ parametric_residual_zero()

bool LMCAS::parametric_residual_zero ( const std::shared_ptr< SymbolicExpr > & expression,
ComputationContext & context )
static

在文件 parametric_solver.cpp 第 72 行定义.

73 {
74 auto residual = check_zero_residual(expression, context);
75 if (!residual) throw residual.error();
76 if (std::holds_alternative<ProvedZeroResidual>(residual.value())) return true;
78 "parameter coefficient or constraint is undecided", "solve.parametric"};
79}

引用了 check_zero_residual(), context, Inconclusive , 以及 parametric_residual_zero().

被这些函数引用 parametric_residual_zero() , 以及 parametric_zero().

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

◆ parametric_zero()

bool LMCAS::parametric_zero ( const std::shared_ptr< SymbolicExpr > & expression,
ComputationContext & context )
static

在文件 parametric_solver.cpp 第 91 行定义.

92 {
93 if (expression->is_zero()) return true;
94 const auto nonzero = parametric_nonzero_value(expression, context);
95 if (nonzero == Tribool::True) return false;
96 if (nonzero == Tribool::False) return true;
97 return parametric_residual_zero(expression, context);
98}
static Tribool parametric_nonzero_value(const std::shared_ptr< SymbolicExpr > &expression, ComputationContext &context)
static bool parametric_residual_zero(const std::shared_ptr< SymbolicExpr > &expression, ComputationContext &context)

引用了 context, False, parametric_nonzero_value(), parametric_residual_zero(), parametric_zero() , 以及 True.

被这些函数引用 find_parametric_pivot(), parametric_linear_solution() , 以及 parametric_zero().

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

◆ parse_approximate_atom()

std::shared_ptr< SymbolicExpr > LMCAS::parse_approximate_atom ( const std::string & str,
size_t & pos )
static

< 消耗原子的结束分隔符,保留区间的分隔符。

在文件 interval_serialization.cpp 第 115 行定义.

116 {
117 const size_t start = pos;
118 pos = skip_ws(str, pos + 7);
119 const auto token_start = pos;
120 while (pos < str.size() && str[pos] != ')' &&
121 !std::isspace(static_cast<unsigned char>(str[pos]))) { ++pos; }
122 const std::string_view token(str.data() + token_start, pos - token_start);
123 pos = skip_ws(str, pos);
124 if (pos == str.size() || str[pos] != ')') {
125 pos = start;
126 return nullptr;
127 }
128 ++pos; /**< 消耗原子的结束分隔符,保留区间的分隔符。 */
130 if (!value) {
131 pos = start;
132 return nullptr;
133 }
134 return SymbolicExpr::number(value.value());
135}
Result< double > parse_finite_decimal(std::string_view token)
static size_t skip_ws(const std::string &str, size_t pos)

引用了 parse_approximate_atom(), LMCAS::detail::parse_finite_decimal(), skip_ws() , 以及 value.

被这些函数引用 parse_approximate_atom() , 以及 parse_numeric_value().

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

◆ parse_endpoint_value()

bool LMCAS::parse_endpoint_value ( const std::string & str,
size_t & pos,
Endpoint & ep )
static

在文件 interval_serialization.cpp 第 170 行定义.

170 {
171 pos = skip_ws(str, pos);
172
173 if (starts_with_at(str, pos, "-\xe2\x88\x9e")) {
174 ep.is_neg_infinity = true;
175 ep.is_pos_infinity = false;
176 ep.is_open = true;
177 ep.value = nullptr;
178 pos += 4;
179 return true;
180 }
181
182 if (starts_with_at(str, pos, "+\xe2\x88\x9e")) {
183 ep.is_pos_infinity = true;
184 ep.is_neg_infinity = false;
185 ep.is_open = true;
186 ep.value = nullptr;
187 pos += 4;
188 return true;
189 }
190
191 auto val = parse_numeric_value(str, pos);
192 if (!val) {
193 return false;
194 }
195
196 ep.value = val;
197 ep.is_neg_infinity = false;
198 ep.is_pos_infinity = false;
199
200 return true;
201}
static std::shared_ptr< SymbolicExpr > parse_numeric_value(const std::string &str, size_t &pos)
static bool starts_with_at(const std::string &str, size_t pos, const std::string &prefix)

引用了 parse_endpoint_value(), parse_numeric_value(), skip_ws() , 以及 starts_with_at().

被这些函数引用 parse_endpoint_value(), parse_interval_lower() , 以及 parse_interval_upper().

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

◆ parse_expr() [1/2]

ExprResult LMCAS::parse_expr ( const std::string & source)

在文件 expr_parsing.cpp 第 424 行定义.

424 {
426 return parse_expr(source, context);
427}
ExprResult parse_expr(const std::string &source)

引用了 context , 以及 parse_expr().

被这些函数引用 parse_expr(), parse_expr() , 以及 LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::parse_general_expression().

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

◆ parse_expr() [2/2]

ExprResult LMCAS::parse_expr ( const std::string & source,
ComputationContext & context )

在文件 expr_parsing.cpp 第 429 行定义.

430 {
431 auto input_budget =
432 context.require_input_bytes(source.size(), kParseOperation);
433 if (!input_budget) {
434 return ExprResult::failure(input_budget.error());
435 }
436 try {
437 return ExprParser(source).parse();
438 } catch (const std::bad_alloc&) {
440 "expression parse allocation failed",
442 } catch (const std::exception& error) {
445 }
446}
ExprParser(std::string source)
constexpr const char * kParseOperation

引用了 LMCAS::ExprParser::ExprParser(), context, LMCAS::expr_detail::expr_common::expression_failure(), LMCAS::Result< ExprPtr >::failure(), InternalInvariant, kParseOperation, parse_expr() , 以及 ResourceLimit.

函数调用图:

◆ parse_fraction()

std::shared_ptr< SymbolicExpr > LMCAS::parse_fraction ( const std::string & str,
size_t start,
size_t & pos )
static

在文件 interval_serialization.cpp 第 89 行定义.

90 {
91 const size_t slash = pos++;
92 const size_t denominator_start = pos;
93 if (!consume_digits(str, pos)) {
94 pos = start;
95 return nullptr;
96 }
97 const BigInt numerator(str.substr(start, slash - start));
98 const BigInt denominator(str.substr(denominator_start, pos - denominator_start));
99 if (denominator.is_zero()) {
100 pos = start;
101 return nullptr;
102 }
103 return SymbolicExpr::number(Rational(numerator, denominator));
104}
static bool consume_digits(const std::string &str, size_t &pos)

引用了 consume_digits(), denominator , 以及 parse_fraction().

被这些函数引用 parse_fraction() , 以及 parse_numeric_value().

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

◆ parse_interval_lower()

bool LMCAS::parse_interval_lower ( const std::string & str,
size_t & pos,
Endpoint & lower )
static

在文件 interval_serialization.cpp 第 203 行定义.

204 {
205 pos = skip_ws(str, pos);
206 if (pos >= str.size()) {
207 return false;
208 }
209 const char bracket = str[pos];
210 if (bracket != '(' && bracket != '[') {
211 return false;
212 }
213 const bool open = bracket == '(';
214 ++pos;
215 if (!parse_endpoint_value(str, pos, lower)) {
216 return false;
217 }
218 if (lower.is_pos_infinity || (lower.is_neg_infinity && !open)) {
219 return false;
220 }
221 if (!lower.is_neg_infinity) lower.is_open = open;
222 return true;
223}
static bool parse_endpoint_value(const std::string &str, size_t &pos, Endpoint &ep)

引用了 lower, parse_endpoint_value(), parse_interval_lower() , 以及 skip_ws().

被这些函数引用 parse_interval_lower() , 以及 parse_single_interval().

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

◆ parse_interval_upper()

bool LMCAS::parse_interval_upper ( const std::string & str,
size_t & pos,
Endpoint & upper )
static

在文件 interval_serialization.cpp 第 225 行定义.

226 {
227 if (!parse_endpoint_value(str, pos, upper)) {
228 return false;
229 }
230 pos = skip_ws(str, pos);
231 if (pos >= str.size()) {
232 return false;
233 }
234 const char bracket = str[pos];
235 if (bracket != ')' && bracket != ']') {
236 return false;
237 }
238 const bool open = bracket == ')';
239 ++pos;
240 if (upper.is_neg_infinity || (upper.is_pos_infinity && !open)) {
241 return false;
242 }
243 if (!upper.is_pos_infinity) upper.is_open = open;
244 return true;
245}

引用了 parse_endpoint_value(), parse_interval_upper(), skip_ws() , 以及 upper.

被这些函数引用 parse_interval_upper() , 以及 parse_single_interval().

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

◆ parse_numeric_value()

std::shared_ptr< SymbolicExpr > LMCAS::parse_numeric_value ( const std::string & str,
size_t & pos )
static

在文件 interval_serialization.cpp 第 137 行定义.

138 {
139 const size_t start = pos;
140 if (starts_with_at(str, pos, "approx(")) {
141 return parse_approximate_atom(str, pos);
142 }
143 consume_sign(str, pos);
144 bool has_digit = consume_digits(str, pos);
145 if (has_digit && pos < str.size() && str[pos] == '/') {
146 return parse_fraction(str, start, pos);
147 }
148 bool decimal = false;
149 if (pos < str.size() && str[pos] == '.') {
150 decimal = true;
151 ++pos;
152 has_digit = consume_digits(str, pos) || has_digit;
153 }
154 if (!has_digit) {
155 pos = start;
156 return nullptr;
157 }
158 if (pos < str.size() && (str[pos] == 'e' || str[pos] == 'E')) {
159 decimal = true;
160 ++pos;
161 consume_sign(str, pos);
162 if (!consume_digits(str, pos)) {
163 pos = start;
164 return nullptr;
165 }
166 }
167 return numeric_token_value(str, start, pos, decimal);
168}
static std::shared_ptr< SymbolicExpr > parse_approximate_atom(const std::string &str, size_t &pos)
static std::shared_ptr< SymbolicExpr > numeric_token_value(const std::string &str, size_t start, size_t &pos, bool decimal)
static void consume_sign(const std::string &str, size_t &pos)
static std::shared_ptr< SymbolicExpr > parse_fraction(const std::string &str, size_t start, size_t &pos)

引用了 consume_digits(), consume_sign(), numeric_token_value(), parse_approximate_atom(), parse_fraction(), parse_numeric_value() , 以及 starts_with_at().

被这些函数引用 parse_endpoint_value() , 以及 parse_numeric_value().

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

◆ parse_single_interval()

bool LMCAS::parse_single_interval ( const std::string & str,
size_t & pos,
Interval & iv )
static

在文件 interval_serialization.cpp 第 247 行定义.

248 {
249 Endpoint lower;
250 if (!parse_interval_lower(str, pos, lower)) {
251 return false;
252 }
253 pos = skip_ws(str, pos);
254 if (pos >= str.size() || str[pos] != ',') {
255 return false;
256 }
257 ++pos;
258 Endpoint upper;
259 if (!parse_interval_upper(str, pos, upper)) {
260 return false;
261 }
262 iv.lower = std::move(lower);
263 iv.upper = std::move(upper);
264 return true;
265}
static bool parse_interval_lower(const std::string &str, size_t &pos, Endpoint &lower)
static bool parse_interval_upper(const std::string &str, size_t &pos, Endpoint &upper)

引用了 lower, parse_interval_lower(), parse_interval_upper(), parse_single_interval(), skip_ws() , 以及 upper.

被这些函数引用 parse_single_interval().

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

◆ phi()

ExprResult LMCAS::phi ( )

在文件 expr_values.cpp 第 116 行定义.

116 {
117 return detail::constant_expression("phi");
118}

引用了 LMCAS::detail::constant_expression() , 以及 phi().

被这些函数引用 LMCAS::expr_detail::ExprParser::parse_identifier_or_call() , 以及 phi().

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

◆ pi()

◆ plane_from_three_points_checked() [1/2]

PlaneSymbolicResult LMCAS::plane_from_three_points_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & p1,
const std::vector< std::shared_ptr< SymbolicExpr > > & p2,
const std::vector< std::shared_ptr< SymbolicExpr > > & p3 )

在文件 symbolic_geometry_plane.cpp 第 271 行定义.

274 {
277}
PlaneSymbolicResult plane_from_three_points_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &p1, const std::vector< std::shared_ptr< SymbolicExpr > > &p2, const std::vector< std::shared_ptr< SymbolicExpr > > &p3, ComputationContext &context)

引用了 context, p2 , 以及 plane_from_three_points_checked().

函数调用图:

◆ plane_from_three_points_checked() [2/2]

PlaneSymbolicResult LMCAS::plane_from_three_points_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & p1,
const std::vector< std::shared_ptr< SymbolicExpr > > & p2,
const std::vector< std::shared_ptr< SymbolicExpr > > & p3,
ComputationContext & context )

在文件 symbolic_geometry_plane.cpp 第 215 行定义.

219 {
220 const std::string operation = "plane_from_three_points";
221 try {
222 auto v12 = validate_same_dimension_vectors(p1, p2, context, operation);
223 if (!v12) {
224 return PlaneSymbolicResult::failure(v12.error());
225 }
226 auto v13 = validate_same_dimension_vectors(p1, p3, context, operation);
227 if (!v13) {
228 return PlaneSymbolicResult::failure(v13.error());
229 }
230 if (p1.size() != 3) {
233 "plane construction requires 3-dimensional points",
234 operation);
235 }
236 auto step = context.consume_steps(8, operation);
237 if (!step) {
238 return PlaneSymbolicResult::failure(step.error());
239 }
240
241 std::vector<std::shared_ptr<SymbolicExpr>> v1, v2;
242 auto edges = build_plane_edges(p1, p2, p3, v1, v2, context, operation);
243 if (!edges) {
244 return PlaneSymbolicResult::failure(edges.error());
245 }
246 auto numeric_edges = scale_plane_edges_for_cross(v1, v2, context, operation);
247 if (!numeric_edges) {
248 return PlaneSymbolicResult::failure(numeric_edges.error());
249 }
250
251 auto normal = vector_cross_checked(v1, v2, context);
252 if (!normal) {
253 return PlaneSymbolicResult::failure(normal.error());
254 }
255 auto nonzero = check_plane_normal_nonzero(
256 normal.value(), numeric_edges.value(), context, operation);
257 if (!nonzero) {
258 return PlaneSymbolicResult::failure(nonzero.error());
259 }
260 return assemble_plane(std::move(normal.value()), p1, context, operation);
261 } catch (const std::bad_alloc&) {
263 "vector geometry allocation failed",
264 operation);
265 } catch (const std::exception& e) {
267 e.what(), operation);
268 }
269}
Result< void > build_plane_edges(const std::vector< std::shared_ptr< SymbolicExpr > > &p1, const std::vector< std::shared_ptr< SymbolicExpr > > &p2, const std::vector< std::shared_ptr< SymbolicExpr > > &p3, std::vector< std::shared_ptr< SymbolicExpr > > &v1, std::vector< std::shared_ptr< SymbolicExpr > > &v2, ComputationContext &context, const std::string &operation)
Result< bool > scale_plane_edges_for_cross(std::vector< std::shared_ptr< SymbolicExpr > > &v1, std::vector< std::shared_ptr< SymbolicExpr > > &v2, ComputationContext &context, const std::string &operation)
PlaneSymbolicResult assemble_plane(std::vector< std::shared_ptr< SymbolicExpr > > &&normal, const std::vector< std::shared_ptr< SymbolicExpr > > &point, ComputationContext &context, const std::string &operation)
Result< void > check_plane_normal_nonzero(const std::vector< std::shared_ptr< SymbolicExpr > > &normal, bool numeric_edges, ComputationContext &context, const std::string &operation)
VectorExprListResult vector_cross_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, ComputationContext &context)

引用了 context, e(), LMCAS::Result< PlaneSymbolic >::failure(), InternalInvariant, InvalidArgument, p2, plane_from_three_points_checked(), ResourceLimit, LMCAS::geometry_detail::validate_same_dimension_vectors() , 以及 vector_cross_checked().

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

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

◆ plane_general()

PlaneSymbolic LMCAS::plane_general ( std::shared_ptr< SymbolicExpr > a,
std::shared_ptr< SymbolicExpr > b,
std::shared_ptr< SymbolicExpr > c,
std::shared_ptr< SymbolicExpr > d )
inline

由一般方程系数构造平面 ax + by + cz = d。

参数
ax 方向法向量分量
by 方向法向量分量
cz 方向法向量分量
d常数项
返回
构造的 PlaneSymbolic 对象

在文件 symbolic_geometry_line_plane.hpp 第 30 行定义.

35 {
36 return PlaneSymbolic{{a, b, c}, d};
37}
由法向量和常数 d 定义的符号平面 ax + by + cz = d。

引用了 a, b, c , 以及 plane_general().

被这些函数引用 plane_general().

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

◆ point_plane_distance_checked() [1/2]

ExpressionResult LMCAS::point_plane_distance_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & point,
const PlaneSymbolic & plane )

在文件 symbolic_geometry_line_plane.cpp 第 366 行定义.

369 {
372}
ExpressionResult point_plane_distance_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &point, const PlaneSymbolic &plane, ComputationContext &context)

引用了 context, plane, point , 以及 point_plane_distance_checked().

函数调用图:

◆ point_plane_distance_checked() [2/2]

ExpressionResult LMCAS::point_plane_distance_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & point,
const PlaneSymbolic & plane,
ComputationContext & context )

在文件 symbolic_geometry_line_plane.cpp 第 303 行定义.

307 {
308 const std::string operation = "point_plane_distance";
309 try {
310 auto plane_valid = validate_plane_checked(plane, context, operation);
311 if (!plane_valid) return ExpressionResult::failure(plane_valid.error());
312 if (point.size() != 3) {
315 "point-plane distance requires a 3-dimensional point",
316 operation);
317 }
318 auto point_valid = validate_symbolic_vector(point, "point", operation);
319 if (!point_valid) return ExpressionResult::failure(point_valid.error());
320 auto step = context.consume_steps(4, operation);
321 if (!step) return ExpressionResult::failure(step.error());
322
323 std::vector<double> normal_values;
324 auto normal_scale = numeric_vector_scale_checked(
325 plane.normal, context, operation, &normal_values);
326 if (!normal_scale) {
327 return ExpressionResult::failure(normal_scale.error());
328 }
329 auto point_scale = numeric_vector_scale_checked(
330 point, context, operation);
331 if (!point_scale && interrupts_optional_numeric_evaluation(point_scale.error())) {
332 return ExpressionResult::failure(point_scale.error());
333 }
334
335 const double safe_low =
336 std::sqrt(std::numeric_limits<double>::min());
337 const double safe_high =
338 std::sqrt(std::numeric_limits<double>::max() / 3.0);
339 const bool protect_point_dot =
340 point_dot_needs_protection(normal_scale.value(), point_scale);
341 const std::vector<std::shared_ptr<SymbolicExpr>>* effective_normal =
342 &plane.normal;
343 std::vector<std::shared_ptr<SymbolicExpr>> scaled_normal;
344 std::shared_ptr<SymbolicExpr> effective_d = plane.d;
345 if (normal_scale.value() < safe_low ||
346 normal_scale.value() > safe_high ||
347 protect_point_dot) {
349 normal_values, normal_scale.value(), protect_point_dot, scaled_normal);
350 effective_normal = &scaled_normal;
351 effective_d = scale_plane_offset(plane.d, normal_scale.value(), protect_point_dot);
352 }
353
355 point, *effective_normal, effective_d, context, operation);
356 } catch (const std::bad_alloc&) {
358 "vector geometry allocation failed",
359 operation);
360 } catch (const std::exception& e) {
362 e.what(), operation);
363 }
364}
ExpressionResult symbolic_point_plane_distance(const std::vector< std::shared_ptr< SymbolicExpr > > &point, const std::vector< std::shared_ptr< SymbolicExpr > > &normal, const std::shared_ptr< SymbolicExpr > &offset, ComputationContext &context, const std::string &operation)
Result< void > validate_symbolic_vector(const std::vector< std::shared_ptr< SymbolicExpr > > &vector, const std::string &name, const std::string &operation)

引用了 context, LMCAS::PlaneSymbolic::d, e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, InvalidArgument, LMCAS::PlaneSymbolic::normal, LMCAS::geometry_detail::numeric_vector_scale_checked(), plane, point, point_plane_distance_checked(), ResourceLimit, LMCAS::geometry_detail::validate_plane_checked() , 以及 LMCAS::geometry_detail::validate_symbolic_vector().

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

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

◆ polynomial_logic()

ExprPtr LMCAS::polynomial_logic ( const ExprPtr & left,
const ExprPtr & right,
LogicalNode::Op op )
static

在文件 solve_visitor.cpp 第 67 行定义.

引用了 LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), op, polynomial_logic() , 以及 right.

被这些函数引用 conditional_linear_polynomial() , 以及 polynomial_logic().

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

◆ polynomial_product_fits()

template<typename T>
bool LMCAS::polynomial_product_fits ( const Polynomial< T > & left,
const Polynomial< T > & right )

在文件 poly_utils.cpp 第 116 行定义.

116 {
117 if (left.is_zero() || right.is_zero()) return true;
118 const auto max_terms = static_cast<std::size_t>(std::numeric_limits<int>::max());
119 return left.coeffs.size() <= max_terms &&
120 right.coeffs.size() - 1 <= max_terms - left.coeffs.size();
121}

引用了 LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::Polynomial< CoeffType >::is_zero(), polynomial_product_fits() , 以及 right.

被这些函数引用 polynomial_product_fits(), symbolic_power_to_poly() , 以及 symbolic_product_to_poly().

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

◆ polynomial_relation()

ExprPtr LMCAS::polynomial_relation ( const ExprPtr & left,
const ExprPtr & right,
RelationOp op )
static

在文件 solve_visitor.cpp 第 60 行定义.

引用了 LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), op, polynomial_relation() , 以及 right.

被这些函数引用 conditional_linear_polynomial(), polynomial_relation() , 以及 solve_symbolic_quadratic().

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

◆ positive_divisors()

std::vector< BigInt > LMCAS::positive_divisors ( const BigInt & n)
static

在文件 rational_polynomial.cpp 第 7 行定义.

7 {
8 std::vector<BigInt> divs;
9 if (n.is_zero()) {
10
11 return divs;
12 }
13 BigInt abs_n = n.abs();
14
15 BigInt i(1);
16
17 while (i * i <= abs_n) {
18 BigInt rem = abs_n % i;
19 if (rem.is_zero()) {
20 divs.push_back(i);
21 BigInt counterpart = abs_n / i;
22 if (counterpart != i) {
23 divs.push_back(counterpart);
24 }
25 }
26 i = i + BigInt(1);
27 }
28
29 std::sort(divs.begin(), divs.end());
30 return divs;
31}

引用了 positive_divisors().

被这些函数引用 positive_divisors() , 以及 rational_root_candidate().

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

◆ pow() [1/2]

ExprResult LMCAS::pow ( const ExprPtr & base,
const ExprPtr & exponent )

在文件 expr_elementary.cpp 第 33 行定义.

33 {
35 return pow(base, exponent, context);
36}
ExprResult pow(const ExprPtr &base, const ExprPtr &exponent, ComputationContext &context)

引用了 context, exponent , 以及 pow().

函数调用图:

◆ pow() [2/2]

ExprResult LMCAS::pow ( const ExprPtr & base,
const ExprPtr & exponent,
ComputationContext & context )

在文件 expr_elementary.cpp 第 27 行定义.

29 {
30 return quantity_power(base, exponent, context);
31}
QuantityResult quantity_power(const std::shared_ptr< SymbolicExpr > &base, const std::shared_ptr< SymbolicExpr > &exponent, ComputationContext &context)

引用了 context, exponent, pow() , 以及 quantity_power().

被这些函数引用 LMCAS::solver_detail::collect_denominator_factors(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::collect_transcendental_subexprs(), LMCAS::InferenceEngine::Impl::composite_integer(), LMCAS::InferenceEngine::Impl::composite_negative(), LMCAS::InferenceEngine::Impl::composite_nonnegative(), LMCAS::InferenceEngine::Impl::composite_nonpositive(), LMCAS::InferenceEngine::Impl::composite_nonzero(), LMCAS::InferenceEngine::Impl::composite_positive(), LMCAS::InferenceEngine::Impl::composite_real(), LMCAS::anonymous_namespace{mixed_transcendental_classification.cpp}::degree_in_var(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::has_exp_k_var_terms(), LMCAS::anonymous_namespace{symbolic_factor.cpp}::is_poly_expr_node(), LMCAS::solver_detail::is_polynomial_node(), LMCAS::solver_detail::multiply_no_expand(), LMCAS::expr_detail::ExprParser::parse_power(), pow(), pow(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::SubstNodeVisitor::replace(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::rewrite_exp_as_u_power(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::structural(), symbolic_node_to_multipoly(), tf_collect_transcendental(), tf_contains_transcendental(), tf_is_trig_squared(), tf_simplify_pythagorean_node() , 以及 tf_substitute_expr().

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

◆ power_series_add()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::power_series_add ( const std::vector< std::shared_ptr< SymbolicExpr > > & a,
const std::vector< std::shared_ptr< SymbolicExpr > > & b )

在文件 series_engine.cpp 第 164 行定义.

166 {
168 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
169 (context).limits().max_ast_nodes, "transform");
170 size_t len = std::max(a.size(), b.size());
171 std::vector<std::shared_ptr<SymbolicExpr>> result(len);
172 for (size_t i = 0; i < len; ++i) {
173 auto ai = (i < a.size() && a[i]) ? a[i] : SymbolicExpr::number(0);
174 auto bi = (i < b.size() && b[i]) ? b[i] : SymbolicExpr::number(0);
175 result[i] = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(ai, bi)), transform_budget));
176 }
177 return result;
178}

引用了 a, b, context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 power_series_add().

被这些函数引用 power_series_add().

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

◆ power_series_compose_checked() [1/2]

PowerSeriesResult LMCAS::power_series_compose_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & f,
const std::vector< std::shared_ptr< SymbolicExpr > > & g,
int order )

在文件 series_engine.cpp 第 326 行定义.

328 {
331}
PowerSeriesResult power_series_compose_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &f, const std::vector< std::shared_ptr< SymbolicExpr > > &g, int order, ComputationContext &context)

引用了 context, order , 以及 power_series_compose_checked().

函数调用图:

◆ power_series_compose_checked() [2/2]

PowerSeriesResult LMCAS::power_series_compose_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & f,
const std::vector< std::shared_ptr< SymbolicExpr > > & g,
int order,
ComputationContext & context )

在文件 series_engine.cpp 第 270 行定义.

273 {
274 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
275 (context).limits().max_ast_nodes, "transform");
276 const std::string operation = "power_series_compose";
277 auto order_check = validate_power_series_order(order, context, operation);
278 if (!order_check) {
279 return PowerSeriesResult::failure(order_check.error());
280 }
281 auto f_check = validate_power_series_coefficients(f, operation, "outer series");
282 if (!f_check) {
283 return PowerSeriesResult::failure(f_check.error());
284 }
285 auto g_check = validate_power_series_coefficients(g, operation, "inner series");
286 if (!g_check) {
287 return PowerSeriesResult::failure(g_check.error());
288 }
289
290 size_t n = static_cast<size_t>(order);
291 if (!g.empty() && !g[0]->is_zero()) {
294 "power series composition around zero requires g(0) = 0",
295 operation);
296 }
297 std::vector<std::shared_ptr<SymbolicExpr>> result(n, SymbolicExpr::number(0));
298 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> gp(n);
299 auto powers = composition_inner_powers(g, gp, order, context, operation);
300 if (!powers) {
301 return PowerSeriesResult::failure(powers.error());
302 }
303 for (size_t k = 0; k < std::min(f.size(), n); ++k) {
304 auto step = context.consume_steps(1, operation);
305 if (!step) {
306 return PowerSeriesResult::failure(step.error());
307 }
308 auto fk = f[k] ? f[k] : SymbolicExpr::number(0);
309 if (fk->is_zero()) {
310 continue;
311 }
312 for (size_t i = 0; i < n && i < gp[k].size(); ++i)
313 result[i] = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(result[i], SymbolicExpr::multiply(fk, gp[k][i]))), transform_budget));
314 }
315 return PowerSeriesResult::success(std::move(result));
316} catch (const CasError& error) {
317 return PowerSeriesResult::failure(error);
318} catch (const std::bad_alloc&) {
319 return PowerSeriesResult::failure(CasErrc::ResourceLimit, "allocation failed", "power_series_compose");
320} catch (const std::length_error& error) {
321 return PowerSeriesResult::failure(CasErrc::ResourceLimit, error.what(), "power_series_compose");
322} catch (const std::exception& error) {
323 return PowerSeriesResult::failure(CasErrc::InternalInvariant, error.what(), "power_series_compose");
324}
static Result< void > composition_inner_powers(const std::vector< std::shared_ptr< SymbolicExpr > > &g, std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > &gp, int order, ComputationContext &context, const std::string &operation)

引用了 composition_inner_powers(), context, DomainError, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), order, power_series_compose_checked(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success() , 以及 validate_power_series_coefficients().

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

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

◆ power_series_multiply_checked() [1/2]

PowerSeriesResult LMCAS::power_series_multiply_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & a,
const std::vector< std::shared_ptr< SymbolicExpr > > & b,
int order )

在文件 series_engine.cpp 第 235 行定义.

引用了 a, b, context, order , 以及 power_series_multiply_checked().

函数调用图:

◆ power_series_multiply_checked() [2/2]

PowerSeriesResult LMCAS::power_series_multiply_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & a,
const std::vector< std::shared_ptr< SymbolicExpr > > & b,
int order,
ComputationContext & context )

在文件 series_engine.cpp 第 180 行定义.

183 {
184 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
185 (context).limits().max_ast_nodes, "transform");
186 const std::string operation = "power_series_multiply";
187 auto order_check = validate_power_series_order(order, context, operation);
188 if (!order_check) {
189 return PowerSeriesResult::failure(order_check.error());
190 }
191 auto a_check = validate_power_series_coefficients(a, operation, "left series");
192 if (!a_check) {
193 return PowerSeriesResult::failure(a_check.error());
194 }
195 auto b_check = validate_power_series_coefficients(b, operation, "right series");
196 if (!b_check) {
197 return PowerSeriesResult::failure(b_check.error());
198 }
199
200 size_t n = static_cast<size_t>(order);
201 std::vector<std::shared_ptr<SymbolicExpr>> result(n, SymbolicExpr::number(0));
202 for (size_t k = 0; k < n; ++k) {
203 auto step = context.consume_steps(1, operation);
204 if (!step) {
205 return PowerSeriesResult::failure(step.error());
206 }
207 std::vector<std::shared_ptr<const SymbolicNode>> terms;
208 for (size_t j = 0; j <= k; ++j) {
209 if (j >= a.size() || (k-j) >= b.size()) {
210 continue;
211 }
212 auto aj = a[j] ? a[j] : SymbolicExpr::number(0);
213 auto bkj = b[k-j] ? b[k-j] : SymbolicExpr::number(0);
214 terms.push_back(LMCAS::detail::node(SymbolicExpr::multiply(aj, bkj)));
215 }
216 if (terms.empty()) {
217 result[k] = SymbolicExpr::number(0);
218 } else if (terms.size() == 1) {
219 result[k] = detail::make_expression_ptr(detail::normalize_node(terms[0], transform_budget));
220 } else {
222 }
223 }
224 return PowerSeriesResult::success(std::move(result));
225} catch (const CasError& error) {
226 return PowerSeriesResult::failure(error);
227} catch (const std::bad_alloc&) {
228 return PowerSeriesResult::failure(CasErrc::ResourceLimit, "allocation failed", "power_series_multiply");
229} catch (const std::length_error& error) {
230 return PowerSeriesResult::failure(CasErrc::ResourceLimit, error.what(), "power_series_multiply");
231} catch (const std::exception& error) {
232 return PowerSeriesResult::failure(CasErrc::InternalInvariant, error.what(), "power_series_multiply");
233}

引用了 a, b, context, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), order, power_series_multiply_checked(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success() , 以及 validate_power_series_coefficients().

被这些函数引用 composition_inner_powers(), power_series_multiply_checked() , 以及 power_series_multiply_checked().

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

◆ power_term_convergence()

std::optional< ConvergenceInfo > LMCAS::power_term_convergence ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & index_var )
static

在文件 series_convergence.cpp 第 283 行定义.

285 {
286 auto power = std::dynamic_pointer_cast<const PowerNode>(node);
287 if (!power) {
288 return std::nullopt;
289 }
290 auto base_var = std::dynamic_pointer_cast<const VariableNode>(power->base());
291 auto exponent = std::dynamic_pointer_cast<const NumberNode>(power->exponent());
292 if (!base_var || base_var->is_constant() || base_var->name() != index_var || !exponent) {
293 return std::nullopt;
294 }
295
296 bool below_negative_one = false;
297 bool at_or_above_negative_one = false;
298 if (const auto* integer = std::get_if<BigInt>(&exponent->value())) {
299 below_negative_one = *integer < BigInt(-1);
300 at_or_above_negative_one = !below_negative_one;
301 } else if (const auto* rational = std::get_if<Rational>(&exponent->value())) {
302 below_negative_one = *rational < Rational(-1);
303 at_or_above_negative_one = !below_negative_one;
304 }
305 if (below_negative_one) {
306 return ConvergenceInfo{
308 }
309 if (at_or_above_negative_one) {
310 return ConvergenceInfo{
311 ConvergenceResult::Divergent, "p-series"};
312 }
313 return std::nullopt;
314}

引用了 Convergent, Divergent, exponent, integer, power_term_convergence() , 以及 rational().

被这些函数引用 convergence_test_impl() , 以及 power_term_convergence().

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

◆ prepare_fourier_period()

Result< FourierPeriod > LMCAS::prepare_fourier_period ( const std::shared_ptr< SymbolicExpr > & period,
const std::string & var,
ComputationContext & context )
static

在文件 series_expansions.cpp 第 203 行定义.

205 {
206 auto T = period;
207 std::optional<detail::AssumptionFacts> assumed;
208 if (context.assumptions()) { assumed.emplace(*context.assumptions()); }
209 const auto& facts = assumed ? static_cast<const FactsQuery&>(*assumed) : detail::no_facts();
210 auto positive_period = detail::query_positive_value(detail::node(T), facts, context);
211 if (!positive_period) { return Result<FourierPeriod>::failure(positive_period.error()); }
213 positive_period.value() != Tribool::True) {
216 "Fourier period must be a proved positive constant", "fourier_series");
217 }
220 auto two = SymbolicExpr::number(2);
221 auto L = SymbolicExpr::divide(T, two);
222 auto half_lo = SymbolicExpr::multiply(SymbolicExpr::number(-1), L);
223 auto half_hi = L;
224 auto w = SymbolicExpr::divide(SymbolicExpr::multiply(two, pi), T);
225 return FourierPeriod{std::move(two), std::move(L), std::move(half_lo),
226 std::move(half_hi), std::move(w)};
227}

引用了 context, expression_depends_on_variable(), LMCAS::Result< T >::failure(), False, Inconclusive, InvalidArgument, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::no_facts(), LMCAS::detail::node(), pi(), prepare_fourier_period(), LMCAS::detail::query_positive_value() , 以及 True.

被这些函数引用 fourier_series_checked() , 以及 prepare_fourier_period().

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

◆ product_without_factor()

std::shared_ptr< SymbolicExpr > LMCAS::product_without_factor ( const MultiplyNode & product,
size_t omitted )
static

在文件 series_sequence_limits.cpp 第 29 行定义.

30 {
31 std::vector<std::shared_ptr<const SymbolicNode>> rest;
32 for (size_t j = 0; j < product.operands().size(); ++j) {
33 if (j != omitted) {
34 rest.push_back(product.operands()[j]);
35 }
36 }
37 if (rest.empty()) {
38 return SymbolicExpr::number(1);
39 }
40 if (rest.size() == 1) {
41 return detail::make_expression_ptr(rest[0]);
42 }
44}
const std::vector< std::shared_ptr< const SymbolicNode > > & operands() const noexcept

引用了 LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::MultiplyNode::operands() , 以及 product_without_factor().

被这些函数引用 product_without_factor() , 以及 series_extract_alternating().

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

◆ project_finite_expr_set()

ExprSetResult LMCAS::project_finite_expr_set ( const ExprPtr & original,
const std::string & variable,
ComputationContext & context,
const SolveOptions & options )
static

在文件 expr_solving.cpp 第 33 行定义.

36 {
37 auto solved = solve_set(original, variable, context, options);
38 if (!solved) {
39 return ExprSetResult::failure(solved.error());
40 }
41
42 const auto& solution_set = solved.value();
43 if (std::holds_alternative<EmptySolutions>(solution_set)) {
44 return expr_set({});
45 }
46 const auto* finite = std::get_if<FiniteSolutions>(&solution_set);
47 if (!finite) {
48 return expr_set_failure(
50 "solution set is not a finite enumerable set<Expr>",
52 }
53
54 std::vector<ExprPtr> elements;
55 elements.reserve(finite->values.size());
56 for (const auto& solution : finite->values) {
57 if (!solution.conditions.empty()) {
59 "conditional finite solutions cannot be lowered to set<Expr>",
61 }
62 elements.push_back(solution.value);
63 }
64 return expr_set(std::move(elements));
65}
ExprSetResult expr_set(std::vector< ExprPtr > elements)
SolveResult solve_set(const ExprPtr &equation, const std::string &variable, ComputationContext &context, const SolveOptions &options)

引用了 context, expr_set(), expr_set_failure(), LMCAS::Result< ExprSet >::failure(), Inconclusive, kSolveExprSetOperation, options, project_finite_expr_set(), solve_set() , 以及 variable.

被这些函数引用 project_finite_expr_set(), roots() , 以及 solve_expr_set().

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

◆ qr_decomposition_checked() [1/2]

QRDecompositionResult LMCAS::qr_decomposition_checked ( const std::shared_ptr< SymbolicExpr > & A)

在文件 matrix_decomposition_qr.cpp 第 141 行定义.

143{
146}
QRDecompositionResult qr_decomposition_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)

引用了 context , 以及 qr_decomposition_checked().

函数调用图:

◆ qr_decomposition_checked() [2/2]

QRDecompositionResult LMCAS::qr_decomposition_checked ( const std::shared_ptr< SymbolicExpr > & A,
ComputationContext & context )

在文件 matrix_decomposition_qr.cpp 第 103 行定义.

106{
107 const std::string operation = "qr_decomposition";
108 auto matrix = validate_decomposition_matrix(A, false, context, operation);
109 if (!matrix) return QRDecompositionResult::failure(matrix.error());
110 auto budget = context.consume_steps(matrix.value()->rows() * matrix.value()->cols() * 12 + 8,
111 operation);
112 if (!budget) return QRDecompositionResult::failure(budget.error());
113 auto full_rank = prove_exact_full_column_rank_qr_support(
114 matrix.value(), context, operation);
115 if (!full_rank) return QRDecompositionResult::failure(full_rank.error());
116 try {
117 std::shared_ptr<SymbolicExpr> Q;
118 std::shared_ptr<SymbolicExpr> R;
119 if (!qr_decomposition_impl(A, Q, R)) {
122 "QR decomposition could not be constructed in the supported symbolic domain",
123 operation);
124 }
125 auto q_check = validate_decomposition_output(Q, "Q", operation);
126 if (!q_check) return QRDecompositionResult::failure(q_check.error());
127 auto r_check = validate_decomposition_output(R, "R", operation);
128 if (!r_check) return QRDecompositionResult::failure(r_check.error());
129 return QRDecompositionResult::success(QRDecomposition{Q, R});
130 } catch (const std::bad_alloc&) {
132 "allocation failed while calculating QR decomposition",
133 operation);
134 } catch (const std::exception& ex) {
136 ex.what(),
137 operation);
138 }
139}

引用了 context, LMCAS::Result< QRDecomposition >::failure(), Inconclusive, InternalInvariant, qr_decomposition_checked(), ResourceLimit, LMCAS::Result< QRDecomposition >::success(), LMCAS::detail::matrix_decomposition::validate_decomposition_matrix() , 以及 LMCAS::detail::matrix_decomposition::validate_decomposition_output().

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

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

◆ quadratic_form_matrix()

std::shared_ptr< SymbolicExpr > LMCAS::quadratic_form_matrix ( const std::shared_ptr< SymbolicExpr > & expr,
const std::vector< std::string > & vars )

在文件 matrix_quadratic_form.cpp 第 120 行定义.

122 {
124 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
125 (context).limits().max_ast_nodes, "transform");
126 if (!expr || !valid_variables(vars)) {
127 return nullptr;
128 }
129
130 try {
131 auto expanded = detail::make_expression_ptr(detail::expand_node(detail::node(expr), transform_budget));
132 if (!expanded) {
133 return nullptr;
134 }
135 auto variables = make_variables(vars);
136 auto matrix = quadratic_coefficients(expanded, vars, context);
137 if (!matrix ||
138 !reconstructs_expression(expanded, *matrix, variables, context)) {
139 return nullptr;
140 }
141 return SymbolicExpr::matrix(*matrix);
142 } catch (const CasError& error) {
143 if (error.code != CasErrc::UnsupportedExpression) throw;
144 return nullptr;
145 }
146}
bool reconstructs_expression(const std::shared_ptr< SymbolicExpr > &expanded, const SymbolicMatrix &matrix, const std::vector< std::shared_ptr< SymbolicExpr > > &variables, ComputationContext &context)
std::optional< SymbolicMatrix > quadratic_coefficients(const std::shared_ptr< SymbolicExpr > &expanded, const std::vector< std::string > &variables, ComputationContext &context)
std::vector< std::shared_ptr< SymbolicExpr > > make_variables(const std::vector< std::string > &names)

引用了 LMCAS::CasError::code, context, LMCAS::detail::expand_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), quadratic_form_matrix(), UnsupportedExpression , 以及 vars.

被这些函数引用 quadratic_form_matrix().

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

◆ quadrature_gaussian_numeric() [1/2]

Result< QuadratureEstimate > LMCAS::quadrature_gaussian_numeric ( const std::shared_ptr< SymbolicExpr > & function,
const std::string & variable,
const std::shared_ptr< SymbolicExpr > & lower,
const std::shared_ptr< SymbolicExpr > & upper,
ComputationContext & context,
int order )

在文件 numerical_integration.cpp 第 234 行定义.

240 {
241 constexpr const char* operation = "quadrature_gaussian";
242 auto valid = validate_quadrature_args(
243 function, variable, lower, upper, operation);
244 if (!valid) return Result<QuadratureEstimate>::failure(valid.error());
245 if (order < 1 || order > 20) {
248 "Gaussian quadrature order must be in [1, 20]",
249 operation);
250 }
251 auto interval = evaluate_interval(lower, upper, context, operation);
253 if (interval.value().lower == interval.value().upper) {
254 return Result<QuadratureEstimate>::success(zero_quadrature_result());
255 }
256 const int comparison_order = order == 20 ? 19 : order + 1;
257 auto budget = context.consume_steps(
258 static_cast<std::size_t>(order + comparison_order + 2), operation);
259 if (!budget) return Result<QuadratureEstimate>::failure(budget.error());
260
262 QuadratureCallback callback{
263 &function, &variable, &context, operation, std::nullopt};
264 double value = 0.0;
265 auto status = lmmc_quad_gauss_legendre(
266 evaluate_quadrature_callback, &callback,
267 interval.value().lower, interval.value().upper,
268 static_cast<std::size_t>(order), &value);
269 if (callback.error) return Result<QuadratureEstimate>::failure(*callback.error);
270 if (status != LMMC_STATUS_OK) {
271 return quadrature_failure<QuadratureEstimate>(status, operation);
272 }
273
274 double comparison_value = 0.0;
275 status = lmmc_quad_gauss_legendre(
276 evaluate_quadrature_callback, &callback,
277 interval.value().lower, interval.value().upper,
278 static_cast<std::size_t>(comparison_order), &comparison_value);
279 if (callback.error) return Result<QuadratureEstimate>::failure(*callback.error);
280 if (status != LMMC_STATUS_OK) {
281 return quadrature_failure<QuadratureEstimate>(status, operation);
282 }
284 value, std::abs(comparison_value - value),
285 interval.value().sign, operation);
286}
Result< QuadratureEstimate > estimated_quadrature_result(double value, double estimated_error, double sign, const std::string &operation)

引用了 LMCAS::expr_detail::expr_common::comparison_value(), context, LMCAS::detail::ensure_lmmc_lifecycle(), LMCAS::Result< T >::error(), LMCAS::Result< T >::failure(), function(), interval(), InvalidArgument, lower, order, quadrature_gaussian_numeric(), LMCAS::Result< T >::success(), upper, LMCAS::Result< T >::value(), value , 以及 variable.

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

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

◆ quadrature_gaussian_numeric() [2/2]

Result< QuadratureEstimate > LMCAS::quadrature_gaussian_numeric ( const std::shared_ptr< SymbolicExpr > & function,
const std::string & variable,
const std::shared_ptr< SymbolicExpr > & lower,
const std::shared_ptr< SymbolicExpr > & upper,
int order )

在文件 numerical_integration.cpp 第 288 行定义.

293 {
297}
Result< QuadratureEstimate > quadrature_gaussian_numeric(const std::shared_ptr< SymbolicExpr > &function, const std::string &variable, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, int order)

引用了 context, function(), lower, order, quadrature_gaussian_numeric(), upper , 以及 variable.

函数调用图:

◆ quadrature_simpson_numeric() [1/2]

Result< QuadratureEstimate > LMCAS::quadrature_simpson_numeric ( const std::shared_ptr< SymbolicExpr > & function,
const std::string & variable,
const std::shared_ptr< SymbolicExpr > & lower,
const std::shared_ptr< SymbolicExpr > & upper,
ComputationContext & context,
int subdivisions )

在文件 numerical_integration.cpp 第 158 行定义.

164 {
165 constexpr const char* operation = "quadrature_simpson";
166 auto valid = validate_quadrature_args(
167 function, variable, lower, upper, operation);
168 if (!valid) return Result<QuadratureEstimate>::failure(valid.error());
169 if (subdivisions <= 0 || subdivisions % 2 != 0) {
172 "Simpson subinterval count must be positive and even",
173 operation);
174 }
175 if (subdivisions > std::numeric_limits<int>::max() / 2) {
178 "Simpson refinement count overflows",
179 operation);
180 }
181 auto interval = evaluate_interval(lower, upper, context, operation);
183 if (interval.value().lower == interval.value().upper) {
185 }
186 const auto refined_subdivisions =
187 static_cast<std::size_t>(subdivisions) * 2;
188 const auto samples =
189 static_cast<std::size_t>(subdivisions) + 1 +
190 refined_subdivisions + 1;
191 auto budget = context.consume_steps(samples, operation);
192 if (!budget) return Result<QuadratureEstimate>::failure(budget.error());
193
195 QuadratureCallback callback{
196 &function, &variable, &context, operation, std::nullopt};
197 double value = 0.0;
198 auto status = lmmc_quad_simpson(
199 evaluate_quadrature_callback, &callback,
200 interval.value().lower, interval.value().upper,
201 static_cast<std::size_t>(subdivisions), &value);
202 if (callback.error) return Result<QuadratureEstimate>::failure(*callback.error);
203 if (status != LMMC_STATUS_OK) {
204 return quadrature_failure<QuadratureEstimate>(status, operation);
205 }
206
207 double refined_value = 0.0;
208 status = lmmc_quad_simpson(
209 evaluate_quadrature_callback, &callback,
210 interval.value().lower, interval.value().upper,
211 refined_subdivisions, &refined_value);
212 if (callback.error) return Result<QuadratureEstimate>::failure(*callback.error);
213 if (status != LMMC_STATUS_OK) {
214 return quadrature_failure<QuadratureEstimate>(status, operation);
215 }
216 const double correction = (refined_value - value) / 15.0;
217 const double extrapolated_value = refined_value + correction;
219 extrapolated_value, std::abs(correction),
220 interval.value().sign, operation);
221}

引用了 context, LMCAS::detail::ensure_lmmc_lifecycle(), LMCAS::Result< T >::error(), LMCAS::Result< T >::failure(), function(), interval(), InvalidArgument, lower, quadrature_simpson_numeric(), ResourceLimit, LMCAS::Result< T >::success(), upper, LMCAS::Result< T >::value(), value , 以及 variable.

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

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

◆ quadrature_simpson_numeric() [2/2]

Result< QuadratureEstimate > LMCAS::quadrature_simpson_numeric ( const std::shared_ptr< SymbolicExpr > & function,
const std::string & variable,
const std::shared_ptr< SymbolicExpr > & lower,
const std::shared_ptr< SymbolicExpr > & upper,
int subdivisions )

在文件 numerical_integration.cpp 第 223 行定义.

228 {
231 function, variable, lower, upper, context, subdivisions);
232}
Result< QuadratureEstimate > quadrature_simpson_numeric(const std::shared_ptr< SymbolicExpr > &function, const std::string &variable, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, int subdivisions)

引用了 context, function(), lower, quadrature_simpson_numeric(), upper , 以及 variable.

函数调用图:

◆ quantity_add()

QuantityResult LMCAS::quantity_add ( const std::shared_ptr< SymbolicExpr > & lhs,
const std::shared_ptr< SymbolicExpr > & rhs,
ComputationContext & context )

在文件 quantity.cpp 第 211 行定义.

213 {
214 auto checked = checked_binary(lhs, rhs, context, "quantity.add");
215 if (!checked) return QuantityResult::failure(checked.error());
216 const auto left = view(lhs);
217 const auto right = view(rhs);
218 if (left.dimension != right.dimension) {
219 return failure(CasErrc::DimensionMismatch,
220 "addition requires operands with equal dimensions");
221 }
222 const Rational factor = right.scale / left.scale;
223 auto right_value = SymbolicFactory::create_multiply(
224 {right.value, rational_node(factor)});
225 return make_quantity(SymbolicFactory::create_add({left.value, right_value}),
226 left.dimension, left.scale, left.display);
227}

引用了 context, LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_multiply(), DimensionMismatch, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), quantity_add(), rhs , 以及 right.

被这些函数引用 add() , 以及 quantity_add().

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

◆ quantity_divide()

QuantityResult LMCAS::quantity_divide ( const std::shared_ptr< SymbolicExpr > & lhs,
const std::shared_ptr< SymbolicExpr > & rhs,
ComputationContext & context )

在文件 quantity.cpp 第 261 行定义.

263 {
264 auto checked = checked_binary(lhs, rhs, context, "quantity.divide");
265 if (!checked) return QuantityResult::failure(checked.error());
266 const auto left = view(lhs);
267 const auto right = view(rhs);
268 auto inverse = SymbolicFactory::create_power(right.value,
270 const std::string display = right.display.empty() ? left.display
271 : left.display.empty() ? "1/" + right.display : left.display + "/" + right.display;
272 return make_quantity(SymbolicFactory::create_multiply({left.value, inverse}),
273 left.dimension.divided_by(right.dimension),
274 left.scale / right.scale, display);
275}

引用了 context, LMCAS::SymbolicFactory::create_multiply(), LMCAS::SymbolicFactory::create_number(), LMCAS::SymbolicFactory::create_power(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), quantity_divide(), rhs , 以及 right.

被这些函数引用 div() , 以及 quantity_divide().

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

◆ quantity_multiply()

QuantityResult LMCAS::quantity_multiply ( const std::shared_ptr< SymbolicExpr > & lhs,
const std::shared_ptr< SymbolicExpr > & rhs,
ComputationContext & context )

在文件 quantity.cpp 第 247 行定义.

249 {
250 auto checked = checked_binary(lhs, rhs, context, "quantity.multiply");
251 if (!checked) return QuantityResult::failure(checked.error());
252 const auto left = view(lhs);
253 const auto right = view(rhs);
254 const auto dimension = left.dimension.multiplied_by(right.dimension);
255 const std::string display = left.display.empty() ? right.display
256 : right.display.empty() ? left.display : left.display + "*" + right.display;
257 return make_quantity(SymbolicFactory::create_multiply({left.value, right.value}),
258 dimension, left.scale * right.scale, display);
259}

引用了 context, LMCAS::SymbolicFactory::create_multiply(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), quantity_multiply(), rhs , 以及 right.

被这些函数引用 mul() , 以及 quantity_multiply().

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

◆ quantity_power()

QuantityResult LMCAS::quantity_power ( const std::shared_ptr< SymbolicExpr > & base,
const std::shared_ptr< SymbolicExpr > & exponent,
ComputationContext & context )

在文件 quantity.cpp 第 277 行定义.

279 {
280 auto checked = checked_binary(base, exponent, context, "quantity.power");
281 if (!checked) return QuantityResult::failure(checked.error());
282 const auto exponent_view = view(exponent);
283 if (!exponent_view.dimension.is_dimensionless()) {
284 return failure(CasErrc::DimensionMismatch,
285 "a quantity exponent must be dimensionless");
286 }
287 const auto base_view = view(base);
288 auto base_value = scaled_value(base_view);
289 if (base_view.dimension.is_dimensionless()) {
290 return make_quantity(
291 SymbolicFactory::create_power(base_value, exponent_view.value),
292 DimensionSignature{}, Rational(1), {});
293 }
294 auto power = exact_rational(exponent_view.value);
295 if (!power) return QuantityResult::failure(power.error());
296 auto dimension = base_view.dimension.raised_to(power.value());
297 return make_quantity(
298 SymbolicFactory::create_power(base_value, exponent_view.value),
299 dimension, Rational(1), dimension.to_string());
300}
std::optional< Rational > exact_rational(const ExprPtr &expression)

引用了 context, LMCAS::SymbolicFactory::create_power(), DimensionMismatch, exponent, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure() , 以及 quantity_power().

被这些函数引用 pow(), quantity_power() , 以及 sqrt().

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

◆ quantity_subtract()

QuantityResult LMCAS::quantity_subtract ( const std::shared_ptr< SymbolicExpr > & lhs,
const std::shared_ptr< SymbolicExpr > & rhs,
ComputationContext & context )

在文件 quantity.cpp 第 229 行定义.

231 {
232 auto checked = checked_binary(lhs, rhs, context, "quantity.subtract");
233 if (!checked) return QuantityResult::failure(checked.error());
234 const auto left = view(lhs);
235 const auto right = view(rhs);
236 if (left.dimension != right.dimension) {
237 return failure(CasErrc::DimensionMismatch,
238 "subtraction requires operands with equal dimensions");
239 }
240 const Rational factor = Rational(-1) * right.scale / left.scale;
241 auto right_value = SymbolicFactory::create_multiply(
242 {right.value, rational_node(factor)});
243 return make_quantity(SymbolicFactory::create_add({left.value, right_value}),
244 left.dimension, left.scale, left.display);
245}

引用了 context, LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_multiply(), DimensionMismatch, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), quantity_subtract(), rhs , 以及 right.

被这些函数引用 quantity_subtract() , 以及 sub().

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

◆ quotient_dimension()

int LMCAS::quotient_dimension ( const std::vector< FGLMPoly > & basis,
size_t num_vars,
int max_degree )

在文件 fglm_dimension.cpp 第 81 行定义.

82 {
83 if (basis.empty()) return -1;
85 int count = 0;
86 const int limit = 1000;
87 for (int degree = 0; degree <= max_degree && count <= limit; ++degree) {
88 std::vector<Monomial> monomials;
89 Monomial current(num_vars, 0);
90 fglm_detail::generate_degree(current, 0, degree, monomials);
91 bool any_standard = false;
92 for (const auto& monomial : monomials) {
93 if (!fglm_detail::is_standard(monomial, leading)) continue;
94 any_standard = true;
95 if (++count > limit) return count;
96 }
97 if (!monomials.empty() && !any_standard && degree > 0) break;
98 }
99 return count;
100}
void generate_degree(Monomial &current, size_t variable, int remaining, std::vector< Monomial > &monomials)
std::vector< Monomial > leading_monomials(const std::vector< FGLMPoly > &basis)

引用了 basis, LMCAS::fglm_detail::generate_degree(), LMCAS::fglm_detail::is_standard(), LMCAS::fglm_detail::leading_monomials() , 以及 quotient_dimension().

被这些函数引用 LMCAS::anonymous_namespace{fglm.cpp}::checked_dimension() , 以及 quotient_dimension().

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

◆ ratio_convergence_test()

ConvergenceInfoResult LMCAS::ratio_convergence_test ( const std::shared_ptr< SymbolicExpr > & general_term,
const std::string & index_var,
ComputationContext & context )
static

在文件 series_convergence.cpp 第 350 行定义.

352 {
353 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
354 (context).limits().max_ast_nodes, "transform");
355 auto n = SymbolicExpr::variable(index_var);
356 auto n1 = SymbolicExpr::add(n, SymbolicExpr::number(1));
357 auto inf = SymbolicExpr::infinity();
358 auto a_n1 = detail::make_expression_ptr(detail::substitute_node(detail::node(general_term), index_var, detail::node(n1), transform_budget));
359 if (a_n1) {
360 a_n1 = detail::make_expression_ptr(detail::normalize_node(detail::node(a_n1), transform_budget));
361 auto ratio = SymbolicExpr::divide(a_n1, general_term);
362 if (ratio) {
363 ratio = detail::make_expression_ptr(detail::normalize_node(detail::node(ratio), transform_budget));
365 FunctionNode::FuncType::Abs, std::vector<std::shared_ptr<const SymbolicNode>>{LMCAS::detail::node(ratio)}));
366 abs_r = detail::make_expression_ptr(detail::normalize_node(detail::node(abs_r), transform_budget));
367 auto limited = limit_expression_checked(
368 abs_r, index_var, inf, LimitDirection::Both, context);
369 if (!limited) {
370 return ConvergenceInfoResult::failure(limited.error());
371 }
372 auto lim = std::move(limited.value());
373 return classify_ratio_limit(lim, context);
374 }
375 }
377} catch (const CasError& error) {
378 return ConvergenceInfoResult::failure(error);
379} catch (const std::bad_alloc&) {
380 return ConvergenceInfoResult::failure(CasErrc::ResourceLimit, "allocation failed", "ratio_convergence_test");
381} catch (const std::length_error& error) {
382 return ConvergenceInfoResult::failure(CasErrc::ResourceLimit, error.what(), "ratio_convergence_test");
383} catch (const std::exception& error) {
384 return ConvergenceInfoResult::failure(CasErrc::InternalInvariant, error.what(), "ratio_convergence_test");
385}
static ConvergenceInfo classify_ratio_limit(const std::shared_ptr< SymbolicExpr > &lim, ComputationContext &context)

引用了 LMCAS::FunctionNode::Abs, Both, classify_ratio_limit(), context, LMCAS::Result< ConvergenceInfo >::failure(), Inconclusive, limit_expression_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), ratio_convergence_test() , 以及 LMCAS::detail::substitute_node().

被这些函数引用 convergence_test_impl() , 以及 ratio_convergence_test().

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

◆ rational()

ExprResult LMCAS::rational ( const Rational & value)

在文件 expr_values.cpp 第 82 行定义.

82 {
83 try {
84 return ExprResult::success(SymbolicExpr::number(value));
85 } catch (const std::bad_alloc&) {
87 "rational allocation failed", kRationalOperation);
88 } catch (const std::exception& error) {
90 }
91}
constexpr const char * kRationalOperation

引用了 LMCAS::expr_detail::expr_common::expression_failure(), InternalInvariant, LMCAS::expr_detail::expr_common::kRationalOperation, rational(), ResourceLimit, LMCAS::Result< ExprPtr >::success() , 以及 value.

被这些函数引用 LMCAS::expr_detail::ExprParser::apply_rootof(), bernoulli_integer_exponent(), LMCAS::detail::definite::boundary_checked(), LMCAS::anonymous_namespace{complex_analysis.cpp}::bounded_complex_power(), LMCAS::NormalizationVisitor::can_combine_nested_power(), classify_ratio_limit(), LMCAS::detail::definite::collect_predicate_roots(), LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::combine_surd_product(), LMCAS::detail::anonymous_namespace{interval_endpoint_order.cpp}::compare_algebraic_to_rational(), LMCAS::anonymous_namespace{symbolic_number_order.cpp}::compare_exact_nodes(), LMCAS::anonymous_namespace{symbolic_number_order.cpp}::compare_exact_to_rational(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_number(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_exponent(), exact_number_as_rational(), LMCAS::detail::exact_rational_value(), exact_small_integer_node(), LMCAS::detail::anonymous_namespace{numeric_evaluation_power.cpp}::exponent_parity(), geometric_term_convergence(), get_pi_coeff(), LMCAS::groebner_detail::anonymous_namespace{solver_groebner_builder.cpp}::integer_exponent(), LMCAS::anonymous_namespace{normalization_numeric_powers.cpp}::is_half_exponent(), normalization_exact_square_root(), normalization_numeric_power(), LMCAS::NormalizationVisitor::normalize_nested_imaginary_power(), LMCAS::anonymous_namespace{normalization_numeric_functions.cpp}::numeric_absolute(), LMCAS::expr_detail::ExprParser::parse_number(), LMCAS::anonymous_namespace{symbolic_factor.cpp}::polynomial_exponent(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::polynomial_exponent(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::positive_denominator_exponent(), LMCAS::anonymous_namespace{normalization_signs.cpp}::positive_negative_number(), LMCAS::detail::NumericEvaluator::power(), power_term_convergence(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::quadratic_eigenvalue_sign(), rational(), LMCAS::detail::definite::rational_divergence_checked(), LMCAS::detail::definite::rational_pole_divergence(), LMCAS::anonymous_namespace{normalization_numeric_powers.cpp}::reciprocal_exact_number(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_power(), LMCAS::anonymous_namespace{integration_definite.cpp}::reduced_integrand_checked(), LMCAS::detail::inequality_support::anonymous_namespace{inequality_solver_ordering.cpp}::root_number_sign(), LMCAS::anonymous_namespace{normalization_numeric_powers.cpp}::small_exact_power(), sqrt(), LMCAS::detail::NumericEvaluator::square_root(), LMCAS::solver_detail::anonymous_namespace{solver_imaginary.cpp}::square_root_is_imaginary(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::squared_profile(), try_get_integer_value() , 以及 LMCAS::detail::RewriteBudget::Measurement::visit().

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

◆ rational_gcd()

Rational LMCAS::rational_gcd ( const Rational & a,
const Rational & b )
static

在文件 multivariate_factor.cpp 第 70 行定义.

71{
72 if (a.is_zero()) { return b.abs(); }
73 if (b.is_zero()) { return a.abs(); }
74 BigInt num_gcd = BigInt::gcd(a.get_numerator().abs(), b.get_numerator().abs());
75 BigInt den_gcd = BigInt::gcd(a.get_denominator(), b.get_denominator());
76 BigInt den_lcm = a.get_denominator() * b.get_denominator() / den_gcd;
77 return Rational(num_gcd, den_lcm);
78}

引用了 a, b , 以及 rational_gcd().

被这些函数引用 multivariate_gcd(), rational_gcd(), recursive_multivariate_gcd() , 以及 univariate_gcd().

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

◆ rational_reconstruction_checked() [1/2]

RationalReconstructionResult LMCAS::rational_reconstruction_checked ( int64_t x,
int64_t m )
inline

在文件 modular_arithmetic.hpp 第 452 行定义.

452 {
455}
RationalReconstructionResult rational_reconstruction_checked(int64_t x, int64_t m, ComputationContext &context)
Checked rational reconstruction.

引用了 context , 以及 rational_reconstruction_checked().

函数调用图:

◆ rational_reconstruction_checked() [2/2]

RationalReconstructionResult LMCAS::rational_reconstruction_checked ( int64_t x,
int64_t m,
ComputationContext & context )
inline

Checked rational reconstruction.

Returns Inconclusive when no supported coprime numerator/denominator can be reconstructed.

在文件 modular_arithmetic.hpp 第 386 行定义.

389 {
390 constexpr const char* operation = "rational_reconstruction";
391 auto step = context.consume_steps(1, operation);
392 if (!step) {
393 return RationalReconstructionResult::failure(step.error());
394 }
395 if (m <= 0) {
398 "rational reconstruction modulus must be positive",
399 operation);
400 }
401
402 x %= m;
403 if (x < 0) {
404 x += m;
405 }
406 int64_t bound = static_cast<int64_t>(
407 std::floor(std::sqrt(static_cast<double>(m) / 2.0)));
408 if (bound == 0) {
409 bound = 1;
410 }
411 int64_t r0 = m;
412 int64_t r1 = x;
413 int64_t s0 = 0;
414 int64_t s1 = 1;
415 while (r1 > bound) {
416 step = context.consume_steps(1, operation);
417 if (!step) {
418 return RationalReconstructionResult::failure(step.error());
419 }
420 const int64_t quotient = r0 / r1;
421 const int64_t next_r = r0 - quotient * r1;
422 const int64_t next_s = s0 - quotient * s1;
423 r0 = r1;
424 r1 = next_r;
425 s0 = s1;
426 s1 = next_s;
427 }
428 int64_t numerator = r1;
429 int64_t denominator = s1;
430 if (denominator < 0) {
431 numerator = -numerator;
433 }
434 int64_t unused_s = 0;
435 int64_t unused_t = 0;
436 const bool outside_bound =
437 std::abs(numerator) >= bound || denominator == 0 ||
438 denominator >= bound;
439 const bool not_coprime = !outside_bound &&
440 extended_gcd(std::abs(numerator), denominator,
441 unused_s, unused_t) != 1;
442 if (outside_bound || not_coprime) {
445 "no rational reconstruction exists in the supported bound",
446 operation);
447 }
449 {numerator, denominator});
450}

引用了 context, denominator, extended_gcd(), LMCAS::Result< std::pair< int64_t, int64_t > >::failure(), Inconclusive, InvalidArgument, rational_reconstruction_checked() , 以及 LMCAS::Result< std::pair< int64_t, int64_t > >::success().

被这些函数引用 rational_reconstruction_checked(), rational_reconstruction_checked() , 以及 zc_rational_reconstruction().

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

◆ rational_root_candidate()

std::optional< Rational > LMCAS::rational_root_candidate ( const Polynomial< Rational > & current)
static

在文件 rational_polynomial.cpp 第 33 行定义.

34 {
35 BigInt denominator_lcm(1);
36 for (const auto& coefficient : current.coeffs) {
37 denominator_lcm = BigInt::lcm(
38 denominator_lcm, coefficient.get_denominator());
39 }
40 const Rational scale(denominator_lcm);
41 const auto numerators = positive_divisors(
42 (current.coeffs[0] * scale).get_numerator());
43 const auto denominators = positive_divisors(
44 (current.lead_coeff() * scale).get_numerator());
45 for (const auto& numerator : numerators) {
46 for (const auto& denominator : denominators) {
47 Rational positive(numerator, denominator);
48 if (current.eval(positive) == Rational(0)) return positive;
49 Rational negative(-numerator, denominator);
50 if (current.eval(negative) == Rational(0)) return negative;
51 }
52 }
53 return std::nullopt;
54}
static std::vector< BigInt > positive_divisors(const BigInt &n)

引用了 LMCAS::Polynomial< CoeffType >::coeffs, denominator, LMCAS::Polynomial< CoeffType >::eval(), LMCAS::Polynomial< CoeffType >::lead_coeff(), positive_divisors() , 以及 rational_root_candidate().

被这些函数引用 find_rational_roots() , 以及 rational_root_candidate().

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

◆ rational_root_factors()

std::vector< std::shared_ptr< const SymbolicNode > > LMCAS::rational_root_factors ( const std::vector< Rational > & roots,
const Rational & leading,
const std::shared_ptr< SymbolicExpr > & x_node,
ComputationContext & context )
static

在文件 symbolic_factor.cpp 第 238 行定义.

240 {
241
242 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
243 (context).limits().max_ast_nodes, "transform");
244 std::vector<std::shared_ptr<const SymbolicNode>> factors;
245
246 if (!(leading == Rational(1))) {
247 factors.push_back(LMCAS::detail::node(SymbolicExpr::number(leading)));
248 }
249
250 for (const auto& r : roots) {
251 std::shared_ptr<SymbolicExpr> linear_factor;
252 if (r == Rational(0)) {
253 linear_factor = x_node;
254 } else {
255 auto neg_r = SymbolicExpr::number(Rational(0) - r);
256 linear_factor = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(x_node, neg_r)), transform_budget));
257 }
258 factors.push_back(LMCAS::detail::node(linear_factor));
259 }
260 return factors;
261}

引用了 context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), r, rational_root_factors() , 以及 roots().

被这些函数引用 rational_root_factors() , 以及 reconstruct_rational_roots().

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

◆ rational_root_product()

Polynomial< Rational > LMCAS::rational_root_product ( const std::vector< Rational > & roots,
const Rational & leading,
const std::string & var )
static

在文件 symbolic_factor.cpp 第 263 行定义.

265 {
266 LMCAS::Polynomial<Rational> factored_product({leading}, var);
267 for (const auto& r : roots) {
268 LMCAS::Polynomial<Rational> lin({Rational(0) - r, Rational(1)}, var);
269 factored_product = factored_product * lin;
270 }
271 return factored_product;
272}

引用了 r, rational_root_product() , 以及 roots().

被这些函数引用 rational_root_product() , 以及 reconstruct_rational_roots().

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

◆ rational_to_symbolic_poly()

Polynomial< SymbolicPolyCoeff > LMCAS::rational_to_symbolic_poly ( const Polynomial< Rational > & rat_poly)
static

在文件 solve_polynomial.cpp 第 44 行定义.

46{
47 std::vector<SymbolicPolyCoeff> sym_coeffs;
48 sym_coeffs.reserve(rat_poly.coeffs.size());
49 for (const auto& c : rat_poly.coeffs) {
50 sym_coeffs.push_back(SymbolicPolyCoeff(SymbolicExpr::number(c)));
51 }
52 return Polynomial<SymbolicPolyCoeff>(sym_coeffs, rat_poly.variable_name);
53}
Polynomial(const std::string &var="x")
构造零多项式

引用了 LMCAS::Polynomial< CoeffType >::Polynomial(), LMCAS::SymbolicPolyCoeff::SymbolicPolyCoeff(), c, LMCAS::Polynomial< CoeffType >::coeffs, rational_to_symbolic_poly() , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 append_factor_solutions(), rational_to_symbolic_poly() , 以及 LMCAS::polynomial_solver_detail::solve_by_factoring_impl().

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

◆ rationals()

NumberDomainSet LMCAS::rationals ( )

在文件 expr_number_domains.cpp 第 361 行定义.

361 {
362 return NumberDomainSet(NumberDomain::Rationals);
363}

引用了 Rationals , 以及 rationals().

被这些函数引用 rationals().

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

◆ real() [1/2]

ExprResult LMCAS::real ( const ExprPtr & expression)

在文件 expr_arithmetic.cpp 第 103 行定义.

103 {
105 return real(expression, context);
106}

引用了 context , 以及 real().

函数调用图:

◆ real() [2/2]

ExprResult LMCAS::real ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_arithmetic.cpp 第 98 行定义.

98 {
101}
constexpr const char * kRealOperation
ExpressionResult real_part_checked(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)

引用了 context, LMCAS::expr_detail::expr_common::expr_from_complex_result(), LMCAS::expr_detail::expr_common::kRealOperation, real() , 以及 real_part_checked().

被这些函数引用 LMCAS::ode_root_detail::Complex::Complex(), abs(), LMCAS::anonymous_namespace{inference_engine_periodicity.cpp}::PeriodInference::affine_period(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::approx_complex(), calculus_utils_extract_real_candidate(), LMCAS::equivalence_detail::canonicalize_complex_product(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::checked_complex(), classify_inflection_candidates(), LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::comparable_root(), complex(), complex_div_checked(), complex_exp_form_checked(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::complex_facts(), complex_mul_checked(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::compound_node(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::construct_roots(), LMCAS::detail::complex_root::coordinate_projections(), LMCAS::detail::complex_root::count_rectangle_roots(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::count_sheared_edges(), LMCAS::SymbolicFactory::create_complex(), LMCAS::anonymous_namespace{inference_engine_periodicity.cpp}::PeriodInference::declared_period(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_complex(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::edge_image(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::edge_is_clear(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_components(), LMCAS::detail::evaluate_root_complex(), LMCAS::equivalence_detail::exact_integer_node(), LMCAS::NormalizationVisitor::expand_complex_product(), LMCAS::InferenceEngine::Impl::exponential_domain(), LMCAS::InferenceEngine::Impl::exponential_sign(), LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::function_bounds(), LMCAS::InferenceEngine::Impl::integer_power_sign(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::invert_exponential(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::invert_logarithm(), make_complex(), LMCAS::NormalizationVisitor::merge_complex_terms(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::normalized_root(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_rectangles.cpp}::prepare_projection_grid(), LMCAS::InferenceEngine::Impl::product_sign(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::prove_coefficients(), LMCAS::InferenceEngine::Impl::quotient_sign(), real(), real(), LMCAS::detail::definite::real_assumptions(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::real_to_complex(), LMCAS::detail::refine_complex_isolation(), LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::rewrite_absolute(), LMCAS::equivalence_detail::rewrite_exp_log_basic_identity(), LMCAS::equivalence_detail::rewrite_trig_basic_identity(), LMCAS::equivalence_detail::rewritten_complex(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::root_facts(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::shear_is_valid(), LMCAS::NormalizationVisitor::simplify_assumed_square_root(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::specialize_absolute(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::square_relation(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::symbolic_quadratic_sign(), te_accept_decay(), LMCAS::InferenceEngine::Impl::trigonometric_sign(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::trigonometric_target_range(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::verify_root(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::RealPrimitiveCandidate::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::NormalizationVisitor::visit() , 以及 LMCAS::RewriteVisitor::visit().

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

◆ real_part_checked() [1/2]

ExpressionResult LMCAS::real_part_checked ( const std::shared_ptr< SymbolicExpr > & expr)

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

526 {
528 return real_part_checked(expr, context);
529}

引用了 context , 以及 real_part_checked().

函数调用图:

◆ real_part_checked() [2/2]

ExpressionResult LMCAS::real_part_checked ( const std::shared_ptr< SymbolicExpr > & expr,
ComputationContext & context )

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

494 {
495 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
496 (context).limits().max_ast_nodes, "transform");
497 const std::string operation = "real_part";
498 auto input = validate_complex_expr_input(expr, context, operation);
499 if (!input) return ExpressionResult::failure(input.error());
500 if (has_function_of_explicit_complex(LMCAS::detail::node(expr))) {
503 "real part of functions with complex arguments is outside the current support domain",
504 operation);
505 }
506
507 std::shared_ptr<SymbolicExpr> re, im;
508 split_real_imag(LMCAS::detail::node(expr), re, im, context);
509 auto simplified = re ? detail::make_expression_ptr(detail::normalize_node(detail::node(re), transform_budget)) : nullptr;
510 if (!simplified || !LMCAS::detail::node(simplified)) {
512 "real part construction failed",
513 operation);
514 }
515 return ExpressionResult::success(simplified);
516} catch (const CasError& error) {
517 return ExpressionResult::failure(error);
518} catch (const std::bad_alloc&) {
519 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "real_part");
520} catch (const std::length_error& error) {
521 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "real_part");
522} catch (const std::exception& error) {
523 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "real_part");
524}

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive, InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), real_part_checked() , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

被这些函数引用 real(), real_part_checked() , 以及 real_part_checked().

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

◆ reals()

NumberDomainSet LMCAS::reals ( )

在文件 expr_number_domains.cpp 第 365 行定义.

365 {
366 return NumberDomainSet(NumberDomain::Reals);
367}

引用了 Reals , 以及 reals().

被这些函数引用 reals().

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

◆ recognize_rational_polynomial()

Result< OptionalRationalPolynomial > LMCAS::recognize_rational_polynomial ( const SymbolicExpr & expression,
const std::string & variable,
ComputationContext & context )

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

174 {
175 if (!LMCAS::detail::node(expression)) {
177 CasErrc::InvalidArgument, "expression cannot be null", kOperation);
178 }
179 if (variable.empty()) {
181 CasErrc::InvalidArgument, "polynomial variable cannot be empty", kOperation);
182 }
184}
Result< OptionalRationalPolynomial > recognize_node(const std::shared_ptr< const SymbolicNode > &node, const std::string &variable, ComputationContext &context)

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

被这些函数引用 LMCAS::anonymous_namespace{residual_verification.cpp}::classify_residual(), dispatch_equation(), make_rootof_checked(), LMCAS::detail::make_rootof_solutions_impl(), LMCAS::anonymous_namespace{residual_verification.cpp}::prove_exact_root_residual(), LMCAS::equivalence_detail::prove_rational_polynomial_equivalence(), LMCAS::detail::definite::rational_checked(), recognize_rational_polynomial(), recognize_regular_laurent(), LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_match_exp_neg_quad(), solve_numeric_checked() , 以及 LMCAS::anonymous_namespace{integration_trig_substitution.cpp}::trigsub_quadratic_coefficients().

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

◆ recognize_regular_laurent()

Result< int > LMCAS::recognize_regular_laurent ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
ComputationContext & context )
static

在文件 series_expansions.cpp 第 494 行定义.

496 {
497 constexpr const char* operation = "laurent_series_full";
498 auto fn = std::dynamic_pointer_cast<const FunctionNode>(detail::node(f));
499 if (fn && fn->arguments().size() == 1 && regular_laurent_type(fn->type())) {
500 auto argument = detail::make_expression_ptr(fn->arguments()[0]);
501 auto polynomial = recognize_rational_polynomial(*argument, var, context);
502 if (!polynomial) {
503 return Result<int>::failure(polynomial.error());
504 }
505 if (polynomial.value()) {
506 return 0;
507 }
508 }
510 "Laurent singularity could not be proved", operation);
511}
static bool regular_laurent_type(FunctionNode::FuncType type)

引用了 context, LMCAS::Result< T >::failure(), Inconclusive, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), recognize_rational_polynomial(), recognize_regular_laurent() , 以及 regular_laurent_type().

被这些函数引用 extract_laurent_regular_part() , 以及 recognize_regular_laurent().

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

◆ reconstruct_rational_root_factors()

std::optional< ExpressionResult > LMCAS::reconstruct_rational_root_factors ( const Polynomial< Rational > & polynomial,
const std::vector< Rational > & roots,
const std::string & var,
ComputationContext & context )
static

在文件 symbolic_factor.cpp 第 452 行定义.

454 {
455
456 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
457 (context).limits().max_ast_nodes, "transform");
458 auto reconstruction =
459 reconstruct_rational_roots(polynomial, roots, var, context);
460 auto& factors = reconstruction.factors;
461 auto& quotient = reconstruction.quotient;
462 const auto& remainder = reconstruction.remainder;
463 if (remainder.is_zero() && quotient.degree() >= 1) {
464 auto q_expr = detail::make_expression_ptr(detail::normalize_node(detail::node(LMCAS::poly_to_symbolic(quotient)), transform_budget));
465 factors.push_back(LMCAS::detail::node(q_expr));
466 } else if (remainder.is_zero() && !quotient.is_zero() && quotient.degree() == 0) {
467 if (!(quotient.coeffs[0] == Rational(1))) {
468 factors.push_back(
469 LMCAS::detail::node(SymbolicExpr::number(quotient.coeffs[0])));
470 }
471 }
472 if (factors.size() > 1) {
475 }
476 return std::nullopt;
477}

引用了 context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), reconstruct_rational_root_factors(), reconstruct_rational_roots() , 以及 roots().

被这些函数引用 factor_variable_rational_roots() , 以及 reconstruct_rational_root_factors().

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

◆ reconstruct_rational_roots()

RationalRootReconstruction LMCAS::reconstruct_rational_roots ( const Polynomial< Rational > & polynomial,
const std::vector< Rational > & roots,
const std::string & variable,
ComputationContext & context )
static

在文件 symbolic_factor.cpp 第 280 行定义.

282 {
283 auto symbol =
285 const auto leading = polynomial.lead_coeff();
286 auto factors = rational_root_factors(roots, leading, symbol, context);
287 auto product = rational_root_product(roots, leading, variable);
288 auto [quotient, remainder] = polynomial.div_mod(product);
289 return {
290 std::move(factors), std::move(quotient), std::move(remainder)};
291}
static std::vector< std::shared_ptr< const SymbolicNode > > rational_root_factors(const std::vector< Rational > &roots, const Rational &leading, const std::shared_ptr< SymbolicExpr > &x_node, ComputationContext &context)
static Polynomial< Rational > rational_root_product(const std::vector< Rational > &roots, const Rational &leading, const std::string &var)

引用了 context, LMCAS::Polynomial< CoeffType >::div_mod(), LMCAS::Polynomial< CoeffType >::lead_coeff(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), rational_root_factors(), rational_root_product(), reconstruct_rational_roots(), roots() , 以及 variable.

被这些函数引用 factor_rational_univariate(), reconstruct_rational_root_factors() , 以及 reconstruct_rational_roots().

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

◆ record_remainder()

template<typename Operation>
void LMCAS::record_remainder ( const Operation & target,
const std::vector< bool > & used,
const char * key,
MatchMap & results )
static

在文件 matcher.cpp 第 78 行定义.

79 {
80 std::vector<std::shared_ptr<const SymbolicNode>> rest;
81 for (size_t index = 0; index < used.size(); ++index) {
82 if (!used[index]) {
83 rest.push_back(target.operands()[index]);
84 }
85 }
86 if (rest.empty()) {
87 return;
88 }
89 auto remainder = rest.size() == 1 ? rest.front() : combine_operands<Operation>(std::move(rest));
90 const auto found = results.find(key);
91 if (found == results.end()) {
92 results.emplace(key, detail::expression_from_node(remainder));
93 return;
94 }
95 std::vector<std::shared_ptr<const SymbolicNode>> operands;
96 if (const auto* existing = dynamic_cast<const Operation*>(detail::node(found->second).get())) {
97 operands.insert(operands.end(), existing->operands().begin(), existing->operands().end());
98 } else {
99 operands.push_back(detail::node(found->second));
100 }
101 operands.push_back(remainder);
102 found->second = detail::expression_from_node(combine_operands<Operation>(std::move(operands)));
103}
static std::shared_ptr< const SymbolicNode > combine_operands(std::vector< std::shared_ptr< const SymbolicNode > > operands)

引用了 combine_operands(), LMCAS::detail::expression_from_node(), LMCAS::detail::node(), record_remainder() , 以及 target.

被这些函数引用 match_operation() , 以及 record_remainder().

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

◆ recursive_multivariate_gcd()

MultiPoly LMCAS::recursive_multivariate_gcd ( const MultiPoly & a,
const MultiPoly & b,
const std::vector< std::string > & vars )
static

在文件 multivariate_factor.cpp 第 329 行定义.

331 {
332 std::string main_var = choose_main_variable(a, b);
333 Rational nc_a = a.numeric_content();
334 Rational nc_b = b.numeric_content();
335 Rational nc_gcd = rational_gcd(nc_a, nc_b);
336 MultiPoly a_prim = a.make_primitive();
337 MultiPoly b_prim = b.make_primitive();
338 int deg_a = a_prim.degree(main_var);
339 int deg_b = b_prim.degree(main_var);
340 int degree_bound = std::min(deg_a, deg_b);
341 int num_points = degree_bound + 1;
342 auto eval_pts = gcd_evaluation_points(num_points + 10);
343 GcdSamples samples;
344 collect_gcd_samples(a_prim, b_prim, main_var, eval_pts, num_points, samples);
345 const auto& used_pts = samples.points;
346 const auto& gcd_vals = samples.values;
347 const int target_deg = samples.target_degree;
348 if (target_deg <= 0 || used_pts.empty()) { return MultiPoly(nc_gcd, vars); }
349 if (used_pts.size() == 1 && degree_bound == 0) {
350 MultiPoly r = lagrange_interpolate(used_pts, gcd_vals, main_var, vars);
351 if (nc_gcd != Rational(1)) { r = r * nc_gcd; }
352 return r;
353 }
354 MultiPoly cand = lagrange_interpolate(used_pts, gcd_vals, main_var, vars);
355 if (cand.is_zero()) { return MultiPoly(nc_gcd, vars); }
356 cand = cand.make_primitive();
357 if (divides_poly(a_prim, cand) && divides_poly(b_prim, cand)) {
358 return normalize_gcd_candidate(std::move(cand), nc_gcd);
359 }
360 return extended_gcd_interpolation(a_prim, b_prim, main_var, vars,
361 degree_bound, nc_gcd);
362}
static std::string choose_main_variable(const MultiPoly &a, const MultiPoly &b)
static MultiPoly extended_gcd_interpolation(const MultiPoly &a_prim, const MultiPoly &b_prim, const std::string &main_var, const std::vector< std::string > &vars, int degree_bound, const Rational &nc_gcd)

引用了 a, b, choose_main_variable(), collect_gcd_samples(), divides_poly(), extended_gcd_interpolation(), gcd_evaluation_points(), lagrange_interpolate(), main_var, normalize_gcd_candidate(), LMCAS::GcdSamples::points, r, rational_gcd(), recursive_multivariate_gcd(), LMCAS::GcdSamples::target_degree, LMCAS::GcdSamples::values , 以及 vars.

被这些函数引用 multivariate_gcd() , 以及 recursive_multivariate_gcd().

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

◆ refine_root()

std::optional< NumericRoot > LMCAS::refine_root ( const std::shared_ptr< SymbolicExpr > & expr,
const std::shared_ptr< SymbolicExpr > & derivative,
const std::string & var,
const IsolatedInterval & interval,
const SolveOptions & opts )

在文件 mixed_transcendental_refinement.cpp 第 220 行定义.

224 {
226 detail::RewriteBudget budget(context, context.limits().max_recursion_depth,
227 context.limits().max_ast_nodes, "refine_root");
228 std::optional<CasError> failure;
230 expr, derivative, var, interval, opts, budget, &failure, nullptr);
231 if (failure) throw *failure;
232 return result;
233}
std::optional< NumericRoot > refine_root_with_context(const std::shared_ptr< SymbolicExpr > &expr, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &var, const IsolatedInterval &interval, const SolveOptions &opts, RewriteBudget &budget, std::optional< CasError > *failure, bool *complete)

引用了 context, interval(), refine_root() , 以及 LMCAS::detail::refine_root_with_context().

被这些函数引用 refine_root().

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

◆ regular_laurent_type()

bool LMCAS::regular_laurent_type ( FunctionNode::FuncType type)
static

在文件 series_expansions.cpp 第 488 行定义.

488 {
489 return type == FunctionNode::FuncType::Sin ||
492}

引用了 LMCAS::FunctionNode::Cos, LMCAS::FunctionNode::Exp, regular_laurent_type() , 以及 LMCAS::FunctionNode::Sin.

被这些函数引用 recognize_regular_laurent() , 以及 regular_laurent_type().

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

◆ relation()

ExprResult LMCAS::relation ( const ExprPtr & lhs,
const ExprPtr & rhs,
RelationOp op )

在文件 expr_facade.cpp 第 174 行定义.

174 {
175 constexpr const char* operation = "LMCAS.relation";
176 if (!lhs || !rhs) {
178 "relation operands cannot be null", operation);
179 }
180 try {
184 } catch (const std::bad_alloc&) {
186 "relation allocation failed", operation);
187 } catch (const std::exception& error) {
189 error.what(), operation);
190 }
191}

引用了 LMCAS::expr_detail::expr_common::expression_failure(), InternalInvariant, InvalidArgument, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), op, relation(), ResourceLimit, rhs , 以及 LMCAS::Result< ExprPtr >::success().

被这些函数引用 LMCAS::detail::AssumptionFacts::collect_names(), LMCAS::detail::definite::collect_predicate_roots(), LMCAS::anonymous_namespace{limit_result.cpp}::complex_polynomial_nonzero(), LMCAS::anonymous_namespace{limit_result.cpp}::complex_punctured_condition(), LMCAS::detail::transcendental::conditional_preimage(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::equation_residual(), LMCAS::anonymous_namespace{assumption_conditionals.cpp}::evaluate_zero_comparison(), ge(), gt(), le(), lt(), ne(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_relations.cpp}::parse_conditional_relation(), LMCAS::assumption_detail::AssumptionParser::parse_relation(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::predicate_truth(), relation(), relation_op(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::relational_condition_truth(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::relational_predicate_truth(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::solve_condition_truth(), solve_equation() , 以及 solve_transcendental().

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

◆ relation_op()

std::optional< RelationOp > LMCAS::relation_op ( const ExprPtr & expression)
noexcept

在文件 expr_values.cpp 第 23 行定义.

23 {
24 const auto* relation =
25 dynamic_cast<const RelationalNode*>(detail::node(expression).get());
26 if (!relation) return std::nullopt;
27 return relation->op();
28}

引用了 LMCAS::detail::node(), relation() , 以及 relation_op().

被这些函数引用 relation_op().

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

◆ residue_checked() [1/2]

ExpressionResult LMCAS::residue_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & z,
const std::shared_ptr< SymbolicExpr > & z0,
int order )

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

729 {
730 return calculate_residue_checked(f, z, z0, order);
731}

引用了 calculate_residue_checked(), order , 以及 residue_checked().

函数调用图:

◆ residue_checked() [2/2]

ExpressionResult LMCAS::residue_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & z,
const std::shared_ptr< SymbolicExpr > & z0,
int order,
ComputationContext & context )

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

721 {
722 return calculate_residue_checked(f, z, z0, order, context);
723}

引用了 calculate_residue_checked(), context, order , 以及 residue_checked().

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

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

◆ restore_main_exponent()

Monomial LMCAS::restore_main_exponent ( const Monomial & reduced,
size_t variable_count,
int variable_index,
int exponent )
static

在文件 multivariate_factor.cpp 第 79 行定义.

80 {
81 Monomial full(variable_count, 0);
82 size_t reduced_index = 0;
83 for (size_t i = 0; i < variable_count; ++i) {
84 if (static_cast<int>(i) == variable_index) {
85 full[i] = exponent;
86 } else {
87 if (reduced_index < reduced.size()) { full[i] = reduced[reduced_index]; }
88 ++reduced_index;
89 }
90 }
91 return full;
92}

引用了 exponent , 以及 restore_main_exponent().

被这些函数引用 add_lagrange_value(), multivariate_primitive_part() , 以及 restore_main_exponent().

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

◆ riemann_curvature_tensor_checked() [1/2]

DifferentialGeometryExprResult LMCAS::riemann_curvature_tensor_checked ( const std::shared_ptr< SymbolicExpr > & g_ij,
const std::vector< std::string > & coords,
int rho,
int sigma,
int mu,
int nu )

在文件 differential_geometry.cpp 第 627 行定义.

631{
633 return riemann_curvature_tensor_checked(g_ij, coords, rho, sigma, mu, nu, context);
634}
DifferentialGeometryExprResult riemann_curvature_tensor_checked(const std::shared_ptr< SymbolicExpr > &g_ij, const std::vector< std::string > &coords, int rho, int sigma, int mu, int nu, ComputationContext &context)

引用了 context , 以及 riemann_curvature_tensor_checked().

函数调用图:

◆ riemann_curvature_tensor_checked() [2/2]

DifferentialGeometryExprResult LMCAS::riemann_curvature_tensor_checked ( const std::shared_ptr< SymbolicExpr > & g_ij,
const std::vector< std::string > & coords,
int rho,
int sigma,
int mu,
int nu,
ComputationContext & context )

在文件 differential_geometry.cpp 第 574 行定义.

579{
580 const std::string operation = "riemann_curvature_tensor";
581 auto metric = validate_metric_matrix(g_ij, &coords, context, operation);
582 if (!metric) {
583 return DifferentialGeometryExprResult::failure(metric.error());
584 }
585 const std::size_t dim = metric.value()->rows();
586 auto rho_check = validate_index(rho, dim, "rho", operation);
587 if (!rho_check) {
588 return DifferentialGeometryExprResult::failure(rho_check.error());
589 }
590 auto sigma_check = validate_index(sigma, dim, "sigma", operation);
591 if (!sigma_check) {
592 return DifferentialGeometryExprResult::failure(sigma_check.error());
593 }
594 auto mu_check = validate_index(mu, dim, "mu", operation);
595 if (!mu_check) {
596 return DifferentialGeometryExprResult::failure(mu_check.error());
597 }
598 auto nu_check = validate_index(nu, dim, "nu", operation);
599 if (!nu_check) {
600 return DifferentialGeometryExprResult::failure(nu_check.error());
601 }
602 auto budget = context.consume_steps(dim * 80 + 40, operation);
603 if (!budget) {
605 }
606 try {
607 auto inverse_metric = metric_inverse_checked(g_ij, context);
608 if (!inverse_metric) {
609 return DifferentialGeometryExprResult::failure(inverse_metric.error());
610 }
612 g_ij, inverse_metric.value(), coords, rho, sigma, mu, nu, context);
613 return checked_geometry_expression(std::move(result), CasErrc::Inconclusive,
614 "Riemann curvature component could not be constructed",
615 operation);
616 } catch (const std::bad_alloc&) {
618 "allocation failed while calculating Riemann curvature",
619 operation);
620 } catch (const std::exception& ex) {
622 ex.what(),
623 operation);
624 }
625}
static std::shared_ptr< SymbolicExpr > riemann_curvature_tensor_with_inverse(const std::shared_ptr< SymbolicExpr > &g_ij, const std::shared_ptr< SymbolicExpr > &g_up_ij, const std::vector< std::string > &coords, int rho, int sigma, int mu, int nu, ComputationContext &context)

引用了 context, dim, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive, InternalInvariant, metric_inverse_checked(), ResourceLimit, riemann_curvature_tensor_checked(), riemann_curvature_tensor_with_inverse() , 以及 LMCAS::Result< T >::value().

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

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

◆ riemann_curvature_tensor_with_inverse()

std::shared_ptr< SymbolicExpr > LMCAS::riemann_curvature_tensor_with_inverse ( const std::shared_ptr< SymbolicExpr > & g_ij,
const std::shared_ptr< SymbolicExpr > & g_up_ij,
const std::vector< std::string > & coords,
int rho,
int sigma,
int mu,
int nu,
ComputationContext & context )
static

在文件 differential_geometry.cpp 第 534 行定义.

538 {
539
540 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
541 (context).limits().max_ast_nodes, "transform");
542 auto gamma_rho_nu_sigma =
543 christoffel_second_kind_impl(g_ij, g_up_ij, coords, rho, nu, sigma, context);
544 auto gamma_rho_mu_sigma =
545 christoffel_second_kind_impl(g_ij, g_up_ij, coords, rho, mu, sigma, context);
546
547 auto term1 = detail::make_expression_ptr(detail::differentiate_node(detail::node(gamma_rho_nu_sigma), coords[mu], transform_budget));
548 auto term2 = detail::make_expression_ptr(detail::differentiate_node(detail::node(gamma_rho_mu_sigma), coords[nu], transform_budget));
549 auto result = SymbolicExpr::add(
550 term1,
551 SymbolicExpr::multiply(term2, SymbolicExpr::number(-1)));
552
553 for (std::size_t lambda = 0; lambda < coords.size(); ++lambda) {
554 auto gamma_rho_mu_lambda =
555 christoffel_second_kind_impl(g_ij, g_up_ij, coords, rho, mu, lambda, context);
556 auto gamma_lambda_nu_sigma =
557 christoffel_second_kind_impl(g_ij, g_up_ij, coords, lambda, nu, sigma, context);
558 auto gamma_rho_nu_lambda =
559 christoffel_second_kind_impl(g_ij, g_up_ij, coords, rho, nu, lambda, context);
560 auto gamma_lambda_mu_sigma =
561 christoffel_second_kind_impl(g_ij, g_up_ij, coords, lambda, mu, sigma, context);
562 auto product_difference = SymbolicExpr::add(
563 SymbolicExpr::multiply(
564 gamma_rho_mu_lambda, gamma_lambda_nu_sigma),
565 SymbolicExpr::multiply(
566 SymbolicExpr::multiply(
567 gamma_rho_nu_lambda, gamma_lambda_mu_sigma),
568 SymbolicExpr::number(-1)));
569 result = SymbolicExpr::add(result, product_difference);
570 }
571 return detail::make_expression_ptr(detail::normalize_node(detail::node(result), transform_budget));
572}

引用了 christoffel_second_kind_impl(), context, LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 riemann_curvature_tensor_with_inverse().

被这些函数引用 riemann_curvature_tensor_checked() , 以及 riemann_curvature_tensor_with_inverse().

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

◆ root_less_than()

bool LMCAS::detail::inequality_support::root_less_than ( const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context )

在文件 inequality_solver_ordering.cpp 第 99 行定义.

100 {
101 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
102 (context).limits().max_ast_nodes, "transform");
103 if (!a || !b) {
104 return false;
105 }
108 if (va && vb) {
109 return *va < *vb;
110 }
111 auto diff = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(a, SymbolicExpr::multiply(b, SymbolicExpr::number(-1)))), transform_budget));
112 if (auto vd = try_checked_numeric_constant(*diff, context)) {
113 return *vd < 0;
114 }
115 return root_expression_sign(diff, context) < 0;
116}
int root_expression_sign(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)
std::optional< double > try_checked_numeric_constant(const SymbolicExpr &expr, ComputationContext &context)

◆ rootof_evaluate_checked() [1/2]

RootOfEvaluationResult LMCAS::rootof_evaluate_checked ( const std::shared_ptr< SymbolicExpr > & rootof_expr)

在文件 root_of_identity.cpp 第 168 行定义.

169 {
171 return rootof_evaluate_checked(rootof_expr, context);
172}
RootOfEvaluationResult rootof_evaluate_checked(const std::shared_ptr< SymbolicExpr > &rootof_expr, ComputationContext &context)

引用了 context , 以及 rootof_evaluate_checked().

函数调用图:

◆ rootof_evaluate_checked() [2/2]

RootOfEvaluationResult LMCAS::rootof_evaluate_checked ( const std::shared_ptr< SymbolicExpr > & rootof_expr,
ComputationContext & context )

在文件 root_of_identity.cpp 第 152 行定义.

155{
156 constexpr const char* operation = "rootof_evaluate";
157 auto request = parse_rootof_request(rootof_expr, context, operation);
158 if (!request) return RootOfEvaluationResult::failure(request.error());
159 auto evaluated = detail::evaluate_root_real(
160 request.value()->exact_id(),
162 if (!evaluated) {
163 return RootOfEvaluationResult::failure(evaluated.error());
164 }
165 return RootOfEvaluationResult::success(evaluated.value().value);
166}
Result< ApproxReal > evaluate_root_real(const ExactRootId &root, const NumericEvaluationOptions &options, ComputationContext &context)

引用了 context, LMCAS::detail::evaluate_root_real(), LMCAS::Result< lmmc_real_t >::failure(), rootof_evaluate_checked() , 以及 LMCAS::Result< lmmc_real_t >::success().

被这些函数引用 LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_root(), LMCAS::detail::NumericEvaluator::root(), rootof_evaluate_checked() , 以及 rootof_evaluate_checked().

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

◆ rootof_evaluate_complex_checked() [1/2]

RootOfComplexEvaluationResult LMCAS::rootof_evaluate_complex_checked ( const std::shared_ptr< SymbolicExpr > & rootof_expr)

在文件 root_of_identity.cpp 第 187 行定义.

188 {
190 return rootof_evaluate_complex_checked(rootof_expr, context);
191}
RootOfComplexEvaluationResult rootof_evaluate_complex_checked(const std::shared_ptr< SymbolicExpr > &rootof_expr, ComputationContext &context)

引用了 context , 以及 rootof_evaluate_complex_checked().

函数调用图:

◆ rootof_evaluate_complex_checked() [2/2]

RootOfComplexEvaluationResult LMCAS::rootof_evaluate_complex_checked ( const std::shared_ptr< SymbolicExpr > & rootof_expr,
ComputationContext & context )

在文件 root_of_identity.cpp 第 174 行定义.

176 {
177 constexpr const char* operation = "rootof_evaluate_complex";
178 auto request = parse_rootof_request(rootof_expr, context, operation);
179 if (!request) {
180 return RootOfComplexEvaluationResult::failure(request.error());
181 }
183 request.value()->exact_id(),
184 detail::NumericEvaluationOptions{}, context);
185}
Result< ApproxComplex > evaluate_root_complex(const ExactRootId &root, const NumericEvaluationOptions &options, ComputationContext &context)

引用了 context, LMCAS::detail::evaluate_root_complex(), LMCAS::Result< ApproxComplex >::failure() , 以及 rootof_evaluate_complex_checked().

被这些函数引用 LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_root(), rootof_evaluate_complex_checked() , 以及 rootof_evaluate_complex_checked().

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

◆ rootof_simplify()

std::shared_ptr< SymbolicExpr > LMCAS::rootof_simplify ( const std::shared_ptr< SymbolicExpr > & rootof_expr)

在文件 root_of_utils.cpp 第 71 行定义.

73{
75 if (!rootof_expr || !LMCAS::detail::node(rootof_expr)) return rootof_expr;
76
77 auto root = std::dynamic_pointer_cast<const RootOfNode>(
78 LMCAS::detail::node(rootof_expr));
79 if (!root) return rootof_expr;
80
81 const std::string& var = root->variable();
82 const int k = static_cast<int>(root->index());
83 std::vector<SymbolicPolyCoeff> coefficients;
84 coefficients.reserve(root->exact_id().polynomial.coeffs.size());
85 for (const auto& coefficient : root->exact_id().polynomial.coeffs) {
86 coefficients.emplace_back(SymbolicExpr::number(coefficient));
87 }
88 Polynomial<SymbolicPolyCoeff> sym_poly(coefficients, var);
89
90 int degree = sym_poly.degree();
91 if (degree <= 0) return rootof_expr;
92
93 if (k < 0 || k >= degree) {
94 return rootof_expr;
95 }
96
97 if (degree == 1) {
98 auto roots = solve_closed_form_from_poly(sym_poly, var, context);
99 return roots.size() == 1 ? roots.front() : rootof_expr;
100 }
101 if (degree == 2) {
102 auto roots = solve_closed_form_from_poly(sym_poly, var, context);
103 if (roots.size() != 2) return rootof_expr;
104 return roots[static_cast<std::size_t>(1 - k)];
105 }
106
107 return rootof_expr;
108}
static std::vector< std::shared_ptr< SymbolicExpr > > solve_closed_form_from_poly(const Polynomial< SymbolicPolyCoeff > &poly, const std::string &var, ComputationContext &context)

引用了 context, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::detail::node(), rootof_simplify(), roots() , 以及 solve_closed_form_from_poly().

被这些函数引用 LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::apply_root_representation_policy(), asymptote_candidates(), calculus_utils_extract_real_candidate(), explicit_inverse_candidates() , 以及 rootof_simplify().

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

◆ roots() [1/2]

ExprSetResult LMCAS::roots ( const ExprPtr & expression,
const std::string & variable,
ComputationContext & context,
const SolveOptions & options )

在文件 expr_solving.cpp 第 80 行定义.

83 {
84 return project_finite_expr_set(expression, variable, context, options);
85}
static ExprSetResult project_finite_expr_set(const ExprPtr &original, const std::string &variable, ComputationContext &context, const SolveOptions &options)

引用了 context, options, project_finite_expr_set(), roots() , 以及 variable.

被这些函数引用 LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::append_exact_factor_roots(), LMCAS::detail::inequality_support::append_verified_roots(), build_euler_solution(), build_homogeneous_solution(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::cauchy_index_on_edge(), LMCAS::ExpandVisitor::check_child_count(), LMCAS::ode_root_detail::anonymous_namespace{ode_characteristic_roots.cpp}::classify_characteristic_roots(), collect_exact_solutions(), LMCAS::detail::definite::collect_predicate_roots(), deduplicate_roots(), LMCAS::detail::definite::definite_partition_checked(), deflate_rational_root(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::edge_is_clear(), exact_factor_roots(), LMCAS::polynomial_solver_detail::exact_polynomial_roots(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::exact_polynomial_sign_intervals(), factor_rational_univariate(), factor_variable_rational_roots(), LMCAS::ode_root_detail::find_characteristic_roots(), find_rational_roots(), LMCAS::detail::inequality_support::find_roots_with_multiplicity(), LMCAS::detail::isolate_exact_root(), LMCAS::detail::isolate_exact_roots(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_rectangles.cpp}::isolate_grid_row(), LMCAS::detail::complex_root::isolate_nonreal_roots(), linear2_root_basis(), matrix_eigenvalues_checked(), LMCAS::detail::mixed_numerical_path(), normalization_check_children(), normalization_check_children(), LMCAS::detail::anonymous_namespace{complex_root_isolation.cpp}::order_isolations(), LMCAS::detail::definite::ordered_partition_roots(), LMCAS::detail::definite::polynomial_sign_checked(), LMCAS::ode_root_detail::anonymous_namespace{ode_characteristic_roots.cpp}::quadratic_characteristic_roots(), LMCAS::detail::definite::rational_divergence_checked(), rational_root_factors(), rational_root_product(), LMCAS::anonymous_namespace{integration_rational_factorization.cpp}::rd_factor_piece(), LMCAS::anonymous_namespace{integration_rational_factorization.cpp}::rd_factor_quadratic(), reconstruct_rational_root_factors(), reconstruct_rational_roots(), LMCAS::detail::anonymous_namespace{complex_root_isolation.cpp}::remember_isolations(), rootof_simplify(), roots(), roots(), LMCAS::detail::definite::roots_checked(), LMCAS::detail::inequality_support::select_open_intervals(), singular_frobenius_solution(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::solve(), solve_complex_nth_root_checked(), solve_complex_quadratic_checked(), solve_euler_ode_impl(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::solve_exact_polynomial_inequality_impl(), solve_exact_polynomial_set(), solve_higher_order_ode_impl(), solve_linear2_homogeneous(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::solve_real_quadratic() , 以及 LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::sort_exact_inequality_roots().

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

◆ roots() [2/2]

ExprSetResult LMCAS::roots ( const ExprPtr & expression,
const std::string & variable,
const SolveOptions & options )

在文件 expr_solving.cpp 第 87 行定义.

89 {
91 return roots(expression, variable, context, options);
92}

引用了 context, options, roots() , 以及 variable.

函数调用图:

◆ roots_equal()

bool LMCAS::detail::inequality_support::roots_equal ( const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context )

在文件 inequality_solver_ordering.cpp 第 118 行定义.

119 {
120 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
121 (context).limits().max_ast_nodes, "transform");
122 if (!a || !b) {
123 return false;
124 }
125 auto numeric_a = try_checked_numeric_constant(*a, context);
126 auto numeric_b = try_checked_numeric_constant(*b, context);
127 if (numeric_a && numeric_b) {
128 return *numeric_a == *numeric_b;
129 }
130 auto difference = SymbolicExpr::add(
131 a,
132 SymbolicExpr::multiply(SymbolicExpr::number(-1), b));
133 auto simplified = difference ? detail::make_expression_ptr(detail::normalize_node(detail::node(difference), transform_budget)) : nullptr;
134 return simplified && simplified->is_zero();
135}

◆ round() [1/2]

ExprResult LMCAS::round ( const ExprPtr & expression)

在文件 expr_elementary.cpp 第 194 行定义.

194 {
196 return round(expression, context);
197}
ExprResult round(const ExprPtr &expression, ComputationContext &context)

引用了 context , 以及 round().

函数调用图:

◆ round() [2/2]

ExprResult LMCAS::round ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_elementary.cpp 第 189 行定义.

189 {
190 return make_unary_function_expr(expression, context, "round",
192}
@ Round
四舍五入 round(x)。

引用了 context, LMCAS::expr_detail::expr_common::make_unary_function_expr(), LMCAS::FunctionNode::Round , 以及 round().

被这些函数引用 LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_rectangles.cpp}::refine_projection_interval(), LMCAS::Irrational::EnclosureRound::refine_sign(), round(), round() , 以及 LMCAS::detail::complex_root::anonymous_namespace{complex_root_rectangles.cpp}::separate_projection_intervals().

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

◆ scalar_project()

VectorCalculusExprResult LMCAS::scalar_project ( const VectorField & a,
const VectorField & b )

在文件 vector_calculus_algebra.cpp 第 185 行定义.

185 {
187 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
188 context.limits().max_ast_nodes, "scalar_project");
189 return scalar_project_impl(a, b, transform_budget);
190} catch (const CasError& error) {
192} catch (const std::bad_alloc&) {
194 "vector calculus allocation failed", "scalar_project");
195} catch (const std::length_error& error) {
196 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), "scalar_project");
197} catch (const std::exception& error) {
198 return VectorCalculusExprResult::failure(CasErrc::InternalInvariant, error.what(), "scalar_project");
199}
static VectorCalculusExprResult scalar_project_impl(const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)

引用了 a, b, context, scalar_project() , 以及 scalar_project_impl().

被这些函数引用 scalar_project().

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

◆ scalar_project_impl()

VectorCalculusExprResult LMCAS::scalar_project_impl ( const VectorField & a,
const VectorField & b,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_algebra.cpp 第 84 行定义.

85{
86 auto bb_result = dot_product_impl(b, b, transform_budget);
87 if (!bb_result) return bb_result;
88 auto bb = bb_result.value();
89 if (LMCAS::detail::node(bb) && LMCAS::detail::node(bb)->is_zero()) {
91 }
92 auto ab_result = dot_product_impl(a, b, transform_budget);
93 if (!ab_result) return ab_result;
95 detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(ab_result.value(), SymbolicExpr::sqrt(bb))), transform_budget)));
96}

引用了 a, b, dot_product_impl(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), scalar_project_impl() , 以及 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success().

被这些函数引用 scalar_project() , 以及 scalar_project_impl().

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

◆ scale_integral_field()

detail::SymbolicNodePtr LMCAS::scale_integral_field ( const detail::SymbolicNodePtr & value,
const detail::SymbolicNodePtr & coefficient,
detail::RewriteBudget & budget )
static

在文件 integration_linearity.cpp 第 47 行定义.

49 {
50 detail::RewriteScope scope(&budget);
51 if (const auto* piecewise = dynamic_cast<const PiecewiseNode*>(value.get())) {
52 std::vector<PiecewiseNode::Branch> branches;
53 branches.reserve(piecewise->branches().size());
54 for (const auto& branch : piecewise->branches()) {
55 branches.push_back({scale_integral_field(branch.expression, coefficient, budget),
56 branch.condition});
57 }
58 auto fallback = piecewise->default_expr()
59 ? scale_integral_field(piecewise->default_expr(), coefficient, budget) : nullptr;
60 auto result = detail::make_node<PiecewiseNode>(std::move(branches), fallback);
61 budget.measure(result);
62 return result;
63 }
66}
分段函数节点,表示条件分支表达式.
static detail::SymbolicNodePtr scale_integral_field(const detail::SymbolicNodePtr &value, const detail::SymbolicNodePtr &coefficient, detail::RewriteBudget &budget)

引用了 LMCAS::SymbolicFactory::create_multiply(), LMCAS::detail::make_node(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::normalize_node(), scale_integral_field() , 以及 value.

被这些函数引用 scale_integral_field().

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

◆ separable_product()

bool LMCAS::separable_product ( const MultiplyNode & product,
const std::string & x,
const std::string & y )
static

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

35 {
36 for (const auto& factor : product.operands()) {
37 bool fx = expression_depends_on_variable(factor, x);
38 bool fy = expression_depends_on_variable(factor, y);
39 if (fx && fy) {
40 return false;
41 }
42 }
43 return true;
44}

引用了 expression_depends_on_variable(), LMCAS::MultiplyNode::operands() , 以及 separable_product().

被这些函数引用 is_separable() , 以及 separable_product().

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

◆ separable_reciprocal()

bool LMCAS::separable_reciprocal ( const PowerNode & power,
const std::string & x,
const std::string & y )
static

在文件 ode_classification.cpp 第 46 行定义.

47 {
48 auto exponent = std::dynamic_pointer_cast<const NumberNode>(power.exponent());
49 if (!exponent) {
50 return false;
51 }
53 int equal;
54 lmmc_double_nearly_equal_tol(value, -1.0, 1e-12, 1e-12, &equal);
55 if (!equal) {
56 return false;
57 }
58 bool base_x = expression_depends_on_variable(power.base(), x);
59 bool base_y = expression_depends_on_variable(power.base(), y);
60 return (base_x && !base_y) || (!base_x && base_y);
61}

引用了 LMCAS::PowerNode::base(), e(), exponent, LMCAS::PowerNode::exponent(), expression_depends_on_variable(), LMCAS::detail::make_expression_ptr(), separable_reciprocal(), try_eval_double() , 以及 value.

被这些函数引用 is_separable() , 以及 separable_reciprocal().

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

◆ sequence_extreme_limit()

ExpressionResult LMCAS::sequence_extreme_limit ( const std::shared_ptr< SymbolicExpr > & a_n,
const std::string & n,
bool upper,
ComputationContext & context )
static

在文件 series_sequence_limits.cpp 第 120 行定义.

122 {
123 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
124 (context).limits().max_ast_nodes, "transform");
125 std::shared_ptr<SymbolicExpr> remainder;
126 if (series_extract_alternating(detail::node(a_n), n, remainder)) {
127 return alternating_sequence_bound(remainder, n, upper, context);
128 }
129 auto limited = limit_expression_checked(
130 a_n, n, SymbolicExpr::infinity(),
132 if (!limited) {
133 return limited;
134 }
135 auto limit = std::move(limited.value());
136 auto simplified = limit ? detail::make_expression_ptr(detail::normalize_node(detail::node(limit), transform_budget)) : nullptr;
138 simplified ? std::move(simplified) : std::move(limit));
139} catch (const CasError& error) {
140 return ExpressionResult::failure(error);
141} catch (const std::bad_alloc&) {
142 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "sequence_extreme_limit");
143} catch (const std::length_error& error) {
144 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "sequence_extreme_limit");
145} catch (const std::exception& error) {
146 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "sequence_extreme_limit");
147}
static ExpressionResult alternating_sequence_bound(const std::shared_ptr< SymbolicExpr > &remainder, const std::string &n, bool upper, ComputationContext &context)
static bool series_extract_alternating(const std::shared_ptr< const SymbolicNode > &node, const std::string &n, std::shared_ptr< SymbolicExpr > &remainder)

引用了 alternating_sequence_bound(), Both, context, limit_expression_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), sequence_extreme_limit(), series_extract_alternating(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success() , 以及 upper.

被这些函数引用 lim_inf_checked(), lim_sup_checked() , 以及 sequence_extreme_limit().

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

◆ series_abs()

std::shared_ptr< SymbolicExpr > LMCAS::series_abs ( const std::shared_ptr< SymbolicExpr > & expr,
ComputationContext & context )
static

在文件 series_sequence_limits.cpp 第 67 行定义.

67 {
68
69 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
70 (context).limits().max_ast_nodes, "transform");
71 if (!expr) {
72 return nullptr;
73 }
75 std::vector<std::shared_ptr<const SymbolicNode>>{LMCAS::detail::node(expr)}), transform_budget));
76}

引用了 LMCAS::FunctionNode::Abs, context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 series_abs().

被这些函数引用 alternating_sequence_bound() , 以及 series_abs().

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

◆ series_extract_alternating()

bool LMCAS::series_extract_alternating ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & n,
std::shared_ptr< SymbolicExpr > & remainder )
static

在文件 series_sequence_limits.cpp 第 46 行定义.

48 {
49 if (is_alternating_factor(node, n)) {
50 remainder = SymbolicExpr::number(1);
51 return true;
52 }
53 auto product = std::dynamic_pointer_cast<const MultiplyNode>(node);
54 if (!product) {
55 return false;
56 }
57 for (size_t i = 0; i < product->operands().size(); ++i) {
58 if (is_alternating_factor(product->operands()[i], n)) {
59 remainder = product_without_factor(*product, i);
60 return true;
61 }
62 }
63 return false;
64}
static std::shared_ptr< SymbolicExpr > product_without_factor(const MultiplyNode &product, size_t omitted)
static bool is_alternating_factor(const std::shared_ptr< const SymbolicNode > &node, const std::string &n)

引用了 is_alternating_factor(), product_without_factor() , 以及 series_extract_alternating().

被这些函数引用 sequence_extreme_limit() , 以及 series_extract_alternating().

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

◆ series_get_double()

double LMCAS::detail::series_support::series_get_double ( const std::shared_ptr< SymbolicExpr > & expression)

在文件 series_convergence.cpp 第 33 行定义.

33 {
34 if (!expr || !LMCAS::detail::node(expr)) {
35 return 0.0;
36 }
37 auto num = std::dynamic_pointer_cast<const NumberNode>(LMCAS::detail::node(expr));
38 if (!num) {
39 return 0.0;
40 }
41 return series_number_value(*num);
42}
double series_number_value(const NumberNode &number)

◆ series_index_variable()

bool LMCAS::series_index_variable ( const std::shared_ptr< const VariableNode > & variable,
const std::string & index_var )
static

在文件 series_convergence.cpp 第 72 行定义.

73 {
74 return variable && !variable->is_constant() && variable->name() == index_var;
75}

引用了 series_index_variable() , 以及 variable.

被这些函数引用 coefficient_power_radius() , 以及 series_index_variable().

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

◆ series_is_infinity() [1/2]

bool LMCAS::detail::series_support::series_is_infinity ( const std::shared_ptr< SymbolicExpr > & expression)

在文件 series_convergence.cpp 第 44 行定义.

44 {
45 if (!expr || !LMCAS::detail::node(expr)) {
46 return false;
47 }
48 auto func = std::dynamic_pointer_cast<const FunctionNode>(LMCAS::detail::node(expr));
49 if (func && func->type() == FunctionNode::FuncType::Infinity) {
50 return true;
51 }
52 if (series_is_number(expr)) {
53 return std::isinf(series_get_double(expr));
54 }
55 return false;
56}
bool series_is_number(const std::shared_ptr< SymbolicExpr > &expression)
double series_get_double(const std::shared_ptr< SymbolicExpr > &expression)

被这些函数引用 alternating_sequence_bound().

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

◆ series_is_infinity() [2/2]

bool LMCAS::detail::series_support::series_is_infinity ( const std::shared_ptr< SymbolicExpr > & expression)

在文件 series_convergence.cpp 第 44 行定义.

44 {
45 if (!expr || !LMCAS::detail::node(expr)) {
46 return false;
47 }
48 auto func = std::dynamic_pointer_cast<const FunctionNode>(LMCAS::detail::node(expr));
49 if (func && func->type() == FunctionNode::FuncType::Infinity) {
50 return true;
51 }
52 if (series_is_number(expr)) {
53 return std::isinf(series_get_double(expr));
54 }
55 return false;
56}

◆ series_is_number()

bool LMCAS::detail::series_support::series_is_number ( const std::shared_ptr< SymbolicExpr > & expression)

在文件 series_convergence.cpp 第 26 行定义.

26 {
27 if (!expr || !LMCAS::detail::node(expr)) {
28 return false;
29 }
30 return expr->is_number();
31}

◆ series_negate()

std::shared_ptr< SymbolicExpr > LMCAS::series_negate ( const std::shared_ptr< SymbolicExpr > & expr,
ComputationContext & context )
static

在文件 series_sequence_limits.cpp 第 78 行定义.

78 {
79
80 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
81 (context).limits().max_ast_nodes, "transform");
82 if (!expr) {
83 return nullptr;
84 }
85 return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(SymbolicExpr::number(-1), expr)), transform_budget));
86}

引用了 context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 series_negate().

被这些函数引用 alternating_sequence_bound() , 以及 series_negate().

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

◆ series_number_value()

在文件 series_convergence.cpp 第 19 行定义.

19 {
20 if (std::holds_alternative<BigInt>(number.value())) {
21 return std::get<BigInt>(number.value()).to_double();
22 }
23 return std::get<Rational>(number.value()).to_double();
24}

◆ set_eqv_budget()

Result< void > LMCAS::set_eqv_budget ( EqvOptions & options,
std::size_t steps,
std::size_t depth,
std::size_t growth )

在文件 equivalence_options.cpp 第 65 行定义.

68 {
69 EqvOptions candidate = options;
70 candidate.budget.max_rewrite_steps = steps;
71 candidate.budget.max_rewrite_depth = depth;
73 auto valid = equivalence_detail::validate_eqv_options(candidate);
74 if (!valid) {
75 return valid;
76 }
77 options = candidate;
78 return Result<void>::success();
79}
Result< void > validate_eqv_options(const EqvOptions &options)
std::size_t max_rewrite_depth
同时活动的重写及嵌套 visitor 层数,根为第 1 层。
std::size_t std::size_t std::size_t growth
std::size_t max_rewrite_steps
一次证明及 profile 切换共享的重写遍历、候选追加与阶段步数。 形状查询和缓存清空的实际工作计入 ResourceLimits::max_steps。
std::size_t max_node_growth_factor
候选树及未封装孩子列表的规模上限取 context.max_ast_nodes 与原始两输入节点总数乘此因子的较小值。 每次子树引用分别计数;整个证明及 profile 切换共用原始基数。 乘法饱和为 ...

引用了 LMCAS::EqvOptions::budget, depth, growth, LMCAS::EqvBudget::max_node_growth_factor, LMCAS::EqvBudget::max_rewrite_depth, LMCAS::EqvBudget::max_rewrite_steps, options, set_eqv_budget(), steps, LMCAS::Result< T >::success() , 以及 LMCAS::equivalence_detail::validate_eqv_options().

被这些函数引用 set_eqv_budget().

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

◆ set_eqv_profile()

Result< void > LMCAS::set_eqv_profile ( EqvOptions & options,
const std::string & name )

在文件 equivalence_options.cpp 第 55 行定义.

56 {
57 auto profile = eqv_profile_from_name(name);
58 if (!profile) {
59 return Result<void>::failure(profile.error());
60 }
61 options.profile = profile.value();
62 return Result<void>::success();
63}
Result< EqvProfile > eqv_profile_from_name(const std::string &name)

引用了 eqv_profile_from_name(), LMCAS::Result< T >::failure(), name, options, set_eqv_profile() , 以及 LMCAS::Result< T >::success().

被这些函数引用 __attribute__() , 以及 set_eqv_profile().

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

◆ simplify() [1/2]

ExprResult LMCAS::simplify ( const ExprPtr & expression)

在文件 expr_transform.cpp 第 22 行定义.

22 {
24 return simplify(expression, context);
25}
ExprResult simplify(const ExprPtr &expression, ComputationContext &context)

引用了 context , 以及 simplify().

函数调用图:

◆ simplify() [2/2]

ExprResult LMCAS::simplify ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_transform.cpp 第 18 行定义.

18 {
19 return detail::simplify_expression(expression, context);
20}
ExpressionResult simplify_expression(const ExprPtr &expression, ComputationContext &context)

引用了 context, simplify() , 以及 LMCAS::detail::simplify_expression().

被这些函数引用 LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_exponent(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::parse_general_expression(), simplify() , 以及 simplify().

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

◆ simplify_finite_limit()

bool LMCAS::simplify_finite_limit ( std::shared_ptr< SymbolicExpr > & value,
ComputationContext & context )
static

在文件 calculus_asymptotes.cpp 第 317 行定义.

318{
319
320 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
321 (context).limits().max_ast_nodes, "transform");
322 if (value) {
324 }
326}

引用了 LMCAS::calculus_utils_detail::calculus_utils_is_infinity(), context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), simplify_finite_limit() , 以及 value.

被这些函数引用 collect_infinite_asymptotes() , 以及 simplify_finite_limit().

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

◆ simplify_pythagorean_sum()

std::shared_ptr< const SymbolicNode > LMCAS::simplify_pythagorean_sum ( const AddNode & sum,
const std::string & var )
static

在文件 transcendental_pythagorean.cpp 第 141 行定义.

142 {
143 std::vector<std::shared_ptr<const SymbolicNode>> operands;
144 operands.reserve(sum.operands().size());
145 for (const auto& operand : sum.operands()) {
146 operands.push_back(tf_simplify_pythagorean_node(operand, var));
147 }
148 std::vector<bool> consumed(operands.size(), false);
149 std::vector<std::shared_ptr<const SymbolicNode>> result;
150 for (std::size_t i = 0; i < operands.size(); ++i) {
151 if (consumed[i]) {
152 continue;
153 }
154 TrigSquare square;
156 operands[i], square.coefficient, square.type, square.argument)) {
157 result.push_back(operands[i]);
158 continue;
159 }
160 const auto partner = find_complementary_square(operands, consumed, i + 1, square);
161 if (partner == operands.size()) {
162 result.push_back(operands[i]);
163 continue;
164 }
165 consumed[i] = true;
166 consumed[partner] = true;
167 if (square.coefficient) {
168 result.push_back(square.coefficient);
169 } else {
170 result.push_back(LMCAS::detail::make_node<NumberNode>(BigInt(1)));
171 }
172 }
173 if (result.empty()) {
174 return LMCAS::detail::make_node<NumberNode>(BigInt(0));
175 }
176 if (result.size() == 1) {
177 return result[0];
178 }
179 return LMCAS::detail::make_node<AddNode>(std::move(result));
180}
const std::vector< std::shared_ptr< const SymbolicNode > > & operands() const noexcept
static std::size_t find_complementary_square(const std::vector< std::shared_ptr< const SymbolicNode > > &operands, const std::vector< bool > &consumed, std::size_t start, const TrigSquare &square)
static std::shared_ptr< const SymbolicNode > tf_simplify_pythagorean_node(const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
递归化简 a*sin^2(f) + a*cos^2(f) 为 a,系数为 1 时结果为 1。

引用了 LMCAS::TrigSquare::argument, LMCAS::TrigSquare::coefficient, find_complementary_square(), LMCAS::detail::make_node(), LMCAS::AddNode::operands(), simplify_pythagorean_sum(), tf_extract_coeff_trig_squared(), tf_simplify_pythagorean_node() , 以及 LMCAS::TrigSquare::type.

被这些函数引用 simplify_pythagorean_sum() , 以及 tf_simplify_pythagorean_node().

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

◆ sin() [1/2]

ExprResult LMCAS::sin ( const ExprPtr & expression)

在文件 expr_elementary.cpp 第 45 行定义.

45 {
47 return sin(expression, context);
48}
ExprResult sin(const ExprPtr &expression, ComputationContext &context)

引用了 context , 以及 sin().

函数调用图:

◆ sin() [2/2]

ExprResult LMCAS::sin ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_elementary.cpp 第 38 行定义.

38 {
39 auto valid = require_dimensionless(expression, "sin");
40 if (!valid) { return valid; }
41 return make_unary_math_expr(expression, context, "sin",
42 SymbolicExpr::sin);
43}

引用了 context, LMCAS::expr_detail::expr_common::make_unary_math_expr(), LMCAS::expr_detail::expr_common::require_dimensionless() , 以及 sin().

被这些函数引用 LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function(), sin() , 以及 sin().

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

◆ singular_frobenius_solution()

FrobeniusSolutionResult LMCAS::singular_frobenius_solution ( const std::shared_ptr< SymbolicExpr > & p,
const std::shared_ptr< SymbolicExpr > & q,
const std::shared_ptr< SymbolicExpr > & x0,
const std::string & x,
const std::shared_ptr< SymbolicExpr > & x_minus_x0,
FrobeniusSolution result,
ComputationContext & context )
static

在原定义域内确认去心极限有限后约分,提取可去奇点解析延拓的 Taylor 系数。

注解
原乘积未经约分的导数仍含缺失点,不能直接用于系数计算。

在文件 ode_frobenius.cpp 第 324 行定义.

329 {
330 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
331 (context).limits().max_ast_nodes, "transform");
332 auto xp_expr = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(x_minus_x0, p)), transform_budget));
333 auto x2q_expr = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(
334 SymbolicExpr::power(x_minus_x0, SymbolicExpr::number(2)), q)), transform_budget));
335
336 auto P0_result = limit_expression_checked(
337 xp_expr, x, x0, LimitDirection::Both, context);
338 if (!P0_result) {
339 return FrobeniusSolutionResult::failure(P0_result.error());
340 }
341 auto Q0_result = limit_expression_checked(
342 x2q_expr, x, x0, LimitDirection::Both, context);
343 if (!Q0_result) {
344 return FrobeniusSolutionResult::failure(Q0_result.error());
345 }
346 auto P0_expr = std::move(P0_result.value());
347 auto Q0_expr = std::move(Q0_result.value());
348
349 double P0 = P0_expr
350 ? try_eval_double(P0_expr)
351 : std::numeric_limits<double>::quiet_NaN();
352 double Q0 = Q0_expr
353 ? try_eval_double(Q0_expr)
354 : std::numeric_limits<double>::quiet_NaN();
355 if (!std::isfinite(P0) || !std::isfinite(Q0)) {
357 }
358 /**
359 * @brief 在原定义域内确认去心极限有限后约分,提取可去奇点解析延拓的 Taylor 系数。
360 * @note 原乘积未经约分的导数仍含缺失点,不能直接用于系数计算。
361 */
362 xp_expr = detail::make_expression_ptr(detail::normalize_node(detail::node(xp_expr->cancel()), transform_budget));
363 x2q_expr = detail::make_expression_ptr(detail::normalize_node(detail::node(x2q_expr->cancel()), transform_budget));
364
365 auto roots = frobenius_indicial_roots(P0, Q0);
366 if (!roots) {
368 }
369 const double r1 = roots.value().first;
370 result.indicial_roots = {r1, roots.value().second};
371 auto coefficients = singular_taylor_coefficients(
372 xp_expr, x2q_expr, x0, x, result.truncation_order, P0, Q0, context);
373 if (!coefficients) {
374 return FrobeniusSolutionResult::failure(coefficients.error());
375 }
376 auto recurrence = singular_series_recurrence(
377 coefficients.value(), P0, Q0, r1, result.truncation_order);
378 if (!recurrence) {
379 return FrobeniusSolutionResult::failure(recurrence.error());
380 }
381 auto power_prefix = SymbolicExpr::power(x_minus_x0, SymbolicExpr::number(r1));
382 auto series_part = assemble_frobenius_polynomial(recurrence.value(), x_minus_x0);
383 result.series_solution = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(power_prefix, series_part)), transform_budget));
384 return result;
385} catch (const CasError& error) {
387} catch (const std::bad_alloc&) {
388 return FrobeniusSolutionResult::failure(CasErrc::ResourceLimit, "allocation failed", "singular_frobenius_solution");
389} catch (const std::length_error& error) {
390 return FrobeniusSolutionResult::failure(CasErrc::ResourceLimit, error.what(), "singular_frobenius_solution");
391} catch (const std::exception& error) {
392 return FrobeniusSolutionResult::failure(CasErrc::InternalInvariant, error.what(), "singular_frobenius_solution");
393}
static Result< std::vector< double > > singular_series_recurrence(const OdeTaylorCoefficients &coefficients, double P0, double Q0, double r1, int order)
static Result< std::pair< double, double > > frobenius_indicial_roots(double P0, double Q0)
static Result< OdeTaylorCoefficients > singular_taylor_coefficients(const std::shared_ptr< SymbolicExpr > &xp_expr, const std::shared_ptr< SymbolicExpr > &x2q_expr, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, int order, double P0, double Q0, ComputationContext &context)

引用了 assemble_frobenius_polynomial(), Both, context, LMCAS::Result< T >::error(), LMCAS::Result< FrobeniusSolution >::failure(), frobenius_indicial_roots(), frobenius_unsupported_numeric(), LMCAS::FrobeniusSolution::indicial_roots, limit_expression_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), roots(), LMCAS::FrobeniusSolution::series_solution, singular_frobenius_solution(), singular_series_recurrence(), singular_taylor_coefficients(), LMCAS::FrobeniusSolution::truncation_order, try_eval_double() , 以及 LMCAS::Result< T >::value().

被这些函数引用 singular_frobenius_solution() , 以及 solve_frobenius_impl().

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

◆ singular_series_recurrence()

Result< std::vector< double > > LMCAS::singular_series_recurrence ( const OdeTaylorCoefficients & coefficients,
double P0,
double Q0,
double r1,
int order )
static

递推 a_n = -1/F(r1+n) * ∑_{k=0}^{n-1} [(r1+k)·p_{n-k} + q_{n-k}]·a_k。

注解
F(s) = s(s-1) + P₀·s + Q₀。

在文件 ode_frobenius.cpp 第 249 行定义.

251 {
252 const auto& pn_coeffs = coefficients.p;
253 const auto& qn_coeffs = coefficients.q;
254 /**
255 * @brief 递推 a_n = -1/F(r1+n) * ∑_{k=0}^{n-1} [(r1+k)·p_{n-k} + q_{n-k}]·a_k。
256 * @note F(s) = s(s-1) + P₀·s + Q₀。
257 */
258 auto indicial_poly = [&](double s) -> double {
259 return s * (s - 1.0) + P0 * s + Q0;
260 };
261
262 std::vector<double> a(order + 1, 0.0);
263 a[0] = 1.0;
264
265 for (int n_idx = 1; n_idx <= order; ++n_idx) {
266 double F_val = indicial_poly(r1 + n_idx);
267 if (!std::isfinite(F_val)) {
268 return Result<std::vector<double>>::failure(frobenius_arithmetic_failure());
269 }
270 if (std::abs(F_val) < 1e-15) {
271 a[n_idx] = 0.0;
272 continue;
273 }
274 double sum = 0.0;
275 for (int k = 0; k < n_idx; ++k) {
276 int idx = n_idx - k;
277 if (idx > order) {
278 continue;
279 }
280 double p_term = (idx < static_cast<int>(pn_coeffs.size())) ? pn_coeffs[idx] : 0.0;
281 double q_term = (idx < static_cast<int>(qn_coeffs.size())) ? qn_coeffs[idx] : 0.0;
282 sum += ((r1 + k) * p_term + q_term) * a[k];
283 }
284 a[n_idx] = -sum / F_val;
285 if (!std::isfinite(a[n_idx])) {
287 }
288 }
289
290 return a;
291}

引用了 a, e(), frobenius_arithmetic_failure(), order, LMCAS::OdeTaylorCoefficients::p, LMCAS::OdeTaylorCoefficients::q , 以及 singular_series_recurrence().

被这些函数引用 singular_frobenius_solution() , 以及 singular_series_recurrence().

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

◆ singular_taylor_coefficients()

Result< OdeTaylorCoefficients > LMCAS::singular_taylor_coefficients ( const std::shared_ptr< SymbolicExpr > & xp_expr,
const std::shared_ptr< SymbolicExpr > & x2q_expr,
const std::shared_ptr< SymbolicExpr > & x0,
const std::string & x,
int order,
double P0,
double Q0,
ComputationContext & context )
static

在文件 ode_frobenius.cpp 第 183 行定义.

188 {
189 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
190 (context).limits().max_ast_nodes, "transform");
191 std::vector<double> pn_coeffs(order + 1, 0.0);
192 std::vector<double> qn_coeffs(order + 1, 0.0);
193
194 auto xp_current = xp_expr;
195 auto x2q_current = x2q_expr;
196 double fact = 1.0;
197 for (int k = 0; k <= order; ++k) {
198 if (k > 0) {
199 fact *= k;
200 }
201 double pv, qv;
202 if (k == 0) {
203 pv = P0;
204 qv = Q0;
205 } else {
206 auto pv_expr = detail::make_expression_ptr(detail::substitute_node(detail::node(xp_current), x, detail::node(x0), transform_budget));
207 auto qv_expr = detail::make_expression_ptr(detail::substitute_node(detail::node(x2q_current), x, detail::node(x0), transform_budget));
208 pv = try_eval_double(pv_expr);
209 qv = try_eval_double(qv_expr);
210
211 auto p_limit = frobenius_coefficient_limit(xp_current, x, x0, pv, context);
212 if (!p_limit) {
213 return Result<OdeTaylorCoefficients>::failure(p_limit.error());
214 }
215 pv = p_limit.value();
216 auto q_limit = frobenius_coefficient_limit(x2q_current, x, x0, qv, context);
217 if (!q_limit) {
218 return Result<OdeTaylorCoefficients>::failure(q_limit.error());
219 }
220 qv = q_limit.value();
221 }
222 if (!std::isfinite(pv) || !std::isfinite(qv)) {
224 }
225 pn_coeffs[k] = pv / fact;
226 qn_coeffs[k] = qv / fact;
227
228 xp_current = detail::make_expression_ptr(detail::differentiate_node(detail::node(xp_current), x, transform_budget));
229 x2q_current = detail::make_expression_ptr(detail::differentiate_node(detail::node(x2q_current), x, transform_budget));
230 if (!xp_current) {
231 xp_current = SymbolicExpr::number(0);
232 }
233 if (!x2q_current) {
234 x2q_current = SymbolicExpr::number(0);
235 }
236 }
237
238 return OdeTaylorCoefficients{std::move(pn_coeffs), std::move(qn_coeffs)};
239} catch (const CasError& error) {
241} catch (const std::bad_alloc&) {
242 return Result<OdeTaylorCoefficients>::failure(CasErrc::ResourceLimit, "allocation failed", "singular_taylor_coefficients");
243} catch (const std::length_error& error) {
244 return Result<OdeTaylorCoefficients>::failure(CasErrc::ResourceLimit, error.what(), "singular_taylor_coefficients");
245} catch (const std::exception& error) {
246 return Result<OdeTaylorCoefficients>::failure(CasErrc::InternalInvariant, error.what(), "singular_taylor_coefficients");
247}
static Result< double > frobenius_coefficient_limit(const std::shared_ptr< SymbolicExpr > &coefficient, const std::string &x, const std::shared_ptr< SymbolicExpr > &x0, double value, ComputationContext &context)

引用了 context, LMCAS::detail::differentiate_node(), LMCAS::Result< T >::failure(), frobenius_coefficient_limit(), frobenius_unsupported_numeric(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), order, singular_taylor_coefficients(), LMCAS::detail::substitute_node() , 以及 try_eval_double().

被这些函数引用 singular_frobenius_solution() , 以及 singular_taylor_coefficients().

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

◆ skew_lines_distance_checked() [1/2]

ExpressionResult LMCAS::skew_lines_distance_checked ( const LineSymbolic & l1,
const LineSymbolic & l2 )

在文件 symbolic_geometry_line.cpp 第 172 行定义.

175 {
178}
__attribute__((visibility("default"))) ExpressionResult point_plane_distance_checked(const std __attribute__((visibility("default"))) ExpressionResult point_plane_distance_checked(const std const LineSymbolic & l2
ExpressionResult skew_lines_distance_checked(const LineSymbolic &l1, const LineSymbolic &l2, ComputationContext &context)

引用了 context, l2 , 以及 skew_lines_distance_checked().

函数调用图:

◆ skew_lines_distance_checked() [2/2]

ExpressionResult LMCAS::skew_lines_distance_checked ( const LineSymbolic & l1,
const LineSymbolic & l2,
ComputationContext & context )

在文件 symbolic_geometry_line.cpp 第 93 行定义.

97 {
98 const std::string operation = "skew_lines_distance";
99 try {
100 auto l1_valid = validate_line_checked(l1, context, operation);
101 if (!l1_valid) {
102 return ExpressionResult::failure(l1_valid.error());
103 }
104 auto l2_valid = validate_line_checked(l2, context, operation);
105 if (!l2_valid) {
106 return ExpressionResult::failure(l2_valid.error());
107 }
108 auto step = context.consume_steps(8, operation);
109 if (!step) {
110 return ExpressionResult::failure(step.error());
111 }
112
113 std::vector<double> direction1_values;
114 std::vector<double> direction2_values;
115 auto scale1 = numeric_vector_scale_checked(
116 l1.direction, context, operation, &direction1_values);
117 if (!scale1) {
118 return ExpressionResult::failure(scale1.error());
119 }
120 auto scale2 = numeric_vector_scale_checked(
121 l2.direction, context, operation, &direction2_values);
122 if (!scale2) {
123 return ExpressionResult::failure(scale2.error());
124 }
125
126 std::vector<std::shared_ptr<SymbolicExpr>> direction1;
127 std::vector<std::shared_ptr<SymbolicExpr>> direction2;
128 direction1.reserve(3);
129 direction2.reserve(3);
130 for (size_t i = 0; i < 3; ++i) {
131 direction1.push_back(SymbolicExpr::number(
132 direction1_values[i] / scale1.value()));
133 direction2.push_back(SymbolicExpr::number(
134 direction2_values[i] / scale2.value()));
135 }
136
137 std::vector<double> point1_values;
138 std::vector<double> point2_values;
139 auto difference_scale = point_difference_scale_checked(
140 l1.point, l2.point, context, operation, point1_values, point2_values);
141 if (!difference_scale) {
142 return ExpressionResult::failure(difference_scale.error());
143 }
144 const double point_scale = difference_scale.value();
145
146 std::vector<std::shared_ptr<SymbolicExpr>> a2_minus_a1;
147 a2_minus_a1.reserve(3);
148 for (size_t i = 0; i < l1.point.size(); ++i) {
149 if (point_scale != 0.0) {
150 a2_minus_a1.push_back(SymbolicExpr::number(
151 point2_values[i] / point_scale -
152 point1_values[i] / point_scale));
153 continue;
154 }
155 a2_minus_a1.push_back(SymbolicExpr::add(
156 l2.point[i],
157 SymbolicExpr::multiply(
158 SymbolicExpr::number(-1), l1.point[i])));
159 }
161 direction1, direction2, a2_minus_a1, point_scale, context, operation);
162 } catch (const std::bad_alloc&) {
164 "vector geometry allocation failed",
165 operation);
166 } catch (const std::exception& e) {
168 e.what(), operation);
169 }
170}
ExpressionResult skew_distance_from_directions(const std::vector< std::shared_ptr< SymbolicExpr > > &direction1, const std::vector< std::shared_ptr< SymbolicExpr > > &direction2, const std::vector< std::shared_ptr< SymbolicExpr > > &difference, double point_scale, ComputationContext &context, const std::string &operation)
Result< double > point_difference_scale_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &p1, const std::vector< std::shared_ptr< SymbolicExpr > > &p2, ComputationContext &context, const std::string &operation, std::vector< double > &p1_values, std::vector< double > &p2_values)

引用了 context, LMCAS::LineSymbolic::direction, e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, l2, LMCAS::geometry_detail::numeric_vector_scale_checked(), LMCAS::LineSymbolic::point, ResourceLimit, skew_lines_distance_checked() , 以及 LMCAS::geometry_detail::validate_line_checked().

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

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

◆ skip_ws()

size_t LMCAS::skip_ws ( const std::string & str,
size_t pos )
static

在文件 interval_serialization.cpp 第 69 行定义.

69 {
70 while (pos < str.size() && std::isspace(static_cast<unsigned char>(str[pos]))) {
71 ++pos;
72 }
73 return pos;
74}

引用了 skip_ws().

被这些函数引用 parse_approximate_atom(), parse_endpoint_value(), parse_interval_lower(), parse_interval_upper(), parse_single_interval() , 以及 skip_ws().

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

◆ solution_is_excluded()

Result< bool > LMCAS::solution_is_excluded ( const std::shared_ptr< SymbolicExpr > & solution,
Domain domain,
const AssumptionContext & ctx,
const std::string & variable,
ComputationContext & context )
static

在文件 solver_assumptions.cpp 第 185 行定义.

188 {
190 if (const auto* root = dynamic_cast<const RootOfNode*>(detail::node(solution).get())) {
191 auto isolated = detail::isolate_exact_root(
192 root->exact_id(), context, "solve_with_assumptions");
193 if (!isolated) return Result<bool>::failure(isolated.error());
194 if (std::holds_alternative<detail::ComplexIsolation>(isolated.value())) {
195 return true;
196 }
197 } else if (solver_detail::contains_imaginary(solution)) {
198 return true;
199 }
200 }
201 if (exact_radical_domain_excludes(detail::node(solution).get(), domain)) {
202 return true;
203 }
204 double value = 0.0;
205 if (!try_get_numeric_value(solution, value)) {
206 return false;
207 }
209 return true;
210 }
212}
static bool try_get_numeric_value(const std::shared_ptr< SymbolicExpr > &expr, double &out_value)
从解表达式提取 double 数值。
Result< RootIsolation > isolate_exact_root(const ExactRootId &root, ComputationContext &context, const std::string &operation)
bool contains_imaginary(const std::shared_ptr< SymbolicExpr > &expression)
static bool exact_radical_domain_excludes(const SymbolicNode *node, Domain domain)
static bool numeric_domain_excludes(double value, Domain domain)
static bool numeric_sign_excludes(double value, const AssumptionContext &ctx, const std::string &variable)
static bool domain_requires_real(Domain domain)

引用了 LMCAS::solver_detail::contains_imaginary(), context, domain, domain_requires_real(), exact_radical_domain_excludes(), LMCAS::Result< T >::failure(), LMCAS::detail::isolate_exact_root(), LMCAS::detail::node(), numeric_domain_excludes(), numeric_sign_excludes(), solution_is_excluded(), value , 以及 variable.

被这些函数引用 solution_is_excluded() , 以及 solve_with_assumptions_impl().

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

◆ solve() [1/2]

ExprSetResult LMCAS::solve ( const ExprPtr & equation,
const std::string & variable,
ComputationContext & context,
const SolveOptions & options )

在文件 expr_solving.cpp 第 94 行定义.

97 {
98 return solve_expr_set(equation, variable, context, options);
99}
ExprSetResult solve_expr_set(const ExprPtr &equation, const std::string &variable, ComputationContext &context, const SolveOptions &options)

引用了 context, options, solve(), solve_expr_set() , 以及 variable.

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

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

◆ solve() [2/2]

ExprSetResult LMCAS::solve ( const ExprPtr & equation,
const std::string & variable,
const SolveOptions & options )

在文件 expr_solving.cpp 第 101 行定义.

103 {
105 return solve(equation, variable, context, options);
106}
ExprSetResult solve(const ExprPtr &equation, const std::string &variable, ComputationContext &context, const SolveOptions &options)

引用了 context, options, solve() , 以及 variable.

函数调用图:

◆ solve_bernoulli_ode_checked() [1/2]

ODESolutionResult LMCAS::solve_bernoulli_ode_checked ( const std::shared_ptr< SymbolicExpr > & P,
const std::shared_ptr< SymbolicExpr > & Q,
int n,
const std::string & x,
const std::string & y )

在文件 ode_first_order.cpp 第 238 行定义.

244{
246 return solve_bernoulli_ode_checked(P, Q, n, x, y, context);
247}
ODESolutionResult solve_bernoulli_ode_checked(const std::shared_ptr< SymbolicExpr > &P, const std::shared_ptr< SymbolicExpr > &Q, int n, const std::string &x, const std::string &y, ComputationContext &context)

引用了 context , 以及 solve_bernoulli_ode_checked().

函数调用图:

◆ solve_bernoulli_ode_checked() [2/2]

ODESolutionResult LMCAS::solve_bernoulli_ode_checked ( const std::shared_ptr< SymbolicExpr > & P,
const std::shared_ptr< SymbolicExpr > & Q,
int n,
const std::string & x,
const std::string & y,
ComputationContext & context )

在文件 ode_first_order.cpp 第 196 行定义.

203{
204 const std::string operation = "solve_bernoulli_ode";
205 auto valid = validate_ode_pair_var_pair(P, Q, x, y, context, operation);
206 if (!valid) {
207 return ODESolutionResult::failure(valid.error());
208 }
209 if (n == 0 || n == 1) {
211 "Bernoulli exponent must not be 0 or 1",
212 operation);
213 }
214 auto step = context.consume_steps(14, operation);
215 if (!step) {
216 return ODESolutionResult::failure(step.error());
217 }
218
219 try {
220 auto solved = solve_bernoulli_ode_impl(P, Q, n, x, y, context);
221 if (!solved) { return solved; }
222 return wrap_ode_solution(std::move(solved.value()), ODEType::Bernoulli, operation);
223 } catch (const CasError& error) {
224 return ODESolutionResult::failure(error);
225 } catch (const std::bad_alloc&) {
227 "Bernoulli ODE allocation failed",
228 operation);
229 } catch (const std::length_error& error) {
230 return ODESolutionResult::failure(CasErrc::ResourceLimit, error.what(), operation);
231 } catch (const std::exception& e) {
233 e.what(),
234 operation);
235 }
236}
static ODESolutionResult solve_bernoulli_ode_impl(const std::shared_ptr< SymbolicExpr > &, const std::shared_ptr< SymbolicExpr > &, int, const std::string &, const std::string &, ComputationContext &context)
ODESolutionResult wrap_ode_solution(ODESolution solution, ODEType expected_method, const std::string &operation)
Result< void > validate_ode_pair_var_pair(const std::shared_ptr< SymbolicExpr > &first, const std::shared_ptr< SymbolicExpr > &second, const std::string &x, const std::string &y, ComputationContext &context, const std::string &operation)

引用了 Bernoulli, context, e(), LMCAS::Result< ODESolution >::failure(), InternalInvariant, InvalidArgument, ResourceLimit, solve_bernoulli_ode_checked(), solve_bernoulli_ode_impl(), validate_ode_pair_var_pair() , 以及 wrap_ode_solution().

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

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

◆ solve_bernoulli_ode_impl()

ODESolutionResult LMCAS::solve_bernoulli_ode_impl ( const std::shared_ptr< SymbolicExpr > & P,
const std::shared_ptr< SymbolicExpr > & Q,
int n,
const std::string & x,
const std::string & ,
ComputationContext & context )
static

Bernoulli 方程: y' + P(x)*y = Q(x)*y^n (n != 0, 1) 令 v = y^(1-n),则 v' = (1-n)*y^(-n)*y' 从原方程: y' = -P(x)*y + Q(x)*y^n 两边乘以 (1-n)*y^(-n): (1-n)*y^(-n)*y' = (1-n)*(-P(x)*y^(1-n) + Q(x)) v' = (1-n)*(-P(x)*v + Q(x)) v' + (1-n)*P(x)*v = (1-n)*Q(x) 这是关于 v 的一阶线性 ODE

线性 ODE 的系数: P_linear = (1-n)*P(x), Q_linear = (1-n)*Q(x)

用积分因子法求解线性 ODE: v' + P_linear*v = Q_linear 积分因子 mu = exp(integralP_linear dx)

回代: v = y^(1-n),所以 y = v^(1/(1-n)) y^(1-n) = v_solution y = v_solution^(1/(1-n))

在文件 ode_first_order.cpp 第 249 行定义.

255{
256
257 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
258 (context).limits().max_ast_nodes, "transform");
259 ODESolution result;
261 result.constants = {"C"};
262
263 /// Bernoulli 方程: y' + P(x)*y = Q(x)*y^n (n != 0, 1)
264 /// 令 v = y^(1-n),则 v' = (1-n)*y^(-n)*y'
265 /// 从原方程: y' = -P(x)*y + Q(x)*y^n
266 /// 两边乘以 (1-n)*y^(-n):
267 /// (1-n)*y^(-n)*y' = (1-n)*(-P(x)*y^(1-n) + Q(x))
268 /// v' = (1-n)*(-P(x)*v + Q(x))
269 /// v' + (1-n)*P(x)*v = (1-n)*Q(x)
270 /// 这是关于 v 的一阶线性 ODE
271
272 int one_minus_n = 1 - n;
273 auto coeff = SymbolicExpr::number(one_minus_n);
274
275 /// 线性 ODE 的系数: P_linear = (1-n)*P(x), Q_linear = (1-n)*Q(x)
276 auto P_linear = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(coeff, P)->cancel()), transform_budget));
277 auto Q_linear = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(coeff, Q)->cancel()), transform_budget));
278
279 /// 用积分因子法求解线性 ODE: v' + P_linear*v = Q_linear
280 /// 积分因子 mu = exp(integralP_linear dx)
281 Integrator integrator;
282 auto integrated_p = integrator.integrate_checked(*P_linear, x, context);
283 if (!integrated_p) { return ODESolutionResult::failure(integrated_p.error()); }
284 auto intP = std::make_shared<SymbolicExpr>(std::move(integrated_p.value()));
286 auto Q_mu = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(Q_linear, mu)->cancel()), transform_budget));
287 auto integrated_q = integrator.integrate_checked(*Q_mu, x, context);
288 if (!integrated_q) { return ODESolutionResult::failure(integrated_q.error()); }
289 auto int_Q_mu = std::make_shared<SymbolicExpr>(std::move(integrated_q.value()));
290
291 auto C_const = SymbolicExpr::variable("C");
292 auto numerator = SymbolicExpr::add(int_Q_mu, C_const);
293 auto v_solution = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(numerator, mu)), transform_budget));
294
295 /// 回代: v = y^(1-n),所以 y = v^(1/(1-n))
296 /// y^(1-n) = v_solution
297 /// y = v_solution^(1/(1-n))
298 auto exponent = SymbolicExpr::divide(
299 SymbolicExpr::number(1),
300 SymbolicExpr::number(one_minus_n));
301 auto y_solution = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::power(v_solution, exponent)), transform_budget));
302
303 result.general_solution = y_solution;
304 return ODESolutionResult::success(std::move(result));
305}
ODEType method_used
使用的求解方法
std::shared_ptr< SymbolicExpr > general_solution
通解表达式
std::vector< std::string > constants
任意常数名称列表 (C1, C2, ...)

引用了 Bernoulli, LMCAS::ODESolution::constants, context, exponent, LMCAS::Result< ODESolution >::failure(), LMCAS::ODESolution::general_solution, integrating_factor_from_antiderivative(), integrator, LMCAS::detail::make_expression_ptr(), LMCAS::ODESolution::method_used, LMCAS::detail::node(), LMCAS::detail::normalize_node(), solve_bernoulli_ode_impl() , 以及 LMCAS::Result< ODESolution >::success().

被这些函数引用 solve_bernoulli_ode_checked() , 以及 solve_bernoulli_ode_impl().

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

◆ solve_biquadratic()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::solve_biquadratic ( const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
const std::shared_ptr< SymbolicExpr > & c,
const std::string & variable )

在文件 solve_polynomial_quadratic.cpp 第 86 行定义.

引用了 a, b, c, context, solve_biquadratic(), LMCAS::polynomial_solver_detail::solve_biquadratic_impl() , 以及 variable.

被这些函数引用 solve_biquadratic().

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

◆ solve_by_factoring()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::solve_by_factoring ( const Polynomial< SymbolicPolyCoeff > & poly,
const std::string & variable )

在文件 solve_polynomial.cpp 第 124 行定义.

125 {
128}

引用了 context, solve_by_factoring(), LMCAS::polynomial_solver_detail::solve_by_factoring_impl() , 以及 variable.

被这些函数引用 solve_by_factoring().

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

◆ solve_closed_form_from_poly()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::solve_closed_form_from_poly ( const Polynomial< SymbolicPolyCoeff > & poly,
const std::string & var,
ComputationContext & context )
static

在文件 root_of_utils.cpp 第 14 行定义.

17{
18
19 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
20 (context).limits().max_ast_nodes, "transform");
21 int deg = poly.degree();
22 if (deg <= 0) return {};
23
24 auto get_coeff = [&](int d) -> std::shared_ptr<SymbolicExpr> {
25 if (d < 0 || d > deg) return SymbolicExpr::number(0);
26 return poly.coeffs[d].val ? poly.coeffs[d].val : SymbolicExpr::number(0);
27 };
28
29 if (deg == 1) {
30
31 auto a = get_coeff(1);
32 auto b = get_coeff(0);
33 auto neg_b = SymbolicExpr::multiply(b, SymbolicExpr::number(-1));
34 return { detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(neg_b, a)), transform_budget)) };
35 } else if (deg == 2) {
36 auto a = get_coeff(2);
37 auto b = get_coeff(1);
38 auto c = get_coeff(0);
39
40 auto b2 = SymbolicExpr::power(b, SymbolicExpr::number(2));
41 auto four_ac = SymbolicExpr::multiply(SymbolicExpr::number(4), SymbolicExpr::multiply(a, c));
42 auto delta = SymbolicExpr::add(b2, SymbolicExpr::multiply(four_ac, SymbolicExpr::number(-1)));
43 auto sqrt_delta = SymbolicExpr::sqrt(delta);
44 auto neg_b = SymbolicExpr::multiply(b, SymbolicExpr::number(-1));
45 auto two_a = SymbolicExpr::multiply(SymbolicExpr::number(2), a);
46
47 auto x1 = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(SymbolicExpr::add(neg_b, sqrt_delta), two_a)), transform_budget));
48 auto x2 = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(SymbolicExpr::add(neg_b, SymbolicExpr::multiply(sqrt_delta, SymbolicExpr::number(-1))), two_a)), transform_budget));
49 return { x1, x2 };
50 } else if (deg == 3) {
51 auto a = get_coeff(3);
52 auto b = get_coeff(2);
53 auto c = get_coeff(1);
54 auto d = get_coeff(0);
55 return solve_cubic(a, b, c, d, var);
56 } else if (deg == 4) {
57 auto a = get_coeff(4);
58 auto b = get_coeff(3);
59 auto c = get_coeff(2);
60 auto d = get_coeff(1);
61 auto e = get_coeff(0);
62 return solve_quartic(a, b, c, d, e, var);
63 }
64
65 return {};
66}
std::vector< std::shared_ptr< SymbolicExpr > > solve_quartic(const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, const std::shared_ptr< SymbolicExpr > &c, const std::shared_ptr< SymbolicExpr > &d, const std::shared_ptr< SymbolicExpr > &e, const std::string &variable)
std::vector< std::shared_ptr< SymbolicExpr > > solve_cubic(const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, const std::shared_ptr< SymbolicExpr > &c, const std::shared_ptr< SymbolicExpr > &d, const std::string &variable)

引用了 a, b, c, LMCAS::Polynomial< CoeffType >::coeffs, context, LMCAS::Polynomial< CoeffType >::degree(), e(), get_coeff(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), solve_closed_form_from_poly(), solve_cubic() , 以及 solve_quartic().

被这些函数引用 rootof_simplify() , 以及 solve_closed_form_from_poly().

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

◆ solve_closed_form_poly()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::solve_closed_form_poly ( const Polynomial< SymbolicPolyCoeff > & poly,
const std::string & var,
ComputationContext & context )
static

在文件 solve_polynomial.cpp 第 14 行定义.

17{
18 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
19 (context).limits().max_ast_nodes, "transform");
20 int deg = poly.degree();
21 if (deg <= 0) return {};
22
23 auto get_coeff = [&](int d) -> std::shared_ptr<SymbolicExpr> {
24 if (d < 0 || d > deg) return SymbolicExpr::number(0);
25 return poly.coeffs[d].val ? poly.coeffs[d].val : SymbolicExpr::number(0);
26 };
27
28 if (deg == 1) {
29 auto a = get_coeff(1);
30 auto b = get_coeff(0);
31 auto neg_b = SymbolicExpr::multiply(b, SymbolicExpr::number(-1));
32 return { detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(neg_b, a)), transform_budget)) };
33 } else if (deg == 2) {
35 } else if (deg == 3) {
37 } else if (deg == 4) {
39 }
40
41 return {};
42}
std::vector< std::shared_ptr< SymbolicExpr > > solve_cubic_impl(const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, const std::shared_ptr< SymbolicExpr > &c, const std::shared_ptr< SymbolicExpr > &d, const std::string &variable, ComputationContext &context)
std::vector< std::shared_ptr< SymbolicExpr > > solve_quartic_impl(const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, const std::shared_ptr< SymbolicExpr > &c, const std::shared_ptr< SymbolicExpr > &d, const std::shared_ptr< SymbolicExpr > &e, const std::string &variable, ComputationContext &context)

引用了 a, b, LMCAS::Polynomial< CoeffType >::coeffs, context, LMCAS::Polynomial< CoeffType >::degree(), get_coeff(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), solve_closed_form_poly(), LMCAS::polynomial_solver_detail::solve_cubic_impl(), LMCAS::polynomial_solver_detail::solve_quadratic_internal() , 以及 LMCAS::polynomial_solver_detail::solve_quartic_impl().

被这些函数引用 append_factor_solutions(), LMCAS::polynomial_solver_detail::solve_by_factoring_impl() , 以及 solve_closed_form_poly().

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

◆ solve_complex_nth_root_checked() [1/2]

ComplexRootsResult LMCAS::solve_complex_nth_root_checked ( std::shared_ptr< SymbolicExpr > c,
int n )

在文件 symbolic_complex.cpp 第 291 行定义.

291 {
293 return solve_complex_nth_root_checked(std::move(c), n, context);
294}
ComplexRootsResult solve_complex_nth_root_checked(std::shared_ptr< SymbolicExpr > c, int n, ComputationContext &context)

引用了 c, context , 以及 solve_complex_nth_root_checked().

函数调用图:

◆ solve_complex_nth_root_checked() [2/2]

ComplexRootsResult LMCAS::solve_complex_nth_root_checked ( std::shared_ptr< SymbolicExpr > c,
int n,
ComputationContext & context )

在文件 symbolic_complex.cpp 第 244 行定义.

245 {
246 auto vc = validate_expr(c, "c", context, kComplexNthRootOperation);
247 if (!vc) return ComplexRootsResult::failure(vc.error());
248 if (n <= 0) {
250 CasErrc::InvalidArgument, "root degree must be positive", kComplexNthRootOperation);
251 }
252 auto budget = context.consume_steps(static_cast<std::size_t>(n) * 8 + 8,
253 kComplexNthRootOperation);
254 if (!budget) return ComplexRootsResult::failure(budget.error());
255
256 const auto number = std::dynamic_pointer_cast<const NumberNode>(detail::node(c));
257 if (!number) {
260 "checked complex nth roots require a real numeric input",
261 kComplexNthRootOperation);
262 }
263
264 return checked_construct<std::vector<ComplexSymbolic>>(
265 [&]() -> ComplexRootsResult {
266 const Rational value = std::holds_alternative<BigInt>(number->value())
267 ? Rational(std::get<BigInt>(number->value()))
268 : std::get<Rational>(number->value());
269 auto radius = SymbolicExpr::power(
270 SymbolicExpr::number(value < Rational(0) ? -value : value),
271 SymbolicExpr::number(Rational(1, n)));
274 std::vector<ComplexSymbolic> roots;
275 roots.reserve(static_cast<std::size_t>(n));
276 for (int k = 0; k < n; ++k) {
277 auto angle = SymbolicExpr::multiply(
278 SymbolicExpr::number(
279 Rational(BigInt(2) * BigInt(k) +
280 BigInt(value < Rational(0) ? 1 : 0), BigInt(n))),
281 pi);
282 auto root = complex_exp_form_checked(radius, angle, context);
283 if (!root) {
284 return ComplexRootsResult::failure(root.error());
285 }
286 roots.push_back(std::move(root.value()));
287 }
288 return roots;
290}
Result< std::vector< ComplexSymbolic > > ComplexRootsResult

引用了 c, complex_exp_form_checked(), context, LMCAS::Result< std::vector< ComplexSymbolic > >::failure(), Inconclusive, InvalidArgument, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), pi(), roots(), solve_complex_nth_root_checked() , 以及 value.

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

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

◆ solve_complex_quadratic_checked() [1/2]

ComplexRootsResult LMCAS::solve_complex_quadratic_checked ( std::shared_ptr< SymbolicExpr > a,
std::shared_ptr< SymbolicExpr > b,
std::shared_ptr< SymbolicExpr > c )

在文件 symbolic_complex.cpp 第 309 行定义.

311 {
314 std::move(a), std::move(b), std::move(c), context);
315}
ComplexRootsResult solve_complex_quadratic_checked(std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b, std::shared_ptr< SymbolicExpr > c, ComputationContext &context)

引用了 a, b, c, context , 以及 solve_complex_quadratic_checked().

函数调用图:

◆ solve_complex_quadratic_checked() [2/2]

ComplexRootsResult LMCAS::solve_complex_quadratic_checked ( std::shared_ptr< SymbolicExpr > a,
std::shared_ptr< SymbolicExpr > b,
std::shared_ptr< SymbolicExpr > c,
ComputationContext & context )

在文件 symbolic_complex.cpp 第 296 行定义.

298 {
301 return checked_construct<std::vector<ComplexSymbolic>>(
302 [&]() -> ComplexRootsResult {
303 return std::vector<ComplexSymbolic>{
304 {std::move(roots.value()[0].real), std::move(roots.value()[0].imag)},
305 {std::move(roots.value()[1].real), std::move(roots.value()[1].imag)}};
307}
Result< CartesianQuadraticRoots > real_quadratic_roots_checked(const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, const std::shared_ptr< SymbolicExpr > &c, ComputationContext &context)

引用了 a, b, c, context, LMCAS::Result< T >::error(), LMCAS::Result< std::vector< ComplexSymbolic > >::failure(), LMCAS::detail::real_quadratic_roots_checked(), roots(), solve_complex_quadratic_checked() , 以及 LMCAS::Result< T >::value().

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

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

◆ solve_constant_inequality()

IntervalUnion LMCAS::solve_constant_inequality ( const Polynomial< SymbolicPolyCoeff > & poly,
InequalityType type,
ComputationContext & context )
static

在文件 inequality_solver.cpp 第 163 行定义.

165 {
166 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
167 (context).limits().max_ast_nodes, "transform");
168 auto lc = poly.lead_coeff().val;
169 if (!lc) {
170 return IntervalUnion::empty();
171 }
172 int sign = exact_numeric_sign(lc, context);
173 if (sign == 0 && !lc->is_zero()) {
174 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(lc), transform_budget));
175 if (!simplified || !simplified->is_zero()) {
176 return IntervalUnion::empty();
177 }
178 }
179
180 bool satisfies = false;
181 switch (type) {
182 case InequalityType::GreaterThan: satisfies = (sign > 0); break;
183 case InequalityType::GreaterEqual: satisfies = (sign >= 0); break;
184 case InequalityType::LessThan: satisfies = (sign < 0); break;
185 case InequalityType::LessEqual: satisfies = (sign <= 0); break;
186 default:
187 return IntervalUnion::empty();
188 }
189 return satisfies ? IntervalUnion::entire_line() : IntervalUnion::empty();
190}
int exact_numeric_sign(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)

引用了 context, LMCAS::detail::inequality_support::exact_numeric_sign(), GreaterEqual, GreaterThan, LMCAS::Polynomial< CoeffType >::lead_coeff(), LessEqual, LessThan, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 solve_constant_inequality().

被这些函数引用 solve_constant_inequality().

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

◆ solve_cubic()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::solve_cubic ( const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
const std::shared_ptr< SymbolicExpr > & c,
const std::shared_ptr< SymbolicExpr > & d,
const std::string & variable )

在文件 solve_polynomial_cubic.cpp 第 211 行定义.

216 {
218 return solve_cubic_impl(a, b, c, d, variable, context);
219}

引用了 a, b, c, context, solve_cubic(), LMCAS::polynomial_solver_detail::solve_cubic_impl() , 以及 variable.

被这些函数引用 solve_closed_form_from_poly() , 以及 solve_cubic().

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

◆ solve_degenerate_cubic()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::solve_degenerate_cubic ( const std::shared_ptr< SymbolicExpr > & b,
const std::shared_ptr< SymbolicExpr > & c,
const std::shared_ptr< SymbolicExpr > & d,
ComputationContext & context )
static

在文件 solve_polynomial_cubic.cpp 第 18 行定义.

20 {
21 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
22 (context).limits().max_ast_nodes, "transform");
23 if (!detail::make_expression_ptr(detail::normalize_node(detail::node(b), transform_budget))->get_number_value_is_zero()) {
25 }
26 if (!detail::make_expression_ptr(detail::normalize_node(detail::node(c), transform_budget))->get_number_value_is_zero()) {
27 return {detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(negate(d), c)), transform_budget))};
28 }
29 auto constant = detail::make_expression_ptr(detail::normalize_node(detail::node(d), transform_budget));
30 if (constant->get_number_value_is_zero()) {
31 throw std::invalid_argument(
32 "solve_cubic: identically zero equation has no finite root list");
33 }
34 if (is_purely_numeric(constant)) return {};
35 throw std::invalid_argument(
36 "solve_cubic: equation is independent of the requested variable");
37}
std::shared_ptr< SymbolicExpr > negate(const std::shared_ptr< SymbolicExpr > &expr)
bool is_purely_numeric(const std::shared_ptr< SymbolicExpr > &expr)

引用了 b, c, context, LMCAS::polynomial_solver_detail::is_purely_numeric(), LMCAS::detail::make_expression_ptr(), LMCAS::polynomial_solver_detail::negate(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), solve_degenerate_cubic() , 以及 LMCAS::polynomial_solver_detail::solve_quadratic_internal().

被这些函数引用 LMCAS::polynomial_solver_detail::solve_cubic_impl() , 以及 solve_degenerate_cubic().

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

◆ solve_diophantine_pair()

std::vector< MultiPoly > LMCAS::solve_diophantine_pair ( const std::vector< MultiPoly > & factors,
const MultiPoly & target,
const std::string & var,
const Rational & eval_point,
int degree_bound )
static

用 target/gcd 缩放 Bézout 系数,兼容 gcd 非 1 的情形。 互素因子的 gcd 为 1;s_1 = s*(target/gcd),s_2 = t*(target/gcd)。

按 f_2、f_1 约化系数并保持 s_1*f_1 + s_2*f_2 = target。 次数约束为 deg(s_1) < deg(f_2)、deg(s_2) < deg(f_1)。

在文件 multivariate_hensel.cpp 第 451 行定义.

453 {
454 const auto& vars = factors[0].variables();
455 Polynomial<Rational> f1_uni, f2_uni;
456 if (!diophantine_univariate_factors(factors, var, eval_point,
457 f1_uni, f2_uni)) {
458 return {MultiPoly(Rational(0), vars), MultiPoly(Rational(0), vars)};
459 }
460 Polynomial<Rational> s_coeff, t_coeff;
461 Polynomial<Rational> g = extended_gcd_poly(f1_uni, f2_uni, s_coeff, t_coeff);
462
463 Polynomial<Rational> target_uni;
464 if (!diophantine_target(target, var, eval_point,
465 f1_uni.variable_name, target_uni)) {
466 return {MultiPoly(Rational(0), vars), MultiPoly(Rational(0), vars)};
467 }
468
469
470 /**
471 * @brief 用 target/gcd 缩放 Bézout 系数,兼容 gcd 非 1 的情形。
472 * 互素因子的 gcd 为 1;s_1 = s*(target/gcd),s_2 = t*(target/gcd)。
473 */
475 if (g.is_zero() || g.degree() < 0) {
476 return {MultiPoly(Rational(0), vars), MultiPoly(Rational(0), vars)};
477 }
478
479 auto [quotient, remainder] = target_uni.div_mod(g);
480 if (!remainder.is_zero()) {
481 return {MultiPoly(Rational(0), vars), MultiPoly(Rational(0), vars)};
482 }
483
484 Polynomial<Rational> s1_uni = s_coeff * quotient;
485 Polynomial<Rational> s2_uni = t_coeff * quotient;
486
487 /**
488 * @brief 按 f_2、f_1 约化系数并保持 s_1*f_1 + s_2*f_2 = target。
489 * 次数约束为 deg(s_1) < deg(f_2)、deg(s_2) < deg(f_1)。
490 */
491 if (!f2_uni.is_zero() && s1_uni.degree() >= f2_uni.degree()) {
492 auto [q1, r1] = s1_uni.div_mod(f2_uni);
493 s1_uni = r1;
494 s2_uni = s2_uni + q1 * f1_uni;
495 }
496 if (!(s1_uni * f1_uni + s2_uni * f2_uni == target_uni)) { return {}; }
497
498 std::string uni_var = f1_uni.variable_name;
499 MultiPoly s1_mp = embed_hensel_terms(
500 MultiPoly::from_univariate(s1_uni, uni_var), vars);
501 MultiPoly s2_mp = embed_hensel_terms(
502 MultiPoly::from_univariate(s2_uni, uni_var), vars);
503 s1_mp = truncate_mod_var(s1_mp, var, degree_bound);
504 s2_mp = truncate_mod_var(s2_mp, var, degree_bound);
505
506 return {s1_mp, s2_mp};
507}
static bool diophantine_univariate_factors(const std::vector< MultiPoly > &factors, const std::string &var, const Rational &eval_point, Polynomial< Rational > &f1_uni, Polynomial< Rational > &f2_uni)
static Polynomial< Rational > extended_gcd_poly(const Polynomial< Rational > &a, const Polynomial< Rational > &b, Polynomial< Rational > &s, Polynomial< Rational > &t)
一元多项式扩展 GCD(有理数域上)
static bool diophantine_target(const MultiPoly &target, const std::string &var, const Rational &eval_point, const std::string &main_var, Polynomial< Rational > &target_uni)

引用了 LMCAS::Polynomial< CoeffType >::degree(), diophantine_target(), diophantine_univariate_factors(), LMCAS::Polynomial< CoeffType >::div_mod(), embed_hensel_terms(), extended_gcd_poly(), LMCAS::Polynomial< CoeffType >::is_zero(), solve_diophantine_pair(), target, truncate_mod_var(), LMCAS::Polynomial< CoeffType >::variable_name , 以及 vars.

被这些函数引用 multivariate_diophantine() , 以及 solve_diophantine_pair().

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

◆ solve_equation() [1/2]

LMCAS::SolveResult LMCAS::solve_equation ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
ComputationContext & context,
const SolveOptions & opts )

在文件 solve_visitor.cpp 第 456 行定义.

460 {
461 constexpr const char* operation = "solve_equation";
462 if (!expr || !LMCAS::detail::node(expr)) {
464 CasErrc::InvalidArgument, "equation expression cannot be null", operation);
465 }
466 if (var.empty()) {
468 CasErrc::InvalidArgument, "solve variable cannot be empty", operation);
469 }
470
471 auto step = context.consume_steps(1, operation);
472 if (!step) {
473 return SolveResult::failure(step.error());
474 }
475
476 std::shared_ptr<SymbolicExpr> f_expr = expr;
477 if (auto relation = std::dynamic_pointer_cast<const RelationalNode>(LMCAS::detail::node(expr))) {
478 if (relation->op() != RelationalNode::Op::EQ) {
481 "solve_equation accepts equations, not inequalities",
482 operation);
483 }
484 auto left = LMCAS::detail::make_expression_ptr(relation->left());
486 f_expr = SymbolicExpr::add(
487 left, SymbolicExpr::multiply(SymbolicExpr::number(-1), right));
488 }
489
490 return dispatch_equation(expr, f_expr, var, context, opts);
491}
492catch (const CasError& error) {
493 return SolveResult::failure(error);
494} catch (const std::bad_alloc&) {
496 "equation solve allocation failed", "solve_equation");
497} catch (const std::length_error& error) {
498 return SolveResult::failure(CasErrc::ResourceLimit, error.what(), "solve_equation");
499} catch (const std::exception& error) {
500 return SolveResult::failure(CasErrc::InternalInvariant, error.what(), "solve_equation");
501}
static SolveResult dispatch_equation(const ExprPtr &expr, const ExprPtr &f_expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)

引用了 context, dispatch_equation(), LMCAS::Result< SolutionSet >::failure(), InvalidArgument, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), relation(), right , 以及 solve_equation().

被这些函数引用 asymptote_candidates(), inflection_points_checked(), inverse_function_checked(), solve_equation(), solve_equation(), solve_finite_checked(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_inner_equation(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::solve_polynomial_factor(), solve_product_factor(), solve_set(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_substitution() , 以及 solve_transcendental().

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

◆ solve_equation() [2/2]

LMCAS::SolveResult LMCAS::solve_equation ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
const SolveOptions & opts )

在文件 solve_visitor.cpp 第 503 行定义.

506 {
508 return solve_equation(expr, var, context, opts);
509}

引用了 context , 以及 solve_equation().

函数调用图:

◆ solve_euler_ode_checked() [1/2]

ODESolutionResult LMCAS::solve_euler_ode_checked ( const std::vector< double > & euler_coeffs,
const std::shared_ptr< SymbolicExpr > & forcing,
const std::string & x,
const std::string & y )

在文件 ode_linear.cpp 第 441 行定义.

446{
448 return solve_euler_ode_checked(euler_coeffs, forcing, x, y, context);
449}
ODESolutionResult solve_euler_ode_checked(const std::vector< double > &euler_coeffs, const std::shared_ptr< SymbolicExpr > &forcing, const std::string &x, const std::string &y, ComputationContext &context)

引用了 context , 以及 solve_euler_ode_checked().

函数调用图:

◆ solve_euler_ode_checked() [2/2]

ODESolutionResult LMCAS::solve_euler_ode_checked ( const std::vector< double > & euler_coeffs,
const std::shared_ptr< SymbolicExpr > & forcing,
const std::string & x,
const std::string & y,
ComputationContext & context )

在文件 ode_linear.cpp 第 369 行定义.

375 {
376 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
377 (context).limits().max_ast_nodes, "transform");
378 const std::string operation = "solve_euler_ode";
379 auto variables = validate_ode_variables(x, y, context, operation);
380 if (!variables) {
381 return ODESolutionResult::failure(variables.error());
382 }
383
384 auto coeff_check = validate_numeric_ode_coefficients(euler_coeffs, 3, 4, operation);
385 if (!coeff_check) {
386 return ODESolutionResult::failure(coeff_check.error());
387 }
388
389 auto budget = context.consume_steps(euler_coeffs.size() * 20 + 20, operation);
390 if (!budget) {
391 return ODESolutionResult::failure(budget.error());
392 }
393
394 const bool nonzero_forcing = has_nonzero_forcing(forcing);
395 if (nonzero_forcing && unsupported_euler_forcing(forcing, euler_coeffs)) {
398 "non-homogeneous Euler ODE currently requires a constant forcing and nonzero y coefficient",
399 operation);
400 }
401
402 try {
403 auto solution_result = solve_euler_ode_impl(
404 euler_coeffs, nullptr, x, y, context);
405 if (!solution_result) {
406 return ODESolutionResult::failure(solution_result.error());
407 }
408 auto solution = std::move(solution_result.value());
409 if (nonzero_forcing && solution.general_solution) {
410 auto particular = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(
411 forcing,
412 SymbolicExpr::number(euler_coeffs.back()))), transform_budget));
413 solution.general_solution = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(
414 solution.general_solution, particular)), transform_budget));
415 }
416 return wrap_ode_solution(
417 std::move(solution),
419 operation);
420 } catch (const std::bad_alloc&) {
423 "allocation failed while solving Euler ODE",
424 operation);
425 } catch (const std::length_error& error) { return ODESolutionResult::failure(CasErrc::ResourceLimit, error.what(), "solve_euler_ode"); } catch (const std::exception& ex) {
428 ex.what(),
429 operation);
430 }
431} catch (const CasError& error) {
432 return ODESolutionResult::failure(error);
433} catch (const std::bad_alloc&) {
434 return ODESolutionResult::failure(CasErrc::ResourceLimit, "allocation failed", "solve_euler_ode");
435} catch (const std::length_error& error) {
436 return ODESolutionResult::failure(CasErrc::ResourceLimit, error.what(), "solve_euler_ode");
437} catch (const std::exception& error) {
438 return ODESolutionResult::failure(CasErrc::InternalInvariant, error.what(), "solve_euler_ode");
439}
static bool has_nonzero_forcing(const std::shared_ptr< SymbolicExpr > &forcing)
Result< void > validate_numeric_ode_coefficients(const std::vector< double > &coefficients, std::size_t minimum_size, std::size_t maximum_size, const std::string &operation)
Result< void > validate_ode_variables(const std::string &x, const std::string &y, ComputationContext &context, const std::string &operation)
static Result< ODESolution > solve_euler_ode_impl(const std::vector< double > &, const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::string &, ComputationContext &context)
static bool unsupported_euler_forcing(const std::shared_ptr< SymbolicExpr > &forcing, const std::vector< double > &coefficients)

引用了 context, Euler, LMCAS::Result< ODESolution >::failure(), has_nonzero_forcing(), Inconclusive, InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), ResourceLimit, solve_euler_ode_checked(), solve_euler_ode_impl(), unsupported_euler_forcing(), validate_numeric_ode_coefficients(), validate_ode_variables() , 以及 wrap_ode_solution().

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

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

◆ solve_euler_ode_impl()

Result< ODESolution > LMCAS::solve_euler_ode_impl ( const std::vector< double > & euler_coeffs,
const std::shared_ptr< SymbolicExpr > & forcing,
const std::string & x,
const std::string & ,
ComputationContext & context )
static

在文件 ode_linear.cpp 第 451 行定义.

456 {
457
458 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
459 (context).limits().max_ast_nodes, "transform");
460 const std::string operation = "solve_euler_ode";
461 ODESolution result;
463
464 if ((euler_coeffs.size() != 3 && euler_coeffs.size() != 4) ||
465 has_nonzero_forcing(forcing)) {
468 "Euler ODE is outside the implemented support domain",
469 operation);
470 }
471
472 std::vector<double> characteristic;
473 if (euler_coeffs.size() == 3) {
474 const double a = euler_coeffs[0];
475 const double b = euler_coeffs[1];
476 const double c = euler_coeffs[2];
477 characteristic = {a, b - a, c};
478 } else {
479 const double a = euler_coeffs[0];
480 const double b = euler_coeffs[1];
481 const double c = euler_coeffs[2];
482 const double d = euler_coeffs[3];
483 characteristic = {a, b - 3.0 * a, 2.0 * a - b + c, d};
484 }
485
486 auto roots = find_characteristic_roots(characteristic, operation);
487 if (!roots) {
489 }
490 result.general_solution =
492 if (result.general_solution) {
494 }
495 return Result<ODESolution>::success(std::move(result));
496} catch (const CasError& error) {
497 return Result<ODESolution>::failure(error);
498} catch (const std::bad_alloc&) {
499 return Result<ODESolution>::failure(CasErrc::ResourceLimit, "allocation failed", "solve_euler_ode");
500} catch (const std::length_error& error) {
501 return Result<ODESolution>::failure(CasErrc::ResourceLimit, error.what(), "solve_euler_ode");
502} catch (const std::exception& error) {
503 return Result<ODESolution>::failure(CasErrc::InternalInvariant, error.what(), "solve_euler_ode");
504}
Result< std::vector< CharRoot > > find_characteristic_roots(const std::vector< double > &coefficients, const std::string &operation)
使用数值方法求解特征多项式的所有根.
static std::shared_ptr< SymbolicExpr > build_euler_solution(const std::vector< CharRoot > &roots, const std::string &x, std::vector< std::string > &constants)

引用了 a, b, build_euler_solution(), c, LMCAS::ODESolution::constants, context, LMCAS::Result< T >::error(), Euler, LMCAS::Result< T >::failure(), LMCAS::ode_root_detail::find_characteristic_roots(), LMCAS::ODESolution::general_solution, has_nonzero_forcing(), Inconclusive, LMCAS::detail::make_expression_ptr(), LMCAS::ODESolution::method_used, LMCAS::detail::node(), LMCAS::detail::normalize_node(), roots(), solve_euler_ode_impl(), LMCAS::Result< T >::success() , 以及 LMCAS::Result< T >::value().

被这些函数引用 solve_euler_ode_checked() , 以及 solve_euler_ode_impl().

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

◆ solve_exact_affine_inequality()

Result< IntervalUnion > LMCAS::detail::inequality_support::solve_exact_affine_inequality ( const Polynomial< Rational > & polynomial,
InequalityType type,
ComputationContext & context )

在文件 inequality_solver_polynomial.cpp 第 463 行定义.

466 {
467 return solve_exact_affine_inequality_impl(polynomial, type, context);
468}

◆ solve_exact_factor()

SolveVectorResult LMCAS::solve_exact_factor ( Polynomial< Rational > remainder,
const std::string & var,
ComputationContext & context )
static

在文件 solve_visitor.cpp 第 371 行定义.

372 {
373 std::vector<ExprPtr> factor_roots;
374 const bool bounded_candidates =
376 if (bounded_candidates) {
377 for (const auto& root : find_rational_roots(remainder)) {
378 Polynomial<Rational> divisor({-root, Rational(1)}, var);
379 auto division = remainder.div_mod(divisor);
380 if (!division.second.is_zero()) { continue; }
381 factor_roots.push_back(SymbolicExpr::number(root));
382 remainder = std::move(division.first);
383 }
384 }
385 if (remainder.degree() == 1) {
386 factor_roots.push_back(SymbolicExpr::number(-remainder.coeffs[0] / remainder.coeffs[1]));
387 } else if (remainder.degree() == 2) {
389 SymbolicExpr::number(remainder.coeffs[2]),
390 SymbolicExpr::number(remainder.coeffs[1]),
391 SymbolicExpr::number(remainder.coeffs[0]), context);
392 if (!quadratic) { return SolveVectorResult::failure(quadratic.error()); }
393 for (const auto& root : quadratic.value()) {
394 factor_roots.push_back(detail::make_expression_ptr(
396 }
397 } else if (remainder.degree() > 2) {
398 auto represented_roots = solve_higher_exact_roots(remainder, var, context);
399 if (!represented_roots) { return SolveVectorResult::failure(represented_roots.error()); }
400 factor_roots.insert(factor_roots.end(), represented_roots.value().begin(), represented_roots.value().end());
401 }
402 return factor_roots;
403}
static SolveVectorResult solve_higher_exact_roots(const Polynomial< Rational > &remainder, const std::string &var, ComputationContext &context)

引用了 LMCAS::polynomial_solver_detail::bounded_rational_root_search(), LMCAS::Polynomial< CoeffType >::coeffs, context, LMCAS::SymbolicFactory::create_complex(), LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Polynomial< CoeffType >::div_mod(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), find_rational_roots(), LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::real_quadratic_roots_checked(), solve_exact_factor() , 以及 solve_higher_exact_roots().

被这些函数引用 solve_exact_factor() , 以及 solve_exact_polynomial_set().

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

◆ solve_exact_ode_checked() [1/2]

ODESolutionResult LMCAS::solve_exact_ode_checked ( const std::shared_ptr< SymbolicExpr > & M,
const std::shared_ptr< SymbolicExpr > & N,
const std::string & x,
const std::string & y )

在文件 ode_first_order.cpp 第 416 行定义.

421{
423 return solve_exact_ode_checked(M, N, x, y, context);
424}
ODESolutionResult solve_exact_ode_checked(const std::shared_ptr< SymbolicExpr > &M, const std::shared_ptr< SymbolicExpr > &N, const std::string &x, const std::string &y, ComputationContext &context)

引用了 context , 以及 solve_exact_ode_checked().

函数调用图:

◆ solve_exact_ode_checked() [2/2]

ODESolutionResult LMCAS::solve_exact_ode_checked ( const std::shared_ptr< SymbolicExpr > & M,
const std::shared_ptr< SymbolicExpr > & N,
const std::string & x,
const std::string & y,
ComputationContext & context )

在文件 ode_first_order.cpp 第 380 行定义.

386{
387 const std::string operation = "solve_exact_ode";
388 auto valid = validate_ode_pair_var_pair(M, N, x, y, context, operation);
389 if (!valid) {
390 return ODESolutionResult::failure(valid.error());
391 }
392 auto step = context.consume_steps(18, operation);
393 if (!step) {
394 return ODESolutionResult::failure(step.error());
395 }
396
397 try {
398 auto solved = solve_exact_ode_impl(M, N, x, y, context);
399 if (!solved) { return solved; }
400 return wrap_ode_solution(std::move(solved.value()), ODEType::Exact, operation);
401 } catch (const CasError& error) {
402 return ODESolutionResult::failure(error);
403 } catch (const std::bad_alloc&) {
405 "exact ODE allocation failed",
406 operation);
407 } catch (const std::length_error& error) {
408 return ODESolutionResult::failure(CasErrc::ResourceLimit, error.what(), operation);
409 } catch (const std::exception& e) {
411 e.what(),
412 operation);
413 }
414}
static ODESolutionResult solve_exact_ode_impl(const std::shared_ptr< SymbolicExpr > &, const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::string &, ComputationContext &context)

引用了 context, e(), Exact, LMCAS::Result< ODESolution >::failure(), InternalInvariant, ResourceLimit, solve_exact_ode_checked(), solve_exact_ode_impl(), validate_ode_pair_var_pair() , 以及 wrap_ode_solution().

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

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

◆ solve_exact_ode_impl()

ODESolutionResult LMCAS::solve_exact_ode_impl ( const std::shared_ptr< SymbolicExpr > & M,
const std::shared_ptr< SymbolicExpr > & N,
const std::string & x,
const std::string & y,
ComputationContext & context )
static

恰当方程: partialF/partialx = M, partialF/partialy = N F(x,y) = integral M dx + g(y) 对 F 关于 y 求导: partialF/partialy = partial/partialy(integral M dx) + g'(y) = N 所以 g'(y) = N - partial/partialy(integral M dx)

步骤 1: 计算 integral M dx(将 y 视为常数)

步骤 2: 对 F_partial 关于 y 求导

步骤 3: g'(y) = N - dF_dy

步骤 4: g(y) = integral g'(y) dy

步骤 5: F(x,y) = F_partial + g(y)

解为 F(x,y) = C

在文件 ode_first_order.cpp 第 426 行定义.

431{
432
433 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
434 (context).limits().max_ast_nodes, "transform");
435 ODESolution result;
437 result.constants = {"C"};
438
439 auto M_eff = M;
440 auto N_eff = N;
441
442 auto factor = find_integrating_factor_impl(M, N, x, y, context);
443 if (!factor) { return ODESolutionResult::failure(factor.error()); }
444 if (!factor.value()) {
445 return ODESolutionResult::success(std::move(result));
446 }
447 auto mu = std::move(factor.value());
448 if (!mu->is_one()) {
449 M_eff = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(mu, M)), transform_budget));
450 N_eff = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(mu, N)), transform_budget));
451 }
452
453 /// 恰当方程: partialF/partialx = M, partialF/partialy = N
454 /// F(x,y) = integral M dx + g(y)
455 /// 对 F 关于 y 求导: partialF/partialy = partial/partialy(integral M dx) + g'(y) = N
456 /// 所以 g'(y) = N - partial/partialy(integral M dx)
457
458 /// 步骤 1: 计算 integral M dx(将 y 视为常数)
459 Integrator integrator;
460 auto integrated_m = integrator.integrate_checked(*M_eff, x, context);
461 if (!integrated_m) { return ODESolutionResult::failure(integrated_m.error()); }
462 auto F_partial = std::make_shared<SymbolicExpr>(std::move(integrated_m.value()));
463
464 /// 步骤 2: 对 F_partial 关于 y 求导
465 auto dF_dy = detail::make_expression_ptr(detail::differentiate_node(detail::node(F_partial), y, transform_budget));
466 dF_dy = detail::make_expression_ptr(detail::normalize_node(detail::node(dF_dy), transform_budget));
467
468 /// 步骤 3: g'(y) = N - dF_dy
469 auto g_prime = SymbolicExpr::add(N_eff,
470 SymbolicExpr::multiply(SymbolicExpr::number(-1), dF_dy));
471 g_prime = detail::make_expression_ptr(detail::normalize_node(detail::node(g_prime), transform_budget));
472
473 /// 步骤 4: g(y) = integral g'(y) dy
474 auto integrated_g = integrator.integrate_checked(*g_prime, y, context);
475 if (!integrated_g) { return ODESolutionResult::failure(integrated_g.error()); }
476 auto g_y = std::make_shared<SymbolicExpr>(std::move(integrated_g.value()));
477
478 /// 步骤 5: F(x,y) = F_partial + g(y)
479 auto F_total = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(F_partial, g_y)), transform_budget));
480
481 /// 解为 F(x,y) = C
482 result.general_solution = F_total;
483 return ODESolutionResult::success(std::move(result));
484}

引用了 LMCAS::ODESolution::constants, context, LMCAS::detail::differentiate_node(), Exact, LMCAS::Result< ODESolution >::failure(), find_integrating_factor_impl(), LMCAS::ODESolution::general_solution, integrator, LMCAS::detail::make_expression_ptr(), LMCAS::ODESolution::method_used, LMCAS::detail::node(), LMCAS::detail::normalize_node(), solve_exact_ode_impl() , 以及 LMCAS::Result< ODESolution >::success().

被这些函数引用 solve_exact_ode_checked() , 以及 solve_exact_ode_impl().

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

◆ solve_exact_polynomial_inequality()

在文件 inequality_solver_polynomial.cpp 第 470 行定义.

473 {
474 return solve_exact_polynomial_inequality_impl(polynomial, type, context);
475}

◆ solve_exact_polynomial_set()

SolveResult LMCAS::solve_exact_polynomial_set ( const Polynomial< Rational > & exact,
const std::string & var,
ComputationContext & context )
static

在文件 solve_visitor.cpp 第 405 行定义.

407 {
408 if (exact.is_zero()) { return SolutionSet{UniversalSolutions{}}; }
409 if (exact.degree() == 0) { return SolutionSet{EmptySolutions{}}; }
410 std::vector<ExprPtr> roots;
411 for (auto& factor : square_free_factorization(exact)) {
412 auto step = context.consume_steps(1, "solve.exact");
413 if (!step) { return SolveResult::failure(step.error()); }
414 auto solved = solve_exact_factor(factor.first, var, context);
415 if (!solved) { return SolveResult::failure(solved.error()); }
416 const auto& factor_roots = solved.value();
417 if (factor_roots.size() != static_cast<std::size_t>(factor.first.degree()))
419 "square-free factor root count mismatch", "solve.exact"); }
420 for (int copy = 0; copy < factor.second; ++copy)
421 { roots.insert(roots.end(), factor_roots.begin(), factor_roots.end()); }
422 }
423 if (roots.size() != static_cast<std::size_t>(exact.degree()))
425 "polynomial root multiplicities do not cover its degree", "solve.exact"); }
426 return collect_exact_solutions(std::move(roots), context);
427}
static SolveResult collect_exact_solutions(std::vector< std::shared_ptr< SymbolicExpr > > roots, ComputationContext &context)
static SolveVectorResult solve_exact_factor(Polynomial< Rational > remainder, const std::string &var, ComputationContext &context)

引用了 collect_exact_solutions(), context, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Result< SolutionSet >::failure(), InternalInvariant, LMCAS::Polynomial< CoeffType >::is_zero(), roots(), solve_exact_factor(), solve_exact_polynomial_set() , 以及 square_free_factorization().

被这些函数引用 dispatch_equation() , 以及 solve_exact_polynomial_set().

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

◆ solve_expr_set() [1/2]

ExprSetResult LMCAS::solve_expr_set ( const ExprPtr & equation,
const std::string & variable,
ComputationContext & context,
const SolveOptions & options )

在文件 expr_solving.cpp 第 67 行定义.

70 {
72}

引用了 context, options, project_finite_expr_set(), solve_expr_set() , 以及 variable.

被这些函数引用 solve(), solve_expr_set() , 以及 solve_expr_set().

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

◆ solve_expr_set() [2/2]

ExprSetResult LMCAS::solve_expr_set ( const ExprPtr & equation,
const std::string & variable,
const SolveOptions & options )

在文件 expr_solving.cpp 第 73 行定义.

75 {
77 return solve_expr_set(equation, variable, context, options);
78}

引用了 context, options, solve_expr_set() , 以及 variable.

函数调用图:

◆ solve_finite_checked() [1/2]

LMCAS::FiniteSolveResult LMCAS::solve_finite_checked ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
ComputationContext & context,
const SolveOptions & opts )

在文件 solve_visitor.cpp 第 622 行定义.

626 {
627 constexpr const char* operation = "solve_finite_projection";
628 auto solved = solve_equation(expr, var, context, opts);
629 if (!solved) {
630 return SolveVectorResult::failure(solved.error());
631 }
632 auto solution_set = std::move(solved.value());
633 if (std::holds_alternative<EmptySolutions>(solution_set)) {
635 }
636 auto* finite = std::get_if<FiniteSolutions>(&solution_set);
637 if (!finite) {
640 "solution set is not finitely enumerable", operation);
641 }
642 std::size_t value_count = 0;
643 for (const auto& solution : finite->values) {
644 if (!solution.conditions.empty()) {
646 "Conditional roots cannot be projected to an unconditional vector", operation);
647 }
648 value_count += solution.multiplicity;
649 }
650 std::vector<std::shared_ptr<SymbolicExpr>> values;
651 values.reserve(value_count);
652 for (const auto& solution : finite->values) {
653 for (std::size_t copy = 0; copy < solution.multiplicity; ++copy) {
654 values.push_back(solution.value);
655 }
656 }
657 return SolveVectorResult::success(std::move(values));
658}
659catch (const CasError& error) {
660 return SolveVectorResult::failure(error);
661} catch (const std::bad_alloc&) {
663 "finite solution projection allocation failed", "solve_finite_projection");
664} catch (const std::length_error& error) {
665 return SolveVectorResult::failure(CasErrc::ResourceLimit, error.what(), "solve_finite_projection");
666} catch (const std::exception& error) {
667 return SolveVectorResult::failure(CasErrc::InternalInvariant, error.what(), "solve_finite_projection");
668}

引用了 context, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), Inconclusive, solve_equation(), solve_finite_checked() , 以及 LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success().

被这些函数引用 factor_symbolic_quadratic(), matrix_eigenvalues_checked(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::solve(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::solve(), solve_finite_checked(), solve_finite_checked(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::solve_single_equation() , 以及 solve_with_assumptions_impl().

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

◆ solve_finite_checked() [2/2]

LMCAS::FiniteSolveResult LMCAS::solve_finite_checked ( const std::shared_ptr< SymbolicExpr > & expression,
const std::string & variable,
const SolveOptions & options )

在文件 solve_visitor.cpp 第 670 行定义.

673 {
676 expression, variable, context, options);
677}

引用了 context, options, solve_finite_checked() , 以及 variable.

函数调用图:

◆ solve_finite_mixed()

std::optional< SolveVectorResult > LMCAS::solve_finite_mixed ( const std::shared_ptr< SymbolicExpr > & f_expr,
const std::string & var,
ComputationContext & context,
const SolveOptions & opts )
static

在文件 solve_visitor.cpp 第 512 行定义.

514 {
515 constexpr const char* operation = "solve_dispatch_vector";
516 if (!contains_transcendental_of_var(f_expr, var)) {
517 return std::nullopt;
518 }
519 auto substitution = detect_trans_substitutions(f_expr, var);
520 if (!substitution.mappings.empty() && is_polynomial_after_substitution(substitution)) {
521 return std::nullopt;
522 }
523 if (!opts.allow_numeric) {
526 "mixed transcendental equation is outside the finite-vector support domain",
527 operation);
528 }
529 auto mixed = solve_mixed_transcendental_checked(f_expr, var, opts, context);
530 if (!mixed) {
531 return SolveVectorResult::failure(mixed.error());
532 }
533 if (mixed.value().completeness == Completeness::Complete) {
534 return SolveVectorResult::success(std::move(mixed.value().value));
535 }
538 mixed.value().reason.empty() ? "mixed transcendental search is incomplete" : mixed.value().reason,
539 operation);
540}
bool allow_numeric
是否允许数值求解
__attribute__((visibility("default"))) MixedTranscendentalResult solve_mixed_transcendental_checked(const std __attribute__((visibility("default"))) MixedTranscendentalResult solve_mixed_transcendental_checked(const std __attribute__((visibility("default"))) bool contains_transcendental_of_var(const std bool is_polynomial_after_substitution(const TransSubstitutionResult &sub_result)
在调用方计算上下文中执行混合超越方程求解.
MixedTranscendentalResult solve_mixed_transcendental_checked(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const SolveOptions &opts, ComputationContext &context)
bool contains_transcendental_of_var(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var)

引用了 LMCAS::SolveOptions::allow_numeric, Complete, contains_transcendental_of_var(), context, detect_trans_substitutions(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), Inconclusive, is_polynomial_after_substitution(), solve_finite_mixed(), solve_mixed_transcendental_checked() , 以及 LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success().

被这些函数引用 solve_finite_mixed() , 以及 solve_set_core().

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

◆ solve_frobenius_checked() [1/2]

FrobeniusSolutionResult LMCAS::solve_frobenius_checked ( const std::shared_ptr< SymbolicExpr > & p,
const std::shared_ptr< SymbolicExpr > & q,
const std::shared_ptr< SymbolicExpr > & x0,
const std::string & x,
int order )

在文件 ode_frobenius.cpp 第 618 行定义.

624{
626 return solve_frobenius_checked(p, q, x0, x, order, context);
627}
FrobeniusSolutionResult solve_frobenius_checked(const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, int order, ComputationContext &context)

引用了 context, order , 以及 solve_frobenius_checked().

函数调用图:

◆ solve_frobenius_checked() [2/2]

FrobeniusSolutionResult LMCAS::solve_frobenius_checked ( const std::shared_ptr< SymbolicExpr > & p,
const std::shared_ptr< SymbolicExpr > & q,
const std::shared_ptr< SymbolicExpr > & x0,
const std::string & x,
int order,
ComputationContext & context )

在文件 ode_frobenius.cpp 第 538 行定义.

545{
546 const std::string operation = "solve_frobenius";
547 auto valid = validate_ode_two_expr_point(p, q, x0, x, context, operation);
548 if (!valid) {
549 return FrobeniusSolutionResult::failure(valid.error());
550 }
551 if (order < 0 || order > 64) {
554 "Frobenius truncation order must be between 0 and 64",
555 operation);
556 }
557 auto budget = context.consume_steps(static_cast<std::size_t>(order + 1) * 24 + 24,
558 operation);
559 if (!budget) {
561 }
562
563 try {
564 auto classified =
566 if (!classified) {
567 return FrobeniusSolutionResult::failure(classified.error());
568 }
569 const auto point_type = classified.value();
570 if (point_type == ODESingularityType::IrregularSingular) {
573 "Frobenius checked API does not support irregular singular points",
574 operation);
575 }
576 if (point_type == ODESingularityType::RegularSingular) {
577 auto regular_domain = validate_frobenius_regular_singular_domain(
578 p, q, x0, x, context, operation);
579 if (!regular_domain) {
580 return FrobeniusSolutionResult::failure(regular_domain.error());
581 }
582 }
583
584 auto solved =
586 p, q, x0, x, order, point_type, context);
587 if (!solved) {
588 return solved;
589 }
590 auto solution = std::move(solved.value());
591 if (!solution.series_solution ||
592 !LMCAS::detail::node(solution.series_solution)) {
595 "Frobenius solver produced no series in the supported domain",
596 operation);
597 }
598 if (solution.point_type != point_type) {
601 "Frobenius solver reported an unexpected singularity type",
602 operation);
603 }
604 return FrobeniusSolutionResult::success(std::move(solution));
605 } catch (const std::bad_alloc&) {
608 "allocation failed while solving Frobenius series",
609 operation);
610 } catch (const std::exception& ex) {
613 ex.what(),
614 operation);
615 }
616}
static FrobeniusSolutionResult solve_frobenius_impl(const std::shared_ptr< SymbolicExpr > &, const std::shared_ptr< SymbolicExpr > &, const std::shared_ptr< SymbolicExpr > &, const std::string &, int, ODESingularityType, ComputationContext &)
static Result< void > validate_frobenius_regular_singular_domain(const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, ComputationContext &context, const std::string &operation)

引用了 classify_singular_point_checked(), context, LMCAS::Result< FrobeniusSolution >::failure(), Inconclusive, InternalInvariant, InvalidArgument, IrregularSingular, LMCAS::detail::node(), order, RegularSingular, ResourceLimit, solve_frobenius_checked(), solve_frobenius_impl(), LMCAS::Result< FrobeniusSolution >::success(), validate_frobenius_regular_singular_domain() , 以及 validate_ode_two_expr_point().

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

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

◆ solve_frobenius_impl()

FrobeniusSolutionResult LMCAS::solve_frobenius_impl ( const std::shared_ptr< SymbolicExpr > & p,
const std::shared_ptr< SymbolicExpr > & q,
const std::shared_ptr< SymbolicExpr > & x0,
const std::string & x,
int order,
ODESingularityType point_type,
ComputationContext & context )
static

在文件 ode_frobenius.cpp 第 629 行定义.

637{
638 FrobeniusSolution result;
639 result.truncation_order = order;
640 result.point_type = point_type;
641 auto x_var = SymbolicExpr::variable(x);
642 auto x_minus_x0 = SymbolicExpr::add(x_var,
643 SymbolicExpr::multiply(SymbolicExpr::number(-1), x0));
644
646 result.series_solution = nullptr;
647 return result;
648 }
649
651 return ordinary_frobenius_solution(p, q, x0, x, x_minus_x0, std::move(result), context);
652 }
654 p, q, x0, x, x_minus_x0, std::move(result), context);
655}
static FrobeniusSolutionResult ordinary_frobenius_solution(const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, const std::shared_ptr< SymbolicExpr > &x_minus_x0, FrobeniusSolution result, ComputationContext &context)
ODESingularityType point_type
展开点的奇点类型
static FrobeniusSolutionResult singular_frobenius_solution(const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::shared_ptr< SymbolicExpr > &x0, const std::string &x, const std::shared_ptr< SymbolicExpr > &x_minus_x0, FrobeniusSolution result, ComputationContext &context)

引用了 context, IrregularSingular, order, Ordinary, ordinary_frobenius_solution(), LMCAS::FrobeniusSolution::point_type, LMCAS::FrobeniusSolution::series_solution, singular_frobenius_solution(), solve_frobenius_impl() , 以及 LMCAS::FrobeniusSolution::truncation_order.

被这些函数引用 solve_frobenius_checked() , 以及 solve_frobenius_impl().

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

◆ solve_higher_exact_roots()

SolveVectorResult LMCAS::solve_higher_exact_roots ( const Polynomial< Rational > & remainder,
const std::string & var,
ComputationContext & context )
static

在文件 solve_visitor.cpp 第 351 行定义.

352 {
353 if (remainder.degree() == 4 &&
354 remainder.coeffs[3] == Rational(0) &&
355 remainder.coeffs[1] == Rational(0)) {
357 SymbolicExpr::number(remainder.coeffs[4]),
358 SymbolicExpr::number(remainder.coeffs[2]),
359 SymbolicExpr::number(remainder.coeffs[0]), var, context);
360 }
361 auto expression = poly_to_symbolic(remainder);
362 std::vector<ExprPtr> represented_roots;
363 for (int index = 0; index < remainder.degree(); ++index) {
364 auto root = make_rootof_checked(expression, var, static_cast<std::size_t>(index), context);
365 if (!root) { return SolveVectorResult::failure(root.error()); }
366 represented_roots.push_back(std::move(root.value()));
367 }
368 return represented_roots;
369}

引用了 LMCAS::Polynomial< CoeffType >::coeffs, context, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), make_rootof_checked(), LMCAS::polynomial_solver_detail::solve_biquadratic_impl() , 以及 solve_higher_exact_roots().

被这些函数引用 solve_exact_factor() , 以及 solve_higher_exact_roots().

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

◆ solve_higher_order_ode_checked() [1/2]

ODESolutionResult LMCAS::solve_higher_order_ode_checked ( const std::vector< double > & coeffs,
const std::shared_ptr< SymbolicExpr > & forcing,
const std::string & x,
const std::string & y )

在文件 ode_linear.cpp 第 313 行定义.

318{
320 return solve_higher_order_ode_checked(coeffs, forcing, x, y, context);
321}
ODESolutionResult solve_higher_order_ode_checked(const std::vector< double > &coeffs, const std::shared_ptr< SymbolicExpr > &forcing, const std::string &x, const std::string &y, ComputationContext &context)

引用了 context , 以及 solve_higher_order_ode_checked().

函数调用图:

◆ solve_higher_order_ode_checked() [2/2]

ODESolutionResult LMCAS::solve_higher_order_ode_checked ( const std::vector< double > & coeffs,
const std::shared_ptr< SymbolicExpr > & forcing,
const std::string & x,
const std::string & y,
ComputationContext & context )

在文件 ode_linear.cpp 第 233 行定义.

239 {
240 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
241 (context).limits().max_ast_nodes, "transform");
242 const std::string operation = "solve_higher_order_ode";
243 auto variables = validate_ode_variables(x, y, context, operation);
244 if (!variables) {
245 return ODESolutionResult::failure(variables.error());
246 }
247
248 auto coeff_check = validate_numeric_ode_coefficients(coeffs, 2, 7, operation);
249 if (!coeff_check) {
250 return ODESolutionResult::failure(coeff_check.error());
251 }
252 for (double coefficient : coeffs) {
253 if (!std::isfinite(coefficient / coeffs.front())) {
256 "normalizing the characteristic polynomial exceeds the finite numeric domain",
257 operation);
258 }
259 }
260
261 auto budget = context.consume_steps(coeffs.size() * 20 + 20, operation);
262 if (!budget) {
263 return ODESolutionResult::failure(budget.error());
264 }
265
266 const bool nonzero_forcing = has_nonzero_forcing(forcing);
267 if (nonzero_forcing &&
268 (!forcing->is_number() || coeffs.back() == 0.0)) {
271 "non-homogeneous constant-coefficient ODE currently requires a constant forcing and nonzero y coefficient",
272 operation);
273 }
274
275 try {
276 auto solution_result = solve_higher_order_ode_impl(
277 coeffs, nullptr, x, y, context);
278 if (!solution_result) {
279 return ODESolutionResult::failure(solution_result.error());
280 }
281 auto solution = std::move(solution_result.value());
282 if (nonzero_forcing && solution.general_solution) {
283 auto particular = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(
284 forcing, SymbolicExpr::number(coeffs.back()))), transform_budget));
285 solution.general_solution = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(
286 solution.general_solution, particular)), transform_budget));
287 }
288 return wrap_ode_solution(
289 std::move(solution),
291 operation);
292 } catch (const std::bad_alloc&) {
295 "allocation failed while solving higher-order ODE",
296 operation);
297 } catch (const std::length_error& error) { return ODESolutionResult::failure(CasErrc::ResourceLimit, error.what(), "solve_higher_order_ode"); } catch (const std::exception& ex) {
300 ex.what(),
301 operation);
302 }
303} catch (const CasError& error) {
304 return ODESolutionResult::failure(error);
305} catch (const std::bad_alloc&) {
306 return ODESolutionResult::failure(CasErrc::ResourceLimit, "allocation failed", "solve_higher_order_ode");
307} catch (const std::length_error& error) {
308 return ODESolutionResult::failure(CasErrc::ResourceLimit, error.what(), "solve_higher_order_ode");
309} catch (const std::exception& error) {
310 return ODESolutionResult::failure(CasErrc::InternalInvariant, error.what(), "solve_higher_order_ode");
311}
static Result< ODESolution > solve_higher_order_ode_impl(const std::vector< double > &, const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::string &, ComputationContext &context)

引用了 context, LMCAS::Result< ODESolution >::failure(), has_nonzero_forcing(), HigherOrder_ConstCoeff, Inconclusive, InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), NumericFailure, ResourceLimit, solve_higher_order_ode_checked(), solve_higher_order_ode_impl(), validate_numeric_ode_coefficients(), validate_ode_variables() , 以及 wrap_ode_solution().

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

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

◆ solve_higher_order_ode_impl()

Result< ODESolution > LMCAS::solve_higher_order_ode_impl ( const std::vector< double > & coeffs,
const std::shared_ptr< SymbolicExpr > & forcing,
const std::string & x,
const std::string & ,
ComputationContext & context )
static

在文件 ode_linear.cpp 第 323 行定义.

328 {
329
330 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
331 (context).limits().max_ast_nodes, "transform");
332 const std::string operation = "solve_higher_order_ode";
333 ODESolution result;
335
336 if (coeffs.size() < 2 || has_nonzero_forcing(forcing)) {
339 "higher-order ODE is outside the implemented support domain",
340 operation);
341 }
342
343 auto roots = find_characteristic_roots(coeffs, operation);
344 if (!roots) {
346 }
347 result.general_solution =
349 if (result.general_solution) {
351 }
352 return Result<ODESolution>::success(std::move(result));
353} catch (const CasError& error) {
354 return Result<ODESolution>::failure(error);
355} catch (const std::bad_alloc&) {
356 return Result<ODESolution>::failure(CasErrc::ResourceLimit, "allocation failed", "solve_higher_order_ode");
357} catch (const std::length_error& error) {
358 return Result<ODESolution>::failure(CasErrc::ResourceLimit, error.what(), "solve_higher_order_ode");
359} catch (const std::exception& error) {
360 return Result<ODESolution>::failure(CasErrc::InternalInvariant, error.what(), "solve_higher_order_ode");
361}
static std::shared_ptr< SymbolicExpr > build_homogeneous_solution(const std::vector< CharRoot > &roots, const std::string &x, std::vector< std::string > &constants)
根据特征根构造齐次通解.

引用了 build_homogeneous_solution(), LMCAS::ODESolution::constants, context, LMCAS::Result< T >::error(), LMCAS::Result< T >::failure(), LMCAS::ode_root_detail::find_characteristic_roots(), LMCAS::ODESolution::general_solution, has_nonzero_forcing(), HigherOrder_ConstCoeff, Inconclusive, LMCAS::detail::make_expression_ptr(), LMCAS::ODESolution::method_used, LMCAS::detail::node(), LMCAS::detail::normalize_node(), roots(), solve_higher_order_ode_impl(), LMCAS::Result< T >::success() , 以及 LMCAS::Result< T >::value().

被这些函数引用 solve_higher_order_ode_checked() , 以及 solve_higher_order_ode_impl().

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

◆ solve_homogeneous_ode_checked() [1/2]

ODESolutionResult LMCAS::solve_homogeneous_ode_checked ( const std::shared_ptr< SymbolicExpr > & rhs,
const std::string & x,
const std::string & y )

在文件 ode_first_order.cpp 第 110 行定义.

114{
117}
ODESolutionResult solve_homogeneous_ode_checked(const std::shared_ptr< SymbolicExpr > &rhs, const std::string &x, const std::string &y, ComputationContext &context)

引用了 context, rhs , 以及 solve_homogeneous_ode_checked().

函数调用图:

◆ solve_homogeneous_ode_checked() [2/2]

ODESolutionResult LMCAS::solve_homogeneous_ode_checked ( const std::shared_ptr< SymbolicExpr > & rhs,
const std::string & x,
const std::string & y,
ComputationContext & context )

在文件 ode_first_order.cpp 第 75 行定义.

80{
81 const std::string operation = "solve_homogeneous_ode";
82 auto valid = validate_ode_expr_var_pair(rhs, x, y, context, operation);
83 if (!valid) {
84 return ODESolutionResult::failure(valid.error());
85 }
86 auto step = context.consume_steps(12, operation);
87 if (!step) {
88 return ODESolutionResult::failure(step.error());
89 }
90
91 try {
92 auto solved = solve_homogeneous_ode_impl(rhs, x, y, context);
93 if (!solved) { return solved; }
94 return wrap_ode_solution(std::move(solved.value()), ODEType::Homogeneous, operation);
95 } catch (const CasError& error) {
96 return ODESolutionResult::failure(error);
97 } catch (const std::bad_alloc&) {
99 "homogeneous ODE allocation failed",
100 operation);
101 } catch (const std::length_error& error) {
102 return ODESolutionResult::failure(CasErrc::ResourceLimit, error.what(), operation);
103 } catch (const std::exception& e) {
105 e.what(),
106 operation);
107 }
108}
Result< void > validate_ode_expr_var_pair(const std::shared_ptr< SymbolicExpr > &expr, const std::string &x, const std::string &y, ComputationContext &context, const std::string &operation)
static ODESolutionResult solve_homogeneous_ode_impl(const std::shared_ptr< SymbolicExpr > &, const std::string &, const std::string &, ComputationContext &context)

引用了 context, e(), LMCAS::Result< ODESolution >::failure(), Homogeneous, InternalInvariant, ResourceLimit, rhs, solve_homogeneous_ode_checked(), solve_homogeneous_ode_impl(), validate_ode_expr_var_pair() , 以及 wrap_ode_solution().

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

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

◆ solve_homogeneous_ode_impl()

ODESolutionResult LMCAS::solve_homogeneous_ode_impl ( const std::shared_ptr< SymbolicExpr > & rhs,
const std::string & x,
const std::string & y,
ComputationContext & context )
static

齐次方程 y' = f(y/x) 令 v = y/x,则 y = v*x,y' = v + x*v' 代入: v + x*v' = f(v) 即: x*v' = f(v) - v 分离变量: dv/(f(v) - v) = dx/x

将 rhs 中的 y 替换为 v*x,得到 f 关于 v 和 x 的表达式 由于齐次性,f(x, vx) = f(1, v)(令 t=1/x 缩放) 所以直接用 x=1, y=v 代入得到 f(v)

f(v) = rhs(1, v):将 x=1, y=v 代入

分离变量方程: dv/(f(v) - v) = dx/x 积分: integral dv/(f(v) - v) = integral dx/x = ln|x| + C

右端: ln(x)

解为: lhs_integral = ln(x) + C 即: lhs_integral - ln(x) = C 回代 v = y/x

返回隐式解形式: F(x,y) = C

在文件 ode_first_order.cpp 第 119 行定义.

123{
124
125 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
126 (context).limits().max_ast_nodes, "transform");
127 ODESolution result;
129 result.constants = {"C"};
130
131 /// 齐次方程 y' = f(y/x)
132 /// 令 v = y/x,则 y = v*x,y' = v + x*v'
133 /// 代入: v + x*v' = f(v)
134 /// 即: x*v' = f(v) - v
135 /// 分离变量: dv/(f(v) - v) = dx/x
136
137 /// 将 rhs 中的 y 替换为 v*x,得到 f 关于 v 和 x 的表达式
138 /// 由于齐次性,f(x, vx) = f(1, v)(令 t=1/x 缩放)
139 /// 所以直接用 x=1, y=v 代入得到 f(v)
140 std::string v_name = "v";
141 auto v_var = SymbolicExpr::variable(v_name);
142 auto x_var = SymbolicExpr::variable(x);
143
144 /// f(v) = rhs(1, v):将 x=1, y=v 代入
145 auto f_v = detail::make_expression_ptr(detail::substitute_node(detail::node(rhs), x, detail::node(SymbolicExpr::number(1)), transform_budget));
146 f_v = detail::make_expression_ptr(detail::substitute_node(detail::node(f_v), y, detail::node(v_var), transform_budget));
148
149 /// 分离变量方程: dv/(f(v) - v) = dx/x
150 /// 积分: integral dv/(f(v) - v) = integral dx/x = ln|x| + C
152 SymbolicExpr::multiply(SymbolicExpr::number(-1), v_var))), transform_budget))
153 ->cancel()), transform_budget));
154
155 auto v_replacement = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(
156 SymbolicExpr::variable(y), x_var)), transform_budget));
157 if (f_minus_v->is_zero()) {
158 result.general_solution = v_replacement;
159 return ODESolutionResult::success(std::move(result));
160 }
161
162 std::shared_ptr<SymbolicExpr> integrand;
163 const auto reciprocal =
164 std::dynamic_pointer_cast<const PowerNode>(detail::node(f_minus_v));
165 const auto minus_one = SymbolicExpr::number(-1);
166 if (reciprocal &&
167 reciprocal->exponent()->compare(*detail::node(minus_one)) == 0) {
168 integrand = detail::make_expression_ptr(reciprocal->base());
169 } else {
170 integrand = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(
171 SymbolicExpr::number(1), f_minus_v)), transform_budget));
172 }
173 Integrator integrator;
174 auto integrated = integrator.integrate_checked(*integrand, v_name, context);
175 if (!integrated) { return ODESolutionResult::failure(integrated.error()); }
176 auto lhs_integral = std::make_shared<SymbolicExpr>(std::move(integrated.value()));
177
178 /// 右端: ln(x)
179 auto rhs_integral = SymbolicExpr::ln(x_var);
180
181 /// 解为: lhs_integral = ln(x) + C
182 /// 即: lhs_integral - ln(x) = C
183 /// 回代 v = y/x
184
185 auto solution = detail::make_expression_ptr(detail::substitute_node(detail::node(lhs_integral), v_name, detail::node(v_replacement), transform_budget));
186 solution = SymbolicExpr::add(solution,
187 SymbolicExpr::multiply(SymbolicExpr::number(-1), rhs_integral));
188 solution = detail::make_expression_ptr(detail::normalize_node(detail::node(solution), transform_budget));
189
190 /// 返回隐式解形式: F(x,y) = C
191 result.general_solution = solution;
192 return ODESolutionResult::success(std::move(result));
193}

引用了 LMCAS::ODESolution::constants, context, LMCAS::detail::expand_node(), LMCAS::Result< ODESolution >::failure(), LMCAS::ODESolution::general_solution, Homogeneous, integrator, LMCAS::detail::make_expression_ptr(), LMCAS::ODESolution::method_used, LMCAS::detail::node(), LMCAS::detail::normalize_node(), rhs, solve_homogeneous_ode_impl(), LMCAS::detail::substitute_node() , 以及 LMCAS::Result< ODESolution >::success().

被这些函数引用 solve_homogeneous_ode_checked() , 以及 solve_homogeneous_ode_impl().

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

◆ solve_lagrange_strict()

LagrangeResult LMCAS::solve_lagrange_strict ( const VectorField & equations,
const std::vector< std::string > & all_vars,
ComputationContext & context,
const std::string & operation )
static

在文件 vector_calculus_lagrange.cpp 第 67 行定义.

70{
71 std::vector<std::map<std::string, std::shared_ptr<SymbolicExpr>>> full_solutions;
72 std::vector<SymbolicExpr> poly_eqs;
73 poly_eqs.reserve(equations.size());
74 for (const auto& eq : equations) {
75 if (!eq || !LMCAS::detail::node(eq)) {
78 "Lagrange equation construction failed in the supported domain",
79 operation);
80 }
81 poly_eqs.push_back(*eq);
82 }
83
84 auto checked_solutions =
85 Solver::solve_polynomial_system_checked(poly_eqs, all_vars, context);
86 if (!checked_solutions) return LagrangeResult::failure(checked_solutions.error());
87 const auto& poly_solutions = checked_solutions.value();
88 for (const auto& sol : poly_solutions) {
89 std::map<std::string, std::shared_ptr<SymbolicExpr>> pt;
90 for (const auto& [name, val] : sol) {
92 }
93 full_solutions.push_back(std::move(pt));
94 }
95
96 return LagrangeResult::success(std::move(full_solutions));
97}

引用了 context, eq(), LMCAS::Result< std::vector< std::map< std::string, std::shared_ptr< SymbolicExpr > > > >::failure(), Inconclusive, LMCAS::detail::make_expression_ptr(), name, LMCAS::detail::node(), solve_lagrange_strict() , 以及 LMCAS::Result< std::vector< std::map< std::string, std::shared_ptr< SymbolicExpr > > > >::success().

被这些函数引用 lagrange_multipliers_strict() , 以及 solve_lagrange_strict().

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

◆ solve_linear1_ode()

ExprPtr LMCAS::solve_linear1_ode ( ExprPtr Px,
ExprPtr Qx,
const std::string & x,
const std::string & y,
const AssumptionContext * ctx )

在文件 symbolic_ode.cpp 第 131 行定义.

132 {
134 Integrator integrator;
135 auto integrated_p = integrator.integrate_checked(*Px, x, context);
136 if (!integrated_p) { throw integrated_p.error(); }
137 auto intP = std::make_shared<SymbolicExpr>(std::move(integrated_p.value()));
138 auto mu = SymbolicExpr::exp(intP);
139
140 auto Qmu = SymbolicExpr::multiply(Qx, mu);
141 auto integrated_q = integrator.integrate_checked(*Qmu, x, context);
142 if (!integrated_q) { throw integrated_q.error(); }
143 auto intQmu = std::make_shared<SymbolicExpr>(std::move(integrated_q.value()));
144
145 auto C = SymbolicExpr::variable("C");
146 auto num = SymbolicExpr::add(intQmu, C);
147 auto result = SymbolicExpr::divide(num, mu);
148
149 // When the dependent variable is known Positive, prefer positive branch.
150 auto positive = dep_var_is_positive(y, ctx, context);
151 if (!positive) { throw positive.error(); }
152 if (positive.value()) {
153 result = make_abs(result);
154 }
155
156 return result;
157}
static std::shared_ptr< SymbolicExpr > make_abs(std::shared_ptr< SymbolicExpr > expr)
Wrap an expression in abs() to signal positive-branch preference.
static Result< bool > dep_var_is_positive(const std::string &y, const AssumptionContext *ctx, ComputationContext &context)
Check if the dependent variable is known Positive in the given context.

引用了 context, dep_var_is_positive(), integrator, make_abs(), LMCAS::polynomial_solver_detail::num() , 以及 solve_linear1_ode().

被这些函数引用 solve_linear1_ode().

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

◆ solve_linear2_homogeneous()

Result< std::shared_ptr< SymbolicExpr > > LMCAS::solve_linear2_homogeneous ( double a,
double b,
double c,
const std::string & x,
const std::string & y,
const AssumptionContext * ctx,
ComputationContext & context )
static

在文件 symbolic_ode.cpp 第 211 行定义.

216 {
217
218 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
219 (context).limits().max_ast_nodes, "transform");
220 if (!std::isfinite(a) || !std::isfinite(b) || !std::isfinite(c)) {
223 "solve_linear2_ode: coefficients must be finite",
224 kSolveLinear2OdeOperation);
225 }
226 ExprPtr solution;
227 if (a == 0.0) {
228 if (b == 0.0) {
229 return Result<std::shared_ptr<SymbolicExpr>>::failure(
231 "solve_linear2_ode: leading and first-derivative coefficients are both zero",
232 kSolveLinear2OdeOperation);
233 }
234 const double normalized_c = c / b;
235 if (!std::isfinite(normalized_c)) {
238 "solve_linear2_ode: degenerate coefficient normalization is non-finite",
239 kSolveLinear2OdeOperation);
240 }
241 // 常系数退化方程以特征根 -c/b 构造指数基,沿用数值系数的求解语义。
242 solution = SymbolicExpr::multiply(SymbolicExpr::variable("C"),
243 SymbolicExpr::exp(SymbolicExpr::multiply(
244 SymbolicExpr::number(-normalized_c), SymbolicExpr::variable(x))));
245 } else {
248 if (!roots) {
250 }
251 solution = linear2_root_basis(roots.value(), x);
252 }
253 solution = detail::make_expression_ptr(detail::normalize_node(detail::node(solution), transform_budget));
254 auto positive = dep_var_is_positive(y, ctx, context);
255 if (!positive) { return ExpressionResult::failure(positive.error()); }
256 if (positive.value()) {
257 solution = make_abs(solution);
258 }
260 std::move(solution));
261} catch (const CasError& error) {
262 return Result<std::shared_ptr<SymbolicExpr>>::failure(error);
263} catch (const std::bad_alloc&) {
264 return Result<std::shared_ptr<SymbolicExpr>>::failure(CasErrc::ResourceLimit, "allocation failed", "solve_linear2_homogeneous");
265} catch (const std::length_error& error) {
266 return Result<std::shared_ptr<SymbolicExpr>>::failure(CasErrc::ResourceLimit, error.what(), "solve_linear2_homogeneous");
267} catch (const std::exception& error) {
268 return Result<std::shared_ptr<SymbolicExpr>>::failure(CasErrc::InternalInvariant, error.what(), "solve_linear2_homogeneous");
269}
static std::shared_ptr< SymbolicExpr > linear2_root_basis(const std::vector< ode_root_detail::CharRoot > &roots, const std::string &x)
std::shared_ptr< SymbolicExpr > ExprPtr

引用了 a, b, c, context, dep_var_is_positive(), LMCAS::Result< T >::error(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::ode_root_detail::find_characteristic_roots(), InvalidArgument, linear2_root_basis(), make_abs(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), NumericFailure, roots(), solve_linear2_homogeneous() , 以及 LMCAS::Result< T >::value().

被这些函数引用 solve_linear2_homogeneous(), solve_linear2_ode() , 以及 solve_linear2_ode_checked().

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

◆ solve_linear2_ode()

std::shared_ptr< SymbolicExpr > LMCAS::solve_linear2_ode ( double a,
double b,
double c,
std::shared_ptr< SymbolicExpr > fx,
const std::string & x,
const std::string & y,
const AssumptionContext * ctx )

在文件 symbolic_ode.cpp 第 271 行定义.

277 {
279 if (!fx || !LMCAS::detail::node(fx)) {
280 throw std::invalid_argument(
281 "solve_linear2_ode: forcing expression must not be null");
282 }
283 if (!fx->is_zero()) {
284 throw std::logic_error(
285 "solve_linear2_ode: non-homogeneous case is outside the current support domain");
286 }
287 auto solution = solve_linear2_homogeneous(a, b, c, x, y, ctx, context);
288 if (!solution) {
289 if (solution.error().code == CasErrc::InvalidArgument) {
290 throw std::invalid_argument(solution.error().message);
291 }
292 if (solution.error().code == CasErrc::NumericFailure) {
293 throw std::overflow_error(solution.error().message);
294 }
295 throw std::logic_error(solution.error().message);
296 }
297 return std::move(solution.value());
298}
static Result< std::shared_ptr< SymbolicExpr > > solve_linear2_homogeneous(double a, double b, double c, const std::string &x, const std::string &y, const AssumptionContext *ctx, ComputationContext &context)

引用了 a, b, c, context, InvalidArgument, LMCAS::detail::node(), NumericFailure, solve_linear2_homogeneous() , 以及 solve_linear2_ode().

被这些函数引用 solve_linear2_ode().

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

◆ solve_linear2_ode_checked() [1/2]

Result< std::shared_ptr< SymbolicExpr > > LMCAS::solve_linear2_ode_checked ( double a,
double b,
double c,
std::shared_ptr< SymbolicExpr > fx,
const std::string & x,
const std::string & y,
ComputationContext & context,
const AssumptionContext * ctx )

在文件 symbolic_ode.cpp 第 300 行定义.

307 {
308 auto step = context.consume_steps(1, kSolveLinear2OdeOperation);
309 if (!step) {
310 return Result<std::shared_ptr<SymbolicExpr>>::failure(step.error());
311 }
312
313 if (!fx || !LMCAS::detail::node(fx)) {
314 return Result<std::shared_ptr<SymbolicExpr>>::failure(
316 "forcing expression must not be null",
317 kSolveLinear2OdeOperation);
318 }
319 if (x.empty() || y.empty()) {
322 "ODE variables must not be empty",
323 kSolveLinear2OdeOperation);
324 }
325
326 try {
327 if (!fx->is_zero()) {
330 "non-homogeneous second-order constant-coefficient ODEs are outside the current support domain",
331 kSolveLinear2OdeOperation);
332 }
333
334 return solve_linear2_homogeneous(a, b, c, x, y, ctx, context);
335 } catch (const std::invalid_argument& ex) {
337 CasErrc::InvalidArgument, ex.what(), kSolveLinear2OdeOperation);
338 } catch (const std::bad_alloc&) {
341 "ODE solving allocation failed",
342 kSolveLinear2OdeOperation);
343 } catch (const std::logic_error& ex) {
345 CasErrc::Inconclusive, ex.what(), kSolveLinear2OdeOperation);
346 } catch (const std::exception& ex) {
348 CasErrc::InternalInvariant, ex.what(), kSolveLinear2OdeOperation);
349 }
350}

引用了 a, b, c, context, Inconclusive, InternalInvariant, InvalidArgument, LMCAS::detail::node(), ResourceLimit, solve_linear2_homogeneous() , 以及 solve_linear2_ode_checked().

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

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

◆ solve_linear2_ode_checked() [2/2]

Result< std::shared_ptr< SymbolicExpr > > LMCAS::solve_linear2_ode_checked ( double a,
double b,
double c,
std::shared_ptr< SymbolicExpr > fx,
const std::string & x,
const std::string & y,
const AssumptionContext * ctx )

在文件 symbolic_ode.cpp 第 352 行定义.

358 {
360 return solve_linear2_ode_checked(a, b, c, std::move(fx), x, y, context, ctx);
361}
Result< std::shared_ptr< SymbolicExpr > > solve_linear2_ode_checked(double a, double b, double c, std::shared_ptr< SymbolicExpr > fx, const std::string &x, const std::string &y, ComputationContext &context, const AssumptionContext *ctx)

引用了 a, b, c, context , 以及 solve_linear2_ode_checked().

函数调用图:

◆ solve_mixed_transcendental_checked() [1/2]

MixedTranscendentalResult LMCAS::solve_mixed_transcendental_checked ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
const SolveOptions & opts )

在文件 solve_mixed_transcendental.cpp 第 515 行定义.

517 {
519 return solve_mixed_transcendental_checked(expr, var, opts, context);
520}

引用了 context , 以及 solve_mixed_transcendental_checked().

函数调用图:

◆ solve_mixed_transcendental_checked() [2/2]

MixedTranscendentalResult LMCAS::solve_mixed_transcendental_checked ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
const SolveOptions & opts,
ComputationContext & context )

在文件 solve_mixed_transcendental.cpp 第 494 行定义.

496 {
497 auto invalid = validate_mixed_input(expr, var, opts);
498 if (invalid) {
499 return MixedTranscendentalResult::failure(std::move(*invalid));
500 }
501 try {
502 return solve_mixed_equation(expr, var, opts, context);
503 } catch (const CasError& error) {
505 } catch (const std::bad_alloc&) {
507 CasErrc::ResourceLimit, "混合求解分配失败", mixed_operation);
508 } catch (const std::length_error& error) {
509 return MixedTranscendentalResult::failure(CasErrc::ResourceLimit, error.what(), mixed_operation);
510 } catch (const std::exception& error) {
511 return MixedTranscendentalResult::failure(CasErrc::InternalInvariant, error.what(), mixed_operation);
512 }
513}

引用了 context, LMCAS::Result< MathResult< std::vector< std::shared_ptr< SymbolicExpr > > > >::failure(), InternalInvariant, ResourceLimit , 以及 solve_mixed_transcendental_checked().

被这些函数引用 solve_finite_mixed(), solve_mixed_transcendental_checked() , 以及 solve_mixed_transcendental_checked().

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

◆ solve_numeric_checked() [1/2]

NumericRootsResult LMCAS::solve_numeric_checked ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
ComputationContext & context,
const SolveOptions & opts )

在文件 newton_raphson.cpp 第 458 行定义.

463{
464 constexpr const char* operation = "solve_numeric";
465 auto options = invalid_root_options(opts, operation);
466 if (!options) {
467 return NumericRootsResult::failure(options.error());
468 }
469 if (!expr) {
471 "expression cannot be null",
472 operation);
473 }
474 if (var.empty()) {
476 "solve variable cannot be empty",
477 operation);
478 }
479 if (opts.max_roots < -1) {
481 "maximum root count must be -1 or non-negative",
482 operation);
483 }
484 if (opts.max_roots == 0) {
486 }
487
488 auto initial_step = context.consume_steps(1, operation);
489 if (!initial_step) {
490 return NumericRootsResult::failure(initial_step.error());
491 }
492
493 auto recognized_poly = recognize_rational_polynomial(*expr, var, context);
494 if (!recognized_poly) {
495 return NumericRootsResult::failure(recognized_poly.error());
496 }
497
498 if (recognized_poly.value() && !recognized_poly.value()->is_zero() &&
499 recognized_poly.value()->degree() >= 1) {
501 expr, var, *recognized_poly.value(), context, opts);
502 }
503 return solve_initial_guess(expr, var, context, opts);
504}
NumericRootsResult solve_initial_guess(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)
NumericRootsResult solve_isolated_polynomial(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const Polynomial< Rational > &polynomial, ComputationContext &context, const SolveOptions &opts)
int max_roots
数值候选数量预算;精确解集和整数解族保持完整。

引用了 context, LMCAS::Result< std::vector< NumericRoot > >::failure(), InvalidArgument, LMCAS::SolveOptions::max_roots, options, recognize_rational_polynomial(), solve_numeric_checked() , 以及 LMCAS::Result< std::vector< NumericRoot > >::success().

函数调用图:

◆ solve_numeric_checked() [2/2]

NumericRootsResult LMCAS::solve_numeric_checked ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
const SolveOptions & opts )

在文件 newton_raphson.cpp 第 449 行定义.

453{
455 return solve_numeric_checked(expr, var, context, opts);
456}
NumericRootsResult solve_numeric_checked(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const SolveOptions &opts)

引用了 context , 以及 solve_numeric_checked().

被这些函数引用 LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::polish_value(), solve_numeric_checked() , 以及 solve_numeric_checked().

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

◆ solve_product_factor()

SolveResult LMCAS::solve_product_factor ( const detail::SymbolicNodePtr & node,
const std::string & variable,
ComputationContext & context,
const SolveOptions & options,
std::size_t & multiplicity )
static

在文件 solve_visitor.cpp 第 225 行定义.

227 {
228 auto factor = detail::make_expression_ptr(node);
229 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
230 BigInt exponent;
232 std::dynamic_pointer_cast<const NumberNode>(power->exponent()), exponent)) {
233 if (exponent <= BigInt(0)) { return SolutionSet{EmptySolutions{}}; }
234 if (exponent > BigInt(static_cast<std::int64_t>(std::numeric_limits<int>::max()))) {
235 return SolveResult::failure(CasErrc::ResourceLimit, "root multiplicity overflow", "solve.product");
236 }
237 multiplicity = static_cast<std::size_t>(*exponent.try_to_int64());
238 factor = detail::make_expression_ptr(power->base());
239 }
240 }
241 return solve_equation(factor, variable, context, options);
242}
std::size_t std::size_t multiplicity

引用了 context, exponent, LMCAS::Result< SolutionSet >::failure(), LMCAS::detail::make_expression_ptr(), options, ResourceLimit, solve_equation(), solve_product_factor(), try_get_integer_value() , 以及 variable.

被这些函数引用 solve_product_factor() , 以及 solve_product_set().

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

◆ solve_product_set()

std::optional< SolveResult > LMCAS::solve_product_set ( const ExprPtr & expression,
const std::string & variable,
ComputationContext & context,
const SolveOptions & options )
static

在文件 solve_visitor.cpp 第 290 行定义.

291 {
292 auto product = std::dynamic_pointer_cast<const MultiplyNode>(detail::node(expression));
293 if (!product) { return std::nullopt; }
294 std::vector<FiniteSolution> finite;
295 std::vector<ParametricSolution> families;
296 const auto original_names = detail::all_variable_names(detail::node(expression));
297 for (const auto& node : product->operands()) {
298 std::size_t multiplicity = 1;
299 auto solved = solve_product_factor(node, variable, context, options, multiplicity);
300 if (!solved) {
301 if (solved.error().code == CasErrc::Inconclusive) { return conditional_equation(expression, variable); }
302 return SolveResult::failure(solved.error());
303 }
304 if (std::holds_alternative<EmptySolutions>(solved.value())) { continue; }
305 if (std::holds_alternative<UniversalSolutions>(solved.value())) { return conditional_equation(expression, variable); }
306 if (auto values = std::get_if<FiniteSolutions>(&solved.value())) {
307 auto appended = append_product_roots(*values, multiplicity, finite);
308 if (!appended) { return SolveResult::failure(appended.error()); }
309 } else if (auto values = std::get_if<ParametricSolutions>(&solved.value())) {
310 append_product_families(*values, original_names, families);
311 } else { return conditional_equation(expression, variable); }
312 }
313 if (!finite.empty() && !families.empty()) { return conditional_equation(expression, variable); }
314 if (!families.empty()) { return SolveResult::success(SolutionSet{ParametricSolutions{std::move(families)}}); }
315 if (!finite.empty()) { return SolveResult::success(SolutionSet{FiniteSolutions{std::move(finite)}}); }
317}
static Result< void > append_product_roots(FiniteSolutions &values, std::size_t multiplicity, std::vector< FiniteSolution > &finite)
static SolveResult conditional_equation(const ExprPtr &original, const std::string &variable)
static SolveResult solve_product_factor(const detail::SymbolicNodePtr &node, const std::string &variable, ComputationContext &context, const SolveOptions &options, std::size_t &multiplicity)
static void append_product_families(ParametricSolutions &values, const std::set< std::string > &original_names, std::vector< ParametricSolution > &families)

引用了 LMCAS::detail::all_variable_names(), append_product_families(), append_product_roots(), conditional_equation(), context, LMCAS::Result< SolutionSet >::failure(), Inconclusive, LMCAS::detail::node(), options, solve_product_factor(), solve_product_set(), LMCAS::Result< SolutionSet >::success() , 以及 variable.

被这些函数引用 dispatch_equation() , 以及 solve_product_set().

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

◆ solve_quartic()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::solve_quartic ( const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
const std::shared_ptr< SymbolicExpr > & c,
const std::shared_ptr< SymbolicExpr > & d,
const std::shared_ptr< SymbolicExpr > & e,
const std::string & variable )

在文件 solve_polynomial_quartic.cpp 第 48 行定义.

54 {
56 return solve_quartic_impl(a, b, c, d, e, variable, context);
57}

引用了 a, b, c, context, e(), solve_quartic(), LMCAS::polynomial_solver_detail::solve_quartic_impl() , 以及 variable.

被这些函数引用 solve_closed_form_from_poly() , 以及 solve_quartic().

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

◆ solve_separable_ode()

ExprPtr LMCAS::solve_separable_ode ( ExprPtr rhs,
const std::string & x,
const std::string & y,
const AssumptionContext * ctx )

在文件 symbolic_ode.cpp 第 73 行定义.

74 {
76 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
77 (context).limits().max_ast_nodes, "transform");
78
79 if (!is_separable(rhs, x, y)) {
80 return nullptr;
81 }
82
83 std::shared_ptr<SymbolicExpr> f;
84 std::shared_ptr<SymbolicExpr> g;
85 const auto& root = detail::node(rhs);
86 if (!expression_depends_on_variable(root, y)) {
87 f = rhs;
88 g = SymbolicExpr::number(1);
89 } else if (!expression_depends_on_variable(root, x)) {
90 f = SymbolicExpr::number(1);
91 g = rhs;
92 } else {
93 // The shared classifier guarantees a product of uncoupled factors here.
94 const auto& product = static_cast<const MultiplyNode&>(*root);
95 std::vector<std::shared_ptr<const SymbolicNode>> x_factors;
96 std::vector<std::shared_ptr<const SymbolicNode>> y_factors;
97 for (const auto& factor : product.operands()) {
98 auto& factors = expression_depends_on_variable(factor, y) ? y_factors : x_factors;
99 factors.push_back(factor);
100 }
103 }
104
106 Integrator integrator;
107 auto integrated_y = integrator.integrate_checked(*inv_y, y, context);
108 if (!integrated_y) { throw integrated_y.error(); }
109 auto int_y = std::make_shared<SymbolicExpr>(std::move(integrated_y.value()));
110 auto normalized_f = detail::make_expression_ptr(
111 detail::normalize_node(detail::node(f), transform_budget));
112 auto integrated_x = integrator.integrate_checked(*normalized_f, x, context);
113 if (!integrated_x) { throw integrated_x.error(); }
114 auto int_x = std::make_shared<SymbolicExpr>(std::move(integrated_x.value()));
116 int_y, SymbolicExpr::multiply(SymbolicExpr::number(-1), int_x))), transform_budget));
117
118 // Preserve the existing positive-context branch marker.
119 auto positive = dep_var_is_positive(y, ctx, context);
120 if (!positive) { throw positive.error(); }
121 if (positive.value()) {
122 result = make_abs(result);
123 }
124
125 return result;
126}
std::shared_ptr< const SymbolicNode > reciprocal_on_regular_region(const std::shared_ptr< const SymbolicNode > &node)

引用了 context, dep_var_is_positive(), expression_depends_on_variable(), integrator, is_separable(), make_abs(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), rhs , 以及 solve_separable_ode().

被这些函数引用 solve_separable_ode().

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

◆ solve_set() [1/2]

SolveResult LMCAS::solve_set ( const ExprPtr & equation,
const std::string & variable,
ComputationContext & context,
const SolveOptions & options )

在文件 expr_solving.cpp 第 10 行定义.

13 {
14 if (!equation) {
16 "equation cannot be null", "LMCAS.solve_set");
17 }
18 if (variable.empty()) {
20 "solve variable cannot be empty",
21 "LMCAS.solve_set");
22 }
23 return solve_equation(equation, variable, context, options);
24}

引用了 context, LMCAS::Result< SolutionSet >::failure(), InvalidArgument, options, solve_equation(), solve_set() , 以及 variable.

被这些函数引用 project_finite_expr_set(), solve_set() , 以及 solve_set().

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

◆ solve_set() [2/2]

SolveResult LMCAS::solve_set ( const ExprPtr & equation,
const std::string & variable,
const SolveOptions & options )

在文件 expr_solving.cpp 第 26 行定义.

28 {
30 return solve_set(equation, variable, context, options);
31}

引用了 context, options, solve_set() , 以及 variable.

函数调用图:

◆ solve_set_core()

SolveResult LMCAS::solve_set_core ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
ComputationContext & context,
const SolveOptions & opts )
static

在文件 solve_visitor.cpp 第 555 行定义.

559 {
560 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
561 (context).limits().max_ast_nodes, "transform");
562 constexpr const char* operation = "solve_dispatch_set";
563 if (!expr || !LMCAS::detail::node(expr)) {
565 "expression cannot be null",
566 operation);
567 }
568 if (var.empty()) {
570 "solve variable cannot be empty",
571 operation);
572 }
573
574 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(expr), transform_budget));
575 if (!simplified || !LMCAS::detail::node(simplified)) {
577 "expression simplification failed",
578 operation);
579 }
580
581 std::shared_ptr<SymbolicExpr> f_expr = simplified;
582 if (auto rel = std::dynamic_pointer_cast<const RelationalNode>(LMCAS::detail::node(simplified))) {
583 if (rel->op() == RelationalNode::Op::EQ) {
584 auto left = LMCAS::detail::make_expression_ptr(rel->left());
585 auto right = LMCAS::detail::make_expression_ptr(rel->right());
586 f_expr = SymbolicExpr::add(
587 left, SymbolicExpr::multiply(right, SymbolicExpr::number(-1)));
588 }
589 }
590
591 auto polynomial = symbolic_to_poly<SymbolicPolyCoeff>(f_expr, var);
592 if (polynomial) {
593 return solve_symbolic_polynomial_set(polynomial.value(), expr, var, context);
594 }
595 if (polynomial.error().code != CasErrc::UnsupportedExpression) {
596 return SolveResult::failure(polynomial.error());
597 }
598
599 auto transcendental = solve_transcendental(f_expr, var, context, opts);
600 if (transcendental) return transcendental;
601 if (transcendental.error().code != CasErrc::Inconclusive) {
602 return SolveResult::failure(transcendental.error());
603 }
604
605 if (auto mixed = solve_finite_mixed(f_expr, var, context, opts)) {
606 return finite_values_to_set(std::move(*mixed));
607 }
608
609
611 "expression is outside the supported finite exact solve domain", operation);
612} catch (const CasError& error) {
613 return SolveResult::failure(error);
614} catch (const std::bad_alloc&) {
615 return SolveResult::failure(CasErrc::ResourceLimit, "allocation failed", "solve_dispatch_set");
616} catch (const std::length_error& error) {
617 return SolveResult::failure(CasErrc::ResourceLimit, error.what(), "solve_dispatch_set");
618} catch (const std::exception& error) {
619 return SolveResult::failure(CasErrc::InternalInvariant, error.what(), "solve_dispatch_set");
620}
SolveResult solve_transcendental(const ExprPtr &expr, const std::string &var, ComputationContext &context, const SolveOptions &options)
static std::optional< SolveVectorResult > solve_finite_mixed(const std::shared_ptr< SymbolicExpr > &f_expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)
static SolveResult finite_values_to_set(SolveVectorResult result)

引用了 context, LMCAS::Result< SolutionSet >::failure(), finite_values_to_set(), Inconclusive, InvalidArgument, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), right, solve_finite_mixed(), solve_set_core(), solve_symbolic_polynomial_set(), solve_transcendental() , 以及 UnsupportedExpression.

被这些函数引用 dispatch_equation() , 以及 solve_set_core().

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

◆ solve_symbolic_polynomial_set()

SolveResult LMCAS::solve_symbolic_polynomial_set ( const Polynomial< SymbolicPolyCoeff > & polynomial,
const ExprPtr & original,
const std::string & variable,
ComputationContext & context )
static

在文件 solve_visitor.cpp 第 167 行定义.

170 {
171 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
172 (context).limits().max_ast_nodes, "transform");
173
174 std::optional<detail::AssumptionFacts> adapter;
175 if (context.assumptions()) {
176 adapter.emplace(*context.assumptions());
177 }
178 const FactsQuery& facts = adapter
179 ? static_cast<const FactsQuery&>(*adapter)
181 int degree = polynomial.degree();
182 while (degree >= 0) {
183 auto leading = detail::make_expression_ptr(detail::normalize_node(detail::node(get_coeff(polynomial, degree)), transform_budget));
184 auto nonzero = detail::query_nonzero_value(
185 detail::node(leading), facts, Domain::Complex, context);
186 if (!nonzero) {
187 return SolveResult::failure(nonzero.error());
188 }
189 if (nonzero.value() == Tribool::False) {
190 --degree;
191 continue;
192 }
193 if (nonzero.value() == Tribool::Unknown || degree >= 3) {
194 return degree == 1
196 polynomial, leading, variable)
197 : conditional_equation(original, variable);
198 }
199 if (degree == 0) {
200 return SolutionSet{EmptySolutions{}};
201 }
202 if (degree == 2) {
204 polynomial, leading, facts, context);
205 }
207 SymbolicExpr::multiply(
208 SymbolicExpr::number(-1),
209 get_coeff(polynomial, 0)),
210 leading)), transform_budget));
212 FiniteSolution{value, 1, {}}}}};
213 }
215} catch (const CasError& error) {
216 return SolveResult::failure(error);
217} catch (const std::bad_alloc&) {
218 return SolveResult::failure(CasErrc::ResourceLimit, "allocation failed", "solve_symbolic_polynomial_set");
219} catch (const std::length_error& error) {
220 return SolveResult::failure(CasErrc::ResourceLimit, error.what(), "solve_symbolic_polynomial_set");
221} catch (const std::exception& error) {
222 return SolveResult::failure(CasErrc::InternalInvariant, error.what(), "solve_symbolic_polynomial_set");
223}
static SolveResult conditional_linear_polynomial(const Polynomial< SymbolicPolyCoeff > &polynomial, const ExprPtr &leading, const std::string &variable)
@ Unknown
Property cannot be determined
static SolveResult solve_symbolic_quadratic(const Polynomial< SymbolicPolyCoeff > &polynomial, const ExprPtr &leading, const FactsQuery &facts, ComputationContext &context)

引用了 Complex, conditional_equation(), conditional_linear_polynomial(), context, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Result< SolutionSet >::failure(), False, get_coeff(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::no_facts(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::query_nonzero_value(), solve_symbolic_polynomial_set(), solve_symbolic_quadratic(), Unknown, value , 以及 variable.

被这些函数引用 dispatch_equation(), solve_set_core() , 以及 solve_symbolic_polynomial_set().

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

◆ solve_symbolic_quadratic()

SolveResult LMCAS::solve_symbolic_quadratic ( const Polynomial< SymbolicPolyCoeff > & polynomial,
const ExprPtr & leading,
const FactsQuery & facts,
ComputationContext & context )
static

在文件 solve_visitor.cpp 第 98 行定义.

101 {
102 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
103 (context).limits().max_ast_nodes, "transform");
104 auto linear = get_coeff(polynomial, 1);
105 auto constant = get_coeff(polynomial, 0);
106 auto discriminant = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(
107 SymbolicExpr::power(linear, SymbolicExpr::number(2)),
108 SymbolicExpr::multiply(
109 SymbolicExpr::number(-4),
110 SymbolicExpr::multiply(leading, constant)))), transform_budget));
111 auto nonzero = detail::query_nonzero_value(
112 detail::node(discriminant), facts, Domain::Complex, context);
113 if (!nonzero) {
114 return SolveResult::failure(nonzero.error());
115 }
116
117 auto radical = detail::make_expression_ptr(
120 std::vector<std::shared_ptr<const SymbolicNode>>{
121 detail::node(discriminant)}));
122 auto negative_linear =
123 SymbolicExpr::multiply(SymbolicExpr::number(-1), linear);
124 auto denominator =
125 SymbolicExpr::multiply(SymbolicExpr::number(2), leading);
126 auto positive = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(
127 SymbolicExpr::add(negative_linear, radical),
128 denominator)), transform_budget));
129 auto negative = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(
130 SymbolicExpr::add(
131 negative_linear,
132 SymbolicExpr::multiply(
133 SymbolicExpr::number(-1), radical)),
134 denominator)), transform_budget));
135 auto repeated =
136 detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(negative_linear, denominator)), transform_budget));
137
138 if (nonzero.value() == Tribool::False) {
140 FiniteSolution{repeated, 2, {}}}}};
141 }
142 if (nonzero.value() == Tribool::True) {
144 FiniteSolution{positive, 1, {}},
145 FiniteSolution{negative, 1, {}}}}};
146 }
147
148 auto zero = SymbolicExpr::number(0);
149 auto distinct =
150 polynomial_relation(discriminant, zero, RelationOp::NEQ);
151 auto coincident =
152 polynomial_relation(discriminant, zero, RelationOp::EQ);
154 FiniteSolution{positive, 1, {distinct}},
155 FiniteSolution{negative, 1, {distinct}},
156 FiniteSolution{positive, 2, {coincident}}}}};
157} catch (const CasError& error) {
158 return SolveResult::failure(error);
159} catch (const std::bad_alloc&) {
160 return SolveResult::failure(CasErrc::ResourceLimit, "allocation failed", "solve_symbolic_quadratic");
161} catch (const std::length_error& error) {
162 return SolveResult::failure(CasErrc::ResourceLimit, error.what(), "solve_symbolic_quadratic");
163} catch (const std::exception& error) {
164 return SolveResult::failure(CasErrc::InternalInvariant, error.what(), "solve_symbolic_quadratic");
165}

引用了 Complex, context, denominator, EQ, LMCAS::Result< SolutionSet >::failure(), False, get_coeff(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), NEQ, LMCAS::detail::node(), LMCAS::detail::normalize_node(), polynomial_relation(), LMCAS::detail::query_nonzero_value(), solve_symbolic_quadratic(), LMCAS::FunctionNode::Sqrt , 以及 True.

被这些函数引用 solve_symbolic_polynomial_set() , 以及 solve_symbolic_quadratic().

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

◆ solve_transcendental() [1/2]

SolveResult LMCAS::solve_transcendental ( const ExprPtr & expr,
const std::string & var,
ComputationContext & context,
const SolveOptions & options )

在文件 solve_transcendental.cpp 第 329 行定义.

331 {
332 if (!expr || !detail::node(expr) || var.empty()) {
334 "Expression and variable must not be empty", "solve.transcendental");
335 }
336 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
337 context.limits().max_ast_nodes,
338 "solve.transcendental");
339 auto equation = expr;
340 if (auto relation = std::dynamic_pointer_cast<const RelationalNode>(detail::node(expr))) {
341 if (relation->op() != RelationalNode::Op::EQ) {
343 "Expected an equality", "solve.transcendental");
344 }
345 equation = SymbolicExpr::add(detail::make_expression_ptr(relation->left()),
346 SymbolicExpr::multiply(SymbolicExpr::number(-1),
348 }
349 equation = detail::make_expression_ptr(detail::normalize_node(detail::node(equation), transform_budget));
350 auto solved = std::dynamic_pointer_cast<const MultiplyNode>(detail::node(equation)) ?
351 solve_equation(equation, var, context, options) :
352 solve_transcendental_impl(expr, equation, var, context, options, 0);
353 if (!solved) return solved;
354 auto coalesced = coalesce_periodic_families(solved.value(), context);
355 if (!coalesced) return SolveResult::failure(coalesced.error());
356 return detail::finalize_solution_set(expr, var, std::move(solved).value(), context, Domain::Real, options);
357}
358catch (const CasError& error) {
359 return SolveResult::failure(error);
360} catch (const std::bad_alloc&) {
362 "transcendental solve allocation failed", "solve.transcendental");
363} catch (const std::length_error& error) {
364 return SolveResult::failure(CasErrc::ResourceLimit, error.what(), "solve.transcendental");
365} catch (const std::exception& error) {
366 return SolveResult::failure(CasErrc::InternalInvariant, error.what(), "solve.transcendental");
367}
SolveResult solve_transcendental_impl(const ExprPtr &original, const ExprPtr &expr, const std::string &var, ComputationContext &context, const SolveOptions &options, int depth)
Result< void > coalesce_periodic_families(SolutionSet &solutions, ComputationContext &context)

引用了 context, LMCAS::Result< SolutionSet >::failure(), LMCAS::detail::finalize_solution_set(), InvalidArgument, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), options, Real, relation(), solve_equation(), solve_transcendental() , 以及 value.

被这些函数引用 solve_set_core(), solve_transcendental(), solve_transcendental() , 以及 LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::solve_transcendental_factor().

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

◆ solve_transcendental() [2/2]

SolveResult LMCAS::solve_transcendental ( const ExprPtr & expr,
const std::string & var,
const SolveOptions & options )

在文件 solve_transcendental.cpp 第 369 行定义.

370 {
372 return solve_transcendental(expr, var, context, options);
373}

引用了 context, options , 以及 solve_transcendental().

函数调用图:

◆ solve_variation_of_parameters_checked() [1/2]

ODESolutionResult LMCAS::solve_variation_of_parameters_checked ( const std::shared_ptr< SymbolicExpr > & y1,
const std::shared_ptr< SymbolicExpr > & y2,
const std::shared_ptr< SymbolicExpr > & g,
const std::string & x )

在文件 ode_advanced.cpp 第 72 行定义.

77{
80}
ODESolutionResult solve_variation_of_parameters_checked(const std::shared_ptr< SymbolicExpr > &y1, const std::shared_ptr< SymbolicExpr > &y2, const std::shared_ptr< SymbolicExpr > &g, const std::string &x, ComputationContext &context)

引用了 context , 以及 solve_variation_of_parameters_checked().

函数调用图:

◆ solve_variation_of_parameters_checked() [2/2]

ODESolutionResult LMCAS::solve_variation_of_parameters_checked ( const std::shared_ptr< SymbolicExpr > & y1,
const std::shared_ptr< SymbolicExpr > & y2,
const std::shared_ptr< SymbolicExpr > & g,
const std::string & x,
ComputationContext & context )

在文件 ode_advanced.cpp 第 31 行定义.

37{
38 const std::string operation = "solve_variation_of_parameters";
39 auto valid = validate_ode_three_expr_one_var(y1, y2, g, x, context, operation);
40 if (!valid) {
41 return ODESolutionResult::failure(valid.error());
42 }
43
44 auto budget = context.consume_steps(24, operation);
45 if (!budget) {
46 return ODESolutionResult::failure(budget.error());
47 }
48
49 try {
51 y1, y2, g, x, context);
52 if (!solved) {
53 return solved;
54 }
55 return wrap_ode_solution(
56 std::move(solved.value()),
58 operation);
59 } catch (const std::bad_alloc&) {
62 "allocation failed while applying variation of parameters",
63 operation);
64 } catch (const std::exception& ex) {
67 ex.what(),
68 operation);
69 }
70}
Result< void > validate_ode_three_expr_one_var(const std::shared_ptr< SymbolicExpr > &first, const std::shared_ptr< SymbolicExpr > &second, const std::shared_ptr< SymbolicExpr > &third, const std::string &x, ComputationContext &context, const std::string &operation)
static ODESolutionResult solve_variation_of_parameters_core(const std::shared_ptr< SymbolicExpr > &y1, const std::shared_ptr< SymbolicExpr > &y2, const std::shared_ptr< SymbolicExpr > &g, const std::string &x, ComputationContext &context)

引用了 context, LMCAS::Result< ODESolution >::failure(), HigherOrder_ConstCoeff, InternalInvariant, ResourceLimit, solve_variation_of_parameters_checked(), solve_variation_of_parameters_core(), validate_ode_three_expr_one_var() , 以及 wrap_ode_solution().

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

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

◆ solve_variation_of_parameters_core()

ODESolutionResult LMCAS::solve_variation_of_parameters_core ( const std::shared_ptr< SymbolicExpr > & y1,
const std::shared_ptr< SymbolicExpr > & y2,
const std::shared_ptr< SymbolicExpr > & g,
const std::string & x,
ComputationContext & context )
static

计算 y₁' 和 y₂'

计算 Wronskian: W = y₁·y₂' - y₂·y₁'

计算 u₁' = -y₂·g(x)/W

计算 u₂' = y₁·g(x)/W

特解: y_p = u₁·y₁ + u₂·y₂

在文件 ode_advanced.cpp 第 82 行定义.

88 {
89 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
90 (context).limits().max_ast_nodes, "transform");
91 /// 计算 y₁' 和 y₂'
92 auto y1_prime = detail::make_expression_ptr(detail::differentiate_node(detail::node(y1), x, transform_budget));
93 auto y2_prime = detail::make_expression_ptr(detail::differentiate_node(detail::node(y2), x, transform_budget));
94
95 /// 计算 Wronskian: W = y₁·y₂' - y₂·y₁'
96 auto term1 = SymbolicExpr::multiply(y1, y2_prime);
97 auto term2 = SymbolicExpr::multiply(y2, y1_prime);
98 auto W = SymbolicExpr::add(term1,
99 SymbolicExpr::multiply(SymbolicExpr::number(-1), term2));
101 EqvOptions trig_options;
102 trig_options.profile = EqvProfile::TrigBasic;
103 auto unit_wronskian = check_equivalent(
104 W, SymbolicExpr::number(1), context, trig_options);
105 if (!unit_wronskian) {
106 return ODESolutionResult::failure(unit_wronskian.error());
107 }
108 if (std::holds_alternative<ProvedZeroResidual>(
109 unit_wronskian.value())) {
110 W = SymbolicExpr::number(1);
111 }
112
113 if (W->is_zero()) {
114 return ODESolution{};
115 }
116
117 /// 计算 u₁' = -y₂·g(x)/W
118 auto u1_prime = SymbolicExpr::divide(
119 SymbolicExpr::multiply(SymbolicExpr::number(-1),
120 SymbolicExpr::multiply(y2, g)),
121 W);
122 u1_prime = detail::make_expression_ptr(detail::normalize_node(detail::node(u1_prime), transform_budget));
123
124 /// 计算 u₂' = y₁·g(x)/W
125 auto u2_prime = SymbolicExpr::divide(
126 SymbolicExpr::multiply(y1, g),
127 W);
128 u2_prime = detail::make_expression_ptr(detail::normalize_node(detail::node(u2_prime), transform_budget));
129
130 Integrator integrator;
131 auto u1_value =
132 integrator.integrate_checked(*u1_prime, x, context);
133 if (!u1_value) {
134 return ODESolutionResult::failure(u1_value.error());
135 }
136 auto u2_value =
137 integrator.integrate_checked(*u2_prime, x, context);
138 if (!u2_value) {
139 return ODESolutionResult::failure(u2_value.error());
140 }
141 auto u1 = std::make_shared<SymbolicExpr>(
142 std::move(u1_value.value()));
143 auto u2 = std::make_shared<SymbolicExpr>(
144 std::move(u2_value.value()));
145
146 /// 特解: y_p = u₁·y₁ + u₂·y₂
147 auto y_p = SymbolicExpr::add(
148 SymbolicExpr::multiply(u1, y1),
149 SymbolicExpr::multiply(u2, y2));
151
152 ODESolution result{};
154 result.general_solution = std::move(y_p);
155 return result;
156} catch (const CasError& error) {
157 return ODESolutionResult::failure(error);
158} catch (const std::bad_alloc&) {
159 return ODESolutionResult::failure(CasErrc::ResourceLimit, "allocation failed", "solve_variation_of_parameters_core");
160} catch (const std::length_error& error) {
161 return ODESolutionResult::failure(CasErrc::ResourceLimit, error.what(), "solve_variation_of_parameters_core");
162} catch (const std::exception& error) {
163 return ODESolutionResult::failure(CasErrc::InternalInvariant, error.what(), "solve_variation_of_parameters_core");
164}

引用了 check_equivalent(), context, LMCAS::detail::differentiate_node(), LMCAS::Result< ODESolution >::failure(), LMCAS::ODESolution::general_solution, HigherOrder_ConstCoeff, integrator, LMCAS::detail::make_expression_ptr(), LMCAS::ODESolution::method_used, LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::EqvOptions::profile, solve_variation_of_parameters_core() , 以及 TrigBasic.

被这些函数引用 solve_variation_of_parameters_checked() , 以及 solve_variation_of_parameters_core().

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

◆ solve_with_assumptions_checked() [1/2]

AssumptionSolveResult LMCAS::solve_with_assumptions_checked ( const std::shared_ptr< SymbolicExpr > & equation,
const std::string & variable,
const AssumptionContext * assumptions )

在文件 solver_assumptions.cpp 第 294 行定义.

298{
301 equation, variable, assumptions, context);
302}
AssumptionSolveResult solve_with_assumptions_checked(const std::shared_ptr< SymbolicExpr > &equation, const std::string &variable, const AssumptionContext *assumptions, ComputationContext &context)

引用了 context, solve_with_assumptions_checked() , 以及 variable.

函数调用图:

◆ solve_with_assumptions_checked() [2/2]

AssumptionSolveResult LMCAS::solve_with_assumptions_checked ( const std::shared_ptr< SymbolicExpr > & equation,
const std::string & variable,
const AssumptionContext * assumptions,
ComputationContext & context )

在文件 solver_assumptions.cpp 第 260 行定义.

265{
266 constexpr const char* operation = "solve_with_assumptions";
267 if (!equation || variable.empty()) {
270 "assumption-aware solve requires an equation and variable",
271 operation);
272 }
273 auto budget = context.consume_steps(1, operation);
274 if (!budget) {
275 return AssumptionSolveResult::failure(budget.error());
276 }
277 try {
279 equation, variable, assumptions, context);
280 } catch (const CasError& error) {
281 return AssumptionSolveResult::failure(error);
282 } catch (const std::bad_alloc&) {
285 "allocation failed while solving with assumptions",
286 operation);
287 } catch (const std::length_error& error) {
288 return AssumptionSolveResult::failure(CasErrc::ResourceLimit, error.what(), operation);
289 } catch (const std::exception& ex) {
291 }
292}
static AssumptionSolveResult solve_with_assumptions_impl(const std::shared_ptr< SymbolicExpr > &equation, const std::string &variable, const AssumptionContext *ctx, ComputationContext &context)

引用了 context, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), InternalInvariant, InvalidArgument, ResourceLimit, solve_with_assumptions_checked(), solve_with_assumptions_impl() , 以及 variable.

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

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

◆ solve_with_assumptions_impl()

AssumptionSolveResult LMCAS::solve_with_assumptions_impl ( const std::shared_ptr< SymbolicExpr > & equation,
const std::string & variable,
const AssumptionContext * ctx,
ComputationContext & context )
static

在文件 solver_assumptions.cpp 第 214 行定义.

219{
220 auto solved = solve_finite_checked(
221 std::const_pointer_cast<SymbolicExpr>(equation), variable, context);
222 if (!solved) {
223 return AssumptionSolveResult::failure(solved.error());
224 }
225 auto all_solutions = std::move(solved.value());
226
227 if (!ctx) {
228 return all_solutions;
229 }
230
231 Domain domain = ctx->get_domain(variable);
232
233 std::vector<std::shared_ptr<SymbolicExpr>> filtered;
234 filtered.reserve(all_solutions.size());
235
236 bool has_sign_constraint = ctx->has_sign(variable, Sign::NonNegative) ||
237 ctx->has_sign(variable, Sign::Positive) ||
238 ctx->has_sign(variable, Sign::Negative) ||
239 ctx->has_sign(variable, Sign::NonPositive);
240
241 if (domain == Domain::Complex && !has_sign_constraint) {
242 return all_solutions;
243 }
244
245 for (const auto& sol : all_solutions) {
246 if (!sol) {
247 continue;
248 }
249
250 auto excluded = solution_is_excluded(sol, domain, *ctx, variable, context);
251 if (!excluded) return AssumptionSolveResult::failure(excluded.error());
252 if (!excluded.value()) {
253 filtered.push_back(sol);
254 }
255 }
256
257 return filtered;
258}
static Result< bool > solution_is_excluded(const std::shared_ptr< SymbolicExpr > &solution, Domain domain, const AssumptionContext &ctx, const std::string &variable, ComputationContext &context)

引用了 Complex, context, domain, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), Negative, NonNegative, NonPositive, Positive, solution_is_excluded(), solve_finite_checked(), solve_with_assumptions_impl() , 以及 variable.

被这些函数引用 solve_with_assumptions_checked() , 以及 solve_with_assumptions_impl().

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

◆ sqrt() [1/2]

ExprResult LMCAS::sqrt ( const ExprPtr & expression)

在文件 expr_elementary.cpp 第 22 行定义.

22 {
24 return sqrt(expression, context);
25}
ExprResult sqrt(const ExprPtr &expression, ComputationContext &context)

引用了 context , 以及 sqrt().

函数调用图:

◆ sqrt() [2/2]

ExprResult LMCAS::sqrt ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_elementary.cpp 第 16 行定义.

16 {
17 auto exponent = rational(Rational(1, 2));
18 if (!exponent) { return exponent; }
19 return quantity_power(expression, exponent.value(), context);
20}

引用了 context, exponent, quantity_power(), rational() , 以及 sqrt().

被这些函数引用 LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function(), sqrt() , 以及 sqrt().

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

◆ square_free_decompose()

SquareFreeDecomp LMCAS::square_free_decompose ( const MultiPoly & poly,
const std::string & main_var )

多元无平方因子分解(Yun 算法的多元推广)

通过计算 gcd(f, partialf/partialx_main) 检测重因子,将多项式分解为 f = f_1 * f_2^2 * f₃^3 * ... 的形式,其中每个 fᵢ 无平方.

参数
[in]poly输入多元多项式
[in]main_var主变量名
返回
无平方因子分解结果,components[i] 的重数为 i+1

零多项式或常数多项式:直接返回

若 main_var 不在变量列表中或次数为 0,多项式无重因子

步骤 1:计算 f' = partialf/partialmain_var

步骤 2:计算 g = gcd(f, f');特征 0 下 f' 为零时,f 直接作为单个无平方因子.

步骤 3:若 g 为常数,f 已无平方

步骤 4:Yun 算法迭代提取无平方分量 w = f / g, y = f' / g, z = y - w'

w 是最后一个分量

过滤掉常数为 1 的平凡分量(保留结构但不影响语义) 注意:components[i] 的重数为 i+1

在文件 multivariate_factor.cpp 第 429 行定义.

430{
431 /// 零多项式或常数多项式:直接返回
432 if (poly.is_zero() || poly.is_constant()) {
433 return SquareFreeDecomp{{poly}};
434 }
435
436 /// 若 main_var 不在变量列表中或次数为 0,多项式无重因子
437 const auto& vars = poly.variables();
438 int var_idx = -1;
439 for (size_t i = 0; i < vars.size(); ++i) {
440 if (vars[i] == main_var) { var_idx = static_cast<int>(i); break; }
441 }
442 if (var_idx < 0 || poly.degree(main_var) <= 0) {
443 return SquareFreeDecomp{{poly}};
444 }
445
446 /// 步骤 1:计算 f' = partialf/partialmain_var
447 MultiPoly f_prime = formal_derivative(poly, main_var);
448
449 /// 步骤 2:计算 g = gcd(f, f');特征 0 下 f' 为零时,f 直接作为单个无平方因子.
450 if (f_prime.is_zero()) {
451 return SquareFreeDecomp{{poly}};
452 }
453
454 MultiPoly g = multivariate_gcd(poly, f_prime);
455
456 /// 步骤 3:若 g 为常数,f 已无平方
457 if (g.is_constant()) {
458 return SquareFreeDecomp{{poly}};
459 }
460
461 /// 步骤 4:Yun 算法迭代提取无平方分量
462 /// w = f / g, y = f' / g, z = y - w'
463 MultiPoly w = poly.exact_div(g);
464 MultiPoly y = f_prime.exact_div(g);
465 MultiPoly w_prime = formal_derivative(w, main_var);
466 MultiPoly z = y - w_prime;
467
468 std::vector<MultiPoly> components;
469
470 while (!z.is_zero()) {
471 MultiPoly component_i = multivariate_gcd(w, z);
472 w = w.exact_div(component_i);
473 y = z.exact_div(component_i);
474 w_prime = formal_derivative(w, main_var);
475 z = y - w_prime;
476 components.push_back(std::move(component_i));
477 }
478
479 /// w 是最后一个分量
480 components.push_back(std::move(w));
481
482 /// 过滤掉常数为 1 的平凡分量(保留结构但不影响语义)
483 /// 注意:components[i] 的重数为 i+1
484 return SquareFreeDecomp{std::move(components)};
485}
static MultiPoly formal_derivative(const MultiPoly &poly, const std::string &main_var)
计算多元多项式关于指定变量的形式偏导数
无平方因子分解结果

引用了 formal_derivative(), main_var, multivariate_gcd(), square_free_decompose() , 以及 vars.

被这些函数引用 square_free_decompose().

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

◆ square_free_factorization()

std::vector< std::pair< Polynomial< Rational >, int > > LMCAS::square_free_factorization ( const Polynomial< Rational > & poly)

在文件 rational_square_free.cpp 第 6 行定义.

7 {
8
9 std::vector<std::pair<Polynomial<Rational>, int>> factors;
10
11 if (poly.is_zero() || poly.degree() <= 0) {
12 return factors;
13 }
14
15 Polynomial<Rational> f = poly.make_monic();
16
17 if (f.degree() == 1) {
18 factors.push_back({f, 1});
19 return factors;
20 }
21
24
25 if (g.degree() <= 0) {
26 factors.push_back({f, 1});
27 return factors;
28 }
29
30 auto [w, w_rem] = f.div_mod(g);
31
32 int multiplicity = 1;
33
34 while (w.degree() > 0) {
35
37
38 auto [z, z_rem] = w.div_mod(y);
39
40 if (z.degree() > 0) {
41
42 factors.push_back({z.make_monic(), multiplicity});
43 }
44
45 auto [g_next, g_rem] = g.div_mod(y);
46 g = g_next;
47 w = y;
49 }
50
51 if (g.degree() > 0) {
52 factors.push_back({g.make_monic(), multiplicity});
53 }
54
55 return factors;
56}
static Polynomial gcd(Polynomial a, Polynomial b)
计算两个多项式的最大公因式
Polynomial differentiate() const
求导

引用了 LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Polynomial< CoeffType >::differentiate(), LMCAS::Polynomial< CoeffType >::div_mod(), LMCAS::Polynomial< CoeffType >::gcd(), LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::Polynomial< CoeffType >::make_monic() , 以及 square_free_factorization().

被这些函数引用 LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::cauchy_index_on_edge(), LMCAS::polynomial_solver_detail::exact_polynomial_roots(), LMCAS::detail::factor_denominator(), LMCAS::detail::inequality_support::find_roots_with_multiplicity(), LMCAS::polynomial_solver_detail::solve_by_factoring_impl(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::solve_exact_polynomial_inequality_impl(), solve_exact_polynomial_set() , 以及 square_free_factorization().

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

◆ starts_with_at()

bool LMCAS::starts_with_at ( const std::string & str,
size_t pos,
const std::string & prefix )
static

在文件 interval_serialization.cpp 第 62 行定义.

62 {
63 if (pos + prefix.size() > str.size()) {
64 return false;
65 }
66 return str.compare(pos, prefix.size(), prefix) == 0;
67}

引用了 starts_with_at().

被这些函数引用 parse_endpoint_value(), parse_numeric_value() , 以及 starts_with_at().

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

◆ stokes_theorem()

std::shared_ptr< SymbolicExpr > LMCAS::stokes_theorem ( const VectorField & F,
const std::vector< std::string > & vars,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & u_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & v_bounds )

计算旋度 ∇×F

计算 r_u × r_v(曲面法向量)

将 (∇×F) 中的坐标变量替换为参数化表达式,然后计算 (∇×F)·(r_u × r_v)

将 (∇×F)ᵢ 中的坐标变量替换为参数化表达式

(∇×F)ᵢ(r(u,v)) · (r_u × r_v)ᵢ

在文件 vector_calculus_integral_api.cpp 第 365 行定义.

372{
374 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
375 (context).limits().max_ast_nodes, "transform");
376 if (F.size() != 3) {
377 throw std::invalid_argument("stokes_theorem: F must have 3 components");
378 }
379 if (vars.size() != 3) {
380 throw std::invalid_argument("stokes_theorem: vars must have exactly 3 elements");
381 }
382 if (parametrization.size() != 3) {
383 throw std::invalid_argument(
384 "stokes_theorem: parametrization must have 3 components");
385 }
386 if (!u_bounds.first || !u_bounds.second ||
387 !v_bounds.first || !v_bounds.second) {
388 throw std::invalid_argument("stokes_theorem: bounds must not be null");
389 }
390
391 /// 计算旋度 ∇×F
392 auto curl_F = curl_impl(F, vars, transform_budget);
393
394 /// 计算 r_u × r_v(曲面法向量)
395 auto cross = vector_calculus_cross_product_partials(parametrization, u, v, transform_budget);
396
397 /// 将 (∇×F) 中的坐标变量替换为参数化表达式,然后计算 (∇×F)·(r_u × r_v)
398 std::shared_ptr<SymbolicExpr> dot_product = nullptr;
399
400 for (size_t i = 0; i < 3; ++i) {
401 if (!curl_F[i]) {
402 continue;
403 }
404
405 /// 将 (∇×F)ᵢ 中的坐标变量替换为参数化表达式
406 auto curl_i_composed = curl_F[i];
407 for (size_t j = 0; j < 3; ++j) {
408 curl_i_composed = detail::make_expression_ptr(detail::substitute_node(detail::node(curl_i_composed), vars[j], detail::node(parametrization[j]), transform_budget));
409 }
410 curl_i_composed = detail::make_expression_ptr(detail::normalize_node(detail::node(curl_i_composed), transform_budget));
411
412 /// (∇×F)ᵢ(r(u,v)) · (r_u × r_v)ᵢ
413 auto term = SymbolicExpr::multiply(curl_i_composed, cross[i]);
414 term = detail::make_expression_ptr(detail::normalize_node(detail::node(term), transform_budget));
415
416 if (!dot_product) {
417 dot_product = term;
418 } else {
419 dot_product = SymbolicExpr::add(dot_product, term);
421 }
422 }
423
424 if (!dot_product) {
425 return SymbolicExpr::number(0);
426 }
427
428 Integrator integrator;
429
430 std::vector<IntegrationStep> steps = {
431 {v, v_bounds.first, v_bounds.second},
432 {u, u_bounds.first, u_bounds.second},
433 };
435 if (!result) throw result.error();
436 return LMCAS::detail::make_expression_ptr(result.value());
437}
VectorField vector_calculus_cross_product_partials(const VectorField &parametrization, const std::string &u, const std::string &v, detail::RewriteBudget &transform_budget)
__attribute__((visibility("default"))) std const std::vector< std::string > const VectorField const std::string const std::string const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & u_bounds
__attribute__((visibility("default"))) std const std::vector< std::string > const VectorField const std::string const std::string const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & v_bounds

引用了 context, LMCAS::vector_calculus_detail::curl_impl(), dot_product(), integrate_multiple_checked(), integrator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), parametrization, steps, stokes_theorem(), LMCAS::detail::substitute_node(), u, u_bounds, v, v_bounds, vars , 以及 LMCAS::vector_calculus_detail::vector_calculus_cross_product_partials().

被这些函数引用 stokes_theorem().

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

◆ stokes_theorem_checked() [1/2]

VectorCalculusExprResult LMCAS::stokes_theorem_checked ( const VectorField & F,
const std::vector< std::string > & vars,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & u_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & v_bounds )

在文件 vector_calculus_integral_api.cpp 第 352 行定义.

359{
363}
VectorCalculusExprResult stokes_theorem_checked(const VectorField &F, const std::vector< std::string > &vars, const VectorField &parametrization, const std::string &u, const std::string &v, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &u_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &v_bounds, ComputationContext &context)

引用了 context, parametrization, stokes_theorem_checked(), u, u_bounds, v, v_bounds , 以及 vars.

函数调用图:

◆ stokes_theorem_checked() [2/2]

VectorCalculusExprResult LMCAS::stokes_theorem_checked ( const VectorField & F,
const std::vector< std::string > & vars,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & u_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & v_bounds,
ComputationContext & context )

在文件 vector_calculus_integral_api.cpp 第 306 行定义.

314{
315 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
316 context.limits().max_ast_nodes, "stokes_theorem");
317 const std::string operation = "stokes_theorem";
318 auto field_valid = vector_calculus_validate_field_vars(F, vars, context, operation);
319 if (!field_valid) {
320 return VectorCalculusExprResult::failure(field_valid.error());
321 }
322 auto vars_valid = vector_calculus_validate_distinct_vars(vars, 3, context, operation);
323 if (!vars_valid) {
324 return VectorCalculusExprResult::failure(vars_valid.error());
325 }
327 parametrization, u, v, u_bounds.first, u_bounds.second,
328 v_bounds.first, v_bounds.second, context, operation);
329 if (!param_valid) {
330 return VectorCalculusExprResult::failure(param_valid.error());
331 }
332 auto step = context.consume_steps(18, operation);
333 if (!step) {
334 return VectorCalculusExprResult::failure(step.error());
335 }
336
337 try {
338 return stokes_theorem_strict(F, vars, parametrization, u, v, u_bounds, v_bounds, context, operation, transform_budget);
339 } catch (const CasError& error) {
341 } catch (const std::bad_alloc&) {
343 "Stokes theorem allocation failed",
344 operation);
345 } catch (const std::length_error& error) {
346 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
347 } catch (const std::exception& e) {
349 }
350}
Result< void > vector_calculus_validate_surface_parametrization(const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation)
VectorCalculusExprResult stokes_theorem_strict(const VectorField &field, const std::vector< std::string > &variables, const VectorField &parametrization, const std::string &u, const std::string &v, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &u_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &v_bounds, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)

引用了 context, e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, parametrization, ResourceLimit, stokes_theorem_checked(), LMCAS::vector_calculus_detail::stokes_theorem_strict(), u, u_bounds, v, v_bounds, vars, LMCAS::vector_calculus_detail::vector_calculus_validate_distinct_vars(), LMCAS::vector_calculus_detail::vector_calculus_validate_field_vars() , 以及 LMCAS::vector_calculus_detail::vector_calculus_validate_surface_parametrization().

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

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

◆ strip_to_base_value()

ExprResult LMCAS::strip_to_base_value ( const ExprPtr & quantity,
ComputationContext & context )

在文件 value_facade.cpp 第 31 行定义.

32 {
34}
QuantityResult strip_unit(const std::shared_ptr< SymbolicExpr > &expression, UnitStripMode mode, ComputationContext &context)

引用了 BaseValue, context, strip_to_base_value() , 以及 strip_unit().

被这些函数引用 strip_to_base_value().

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

◆ strip_to_display_value()

ExprResult LMCAS::strip_to_display_value ( const ExprPtr & quantity,
ComputationContext & context )

在文件 value_facade.cpp 第 36 行定义.

37 {
39}

引用了 context, DisplayValue, strip_to_display_value() , 以及 strip_unit().

被这些函数引用 strip_to_display_value().

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

◆ strip_unit()

QuantityResult LMCAS::strip_unit ( const std::shared_ptr< SymbolicExpr > & expression,
UnitStripMode mode,
ComputationContext & context )

在文件 quantity.cpp 第 181 行定义.

183 {
184 auto step = context.consume_steps(1, kOperation);
185 if (!step) return QuantityResult::failure(step.error());
186 if (!expression || !detail::node(expression)) {
187 return failure(CasErrc::InvalidArgument,
188 "unit stripping requires an expression");
189 }
190 auto quantity = std::dynamic_pointer_cast<const QuantityNode>(
191 detail::node(expression));
192 if (!quantity) return QuantityResult::success(expression);
193 auto value = mode == UnitStripMode::BaseValue
195 {quantity->value(), rational_node(quantity->scale_to_base())})
196 : quantity->value();
198}

引用了 BaseValue, context, LMCAS::SymbolicFactory::create_multiply(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InvalidArgument, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), strip_unit(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success() , 以及 value.

被这些函数引用 LMCAS::expr_detail::expr_common::comparison_value(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prepare_operands(), strip_to_base_value(), strip_to_display_value() , 以及 strip_unit().

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

◆ structurally_equal()

bool LMCAS::structurally_equal ( const SymbolicExpr & lhs,
const SymbolicExpr & rhs )

在文件 equivalence_engine.cpp 第 189 行定义.

189 {
190 const auto& left = detail::node(lhs);
191 const auto& right = detail::node(rhs);
192 if (!left || !right) return left == right;
193 return left->equals(*right);
194}

引用了 LMCAS::detail::node(), rhs, right , 以及 structurally_equal().

被这些函数引用 LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_checked_operands(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_operands() , 以及 structurally_equal().

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

◆ sub() [1/2]

ExprResult LMCAS::sub ( const ExprPtr & lhs,
const ExprPtr & rhs )

在文件 expr_arithmetic.cpp 第 68 行定义.

68 {
70 return sub(lhs, rhs, context);
71}
ExprResult sub(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)

引用了 context, rhs , 以及 sub().

函数调用图:

◆ sub() [2/2]

ExprResult LMCAS::sub ( const ExprPtr & lhs,
const ExprPtr & rhs,
ComputationContext & context )

在文件 expr_arithmetic.cpp 第 62 行定义.

64 {
65 return quantity_subtract(lhs, rhs, context);
66}
QuantityResult quantity_subtract(const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs, ComputationContext &context)

引用了 context, quantity_subtract(), rhs , 以及 sub().

被这些函数引用 LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_binomial_power(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_common_monomial(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_difference_of_squares(), LMCAS::expr_detail::ExprParser::parse_additive(), sub(), sub() , 以及 symbolic_cubic_roots().

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

◆ substitute() [1/6]

ExprResult LMCAS::substitute ( const ExprPtr & expression,
const Binding & replacement )

在文件 expr_transform.cpp 第 116 行定义.

117 {
119 return substitute(expression, replacement, context);
120}
ExprResult substitute(const ExprPtr &expression, const std::string &variable, const ExprPtr &value, ComputationContext &context)

引用了 context , 以及 substitute().

函数调用图:

◆ substitute() [2/6]

ExprResult LMCAS::substitute ( const ExprPtr & expression,
const Binding & replacement,
ComputationContext & context )

在文件 expr_transform.cpp 第 106 行定义.

108 {
109 auto checked = binding(replacement.symbol, replacement.value);
110 if (!checked) return ExprResult::failure(checked.error());
111 const auto variable = std::dynamic_pointer_cast<const VariableNode>(
112 LMCAS::detail::node(checked.value().symbol));
113 return substitute(expression, variable->name(), checked.value().value, context);
114}

引用了 binding, context, LMCAS::Result< ExprPtr >::failure(), LMCAS::detail::node(), substitute() , 以及 variable.

函数调用图:

◆ substitute() [3/6]

ExprResult LMCAS::substitute ( const ExprPtr & expression,
const std::string & variable,
const ExprPtr & value )

在文件 expr_transform.cpp 第 77 行定义.

79 {
81 return substitute(expression, variable, value, context);
82}

引用了 context, substitute(), value , 以及 variable.

函数调用图:

◆ substitute() [4/6]

ExprResult LMCAS::substitute ( const ExprPtr & expression,
const std::string & variable,
const ExprPtr & value,
ComputationContext & context )

在文件 expr_transform.cpp 第 53 行定义.

56 {
57 auto step = context.consume_steps(1, kSubstituteOperation);
58 if (!step) return ExprResult::failure(step.error());
59 if (!expression) {
61 "expression cannot be null",
63 }
64 if (variable.empty()) {
66 "substitution variable cannot be empty",
68 }
69 if (!value) {
71 "substitution value cannot be null",
73 }
75}
ExpressionResult substitute_expression(const ExprPtr &expression, const std::string &variable, const ExprPtr &replacement, ComputationContext &context)

引用了 context, LMCAS::expr_detail::expr_common::expression_failure(), LMCAS::Result< ExprPtr >::failure(), InvalidArgument, LMCAS::expr_detail::expr_common::kSubstituteOperation, substitute(), LMCAS::detail::substitute_expression(), value , 以及 variable.

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

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

◆ substitute() [5/6]

ExprResult LMCAS::substitute ( const ExprPtr & expression,
const std::vector< Binding > & replacements )

在文件 expr_transform.cpp 第 128 行定义.

129 {
131 return substitute(expression, replacements, context);
132}

引用了 context , 以及 substitute().

函数调用图:

◆ substitute() [6/6]

ExprResult LMCAS::substitute ( const ExprPtr & expression,
const std::vector< Binding > & replacements,
ComputationContext & context )

在文件 expr_transform.cpp 第 122 行定义.

124 {
125 return detail::substitute_expression(expression, replacements, context);
126}

引用了 context, substitute() , 以及 LMCAS::detail::substitute_expression().

函数调用图:

◆ substitute_free()

detail::SymbolicNodePtr LMCAS::substitute_free ( const detail::SymbolicNodePtr & expression,
const std::string & variable,
const detail::SymbolicNodePtr & replacement,
detail::RewriteBudget * budget )

在文件 expression_analysis.cpp 第 336 行定义.

339 {
340 if (!expression) return nullptr;
341 if (variable.empty()) throw std::invalid_argument("substitution variable cannot be empty");
342 if (!replacement) throw std::invalid_argument("substitution replacement cannot be null");
343
344 auto replacement_free = free_variables(replacement, budget);
345 auto occupied = all_names(expression, budget);
346 auto replacement_names = all_names(replacement, budget);
347 occupied.insert(replacement_names.begin(), replacement_names.end());
348 occupied.insert(variable);
349
350 FreeSubstitution substitution(variable, replacement,
351 std::move(replacement_free),
352 std::move(occupied), budget);
353 return substitution.rewrite(expression);
354}

引用了 free_variables(), substitute_free() , 以及 variable.

被这些函数引用 LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::accept_symbolic(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_complex_at_point(), norm_subst_index(), LMCAS::anonymous_namespace{limit_result.cpp}::ComplexContinuityPoint::positive(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::rewrite_scoped(), substitute_free(), LMCAS::detail::substitute_node() , 以及 LMCAS::detail::substitute_raw().

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

◆ substitute_negative_variable()

std::shared_ptr< const SymbolicNode > LMCAS::substitute_negative_variable ( const VariableNode & node,
const std::string & var,
const std::string & t_var )
static

在文件 limit_visitor_asymptotic.cpp 第 422 行定义.

423 {
424 if (!node.is_constant() && node.name() == var) {
425 std::vector<std::shared_ptr<const SymbolicNode>> ops = {
428 };
430 }
431 return node.clone();
432}

引用了 LMCAS::detail::make_node() , 以及 substitute_negative_variable().

被这些函数引用 substitute_negative_variable().

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

◆ substitute_raw()

ExprPtr LMCAS::detail::substitute_raw ( const ExprPtr & expression,
const std::string & variable,
const ExprPtr & value )

在文件 solve_solution_finalization.cpp 第 10 行定义.

被这些函数引用 append_product_families().

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

◆ supported_laurent_integer_power() [1/2]

std::optional< int > LMCAS::detail::series_support::supported_laurent_integer_power ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & variable )

在文件 series_engine.cpp 第 105 行定义.

108{
109 if (!node) {
110 return std::nullopt;
111 }
112 if (std::dynamic_pointer_cast<const NumberNode>(node)) {
113 return 0;
114 }
115 if (auto variable = std::dynamic_pointer_cast<const VariableNode>(node)) {
116 return !variable->is_constant() && variable->name() == var
117 ? std::optional<int>(1) : std::nullopt;
118 }
119 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
120 return laurent_power_of_power(*power, var);
121 }
122 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
123 BigInt total_power(0);
124 for (const auto& operand : multiply->operands()) {
125 if (std::dynamic_pointer_cast<const NumberNode>(operand)) {
126 continue;
127 }
128 auto power = supported_laurent_integer_power(operand, var);
129 if (!power) {
130 return std::nullopt;
131 }
132 total_power += BigInt(*power);
133 }
134 if (total_power < BigInt(std::numeric_limits<int>::min()) ||
135 total_power > BigInt(std::numeric_limits<int>::max())) {
136 return std::nullopt;
137 }
138 return static_cast<int>(*total_power.try_to_int64());
139 }
140 return std::nullopt;
141
142
143}
static std::optional< int > laurent_power_of_power(const PowerNode &power, const std::string &var)

被这些函数引用 convergence_test_impl(), laurent_series_checked() , 以及 laurent_series_full_checked().

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

◆ supported_laurent_integer_power() [2/2]

std::optional< int > LMCAS::detail::series_support::supported_laurent_integer_power ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & variable )

在文件 series_engine.cpp 第 105 行定义.

108{
109 if (!node) {
110 return std::nullopt;
111 }
112 if (std::dynamic_pointer_cast<const NumberNode>(node)) {
113 return 0;
114 }
115 if (auto variable = std::dynamic_pointer_cast<const VariableNode>(node)) {
116 return !variable->is_constant() && variable->name() == var
117 ? std::optional<int>(1) : std::nullopt;
118 }
119 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
120 return laurent_power_of_power(*power, var);
121 }
122 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
123 BigInt total_power(0);
124 for (const auto& operand : multiply->operands()) {
125 if (std::dynamic_pointer_cast<const NumberNode>(operand)) {
126 continue;
127 }
128 auto power = supported_laurent_integer_power(operand, var);
129 if (!power) {
130 return std::nullopt;
131 }
132 total_power += BigInt(*power);
133 }
134 if (total_power < BigInt(std::numeric_limits<int>::min()) ||
135 total_power > BigInt(std::numeric_limits<int>::max())) {
136 return std::nullopt;
137 }
138 return static_cast<int>(*total_power.try_to_int64());
139 }
140 return std::nullopt;
141
142
143}

◆ surface_area_revolution_x_checked() [1/2]

ExpressionResult LMCAS::surface_area_revolution_x_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b )

在文件 calculus_revolution.cpp 第 123 行定义.

126{
129}
ExpressionResult surface_area_revolution_x_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)

引用了 a, b, context , 以及 surface_area_revolution_x_checked().

函数调用图:

◆ surface_area_revolution_x_checked() [2/2]

ExpressionResult LMCAS::surface_area_revolution_x_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context )

在文件 calculus_revolution.cpp 第 47 行定义.

51 {
52 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
53 (context).limits().max_ast_nodes, "transform");
54 const std::string operation = "surface_area_revolution_x";
55 auto input = calculus_utils_validate_expr_bounds(f, var, a, b, context, operation);
56 if (!input) {
57 return ExpressionResult::failure(input.error());
58 }
59 auto step = context.consume_steps(8, operation);
60 if (!step) {
61 return ExpressionResult::failure(step.error());
62 }
63
64 try {
65 auto f_prime = detail::make_expression_ptr(detail::differentiate_node(detail::node(f), var, transform_budget));
66 if (!f_prime || !LMCAS::detail::node(f_prime)) {
69 "surface derivative is outside the supported domain",
70 operation);
71 }
72
73 auto f_prime_sq = SymbolicExpr::power(f_prime, SymbolicExpr::number(2));
74 auto one_plus_fp_sq = SymbolicExpr::add(SymbolicExpr::number(1), f_prime_sq);
75 auto arc_factor = SymbolicExpr::sqrt(one_plus_fp_sq);
76 auto abs_f = calculus_utils_make_abs(f);
77 if (!abs_f || !LMCAS::detail::node(abs_f)) {
80 "absolute value node construction failed",
81 operation);
82 }
83 auto integrand = SymbolicExpr::multiply(abs_f, arc_factor);
84
86 integrand, var, a, b, context);
87 if (!integral) {
88 return integral;
89 }
90 if (!integral.value() ||
91 !LMCAS::detail::node(integral.value())) {
94 "surface area integral could not be evaluated exactly",
95 operation);
96 }
97
98 auto two_pi = SymbolicExpr::multiply(
99 SymbolicExpr::number(2), LMCAS::detail::make_expression_ptr(
101 auto result = SymbolicExpr::multiply(
102 two_pi, std::move(integral.value()));
103 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(result), transform_budget));
104 return ExpressionResult::success(simplified ? simplified : result);
105 } catch (const std::bad_alloc&) {
107 "surface area allocation failed",
108 operation);
109 } catch (const std::length_error& error) { return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "surface_area_revolution_x"); } catch (const std::exception& e) {
111 e.what(), operation);
112 }
113} catch (const CasError& error) {
114 return ExpressionResult::failure(error);
115} catch (const std::bad_alloc&) {
116 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "surface_area_revolution_x");
117} catch (const std::length_error& error) {
118 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "surface_area_revolution_x");
119} catch (const std::exception& error) {
120 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "surface_area_revolution_x");
121}
Result< void > calculus_utils_validate_expr_bounds(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation)
static ExpressionResult calculus_utils_try_symbolic_definite(const std::shared_ptr< SymbolicExpr > &integrand, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)

引用了 a, b, LMCAS::calculus_utils_detail::calculus_utils_make_abs(), calculus_utils_try_symbolic_definite(), LMCAS::calculus_utils_detail::calculus_utils_validate_expr_bounds(), context, LMCAS::detail::differentiate_node(), e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive, InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), ResourceLimit, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success() , 以及 surface_area_revolution_x_checked().

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

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

◆ surface_area_revolution_y_checked() [1/2]

ExpressionResult LMCAS::surface_area_revolution_y_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b )

在文件 calculus_revolution.cpp 第 209 行定义.

212{
215}
ExpressionResult surface_area_revolution_y_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)

引用了 a, b, context , 以及 surface_area_revolution_y_checked().

函数调用图:

◆ surface_area_revolution_y_checked() [2/2]

ExpressionResult LMCAS::surface_area_revolution_y_checked ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context )

在文件 calculus_revolution.cpp 第 132 行定义.

136 {
137 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
138 (context).limits().max_ast_nodes, "transform");
139 const std::string operation = "surface_area_revolution_y";
140 auto input = calculus_utils_validate_expr_bounds(f, var, a, b, context, operation);
141 if (!input) {
142 return ExpressionResult::failure(input.error());
143 }
144 auto step = context.consume_steps(8, operation);
145 if (!step) {
146 return ExpressionResult::failure(step.error());
147 }
148
149 try {
150 auto f_prime = detail::make_expression_ptr(detail::differentiate_node(detail::node(f), var, transform_budget));
151 if (!f_prime || !LMCAS::detail::node(f_prime)) {
154 "surface derivative is outside the supported domain",
155 operation);
156 }
157
158 auto f_prime_sq = SymbolicExpr::power(f_prime, SymbolicExpr::number(2));
159 auto one_plus_fp_sq = SymbolicExpr::add(SymbolicExpr::number(1), f_prime_sq);
160 auto arc_factor = SymbolicExpr::sqrt(one_plus_fp_sq);
161 auto var_expr = SymbolicExpr::variable(var);
162 auto abs_var = calculus_utils_make_abs(var_expr);
163 if (!abs_var || !LMCAS::detail::node(abs_var)) {
166 "absolute value node construction failed",
167 operation);
168 }
169 auto integrand = SymbolicExpr::multiply(abs_var, arc_factor);
170
172 integrand, var, a, b, context);
173 if (!integral) {
174 return integral;
175 }
176 if (!integral.value() ||
177 !LMCAS::detail::node(integral.value())) {
180 "surface area integral could not be evaluated exactly",
181 operation);
182 }
183
184 auto two_pi = SymbolicExpr::multiply(
185 SymbolicExpr::number(2), LMCAS::detail::make_expression_ptr(
187 auto result = SymbolicExpr::multiply(
188 two_pi, std::move(integral.value()));
189 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(result), transform_budget));
190 return ExpressionResult::success(simplified ? simplified : result);
191 } catch (const std::bad_alloc&) {
193 "surface area allocation failed",
194 operation);
195 } catch (const std::length_error& error) { return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "surface_area_revolution_y"); } catch (const std::exception& e) {
197 e.what(), operation);
198 }
199} catch (const CasError& error) {
200 return ExpressionResult::failure(error);
201} catch (const std::bad_alloc&) {
202 return ExpressionResult::failure(CasErrc::ResourceLimit, "allocation failed", "surface_area_revolution_y");
203} catch (const std::length_error& error) {
204 return ExpressionResult::failure(CasErrc::ResourceLimit, error.what(), "surface_area_revolution_y");
205} catch (const std::exception& error) {
206 return ExpressionResult::failure(CasErrc::InternalInvariant, error.what(), "surface_area_revolution_y");
207}

引用了 a, b, LMCAS::calculus_utils_detail::calculus_utils_make_abs(), calculus_utils_try_symbolic_definite(), LMCAS::calculus_utils_detail::calculus_utils_validate_expr_bounds(), context, LMCAS::detail::differentiate_node(), e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive, InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), ResourceLimit, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success() , 以及 surface_area_revolution_y_checked().

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

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

◆ surface_integral_scalar()

std::shared_ptr< SymbolicExpr > LMCAS::surface_integral_scalar ( const std::shared_ptr< SymbolicExpr > & f,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::shared_ptr< SymbolicExpr > & u_lower,
const std::shared_ptr< SymbolicExpr > & u_upper,
const std::shared_ptr< SymbolicExpr > & v_lower,
const std::shared_ptr< SymbolicExpr > & v_upper )

在文件 vector_calculus_surfaces.cpp 第 88 行定义.

93{
95 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
96 (context).limits().max_ast_nodes, "transform");
97 if (!f) {
98 throw std::invalid_argument("surface_integral_scalar: f must not be null");
99 }
100 if (parametrization.size() != 3) {
101 throw std::invalid_argument(
102 "surface_integral_scalar: parametrization must have 3 components");
103 }
104 if (!u_lower || !u_upper || !v_lower || !v_upper) {
105 throw std::invalid_argument("surface_integral_scalar: bounds must not be null");
106 }
107
108 std::vector<std::string> coord_vars = {"x", "y", "z"};
109
110 auto f_composed = f;
111 for (size_t i = 0; i < 3; ++i) {
112 f_composed = detail::make_expression_ptr(detail::substitute_node(detail::node(f_composed), coord_vars[i], detail::node(parametrization[i]), transform_budget));
113 }
114 f_composed = detail::make_expression_ptr(detail::normalize_node(detail::node(f_composed), transform_budget));
115
116 auto cross = vector_calculus_cross_product_partials(parametrization, u, v, transform_budget);
117
118 std::shared_ptr<SymbolicExpr> mag_sq = nullptr;
119 for (size_t i = 0; i < 3; ++i) {
120 auto sq = SymbolicExpr::power(cross[i], SymbolicExpr::number(2));
122 if (!mag_sq) {
123 mag_sq = sq;
124 } else {
125 mag_sq = SymbolicExpr::add(mag_sq, sq);
126 mag_sq = detail::make_expression_ptr(detail::normalize_node(detail::node(mag_sq), transform_budget));
127 }
128 }
129
130 auto magnitude = SymbolicExpr::sqrt(mag_sq);
131 magnitude = detail::make_expression_ptr(detail::normalize_node(detail::node(magnitude), transform_budget));
132
133 auto integrand = SymbolicExpr::multiply(f_composed, magnitude);
134 integrand = detail::make_expression_ptr(detail::normalize_node(detail::node(integrand), transform_budget));
135
136 Integrator integrator;
137
138 std::vector<IntegrationStep> steps = {
139 {v, v_lower, v_upper},
140 {u, u_lower, u_upper},
141 };
142 auto result = integrate_multiple_checked(*integrand, steps, integrator, context);
143 if (!result) throw result.error();
144 return LMCAS::detail::make_expression_ptr(result.value());
145}
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > & v_lower
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > & u_lower
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > & v_upper
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > & u_upper

引用了 context, integrate_multiple_checked(), integrator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), parametrization, steps, LMCAS::detail::substitute_node(), surface_integral_scalar(), u, u_lower, u_upper, v, v_lower, v_upper , 以及 LMCAS::vector_calculus_detail::vector_calculus_cross_product_partials().

被这些函数引用 surface_integral_scalar().

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

◆ surface_integral_scalar_checked() [1/2]

VectorCalculusExprResult LMCAS::surface_integral_scalar_checked ( const std::shared_ptr< SymbolicExpr > & f,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::shared_ptr< SymbolicExpr > & u_lower,
const std::shared_ptr< SymbolicExpr > & u_upper,
const std::shared_ptr< SymbolicExpr > & v_lower,
const std::shared_ptr< SymbolicExpr > & v_upper )

在文件 vector_calculus_surfaces.cpp 第 77 行定义.

82{
86}
VectorCalculusExprResult surface_integral_scalar_checked(const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context)

引用了 context, parametrization, surface_integral_scalar_checked(), u, u_lower, u_upper, v, v_lower , 以及 v_upper.

函数调用图:

◆ surface_integral_scalar_checked() [2/2]

VectorCalculusExprResult LMCAS::surface_integral_scalar_checked ( const std::shared_ptr< SymbolicExpr > & f,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::shared_ptr< SymbolicExpr > & u_lower,
const std::shared_ptr< SymbolicExpr > & u_upper,
const std::shared_ptr< SymbolicExpr > & v_lower,
const std::shared_ptr< SymbolicExpr > & v_upper,
ComputationContext & context )

在文件 vector_calculus_surfaces.cpp 第 39 行定义.

45{
46 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
47 context.limits().max_ast_nodes, "surface_integral_scalar");
48 const std::string operation = "surface_integral_scalar";
51 context, operation);
52 if (!valid) {
53 return VectorCalculusExprResult::failure(valid.error());
54 }
55
56 auto step = context.consume_steps(parametrization.size() * 6 + 8, operation);
57 if (!step) {
58 return VectorCalculusExprResult::failure(step.error());
59 }
60
61 try {
63 context, operation, transform_budget);
64 } catch (const CasError& error) {
66 } catch (const std::bad_alloc&) {
68 "surface integral allocation failed",
69 operation);
70 } catch (const std::length_error& error) {
71 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
72 } catch (const std::exception& e) {
74 }
75}
VectorCalculusExprResult surface_integral_scalar_strict(const std::shared_ptr< SymbolicExpr > &function, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
Result< void > vector_calculus_validate_surface_scalar_inputs(const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation)

引用了 context, e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, parametrization, ResourceLimit, surface_integral_scalar_checked(), LMCAS::vector_calculus_detail::surface_integral_scalar_strict(), u, u_lower, u_upper, v, v_lower, v_upper , 以及 LMCAS::vector_calculus_detail::vector_calculus_validate_surface_scalar_inputs().

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

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

◆ surface_integral_vector()

std::shared_ptr< SymbolicExpr > LMCAS::surface_integral_vector ( const VectorField & F,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::shared_ptr< SymbolicExpr > & u_lower,
const std::shared_ptr< SymbolicExpr > & u_upper,
const std::shared_ptr< SymbolicExpr > & v_lower,
const std::shared_ptr< SymbolicExpr > & v_upper )

在文件 vector_calculus_surfaces.cpp 第 199 行定义.

204{
206 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
207 (context).limits().max_ast_nodes, "transform");
208 if (F.size() != 3) {
209 throw std::invalid_argument(
210 "surface_integral_vector: F must have 3 components");
211 }
212 if (parametrization.size() != 3) {
213 throw std::invalid_argument(
214 "surface_integral_vector: parametrization must have 3 components");
215 }
216 if (!u_lower || !u_upper || !v_lower || !v_upper) {
217 throw std::invalid_argument("surface_integral_vector: bounds must not be null");
218 }
219
220 std::vector<std::string> coord_vars = {"x", "y", "z"};
221
222 auto cross = vector_calculus_cross_product_partials(parametrization, u, v, transform_budget);
223
224 std::shared_ptr<SymbolicExpr> dot_product = nullptr;
225 for (size_t i = 0; i < 3; ++i) {
226 if (!F[i]) {
227 continue;
228 }
229
230 auto Fi_composed = F[i];
231 for (size_t j = 0; j < 3; ++j) {
232 Fi_composed = detail::make_expression_ptr(detail::substitute_node(detail::node(Fi_composed), coord_vars[j], detail::node(parametrization[j]), transform_budget));
233 }
234 Fi_composed = detail::make_expression_ptr(detail::normalize_node(detail::node(Fi_composed), transform_budget));
235
236 auto term = SymbolicExpr::multiply(Fi_composed, cross[i]);
237 term = detail::make_expression_ptr(detail::normalize_node(detail::node(term), transform_budget));
238
239 if (!dot_product) {
240 dot_product = term;
241 } else {
242 dot_product = SymbolicExpr::add(dot_product, term);
244 }
245 }
246
247 if (!dot_product) {
248 return SymbolicExpr::number(0);
249 }
250
251 Integrator integrator;
252
253 std::vector<IntegrationStep> steps = {
254 {v, v_lower, v_upper},
255 {u, u_lower, u_upper},
256 };
258 if (!result) throw result.error();
259 return LMCAS::detail::make_expression_ptr(result.value());
260}

引用了 context, dot_product(), integrate_multiple_checked(), integrator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), parametrization, steps, LMCAS::detail::substitute_node(), surface_integral_vector(), u, u_lower, u_upper, v, v_lower, v_upper , 以及 LMCAS::vector_calculus_detail::vector_calculus_cross_product_partials().

被这些函数引用 surface_integral_vector().

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

◆ surface_integral_vector_checked() [1/2]

VectorCalculusExprResult LMCAS::surface_integral_vector_checked ( const VectorField & F,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::shared_ptr< SymbolicExpr > & u_lower,
const std::shared_ptr< SymbolicExpr > & u_upper,
const std::shared_ptr< SymbolicExpr > & v_lower,
const std::shared_ptr< SymbolicExpr > & v_upper )

在文件 vector_calculus_surfaces.cpp 第 188 行定义.

193{
197}
VectorCalculusExprResult surface_integral_vector_checked(const VectorField &F, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context)

引用了 context, parametrization, surface_integral_vector_checked(), u, u_lower, u_upper, v, v_lower , 以及 v_upper.

函数调用图:

◆ surface_integral_vector_checked() [2/2]

VectorCalculusExprResult LMCAS::surface_integral_vector_checked ( const VectorField & F,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::shared_ptr< SymbolicExpr > & u_lower,
const std::shared_ptr< SymbolicExpr > & u_upper,
const std::shared_ptr< SymbolicExpr > & v_lower,
const std::shared_ptr< SymbolicExpr > & v_upper,
ComputationContext & context )

在文件 vector_calculus_surfaces.cpp 第 148 行定义.

154{
155 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
156 context.limits().max_ast_nodes, "surface_integral_vector");
157 const std::string operation = "surface_integral_vector";
160 context, operation);
161 if (!valid) {
162 return VectorCalculusExprResult::failure(valid.error());
163 }
164
165 auto step = context.consume_steps(F.size() * parametrization.size() +
166 parametrization.size() * 6 + 8,
167 operation);
168 if (!step) {
169 return VectorCalculusExprResult::failure(step.error());
170 }
171
172 try {
174 context, operation, transform_budget);
175 } catch (const CasError& error) {
177 } catch (const std::bad_alloc&) {
179 "surface integral allocation failed",
180 operation);
181 } catch (const std::length_error& error) {
182 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
183 } catch (const std::exception& e) {
185 }
186}
Result< void > vector_calculus_validate_surface_vector_inputs(const VectorField &F, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation)
VectorCalculusExprResult surface_integral_vector_strict(const VectorField &field, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)

引用了 context, e(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, parametrization, ResourceLimit, surface_integral_vector_checked(), LMCAS::vector_calculus_detail::surface_integral_vector_strict(), u, u_lower, u_upper, v, v_lower, v_upper , 以及 LMCAS::vector_calculus_detail::vector_calculus_validate_surface_vector_inputs().

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

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

◆ surface_normal_checked() [1/2]

VectorExprListResult LMCAS::surface_normal_checked ( const SurfaceSymbolic & surf,
const std::vector< std::shared_ptr< SymbolicExpr > > & point )

在文件 symbolic_geometry_surface.cpp 第 181 行定义.

183 {
185 return surface_normal_checked(surf, point, context);
186}
VectorExprListResult surface_normal_checked(const SurfaceSymbolic &surf, const std::vector< std::shared_ptr< SymbolicExpr > > &point, ComputationContext &context)

引用了 context, point , 以及 surface_normal_checked().

函数调用图:

◆ surface_normal_checked() [2/2]

VectorExprListResult LMCAS::surface_normal_checked ( const SurfaceSymbolic & surf,
const std::vector< std::shared_ptr< SymbolicExpr > > & point,
ComputationContext & context )

在文件 symbolic_geometry_surface.cpp 第 147 行定义.

150 {
151 const std::string operation = "surface_normal";
152 auto valid = validate_surface_point(surf, point, context, operation);
153 if (!valid) return VectorExprListResult::failure(valid.error());
154 auto step = context.consume_steps(surf.vars.size() * 4 + 4, operation);
155 if (!step) return VectorExprListResult::failure(step.error());
156
157 auto gradient = surface_gradient_at_point_checked(surf, point, operation, context);
158 if (!gradient) return gradient;
159 std::vector<double> gradient_values;
160 auto scaled = surface_gradient_scale_checked(
161 gradient.value(), context, operation, gradient_values,
162 "surface normal is undefined at a singular point");
163 if (!scaled) return VectorExprListResult::failure(scaled.error());
164
165 double scaled_norm_sq = 0.0;
166 for (double component : gradient_values) {
167 const double ratio = component / scaled.value();
168 scaled_norm_sq += ratio * ratio;
169 }
170 const double scaled_norm = std::sqrt(scaled_norm_sq);
171
172 std::vector<std::shared_ptr<SymbolicExpr>> result;
173 result.reserve(gradient_values.size());
174 for (double component : gradient_values) {
175 result.push_back(SymbolicExpr::number(
176 (component / scaled.value()) / scaled_norm));
177 }
178 return VectorExprListResult::success(std::move(result));
179}

引用了 context, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), gradient(), point, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success(), surface_normal_checked(), LMCAS::geometry_detail::validate_surface_point() , 以及 LMCAS::SurfaceSymbolic::vars.

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

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

◆ svd_decomposition_checked() [1/2]

SVDDecompositionResult LMCAS::svd_decomposition_checked ( const std::shared_ptr< SymbolicExpr > & A)

在文件 matrix_decomposition_svd.cpp 第 46 行定义.

48{
51}
SVDDecompositionResult svd_decomposition_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)

引用了 context , 以及 svd_decomposition_checked().

函数调用图:

◆ svd_decomposition_checked() [2/2]

SVDDecompositionResult LMCAS::svd_decomposition_checked ( const std::shared_ptr< SymbolicExpr > & A,
ComputationContext & context )

在文件 matrix_decomposition_svd.cpp 第 8 行定义.

11{
12 const std::string operation = "svd_decomposition";
13 auto matrix = validate_decomposition_matrix(A, false, context, operation);
14 if (!matrix) return SVDDecompositionResult::failure(matrix.error());
15 auto budget = context.consume_steps(matrix.value()->rows() * matrix.value()->cols() * 32 + 32,
16 operation);
17 if (!budget) return SVDDecompositionResult::failure(budget.error());
18 auto diagonal = exact_rectangular_diagonal_entries(matrix.value(), context);
19 if (diagonal) {
20 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> signs(
21 matrix.value()->rows(),
22 std::vector<std::shared_ptr<SymbolicExpr>>(
23 matrix.value()->rows(), SymbolicExpr::number(0)));
24 std::vector<Rational> magnitudes = *diagonal;
25 for (std::size_t row = 0; row < matrix.value()->rows(); ++row) {
26 signs[row][row] = SymbolicExpr::number(1);
27 }
28 for (std::size_t index = 0; index < magnitudes.size(); ++index) {
29 if (magnitudes[index] < Rational(0)) {
30 signs[index][index] = SymbolicExpr::number(-1);
31 magnitudes[index] = Rational(0) - magnitudes[index];
32 }
33 }
34 auto U = SymbolicExpr::matrix(signs);
36 matrix.value()->rows(), matrix.value()->cols(), magnitudes);
37 auto V = identity_matrix_expr(matrix.value()->cols());
39 }
42 "exact non-diagonal SVD requires a complete proved singular basis",
43 operation);
44}
std::optional< std::vector< Rational > > exact_rectangular_diagonal_entries(const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context)

引用了 context, LMCAS::detail::matrix_decomposition::exact_rectangular_diagonal_entries(), LMCAS::Result< SVDDecomposition >::failure(), LMCAS::detail::matrix_decomposition::identity_matrix_expr(), Inconclusive, LMCAS::detail::matrix_decomposition::rectangular_diagonal_expr(), LMCAS::Result< SVDDecomposition >::success(), svd_decomposition_checked() , 以及 LMCAS::detail::matrix_decomposition::validate_decomposition_matrix().

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

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

◆ sym()

ExprResult LMCAS::sym ( const std::string & name)

在文件 expr_values.cpp 第 30 行定义.

30 {
31 if (name.empty()) {
33 "symbol name cannot be empty", kSymOperation);
34 }
38 "imaginary unit symbol is reserved",
40 }
42 "reserved mathematical constants cannot be shadowed",
44 }
45 try {
46 auto expression = SymbolicExpr::variable(name);
47 if (!expression) {
49 "symbol factory returned null", kSymOperation);
50 }
51 return ExprResult::success(std::move(expression));
52 } catch (const std::bad_alloc&) {
54 "symbol allocation failed", kSymOperation);
55 } catch (const std::exception& error) {
57 }
58}
bool is_imaginary_unit_name(const std::string &name)
bool is_reserved_symbol_name(const std::string &name)

引用了 LMCAS::expr_detail::expr_common::expression_failure(), InternalInvariant, InvalidArgument, LMCAS::detail::is_imaginary_unit_name(), LMCAS::expr_detail::expr_common::is_reserved_symbol_name(), LMCAS::expr_detail::expr_common::kSymOperation, name, ResourceLimit, LMCAS::Result< ExprPtr >::success() , 以及 sym().

被这些函数引用 LMCAS::AssumptionDecl::make_domain(), LMCAS::AssumptionDecl::make_sign(), LMCAS::assumption_detail::AssumptionParser::parse_continuity(), LMCAS::assumption_detail::AssumptionParser::parse_definiteness(), LMCAS::assumption_detail::AssumptionParser::parse_domain(), LMCAS::assumption_detail::AssumptionParser::parse_finiteness(), LMCAS::expr_detail::ExprParser::parse_identifier_or_call(), LMCAS::assumption_detail::AssumptionParser::parse_monotonicity(), LMCAS::assumption_detail::AssumptionParser::parse_parity(), LMCAS::assumption_detail::AssumptionParser::parse_periodic(), LMCAS::assumption_detail::AssumptionParser::parse_sign(), LMCAS::assumption_detail::AssumptionParser::parse_transcendental(), LMCAS::anonymous_namespace{assumption_serialization.cpp}::serialize_symbol_intervals(), LMCAS::anonymous_namespace{assumption_serialization.cpp}::serialize_symbol_properties() , 以及 sym().

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

◆ sym_rational()

std::shared_ptr< SymbolicExpr > LMCAS::sym_rational ( const BigInt & numerator,
const BigInt & denominator )
inline

◆ sym_sub()

std::shared_ptr< SymbolicExpr > LMCAS::sym_sub ( const SymbolicExpr & lhs,
const SymbolicExpr & rhs )
inline

在文件 integration_support.hpp 第 62 行定义.

64 {
65 auto negated_rhs = SymbolicExpr::multiply(
66 SymbolicExpr::number(-1), detail::make_expression_ptr(rhs));
67 return SymbolicExpr::add(detail::make_expression_ptr(lhs), negated_rhs);
68}

引用了 LMCAS::detail::make_expression_ptr(), rhs , 以及 sym_sub().

被这些函数引用 LMCAS::detail::definite::collect_predicate_roots(), LMCAS::detail::definite::evaluate_segment_endpoints(), LMCAS::integration_table_detail::load_logarithmic_rules(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::relational_predicate_truth() , 以及 sym_sub().

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

◆ symbol_name()

std::optional< std::string_view > LMCAS::symbol_name ( const ExprPtr & expression)
noexcept

在文件 expr_values.cpp 第 16 行定义.

16 {
17 const auto* variable =
18 dynamic_cast<const VariableNode*>(detail::node(expression).get());
19 if (!variable || variable->is_constant()) return std::nullopt;
20 return variable->name();
21}

引用了 LMCAS::detail::node(), symbol_name() , 以及 variable.

被这些函数引用 symbol_name().

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

◆ symbolic_cubic_roots()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::symbolic_cubic_roots ( const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
const std::shared_ptr< SymbolicExpr > & c,
const std::shared_ptr< SymbolicExpr > & d,
ComputationContext & context )
static

在文件 solve_polynomial_cubic.cpp 第 39 行定义.

41 {
42
43 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
44 (context).limits().max_ast_nodes, "transform");
45 auto a2 = SymbolicExpr::power(a, num(2));
46 auto a3 = SymbolicExpr::power(a, num(3));
47 auto b2 = SymbolicExpr::power(b, num(2));
48 auto b3 = SymbolicExpr::power(b, num(3));
49 auto three_ac = SymbolicExpr::multiply(
50 num(3), SymbolicExpr::multiply(a, c));
51 auto p_num = sub(three_ac, b2);
52 auto p_den = SymbolicExpr::multiply(num(3), a2);
53 auto p = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(p_num, p_den)), transform_budget));
54 auto two_b3 = SymbolicExpr::multiply(num(2), b3);
55 auto nine_abc = SymbolicExpr::multiply(
56 num(9), SymbolicExpr::multiply(
57 a, SymbolicExpr::multiply(b, c)));
58 auto twentyseven_a2d = SymbolicExpr::multiply(
59 num(27), SymbolicExpr::multiply(a2, d));
60 auto q_num = SymbolicExpr::add(
61 sub(two_b3, nine_abc), twentyseven_a2d);
62 auto q_den = SymbolicExpr::multiply(num(27), a3);
63 auto q = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(q_num, q_den)), transform_budget));
64 auto shift = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(
65 b, SymbolicExpr::multiply(num(3), a))), transform_budget));
66
67
68 auto q_half = SymbolicExpr::divide(q, num(2));
69 auto p_third = SymbolicExpr::divide(p, num(3));
71 SymbolicExpr::power(q_half, num(2)),
72 SymbolicExpr::power(p_third, num(3)))), transform_budget));
73
74 auto neg_q_half = detail::make_expression_ptr(detail::normalize_node(detail::node(negate(q_half)), transform_budget));
75 auto sqrt_D = SymbolicExpr::sqrt(D_expr);
76
77 auto u = detail::make_expression_ptr(detail::normalize_node(detail::node(cbrt_expr(SymbolicExpr::add(neg_q_half, sqrt_D))), transform_budget));
78 auto v = detail::make_expression_ptr(detail::normalize_node(detail::node(cbrt_expr(sub(neg_q_half, sqrt_D))), transform_budget));
79
80 auto t1 = SymbolicExpr::add(u, v);
81 auto x1 = detail::make_expression_ptr(detail::normalize_node(detail::node(sub(t1, shift)), transform_budget));
82
83 auto neg_half_sum = SymbolicExpr::divide(negate(SymbolicExpr::add(u, v)), num(2));
84 auto diff_uv = sub(u, v);
85 auto sqrt3_half = SymbolicExpr::divide(SymbolicExpr::sqrt(num(3)), num(2));
86 auto imag_coeff = SymbolicExpr::multiply(sqrt3_half, diff_uv);
87
88 auto i_unit = SymbolicExpr::sqrt(num(-1));
89 auto x2 = detail::make_expression_ptr(detail::normalize_node(detail::node(sub(SymbolicExpr::add(neg_half_sum, SymbolicExpr::multiply(i_unit, imag_coeff)), shift)), transform_budget));
90 auto x3 = detail::make_expression_ptr(detail::normalize_node(detail::node(sub(sub(neg_half_sum, SymbolicExpr::multiply(i_unit, imag_coeff)), shift)), transform_budget));
91
92 return {x1, x2, x3};
93}
static std::shared_ptr< SymbolicExpr > cbrt_expr(const std::shared_ptr< SymbolicExpr > &x)

引用了 a, b, c, cbrt_expr(), context, LMCAS::detail::make_expression_ptr(), LMCAS::polynomial_solver_detail::negate(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::polynomial_solver_detail::num(), sub(), symbolic_cubic_roots(), u , 以及 v.

被这些函数引用 LMCAS::polynomial_solver_detail::solve_cubic_impl() , 以及 symbolic_cubic_roots().

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

◆ symbolic_hessian()

std::shared_ptr< SymbolicExpr > LMCAS::symbolic_hessian ( const std::vector< double > & numeric_H,
size_t n,
double tol )
static

在文件 vector_calculus_extrema.cpp 第 95 行定义.

97{
98 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> grid(n,
99 std::vector<std::shared_ptr<SymbolicExpr>>(n));
100 for (size_t i = 0; i < n; ++i) {
101 for (size_t j = 0; j < n; ++j) {
102 double val = numeric_H[i * n + j];
103 const double rounded = std::round(val);
104 const bool representable_integer =
105 std::isfinite(val) &&
106 rounded >=
107 static_cast<double>(std::numeric_limits<int>::min()) &&
108 rounded <=
109 static_cast<double>(std::numeric_limits<int>::max()) &&
110 std::abs(val - rounded) < tol;
111 if (representable_integer) {
112 grid[i][j] =
113 SymbolicExpr::number(static_cast<int>(rounded));
114 } else {
115 grid[i][j] = SymbolicExpr::number(val);
116 }
117 }
118 }
119 return SymbolicExpr::matrix(grid);
120}

引用了 symbolic_hessian().

被这些函数引用 symbolic_hessian() , 以及 vector_calculus_classify_critical_point().

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

◆ symbolic_node_to_multipoly()

LMCAS::MultiPoly LMCAS::symbolic_node_to_multipoly ( const std::shared_ptr< const SymbolicNode > & node,
const std::vector< std::string > & vars )
static

在文件 symbolic_factor.cpp 第 73 行定义.

76{
77 if (!node) { return LMCAS::MultiPoly(Rational(0), vars); }
78
79 if (auto num = std::dynamic_pointer_cast<const NumberNode>(node)) {
80 return LMCAS::MultiPoly(exact_number_as_rational(*num), vars);
81 }
82
83 if (auto var_node = std::dynamic_pointer_cast<const VariableNode>(node)) {
84 LMCAS::Monomial mono(vars.size(), 0);
85 for (size_t i = 0; i < vars.size(); ++i) {
86 if (vars[i] == var_node->name()) {
87 mono[i] = 1;
88 break;
89 }
90 }
91 std::vector<LMCAS::MultiPoly::Term> terms;
92 terms.push_back({mono, Rational(1)});
93 return LMCAS::MultiPoly(std::move(terms), vars);
94 }
95
96 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
97 LMCAS::MultiPoly result(Rational(0), vars);
98 for (const auto& op : add->operands()) {
99 result = result + symbolic_node_to_multipoly(op, vars);
100 }
101 return result;
102 }
103
104 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
105 LMCAS::MultiPoly result(Rational(1), vars);
106 for (const auto& op : mul->operands()) {
107 result = result * symbolic_node_to_multipoly(op, vars);
108 }
109 return result;
110 }
111
112 if (auto pow = std::dynamic_pointer_cast<const PowerNode>(node)) {
113 auto base_poly = symbolic_node_to_multipoly(pow->base(), vars);
114 const int exp_val = polynomial_exponent(pow->exponent()).value();
115 if (exp_val == 0) { return LMCAS::MultiPoly(Rational(1), vars); }
116 LMCAS::MultiPoly result(Rational(1), vars);
117 for (int i = 0; i < exp_val; ++i) {
118 result = result * base_poly;
119 }
120 return result;
121 }
122
123 return LMCAS::MultiPoly(Rational(0), vars);
124}
static std::optional< int > polynomial_exponent(const std::shared_ptr< const SymbolicNode > &node)
多元因式分解辅助函数

引用了 add(), exact_number_as_rational(), mul(), LMCAS::polynomial_solver_detail::num(), op, pow(), symbolic_node_to_multipoly() , 以及 vars.

被这些函数引用 factor_multivariate_expression() , 以及 symbolic_node_to_multipoly().

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

◆ symbolic_poly_to_expr()

std::shared_ptr< SymbolicExpr > LMCAS::symbolic_poly_to_expr ( const Polynomial< SymbolicPolyCoeff > & poly,
ComputationContext & context )
static

在文件 root_of_identity.cpp 第 62 行定义.

63 {
64
65 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
66 (context).limits().max_ast_nodes, "transform");
67 if (poly.is_zero()) return SymbolicExpr::number(0);
68
69 std::vector<std::shared_ptr<SymbolicExpr>> terms;
70 for (int i = poly.degree(); i >= 0; --i) {
71 const auto& coeff = poly.coeffs[i];
72
73 auto coeff_expr = coeff.val;
74 if (coeff_expr) {
75 if (auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(coeff_expr), transform_budget))) {
76 coeff_expr = simplified;
77 }
78 if (LMCAS::detail::node(coeff_expr) && coeff_expr->is_zero()) {
79 continue;
80 }
81 }
82 terms.push_back(symbolic_root_term(coeff_expr, poly.variable_name, i));
83 }
84
85 if (terms.empty()) return SymbolicExpr::number(0);
86 if (terms.size() == 1) return terms[0];
87
88 auto result = terms[0];
89 for (size_t i = 1; i < terms.size(); ++i) {
90 result = SymbolicExpr::add(result, terms[i]);
91 }
92 return result;
93}
static std::shared_ptr< SymbolicExpr > symbolic_root_term(const std::shared_ptr< SymbolicExpr > &coefficient, const std::string &variable, int degree)

引用了 LMCAS::Polynomial< CoeffType >::coeffs, context, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::SymbolicNode::is_zero(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), symbolic_poly_to_expr(), symbolic_root_term() , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 LMCAS::detail::make_rootof_solutions_impl() , 以及 symbolic_poly_to_expr().

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

◆ symbolic_polynomial_content()

Result< Rational > LMCAS::symbolic_polynomial_content ( const SymbolicExpr & expression,
ComputationContext & context )

在文件 symbolic_gcd.cpp 第 401 行定义.

403 {
404 try {
405 detail::RewriteBudget budget(context, context.limits().max_recursion_depth,
406 context.limits().max_ast_nodes, kOperation);
407 budget.measure(detail::node(expression));
408 std::set<std::string> variable_set;
409 auto variables_result = collect_polynomial_variables(
410 detail::node(expression), variable_set, context);
411 if (!variables_result) {
412 return Result<Rational>::failure(variables_result.error());
413 }
414 std::vector<std::string> variables(
415 variable_set.begin(), variable_set.end());
416 auto polynomial = node_to_multivariate_polynomial(
417 detail::node(expression), variables, context);
418 if (!polynomial) {
419 return Result<Rational>::failure(polynomial.error());
420 }
421 return Result<Rational>::success(polynomial.value().numeric_content());
422 } catch (const CasError& error) {
423 return Result<Rational>::failure(error);
424 } catch (const std::length_error& error) {
425 return Result<Rational>::failure(CasErrc::ResourceLimit, error.what(), kOperation);
426 } catch (const std::bad_alloc&) {
428 CasErrc::ResourceLimit, "polynomial content allocation failed",
429 kOperation);
430 } catch (const std::exception& error) {
432 CasErrc::InternalInvariant, error.what(), kOperation);
433 }
434}

引用了 context, LMCAS::Result< T >::failure(), InternalInvariant, LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node(), ResourceLimit, LMCAS::Result< T >::success() , 以及 symbolic_polynomial_content().

被这些函数引用 factor_numeric_content() , 以及 symbolic_polynomial_content().

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

◆ symbolic_polynomial_gcd()

SymbolicGcdResult LMCAS::symbolic_polynomial_gcd ( const SymbolicExpr & lhs,
const SymbolicExpr & rhs,
ComputationContext & context )

在文件 symbolic_gcd.cpp 第 351 行定义.

354 {
355 try {
356 detail::RewriteBudget budget(context, context.limits().max_recursion_depth,
357 context.limits().max_ast_nodes, kOperation);
358 budget.measure(detail::node(lhs));
359 budget.measure(detail::node(rhs));
360 std::set<std::string> variable_set;
361 auto lhs_variables = collect_polynomial_variables(
362 detail::node(lhs), variable_set, context);
363 if (!lhs_variables) { return SymbolicGcdResult::failure(lhs_variables.error()); }
364 auto rhs_variables = collect_polynomial_variables(
365 detail::node(rhs), variable_set, context);
366 if (!rhs_variables) { return SymbolicGcdResult::failure(rhs_variables.error()); }
367 std::vector<std::string> variables(variable_set.begin(), variable_set.end());
368
369 auto lhs_polynomial = node_to_multivariate_polynomial(
370 detail::node(lhs), variables, context);
371 if (!lhs_polynomial) { return SymbolicGcdResult::failure(lhs_polynomial.error()); }
372 auto rhs_polynomial = node_to_multivariate_polynomial(
373 detail::node(rhs), variables, context);
374 if (!rhs_polynomial) { return SymbolicGcdResult::failure(rhs_polynomial.error()); }
375
376 auto step = context.consume_steps(
377 static_cast<std::size_t>(lhs_polynomial.value().num_terms() +
378 rhs_polynomial.value().num_terms()) + 1,
379 kOperation);
380 if (!step) { return SymbolicGcdResult::failure(step.error()); }
381
382 MultiPoly gcd = make_monic(multivariate_gcd(
383 lhs_polynomial.value(), rhs_polynomial.value()));
384 auto verified = verify_gcd_candidate(
385 lhs_polynomial.value(), rhs_polynomial.value(), gcd);
386 if (!verified) { return SymbolicGcdResult::failure(verified.error()); }
387 return multivariate_polynomial_to_expression(gcd, budget);
388 } catch (const CasError& error) {
389 return SymbolicGcdResult::failure(error);
390 } catch (const std::length_error& error) {
391 return SymbolicGcdResult::failure(CasErrc::ResourceLimit, error.what(), kOperation);
392 } catch (const std::bad_alloc&) {
394 CasErrc::ResourceLimit, "symbolic GCD allocation failed", kOperation);
395 } catch (const std::exception& error) {
397 CasErrc::InternalInvariant, error.what(), kOperation);
398 }
399}
Result< MultiPoly > node_to_multivariate_polynomial(const std::shared_ptr< const SymbolicNode > &node, const std::vector< std::string > &variables, ComputationContext &context)
Result< std::shared_ptr< SymbolicExpr > > multivariate_polynomial_to_expression(const MultiPoly &polynomial, detail::RewriteBudget &budget)
Result< void > verify_gcd_candidate(const MultiPoly &lhs, const MultiPoly &rhs, const MultiPoly &gcd)

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), InternalInvariant, LMCAS::detail::RewriteBudget::measure(), multivariate_gcd(), LMCAS::detail::node(), ResourceLimit, rhs , 以及 symbolic_polynomial_gcd().

被这些函数引用 factor_common_polynomial() , 以及 symbolic_polynomial_gcd().

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

◆ symbolic_power_to_poly()

template<typename T>
Result< Polynomial< T > > LMCAS::symbolic_power_to_poly ( const PowerNode & power,
const std::string & variable,
ComputationContext * context,
detail::RewriteBudget * budget )

在文件 poly_utils.cpp 第 288 行定义.

290 {
291 detail::RewriteScope scope(budget);
292 BigInt exponent;
294 std::dynamic_pointer_cast<const NumberNode>(power.exponent()), exponent) ||
295 exponent.is_negative()) {
297 "Polynomial powers require nonnegative integer exponents", "polynomial.convert");
298 }
299 const auto bounded_exponent = exponent.try_to_int64();
300 if (!bounded_exponent || *bounded_exponent >= 1000) {
301 return Result<Polynomial<T>>::failure(CasErrc::ResourceLimit,
302 "Polynomial power expansion limit exceeded", "polynomial.convert");
303 }
304 const int exponent_value = static_cast<int>(*bounded_exponent);
305
306 Polynomial<T> result(variable);
307 if (budget) {
308 checked_coefficient_count(1, *budget);
310 }
311 result.coeffs.emplace_back(1);
312 if (exponent_value == 0) {
313 auto defined = check_zero_power_base(power.base(), *context);
314 if (!defined) { return Result<Polynomial<T>>::failure(defined.error()); }
315 return result;
316 }
317 const auto base = symbolic_to_poly_recursive<T>(power.base(), variable, context, budget);
318 if (!base) { return Result<Polynomial<T>>::failure(base.error()); }
319 auto count = check_power_coefficient_count(base.value().coeffs.size(), exponent_value, budget);
320 if (!count) { return Result<Polynomial<T>>::failure(count.error()); }
321 for (int index = 0; index < exponent_value; ++index) {
322 if constexpr (std::is_same_v<T, SymbolicPolyCoeff>) {
323 if (budget) {
324 result = multiply_checked_coefficients(result, base.value(), *budget);
325 continue;
326 }
327 }
328 if (!polynomial_product_fits(result, base.value())) {
330 "Polynomial coefficient storage limit exceeded", "polynomial.convert");
331 }
332 result = result * base.value();
333 }
334 return result;
335}
void checked_coefficient_count(std::size_t count, detail::RewriteBudget &budget)
Polynomial< SymbolicPolyCoeff > multiply_checked_coefficients(const Polynomial< SymbolicPolyCoeff > &left, const Polynomial< SymbolicPolyCoeff > &right, detail::RewriteBudget &budget)
Result< void > check_power_coefficient_count(std::size_t base_count, int exponent, detail::RewriteBudget *budget)
Result< void > check_zero_power_base(const detail::SymbolicNodePtr &base, ComputationContext &context)
bool polynomial_product_fits(const Polynomial< T > &left, const Polynomial< T > &right)

引用了 LMCAS::PowerNode::base(), LMCAS::Polynomial< CoeffType >::coeffs, context, exponent, LMCAS::PowerNode::exponent(), normalization_check_children(), polynomial_product_fits(), ResourceLimit, symbolic_power_to_poly(), symbolic_to_poly_recursive(), try_get_integer_value(), UnsupportedExpression , 以及 variable.

被这些函数引用 symbolic_power_to_poly() , 以及 symbolic_to_poly_recursive().

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

◆ symbolic_product()

std::shared_ptr< SymbolicExpr > LMCAS::symbolic_product ( const std::shared_ptr< SymbolicExpr > & body,
const std::string & index,
const std::shared_ptr< SymbolicExpr > & lower,
const std::shared_ptr< SymbolicExpr > & upper )

在文件 series_engine.cpp 第 384 行定义.

386 {
388 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
389 (context).limits().max_ast_nodes, "transform");
390 if (!body || !lower || !upper) {
391 return nullptr;
392 }
393 BigInt lv, uv;
395 std::dynamic_pointer_cast<const NumberNode>(LMCAS::detail::node(lower)), lv) &&
397 std::dynamic_pointer_cast<const NumberNode>(LMCAS::detail::node(upper)), uv)) {
398 if (uv < lv) {
399 return SymbolicExpr::number(1);
400 }
401 const BigInt span = uv - lv;
402 if (span < BigInt(50)) {
403 const auto iterations = *span.try_to_uint64() + 1;
404 auto result = SymbolicExpr::number(1);
405 BigInt k = lv;
406 const BigInt increment(1);
407 for (std::uint64_t iteration = 0; iteration < iterations; ++iteration, k += increment) {
408 auto val = SymbolicExpr::number(k);
409 auto term = detail::make_expression_ptr(detail::substitute_node(detail::node(body), index, detail::node(val), transform_budget));
410 if (term) { term = detail::make_expression_ptr(detail::normalize_node(detail::node(term), transform_budget)); result = SymbolicExpr::multiply(result, term); }
411 }
412 return detail::make_expression_ptr(detail::normalize_node(detail::node(result), transform_budget));
413 }
414 }
416}

引用了 context, lower, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::substitute_node(), symbolic_product(), try_get_integer_value() , 以及 upper.

被这些函数引用 symbolic_product().

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

◆ symbolic_product_to_poly()

template<typename T>
Result< Polynomial< T > > LMCAS::symbolic_product_to_poly ( const MultiplyNode & multiply,
const std::string & variable,
ComputationContext * context,
detail::RewriteBudget * budget )

在文件 poly_utils.cpp 第 358 行定义.

360 {
361 detail::RewriteScope scope(budget);
362 Polynomial<T> result(variable);
363 if (budget) {
364 checked_coefficient_count(1, *budget);
366 }
367 result.coeffs.emplace_back(1);
368 for (const auto& operand : multiply.operands()) {
369 auto child = symbolic_to_poly_recursive<T>(operand, variable, context, budget);
370 if (!child) { return Result<Polynomial<T>>::failure(child.error()); }
371 if constexpr (std::is_same_v<T, SymbolicPolyCoeff>) {
372 if (budget) {
373 result = multiply_checked_coefficients(result, child.value(), *budget);
374 continue;
375 }
376 }
377 if (!polynomial_product_fits(result, child.value())) {
379 "Polynomial coefficient storage limit exceeded", "polynomial.convert");
380 }
381 result = result * child.value();
382 }
383 return result;
384}

引用了 LMCAS::Polynomial< CoeffType >::coeffs, context, normalization_check_children(), polynomial_product_fits(), ResourceLimit, symbolic_product_to_poly(), symbolic_to_poly_recursive() , 以及 variable.

被这些函数引用 symbolic_product_to_poly() , 以及 symbolic_to_poly_recursive().

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

◆ symbolic_root_term()

std::shared_ptr< SymbolicExpr > LMCAS::symbolic_root_term ( const std::shared_ptr< SymbolicExpr > & coefficient,
const std::string & variable,
int degree )
static

在文件 root_of_identity.cpp 第 51 行定义.

53 {
54 if (degree == 0) return coefficient;
55 auto symbol = SymbolicExpr::variable(variable);
56 auto power = degree == 1
57 ? symbol : SymbolicExpr::power(symbol, SymbolicExpr::number(degree));
58 return coefficient->is_one()
59 ? power : SymbolicExpr::multiply(coefficient, power);
60}

引用了 symbolic_root_term() , 以及 variable.

被这些函数引用 symbolic_poly_to_expr() , 以及 symbolic_root_term().

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

◆ symbolic_sum()

std::shared_ptr< SymbolicExpr > LMCAS::symbolic_sum ( const std::shared_ptr< SymbolicExpr > & body,
const std::string & index,
const std::shared_ptr< SymbolicExpr > & lower,
const std::shared_ptr< SymbolicExpr > & upper )

在文件 series_engine.cpp 第 335 行定义.

337 {
339 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
340 (context).limits().max_ast_nodes, "transform");
341 if (!body || !lower || !upper) {
342 return nullptr;
343 }
344 BigInt lv, uv;
346 std::dynamic_pointer_cast<const NumberNode>(LMCAS::detail::node(lower)), lv) &&
348 std::dynamic_pointer_cast<const NumberNode>(LMCAS::detail::node(upper)), uv)) {
349 if (uv < lv) {
350 return SymbolicExpr::number(0);
351 }
352 const BigInt span = uv - lv;
353 if (span < BigInt(100)) {
354 const auto iterations = *span.try_to_uint64() + 1;
355 std::vector<std::shared_ptr<const SymbolicNode>> terms;
356 BigInt k = lv;
357 const BigInt increment(1);
358 for (std::uint64_t iteration = 0; iteration < iterations; ++iteration, k += increment) {
359 auto val = SymbolicExpr::number(k);
360 auto term = detail::make_expression_ptr(detail::substitute_node(detail::node(body), index, detail::node(val), transform_budget));
361 if (term) { term = detail::make_expression_ptr(detail::normalize_node(detail::node(term), transform_budget)); terms.push_back(LMCAS::detail::node(term)); }
362 }
363 if (terms.empty()) {
364 return SymbolicExpr::number(0);
365 }
366 if (terms.size() == 1) {
367 return detail::make_expression_ptr(detail::normalize_node(terms[0], transform_budget));
368 }
370 }
371 }
372 auto k_var = SymbolicExpr::variable(index);
373 if (body->to_string() == k_var->to_string()) {
374 auto u = upper; auto l = lower;
375 auto u1 = SymbolicExpr::add(u, SymbolicExpr::number(1));
376 auto su = SymbolicExpr::divide(SymbolicExpr::multiply(u, u1), SymbolicExpr::number(2));
377 auto lm1 = SymbolicExpr::add(l, SymbolicExpr::number(-1));
378 auto sl = SymbolicExpr::divide(SymbolicExpr::multiply(lm1, l), SymbolicExpr::number(2));
379 return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(su, SymbolicExpr::multiply(SymbolicExpr::number(-1), sl))), transform_budget));
380 }
382}

引用了 context, lower, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::substitute_node(), symbolic_sum(), try_get_integer_value(), u , 以及 upper.

被这些函数引用 symbolic_sum().

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

◆ symbolic_sum_to_poly()

template<typename T>
Result< Polynomial< T > > LMCAS::symbolic_sum_to_poly ( const AddNode & add,
const std::string & variable,
ComputationContext * context,
detail::RewriteBudget * budget )

在文件 poly_utils.cpp 第 338 行定义.

340 {
341 detail::RewriteScope scope(budget);
342 Polynomial<T> result(variable);
343 for (const auto& operand : add.operands()) {
344 auto child = symbolic_to_poly_recursive<T>(operand, variable, context, budget);
345 if (!child) { return Result<Polynomial<T>>::failure(child.error()); }
346 if constexpr (std::is_same_v<T, SymbolicPolyCoeff>) {
347 if (budget) {
348 result = add_checked_coefficients(result, child.value(), *budget);
349 continue;
350 }
351 }
352 result = result + child.value();
353 }
354 return result;
355}

引用了 add(), context, symbolic_sum_to_poly(), symbolic_to_poly_recursive() , 以及 variable.

被这些函数引用 symbolic_sum_to_poly() , 以及 symbolic_to_poly_recursive().

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

◆ symbolic_to_poly_recursive()

template<typename T>
Result< Polynomial< T > > LMCAS::symbolic_to_poly_recursive ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & variable,
ComputationContext * context,
detail::RewriteBudget * budget )

在文件 poly_utils.cpp 第 387 行定义.

389 {
390 detail::RewriteScope scope(budget);
391 if (!node) {
393 "Expression node must not be null", "polynomial.convert");
394 }
395 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
396 BigInt exponent;
398 std::dynamic_pointer_cast<const NumberNode>(power->exponent()), exponent) &&
399 exponent.is_zero()) {
400 return symbolic_power_to_poly<T>(*power, variable, context, budget);
401 }
402 }
403 if (!expression_depends_on_variable(node, variable, budget)) {
404 return constant_to_poly<T>(node, variable, budget);
405 }
406
407 if (auto symbol = std::dynamic_pointer_cast<const VariableNode>(node)) {
408 if (!symbol->is_constant() && symbol->name() == variable) {
409 if constexpr (std::is_same_v<T, SymbolicPolyCoeff>) {
410 if (budget) {
411 checked_coefficient_count(2, *budget);
413 Polynomial<T> result(variable);
414 result.coeffs.reserve(2);
415 result.coeffs.emplace_back(0);
416 result.coeffs.emplace_back(1);
417 return result;
418 }
419 }
420 return Polynomial<T>({T(0), T(1)}, variable);
421 }
422 }
423
424 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
425 return symbolic_sum_to_poly<T>(*add, variable, context, budget);
426 }
427
428 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
429 return symbolic_product_to_poly<T>(*multiply, variable, context, budget);
430 }
431
432 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
433 return symbolic_power_to_poly<T>(*power, variable, context, budget);
434 }
435
437 "Expression is not a polynomial in the requested variable", "polynomial.convert");
438}
Result< Polynomial< T > > symbolic_power_to_poly(const PowerNode &power, const std::string &variable, ComputationContext *context, detail::RewriteBudget *budget)
Result< Polynomial< T > > symbolic_sum_to_poly(const AddNode &add, const std::string &variable, ComputationContext *context, detail::RewriteBudget *budget)
Result< Polynomial< T > > symbolic_product_to_poly(const MultiplyNode &multiply, const std::string &variable, ComputationContext *context, detail::RewriteBudget *budget)

引用了 LMCAS::Polynomial< CoeffType >::Polynomial(), add(), LMCAS::Polynomial< CoeffType >::coeffs, context, exponent, expression_depends_on_variable(), InvalidArgument, normalization_check_children(), symbolic_power_to_poly(), symbolic_product_to_poly(), symbolic_sum_to_poly(), symbolic_to_poly_recursive(), try_get_integer_value(), UnsupportedExpression , 以及 variable.

被这些函数引用 __attribute__(), symbolic_power_to_poly(), symbolic_product_to_poly(), symbolic_sum_to_poly(), LMCAS::detail::symbolic_to_poly_checked() , 以及 symbolic_to_poly_recursive().

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

◆ tan() [1/2]

ExprResult LMCAS::tan ( const ExprPtr & expression)

在文件 expr_elementary.cpp 第 69 行定义.

69 {
71 return tan(expression, context);
72}
ExprResult tan(const ExprPtr &expression, ComputationContext &context)

引用了 context , 以及 tan().

函数调用图:

◆ tan() [2/2]

ExprResult LMCAS::tan ( const ExprPtr & expression,
ComputationContext & context )

在文件 expr_elementary.cpp 第 62 行定义.

62 {
63 auto valid = require_dimensionless(expression, "tan");
64 if (!valid) { return valid; }
65 return make_unary_math_expr(expression, context, "tan",
66 SymbolicExpr::tan);
67}

引用了 context, LMCAS::expr_detail::expr_common::make_unary_math_expr(), LMCAS::expr_detail::expr_common::require_dimensionless() , 以及 tan().

被这些函数引用 LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function(), tan(), tan() , 以及 LMCAS::anonymous_namespace{differentiation_functions.cpp}::trigonometric_outer().

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

◆ tangent_plane_checked() [1/2]

PlaneSymbolicResult LMCAS::tangent_plane_checked ( const SurfaceSymbolic & surf,
const std::vector< std::shared_ptr< SymbolicExpr > > & point )

在文件 symbolic_geometry_surface.cpp 第 250 行定义.

252 {
254 return tangent_plane_checked(surf, point, context);
255}
PlaneSymbolicResult tangent_plane_checked(const SurfaceSymbolic &surf, const std::vector< std::shared_ptr< SymbolicExpr > > &point, ComputationContext &context)

引用了 context, point , 以及 tangent_plane_checked().

函数调用图:

◆ tangent_plane_checked() [2/2]

PlaneSymbolicResult LMCAS::tangent_plane_checked ( const SurfaceSymbolic & surf,
const std::vector< std::shared_ptr< SymbolicExpr > > & point,
ComputationContext & context )

在文件 symbolic_geometry_surface.cpp 第 189 行定义.

192 {
193 const std::string operation = "tangent_plane";
194 auto valid = validate_surface_point(surf, point, context, operation);
195 if (!valid) {
196 return PlaneSymbolicResult::failure(valid.error());
197 }
198 auto step = context.consume_steps(surf.vars.size() * 4 + 4, operation);
199 if (!step) {
200 return PlaneSymbolicResult::failure(step.error());
201 }
202
204 if (!gradient) {
206 }
207 std::vector<double> gradient_values;
208 auto scaled = surface_gradient_scale_checked(
209 gradient.value(), context, operation, gradient_values,
210 "tangent plane is undefined at a singular point");
211 if (!scaled) {
212 return PlaneSymbolicResult::failure(scaled.error());
213 }
214
215 std::vector<double> point_values;
216 auto point_scale = numeric_vector_scale_checked(
217 point, context, operation, &point_values);
218 if (!point_scale &&
219 (point_scale.error().code == CasErrc::Cancelled ||
220 point_scale.error().code == CasErrc::ResourceLimit)) {
221 return PlaneSymbolicResult::failure(point_scale.error());
222 }
223 if (point_scale && point_scale.value() != 0.0 &&
224 scaled.value() >
225 std::numeric_limits<double>::max() /
226 point_scale.value() /
227 static_cast<double>(point.size())) {
229 gradient_values, scaled.value(), point_values,
230 point_scale.value(), operation);
231 }
232
233 auto dot = vector_dot_checked(gradient.value(), point, context);
234 if (!dot) {
235 return PlaneSymbolicResult::failure(dot.error());
236 }
237 auto d = simplify_checked(
238 dot.value(), operation,
239 "tangent plane constant is outside the supported domain", context);
240 if (!d) {
241 return PlaneSymbolicResult::failure(d.error());
242 }
243
245 plane.normal = std::move(gradient.value());
246 plane.d = std::move(d.value());
247 return PlaneSymbolicResult::success(std::move(plane));
248}
VectorExprListResult surface_gradient_at_point_checked(const SurfaceSymbolic &surf, const std::vector< std::shared_ptr< SymbolicExpr > > &point, const std::string &operation, ComputationContext &context)
Result< double > surface_gradient_scale_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &gradient, ComputationContext &context, const std::string &operation, std::vector< double > &values, const std::string &singular_message)
PlaneSymbolicResult scaled_tangent_plane(const std::vector< double > &gradient_values, double gradient_scale, const std::vector< double > &point_values, double point_scale, const std::string &operation)
ExpressionResult vector_dot_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, ComputationContext &context)

引用了 Cancelled, context, LMCAS::PlaneSymbolic::d, LMCAS::Result< PlaneSymbolic >::failure(), gradient(), LMCAS::PlaneSymbolic::normal, LMCAS::geometry_detail::numeric_vector_scale_checked(), plane, point, ResourceLimit, LMCAS::geometry_detail::simplify_checked(), LMCAS::Result< PlaneSymbolic >::success(), tangent_plane_checked(), LMCAS::geometry_detail::validate_surface_point(), LMCAS::SurfaceSymbolic::vars , 以及 vector_dot_checked().

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

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

◆ te_abs_decay()

std::shared_ptr< SymbolicExpr > LMCAS::te_abs_decay ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & t,
ComputationContext & context )
static

在文件 transform_fourier.cpp 第 30 行定义.

31 {
32
33 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
34 (context).limits().max_ast_nodes, "transform");
35 auto function = std::dynamic_pointer_cast<const FunctionNode>(detail::node(f));
37 function->arguments().size() != 1) return nullptr;
38 auto argument = detail::make_expression_ptr(function->arguments()[0]);
39 auto parts = te_split_coeff(argument, t);
40 if (!te_is_abs_variable(detail::node(parts.second), t)) return nullptr;
42 SymbolicFactory::create_number(BigInt(-1)), detail::node(parts.first)}), transform_budget));
43}
static bool te_is_abs_variable(const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)

引用了 context, LMCAS::SymbolicFactory::create_multiply(), LMCAS::SymbolicFactory::create_number(), LMCAS::FunctionNode::Exp, function(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), t, te_abs_decay(), te_is_abs_variable() , 以及 LMCAS::transform_detail::te_split_coeff().

被这些函数引用 fourier_transform_core() , 以及 te_abs_decay().

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

◆ te_abs_fourier()

std::shared_ptr< SymbolicExpr > LMCAS::te_abs_fourier ( const std::shared_ptr< SymbolicExpr > & rate,
const std::string & omega,
ComputationContext & context )
static

在文件 transform_fourier.cpp 第 89 行定义.

90 {
91
92 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
93 (context).limits().max_ast_nodes, "transform");
94 auto two = SymbolicFactory::create_number(BigInt(2));
98 auto reciprocal = SymbolicFactory::create_power(
101 two, detail::node(rate), reciprocal}), transform_budget));
102}

引用了 context, LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_multiply(), LMCAS::SymbolicFactory::create_number(), LMCAS::SymbolicFactory::create_power(), LMCAS::SymbolicFactory::create_variable(), denominator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 te_abs_fourier().

被这些函数引用 fourier_transform_core(), inverse_fourier_transform_core() , 以及 te_abs_fourier().

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

◆ te_accept_decay()

bool LMCAS::te_accept_decay ( const std::shared_ptr< SymbolicExpr > & rate,
const AssumptionContext & assumptions,
std::vector< std::shared_ptr< SymbolicExpr > > & conditions,
ComputationContext & context )
static

在文件 transform_fourier.cpp 第 58 行定义.

61 {
62 InferenceEngine inference(assumptions);
63 auto real = inference.query_real_checked(*rate, context);
64 if (!real) {
65 if (real.error().code == CasErrc::DomainError) return false;
66 throw real.error();
67 }
68 if (real.value() != Tribool::True) {
69 return false;
70 }
71 auto positive = inference.query_positive_checked(*rate, context);
72 if (!positive) {
73 throw positive.error();
74 }
75 if (positive.value() == Tribool::True) {
76 return true;
77 }
78 auto nonpositive = inference.query_nonpositive_checked(*rate, context);
79 if (!nonpositive) {
80 throw nonpositive.error();
81 }
82 if (positive.value() == Tribool::False || nonpositive.value() == Tribool::True) {
83 return false;
84 }
85 conditions.push_back(te_decay_condition(rate));
86 return true;
87}
static std::shared_ptr< SymbolicExpr > te_decay_condition(const std::shared_ptr< SymbolicExpr > &rate)

引用了 LMCAS::CasError::code, context, DomainError, LMCAS::Result< T >::error(), False, real(), te_accept_decay(), te_decay_condition(), True , 以及 LMCAS::Result< T >::value().

被这些函数引用 fourier_transform_core() , 以及 te_accept_decay().

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

◆ te_convolve_core()

TransformEngineResult LMCAS::te_convolve_core ( const std::shared_ptr< SymbolicExpr > & f,
const std::shared_ptr< SymbolicExpr > & g,
const std::string & variable,
ComputationContext & context )
static

在文件 transform_convolution.cpp 第 63 行定义.

68 {
69 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
70 (context).limits().max_ast_nodes, "transform");
71 constexpr const char* operation = "convolve";
72 auto step = context.consume_steps(1, operation);
73 if (!step) return TransformEngineResult::failure(step.error());
74
75 if (te_is_zero(f) || te_is_zero(g)) {
76 return te_wrap_transform_result(SymbolicExpr::number(0), operation);
77 }
78
79 auto left_sum = std::dynamic_pointer_cast<const AddNode>(detail::node(f));
80 if (left_sum) {
81 return te_convolve_sum(*left_sum, g, true, variable, context);
82 }
83 auto right_sum = std::dynamic_pointer_cast<const AddNode>(detail::node(g));
84 if (right_sum) {
85 return te_convolve_sum(*right_sum, f, false, variable, context);
86 }
87
88 auto left_parts = te_split_coeff(f, variable);
89 if (te_depends_on(left_parts.second, variable) &&
90 left_parts.second->to_string() != f->to_string()) {
91 auto inner =
92 te_convolve_core(left_parts.second, g, variable, context);
93 if (!inner) return inner;
94 auto scaled = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(
95 left_parts.first, inner.value().value.expression)), transform_budget));
96 return te_wrap_transform_result(scaled, operation);
97 }
98 auto right_parts = te_split_coeff(g, variable);
99 if (te_depends_on(right_parts.second, variable) &&
100 right_parts.second->to_string() != g->to_string()) {
101 auto inner =
102 te_convolve_core(f, right_parts.second, variable, context);
103 if (!inner) return inner;
104 auto scaled = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(
105 right_parts.first, inner.value().value.expression)), transform_budget));
106 return te_wrap_transform_result(scaled, operation);
107 }
108
109 const auto left = te_match_scaled_gaussian(f, variable);
110 const auto right = te_match_scaled_gaussian(g, variable);
111 if (!left || !right) {
114 "当前双边卷积规则不支持该表达式对", operation);
115 }
116
117 const Rational rate_sum = left->rate + right->rate;
118 const Rational output_rate = left->rate * right->rate / rate_sum;
119 auto scale = SymbolicExpr::multiply(
120 SymbolicExpr::multiply(left->coefficient, right->coefficient),
121 SymbolicExpr::sqrt(SymbolicExpr::divide(
124 SymbolicExpr::number(rate_sum))));
125 auto square = SymbolicExpr::power(
126 SymbolicExpr::variable(variable), SymbolicExpr::number(2));
127 auto exponent = SymbolicExpr::multiply(
128 SymbolicExpr::number(-output_rate), square);
129 auto gaussian = SymbolicExpr::exp(exponent);
131 detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(scale, gaussian)), transform_budget)), operation);
132} catch (const CasError& error) {
133 return TransformEngineResult::failure(error);
134} catch (const std::bad_alloc&) {
135 return TransformEngineResult::failure(CasErrc::ResourceLimit, "allocation failed", "convolve");
136} catch (const std::length_error& error) {
137 return TransformEngineResult::failure(CasErrc::ResourceLimit, error.what(), "convolve");
138} catch (const std::exception& error) {
139 return TransformEngineResult::failure(CasErrc::InternalInvariant, error.what(), "convolve");
140}
std::optional< GaussianMatch > te_match_scaled_gaussian(const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable)
static TransformEngineResult te_convolve_sum(const AddNode &addition, const std::shared_ptr< SymbolicExpr > &other, bool sum_is_left, const std::string &variable, ComputationContext &context)

引用了 context, exponent, LMCAS::Result< Verified< EvaluatedTransform > >::failure(), Inconclusive, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), right, te_convolve_core(), te_convolve_sum(), LMCAS::transform_detail::te_depends_on(), LMCAS::transform_detail::te_is_zero(), LMCAS::transform_detail::te_match_scaled_gaussian(), LMCAS::transform_detail::te_split_coeff(), LMCAS::transform_detail::te_wrap_transform_result() , 以及 variable.

被这些函数引用 convolve_checked(), te_convolve_core() , 以及 te_convolve_sum().

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

◆ te_convolve_sum()

TransformEngineResult LMCAS::te_convolve_sum ( const AddNode & addition,
const std::shared_ptr< SymbolicExpr > & other,
bool sum_is_left,
const std::string & variable,
ComputationContext & context )
static

在文件 transform_convolution.cpp 第 36 行定义.

38 {
39 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
40 (context).limits().max_ast_nodes, "transform");
41 std::shared_ptr<SymbolicExpr> accumulated;
42 for (const auto& operand : addition.operands()) {
43 auto term = detail::make_expression_ptr(operand);
44 auto transformed = sum_is_left
45 ? te_convolve_core(term, other, variable, context)
46 : te_convolve_core(other, term, variable, context);
47 if (!transformed) return transformed;
48 auto expression = transformed.value().value.expression;
49 accumulated = accumulated ? SymbolicExpr::add(accumulated, expression) : expression;
50 }
52 accumulated ? detail::make_expression_ptr(detail::normalize_node(detail::node(accumulated), transform_budget)) : SymbolicExpr::number(0), "convolve");
53} catch (const CasError& error) {
55} catch (const std::bad_alloc&) {
56 return TransformEngineResult::failure(CasErrc::ResourceLimit, "allocation failed", "te_convolve_sum");
57} catch (const std::length_error& error) {
58 return TransformEngineResult::failure(CasErrc::ResourceLimit, error.what(), "te_convolve_sum");
59} catch (const std::exception& error) {
60 return TransformEngineResult::failure(CasErrc::InternalInvariant, error.what(), "te_convolve_sum");
61}

引用了 context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::AddNode::operands(), te_convolve_core(), te_convolve_sum(), LMCAS::transform_detail::te_wrap_transform_result() , 以及 variable.

被这些函数引用 te_convolve_core() , 以及 te_convolve_sum().

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

◆ te_decay_condition()

std::shared_ptr< SymbolicExpr > LMCAS::te_decay_condition ( const std::shared_ptr< SymbolicExpr > & rate)
static

在文件 transform_fourier.cpp 第 45 行定义.

46 {
47 auto product = std::dynamic_pointer_cast<const MultiplyNode>(detail::node(rate));
48 if (!product) return te_gt_condition(rate, SymbolicExpr::number(0));
49 std::vector<std::shared_ptr<const SymbolicNode>> factors;
50 for (const auto& factor : product->operands()) {
51 auto number = std::dynamic_pointer_cast<const NumberNode>(factor);
52 if (!number || !number->is_positive()) factors.push_back(factor);
53 }
55 return te_gt_condition(lhs, SymbolicExpr::number(0));
56}
std::shared_ptr< SymbolicExpr > te_gt_condition(const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs)

引用了 LMCAS::SymbolicFactory::create_multiply(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), te_decay_condition() , 以及 LMCAS::transform_detail::te_gt_condition().

被这些函数引用 te_accept_decay() , 以及 te_decay_condition().

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

◆ te_extract_exp()

bool LMCAS::te_extract_exp ( const std::shared_ptr< SymbolicExpr > & e,
const std::string & t,
std::shared_ptr< SymbolicExpr > & a_out,
std::shared_ptr< SymbolicExpr > & rem_out )
static

在文件 transform_laplace.cpp 第 49 行定义.

50 {
51 if (!e || !LMCAS::detail::node(e)) {
52 return false;
53 }
54 auto fn = std::dynamic_pointer_cast<const FunctionNode>(LMCAS::detail::node(e));
55 if (fn && fn->type() == FunctionNode::FuncType::Exp && !fn->arguments().empty()) {
56 a_out = te_linear_coefficient(fn->arguments()[0], t);
57 if (a_out) {
59 return true;
60 }
61 }
62 auto mul = std::dynamic_pointer_cast<const MultiplyNode>(LMCAS::detail::node(e));
63 if (mul) {
64 for (size_t i = 0; i < mul->operands().size(); ++i) {
65 auto fac = LMCAS::detail::make_expression_ptr(mul->operands()[i]);
66 std::shared_ptr<SymbolicExpr> at, rt;
67 if (te_extract_exp(fac, t, at, rt)) {
68 std::vector<std::shared_ptr<const SymbolicNode>> rest = mul->operands();
69 rest.erase(rest.begin() + static_cast<std::ptrdiff_t>(i));
71 SymbolicFactory::create_multiply(std::move(rest)));
72 a_out = at; return true;
73 }
74 }
75 }
76 return false;
77}
std::shared_ptr< SymbolicExpr > te_linear_coefficient(const std::shared_ptr< const SymbolicNode > &argument, const std::string &variable)
static bool te_extract_exp(const std::shared_ptr< SymbolicExpr > &e, const std::string &t, std::shared_ptr< SymbolicExpr > &a_out, std::shared_ptr< SymbolicExpr > &rem_out)

引用了 LMCAS::SymbolicFactory::create_multiply(), LMCAS::SymbolicFactory::create_number(), e(), LMCAS::FunctionNode::Exp, LMCAS::detail::make_expression_ptr(), mul(), LMCAS::detail::node(), t, te_extract_exp() , 以及 LMCAS::transform_detail::te_linear_coefficient().

被这些函数引用 LMCAS::transform_detail::laplace_transform_core(), te_extract_exp(), te_laplace_lookup() , 以及 te_laplace_roc().

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

◆ te_fourier_sum()

std::shared_ptr< SymbolicExpr > LMCAS::te_fourier_sum ( const AddNode & addition,
const std::string & t,
const std::string & omega,
ComputationContext & context,
const AssumptionContext & assumptions,
std::vector< std::shared_ptr< SymbolicExpr > > & conditions )
static

在文件 transform_fourier.cpp 第 121 行定义.

124 {
125 std::shared_ptr<SymbolicExpr> result;
126 for (const auto& operand : addition.operands()) {
127 auto transformed = fourier_transform_core(detail::make_expression_ptr(operand),
128 t, omega, context, assumptions, conditions);
129 if (!transformed) return nullptr;
130 result = result ? SymbolicExpr::add(result, transformed) : transformed;
131 }
132 return result;
133}

引用了 context, fourier_transform_core(), LMCAS::detail::make_expression_ptr(), LMCAS::AddNode::operands(), t , 以及 te_fourier_sum().

被这些函数引用 fourier_transform_core() , 以及 te_fourier_sum().

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

◆ te_fourier_unevaluated()

std::shared_ptr< SymbolicExpr > LMCAS::te_fourier_unevaluated ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & t,
const std::string & omega )
static

在文件 transform_fourier.cpp 第 14 行定义.

引用了 LMCAS::SymbolicFactory::create_variable(), LMCAS::TransformNode::Fourier, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), t , 以及 te_fourier_unevaluated().

被这些函数引用 fourier_transform_core() , 以及 te_fourier_unevaluated().

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

◆ te_gaussian_fourier()

std::shared_ptr< SymbolicExpr > LMCAS::te_gaussian_fourier ( const Rational & rate,
const std::string & omega )
static

在文件 transform_fourier.cpp 第 104 行定义.

105 {
107 auto coefficient = SymbolicExpr::sqrt(
108 SymbolicExpr::divide(pi, SymbolicExpr::number(rate)));
109 auto exponent = SymbolicExpr::multiply(SymbolicExpr::number(-Rational(1) / (Rational(4) * rate)),
110 SymbolicExpr::power(SymbolicExpr::variable(omega), SymbolicExpr::number(2)));
111 return SymbolicExpr::multiply(coefficient, SymbolicExpr::exp(exponent));
112}

引用了 exponent, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), pi() , 以及 te_gaussian_fourier().

被这些函数引用 fourier_transform_core() , 以及 te_gaussian_fourier().

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

◆ te_inv_power()

std::shared_ptr< SymbolicExpr > LMCAS::te_inv_power ( const std::shared_ptr< SymbolicExpr > & F,
const std::string & s,
const std::string & t,
ComputationContext & context )
static

在文件 transform_inverse_laplace.cpp 第 33 行定义.

35 {
36 if (!F || !LMCAS::detail::node(F)) {
37 return nullptr;
38 }
39 auto tv = SymbolicExpr::variable(t);
40 auto pw = std::dynamic_pointer_cast<const PowerNode>(LMCAS::detail::node(F));
41 if (!pw) {
42 return nullptr;
43 }
44 BigInt exponent;
45 if (!try_get_integer_value(std::dynamic_pointer_cast<const NumberNode>(pw->exponent()), exponent) ||
46 !exponent.is_negative()) {
47 return nullptr;
48 }
49 const BigInt n = -exponent;
50 auto make_exp = [&](const std::shared_ptr<SymbolicExpr>& a) {
51 auto arg = SymbolicExpr::multiply(a, tv);
54 std::vector<std::shared_ptr<const SymbolicNode>>{LMCAS::detail::node(arg)}));
55 };
56 auto bv = std::dynamic_pointer_cast<const VariableNode>(pw->base());
57 if (bv && !bv->is_constant() && bv->name() == s) {
58 if (n == BigInt(1)) {
59 return SymbolicExpr::number(1);
60 }
61 return SymbolicExpr::divide(SymbolicExpr::power(tv, SymbolicExpr::number(n - BigInt(1))),
62 SymbolicExpr::number(te_factorial(n - BigInt(1), context)));
63 }
64 auto pole = te_inverse_pole(pw->base(), s);
65 if (pole) {
66 if (n == BigInt(1)) {
67 if (te_is_zero(pole)) {
68 return SymbolicExpr::number(1);
69 }
70 return make_exp(pole);
71 }
72 auto tp = SymbolicExpr::power(tv, SymbolicExpr::number(n - BigInt(1)));
73 auto fv = SymbolicExpr::number(te_factorial(n - BigInt(1), context));
74 if (te_is_zero(pole)) {
75 return SymbolicExpr::divide(tp, fv);
76 }
77 return SymbolicExpr::divide(SymbolicExpr::multiply(tp, make_exp(pole)), fv);
78 }
79 return nullptr;
80}
BigInt te_factorial(const BigInt &n, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > te_inverse_pole(const std::shared_ptr< const SymbolicNode > &base, const std::string &variable)

引用了 a, context, LMCAS::FunctionNode::Exp, exponent, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), t, LMCAS::transform_detail::te_factorial(), te_inv_power(), te_inverse_pole(), LMCAS::transform_detail::te_is_zero() , 以及 try_get_integer_value().

被这些函数引用 inverse_laplace_core(), te_inv_power() , 以及 te_inv_product().

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

◆ te_inv_product()

std::shared_ptr< SymbolicExpr > LMCAS::te_inv_product ( const std::shared_ptr< SymbolicExpr > & F,
const std::string & s,
const std::string & t,
ComputationContext & context )
static

在文件 transform_inverse_laplace.cpp 第 91 行定义.

93 {
94 if (!F || !LMCAS::detail::node(F)) {
95 return nullptr;
96 }
97 auto mul = std::dynamic_pointer_cast<const MultiplyNode>(LMCAS::detail::node(F));
98 if (!mul || mul->operands().size() < 2) {
99 return nullptr;
100 }
101 std::vector<std::shared_ptr<const SymbolicNode>> num_parts;
102 std::shared_ptr<const SymbolicNode> den_part = nullptr;
103 for (const auto& op : mul->operands()) {
104 if (!den_part && te_is_denominator_factor(op, s)) {
105 den_part = op;
106 continue;
107 }
108 num_parts.push_back(op);
109 }
110 if (!den_part) {
111 return nullptr;
112 }
113 std::shared_ptr<SymbolicExpr> num_expr;
114 if (num_parts.empty()) {
115 num_expr = SymbolicExpr::number(1);
116 } else if (num_parts.size() == 1) {
117 num_expr = LMCAS::detail::make_expression_ptr(num_parts[0]);
118 } else {
120 }
121 if (!te_depends_on(num_expr, s)) {
122 auto inv = te_inv_power(LMCAS::detail::make_expression_ptr(den_part), s, t, context);
123 if (inv) {
124 return SymbolicExpr::multiply(num_expr, inv);
125 }
126 }
127 return nullptr;
128}
static bool te_is_denominator_factor(const std::shared_ptr< const SymbolicNode > &expression, const std::string &variable)

引用了 context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), mul(), LMCAS::detail::node(), op, t, LMCAS::transform_detail::te_depends_on(), te_inv_power(), te_inv_product() , 以及 te_is_denominator_factor().

被这些函数引用 inverse_laplace_core() , 以及 te_inv_product().

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

◆ te_inverse_pole()

std::shared_ptr< SymbolicExpr > LMCAS::te_inverse_pole ( const std::shared_ptr< const SymbolicNode > & base,
const std::string & variable )
static

在文件 transform_inverse_laplace.cpp 第 24 行定义.

25 {
26 auto addition = std::dynamic_pointer_cast<const AddNode>(base);
27 if (!addition || addition->operands().size() != 2) return nullptr;
28 auto pole = te_inverse_pole_term(*addition, 0, variable);
29 if (pole) return pole;
30 return te_inverse_pole_term(*addition, 1, variable);
31}
static std::shared_ptr< SymbolicExpr > te_inverse_pole_term(const AddNode &addition, std::size_t i, const std::string &variable)

引用了 te_inverse_pole(), te_inverse_pole_term() , 以及 variable.

被这些函数引用 te_inv_power() , 以及 te_inverse_pole().

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

◆ te_inverse_pole_term()

std::shared_ptr< SymbolicExpr > LMCAS::te_inverse_pole_term ( const AddNode & addition,
std::size_t i,
const std::string & variable )
static

在文件 transform_inverse_laplace.cpp 第 16 行定义.

17 {
18 auto symbol = std::dynamic_pointer_cast<const VariableNode>(addition.operands()[i]);
19 if (!symbol || symbol->is_constant() || symbol->name() != variable) return nullptr;
21 SymbolicFactory::create_number(BigInt(-1)), addition.operands()[1 - i]}));
22}

引用了 LMCAS::SymbolicFactory::create_multiply(), LMCAS::SymbolicFactory::create_number(), LMCAS::detail::make_expression_ptr(), LMCAS::AddNode::operands(), te_inverse_pole_term() , 以及 variable.

被这些函数引用 te_inverse_pole() , 以及 te_inverse_pole_term().

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

◆ te_is_abs_variable()

bool LMCAS::te_is_abs_variable ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & variable )
static

在文件 transform_fourier.cpp 第 22 行定义.

23 {
24 auto function = std::dynamic_pointer_cast<const FunctionNode>(node);
26 function->arguments().size() != 1) return false;
27 auto argument = std::dynamic_pointer_cast<const VariableNode>(function->arguments()[0]);
28 return argument && !argument->is_constant() && argument->name() == variable;
29}

引用了 LMCAS::FunctionNode::Abs, function(), te_is_abs_variable() , 以及 variable.

被这些函数引用 te_abs_decay() , 以及 te_is_abs_variable().

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

◆ te_is_denominator_factor()

bool LMCAS::te_is_denominator_factor ( const std::shared_ptr< const SymbolicNode > & expression,
const std::string & variable )
static

在文件 transform_inverse_laplace.cpp 第 81 行定义.

83 {
84 const auto power = std::dynamic_pointer_cast<const PowerNode>(expression);
85 if (!power) return false;
86 const auto exponent = te_number_value(power->exponent());
87 return exponent && *exponent < Rational(0) &&
89}
std::optional< Rational > te_number_value(const std::shared_ptr< const SymbolicNode > &node)

引用了 exponent, expression_depends_on_variable(), te_is_denominator_factor(), LMCAS::transform_detail::te_number_value() , 以及 variable.

被这些函数引用 te_inv_product() , 以及 te_is_denominator_factor().

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

◆ te_is_hyp()

bool LMCAS::te_is_hyp ( const std::shared_ptr< SymbolicExpr > & e,
const std::string & v,
bool & is_sinh,
std::shared_ptr< SymbolicExpr > & freq )
static

在文件 transform_laplace.cpp 第 32 行定义.

33 {
34 if (!e || !LMCAS::detail::node(e)) {
35 return false;
36 }
37 auto fn = std::dynamic_pointer_cast<const FunctionNode>(LMCAS::detail::node(e));
38 if (!fn || fn->arguments().empty()) {
39 return false;
40 }
41 if (fn->type() != FunctionNode::FuncType::Sinh && fn->type() != FunctionNode::FuncType::Cosh) {
42 return false;
43 }
44 is_sinh = (fn->type() == FunctionNode::FuncType::Sinh);
45 freq = te_linear_coefficient(fn->arguments()[0], v);
46 return freq != nullptr;
47}

引用了 LMCAS::FunctionNode::Cosh, e(), LMCAS::detail::node(), LMCAS::FunctionNode::Sinh, te_is_hyp(), LMCAS::transform_detail::te_linear_coefficient() , 以及 v.

被这些函数引用 te_is_hyp() , 以及 te_laplace_lookup().

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

◆ te_is_power_of_var()

bool LMCAS::te_is_power_of_var ( const std::shared_ptr< SymbolicExpr > & e,
const std::string & v,
BigInt & n )
static

在文件 transform_laplace.cpp 第 15 行定义.

15 {
16 if (!e || !LMCAS::detail::node(e)) {
17 return false;
18 }
19 auto vn = std::dynamic_pointer_cast<const VariableNode>(LMCAS::detail::node(e));
20 if (vn && !vn->is_constant() && vn->name() == v) { n = BigInt(1); return true; }
21 auto pw = std::dynamic_pointer_cast<const PowerNode>(LMCAS::detail::node(e));
22 if (!pw) {
23 return false;
24 }
25 auto bv = std::dynamic_pointer_cast<const VariableNode>(pw->base());
26 if (!bv || bv->is_constant() || bv->name() != v) {
27 return false;
28 }
29 return try_get_integer_value(std::dynamic_pointer_cast<const NumberNode>(pw->exponent()), n) &&
30 !n.is_negative();
31}

引用了 e(), LMCAS::detail::node(), te_is_power_of_var(), try_get_integer_value() , 以及 v.

被这些函数引用 te_is_power_of_var(), te_laplace_lookup() , 以及 te_laplace_roc().

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

◆ te_laplace_lookup()

std::shared_ptr< SymbolicExpr > LMCAS::te_laplace_lookup ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & t,
const std::string & s,
ComputationContext & context )
static

在文件 transform_laplace.cpp 第 79 行定义.

81 {
82 if (!f || !LMCAS::detail::node(f)) return nullptr;
83 auto sv = SymbolicExpr::variable(s);
84 if (!te_depends_on(f, t)) return SymbolicExpr::divide(f, sv);
85 BigInt n;
86 if (te_is_power_of_var(f, t, n)) {
87 return SymbolicExpr::divide(SymbolicExpr::number(te_factorial(n, context)),
88 SymbolicExpr::power(sv, SymbolicExpr::number(n + BigInt(1))));
89 }
90 bool is_sin = false; std::shared_ptr<SymbolicExpr> freq;
91 if (te_is_trig(f, t, is_sin, freq)) {
92 auto den = SymbolicExpr::add(SymbolicExpr::power(sv, SymbolicExpr::number(2)), SymbolicExpr::power(freq, SymbolicExpr::number(2)));
93 return is_sin ? SymbolicExpr::divide(freq, den) : SymbolicExpr::divide(sv, den);
94 }
95 bool is_sinh = false; std::shared_ptr<SymbolicExpr> hf;
96 if (te_is_hyp(f, t, is_sinh, hf)) {
97 auto den = SymbolicExpr::add(SymbolicExpr::power(sv, SymbolicExpr::number(2)), SymbolicExpr::multiply(SymbolicExpr::number(-1), SymbolicExpr::power(hf, SymbolicExpr::number(2))));
98 return is_sinh ? SymbolicExpr::divide(hf, den) : SymbolicExpr::divide(sv, den);
99 }
100 std::shared_ptr<SymbolicExpr> a, rem;
101 if (te_extract_exp(f, t, a, rem) && !te_depends_on(rem, t))
102 return SymbolicExpr::divide(rem, SymbolicExpr::add(sv, SymbolicExpr::multiply(SymbolicExpr::number(-1), a)));
103 return nullptr;
104}
Node divide(const Node &numerator, const Node &denominator)
bool te_is_trig(const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable, bool &is_sin, std::shared_ptr< SymbolicExpr > &frequency)
static bool te_is_hyp(const std::shared_ptr< SymbolicExpr > &e, const std::string &v, bool &is_sinh, std::shared_ptr< SymbolicExpr > &freq)
static bool te_is_power_of_var(const std::shared_ptr< SymbolicExpr > &e, const std::string &v, BigInt &n)

引用了 a, context, LMCAS::detail::node(), t, LMCAS::transform_detail::te_depends_on(), te_extract_exp(), LMCAS::transform_detail::te_factorial(), te_is_hyp(), te_is_power_of_var(), LMCAS::transform_detail::te_is_trig() , 以及 te_laplace_lookup().

被这些函数引用 LMCAS::transform_detail::laplace_transform_core() , 以及 te_laplace_lookup().

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

◆ te_laplace_roc()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::te_laplace_roc ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & t,
const std::string & s )
static

在文件 transform_laplace.cpp 第 106 行定义.

109 {
110 if (!f || !LMCAS::detail::node(f)) return {};
111 auto sv = SymbolicExpr::variable(s);
112 if (!te_depends_on(f, t)) {
113 auto condition = te_gt_condition(sv, SymbolicExpr::number(0));
114 return condition ? std::vector<std::shared_ptr<SymbolicExpr>>{condition}
115 : std::vector<std::shared_ptr<SymbolicExpr>>{};
116 }
117 BigInt n;
118 if (te_is_power_of_var(f, t, n)) {
119 auto condition = te_gt_condition(sv, SymbolicExpr::number(0));
120 return condition ? std::vector<std::shared_ptr<SymbolicExpr>>{condition}
121 : std::vector<std::shared_ptr<SymbolicExpr>>{};
122 }
123 bool is_sin = false;
124 std::shared_ptr<SymbolicExpr> freq;
125 if (te_is_trig(f, t, is_sin, freq)) {
126 auto condition = te_gt_condition(sv, SymbolicExpr::number(0));
127 return condition ? std::vector<std::shared_ptr<SymbolicExpr>>{condition}
128 : std::vector<std::shared_ptr<SymbolicExpr>>{};
129 }
130 std::shared_ptr<SymbolicExpr> a;
131 std::shared_ptr<SymbolicExpr> rem;
132 if (te_extract_exp(f, t, a, rem) && !te_depends_on(rem, t)) {
133 auto condition = te_gt_condition(sv, a);
134 return condition ? std::vector<std::shared_ptr<SymbolicExpr>>{condition}
135 : std::vector<std::shared_ptr<SymbolicExpr>>{};
136 }
137 return {};
138}

引用了 a, LMCAS::detail::node(), t, LMCAS::transform_detail::te_depends_on(), te_extract_exp(), LMCAS::transform_detail::te_gt_condition(), te_is_power_of_var(), LMCAS::transform_detail::te_is_trig() , 以及 te_laplace_roc().

被这些函数引用 laplace_transform_checked() , 以及 te_laplace_roc().

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

◆ te_laplace_sum()

std::shared_ptr< SymbolicExpr > LMCAS::te_laplace_sum ( const std::shared_ptr< SymbolicExpr > & f,
const AddNode & addition,
const std::string & t,
const std::string & s,
ComputationContext & context )
static

在文件 transform_laplace.cpp 第 140 行定义.

142 {
143 std::shared_ptr<SymbolicExpr> result;
144 for (const auto& operand : addition.operands()) {
145 auto transformed = laplace_transform_core(
147 if (!transformed) return te_unevaluated_laplace(f, t, s);
148 result = result ? SymbolicExpr::add(result, transformed) : transformed;
149 }
150 return result;
151}
static std::shared_ptr< SymbolicExpr > te_unevaluated_laplace(const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &s)

引用了 context, LMCAS::transform_detail::laplace_transform_core(), LMCAS::detail::make_expression_ptr(), LMCAS::AddNode::operands(), t, te_laplace_sum() , 以及 te_unevaluated_laplace().

被这些函数引用 LMCAS::transform_detail::laplace_transform_core() , 以及 te_laplace_sum().

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

◆ te_unevaluated_inv_laplace()

std::shared_ptr< SymbolicExpr > LMCAS::te_unevaluated_inv_laplace ( const std::shared_ptr< SymbolicExpr > & F,
const std::string & s,
const std::string & t )
static

在文件 transform_inverse_laplace.cpp 第 10 行定义.

引用了 LMCAS::SymbolicFactory::create_variable(), LMCAS::TransformNode::InverseLaplace, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), t , 以及 te_unevaluated_inv_laplace().

被这些函数引用 inverse_laplace_core() , 以及 te_unevaluated_inv_laplace().

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

◆ te_unevaluated_laplace()

std::shared_ptr< SymbolicExpr > LMCAS::te_unevaluated_laplace ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & t,
const std::string & s )
static

在文件 transform_laplace.cpp 第 9 行定义.

引用了 LMCAS::SymbolicFactory::create_variable(), LMCAS::TransformNode::Laplace, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), t , 以及 te_unevaluated_laplace().

被这些函数引用 LMCAS::transform_detail::laplace_transform_core(), te_laplace_sum() , 以及 te_unevaluated_laplace().

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

◆ te_validate_convolution_inputs()

Result< void > LMCAS::te_validate_convolution_inputs ( const std::shared_ptr< SymbolicExpr > & f,
const std::shared_ptr< SymbolicExpr > & g,
const std::string & var,
ComputationContext & context,
const std::string & operation )
static

在文件 transform_convolution.cpp 第 11 行定义.

16 {
17 auto step = context.consume_steps(1, operation);
18 if (!step) return step;
19 if (!f || !LMCAS::detail::node(f) || !g || !LMCAS::detail::node(g)) {
21 "convolution expressions cannot be null",
22 operation);
23 }
24 if (var.empty()) {
26 "convolution variable name cannot be empty",
27 operation);
28 }
29 return Result<void>::success();
30}

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

被这些函数引用 convolve_checked() , 以及 te_validate_convolution_inputs().

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

◆ tf_back_substitute()

std::shared_ptr< SymbolicExpr > LMCAS::tf_back_substitute ( const std::shared_ptr< SymbolicExpr > & factor_expr,
const std::vector< TransSubstitution > & mappings,
ComputationContext & context )

将因子表达式中的不定元变量替换回原始超越子表达式.

对换元后的因子执行逆操作:遍历映射列表,将每个不定元(u0, u1, ...) 替换为其对应的原始超越表达式(如 sin(x),cos(x) 等). 逐一执行自由变量代入,复用调用者的变换预算。

参数
[in]factor_expr以不定元表示的因子表达式
[in]mappings换元映射列表(indeterminate -> trans_expr)
返回
替换后的符号表达式,以原始变量和超越函数表示

仅当表达式依赖该不定元时才执行替换

在文件 transcendental_rewrite.cpp 第 29 行定义.

31 {
32
33 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
34 (context).limits().max_ast_nodes, "transform");
35
36 if (!factor_expr || !LMCAS::detail::node(factor_expr)) {
37 return factor_expr;
38 }
39 if (mappings.empty()) {
40 return factor_expr;
41 }
42
43 auto result = factor_expr;
44
45 for (const auto& m : mappings) {
46 if (!m.trans_expr || m.indeterminate.empty()) {
47 continue;
48 }
49
50 /// 仅当表达式依赖该不定元时才执行替换
51 if (expression_depends_on_variable(LMCAS::detail::node(result), m.indeterminate)) {
52 result = detail::make_expression_ptr(detail::substitute_node(detail::node(result), m.indeterminate, detail::node(m.trans_expr), transform_budget));
53 }
54 }
55
56 return result;
57}

引用了 context, expression_depends_on_variable(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::substitute_node() , 以及 tf_back_substitute().

被这些函数引用 tf_back_substitute() , 以及 tf_restore_factors().

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

◆ tf_build_polynomial()

Result< TfPolyBuildResult > LMCAS::tf_build_polynomial ( const std::shared_ptr< SymbolicExpr > & poly_expr,
const std::vector< std::string > & indeterminates,
const std::string & original_var )

在文件 transcendental_polynomial.cpp 第 166 行定义.

169 {
171 return tf_build_polynomial_impl(poly_expr, indeterminates, original_var, context);
172}
Result< TfPolyBuildResult > tf_build_polynomial_impl(const std::shared_ptr< SymbolicExpr > &expression, const std::vector< std::string > &indeterminates, const std::string &original_variable, ComputationContext &context)

引用了 context, tf_build_polynomial() , 以及 tf_build_polynomial_impl().

被这些函数引用 tf_build_polynomial().

函数调用图:
这是这个函数的调用关系图:

◆ tf_build_polynomial_impl()

Result< TfPolyBuildResult > LMCAS::tf_build_polynomial_impl ( const std::shared_ptr< SymbolicExpr > & expression,
const std::vector< std::string > & indeterminates,
const std::string & original_variable,
ComputationContext & context )

在文件 transcendental_polynomial.cpp 第 174 行定义.

177 {
178 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
179 context.limits().max_ast_nodes,
180 "tf_build_polynomial");
181 TfPolyBuildResult result;
182 result.success = false;
183
184 if (!poly_expr || !LMCAS::detail::node(poly_expr) || original_var.empty()) {
186 "expression and variable must be nonempty", "tf_build_polynomial");
187 }
188
189 auto before = tf_polynomial_variables(poly_expr, indeterminates, original_var);
190 if (!before.empty() && !tf_validate_polynomial(poly_expr, before)) return result;
191 auto expanded = detail::make_expression_ptr(detail::expand_node(detail::node(poly_expr), transform_budget));
192 if (!expanded || !LMCAS::detail::node(expanded)) {
193 expanded = poly_expr;
194 }
195 auto all_variables = tf_polynomial_variables(expanded, indeterminates, original_var);
196 if (all_variables.empty()) {
197 auto c = extract_coeff_value<Rational>(expanded);
198 if (!c) {
199 if (c.error().code == CasErrc::UnsupportedExpression) return result;
201 }
202 result.poly = Polynomial<Rational>({std::move(c.value())}, "x");
203 result.main_variable = "x";
204 result.success = true;
205 return result;
206 }
207
208 if (!tf_validate_polynomial(expanded, all_variables)) {
209 return result;
210 }
211 int max_degree = -1;
212 tf_select_main_variable(result, expanded, all_variables, max_degree);
213 if (result.main_variable.empty() || max_degree < 0) return result;
214 return tf_convert_main_variable(std::move(result), expanded, all_variables);
215}
216catch (const CasError& error) { return Result<TfPolyBuildResult>::failure(error); } catch (const std::bad_alloc&) {
218 "allocation failed while constructing polynomial", "tf_build_polynomial");
219} catch (const std::length_error& error) { return Result<TfPolyBuildResult>::failure(CasErrc::ResourceLimit, error.what(), "tf_build_polynomial"); } catch (const std::exception& ex) {
221 ex.what(), "tf_build_polynomial");
222}
static bool tf_validate_polynomial(const std::shared_ptr< SymbolicExpr > &poly_expr, const std::vector< std::string > &all_variables)
判断换元式是否为候选变量的多项式。 各候选变量的次数须可确定为非负整数,且超越函数不得依赖不定元或原始变量。
Result< T > extract_coeff_value(const std::shared_ptr< SymbolicExpr > &coefficient)
精确提取系数;不支持的值返回错误,保持数值完整。
static std::vector< std::string > tf_polynomial_variables(const std::shared_ptr< SymbolicExpr > &expression, const std::vector< std::string > &indeterminates, const std::string &original_var)
static Result< TfPolyBuildResult > tf_convert_main_variable(TfPolyBuildResult result, const std::shared_ptr< SymbolicExpr > &expanded, const std::vector< std::string > &all_variables)
static void tf_select_main_variable(TfPolyBuildResult &result, const std::shared_ptr< SymbolicExpr > &expanded, const std::vector< std::string > &variables, int &max_degree)
分解含 sin、cos、exp、ln 等超越函数的表达式。
Polynomial< Rational > poly
主变量多项式(单变量或主变量策略)
std::string main_variable
选定的主变量名

引用了 c, context, LMCAS::detail::expand_node(), extract_coeff_value(), LMCAS::Result< T >::failure(), InvalidArgument, LMCAS::TfPolyBuildResult::main_variable, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::TfPolyBuildResult::poly, LMCAS::TfPolyBuildResult::success, tf_build_polynomial_impl(), tf_convert_main_variable(), tf_polynomial_variables(), tf_select_main_variable(), tf_validate_polynomial() , 以及 UnsupportedExpression.

被这些函数引用 tf_build_polynomial(), tf_build_polynomial_impl() , 以及 tf_factor_substitution().

函数调用图:
这是这个函数的调用关系图:

◆ tf_collect_transcendental()

void LMCAS::tf_collect_transcendental ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & var,
std::vector< std::shared_ptr< const SymbolicNode > > & candidates )
static

按先序收集依赖 var 的超越函数子表达式。

嵌套函数按外层优先收集,如 sin(exp(x)) 先于 exp(x)。

参数
[in]node当前 AST 节点
[in]var目标变量名
[out]candidates收集到的超越子表达式列表

在文件 transcendental_substitution.cpp 第 39 行定义.

42 {
43
44 if (!node) return;
45
46 if (auto func = std::dynamic_pointer_cast<const FunctionNode>(node)) {
47 if (func->arguments().size() == 1 &&
48 tf_is_transcendental_type(func->type()) &&
49 expression_depends_on_variable(func->arguments()[0], var)) {
50 candidates.push_back(node);
51 }
52 for (auto& arg : func->arguments()) {
53 tf_collect_transcendental(arg, var, candidates);
54 }
55 return;
56 }
57
58 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
59 for (auto& op : add->operands()) {
60 tf_collect_transcendental(op, var, candidates);
61 }
62 return;
63 }
64
65 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
66 for (auto& op : mul->operands()) {
67 tf_collect_transcendental(op, var, candidates);
68 }
69 return;
70 }
71
72 if (auto pow = std::dynamic_pointer_cast<const PowerNode>(node)) {
73 tf_collect_transcendental(pow->base(), var, candidates);
74 tf_collect_transcendental(pow->exponent(), var, candidates);
75 return;
76 }
77
78}
bool tf_is_transcendental_type(FunctionNode::FuncType function_type)
判断函数类型是否支持超越函数换元。

引用了 add(), expression_depends_on_variable(), mul(), op, pow(), tf_collect_transcendental() , 以及 tf_is_transcendental_type().

被这些函数引用 detect_trans_substitutions() , 以及 tf_collect_transcendental().

函数调用图:
这是这个函数的调用关系图:

◆ tf_contains_transcendental()

bool LMCAS::tf_contains_transcendental ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & variable )

在文件 transcendental_rewrite.cpp 第 492 行定义.

494 {
495
496 if (!node) {
497 return false;
498 }
499
500 if (auto func = std::dynamic_pointer_cast<const FunctionNode>(node)) {
501 if (func->arguments().size() == 1 &&
502 tf_is_transcendental_type(func->type()) &&
503 expression_depends_on_variable(func->arguments()[0], var)) {
504 return true;
505 }
506 return any_transcendental(func->arguments(), var);
507 }
508
509 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
510 return any_transcendental(add->operands(), var);
511 }
512
513 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
514 return any_transcendental(mul->operands(), var);
515 }
516 if (auto pow = std::dynamic_pointer_cast<const PowerNode>(node)) {
517 return tf_contains_transcendental(pow->base(), var) ||
518 tf_contains_transcendental(pow->exponent(), var);
519 }
520
521 return false;
522}
static bool any_transcendental(const std::vector< std::shared_ptr< const SymbolicNode > > &nodes, const std::string &var)
判断表达式 AST 中是否包含依赖指定变量的超越函数.

引用了 add(), any_transcendental(), expression_depends_on_variable(), mul(), pow(), tf_contains_transcendental() , 以及 tf_is_transcendental_type().

被这些函数引用 any_transcendental(), factor_transcendental() , 以及 tf_contains_transcendental().

函数调用图:
这是这个函数的调用关系图:

◆ tf_convert_main_variable()

Result< TfPolyBuildResult > LMCAS::tf_convert_main_variable ( TfPolyBuildResult result,
const std::shared_ptr< SymbolicExpr > & expanded,
const std::vector< std::string > & all_variables )
static

在文件 transcendental_polynomial.cpp 第 133 行定义.

135 {
136 const auto main_var = result.main_variable;
137 auto converted = symbolic_to_poly<Rational>(expanded, main_var);
138 if (converted) {
139 result.poly = std::move(converted.value());
140 result.success = true;
141 return result;
142 }
143 if (converted.error().code != CasErrc::UnsupportedExpression) {
144 return Result<TfPolyBuildResult>::failure(converted.error());
145 }
146 for (const auto& var : all_variables) {
147 if (var == main_var) continue;
148 auto trial = symbolic_to_poly<Rational>(expanded, var);
149 if (!trial) {
150 if (trial.error().code == CasErrc::UnsupportedExpression) continue;
151 return Result<TfPolyBuildResult>::failure(trial.error());
152 }
153 result.main_variable = var;
154 result.poly = std::move(trial.value());
155 result.param_variables.clear();
156 for (const auto& other : all_variables) {
157 if (other != var) result.param_variables.push_back(other);
158 }
159 result.success = true;
160 return result;
161 }
162 result.success = false;
163 return result;
164}
std::vector< std::string > param_variables
参数变量列表(非主变量的不定元)

引用了 LMCAS::Result< T >::failure(), main_var, LMCAS::TfPolyBuildResult::main_variable, LMCAS::TfPolyBuildResult::param_variables, LMCAS::TfPolyBuildResult::poly, LMCAS::TfPolyBuildResult::success, tf_convert_main_variable() , 以及 UnsupportedExpression.

被这些函数引用 tf_build_polynomial_impl() , 以及 tf_convert_main_variable().

函数调用图:
这是这个函数的调用关系图:

◆ tf_deduplicate()

void LMCAS::tf_deduplicate ( std::vector< std::shared_ptr< const SymbolicNode > > & candidates)
static

按结构哈希和 equals 比较去重,保留首次出现的顺序。

参数
[in,out]candidates候选列表,去重后仅保留唯一项

在文件 transcendental_substitution.cpp 第 86 行定义.

86 {
87 NodeSet seen;
88 std::vector<std::shared_ptr<const SymbolicNode>> unique;
89
90 for (auto& node : candidates) {
91 if (seen.find(node) == seen.end()) {
92 seen.insert(node);
93 unique.push_back(node);
94 }
95 }
96
97 candidates = std::move(unique);
98}
std::unordered_set< std::shared_ptr< const SymbolicNode >, NodeHash, NodeEqual > NodeSet

引用了 tf_deduplicate().

被这些函数引用 detect_trans_substitutions() , 以及 tf_deduplicate().

函数调用图:
这是这个函数的调用关系图:

◆ tf_degree_in()

int LMCAS::tf_degree_in ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & variable )

在文件 transcendental_polynomial.cpp 第 40 行定义.

40 {
41 if (!node) return 0;
42
43 if (!expression_depends_on_variable(node, var)) return 0;
44
45 if (auto v = std::dynamic_pointer_cast<const VariableNode>(node)) {
46 return (!v->is_constant() && v->name() == var) ? 1 : 0;
47 }
48
49 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
50 int max_deg = 0;
51 for (const auto& op : add->operands()) {
52 int d = tf_degree_in(op, var);
53 if (d < 0) return -1;
54 max_deg = std::max(max_deg, d);
55 }
56 return max_deg;
57 }
58
59 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
60 int total_deg = 0;
61 for (const auto& op : mul->operands()) {
62 int d = tf_degree_in(op, var);
63 if (d < 0) return -1;
64 if (d > std::numeric_limits<int>::max() - total_deg) return -1;
65 total_deg += d;
66 }
67 return total_deg;
68 }
69
70 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
71 return tf_power_degree(*power, var);
72 }
73 if (std::dynamic_pointer_cast<const FunctionNode>(node)) {
74 return -1;
75 }
76
77 return 0;
78}
static int tf_power_degree(const PowerNode &power, const std::string &var)
int tf_degree_in(const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)

引用了 add(), expression_depends_on_variable(), mul(), op, tf_degree_in(), tf_power_degree() , 以及 v.

被这些函数引用 tf_degree_in(), tf_is_linear_irreducible(), tf_power_degree(), tf_select_main_variable() , 以及 tf_validate_polynomial().

函数调用图:
这是这个函数的调用关系图:

◆ tf_detect_constraints()

void LMCAS::tf_detect_constraints ( TransSubstitutionResult & result)
static

在文件 transcendental_substitution.cpp 第 239 行定义.

239 {
240 const auto& mappings = result.mappings;
241 for (size_t i = 0; i < mappings.size(); ++i) {
242 auto first = std::dynamic_pointer_cast<const FunctionNode>(
243 detail::node(mappings[i].trans_expr));
244 if (!first || first->arguments().size() != 1) continue;
245 for (size_t j = i + 1; j < mappings.size(); ++j) {
246 auto second = std::dynamic_pointer_cast<const FunctionNode>(
247 detail::node(mappings[j].trans_expr));
248 if (!second || second->arguments().size() != 1) continue;
249 auto constraint = tf_pair_constraint(mappings[i], mappings[j], *first, *second);
250 if (constraint) result.constraints.push_back(std::move(constraint));
251 }
252 }
253}
static std::shared_ptr< SymbolicExpr > tf_pair_constraint(const TransSubstitution &left, const TransSubstitution &right, const FunctionNode &first, const FunctionNode &second)
std::vector< std::shared_ptr< SymbolicExpr > > constraints
代数约束 (e.g., u0^2+u1^2-1=0)

引用了 LMCAS::TransSubstitutionResult::constraints, LMCAS::TransSubstitutionResult::mappings, LMCAS::detail::node(), tf_detect_constraints() , 以及 tf_pair_constraint().

被这些函数引用 detect_trans_substitutions() , 以及 tf_detect_constraints().

函数调用图:
这是这个函数的调用关系图:

◆ tf_detect_exponential_separation()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::tf_detect_exponential_separation ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
ComputationContext & context )

检测加法表达式中的公共指数因子并执行分离.

对于 AddNode 形式的表达式,检查所有加法项是否共享相同的 exp(f(x)) 因子. 若是,则提取公因子:expr = exp(f(x)) * (t1' + t2' + ... + tn'), 其中 ti' = ti / exp(f(x)).

典型用例:

  • exp(x)*x + exp(x) -> [exp(x), x+1]
  • exp(x)*x^2 + 2*exp(x)*x + exp(x) -> [exp(x), x^2+2x+1]
参数
[in]expr待检测的符号表达式
[in]var目标变量名
返回
因子列表 [exp(f(x)), remaining_sum];若无公共 exp 因子则返回空向量

从第一个加法项中提取 exp 因子作为候选公因子

验证所有加法项均含有相同的 exp 因子

所有项共享相同的 exp(f(x)),执行分离 构造剩余和:对每个项移除 exp 因子

构造结果

化简剩余和

在文件 transcendental_rewrite.cpp 第 409 行定义.

411 {
412
413 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
414 (context).limits().max_ast_nodes, "transform");
415
416 if (!expr || !LMCAS::detail::node(expr)) {
417 return {};
418 }
419
420 auto add = std::dynamic_pointer_cast<const AddNode>(LMCAS::detail::node(expr));
421 if (!add || add->operands().size() < 2) {
422 return {};
423 }
424
425 /// 从第一个加法项中提取 exp 因子作为候选公因子
426 std::shared_ptr<const SymbolicNode> common_exp = tf_extract_exp_factor(add->operands()[0], var);
427 if (!common_exp) {
428 return {};
429 }
430
431 /// 验证所有加法项均含有相同的 exp 因子
432 for (size_t i = 1; i < add->operands().size(); ++i) {
433 std::shared_ptr<const SymbolicNode> term_exp = tf_extract_exp_factor(add->operands()[i], var);
434 if (!term_exp || !term_exp->equals(*common_exp)) {
435 return {};
436 }
437 }
438
439 /// 所有项共享相同的 exp(f(x)),执行分离
440 /// 构造剩余和:对每个项移除 exp 因子
441 std::vector<std::shared_ptr<const SymbolicNode>> remainder_terms;
442 remainder_terms.reserve(add->operands().size());
443
444 for (const auto& op : add->operands()) {
445 auto remainder = tf_remove_exp_factor(op, common_exp);
446 remainder_terms.push_back(remainder);
447 }
448
449 /// 构造结果
450 auto exp_factor_expr = LMCAS::detail::make_expression_ptr(common_exp);
451
452 std::shared_ptr<SymbolicExpr> sum_expr;
453 if (remainder_terms.size() == 1) {
454 sum_expr = LMCAS::detail::make_expression_ptr(remainder_terms[0]);
455 } else {
457 LMCAS::detail::make_node<AddNode>(std::move(remainder_terms)));
458 }
459
460 /// 化简剩余和
461 auto simplified_sum = detail::make_expression_ptr(detail::normalize_node(detail::node(sum_expr), transform_budget));
462 if (simplified_sum && LMCAS::detail::node(simplified_sum)) {
463 sum_expr = simplified_sum;
464 }
465
466 return {exp_factor_expr, sum_expr};
467}
static std::shared_ptr< const SymbolicNode > tf_extract_exp_factor(const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
从乘积项中提取指数函数因子.
static std::shared_ptr< const SymbolicNode > tf_remove_exp_factor(const std::shared_ptr< const SymbolicNode > &node, const std::shared_ptr< const SymbolicNode > &exp_factor)
从乘积项中移除指定的指数函数因子,返回剩余部分.

引用了 add(), context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), op, tf_detect_exponential_separation(), tf_extract_exp_factor() , 以及 tf_remove_exp_factor().

被这些函数引用 factor_transcendental() , 以及 tf_detect_exponential_separation().

函数调用图:
这是这个函数的调用关系图:

◆ tf_detect_multiplicative_structure()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::tf_detect_multiplicative_structure ( const std::shared_ptr< SymbolicExpr > & expr)

检测表达式是否已为独立子表达式的乘积形式.

MultiplyNode 的各操作数直接形成独立因子,沿乘法结构完成分解; 数值常数单独累积,并在值异于 1 时形成常数因子.

参数
[in]expr待检测的符号表达式
返回
因子列表;若表达式非乘积形式则返回空向量(表示无快速路径)

数值常数单独累积

浮点数值:作为独立因子保留

非数值操作数作为独立因子

仅当存在至少两个非常数因子(或一个非常数因子加一个非 1 常数)时才视为有效乘积分解

插入累积常数因子(若非 1)

在文件 transcendental_rewrite.cpp 第 236 行定义.

237 {
238
239 if (!expr || !LMCAS::detail::node(expr)) {
240 return {};
241 }
242
243 auto mul = std::dynamic_pointer_cast<const MultiplyNode>(LMCAS::detail::node(expr));
244 if (!mul || mul->operands().size() < 2) {
245 return {};
246 }
247
248 std::vector<std::shared_ptr<SymbolicExpr>> factors;
249 Rational constant_acc(1);
250
251 for (const auto& op : mul->operands()) {
252 if (!op) {
253 continue;
254 }
255
256 /// 数值常数单独累积
257 if (op->is_number()) {
258 auto num = std::dynamic_pointer_cast<const NumberNode>(op);
259 if (num) {
260 if (std::holds_alternative<BigInt>(num->value())) {
261 constant_acc = constant_acc * Rational(std::get<BigInt>(num->value()));
262 } else if (std::holds_alternative<Rational>(num->value())) {
263 constant_acc = constant_acc * std::get<Rational>(num->value());
264 } else {
265 /// 浮点数值:作为独立因子保留
266 factors.push_back(LMCAS::detail::make_expression_ptr(op));
267 }
268 }
269 continue;
270 }
271
272 /// 非数值操作数作为独立因子
273 factors.push_back(LMCAS::detail::make_expression_ptr(op));
274 }
275
276 /// 仅当存在至少两个非常数因子(或一个非常数因子加一个非 1 常数)时才视为有效乘积分解
277 if (factors.size() < 2 && (factors.empty() || constant_acc == Rational(1))) {
278 return {};
279 }
280
281 /// 插入累积常数因子(若非 1)
282 if (constant_acc != Rational(1)) {
283 auto const_expr = SymbolicExpr::number(constant_acc);
284 factors.insert(factors.begin(), const_expr);
285 }
286
287 return factors;
288}

引用了 LMCAS::detail::make_expression_ptr(), mul(), LMCAS::detail::node(), LMCAS::polynomial_solver_detail::num(), op , 以及 tf_detect_multiplicative_structure().

被这些函数引用 factor_transcendental() , 以及 tf_detect_multiplicative_structure().

函数调用图:
这是这个函数的调用关系图:

◆ tf_extract_coeff_trig_squared()

bool LMCAS::tf_extract_coeff_trig_squared ( const std::shared_ptr< const SymbolicNode > & node,
std::shared_ptr< const SymbolicNode > & coeff,
FunctionNode::FuncType & func_type,
std::shared_ptr< const SymbolicNode > & argument )
static

从 a*sin^2(f) 或 a*cos^2(f) 提取系数和三角平方项。

注解
单独的三角平方项系数为 1。
参数
[in]node待分析的加法操作数节点
[out]coeff输出系数节点(nullptr 表示系数为 1)
[out]func_type输出函数类型(Sin 或 Cos)
[out]argument输出函数参数节点
返回
匹配成功返回 true

< 表示系数为 1。

在文件 transcendental_pythagorean.cpp 第 65 行定义.

69 {
70
71 if (tf_is_trig_squared(node, func_type, argument)) {
72 coeff = nullptr; /**< 表示系数为 1。 */
73 return true;
74 }
75
76 auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node);
77 if (!mul || mul->operands().size() < 2) {
78 return false;
79 }
80
81 for (size_t i = 0; i < mul->operands().size(); ++i) {
82 if (tf_is_trig_squared(mul->operands()[i], func_type, argument)) {
83 std::vector<std::shared_ptr<const SymbolicNode>> coeff_ops;
84 for (size_t j = 0; j < mul->operands().size(); ++j) {
85 if (j != i) {
86 coeff_ops.push_back(mul->operands()[j]);
87 }
88 }
89
90 if (coeff_ops.size() == 1) {
91 coeff = coeff_ops[0];
92 } else {
93 coeff = LMCAS::detail::make_node<MultiplyNode>(std::move(coeff_ops));
94 }
95 return true;
96 }
97 }
98
99 return false;
100}
static bool tf_is_trig_squared(const std::shared_ptr< const SymbolicNode > &node, FunctionNode::FuncType &func_type, std::shared_ptr< const SymbolicNode > &argument)
匹配 sin^2(f) 或 cos^2(f),提取函数类型和参数。

引用了 LMCAS::detail::make_node(), mul(), tf_extract_coeff_trig_squared() , 以及 tf_is_trig_squared().

被这些函数引用 complementary_square(), simplify_pythagorean_sum() , 以及 tf_extract_coeff_trig_squared().

函数调用图:
这是这个函数的调用关系图:

◆ tf_extract_exp_factor()

std::shared_ptr< const SymbolicNode > LMCAS::tf_extract_exp_factor ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & var )
static

从乘积项中提取指数函数因子.

若节点本身为 exp(f(x)) 形式,直接返回该节点. 若节点为 MultiplyNode,遍历其操作数寻找 exp(f(x)) 因子. 仅提取第一个匹配的指数函数因子.

参数
[in]node待检测的 AST 节点
[in]var目标变量名
返回
找到的 exp 因子节点;未找到返回 nullptr

直接为 exp(f(x)) 形式

乘积形式:遍历操作数寻找 exp 因子

在文件 transcendental_rewrite.cpp 第 315 行定义.

317 {
318
319 if (!node) {
320 return nullptr;
321 }
322
323 /// 直接为 exp(f(x)) 形式
324 if (tf_is_variable_exponential(node, var)) {
325 return node;
326 }
327
328 /// 乘积形式:遍历操作数寻找 exp 因子
329 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
330 for (const auto& op : mul->operands()) {
331 if (tf_is_variable_exponential(op, var)) {
332 return op;
333 }
334 }
335 }
336
337 return nullptr;
338}
static bool tf_is_variable_exponential(const std::shared_ptr< const SymbolicNode > &node, const std::string &var)

引用了 mul(), op, tf_extract_exp_factor() , 以及 tf_is_variable_exponential().

被这些函数引用 tf_detect_exponential_separation() , 以及 tf_extract_exp_factor().

函数调用图:
这是这个函数的调用关系图:

◆ tf_factor_substitution()

Result< std::vector< std::shared_ptr< SymbolicExpr > > > LMCAS::tf_factor_substitution ( const TransSubstitutionResult & sub_result,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & pyth_simplified,
ComputationContext & context )
static

在文件 transcendental_factor.cpp 第 54 行定义.

57 {
59 std::vector<std::string> indeterminates;
60 indeterminates.reserve(sub_result.mappings.size());
61 for (const auto& m : sub_result.mappings) {
62 indeterminates.push_back(m.indeterminate);
63 }
64 auto built = tf_build_polynomial_impl(
65 sub_result.poly_expr, indeterminates, var, context);
66 if (!built) { return FactorsResult::failure(built.error()); }
67 const auto& poly_result = built.value();
68 if (!poly_result.success) {
69 return FactorsResult::success({pyth_simplified});
70 }
71 if (poly_result.poly.degree() <= 1) {
72 return FactorsResult::success({pyth_simplified});
73 }
74 auto factored =
76 if (!factored) {
77 return FactorsResult::failure(factored.error());
78 }
79 const auto& factorization = factored.value();
80 if (factorization.completeness != Completeness::Complete ||
81 factorization.value.size() <= 1) {
82 return FactorsResult::success({pyth_simplified});
83 }
84 return tf_restore_factors(
85 factorization.value, sub_result, pyth_simplified, context);
86}
UnivariateFactorResult factor_univariate_bridge_checked(const Polynomial< Rational > &polynomial, ComputationContext &context)
static std::vector< std::shared_ptr< SymbolicExpr > > tf_restore_factors(const std::vector< Polynomial< Rational > > &true_factors, const TransSubstitutionResult &sub_result, const std::shared_ptr< SymbolicExpr > &pyth_simplified, ComputationContext &context)

引用了 Complete, context, factor_univariate_bridge_checked(), LMCAS::TransSubstitutionResult::mappings, LMCAS::TransSubstitutionResult::poly_expr, tf_build_polynomial_impl(), tf_factor_substitution() , 以及 tf_restore_factors().

被这些函数引用 factor_transcendental() , 以及 tf_factor_substitution().

函数调用图:
这是这个函数的调用关系图:

◆ tf_is_linear_irreducible()

bool LMCAS::tf_is_linear_irreducible ( const TransSubstitutionResult & sub_result,
const std::string & var )

判断换元后的表达式是否对所有不定元和原始变量均为线性.

换元表达式对每个不定元(u0, u1, ...)及原始变量的次数均小于等于 1 时, 该表达式在超越多项式环中为整体元素. 例如 a*sin(x) + b*x + c 映射为 a*u0 + b*x + c,对 u0 与 x 均为线性.

参数
[in]sub_result换元结果(含 poly_expr 和 mappings)
[in]var原始目标变量名
返回
表达式对所有变量均为线性返回 true

检查每个不定元的次数是否 <= 1

检查原始变量的次数是否 <= 1

在文件 transcendental_rewrite.cpp 第 194 行定义.

196 {
197
198 if (!sub_result.poly_expr || !LMCAS::detail::node(sub_result.poly_expr)) {
199 return false;
200 }
201 if (sub_result.mappings.empty()) {
202 return false;
203 }
204
205 const auto& root = LMCAS::detail::node(sub_result.poly_expr);
206
207 /// 检查每个不定元的次数是否 <= 1
208 for (const auto& m : sub_result.mappings) {
209 int deg = tf_degree_in(root, m.indeterminate);
210 if (deg < 0 || deg > 1) {
211 return false;
212 }
213 }
214
215 /// 检查原始变量的次数是否 <= 1
216 if (expression_depends_on_variable(root, var)) {
217 int deg = tf_degree_in(root, var);
218 if (deg < 0 || deg > 1) {
219 return false;
220 }
221 }
222
223 return true;
224}

引用了 expression_depends_on_variable(), LMCAS::TransSubstitutionResult::mappings, LMCAS::detail::node(), LMCAS::TransSubstitutionResult::poly_expr, tf_degree_in() , 以及 tf_is_linear_irreducible().

被这些函数引用 factor_transcendental() , 以及 tf_is_linear_irreducible().

函数调用图:
这是这个函数的调用关系图:

◆ tf_is_negation_of()

bool LMCAS::tf_is_negation_of ( const std::shared_ptr< const SymbolicNode > & node,
const std::shared_ptr< const SymbolicNode > & arg )
static

匹配 (-1)*arg 或 arg*(-1) 的二因子乘积结构。

参数
[in]node待检测节点
[in]arg参考参数节点
返回
若 node 表示 -arg 则返回 true

在文件 transcendental_substitution.cpp 第 121 行定义.

122 {
123 if (!node || !arg) {
124 return false;
125 }
126
127 auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node);
128 if (!mul || mul->operands().size() != 2) {
129 return false;
130 }
131
132 for (int i = 0; i < 2; ++i) {
133 auto num_node = std::dynamic_pointer_cast<const NumberNode>(mul->operands()[i]);
134 if (!num_node) {
135 continue;
136 }
137
138 if (num_node->is_negative_one()) {
139 int other_idx = 1 - i;
140 return tf_nodes_equal(mul->operands()[other_idx], arg);
141 }
142 }
143
144 return false;
145}
static bool tf_nodes_equal(const std::shared_ptr< const SymbolicNode > &a, const std::shared_ptr< const SymbolicNode > &b)
判断两个 AST 节点是否结构相等。

引用了 mul(), tf_is_negation_of() , 以及 tf_nodes_equal().

被这些函数引用 tf_is_negation_of() , 以及 tf_pair_constraint().

函数调用图:
这是这个函数的调用关系图:

◆ tf_is_sine_cosine_pair()

bool LMCAS::tf_is_sine_cosine_pair ( FunctionNode::FuncType first,
FunctionNode::FuncType second )
static

在文件 transcendental_substitution.cpp 第 206 行定义.

206 {
207 if (first == FunctionNode::FuncType::Sin) {
208 return second == FunctionNode::FuncType::Cos;
209 }
210 return first == FunctionNode::FuncType::Cos && second == FunctionNode::FuncType::Sin;
211}

引用了 LMCAS::FunctionNode::Cos, LMCAS::FunctionNode::Sin , 以及 tf_is_sine_cosine_pair().

被这些函数引用 tf_is_sine_cosine_pair() , 以及 tf_pair_constraint().

函数调用图:
这是这个函数的调用关系图:

◆ tf_is_transcendental_type()

bool LMCAS::tf_is_transcendental_type ( FunctionNode::FuncType ft)

判断函数类型是否支持超越函数换元。

参数
[in]ft函数类型枚举
返回
属于 Sin/Cos/Exp/Ln/Tan 之一返回 true

在文件 transcendental_substitution.cpp 第 21 行定义.

引用了 LMCAS::FunctionNode::Cos, LMCAS::FunctionNode::Exp, LMCAS::FunctionNode::Ln, LMCAS::FunctionNode::Sin, LMCAS::FunctionNode::Tan , 以及 tf_is_transcendental_type().

被这些函数引用 tf_collect_transcendental(), tf_contains_transcendental() , 以及 tf_is_transcendental_type().

函数调用图:
这是这个函数的调用关系图:

◆ tf_is_trig_squared()

bool LMCAS::tf_is_trig_squared ( const std::shared_ptr< const SymbolicNode > & node,
FunctionNode::FuncType & func_type,
std::shared_ptr< const SymbolicNode > & argument )
static

匹配 sin^2(f) 或 cos^2(f),提取函数类型和参数。

注解
对应 PowerNode(FunctionNode(Sin/Cos, [f]), NumberNode(2))。
参数
[in]node待检测的 AST 节点
[out]func_type输出函数类型(Sin 或 Cos)
[out]argument输出函数参数节点
返回
匹配成功返回 true

在文件 transcendental_pythagorean.cpp 第 17 行定义.

20 {
21
22 auto pow = std::dynamic_pointer_cast<const PowerNode>(node);
23 if (!pow) {
24 return false;
25 }
26
27 auto exp_num = std::dynamic_pointer_cast<const NumberNode>(pow->exponent());
28 if (!exp_num) {
29 return false;
30 }
31
32 const bool is_two = std::holds_alternative<BigInt>(exp_num->value())
33 ? std::get<BigInt>(exp_num->value()) == BigInt(2)
34 : std::get<Rational>(exp_num->value()) == Rational(2);
35 if (!is_two) {
36 return false;
37 }
38
39 auto func = std::dynamic_pointer_cast<const FunctionNode>(pow->base());
40 if (!func || func->arguments().size() != 1) {
41 return false;
42 }
43
44 if (func->type() != FunctionNode::FuncType::Sin &&
45 func->type() != FunctionNode::FuncType::Cos) {
46 return false;
47 }
48
49 func_type = func->type();
50 argument = func->arguments()[0];
51 return true;
52}

引用了 LMCAS::FunctionNode::Cos, pow(), LMCAS::FunctionNode::Sin , 以及 tf_is_trig_squared().

被这些函数引用 tf_extract_coeff_trig_squared() , 以及 tf_is_trig_squared().

函数调用图:
这是这个函数的调用关系图:

◆ tf_is_variable_exponential()

bool LMCAS::tf_is_variable_exponential ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & var )
static

在文件 transcendental_rewrite.cpp 第 290 行定义.

291 {
292 auto function = std::dynamic_pointer_cast<const FunctionNode>(node);
293 if (!function) {
294 return false;
295 }
296 if (function->type() != FunctionNode::FuncType::Exp ||
297 function->arguments().size() != 1) {
298 return false;
299 }
300 return expression_depends_on_variable(function->arguments()[0], var);
301}

引用了 LMCAS::FunctionNode::Exp, expression_depends_on_variable(), function() , 以及 tf_is_variable_exponential().

被这些函数引用 tf_extract_exp_factor() , 以及 tf_is_variable_exponential().

函数调用图:
这是这个函数的调用关系图:

◆ tf_nodes_equal()

bool LMCAS::tf_nodes_equal ( const std::shared_ptr< const SymbolicNode > & a,
const std::shared_ptr< const SymbolicNode > & b )
static

判断两个 AST 节点是否结构相等。

参数
[in]a第一个节点
[in]b第二个节点
返回
结构相等返回 true

在文件 transcendental_substitution.cpp 第 107 行定义.

108 {
109 if (!a || !b) return a == b;
110 return a->equals(*b);
111}

引用了 a, b , 以及 tf_nodes_equal().

被这些函数引用 tf_is_negation_of(), tf_nodes_equal() , 以及 tf_pair_constraint().

函数调用图:
这是这个函数的调用关系图:

◆ tf_pair_constraint()

std::shared_ptr< SymbolicExpr > LMCAS::tf_pair_constraint ( const TransSubstitution & left,
const TransSubstitution & right,
const FunctionNode & first,
const FunctionNode & second )
static

在文件 transcendental_substitution.cpp 第 213 行定义.

215 {
216 const auto first_type = first.type();
217 const auto second_type = second.type();
218 const bool sin_cos = tf_is_sine_cosine_pair(first_type, second_type);
219 if (sin_cos && tf_nodes_equal(first.arguments()[0], second.arguments()[0])) {
220 auto ui = SymbolicExpr::variable(left.indeterminate);
221 auto uj = SymbolicExpr::variable(right.indeterminate);
222 auto two = SymbolicExpr::number(2);
223 auto sum = SymbolicExpr::add(SymbolicExpr::power(ui, two), SymbolicExpr::power(uj, two));
224 return SymbolicExpr::add(sum, SymbolicExpr::number(-1));
225 }
226 if (first_type != FunctionNode::FuncType::Exp ||
227 second_type != FunctionNode::FuncType::Exp) {
228 return nullptr;
229 }
230 if (!tf_is_negation_of(second.arguments()[0], first.arguments()[0]) &&
231 !tf_is_negation_of(first.arguments()[0], second.arguments()[0])) {
232 return nullptr;
233 }
234 auto ui = SymbolicExpr::variable(left.indeterminate);
235 auto uj = SymbolicExpr::variable(right.indeterminate);
236 return SymbolicExpr::add(SymbolicExpr::multiply(ui, uj), SymbolicExpr::number(-1));
237}
static bool tf_is_sine_cosine_pair(FunctionNode::FuncType first, FunctionNode::FuncType second)
std::string indeterminate
代数不定元名 (e.g., "u0")
static bool tf_is_negation_of(const std::shared_ptr< const SymbolicNode > &node, const std::shared_ptr< const SymbolicNode > &arg)
匹配 (-1)*arg 或 arg*(-1) 的二因子乘积结构。

引用了 LMCAS::FunctionNode::arguments(), LMCAS::FunctionNode::Exp, LMCAS::TransSubstitution::indeterminate, right, tf_is_negation_of(), tf_is_sine_cosine_pair(), tf_nodes_equal(), tf_pair_constraint() , 以及 LMCAS::FunctionNode::type().

被这些函数引用 tf_detect_constraints() , 以及 tf_pair_constraint().

函数调用图:
这是这个函数的调用关系图:

◆ tf_polynomial_variables()

std::vector< std::string > LMCAS::tf_polynomial_variables ( const std::shared_ptr< SymbolicExpr > & expression,
const std::vector< std::string > & indeterminates,
const std::string & original_var )
static

在文件 transcendental_polynomial.cpp 第 103 行定义.

105 {
106 std::vector<std::string> variables;
107 for (const auto& variable : indeterminates) {
109 variables.push_back(variable);
110 }
111 }
112 if (expression_depends_on_variable(detail::node(expression), original_var)) {
113 variables.push_back(original_var);
114 }
115 return variables;
116}

引用了 expression_depends_on_variable(), LMCAS::detail::node(), tf_polynomial_variables() , 以及 variable.

被这些函数引用 tf_build_polynomial_impl() , 以及 tf_polynomial_variables().

函数调用图:
这是这个函数的调用关系图:

◆ tf_power_degree()

int LMCAS::tf_power_degree ( const PowerNode & power,
const std::string & var )
static

在文件 transcendental_polynomial.cpp 第 17 行定义.

17 {
18 auto exp_num = std::dynamic_pointer_cast<const NumberNode>(power.exponent());
19 if (!exp_num) return -1;
20
21 BigInt exponent(-1);
22 if (std::holds_alternative<BigInt>(exp_num->value())) {
23 exponent = std::get<BigInt>(exp_num->value());
24 } else {
25 const auto& r = std::get<Rational>(exp_num->value());
26 if (r.is_integer()) exponent = r.to_bigint();
27 }
28
29 if (exponent.is_negative() || exponent > BigInt(std::numeric_limits<int>::max())) {
30 return -1;
31 }
32 const int e_val = static_cast<int>(exponent.try_to_int64().value());
33
34 int base_deg = tf_degree_in(power.base(), var);
35 if (base_deg < 0 ||
36 (e_val != 0 && base_deg > std::numeric_limits<int>::max() / e_val)) return -1;
37 return base_deg * e_val;
38}

引用了 LMCAS::PowerNode::base(), exponent, LMCAS::PowerNode::exponent(), r, tf_degree_in(), tf_power_degree() , 以及 value.

被这些函数引用 tf_degree_in() , 以及 tf_power_degree().

函数调用图:
这是这个函数的调用关系图:

◆ tf_remove_exp_factor()

std::shared_ptr< const SymbolicNode > LMCAS::tf_remove_exp_factor ( const std::shared_ptr< const SymbolicNode > & node,
const std::shared_ptr< const SymbolicNode > & exp_factor )
static

从乘积项中移除指定的指数函数因子,返回剩余部分.

若节点本身即为该 exp 因子,返回数值 1. 若节点为 MultiplyNode,移除匹配的 exp 操作数后重建乘积.

参数
[in]node原始乘积项节点
[in]exp_factor待移除的 exp 因子节点
返回
移除 exp 因子后的剩余节点

节点本身即为 exp 因子

乘积形式:移除匹配的操作数

在文件 transcendental_rewrite.cpp 第 351 行定义.

353 {
354
355 if (!node || !exp_factor) {
356 return node;
357 }
358
359 /// 节点本身即为 exp 因子
360 if (node->equals(*exp_factor)) {
361 return LMCAS::detail::make_node<NumberNode>(BigInt(1));
362 }
363
364 /// 乘积形式:移除匹配的操作数
365 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
366 std::vector<std::shared_ptr<const SymbolicNode>> remaining_ops;
367 bool removed = false;
368
369 for (const auto& op : mul->operands()) {
370 if (!removed && op->equals(*exp_factor)) {
371 removed = true;
372 continue;
373 }
374 remaining_ops.push_back(op);
375 }
376
377 if (!removed) {
378 return node;
379 }
380
381 if (remaining_ops.empty()) {
382 return LMCAS::detail::make_node<NumberNode>(BigInt(1));
383 }
384 if (remaining_ops.size() == 1) {
385 return remaining_ops[0];
386 }
387 return LMCAS::detail::make_node<MultiplyNode>(std::move(remaining_ops));
388 }
389
390 return node;
391}

引用了 LMCAS::SymbolicNode::equals(), LMCAS::detail::make_node(), mul(), op , 以及 tf_remove_exp_factor().

被这些函数引用 tf_detect_exponential_separation() , 以及 tf_remove_exp_factor().

函数调用图:
这是这个函数的调用关系图:

◆ tf_restore_factors()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::tf_restore_factors ( const std::vector< Polynomial< Rational > > & true_factors,
const TransSubstitutionResult & sub_result,
const std::shared_ptr< SymbolicExpr > & pyth_simplified,
ComputationContext & context )
static

— Phase 6: 逆换元 —

将多项式因子转回符号表达式

逆换元:将不定元替换回原始超越表达式

若逆换元后因子数 <= 1,分解无效

— Phase 6.2: 化简与常数提取 —

若化简后仅剩一个非常数因子,分解无效

在文件 transcendental_factor.cpp 第 14 行定义.

17 {
18 /// --- Phase 6: 逆换元 ---
19 std::vector<std::shared_ptr<SymbolicExpr>> symbolic_factors;
20 symbolic_factors.reserve(true_factors.size());
21
22 for (const auto& poly_factor : true_factors) {
23 /// 将多项式因子转回符号表达式
24 auto sym_factor = poly_to_symbolic(poly_factor);
25 if (!sym_factor) continue;
26
27 /// 逆换元:将不定元替换回原始超越表达式
28 auto back_sub = tf_back_substitute(sym_factor, sub_result.mappings, context);
29 if (back_sub) {
30 symbolic_factors.push_back(back_sub);
31 }
32 }
33
34 /// 若逆换元后因子数 <= 1,分解无效
35 if (symbolic_factors.size() <= 1) {
36 return {pyth_simplified};
37 }
38
39 /// --- Phase 6.2: 化简与常数提取 ---
40 auto final_factors = tf_simplify_factors_impl(symbolic_factors, context);
41
42 /// 若化简后仅剩一个非常数因子,分解无效
43 size_t non_const_count = 0;
44 for (const auto& f : final_factors) {
45 if (f && !f->is_number()) non_const_count++;
46 }
47 if (non_const_count <= 1 && final_factors.size() <= 1) {
48 return {pyth_simplified};
49 }
50
51 return final_factors;
52}
std::shared_ptr< SymbolicExpr > tf_back_substitute(const std::shared_ptr< SymbolicExpr > &expression, const std::vector< TransSubstitution > &mappings, ComputationContext &context)
将因子表达式中的不定元变量替换回原始超越子表达式.
std::vector< std::shared_ptr< SymbolicExpr > > tf_simplify_factors_impl(const std::vector< std::shared_ptr< SymbolicExpr > > &factors, ComputationContext &context)

引用了 context, LMCAS::TransSubstitutionResult::mappings, tf_back_substitute(), tf_restore_factors() , 以及 tf_simplify_factors_impl().

被这些函数引用 tf_factor_substitution() , 以及 tf_restore_factors().

函数调用图:
这是这个函数的调用关系图:

◆ tf_select_main_variable()

void LMCAS::tf_select_main_variable ( TfPolyBuildResult & result,
const std::shared_ptr< SymbolicExpr > & expanded,
const std::vector< std::string > & variables,
int & max_degree )
static

在文件 transcendental_polynomial.cpp 第 118 行定义.

120 {
121 for (const auto& variable : variables) {
122 const int degree = tf_degree_in(detail::node(expanded), variable);
123 if (degree > max_degree) {
124 max_degree = degree;
125 result.main_variable = variable;
126 }
127 }
128 for (const auto& variable : variables) {
129 if (variable != result.main_variable) result.param_variables.push_back(variable);
130 }
131}

引用了 LMCAS::TfPolyBuildResult::main_variable, LMCAS::detail::node(), LMCAS::TfPolyBuildResult::param_variables, tf_degree_in(), tf_select_main_variable() , 以及 variable.

被这些函数引用 tf_build_polynomial_impl() , 以及 tf_select_main_variable().

函数调用图:
这是这个函数的调用关系图:

◆ tf_simplify_factors()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::tf_simplify_factors ( std::vector< std::shared_ptr< SymbolicExpr > > & factors)

化简逆换元后的因子,合并数值因子及乘积的数值前导系数。 保留非常数部分,将非 1 的常数积置于结果首位。

参数
[in,out]factors就地化简的因子列表
返回
化简并提取常数后的因子列表

在文件 transcendental_rewrite.cpp 第 167 行定义.

168 {
170 return tf_simplify_factors_impl(factors, context);
171}

引用了 context, tf_simplify_factors() , 以及 tf_simplify_factors_impl().

被这些函数引用 tf_simplify_factors().

函数调用图:
这是这个函数的调用关系图:

◆ tf_simplify_factors_impl()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::tf_simplify_factors_impl ( const std::vector< std::shared_ptr< SymbolicExpr > > & factors,
ComputationContext & context )

在文件 transcendental_rewrite.cpp 第 173 行定义.

174 {
175 detail::RewriteBudget budget(context, context.limits().max_recursion_depth,
176 context.limits().max_ast_nodes, "factor_transcendental");
177 FactorSimplification simplification;
178 return simplification.run(factors, budget);
179}

引用了 context , 以及 tf_simplify_factors_impl().

被这些函数引用 tf_restore_factors(), tf_simplify_factors() , 以及 tf_simplify_factors_impl().

函数调用图:
这是这个函数的调用关系图:

◆ tf_simplify_pythagorean()

std::shared_ptr< SymbolicExpr > LMCAS::tf_simplify_pythagorean ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var )

在因式分解前用 sin^2(f) + cos^2(f) = 1 化简表达式。

参数
[in]expr待化简的符号表达式
[in]var目标变量名
返回
化简后的表达式;若无可化简模式则返回原表达式

在文件 transcendental_pythagorean.cpp 第 238 行定义.

240 {
241
242 if (!expr || !LMCAS::detail::node(expr)) {
243 return expr;
244 }
245
246 auto simplified_root = tf_simplify_pythagorean_node(LMCAS::detail::node(expr), var);
247
248 if (!simplified_root) {
249 return expr;
250 }
251 if (simplified_root->equals(*LMCAS::detail::node(expr))) {
252 return expr;
253 }
254
255 return LMCAS::detail::make_expression_ptr(simplified_root);
256}

引用了 LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), tf_simplify_pythagorean() , 以及 tf_simplify_pythagorean_node().

被这些函数引用 factor_transcendental() , 以及 tf_simplify_pythagorean().

函数调用图:
这是这个函数的调用关系图:

◆ tf_simplify_pythagorean_node()

std::shared_ptr< const SymbolicNode > LMCAS::tf_simplify_pythagorean_node ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & var )
static

递归化简 a*sin^2(f) + a*cos^2(f) 为 a,系数为 1 时结果为 1。

注解
在加法节点中配对,要求参数 f 与系数 a 分别结构相等。
参数
[in]node当前 AST 节点
[in]var目标变量名(用于限定化简范围)
返回
化简后的节点;若无可化简的模式则返回原节点

在文件 transcendental_pythagorean.cpp 第 191 行定义.

193 {
194
195 if (!node) {
196 return node;
197 }
198
199 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
200 return simplify_pythagorean_sum(*add, var);
201 }
202
203 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
204 std::vector<std::shared_ptr<const SymbolicNode>> new_ops;
205 new_ops.reserve(mul->operands().size());
206 for (const auto& op : mul->operands()) {
207 new_ops.push_back(tf_simplify_pythagorean_node(op, var));
208 }
209 return LMCAS::detail::make_node<MultiplyNode>(std::move(new_ops));
210 }
211
212 if (auto pow = std::dynamic_pointer_cast<const PowerNode>(node)) {
213 auto new_base = tf_simplify_pythagorean_node(pow->base(), var);
214 auto new_exp = tf_simplify_pythagorean_node(pow->exponent(), var);
215 return LMCAS::detail::make_node<PowerNode>(std::move(new_base), std::move(new_exp));
216 }
217
218 if (auto func = std::dynamic_pointer_cast<const FunctionNode>(node)) {
219 std::vector<std::shared_ptr<const SymbolicNode>> new_args;
220 new_args.reserve(func->arguments().size());
221 for (const auto& arg : func->arguments()) {
222 new_args.push_back(tf_simplify_pythagorean_node(arg, var));
223 }
224 return LMCAS::detail::make_node<FunctionNode>(func->type(), std::move(new_args));
225 }
226
227 return node;
228}
static std::shared_ptr< const SymbolicNode > simplify_pythagorean_sum(const AddNode &sum, const std::string &var)

引用了 add(), LMCAS::detail::make_node(), mul(), op, pow(), simplify_pythagorean_sum() , 以及 tf_simplify_pythagorean_node().

被这些函数引用 simplify_pythagorean_sum(), tf_simplify_pythagorean() , 以及 tf_simplify_pythagorean_node().

函数调用图:
这是这个函数的调用关系图:

◆ tf_square_free()

TfSquareFreeResult LMCAS::tf_square_free ( const Polynomial< Rational > & poly)

计算多项式的无平方因子部分,用于 Berlekamp 模分解预处理。

令 f' = derivative(f)、g = gcd(f,f');g 为常数时 f 已无重因子, 否则取 f/g,并将结果首一化。

参数
[in]poly输入的有理系数多项式
返回
无平方因子预处理结果

在文件 rational_square_free.cpp 第 67 行定义.

67 {
68 TfSquareFreeResult result;
69 if (poly.degree() <= 0) {
70 result.square_free = poly;
71 result.repeated_factor = Polynomial<Rational>(Rational(1), poly.variable_name);
72 result.had_repeated_factors = false;
73 return result;
74 }
75 if (poly.degree() == 1) {
76 result.square_free = poly;
77 result.repeated_factor = Polynomial<Rational>(Rational(1), poly.variable_name);
78 result.had_repeated_factors = false;
79 return result;
80 }
81
83
85
86 if (g.degree() <= 0) {
87 result.square_free = poly.make_monic();
89 result.had_repeated_factors = false;
90 return result;
91 }
92
93 auto [quotient, remainder] = poly.div_mod(g);
94 result.square_free = quotient.make_monic();
95 result.repeated_factor = g.make_monic();
96 result.had_repeated_factors = true;
97 return result;
98}
执行一步二次 Hensel 提升:mod m -> mod m^2.
Polynomial< Rational > square_free
无平方因子部分。
Polynomial< Rational > repeated_factor
重复因子 gcd(f, f')。
bool had_repeated_factors
是否存在重复因子。

引用了 LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Polynomial< CoeffType >::differentiate(), LMCAS::Polynomial< CoeffType >::div_mod(), LMCAS::Polynomial< CoeffType >::gcd(), LMCAS::TfSquareFreeResult::had_repeated_factors, LMCAS::Polynomial< CoeffType >::make_monic(), LMCAS::TfSquareFreeResult::repeated_factor, LMCAS::TfSquareFreeResult::square_free, tf_square_free() , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 LMCAS::anonymous_namespace{univariate_factor_bridge.cpp}::bridge_factor() , 以及 tf_square_free().

函数调用图:
这是这个函数的调用关系图:

◆ tf_substitute_expr()

std::shared_ptr< const SymbolicNode > LMCAS::tf_substitute_expr ( const std::shared_ptr< const SymbolicNode > & node,
const std::vector< TransSubstitution > & mappings )
static

按映射顺序将超越子表达式替换为不定元,递归重建未匹配节点。

外层映射优先:sin(exp(x)) 整体替换为 u0,exp(x) 保留在 u0 的定义中。

参数
[in]node当前 AST 节点
[in]mappings换元映射列表(按分配顺序)
返回
替换后的新节点

在文件 transcendental_substitution.cpp 第 157 行定义.

159 {
160
161 if (!node) return nullptr;
162
163 for (const auto& m : mappings) {
164 if (m.trans_expr && LMCAS::detail::node(m.trans_expr) &&
165 node->equals(*LMCAS::detail::node(m.trans_expr))) {
166 return LMCAS::detail::make_node<VariableNode>(m.indeterminate);
167 }
168 }
169
170 if (auto func = std::dynamic_pointer_cast<const FunctionNode>(node)) {
171 std::vector<std::shared_ptr<const SymbolicNode>> new_args;
172 new_args.reserve(func->arguments().size());
173 for (const auto& arg : func->arguments()) {
174 new_args.push_back(tf_substitute_expr(arg, mappings));
175 }
176 return LMCAS::detail::make_node<FunctionNode>(func->type(), std::move(new_args));
177 }
178
179 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
180 std::vector<std::shared_ptr<const SymbolicNode>> new_ops;
181 new_ops.reserve(add->operands().size());
182 for (const auto& op : add->operands()) {
183 new_ops.push_back(tf_substitute_expr(op, mappings));
184 }
185 return LMCAS::detail::make_node<AddNode>(std::move(new_ops));
186 }
187
188 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
189 std::vector<std::shared_ptr<const SymbolicNode>> new_ops;
190 new_ops.reserve(mul->operands().size());
191 for (const auto& op : mul->operands()) {
192 new_ops.push_back(tf_substitute_expr(op, mappings));
193 }
194 return LMCAS::detail::make_node<MultiplyNode>(std::move(new_ops));
195 }
196
197 if (auto pow = std::dynamic_pointer_cast<const PowerNode>(node)) {
198 auto new_base = tf_substitute_expr(pow->base(), mappings);
199 auto new_exp = tf_substitute_expr(pow->exponent(), mappings);
200 return LMCAS::detail::make_node<PowerNode>(std::move(new_base), std::move(new_exp));
201 }
202
203 return node;
204}

引用了 add(), LMCAS::SymbolicNode::equals(), LMCAS::detail::make_node(), mul(), LMCAS::detail::node(), op, pow() , 以及 tf_substitute_expr().

被这些函数引用 detect_trans_substitutions() , 以及 tf_substitute_expr().

函数调用图:
这是这个函数的调用关系图:

◆ tf_validate_polynomial()

bool LMCAS::tf_validate_polynomial ( const std::shared_ptr< SymbolicExpr > & poly_expr,
const std::vector< std::string > & all_variables )
static

判断换元式是否为候选变量的多项式。 各候选变量的次数须可确定为非负整数,且超越函数不得依赖不定元或原始变量。

参数
[in]poly_expr换元后的表达式。
[in]all_variables所有候选变量名,包括不定元和原始变量。
返回
有效多项式返回 true。

在文件 transcendental_polynomial.cpp 第 88 行定义.

90 {
91
92 if (!poly_expr || !LMCAS::detail::node(poly_expr)) return false;
93
94 for (const auto& var : all_variables) {
96 int deg = tf_degree_in(LMCAS::detail::node(poly_expr), var);
97 if (deg < 0) return false;
98 }
99 }
100 return true;
101}

引用了 expression_depends_on_variable(), LMCAS::detail::node(), tf_degree_in() , 以及 tf_validate_polynomial().

被这些函数引用 tf_build_polynomial_impl() , 以及 tf_validate_polynomial().

函数调用图:
这是这个函数的调用关系图:

◆ total_degree()

int LMCAS::total_degree ( const Monomial & m)
inline

计算单项式的全次数

参数
m单项式
返回
各分量指数之和

在文件 monomial_order.hpp 第 30 行定义.

30 {
31 return std::accumulate(m.begin(), m.end(), 0);
32}

引用了 total_degree().

被这些函数引用 LMCAS::MonomialOrder::compare_deglex(), LMCAS::MonomialOrder::compare_grevlex(), LMCAS::detail::multipoly_term_factors(), LMCAS::fglm_detail::MonomialEnumerator::next() , 以及 total_degree().

函数调用图:
这是这个函数的调用关系图:

◆ total_differential()

std::vector< std::pair< std::shared_ptr< SymbolicExpr >, std::string > > LMCAS::total_differential ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars )

在文件 calculus_utils.cpp 第 182 行定义.

184{
186 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
187 (context).limits().max_ast_nodes, "transform");
188 std::vector<std::pair<std::shared_ptr<SymbolicExpr>, std::string>> result;
189 if (!f || !LMCAS::detail::node(f)) {
190 return result;
191 }
192
193 result.reserve(vars.size());
194 for (const auto& v : vars) {
195 auto partial = detail::make_expression_ptr(detail::differentiate_node(detail::node(f), v, transform_budget));
196 result.emplace_back(partial, v);
197 }
198 return result;
199}

引用了 context, LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), total_differential(), v , 以及 vars.

被这些函数引用 total_differential().

函数调用图:
这是这个函数的调用关系图:

◆ truncate_mod_var()

MultiPoly LMCAS::truncate_mod_var ( const MultiPoly & poly,
const std::string & var,
int degree_bound )
static

将 MultiPoly 截断为关于指定变量次数 < degree_bound 的部分

保留所有项中指定变量指数严格小于 degree_bound 的项.

参数
[in]poly输入多项式
[in]var变量名
[in]degree_bound次数上界(保留 < degree_bound 的项)
返回
截断后的多项式

若变量不在列表中,多项式不含该变量,无需截断

在文件 multivariate_hensel.cpp 第 354 行定义.

356{
357 if (poly.is_zero()) { return poly; }
358
359 const auto& vars = poly.variables();
360 int var_idx = -1;
361 for (size_t i = 0; i < vars.size(); ++i) {
362 if (vars[i] == var) { var_idx = static_cast<int>(i); break; }
363 }
364 /// 若变量不在列表中,多项式不含该变量,无需截断
365 if (var_idx < 0) { return poly; }
366
367 std::vector<MultiPoly::Term> result_terms;
368 for (const auto& term : poly.terms()) {
369 const Monomial& mono = term.first;
370 int exp = (static_cast<size_t>(var_idx) < mono.size()) ? mono[var_idx] : 0;
371 if (exp < degree_bound) {
372 result_terms.push_back(term);
373 }
374 }
375
376 if (result_terms.empty()) { return MultiPoly(Rational(0), vars); }
377 return MultiPoly(std::move(result_terms), vars);
378}

引用了 exp(), truncate_mod_var() , 以及 vars.

被这些函数引用 apply_hensel_lift_steps(), multivariate_diophantine(), solve_diophantine_pair(), truncate_mod_var() , 以及 truncated_factor_product().

函数调用图:
这是这个函数的调用关系图:

◆ truncated_factor_product()

MultiPoly LMCAS::truncated_factor_product ( const std::vector< MultiPoly > & factors,
const std::string & variable,
int degree_bound )
static

在文件 multivariate_hensel.cpp 第 170 行定义.

171 {
172 MultiPoly product = factors[0];
173 for (size_t i = 1; i < factors.size(); ++i) {
174 product = product * factors[i];
175 product = truncate_mod_var(product, variable, degree_bound);
176 }
177 return product;
178}

引用了 truncate_mod_var(), truncated_factor_product() , 以及 variable.

被这些函数引用 apply_hensel_lift_steps() , 以及 truncated_factor_product().

函数调用图:
这是这个函数的调用关系图:

◆ try_eval_double()

double LMCAS::try_eval_double ( const std::shared_ptr< SymbolicExpr > & expr)

尝试将表达式求值为 double。

返回
若表达式为纯数值返回其值,否则返回 NaN。

在文件 ode_support.cpp 第 24 行定义.

24 {
25 if (!expr || !LMCAS::detail::node(expr)) {
26 return std::numeric_limits<double>::quiet_NaN();
27 }
28 if (expr->is_number()) {
29 auto node = std::dynamic_pointer_cast<const NumberNode>(LMCAS::detail::node(expr));
30 if (!node) {
31 return std::numeric_limits<double>::quiet_NaN();
32 }
33 if (std::holds_alternative<BigInt>(node->value())) {
34 return std::get<BigInt>(node->value()).to_double();
35 }
36 return std::get<Rational>(node->value()).to_double();
37 }
38 return std::numeric_limits<double>::quiet_NaN();
39}

引用了 LMCAS::detail::node() , 以及 try_eval_double().

被这些函数引用 classify_higher_order_ode(), classify_singular_point_checked(), frobenius_coefficient_limit(), is_euler_equation(), ordinary_taylor_coefficients(), separable_reciprocal(), singular_frobenius_solution(), singular_taylor_coefficients(), try_eval_double() , 以及 validate_frobenius_regular_singular_domain().

函数调用图:
这是这个函数的调用关系图:

◆ try_get_integer_value()

bool LMCAS::try_get_integer_value ( const std::shared_ptr< const NumberNode > & node,
BigInt & value )

在文件 normalization_utils.cpp 第 39 行定义.

40 {
41 if (!node) {
42 return false;
43 }
44 if (const auto* integer = std::get_if<BigInt>(&node->value())) {
45 value = *integer;
46 return true;
47 }
48 const auto& rational = std::get<Rational>(node->value());
49 if (rational.get_denominator() != BigInt(1)) {
50 return false;
51 }
52 value = rational.get_numerator();
53 return true;
54}

引用了 integer, rational(), try_get_integer_value() , 以及 value.

被这些函数引用 LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_power(), LMCAS::anonymous_namespace{normalization_products.cpp}::collectable_power_exponent(), LMCAS::anonymous_namespace{mixed_transcendental_classification.cpp}::degree_in_var(), get_node_degree_helper(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::integer_power(), LMCAS::detail::series_support::integer_value_from_node(), LMCAS::anonymous_namespace{integration_linearity.cpp}::integration_exponential_argument(), LMCAS::NormalizationVisitor::is_positive_integer_number(), normalization_numeric_power(), LMCAS::NormalizationVisitor::normalize_nested_imaginary_power(), LMCAS::NormalizationVisitor::normalize_product_power(), LMCAS::anonymous_namespace{normalization_numeric_functions.cpp}::number_equals_integer(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::power(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::power_bounds(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::power_candidate(), LMCAS::anonymous_namespace{limit_result.cpp}::power_continuous_structure(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::product_exp_multiplier(), LMCAS::anonymous_namespace{symbolic_ode.cpp}::reciprocal_on_regular_region(), LMCAS::NormalizationVisitor::simplify_assumed_square_root(), LMCAS::InferenceEngine::Impl::small_positive_exponent(), solve_product_factor(), symbolic_power_to_poly(), symbolic_product(), symbolic_sum(), symbolic_to_poly_recursive(), te_inv_power(), te_is_power_of_var(), try_get_integer_value(), LMCAS::ExpandVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit() , 以及 zt_polynomial_pattern().

函数调用图:
这是这个函数的调用关系图:

◆ univariate_gcd()

MultiPoly LMCAS::univariate_gcd ( const MultiPoly & a,
const MultiPoly & b,
const std::vector< std::string > & vars )
static

在文件 multivariate_factor.cpp 第 230 行定义.

231 {
232 std::string a_var = active_univariate_variable(a);
233 std::string b_var = active_univariate_variable(b);
234 if (a_var.empty() && b_var.empty()) {
235 return MultiPoly(rational_gcd(a.numeric_content(), b.numeric_content()), vars);
236 }
237 if (a_var.empty() || b_var.empty()) {
238 return MultiPoly(rational_gcd(a.numeric_content(), b.numeric_content()), vars);
239 }
240 if (a_var == b_var) {
241 Rational nc_gcd = rational_gcd(a.numeric_content(), b.numeric_content());
242 Polynomial<Rational> pa = a.to_univariate();
243 Polynomial<Rational> pb = b.to_univariate();
245 if (g.is_zero()) { return MultiPoly(nc_gcd, vars); }
246 MultiPoly result = MultiPoly::from_univariate(g, a_var);
247 result = result * nc_gcd;
248 if (vars.size() > 1) {
249 result = embed_univariate_gcd(result, a_var, vars);
250 }
251 if (!result.terms().empty() && result.terms()[0].second < Rational(0)) { result = result * Rational(-1); }
252 return result;
253 }
254 return MultiPoly(rational_gcd(a.numeric_content(), b.numeric_content()), vars);
255}
static std::string active_univariate_variable(const MultiPoly &poly)
static MultiPoly embed_univariate_gcd(const MultiPoly &result, const std::string &a_var, const std::vector< std::string > &vars)

引用了 a, active_univariate_variable(), b, embed_univariate_gcd(), LMCAS::Polynomial< CoeffType >::gcd(), LMCAS::Polynomial< CoeffType >::is_zero(), rational_gcd(), univariate_gcd() , 以及 vars.

被这些函数引用 multivariate_gcd() , 以及 univariate_gcd().

函数调用图:
这是这个函数的调用关系图:

◆ unsupported_euler_forcing()

bool LMCAS::unsupported_euler_forcing ( const std::shared_ptr< SymbolicExpr > & forcing,
const std::vector< double > & coefficients )
static

在文件 ode_linear.cpp 第 363 行定义.

365 {
366 return !forcing->is_number() || coefficients.back() == 0.0;
367}

引用了 unsupported_euler_forcing().

被这些函数引用 solve_euler_ode_checked() , 以及 unsupported_euler_forcing().

函数调用图:
这是这个函数的调用关系图:

◆ valid_classifier_variables()

bool LMCAS::valid_classifier_variables ( const std::string & x,
const std::string & y )
static

在文件 ode_classification.cpp 第 26 行定义.

29{
30 return !x.empty() && !y.empty() && x != y;
31}

引用了 valid_classifier_variables().

被这些函数引用 is_bernoulli_ode(), is_exact_ode(), is_homogeneous_ode(), is_linear_first_order(), is_separable() , 以及 valid_classifier_variables().

函数调用图:
这是这个函数的调用关系图:

◆ valid_newton_bracket()

bool LMCAS::valid_newton_bracket ( lmmc_real_t initial,
lmmc_real_t lower,
lmmc_real_t upper )
static

在文件 newton_raphson.cpp 第 360 行定义.

361 {
362 if (!std::isfinite(initial) || !std::isfinite(lower) ||
363 !std::isfinite(upper)) {
364 return false;
365 }
366 return lower <= upper && initial >= lower && initial <= upper;
367}

引用了 lower, upper , 以及 valid_newton_bracket().

被这些函数引用 newton_raphson_checked() , 以及 valid_newton_bracket().

函数调用图:
这是这个函数的调用关系图:

◆ validate_frobenius_regular_singular_domain()

Result< void > LMCAS::validate_frobenius_regular_singular_domain ( const std::shared_ptr< SymbolicExpr > & p,
const std::shared_ptr< SymbolicExpr > & q,
const std::shared_ptr< SymbolicExpr > & x0,
const std::string & x,
ComputationContext & context,
const std::string & operation )
static

在文件 ode_frobenius.cpp 第 474 行定义.

481 {
482 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
483 (context).limits().max_ast_nodes, "transform");
484 auto x_var = SymbolicExpr::variable(x);
485 auto x_minus_x0 = SymbolicExpr::add(x_var,
486 SymbolicExpr::multiply(SymbolicExpr::number(-1), x0));
487 auto xp_expr = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(x_minus_x0, p)), transform_budget));
488 auto x2q_expr = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(
489 SymbolicExpr::power(x_minus_x0, SymbolicExpr::number(2)), q)), transform_budget));
490
491 auto P0_result = limit_expression_checked(
492 xp_expr, x, x0, LimitDirection::Both, context);
493 if (!P0_result) {
494 return Result<void>::failure(P0_result.error());
495 }
496 auto Q0_result = limit_expression_checked(
497 x2q_expr, x, x0, LimitDirection::Both, context);
498 if (!Q0_result) {
499 return Result<void>::failure(Q0_result.error());
500 }
501 const auto& P0_expr = P0_result.value();
502 const auto& Q0_expr = Q0_result.value();
503 double P0 = P0_expr
504 ? try_eval_double(P0_expr)
505 : std::numeric_limits<double>::quiet_NaN();
506 double Q0 = Q0_expr
507 ? try_eval_double(Q0_expr)
508 : std::numeric_limits<double>::quiet_NaN();
509 if (!std::isfinite(P0) || !std::isfinite(Q0)) {
512 "Frobenius regular-singular coefficients are outside the checked numeric support domain",
513 operation);
514 }
515
516 double discriminant = (P0 - 1.0) * (P0 - 1.0) - 4.0 * Q0;
517 int zero_discriminant;
518 lmmc_double_nearly_equal_tol(discriminant, 0.0, 1e-12, 1e-12,
519 &zero_discriminant);
520 if (discriminant < 0.0 && !zero_discriminant) {
523 "Frobenius checked API currently supports real indicial roots only",
524 operation);
525 }
526
527 return Result<void>::success();
528} catch (const CasError& error) {
529 return Result<void>::failure(error);
530} catch (const std::bad_alloc&) {
531 return Result<void>::failure(CasErrc::ResourceLimit, "allocation failed", operation);
532} catch (const std::length_error& error) {
533 return Result<void>::failure(CasErrc::ResourceLimit, error.what(), operation);
534} catch (const std::exception& error) {
535 return Result<void>::failure(CasErrc::InternalInvariant, error.what(), operation);
536}

引用了 Both, context, e(), LMCAS::Result< T >::failure(), Inconclusive, limit_expression_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::Result< T >::success(), try_eval_double() , 以及 validate_frobenius_regular_singular_domain().

被这些函数引用 solve_frobenius_checked() , 以及 validate_frobenius_regular_singular_domain().

函数调用图:
这是这个函数的调用关系图:

◆ validate_integration_steps()

bool LMCAS::validate_integration_steps ( const std::vector< IntegrationStep > & steps)
static

在文件 multiple_integral.cpp 第 7 行定义.

7 {
8 if (steps.empty()) return false;
9
10 for (size_t i = 0; i < steps.size(); ++i) {
11 const auto& s = steps[i];
12 if (s.variable.empty()) return false;
13
14 // Bounds must be either both null (indefinite) or both set (definite).
15 const bool has_lower = static_cast<bool>(s.lower);
16 const bool has_upper = static_cast<bool>(s.upper);
17 if (has_lower != has_upper) return false;
18
19 // Reject duplicate variables.
20 for (size_t j = 0; j < i; ++j) {
21 if (steps[j].variable == s.variable) return false;
22 }
23 }
24 return true;
25}

引用了 steps, validate_integration_steps() , 以及 variable.

被这些函数引用 integrate_multiple_checked() , 以及 validate_integration_steps().

函数调用图:
这是这个函数的调用关系图:

◆ validate_laurent_orders()

Result< void > LMCAS::validate_laurent_orders ( int order_neg,
int order_pos,
const std::string & operation )

在文件 series_expansions.cpp 第 73 行定义.

76{
77 if (order_neg < 0 || order_pos < 0 || order_neg > 64 || order_pos > 64) {
79 "Laurent truncation orders must be between 0 and 64",
80 operation);
81 }
82 return Result<void>::success();
83}

引用了 LMCAS::Result< T >::failure(), InvalidArgument, LMCAS::Result< T >::success() , 以及 validate_laurent_orders().

被这些函数引用 laurent_series_full_checked() , 以及 validate_laurent_orders().

函数调用图:
这是这个函数的调用关系图:

◆ validate_laurent_result()

Result< void > LMCAS::validate_laurent_result ( const LaurentResult & result,
const std::optional< int > & supported_power,
const std::shared_ptr< SymbolicExpr > & center,
const std::string & operation )
static

在文件 series_expansions.cpp 第 383 行定义.

385 {
386 if (!result.series || !LMCAS::detail::node(result.series)) {
389 "Laurent series could not be constructed in the supported domain",
390 operation);
391 }
392 if (!result.residue || !LMCAS::detail::node(result.residue)) {
395 "Laurent series produced a null residue expression",
396 operation);
397 }
398 if (supported_power && center->is_zero()) {
399 BigInt expected_pole_order =
400 *supported_power < 0 ? -BigInt(*supported_power) : BigInt(0);
401 if (BigInt(result.pole_order) != expected_pole_order) {
402 return Result<void>::failure(
403 CasErrc::Inconclusive,
404 "Laurent pole order could not be verified",
405 operation);
406 }
407 }
408 return Result<void>::success();
409}

引用了 LMCAS::Result< T >::failure(), Inconclusive, InternalInvariant, LMCAS::detail::node(), LMCAS::LaurentResult::pole_order, LMCAS::LaurentResult::residue, LMCAS::LaurentResult::series, LMCAS::Result< T >::success() , 以及 validate_laurent_result().

被这些函数引用 laurent_series_full_checked() , 以及 validate_laurent_result().

函数调用图:
这是这个函数的调用关系图:

◆ validate_numeric_ode_coefficients()

Result< void > LMCAS::validate_numeric_ode_coefficients ( const std::vector< double > & coefficients,
std::size_t minimum_size,
std::size_t maximum_size,
const std::string & operation )

在文件 ode_support.cpp 第 142 行定义.

147{
148 if (coeffs.size() < min_size || coeffs.size() > max_size) {
150 "ODE coefficient list has unsupported size",
151 operation);
152 }
153 if (!std::isfinite(coeffs.front()) || coeffs.front() == 0.0) {
155 "ODE leading coefficient must be finite and nonzero",
156 operation);
157 }
158 for (double coeff : coeffs) {
159 if (!std::isfinite(coeff)) {
161 "ODE coefficients must be finite",
162 operation);
163 }
164 }
165 return Result<void>::success();
166}

引用了 LMCAS::Result< T >::failure(), InvalidArgument, LMCAS::Result< T >::success() , 以及 validate_numeric_ode_coefficients().

被这些函数引用 solve_euler_ode_checked(), solve_higher_order_ode_checked() , 以及 validate_numeric_ode_coefficients().

函数调用图:
这是这个函数的调用关系图:

◆ validate_ode_expr_var_pair()

Result< void > LMCAS::validate_ode_expr_var_pair ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & x,
const std::string & y,
ComputationContext & context,
const std::string & operation )

在文件 ode_support.cpp 第 41 行定义.

47{
48 auto step = context.consume_steps(1, operation);
49 if (!step) {
50 return step;
51 }
52 if (!expr || !LMCAS::detail::node(expr)) {
54 "ODE expression cannot be null",
55 operation);
56 }
57 if (x.empty() || y.empty()) {
59 "ODE variable names cannot be empty",
60 operation);
61 }
62 if (x == y) {
64 "ODE independent and dependent variables must be distinct",
65 operation);
66 }
67 return Result<void>::success();
68}

引用了 context, LMCAS::Result< T >::failure(), InvalidArgument, LMCAS::detail::node(), LMCAS::Result< T >::success() , 以及 validate_ode_expr_var_pair().

被这些函数引用 solve_homogeneous_ode_checked() , 以及 validate_ode_expr_var_pair().

函数调用图:
这是这个函数的调用关系图:

◆ validate_ode_pair_var_pair()

Result< void > LMCAS::validate_ode_pair_var_pair ( const std::shared_ptr< SymbolicExpr > & first,
const std::shared_ptr< SymbolicExpr > & second,
const std::string & x,
const std::string & y,
ComputationContext & context,
const std::string & operation )

在文件 ode_support.cpp 第 70 行定义.

77{
78 auto step = context.consume_steps(1, operation);
79 if (!step) {
80 return step;
81 }
82 if (!first || !LMCAS::detail::node(first) || !second || !LMCAS::detail::node(second)) {
84 "ODE expressions cannot be null",
85 operation);
86 }
87 if (x.empty() || y.empty()) {
89 "ODE variable names cannot be empty",
90 operation);
91 }
92 if (x == y) {
94 "ODE independent and dependent variables must be distinct",
95 operation);
96 }
97 return Result<void>::success();
98}

引用了 context, LMCAS::Result< T >::failure(), InvalidArgument, LMCAS::detail::node(), LMCAS::Result< T >::success() , 以及 validate_ode_pair_var_pair().

被这些函数引用 solve_bernoulli_ode_checked(), solve_exact_ode_checked() , 以及 validate_ode_pair_var_pair().

函数调用图:
这是这个函数的调用关系图:

◆ validate_ode_three_expr_one_var()

Result< void > LMCAS::validate_ode_three_expr_one_var ( const std::shared_ptr< SymbolicExpr > & first,
const std::shared_ptr< SymbolicExpr > & second,
const std::shared_ptr< SymbolicExpr > & third,
const std::string & x,
ComputationContext & context,
const std::string & operation )

在文件 ode_support.cpp 第 168 行定义.

175{
176 auto step = context.consume_steps(1, operation);
177 if (!step) {
178 return step;
179 }
180 if (!first || !LMCAS::detail::node(first) || !second || !LMCAS::detail::node(second) ||
181 !third || !LMCAS::detail::node(third)) {
183 "ODE expressions cannot be null",
184 operation);
185 }
186 if (x.empty()) {
188 "ODE variable name cannot be empty",
189 operation);
190 }
191 return Result<void>::success();
192}

引用了 context, LMCAS::Result< T >::failure(), InvalidArgument, LMCAS::detail::node(), LMCAS::Result< T >::success() , 以及 validate_ode_three_expr_one_var().

被这些函数引用 solve_variation_of_parameters_checked() , 以及 validate_ode_three_expr_one_var().

函数调用图:
这是这个函数的调用关系图:

◆ validate_ode_two_expr_point()

Result< void > LMCAS::validate_ode_two_expr_point ( const std::shared_ptr< SymbolicExpr > & p,
const std::shared_ptr< SymbolicExpr > & q,
const std::shared_ptr< SymbolicExpr > & x0,
const std::string & x,
ComputationContext & context,
const std::string & operation )

在文件 ode_support.cpp 第 194 行定义.

201{
202 auto step = context.consume_steps(1, operation);
203 if (!step) {
204 return step;
205 }
206 if (!p || !LMCAS::detail::node(p) || !q || !LMCAS::detail::node(q) || !x0 || !LMCAS::detail::node(x0)) {
208 "Frobenius inputs cannot be null",
209 operation);
210 }
211 if (x.empty()) {
213 "ODE variable name cannot be empty",
214 operation);
215 }
216 return Result<void>::success();
217}

引用了 context, LMCAS::Result< T >::failure(), InvalidArgument, LMCAS::detail::node(), LMCAS::Result< T >::success() , 以及 validate_ode_two_expr_point().

被这些函数引用 classify_singular_point_checked(), solve_frobenius_checked() , 以及 validate_ode_two_expr_point().

函数调用图:
这是这个函数的调用关系图:

◆ validate_ode_variables()

Result< void > LMCAS::validate_ode_variables ( const std::string & x,
const std::string & y,
ComputationContext & context,
const std::string & operation )

在文件 ode_support.cpp 第 119 行定义.

124{
125 auto step = context.consume_steps(1, operation);
126 if (!step) {
127 return step;
128 }
129 if (x.empty() || y.empty()) {
131 "ODE variable names cannot be empty",
132 operation);
133 }
134 if (x == y) {
136 "ODE independent and dependent variables must be distinct",
137 operation);
138 }
139 return Result<void>::success();
140}

引用了 context, LMCAS::Result< T >::failure(), InvalidArgument, LMCAS::Result< T >::success() , 以及 validate_ode_variables().

被这些函数引用 solve_euler_ode_checked(), solve_higher_order_ode_checked() , 以及 validate_ode_variables().

函数调用图:
这是这个函数的调用关系图:

◆ validate_power_series_coefficients() [1/2]

Result< void > LMCAS::detail::series_support::validate_power_series_coefficients ( const std::vector< std::shared_ptr< SymbolicExpr > > & coefficients,
const std::string & operation,
const std::string & name )

在文件 series_engine.cpp 第 145 行定义.

149{
150 for (size_t i = 0; i < coeffs.size(); ++i) {
151 if (!coeffs[i] || !LMCAS::detail::node(coeffs[i])) {
154 name + " contains a null coefficient at index " + std::to_string(i),
155 operation);
156 }
157 }
158 return Result<void>::success();
159}

被这些函数引用 convergence_radius_checked(), power_series_compose_checked() , 以及 power_series_multiply_checked().

这是这个函数的调用关系图:

◆ validate_power_series_coefficients() [2/2]

Result< void > LMCAS::detail::series_support::validate_power_series_coefficients ( const std::vector< std::shared_ptr< SymbolicExpr > > & coefficients,
const std::string & operation,
const std::string & name )

在文件 series_engine.cpp 第 145 行定义.

149{
150 for (size_t i = 0; i < coeffs.size(); ++i) {
151 if (!coeffs[i] || !LMCAS::detail::node(coeffs[i])) {
154 name + " contains a null coefficient at index " + std::to_string(i),
155 operation);
156 }
157 }
158 return Result<void>::success();
159}

◆ validate_property_interval()

PropertyStoreResult LMCAS::validate_property_interval ( const Interval & interval,
ComputationContext & context,
const std::string & operation )

在文件 property_intervals.cpp 第 9 行定义.

11 {
12 auto normalized = normalize_intervals_checked({interval}, context);
13 if (!normalized) {
15 normalized.error().code, normalized.error().message, operation);
16 }
17 if (normalized.value().empty()) {
20 "property declaration interval must not be empty",
21 operation);
22 }
24}
static Result success()

引用了 context, LMCAS::Result< void >::failure(), interval(), InvalidArgument, normalize_intervals_checked(), LMCAS::Result< void >::success() , 以及 validate_property_interval().

被这些函数引用 validate_property_interval().

函数调用图:
这是这个函数的调用关系图:

◆ validate_series_expr_point()

Result< void > LMCAS::validate_series_expr_point ( const std::shared_ptr< SymbolicExpr > & expr,
const std::shared_ptr< SymbolicExpr > & center,
const std::string & var,
ComputationContext & context,
const std::string & operation )

在文件 series_expansions.cpp 第 53 行定义.

59{
60 auto var_check = validate_series_variable(var, context, operation);
61 if (!var_check) {
62 return var_check;
63 }
64 if (!expr || !LMCAS::detail::node(expr) || !center || !LMCAS::detail::node(center)) {
66 "series expression and center cannot be null",
67 operation);
68 }
69 return Result<void>::success();
70}

引用了 context, LMCAS::Result< T >::failure(), InvalidArgument, LMCAS::detail::node(), LMCAS::Result< T >::success(), validate_series_expr_point() , 以及 validate_series_variable().

被这些函数引用 laurent_series_full_checked() , 以及 validate_series_expr_point().

函数调用图:
这是这个函数的调用关系图:

◆ validate_series_variable() [1/2]

Result< void > LMCAS::detail::series_support::validate_series_variable ( const std::string & variable,
ComputationContext & context,
const std::string & operation )

在文件 series_engine.cpp 第 53 行定义.

56{
57 auto step = context.consume_steps(1, operation);
58 if (!step) {
59 return step;
60 }
61 if (var.empty()) {
63 "series variable name cannot be empty",
64 operation);
65 }
66 return Result<void>::success();
67}

被这些函数引用 convergence_radius_checked(), convergence_test_checked() , 以及 validate_series_expr_point().

这是这个函数的调用关系图:

◆ validate_series_variable() [2/2]

Result< void > LMCAS::detail::series_support::validate_series_variable ( const std::string & variable,
ComputationContext & context,
const std::string & operation )

在文件 series_engine.cpp 第 53 行定义.

56{
57 auto step = context.consume_steps(1, operation);
58 if (!step) {
59 return step;
60 }
61 if (var.empty()) {
63 "series variable name cannot be empty",
64 operation);
65 }
66 return Result<void>::success();
67}

◆ vector_angle_checked() [1/2]

VectorAngleResult LMCAS::vector_angle_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & a,
const std::vector< std::shared_ptr< SymbolicExpr > > & b )

在文件 symbolic_geometry_vector.cpp 第 218 行定义.

221 {
224}

引用了 a, b, context , 以及 vector_angle_checked().

函数调用图:

◆ vector_angle_checked() [2/2]

VectorAngleResult LMCAS::vector_angle_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & a,
const std::vector< std::shared_ptr< SymbolicExpr > > & b,
ComputationContext & context )

在文件 symbolic_geometry_vector.cpp 第 155 行定义.

159 {
160 const std::string operation = "vector_angle";
161 auto input = validate_same_dimension_vectors(a, b, context, operation);
162 if (!input) return VectorAngleResult::failure(input.error());
163 double scale_a = 0.0;
164 double scale_b = 0.0;
165 double norm_a_scaled = 0.0;
166 double norm_b_scaled = 0.0;
167 double dot_scaled = 0.0;
168 double dot_correction = 0.0;
169 for (size_t i = 0; i < a.size(); ++i) {
170 auto step = context.consume_steps(1, operation);
171 if (!step) return VectorAngleResult::failure(step.error());
172 auto na_result = symbolic_vector_finite_numeric(a[i], context, operation);
173 if (!na_result) return VectorAngleResult::failure(na_result.error());
174 auto nb_result = symbolic_vector_finite_numeric(b[i], context, operation);
175 if (!nb_result) return VectorAngleResult::failure(nb_result.error());
176 const double na = na_result.value();
177 const double nb = nb_result.value();
178 const double abs_a = std::abs(na);
179 const double abs_b = std::abs(nb);
180
181 rescale_angle_component(
182 abs_a, scale_a, norm_a_scaled, dot_scaled, dot_correction);
183 rescale_angle_component(
184 abs_b, scale_b, norm_b_scaled, dot_scaled, dot_correction);
185 if (scale_a != 0.0) {
186 const double normalized = na / scale_a;
187 norm_a_scaled += normalized * normalized;
188 }
189 if (scale_b != 0.0) {
190 const double normalized = nb / scale_b;
191 norm_b_scaled += normalized * normalized;
192 }
193 if (scale_a != 0.0 && scale_b != 0.0) {
195 na / scale_a, nb / scale_b, dot_scaled, dot_correction);
196 }
197 }
198 if (scale_a == 0.0 || scale_b == 0.0) {
201 "angle is undefined for zero-length vectors",
202 operation);
203 }
204 const double denominator =
205 std::sqrt(norm_a_scaled) * std::sqrt(norm_b_scaled);
206 double cosv = dot_scaled / denominator;
207 if (!std::isfinite(cosv)) {
210 "vector angle normalization produced a non-finite result",
211 operation);
212 }
213 if (cosv > 1.0) cosv = 1.0;
214 else if (cosv < -1.0) cosv = -1.0;
215 return VectorAngleResult::success(std::acos(cosv));
216}
void accumulate_angle_product(double left, double right, double &dot, double &correction)

引用了 a, b, context, denominator, DomainError, LMCAS::Result< double >::failure(), NumericFailure, LMCAS::Result< double >::success(), LMCAS::geometry_detail::validate_same_dimension_vectors() , 以及 vector_angle_checked().

被这些函数引用 dihedral_angle_checked(), vector_angle_checked() , 以及 vector_angle_checked().

函数调用图:
这是这个函数的调用关系图:

◆ vector_angle_symbolic()

VectorCalculusExprResult LMCAS::vector_angle_symbolic ( const VectorField & a,
const VectorField & b )

在文件 vector_calculus_algebra.cpp 第 201 行定义.

201 {
203 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
204 context.limits().max_ast_nodes, "vector_angle_symbolic");
205 return vector_angle_symbolic_impl(a, b, transform_budget);
206} catch (const CasError& error) {
208} catch (const std::bad_alloc&) {
210 "vector calculus allocation failed", "vector_angle_symbolic");
211} catch (const std::length_error& error) {
212 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), "vector_angle_symbolic");
213} catch (const std::exception& error) {
214 return VectorCalculusExprResult::failure(CasErrc::InternalInvariant, error.what(), "vector_angle_symbolic");
215}
static VectorCalculusExprResult vector_angle_symbolic_impl(const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)

引用了 a, b, context, vector_angle_symbolic() , 以及 vector_angle_symbolic_impl().

被这些函数引用 vector_angle_symbolic().

函数调用图:
这是这个函数的调用关系图:

◆ vector_angle_symbolic_impl()

VectorCalculusExprResult LMCAS::vector_angle_symbolic_impl ( const VectorField & a,
const VectorField & b,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_algebra.cpp 第 98 行定义.

99{
100 auto aa_result = dot_product_impl(a, a, transform_budget);
101 if (!aa_result) {
102 return aa_result;
103 }
104 auto bb_result = dot_product_impl(b, b, transform_budget);
105 if (!bb_result) {
106 return bb_result;
107 }
108 auto aa = aa_result.value();
109 auto bb = bb_result.value();
110 if ((LMCAS::detail::node(aa) && LMCAS::detail::node(aa)->is_zero()) ||
112 return VectorCalculusExprResult::success(nullptr);
113 }
114 auto ab_result = dot_product_impl(a, b, transform_budget);
115 if (!ab_result) {
116 return ab_result;
117 }
118 auto denom = SymbolicExpr::multiply(SymbolicExpr::sqrt(aa), SymbolicExpr::sqrt(bb));
119 auto cos_theta = SymbolicExpr::divide(ab_result.value(), denom);
122 std::vector<std::shared_ptr<const SymbolicNode>>{LMCAS::detail::node(cos_theta)});
125}

引用了 a, LMCAS::FunctionNode::ArcCos, b, dot_product_impl(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success() , 以及 vector_angle_symbolic_impl().

被这些函数引用 vector_angle_symbolic() , 以及 vector_angle_symbolic_impl().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_classify_critical_point()

CriticalPointClassification LMCAS::vector_calculus_classify_critical_point ( const std::vector< double > & numeric_H,
size_t n,
ComputationContext & context,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_extrema.cpp 第 166 行定义.

169{
170 const double tol = 1e-10;
171 if (n == 1) {
172 const double value = numeric_H[0];
173 if (std::abs(value) < tol) {
175 }
176 if (value > 0) {
178 }
180 }
181 if (n == 2) {
182 return classify_hessian_pair(numeric_H, tol);
183 }
184 auto matrix = symbolic_hessian(numeric_H, n, tol);
185 auto eigenvalues = matrix_eigenvalues_checked(matrix, context);
186 if (!eigenvalues) {
187 if (eigenvalues.error().code != CasErrc::Inconclusive &&
188 eigenvalues.error().code != CasErrc::UnsupportedExpression) {
189 throw eigenvalues.error();
190 }
192 }
193 return classify_hessian_eigenvalues(eigenvalues.value(), tol, context, transform_budget);
194}
static CriticalPointClassification classify_hessian_eigenvalues(const std::vector< std::shared_ptr< SymbolicExpr > > &eigenvals, double tol, ComputationContext &context, detail::RewriteBudget &transform_budget)
static std::shared_ptr< SymbolicExpr > symbolic_hessian(const std::vector< double > &numeric_H, size_t n, double tol)
static CriticalPointClassification classify_hessian_pair(const std::vector< double > &numeric_H, double tol)

引用了 classify_hessian_eigenvalues(), classify_hessian_pair(), context, Degenerate, e(), Inconclusive, LocalMaximum, LocalMinimum, matrix_eigenvalues_checked(), symbolic_hessian(), UnsupportedExpression, value , 以及 vector_calculus_classify_critical_point().

被这些函数引用 find_extrema_impl() , 以及 vector_calculus_classify_critical_point().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_constant_integrand()

VectorCalculusExprResult LMCAS::vector_calculus_constant_integrand ( const std::shared_ptr< SymbolicExpr > & integrand,
const std::string & variable,
ComputationContext & context,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_integrals.cpp 第 486 行定义.

490 {
491 auto candidate = detail::make_expression_ptr(detail::substitute_node(detail::node(integrand), variable, detail::node(SymbolicExpr::number(0)), transform_budget));
492 candidate = candidate ? detail::make_expression_ptr(detail::normalize_node(detail::node(candidate), transform_budget)) : nullptr;
493 if (!candidate || expression_depends_on_variable(detail::node(candidate), variable)) {
494 return VectorCalculusExprResult::success(integrand);
495 }
496
497 EqvOptions trig_options;
498 trig_options.profile = EqvProfile::TrigBasic;
499 auto identity = check_equivalent(
500 integrand, candidate, context, trig_options);
501 if (!identity) {
502 return VectorCalculusExprResult::failure(identity.error());
503 }
504 if (!std::holds_alternative<ProvedZeroResidual>(
505 identity.value())) {
506 return VectorCalculusExprResult::success(integrand);
507 }
508 return VectorCalculusExprResult::success(std::move(candidate));
509}

引用了 check_equivalent(), context, expression_depends_on_variable(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::EqvOptions::profile, LMCAS::detail::substitute_node(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success(), TrigBasic, variable , 以及 vector_calculus_constant_integrand().

被这些函数引用 LMCAS::vector_calculus_detail::greens_theorem_area_strict() , 以及 vector_calculus_constant_integrand().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_cross_product_partials_strict()

Result< VectorField > LMCAS::vector_calculus_cross_product_partials_strict ( const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::string & operation,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_integrals.cpp 第 242 行定义.

248{
249 VectorField r_u;
250 VectorField r_v;
251 r_u.reserve(3);
252 r_v.reserve(3);
253 for (size_t i = 0; i < 3; ++i) {
254 auto du = vector_calculus_differentiate_strict(parametrization[i], u, operation, transform_budget);
255 if (!du) return Result<VectorField>::failure(du.error());
256 auto dv = vector_calculus_differentiate_strict(parametrization[i], v, operation, transform_budget);
257 if (!dv) return Result<VectorField>::failure(dv.error());
258 r_u.push_back(std::move(du.value()));
259 r_v.push_back(std::move(dv.value()));
260 }
261
262 VectorField cross;
263 cross.reserve(3);
264 for (std::size_t index = 0; index < 3; ++index) {
265 auto component = vector_calculus_cross_component(
266 r_u, r_v, index);
267 auto checked = vector_calculus_simplify_strict(component, operation,
268 "surface normal construction is outside the supported domain", transform_budget);
269 if (!checked) {
270 return Result<VectorField>::failure(checked.error());
271 }
272 cross.push_back(std::move(checked.value()));
273 }
274 return Result<VectorField>::success(std::move(cross));
275}

引用了 LMCAS::Result< T >::failure(), parametrization, LMCAS::Result< T >::success(), u, v, LMCAS::vector_calculus_detail::vector_calculus_cross_component(), vector_calculus_cross_product_partials_strict(), LMCAS::vector_calculus_detail::vector_calculus_differentiate_strict() , 以及 LMCAS::vector_calculus_detail::vector_calculus_simplify_strict().

被这些函数引用 LMCAS::vector_calculus_detail::stokes_theorem_strict(), LMCAS::vector_calculus_detail::surface_integral_scalar_strict(), LMCAS::vector_calculus_detail::surface_integral_vector_strict() , 以及 vector_calculus_cross_product_partials_strict().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_curl_strict()

Result< VectorField > LMCAS::vector_calculus_curl_strict ( const VectorField & F,
const std::vector< std::string > & vars,
const std::string & operation,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_integrals.cpp 第 571 行定义.

576{
577 auto dFz_dy = vector_calculus_differentiate_strict(F[2], vars[1], operation, transform_budget);
578 if (!dFz_dy) {
579 return Result<VectorField>::failure(dFz_dy.error());
580 }
581 auto dFy_dz = vector_calculus_differentiate_strict(F[1], vars[2], operation, transform_budget);
582 if (!dFy_dz) {
583 return Result<VectorField>::failure(dFy_dz.error());
584 }
585 auto dFx_dz = vector_calculus_differentiate_strict(F[0], vars[2], operation, transform_budget);
586 if (!dFx_dz) {
587 return Result<VectorField>::failure(dFx_dz.error());
588 }
589 auto dFz_dx = vector_calculus_differentiate_strict(F[2], vars[0], operation, transform_budget);
590 if (!dFz_dx) {
591 return Result<VectorField>::failure(dFz_dx.error());
592 }
593 auto dFy_dx = vector_calculus_differentiate_strict(F[1], vars[0], operation, transform_budget);
594 if (!dFy_dx) {
595 return Result<VectorField>::failure(dFy_dx.error());
596 }
597 auto dFx_dy = vector_calculus_differentiate_strict(F[0], vars[1], operation, transform_budget);
598 if (!dFx_dy) {
599 return Result<VectorField>::failure(dFx_dy.error());
600 }
601
602 auto cx = SymbolicExpr::add(
603 dFz_dy.value(),
604 SymbolicExpr::multiply(SymbolicExpr::number(-1), dFy_dz.value()));
605 auto cx_checked = vector_calculus_simplify_strict(cx, operation, "curl construction is outside the supported domain", transform_budget);
606 if (!cx_checked) {
607 return Result<VectorField>::failure(cx_checked.error());
608 }
609
610 auto cy = SymbolicExpr::add(
611 dFx_dz.value(),
612 SymbolicExpr::multiply(SymbolicExpr::number(-1), dFz_dx.value()));
613 auto cy_checked = vector_calculus_simplify_strict(cy, operation, "curl construction is outside the supported domain", transform_budget);
614 if (!cy_checked) {
615 return Result<VectorField>::failure(cy_checked.error());
616 }
617
618 auto cz = SymbolicExpr::add(
619 dFy_dx.value(),
620 SymbolicExpr::multiply(SymbolicExpr::number(-1), dFx_dy.value()));
621 auto cz_checked = vector_calculus_simplify_strict(cz, operation, "curl construction is outside the supported domain", transform_budget);
622 if (!cz_checked) {
623 return Result<VectorField>::failure(cz_checked.error());
624 }
625
627 VectorField{std::move(cx_checked.value()),
628 std::move(cy_checked.value()),
629 std::move(cz_checked.value())});
630}

引用了 LMCAS::Result< T >::failure(), LMCAS::Result< T >::success(), vars, vector_calculus_curl_strict(), LMCAS::vector_calculus_detail::vector_calculus_differentiate_strict() , 以及 LMCAS::vector_calculus_detail::vector_calculus_simplify_strict().

被这些函数引用 LMCAS::vector_calculus_detail::stokes_theorem_strict() , 以及 vector_calculus_curl_strict().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_definite_integral_strict()

VectorCalculusExprResult LMCAS::vector_calculus_definite_integral_strict ( const std::shared_ptr< SymbolicExpr > & integrand,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context,
const std::string & operation,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_integrals.cpp 第 204 行定义.

212{
213 auto result = vector_calculus_try_definite(integrand, var, a, b, context, transform_budget);
214 if (!result) return result;
215 if (!result.value() || !LMCAS::detail::node(result.value())) {
217 operation,
218 "integral could not be evaluated exactly in the supported domain");
219 }
220 return result;
221}
static VectorCalculusExprResult vector_calculus_try_definite(const std::shared_ptr< SymbolicExpr > &integrand, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, detail::RewriteBudget &transform_budget)
static VectorCalculusExprResult vector_calculus_inconclusive(const std::string &operation, const std::string &message)

引用了 a, b, context, LMCAS::detail::node(), vector_calculus_definite_integral_strict(), vector_calculus_inconclusive() , 以及 vector_calculus_try_definite().

被这些函数引用 LMCAS::vector_calculus_detail::curve_integral_scalar_strict(), LMCAS::vector_calculus_detail::curve_integral_vector_strict(), LMCAS::vector_calculus_detail::greens_theorem_area_strict() , 以及 vector_calculus_definite_integral_strict().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_evaluate_hessian_at_point()

bool LMCAS::vector_calculus_evaluate_hessian_at_point ( const std::shared_ptr< SymbolicExpr > & H,
const std::vector< std::string > & ,
const std::map< std::string, std::shared_ptr< SymbolicExpr > > & pt,
size_t n,
std::vector< double > & numeric_H,
ComputationContext & context,
detail::RewriteBudget & transform_budget )
static

代入临界点坐标

在文件 vector_calculus_extrema.cpp 第 32 行定义.

39{
40 auto mat_node = std::dynamic_pointer_cast<const MatrixNode>(LMCAS::detail::node(H));
41 if (!mat_node || mat_node->rows() != n || mat_node->cols() != n) {
42 return false;
43 }
44
45 numeric_H.resize(n * n);
46 for (size_t i = 0; i < n; ++i) {
47 for (size_t j = 0; j < n; ++j) {
48 auto elem_node = mat_node->get(i, j);
49 if (!elem_node) {
50 numeric_H[i * n + j] = 0.0;
51 continue;
52 }
53 auto elem = LMCAS::detail::make_expression_ptr(elem_node);
54 /// 代入临界点坐标
55 for (const auto& [var_name, val] : pt) {
56 elem = detail::make_expression_ptr(detail::substitute_node(detail::node(elem), var_name, detail::node(val), transform_budget));
57 if (!elem) {
58 return false;
59 }
60 }
62 if (!elem) {
63 return false;
64 }
65
67 elem, numeric_H[i * n + j], context)) {
68 return false;
69 }
70 }
71 }
72 return true;
73}

引用了 context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::substitute_node(), LMCAS::vector_calculus_detail::vector_calculus_checked_finite_numeric() , 以及 vector_calculus_evaluate_hessian_at_point().

被这些函数引用 find_extrema_impl() , 以及 vector_calculus_evaluate_hessian_at_point().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_inconclusive()

VectorCalculusExprResult LMCAS::vector_calculus_inconclusive ( const std::string & operation,
const std::string & message )
static

在文件 vector_calculus_integrals.cpp 第 130 行定义.

133{
135 message, operation);
136}

引用了 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), Inconclusive , 以及 vector_calculus_inconclusive().

被这些函数引用 vector_calculus_definite_integral_strict(), LMCAS::vector_calculus_detail::vector_calculus_differentiate_strict(), vector_calculus_inconclusive(), vector_calculus_multiple_integral_strict(), LMCAS::vector_calculus_detail::vector_calculus_simplify_strict() , 以及 vector_calculus_substitute_coords_strict().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_magnitude_squared()

std::shared_ptr< SymbolicExpr > LMCAS::vector_calculus_magnitude_squared ( const VectorField & v,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_directional.cpp 第 10 行定义.

13{
14 std::shared_ptr<SymbolicExpr> sum = nullptr;
15 for (const auto& comp : v) {
16 if (!comp) {
17 continue;
18 }
19 auto sq = SymbolicExpr::power(comp, SymbolicExpr::number(2));
21 if (!sum) {
22 sum = sq;
23 } else {
24 sum = SymbolicExpr::add(sum, sq);
26 }
27 }
28 if (!sum) {
29 return SymbolicExpr::number(0);
30 }
32}

引用了 LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), v , 以及 vector_calculus_magnitude_squared().

被这些函数引用 directional_derivative_checked(), LMCAS::vector_calculus_detail::directional_derivative_impl() , 以及 vector_calculus_magnitude_squared().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_multiple_integral_strict()

VectorCalculusExprResult LMCAS::vector_calculus_multiple_integral_strict ( const std::shared_ptr< SymbolicExpr > & integrand,
const std::vector< IntegrationStep > & steps,
ComputationContext & context,
const std::string & operation,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_integrals.cpp 第 223 行定义.

229{
230 if (!integrand || !LMCAS::detail::node(integrand)) {
232 operation, "integrand construction is outside the supported domain");
233 }
234 Integrator integrator;
235 auto integrated = integrate_multiple_checked(*integrand, steps, integrator, context);
236 if (!integrated) return VectorCalculusExprResult::failure(integrated.error());
237 auto result = LMCAS::detail::make_expression_ptr(integrated.value());
238 return vector_calculus_simplify_strict(result, operation,
239 "integral result simplification is outside the supported domain", transform_budget);
240}

引用了 context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), integrate_multiple_checked(), integrator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), steps, vector_calculus_inconclusive(), vector_calculus_multiple_integral_strict() , 以及 LMCAS::vector_calculus_detail::vector_calculus_simplify_strict().

被这些函数引用 LMCAS::vector_calculus_detail::divergence_theorem_strict(), LMCAS::vector_calculus_detail::greens_theorem_strict(), LMCAS::vector_calculus_detail::stokes_theorem_strict(), LMCAS::vector_calculus_detail::surface_integral_scalar_strict(), LMCAS::vector_calculus_detail::surface_integral_vector_strict() , 以及 vector_calculus_multiple_integral_strict().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_numerical_definite()

VectorCalculusExprResult LMCAS::vector_calculus_numerical_definite ( const std::shared_ptr< SymbolicExpr > & integrand,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_integrals.cpp 第 59 行定义.

66{
67 double a_val = 0.0;
68 double b_val = 0.0;
71 return std::shared_ptr<SymbolicExpr>{};
72 }
73
74 int n = 1000;
75 double h = (b_val - a_val) / n;
76 if (!std::isfinite(h)) return std::shared_ptr<SymbolicExpr>{};
77 double sum = 0.0;
78
79 for (int i = 0; i <= n; ++i) {
80 auto step_result =
81 context.consume_steps(1, "vector_calculus.numeric_integral");
82 if (!step_result) {
83 return VectorCalculusExprResult::failure(step_result.error());
84 }
85 double xi = a_val + i * h;
86 if (!std::isfinite(xi)) return std::shared_ptr<SymbolicExpr>{};
87 auto xi_expr = SymbolicExpr::number(xi);
88 auto fi = detail::make_expression_ptr(detail::substitute_node(detail::node(integrand), var, detail::node(xi_expr), transform_budget));
89 double fi_val = 0.0;
91 return std::shared_ptr<SymbolicExpr>{};
92 }
93
94 double weight = 1.0;
95 if (i == 0 || i == n) {
96 weight = 1.0;
97 } else if (i % 2 == 1) {
98 weight = 4.0;
99 } else {
100 weight = 2.0;
101 }
102 sum += weight * fi_val;
103 if (!std::isfinite(sum)) return std::shared_ptr<SymbolicExpr>{};
104 }
105 sum *= h / 3.0;
106 if (!std::isfinite(sum)) return std::shared_ptr<SymbolicExpr>{};
107
108 return SymbolicExpr::number(sum);
109}

引用了 a, b, context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::substitute_node(), LMCAS::vector_calculus_detail::vector_calculus_checked_finite_numeric() , 以及 vector_calculus_numerical_definite().

被这些函数引用 LMCAS::vector_calculus_detail::vector_calculus_integrate_with_fallback() , 以及 vector_calculus_numerical_definite().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_single_dir_deriv()

std::shared_ptr< SymbolicExpr > LMCAS::vector_calculus_single_dir_deriv ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
const VectorField & unit_dir,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_directional.cpp 第 34 行定义.

39{
40 std::shared_ptr<SymbolicExpr> sum = nullptr;
41 for (size_t i = 0; i < vars.size(); ++i) {
42 auto partial = detail::make_expression_ptr(detail::differentiate_node(detail::node(f), vars[i], transform_budget));
43 if (!partial) {
44 continue;
45 }
46 partial = detail::make_expression_ptr(detail::normalize_node(detail::node(partial), transform_budget));
47 auto term = SymbolicExpr::multiply(partial, unit_dir[i]);
49 if (!sum) {
50 sum = term;
51 } else {
52 sum = SymbolicExpr::add(sum, term);
54 }
55 }
56 if (!sum) {
57 return SymbolicExpr::number(0);
58 }
60}

引用了 LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), vars , 以及 vector_calculus_single_dir_deriv().

被这些函数引用 LMCAS::vector_calculus_detail::directional_derivative_impl() , 以及 vector_calculus_single_dir_deriv().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_substitute_coords_strict()

VectorCalculusExprResult LMCAS::vector_calculus_substitute_coords_strict ( const std::shared_ptr< SymbolicExpr > & expr,
const std::vector< std::string > & coord_vars,
const VectorField & values,
const std::string & operation,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_integrals.cpp 第 177 行定义.

183{
184 if (!expr || !LMCAS::detail::node(expr) || coord_vars.size() != values.size()) {
186 operation, "coordinate substitution is outside the supported domain");
187 }
188 auto substituted = expr;
189 for (size_t i = 0; i < coord_vars.size(); ++i) {
190 if (!values[i] || !LMCAS::detail::node(values[i])) {
192 operation, "coordinate substitution is outside the supported domain");
193 }
194 substituted = detail::make_expression_ptr(detail::substitute_node(detail::node(substituted), coord_vars[i], detail::node(values[i]), transform_budget));
195 if (!substituted || !LMCAS::detail::node(substituted)) {
197 operation, "coordinate substitution is outside the supported domain");
198 }
199 }
200 return vector_calculus_simplify_strict(substituted, operation,
201 "coordinate substitution is outside the supported domain", transform_budget);
202}

引用了 LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::substitute_node(), vector_calculus_inconclusive(), LMCAS::vector_calculus_detail::vector_calculus_simplify_strict() , 以及 vector_calculus_substitute_coords_strict().

被这些函数引用 LMCAS::vector_calculus_detail::curve_integral_scalar_strict(), LMCAS::vector_calculus_detail::curve_integral_vector_strict(), LMCAS::vector_calculus_detail::surface_integral_scalar_strict(), vector_calculus_substitute_coords_strict() , 以及 vector_calculus_surface_dot_strict().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_surface_dot_strict()

VectorCalculusExprResult LMCAS::vector_calculus_surface_dot_strict ( const VectorField & field,
const std::vector< std::string > & coordinates,
const VectorField & parametrization,
const VectorField & normal,
const std::string & message,
const std::string & operation,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_integrals.cpp 第 402 行定义.

409 {
410 std::shared_ptr<SymbolicExpr> dot_product;
411 for (std::size_t i = 0; i < 3; ++i) {
412 auto composed = vector_calculus_substitute_coords_strict(field[i], coordinates, parametrization, operation, transform_budget);
413 if (!composed) {
414 return composed;
415 }
416 auto term = SymbolicExpr::multiply(
417 composed.value(), normal[i]);
418 auto term_checked = vector_calculus_simplify_strict(term, operation, message, transform_budget);
419 if (!term_checked) {
420 return term_checked;
421 }
423 ? SymbolicExpr::add(dot_product, term_checked.value())
424 : term_checked.value();
425 auto dot_checked = vector_calculus_simplify_strict(dot_product, operation, message, transform_budget);
426 if (!dot_checked) {
427 return dot_checked;
428 }
429 dot_product = std::move(dot_checked.value());
430 }
432}
static VectorCalculusExprResult vector_calculus_substitute_coords_strict(const std::shared_ptr< SymbolicExpr > &expr, const std::vector< std::string > &coord_vars, const VectorField &values, const std::string &operation, detail::RewriteBudget &transform_budget)

引用了 dot_product(), parametrization, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success(), LMCAS::Result< T >::value(), LMCAS::vector_calculus_detail::vector_calculus_simplify_strict(), vector_calculus_substitute_coords_strict() , 以及 vector_calculus_surface_dot_strict().

被这些函数引用 LMCAS::vector_calculus_detail::stokes_theorem_strict(), LMCAS::vector_calculus_detail::surface_integral_vector_strict() , 以及 vector_calculus_surface_dot_strict().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_try_definite()

VectorCalculusExprResult LMCAS::vector_calculus_try_definite ( const std::shared_ptr< SymbolicExpr > & integrand,
const std::string & var,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_integrals.cpp 第 31 行定义.

38{
39 Integrator integrator;
40 auto integrated = integrator.integrate_def_checked(
41 *integrand, var, *a, *b, context);
42 if (!integrated) {
43 return VectorCalculusExprResult::failure(integrated.error());
44 }
45 SymbolicExpr result = std::move(integrated.value());
46
48 return std::shared_ptr<SymbolicExpr>{};
49 }
50 auto res = LMCAS::detail::make_expression_ptr(result);
51 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(res), transform_budget));
52 if (simplified &&
54 return std::shared_ptr<SymbolicExpr>{};
55 }
56 return simplified ? simplified : res;
57}

引用了 a, b, contains_unevaluated_integral(), context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), integrator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 vector_calculus_try_definite().

被这些函数引用 vector_calculus_definite_integral_strict(), LMCAS::vector_calculus_detail::vector_calculus_integrate_with_fallback() , 以及 vector_calculus_try_definite().

函数调用图:
这是这个函数的调用关系图:

◆ vector_cross()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::vector_cross ( const std::vector< std::shared_ptr< SymbolicExpr > > & a,
const std::vector< std::shared_ptr< SymbolicExpr > > & b )

在文件 symbolic_geometry_vector.cpp 第 111 行定义.

114 {
115 auto checked = vector_cross_checked(a, b);
116 if (!checked) {
117 throw std::invalid_argument("vector_cross: " + checked.error().message);
118 }
119 return checked.value();
120}

引用了 a, b, vector_cross() , 以及 vector_cross_checked().

被这些函数引用 vector_cross().

函数调用图:
这是这个函数的调用关系图:

◆ vector_cross_checked() [1/2]

VectorExprListResult LMCAS::vector_cross_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & a,
const std::vector< std::shared_ptr< SymbolicExpr > > & b )

在文件 symbolic_geometry_vector.cpp 第 146 行定义.

149 {
152}

引用了 a, b, context , 以及 vector_cross_checked().

函数调用图:

◆ vector_cross_checked() [2/2]

VectorExprListResult LMCAS::vector_cross_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & a,
const std::vector< std::shared_ptr< SymbolicExpr > > & b,
ComputationContext & context )

在文件 symbolic_geometry_vector.cpp 第 122 行定义.

126 {
127 const std::string operation = "vector_cross";
128 auto step = context.consume_steps(1, operation);
129 if (!step) return VectorExprListResult::failure(step.error());
130 if (a.size() != 3 || b.size() != 3) {
133 "cross product requires 3-dimensional vectors",
134 operation);
135 }
136 auto a_check = validate_symbolic_vector(a, "left vector", operation);
137 if (!a_check) return VectorExprListResult::failure(a_check.error());
138 auto b_check = validate_symbolic_vector(b, "right vector", operation);
139 if (!b_check) return VectorExprListResult::failure(b_check.error());
140 auto x = SymbolicExpr::add(SymbolicExpr::multiply(a[1], b[2]), SymbolicExpr::multiply(SymbolicExpr::number(-1), SymbolicExpr::multiply(a[2], b[1])));
141 auto y = SymbolicExpr::add(SymbolicExpr::multiply(a[2], b[0]), SymbolicExpr::multiply(SymbolicExpr::number(-1), SymbolicExpr::multiply(a[0], b[2])));
142 auto z = SymbolicExpr::add(SymbolicExpr::multiply(a[0], b[1]), SymbolicExpr::multiply(SymbolicExpr::number(-1), SymbolicExpr::multiply(a[1], b[0])));
143 return VectorExprListResult::success({x, y, z});
144}

引用了 a, b, context, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), InvalidArgument, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success(), LMCAS::geometry_detail::validate_symbolic_vector() , 以及 vector_cross_checked().

被这些函数引用 plane_from_three_points_checked(), LMCAS::anonymous_namespace{symbolic_geometry_line.cpp}::skew_distance_from_directions(), vector_cross(), vector_cross_checked() , 以及 vector_cross_checked().

函数调用图:
这是这个函数的调用关系图:

◆ vector_dot()

std::shared_ptr< SymbolicExpr > LMCAS::vector_dot ( const std::vector< std::shared_ptr< SymbolicExpr > > & a,
const std::vector< std::shared_ptr< SymbolicExpr > > & b )

在文件 symbolic_geometry_vector.cpp 第 74 行定义.

77 {
78 auto checked = vector_dot_checked(a, b);
79 if (!checked) {
80 throw std::invalid_argument("vector_dot: " + checked.error().message);
81 }
82 return checked.value();
83}

引用了 a, b, vector_dot() , 以及 vector_dot_checked().

被这些函数引用 vector_dot().

函数调用图:
这是这个函数的调用关系图:

◆ vector_dot_checked() [1/2]

ExpressionResult LMCAS::vector_dot_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & a,
const std::vector< std::shared_ptr< SymbolicExpr > > & b )

在文件 symbolic_geometry_vector.cpp 第 103 行定义.

106 {
108 return vector_dot_checked(a, b, context);
109}

引用了 a, b, context , 以及 vector_dot_checked().

函数调用图:

◆ vector_dot_checked() [2/2]

ExpressionResult LMCAS::vector_dot_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & a,
const std::vector< std::shared_ptr< SymbolicExpr > > & b,
ComputationContext & context )

在文件 symbolic_geometry_vector.cpp 第 85 行定义.

89 {
90 const std::string operation = "vector_dot";
91 auto input = validate_same_dimension_vectors(a, b, context, operation);
92 if (!input) return ExpressionResult::failure(input.error());
93 std::vector<std::shared_ptr<const SymbolicNode>> sum_terms;
94 for (size_t i = 0; i < a.size(); ++i) {
95 auto step = context.consume_steps(1, operation);
96 if (!step) return ExpressionResult::failure(step.error());
97 sum_terms.push_back(LMCAS::detail::node(SymbolicExpr::multiply(a[i], b[i])));
98 }
101}

引用了 a, b, context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success(), LMCAS::geometry_detail::validate_same_dimension_vectors() , 以及 vector_dot_checked().

被这些函数引用 LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::assemble_plane(), LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::check_plane_normal_nonzero(), LMCAS::anonymous_namespace{symbolic_geometry_line.cpp}::skew_distance_from_directions(), LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::symbolic_line_plane_intersection(), LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::symbolic_point_plane_distance(), tangent_plane_checked(), vector_dot(), vector_dot_checked() , 以及 vector_dot_checked().

函数调用图:
这是这个函数的调用关系图:

◆ vector_project()

VectorCalculusFieldResult LMCAS::vector_project ( const VectorField & a,
const VectorField & b )

在文件 vector_calculus_algebra.cpp 第 169 行定义.

169 {
171 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
172 context.limits().max_ast_nodes, "vector_project");
173 return vector_project_impl(a, b, transform_budget);
174} catch (const CasError& error) {
176} catch (const std::bad_alloc&) {
178 "vector calculus allocation failed", "vector_project");
179} catch (const std::length_error& error) {
180 return VectorCalculusFieldResult::failure(CasErrc::ResourceLimit, error.what(), "vector_project");
181} catch (const std::exception& error) {
182 return VectorCalculusFieldResult::failure(CasErrc::InternalInvariant, error.what(), "vector_project");
183}
static VectorCalculusFieldResult vector_project_impl(const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)

引用了 a, b, context, vector_project() , 以及 vector_project_impl().

被这些函数引用 vector_project().

函数调用图:
这是这个函数的调用关系图:

◆ vector_project_impl()

VectorCalculusFieldResult LMCAS::vector_project_impl ( const VectorField & a,
const VectorField & b,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_algebra.cpp 第 57 行定义.

58{
59 if (a.size() != b.size()) {
62 "vectors must have the same dimension",
63 "vector_project");
64 }
65 auto bb_result = dot_product_impl(b, b, transform_budget);
66 if (!bb_result) return VectorCalculusFieldResult::failure(bb_result.error());
67 auto bb = bb_result.value();
68 if (LMCAS::detail::node(bb) && LMCAS::detail::node(bb)->is_zero()) {
70 VectorField(a.size(), SymbolicExpr::number(0)));
71 }
72 auto ab_result = dot_product_impl(a, b, transform_budget);
73 if (!ab_result) return VectorCalculusFieldResult::failure(ab_result.error());
74 auto ab = ab_result.value();
75 auto coeff = SymbolicExpr::divide(ab, bb);
76 VectorField result;
77 result.reserve(b.size());
78 for (const auto& comp : b) {
79 result.push_back(detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(coeff, comp)), transform_budget)));
80 }
81 return VectorCalculusFieldResult::success(std::move(result));
82}

引用了 a, b, DimensionMismatch, dot_product_impl(), LMCAS::Result< VectorField >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::Result< VectorField >::success() , 以及 vector_project_impl().

被这些函数引用 vector_project() , 以及 vector_project_impl().

函数调用图:
这是这个函数的调用关系图:

◆ verified_quadratic_boundaries()

Result< QuadraticBoundaries > LMCAS::verified_quadratic_boundaries ( const Polynomial< Rational > & polynomial,
const Rational & rational_part,
const Rational & denominator,
const Rational & discriminant,
detail::RewriteBudget & budget )
static

在文件 inequality_solver_polynomial.cpp 第 131 行定义.

134 {
135 auto& context = budget.context();
137 SymbolicExpr::sqrt(SymbolicExpr::number(discriminant))), budget));
138 const Rational first_radical_coefficient = Rational(-1) / denominator;
139 const Rational second_radical_coefficient = Rational(1) / denominator;
141 SymbolicExpr::add(SymbolicExpr::number(rational_part),
142 SymbolicExpr::multiply(SymbolicExpr::number(first_radical_coefficient),
143 sqrt_discriminant))), budget));
145 SymbolicExpr::add(SymbolicExpr::number(rational_part),
146 SymbolicExpr::multiply(SymbolicExpr::number(second_radical_coefficient),
147 sqrt_discriminant))), budget));
148 budget.append_size(budget.measure(detail::node(first_formula)),
149 budget.measure(detail::node(second_formula)));
150 auto first_verified = verify_quadratic_boundary(
151 polynomial, first_formula, rational_part,
152 first_radical_coefficient, discriminant, context);
153 if (!first_verified) {
154 return Result<QuadraticBoundaries>::failure(first_verified.error());
155 }
156 auto second_verified = verify_quadratic_boundary(
157 polynomial, second_formula, rational_part,
158 second_radical_coefficient, discriminant, context);
159 if (!second_verified) {
160 return Result<QuadraticBoundaries>::failure(second_verified.error());
161 }
163 {std::move(first_formula), std::move(second_formula)});
164}

引用了 LMCAS::detail::RewriteBudget::append_size(), context, LMCAS::detail::RewriteBudget::context(), denominator, LMCAS::Result< T >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::Result< T >::success() , 以及 verified_quadratic_boundaries().

被这些函数引用 verified_quadratic_boundaries().

函数调用图:
这是这个函数的调用关系图:

◆ verified_real_inverse_candidates()

SymbolicExprVectorResult LMCAS::verified_real_inverse_candidates ( const std::vector< std::shared_ptr< SymbolicExpr > > & candidates,
const std::shared_ptr< SymbolicExpr > & equation,
const std::string & var,
const std::string & operation,
ComputationContext & context )
static

在文件 calculus_inverse.cpp 第 185 行定义.

189 {
190
191 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
192 (context).limits().max_ast_nodes, "transform");
193 std::vector<std::shared_ptr<SymbolicExpr>> real_candidates;
194 real_candidates.reserve(candidates.size());
195 for (const auto& candidate : candidates) {
196 std::shared_ptr<SymbolicExpr> real_candidate;
197 auto status = calculus_utils_extract_real_candidate(candidate, real_candidate, context);
201 "inverse derivative candidate reality could not be proven", operation);
202 }
204 continue;
205 }
206 auto residual = detail::make_expression_ptr(detail::substitute_node(detail::node(equation), var, detail::node(real_candidate), transform_budget));
207 auto simplified = residual ? detail::make_expression_ptr(detail::normalize_node(detail::node(residual), transform_budget)) : nullptr;
208 if (!simplified || !LMCAS::detail::node(simplified)) {
211 "inverse derivative candidate verification produced a null residual", operation);
212 }
213 if (!simplified->is_zero()) {
214 continue;
215 }
216 if (!contains_inverse_candidate(real_candidates, real_candidate)) {
217 real_candidates.push_back(real_candidate);
218 }
219 }
220 return SymbolicExprVectorResult::success(std::move(real_candidates));
221} catch (const CasError& error) {
223} catch (const std::bad_alloc&) {
224 return SymbolicExprVectorResult::failure(CasErrc::ResourceLimit, "allocation failed", operation);
225} catch (const std::length_error& error) {
226 return SymbolicExprVectorResult::failure(CasErrc::ResourceLimit, error.what(), operation);
227} catch (const std::exception& error) {
228 return SymbolicExprVectorResult::failure(CasErrc::InternalInvariant, error.what(), operation);
229}
static CalculusRealCandidateStatus calculus_utils_extract_real_candidate(const std::shared_ptr< SymbolicExpr > &candidate, std::shared_ptr< SymbolicExpr > &real_candidate, ComputationContext &context)
static bool contains_inverse_candidate(const std::vector< std::shared_ptr< SymbolicExpr > > &candidates, const std::shared_ptr< SymbolicExpr > &candidate)

引用了 calculus_utils_extract_real_candidate(), contains_inverse_candidate(), context, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), Inconclusive, InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), NonReal, LMCAS::detail::normalize_node(), LMCAS::detail::substitute_node(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success() , 以及 verified_real_inverse_candidates().

被这些函数引用 inverse_derivative_checked() , 以及 verified_real_inverse_candidates().

函数调用图:
这是这个函数的调用关系图:

◆ verify_lagrange_solutions()

LagrangeResult LMCAS::verify_lagrange_solutions ( const std::vector< std::map< std::string, std::shared_ptr< SymbolicExpr > > > & full_solutions,
const VectorField & equations,
const std::vector< std::string > & all_vars,
const std::vector< std::string > & vars,
ComputationContext & context,
const std::string & operation,
detail::RewriteBudget & transform_budget )
static

在文件 vector_calculus_lagrange.cpp 第 99 行定义.

104{
105 std::vector<std::map<std::string, std::shared_ptr<SymbolicExpr>>> verified;
106 std::set<std::string> var_set(vars.begin(), vars.end());
107 for (const auto& full_solution : full_solutions) {
108 if (!vector_calculus_point_has_vars(full_solution, all_vars)) {
111 "Lagrange candidate omits one or more variables or multipliers",
112 operation);
113 }
114 for (const auto& eq : equations) {
115 auto residual = eq;
116 for (const auto& [variable, value] : full_solution)
118 auto proof = check_zero_residual(residual, context);
119 if (!proof) return LagrangeResult::failure(proof.error());
120 if (!std::holds_alternative<ProvedZeroResidual>(proof.value())) {
123 "Lagrange candidate does not verify against the full stationarity system",
124 operation);
125 }
126 }
127
128 std::map<std::string, std::shared_ptr<SymbolicExpr>> filtered;
129 for (const auto& [name, val] : full_solution) {
130 if (var_set.count(name)) {
131 filtered[name] = val;
132 }
133 }
134 if (!vector_calculus_point_has_vars(filtered, vars)) {
137 "Lagrange candidate omits one or more variables",
138 operation);
139 }
140 verified.push_back(std::move(filtered));
141 }
142
143 return LagrangeResult::success(std::move(verified));
144}

引用了 check_zero_residual(), context, eq(), LMCAS::Result< std::vector< std::map< std::string, std::shared_ptr< SymbolicExpr > > > >::failure(), Inconclusive, LMCAS::detail::make_expression_ptr(), name, LMCAS::detail::node(), LMCAS::detail::substitute_node(), LMCAS::Result< std::vector< std::map< std::string, std::shared_ptr< SymbolicExpr > > > >::success(), value, variable, vars, LMCAS::vector_calculus_detail::vector_calculus_point_has_vars() , 以及 verify_lagrange_solutions().

被这些函数引用 lagrange_multipliers_strict() , 以及 verify_lagrange_solutions().

函数调用图:
这是这个函数的调用关系图:

◆ volume_of_revolution_x_checked() [1/2]

ExpressionResult LMCAS::volume_of_revolution_x_checked ( std::shared_ptr< SymbolicExpr > fx,
std::shared_ptr< SymbolicExpr > a,
std::shared_ptr< SymbolicExpr > b )

在文件 symbolic_geometry.cpp 第 242 行定义.

246 {
248 return volume_of_revolution_x_checked(std::move(fx), std::move(a), std::move(b),
249 context);
250}
ExpressionResult volume_of_revolution_x_checked(std::shared_ptr< SymbolicExpr > fx, std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b, ComputationContext &context)

引用了 a, b, context , 以及 volume_of_revolution_x_checked().

函数调用图:

◆ volume_of_revolution_x_checked() [2/2]

ExpressionResult LMCAS::volume_of_revolution_x_checked ( std::shared_ptr< SymbolicExpr > fx,
std::shared_ptr< SymbolicExpr > a,
std::shared_ptr< SymbolicExpr > b,
ComputationContext & context )

在文件 symbolic_geometry.cpp 第 231 行定义.

236 {
237 return volume_of_revolution_checked_impl(
238 std::move(fx), std::move(a), std::move(b), "x",
239 context, "volume_of_revolution_x");
240}

引用了 a, b, context , 以及 volume_of_revolution_x_checked().

被这些函数引用 volume_of_revolution_x_checked() , 以及 volume_of_revolution_x_checked().

函数调用图:
这是这个函数的调用关系图:

◆ volume_of_revolution_y_checked() [1/2]

ExpressionResult LMCAS::volume_of_revolution_y_checked ( std::shared_ptr< SymbolicExpr > fy,
std::shared_ptr< SymbolicExpr > a,
std::shared_ptr< SymbolicExpr > b )

在文件 symbolic_geometry.cpp 第 285 行定义.

289 {
291 return volume_of_revolution_y_checked(std::move(fy), std::move(a), std::move(b),
292 context);
293}
ExpressionResult volume_of_revolution_y_checked(std::shared_ptr< SymbolicExpr > fy, std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b, ComputationContext &context)

引用了 a, b, context , 以及 volume_of_revolution_y_checked().

函数调用图:

◆ volume_of_revolution_y_checked() [2/2]

ExpressionResult LMCAS::volume_of_revolution_y_checked ( std::shared_ptr< SymbolicExpr > fy,
std::shared_ptr< SymbolicExpr > a,
std::shared_ptr< SymbolicExpr > b,
ComputationContext & context )

在文件 symbolic_geometry.cpp 第 274 行定义.

279 {
280 return volume_of_revolution_checked_impl(
281 std::move(fy), std::move(a), std::move(b), "y",
282 context, "volume_of_revolution_y");
283}

引用了 a, b, context , 以及 volume_of_revolution_y_checked().

被这些函数引用 volume_of_revolution_y_checked() , 以及 volume_of_revolution_y_checked().

函数调用图:
这是这个函数的调用关系图:

◆ wildcard()

SymbolicExpr LMCAS::wildcard ( const std::string & name)

◆ with_assumptions() [1/3]

template<typename F>
auto LMCAS::with_assumptions ( AssumptionContext & ctx,
const std::vector< AssumptionDecl > & decls,
F && callable ) -> std::enable_if_t< std::is_void_v< decltype(callable())>, AssumptionVoidResult >

在文件 assumption_context.hpp 第 514 行定义.

518{
519 ctx.push();
520 try {
521 for (const auto& decl : decls) {
522 auto applied = apply_assumption_decl_checked(ctx, decl);
523 if (!applied) {
524 auto popped = ctx.pop();
525 if (!popped) return AssumptionVoidResult::failure(popped.error());
526 return AssumptionVoidResult::failure(applied.error());
527 }
528 }
529 callable();
530 auto popped = ctx.pop();
531 if (!popped) return AssumptionVoidResult::failure(popped.error());
533 } catch (const CasError& error) {
534 auto popped = ctx.pop();
535 if (!popped) return AssumptionVoidResult::failure(popped.error());
536 return AssumptionVoidResult::failure(error);
537 } catch (const std::bad_alloc&) {
538 auto popped = ctx.pop();
539 if (!popped) return AssumptionVoidResult::failure(popped.error());
541 CasErrc::ResourceLimit, "with_assumptions allocation failed", "with_assumptions");
542 } catch (const std::exception& ex) {
543 auto popped = ctx.pop();
544 if (!popped) return AssumptionVoidResult::failure(popped.error());
546 CasErrc::InternalInvariant, ex.what(), "with_assumptions");
547 } catch (...) {
548 auto popped = ctx.pop();
549 if (!popped) return AssumptionVoidResult::failure(popped.error());
550 throw;
551 }
552}
AssumptionVoidResult apply_assumption_decl_checked(AssumptionContext &ctx, const AssumptionDecl &decl)

引用了 apply_assumption_decl_checked(), LMCAS::Result< void >::failure(), InternalInvariant, ResourceLimit, LMCAS::Result< void >::success() , 以及 with_assumptions().

函数调用图:

◆ with_assumptions() [2/3]

template<typename F>
auto LMCAS::with_assumptions ( AssumptionContext & ctx,
const std::vector< AssumptionDecl > & decls,
F && callable ) -> std::enable_if_t<!std::is_void_v< decltype(callable())>, Result< decltype(callable())> >

Execute a callable within a temporary assumption scope.

Declaration and callable failures are returned as CasError. The temporary scope is removed before every return.

在文件 assumption_context.hpp 第 472 行定义.

476{
477 using ReturnT = decltype(callable());
478 ctx.push();
479 try {
480 for (const auto& decl : decls) {
481 auto applied = apply_assumption_decl_checked(ctx, decl);
482 if (!applied) {
483 auto popped = ctx.pop();
484 if (!popped) return Result<ReturnT>::failure(popped.error());
485 return Result<ReturnT>::failure(applied.error());
486 }
487 }
488 auto result = callable();
489 auto popped = ctx.pop();
490 if (!popped) return Result<ReturnT>::failure(popped.error());
491 return Result<ReturnT>::success(std::move(result));
492 } catch (const CasError& error) {
493 auto popped = ctx.pop();
494 if (!popped) return Result<ReturnT>::failure(popped.error());
495 return Result<ReturnT>::failure(error);
496 } catch (const std::bad_alloc&) {
497 auto popped = ctx.pop();
498 if (!popped) return Result<ReturnT>::failure(popped.error());
500 CasErrc::ResourceLimit, "with_assumptions allocation failed", "with_assumptions");
501 } catch (const std::exception& ex) {
502 auto popped = ctx.pop();
503 if (!popped) return Result<ReturnT>::failure(popped.error());
505 CasErrc::InternalInvariant, ex.what(), "with_assumptions");
506 } catch (...) {
507 auto popped = ctx.pop();
508 if (!popped) return Result<ReturnT>::failure(popped.error());
509 throw;
510 }
511}

引用了 apply_assumption_decl_checked(), LMCAS::Result< T >::failure(), InternalInvariant, ResourceLimit, LMCAS::Result< T >::success() , 以及 with_assumptions().

被这些函数引用 with_assumptions(), with_assumptions() , 以及 with_assumptions().

函数调用图:
这是这个函数的调用关系图:

◆ with_assumptions() [3/3]

template<typename F>
auto LMCAS::with_assumptions ( AssumptionContext & ctx,
std::initializer_list< AssumptionDecl > decls,
F && callable ) -> decltype(with_assumptions( ctx, std::vector< AssumptionDecl >(decls), std::forward< F >(callable)))

在文件 assumption_context.hpp 第 555 行定义.

560{
561 return with_assumptions(
562 ctx, std::vector<AssumptionDecl>(decls), std::forward<F>(callable));
563}
auto with_assumptions(AssumptionContext &ctx, const std::vector< AssumptionDecl > &decls, F &&callable) -> std::enable_if_t<!std::is_void_v< decltype(callable())>, Result< decltype(callable())> >
Execute a callable within a temporary assumption scope.

引用了 with_assumptions().

函数调用图:

◆ with_unit()

ExprResult LMCAS::with_unit ( const ExprPtr & value,
const std::string & unit,
ComputationContext & context )

在文件 value_facade.cpp 第 7 行定义.

8 {
10}
QuantityResult attach_unit(const std::shared_ptr< SymbolicExpr > &value, const std::string &unit, ComputationContext &context)

引用了 attach_unit(), context, unit, value , 以及 with_unit().

被这些函数引用 with_unit().

函数调用图:
这是这个函数的调用关系图:

◆ with_unit_definition()

ExprResult LMCAS::with_unit_definition ( const ExprPtr & value,
std::string display_unit,
UnitDefinition definition,
ComputationContext & context )

在文件 value_facade.cpp 第 12 行定义.

15 {
16 return attach_unit(value, std::move(display_unit), std::move(definition), context);
17}

引用了 attach_unit(), context, definition, display_unit, value , 以及 with_unit_definition().

被这些函数引用 with_unit_definition().

函数调用图:
这是这个函数的调用关系图:

◆ wrap_ode_solution()

ODESolutionResult LMCAS::wrap_ode_solution ( ODESolution solution,
ODEType expected_method,
const std::string & operation )

在文件 ode_support.cpp 第 100 行定义.

103{
104 if (!solution.general_solution || !LMCAS::detail::node(solution.general_solution)) {
107 "ODE solver produced no solution in the supported domain",
108 operation);
109 }
110 if (solution.method_used != expected_method) {
113 "ODE solver reported an unexpected method",
114 operation);
115 }
116 return ODESolutionResult::success(std::move(solution));
117}

引用了 LMCAS::Result< ODESolution >::failure(), LMCAS::ODESolution::general_solution, Inconclusive, InternalInvariant, LMCAS::ODESolution::method_used, LMCAS::detail::node(), LMCAS::Result< ODESolution >::success() , 以及 wrap_ode_solution().

被这些函数引用 solve_bernoulli_ode_checked(), solve_euler_ode_checked(), solve_exact_ode_checked(), solve_higher_order_ode_checked(), solve_homogeneous_ode_checked(), solve_variation_of_parameters_checked() , 以及 wrap_ode_solution().

函数调用图:
这是这个函数的调用关系图:

◆ z_transform_checked() [1/2]

TransformEngineResult LMCAS::z_transform_checked ( const std::shared_ptr< SymbolicExpr > & f_n,
const std::string & n,
const std::string & z )

在文件 transform_z.cpp 第 276 行定义.

279 {
281 return z_transform_checked(f_n, n, z, context);
282}
TransformEngineResult z_transform_checked(const std::shared_ptr< SymbolicExpr > &f_n, const std::string &n, const std::string &z, ComputationContext &context)

引用了 context , 以及 z_transform_checked().

函数调用图:

◆ z_transform_checked() [2/2]

TransformEngineResult LMCAS::z_transform_checked ( const std::shared_ptr< SymbolicExpr > & f_n,
const std::string & n,
const std::string & z,
ComputationContext & context )

在文件 transform_z.cpp 第 245 行定义.

249 {
250 const std::string operation = "z_transform";
251 auto valid = te_validate_expr_vars(f_n, n, z, context, operation);
252 if (!valid) return TransformEngineResult::failure(valid.error());
253 auto step = context.consume_steps(8, operation);
254 if (!step) return TransformEngineResult::failure(step.error());
255 try {
256 auto expression = z_transform_core(f_n, n, z, context);
257 auto final_access = context.consume_steps(0, operation);
258 if (!final_access) {
259 return TransformEngineResult::failure(final_access.error());
260 }
261 auto result = te_wrap_transform_result(std::move(expression), operation);
262 if (result) {
263 result.value().value.roc = zt_roc(f_n, n, z);
264 }
265 return result;
266 } catch (const std::bad_alloc&) {
268 "transform allocation failed",
269 operation);
270 } catch (const std::exception& e) {
272 e.what(), operation);
273 }
274}
static std::shared_ptr< SymbolicExpr > z_transform_core(const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::string &z, ComputationContext &context)
static std::vector< std::shared_ptr< SymbolicExpr > > zt_roc(const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::string &z)

引用了 context, e(), LMCAS::Result< Verified< EvaluatedTransform > >::failure(), InternalInvariant, ResourceLimit, LMCAS::transform_detail::te_validate_expr_vars(), LMCAS::transform_detail::te_wrap_transform_result(), z_transform_checked(), z_transform_core() , 以及 zt_roc().

被这些函数引用 z_transform_checked() , 以及 z_transform_checked().

函数调用图:
这是这个函数的调用关系图:

◆ z_transform_core()

std::shared_ptr< SymbolicExpr > LMCAS::z_transform_core ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & n,
const std::string & z,
ComputationContext & context )
static

在文件 transform_z.cpp 第 205 行定义.

207 {
208 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
209 (context).limits().max_ast_nodes, "transform");
210 auto step = context.consume_steps(1, "z_transform.recursive");
211 if (!step) {
212 return nullptr;
213 }
214 if (!f || !detail::node(f)) {
215 return nullptr;
216 }
217 auto zv = SymbolicExpr::variable(z);
218 auto addition = std::dynamic_pointer_cast<const AddNode>(detail::node(f));
219 if (addition) {
220 return zt_sum(f, *addition, n, z, context);
221 }
222 auto [coefficient, body] = te_split_coeff(f, n);
223 if (!coefficient->is_one()) {
224 auto transformed = z_transform_core(body, n, z, context);
225 if (transformed) {
226 return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(coefficient, transformed)), transform_budget));
227 }
228 }
229 if (!te_depends_on(f, n)) {
230 auto denominator = SymbolicExpr::add(zv, SymbolicExpr::number(-1));
231 return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(f, SymbolicExpr::divide(zv, denominator))), transform_budget));
232 }
233 auto polynomial = zt_polynomial(f, n, zv, z, context);
234 if (polynomial) {
235 return polynomial;
236 }
237 auto exponential = zt_exponential(f, n, zv, context);
238 if (exponential) {
239 return exponential;
240 }
241 auto trig = zt_trigonometric(f, n, zv, context);
242 return trig ? trig : zt_unevaluated(f, n, z);
243}
static std::shared_ptr< SymbolicExpr > zt_polynomial(const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::shared_ptr< SymbolicExpr > &z, const std::string &z_var, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > zt_unevaluated(const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::string &z)
static std::shared_ptr< SymbolicExpr > zt_sum(const std::shared_ptr< SymbolicExpr > &f, const AddNode &addition, const std::string &n, const std::string &z, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > zt_exponential(const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::shared_ptr< SymbolicExpr > &z, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > zt_trigonometric(const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::shared_ptr< SymbolicExpr > &z, ComputationContext &context)

引用了 context, denominator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::transform_detail::te_depends_on(), LMCAS::transform_detail::te_split_coeff(), z_transform_core(), zt_exponential(), zt_polynomial(), zt_sum(), zt_trigonometric() , 以及 zt_unevaluated().

被这些函数引用 z_transform_checked(), z_transform_core() , 以及 zt_sum().

函数调用图:
这是这个函数的调用关系图:

◆ zassenhaus_combine_checked() [1/2]

ZassenhausResult LMCAS::zassenhaus_combine_checked ( const Polynomial< Rational > & poly,
const std::vector< Polynomial< BigInt > > & lifted_factors,
const BigInt & reconstruction_modulus )

在文件 zassenhaus_combine.cpp 第 472 行定义.

475 {
479}
const std::vector< Polynomial< BigInt > > const BigInt & reconstruction_modulus
ZassenhausResult zassenhaus_combine_checked(const Polynomial< Rational > &poly, const std::vector< Polynomial< BigInt > > &lifted_factors, const BigInt &reconstruction_modulus, ComputationContext &context)

引用了 context, lifted_factors, reconstruction_modulus , 以及 zassenhaus_combine_checked().

函数调用图:

◆ zassenhaus_combine_checked() [2/2]

ZassenhausResult LMCAS::zassenhaus_combine_checked ( const Polynomial< Rational > & poly,
const std::vector< Polynomial< BigInt > > & lifted_factors,
const BigInt & reconstruction_modulus,
ComputationContext & context )

在文件 zassenhaus_combine.cpp 第 455 行定义.

459 {
460 try {
463 } catch (const std::bad_alloc&) {
465 CasErrc::ResourceLimit, "allocation failed", "zassenhaus_combine");
466 } catch (const std::exception& error) {
468 CasErrc::InternalInvariant, error.what(), "zassenhaus_combine");
469 }
470}
static ZassenhausResult zassenhaus_combine_impl(const Polynomial< Rational > &poly, const std::vector< Polynomial< BigInt > > &lifted_factors, const BigInt &reconstruction_modulus, ComputationContext &context)

引用了 context, LMCAS::Result< MathResult< std::vector< Polynomial< Rational > > > >::failure(), InternalInvariant, lifted_factors, reconstruction_modulus, ResourceLimit, zassenhaus_combine_checked() , 以及 zassenhaus_combine_impl().

被这些函数引用 LMCAS::anonymous_namespace{univariate_factor_bridge.cpp}::bridge_lift_and_combine(), zassenhaus_combine_checked() , 以及 zassenhaus_combine_checked().

函数调用图:
这是这个函数的调用关系图:

◆ zassenhaus_combine_impl()

ZassenhausResult LMCAS::zassenhaus_combine_impl ( const Polynomial< Rational > & poly,
const std::vector< Polynomial< BigInt > > & lifted_factors,
const BigInt & reconstruction_modulus,
ComputationContext & context )
static

在文件 zassenhaus_combine.cpp 第 419 行定义.

423 {
424 if (reconstruction_modulus.is_zero() ||
425 reconstruction_modulus.is_negative()) {
428 "reconstruction modulus must be positive",
429 "zassenhaus_combine");
430 }
431 if (poly.is_zero()) {
432 if (!lifted_factors.empty()) {
435 "zero polynomial requires an empty lifted-factor list",
436 "zassenhaus_combine");
437 }
439 MathResult<std::vector<Polynomial<Rational>>>{{},
441 }
442 if (lifted_factors.empty()) {
443 return zc_finalize(poly, {}, poly.make_monic(),
445 "no lifted factors were provided");
446 }
447
448 auto validation = zc_validate_lifted_product(
450 if (!validation) return ZassenhausResult::failure(validation.error());
451
453}
static Result< void > zc_validate_lifted_product(const Polynomial< Rational > &poly, const std::vector< Polynomial< BigInt > > &lifted_factors, const BigInt &modulus, ComputationContext &context)
static ZassenhausResult zc_enumerate(const Polynomial< Rational > &poly, const std::vector< Polynomial< BigInt > > &lifted_factors, const BigInt &modulus, ComputationContext &context)
static ZassenhausResult zc_finalize(const Polynomial< Rational > &original, std::vector< Polynomial< Rational > > factors, Polynomial< Rational > remaining, Completeness completeness, std::string reason)

引用了 Complete, context, LMCAS::Result< MathResult< std::vector< Polynomial< Rational > > > >::failure(), Inconclusive, InvalidArgument, LMCAS::Polynomial< CoeffType >::is_zero(), lifted_factors, LMCAS::Polynomial< CoeffType >::make_monic(), reconstruction_modulus, LMCAS::Result< MathResult< std::vector< Polynomial< Rational > > > >::success(), zassenhaus_combine_impl(), zc_enumerate(), zc_finalize() , 以及 zc_validate_lifted_product().

被这些函数引用 zassenhaus_combine_checked() , 以及 zassenhaus_combine_impl().

函数调用图:
这是这个函数的调用关系图:

◆ zc_bigint_to_rational_poly()

Polynomial< Rational > LMCAS::zc_bigint_to_rational_poly ( const std::vector< BigInt > & coeffs,
const std::string & var )
static

将 BigInt 系数向量转换为有理系数多项式.

每个 BigInt 系数直接转换为 Rational(分母为 1).

参数
[in]coeffsBigInt 系数向量
[in]var变量名
返回
有理系数多项式

在文件 zassenhaus_combine.cpp 第 69 行定义.

71 {
72
73 std::vector<Rational> rat_coeffs;
74 rat_coeffs.reserve(coeffs.size());
75 for (const auto& c : coeffs) {
76 rat_coeffs.emplace_back(c);
77 }
78 return Polynomial<Rational>(rat_coeffs, var);
79}

引用了 c , 以及 zc_bigint_to_rational_poly().

被这些函数引用 zc_bigint_to_rational_poly() , 以及 zc_reconstruct_candidate().

函数调用图:
这是这个函数的调用关系图:

◆ zc_divides_exactly()

bool LMCAS::zc_divides_exactly ( const Polynomial< Rational > & f,
const Polynomial< Rational > & candidate )
static

检验候选因子是否整除原多项式(精确有理除法).

执行多项式带余除法 f / candidate,若余数为零则整除.

参数
[in]f原多项式
[in]candidate候选因子
返回
整除返回 true

在文件 zassenhaus_combine.cpp 第 219 行定义.

221 {
222
223 if (candidate.is_zero()) return false;
224 if (candidate.degree() > f.degree()) return false;
225 if (candidate.degree() == 0) return true;
226
227 auto [quotient, remainder] = f.div_mod(candidate);
228 return remainder.is_zero();
229}

引用了 LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Polynomial< CoeffType >::div_mod(), LMCAS::Polynomial< CoeffType >::is_zero() , 以及 zc_divides_exactly().

被这些函数引用 zc_divides_exactly() , 以及 zc_try_candidate().

函数调用图:
这是这个函数的调用关系图:

◆ zc_enumerate()

ZassenhausResult LMCAS::zc_enumerate ( const Polynomial< Rational > & poly,
const std::vector< Polynomial< BigInt > > & lifted_factors,
const BigInt & modulus,
ComputationContext & context )
static

在文件 zassenhaus_combine.cpp 第 403 行定义.

406 {
407 ZcFactorSearch search{lifted_factors, modulus, context, poly.make_monic(),
408 {}, std::vector<size_t>(lifted_factors.size())};
409 for (size_t i = 0; i < search.active.size(); ++i) search.active[i] = i;
410 while (search.active.size() > 1 && search.remaining.degree() > 1) {
411 auto found = zc_find_factor(search);
412 if (!found) return ZassenhausResult::failure(found.error());
413 if (!found.value()) break;
414 }
415 return zc_finalize(poly, std::move(search.factors), std::move(search.remaining),
417}
std::vector< Polynomial< Rational > > factors
static Result< bool > zc_find_factor(ZcFactorSearch &search)
Polynomial< Rational > remaining

引用了 LMCAS::ZcFactorSearch::active, Complete, context, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::ZcFactorSearch::factors, LMCAS::Result< MathResult< std::vector< Polynomial< Rational > > > >::failure(), lifted_factors, LMCAS::Polynomial< CoeffType >::make_monic(), LMCAS::ZcFactorSearch::remaining, zc_enumerate(), zc_finalize() , 以及 zc_find_factor().

被这些函数引用 zassenhaus_combine_impl() , 以及 zc_enumerate().

函数调用图:
这是这个函数的调用关系图:

◆ zc_finalize()

ZassenhausResult LMCAS::zc_finalize ( const Polynomial< Rational > & original,
std::vector< Polynomial< Rational > > factors,
Polynomial< Rational > remaining,
Completeness completeness,
std::string reason )
static

在文件 zassenhaus_combine.cpp 第 316 行定义.

321 {
322 if (!remaining.is_zero() && remaining.degree() > 0) {
323 factors.push_back(remaining.make_monic());
324 }
325
326 if (!original.is_zero()) {
327 Polynomial<Rational> product({Rational(1)}, original.variable_name);
328 for (const auto& factor : factors) product = product * factor;
329 if (!(product == original.make_monic())) {
332 "accepted Zassenhaus factors do not reconstruct the polynomial",
333 "zassenhaus_combine");
334 }
335 } else if (!factors.empty()) {
338 "zero polynomial cannot have a nonempty monic factorization",
339 "zassenhaus_combine");
340 }
341
343 MathResult<std::vector<Polynomial<Rational>>>{
344 std::move(factors), completeness, std::move(reason)});
345}

引用了 LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Result< MathResult< std::vector< Polynomial< Rational > > > >::failure(), InternalInvariant, LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::Polynomial< CoeffType >::make_monic(), LMCAS::Result< MathResult< std::vector< Polynomial< Rational > > > >::success(), LMCAS::Polynomial< CoeffType >::variable_name , 以及 zc_finalize().

被这些函数引用 zassenhaus_combine_impl(), zc_enumerate() , 以及 zc_finalize().

函数调用图:
这是这个函数的调用关系图:

◆ zc_find_factor()

Result< bool > LMCAS::zc_find_factor ( ZcFactorSearch & search)
static

在文件 zassenhaus_combine.cpp 第 391 行定义.

391 {
392 for (size_t width = 1; width <= search.active.size() / 2; ++width) {
393 std::vector<size_t> positions(width);
394 for (size_t i = 0; i < width; ++i) positions[i] = i;
395 do {
396 auto candidate = zc_try_candidate(search, positions);
397 if (!candidate || candidate.value()) return candidate;
398 } while (zc_next_combination(positions, search.active.size()));
399 }
400 return Result<bool>::success(false);
401}
static bool zc_next_combination(std::vector< size_t > &positions, size_t count)
static Result< bool > zc_try_candidate(ZcFactorSearch &search, const std::vector< size_t > &positions)

引用了 LMCAS::ZcFactorSearch::active, LMCAS::Result< T >::success(), zc_find_factor(), zc_next_combination() , 以及 zc_try_candidate().

被这些函数引用 zc_enumerate() , 以及 zc_find_factor().

函数调用图:
这是这个函数的调用关系图:

◆ zc_make_primitive()

Polynomial< Rational > LMCAS::zc_make_primitive ( const Polynomial< Rational > & poly)
static

使候选多项式首一化(首项系数归一).

参数
[in]poly输入多项式
返回
首一多项式

在文件 zassenhaus_combine.cpp 第 238 行定义.

238 {
239 if (poly.is_zero()) return poly;
240 return poly.make_monic();
241}

引用了 LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::Polynomial< CoeffType >::make_monic() , 以及 zc_make_primitive().

被这些函数引用 zc_make_primitive() , 以及 zc_try_candidate().

函数调用图:
这是这个函数的调用关系图:

◆ zc_next_combination()

bool LMCAS::zc_next_combination ( std::vector< size_t > & positions,
size_t count )
static

在文件 zassenhaus_combine.cpp 第 243 行定义.

243 {
244 const size_t width = positions.size();
245 for (size_t cursor = width; cursor > 0; --cursor) {
246 const size_t i = cursor - 1;
247 if (positions[i] < count - width + i) {
248 ++positions[i];
249 for (size_t j = i + 1; j < width; ++j) {
250 positions[j] = positions[j - 1] + 1;
251 }
252 return true;
253 }
254 }
255 return false;
256}

引用了 zc_next_combination().

被这些函数引用 zc_find_factor() , 以及 zc_next_combination().

函数调用图:
这是这个函数的调用关系图:

◆ zc_rational_reconstruction()

bool LMCAS::zc_rational_reconstruction ( const BigInt & a,
const BigInt & m,
BigInt & num,
BigInt & den )
static

对 BigInt 系数执行有理数重构.

给定整数 a 和模数 m,使用扩展欧几里得算法寻找有理数 p/q 满足:

  • a == p/q (mod m)
  • |p| <= floor(sqrt(m/2)), |q| <= floor(sqrt(m/2))

当模数超出 int64_t 范围时使用 BigInt 算术;否则委托给 modular_arithmetic.hpp 中的 int64_t 版本以获得更好性能.

参数
[in]a待重构的整数系数(已归约到对称表示)
[in]m模数(正整数,通常为 p^k)
[out]num输出分子
[out]den输出分母
返回
满足界约束且 gcd=1 时返回 true;false 表示重构未决

对于可精确表示的小模数,委托给 int64_t 版本

BigInt 版本的有理重构 将 a 归约到 [0, m)

计算界 bound = floor(sqrt(m/2))

扩展欧几里得算法

确保分母为正

验证界约束

验证 gcd(|p|, q) == 1

在文件 zassenhaus_combine.cpp 第 98 行定义.

102 {
103
104 if (m.is_zero() || m.is_negative()) return false;
105
106 /// 对于可精确表示的小模数,委托给 int64_t 版本
107 const auto a_small = a.try_to_int64();
108 const auto m_small = m.try_to_int64();
109 if (a_small && m_small) {
110 const int64_t a_val = *a_small;
111 const int64_t m_val = *m_small;
112
113 auto reconstructed =
115 if (!reconstructed) return false;
116 const auto [p, q] = reconstructed.value();
117 num = BigInt(static_cast<std::int64_t>(p));
118 den = BigInt(static_cast<std::int64_t>(q));
119 return true;
120 }
121
122 /// BigInt 版本的有理重构
123 /// 将 a 归约到 [0, m)
124 BigInt a_mod = a % m;
125 if (a_mod.is_negative()) {
126 a_mod = a_mod + m;
127 }
128
129 /// 计算界 bound = floor(sqrt(m/2))
130 BigInt half_m = m / BigInt(2);
131 BigInt bound = half_m.sqrt();
132 if (bound.is_zero()) bound = BigInt(1);
133
134 /// 扩展欧几里得算法
135 BigInt r0 = m, r1 = a_mod;
136 BigInt s0 = BigInt(0), s1 = BigInt(1);
137
138 while (r1 > bound) {
139 BigInt q = r0 / r1;
140 BigInt r_new = r0 - q * r1;
141 BigInt s_new = s0 - q * s1;
142
143 r0 = r1;
144 r1 = r_new;
145 s0 = s1;
146 s1 = s_new;
147 }
148
149 BigInt p = r1;
150 BigInt q_val = s1;
151
152 /// 确保分母为正
153 if (q_val.is_negative()) {
154 p = -p;
155 q_val = -q_val;
156 }
157
158 /// 验证界约束
159 if (p.abs() > bound || q_val.is_zero() || q_val > bound) {
160 return false;
161 }
162
163 /// 验证 gcd(|p|, q) == 1
164 BigInt g = BigInt::gcd(p.abs(), q_val);
165 if (g != BigInt(1)) {
166 return false;
167 }
168
169 num = p;
170 den = q_val;
171 return true;
172}

引用了 a, LMCAS::polynomial_solver_detail::num(), rational_reconstruction_checked() , 以及 zc_rational_reconstruction().

被这些函数引用 zc_rational_reconstruction() , 以及 zc_reconstruct_candidate().

函数调用图:
这是这个函数的调用关系图:

◆ zc_reconstruct_candidate()

Polynomial< Rational > LMCAS::zc_reconstruct_candidate ( const std::vector< BigInt > & product_coeffs,
const BigInt & mod,
const std::string & var )
static

对子集乘积的所有系数执行有理重构,构造有理系数多项式.

对 product_coeffs 中的每个 BigInt 系数调用 zc_rational_reconstruction, 若所有系数均成功重构,则返回对应的有理系数多项式. 若任一系数重构失败,则回退到整数系数直接转换.

参数
[in]product_coeffs子集乘积的 BigInt 系数向量(对称表示)
[in]mod模数 p^k
[in]var变量名
返回
有理系数多项式(通过有理重构或整数直接转换)

尝试对每个系数执行有理重构

任一系数重构失败,回退到整数系数

在文件 zassenhaus_combine.cpp 第 187 行定义.

190 {
191
192 std::vector<Rational> rat_coeffs;
193 rat_coeffs.reserve(product_coeffs.size());
194
195 /// 尝试对每个系数执行有理重构
196 for (const auto& c : product_coeffs) {
197 BigInt num, den;
198 if (zc_rational_reconstruction(c, mod, num, den)) {
199 rat_coeffs.emplace_back(num, den);
200 } else {
201 /// 任一系数重构失败,回退到整数系数
202 return zc_bigint_to_rational_poly(product_coeffs, var);
203 }
204 }
205
206 return Polynomial<Rational>(rat_coeffs, var);
207}
static Polynomial< Rational > zc_bigint_to_rational_poly(const std::vector< BigInt > &coeffs, const std::string &var)
将 BigInt 系数向量转换为有理系数多项式.
static bool zc_rational_reconstruction(const BigInt &a, const BigInt &m, BigInt &num, BigInt &den)
对 BigInt 系数执行有理数重构.

引用了 c, LMCAS::polynomial_solver_detail::num(), zc_bigint_to_rational_poly(), zc_rational_reconstruction() , 以及 zc_reconstruct_candidate().

被这些函数引用 zc_reconstruct_candidate() , 以及 zc_try_candidate().

函数调用图:
这是这个函数的调用关系图:

◆ zc_select_indices()

std::vector< size_t > LMCAS::zc_select_indices ( const std::vector< size_t > & active,
const std::vector< size_t > & positions )
static

在文件 zassenhaus_combine.cpp 第 258 行定义.

260 {
261 std::vector<size_t> indices;
262 indices.reserve(positions.size());
263 for (size_t position : positions) indices.push_back(active[position]);
264 return indices;
265}

引用了 zc_select_indices().

被这些函数引用 zc_select_indices() , 以及 zc_try_candidate().

函数调用图:
这是这个函数的调用关系图:

◆ zc_subset_product()

Result< std::vector< BigInt > > LMCAS::zc_subset_product ( const std::vector< Polynomial< BigInt > > & lifted_factors,
const std::vector< size_t > & indices,
const BigInt & mod,
ComputationContext & context )
static

在模 m 下乘以按字典序枚举的提升因子子集.

在文件 zassenhaus_combine.cpp 第 22 行定义.

26 {
27 std::vector<BigInt> product = {BigInt(1)};
28
29 for (size_t index : indices) {
30 auto step = context.consume_steps(1, "zassenhaus_combine");
31 if (!step) {
32 return Result<std::vector<BigInt>>::failure(step.error());
33 }
34 if (index >= lifted_factors.size() ||
35 lifted_factors[index].coeffs.empty()) {
36 return Result<std::vector<BigInt>>::failure(
37 CasErrc::InvalidArgument, "invalid lifted-factor index or zero factor",
38 "zassenhaus_combine");
39 }
40 const auto& factor_coeffs = lifted_factors[index].coeffs;
41 std::vector<BigInt> next(product.size() + factor_coeffs.size() - 1,
42 BigInt(0));
43 for (size_t i = 0; i < product.size(); ++i) {
44 if (product[i].is_zero()) continue;
45 for (size_t j = 0; j < factor_coeffs.size(); ++j) {
46 if (factor_coeffs[j].is_zero()) continue;
47 next[i + j] = next[i + j] + product[i] * factor_coeffs[j];
48 }
49 }
50 for (auto& coefficient : next) {
51 coefficient = detail::symmetric_remainder(coefficient, mod);
52 }
53 while (!next.empty() && next.back().is_zero()) next.pop_back();
54 product = std::move(next);
55 }
56 return Result<std::vector<BigInt>>::success(std::move(product));
57}

引用了 context, InvalidArgument, lifted_factors, LMCAS::detail::symmetric_remainder() , 以及 zc_subset_product().

被这些函数引用 zc_subset_product(), zc_try_candidate() , 以及 zc_validate_lifted_product().

函数调用图:
这是这个函数的调用关系图:

◆ zc_try_candidate()

Result< bool > LMCAS::zc_try_candidate ( ZcFactorSearch & search,
const std::vector< size_t > & positions )
static

在文件 zassenhaus_combine.cpp 第 356 行定义.

357 {
358 auto step = search.context.consume_steps(1, "zassenhaus_combine");
359 if (!step) {
360 return Result<bool>::failure(step.error());
361 }
362 auto indices = zc_select_indices(search.active, positions);
363 auto product = zc_subset_product(
364 search.lifted, indices, search.modulus, search.context);
365 if (!product) {
366 return Result<bool>::failure(product.error());
367 }
368 if (product.value().empty()) return Result<bool>::success(false);
370 product.value(), search.modulus, search.remaining.variable_name));
371 if (candidate.is_zero() || candidate.degree() <= 0 ||
372 candidate.degree() >= search.remaining.degree() ||
373 !zc_divides_exactly(search.remaining, candidate)) {
374 return Result<bool>::success(false);
375 }
376 auto [quotient, remainder] = search.remaining.div_mod(candidate);
377 if (!remainder.is_zero()) {
379 CasErrc::InternalInvariant, "exact divisor produced a nonzero remainder",
380 "zassenhaus_combine");
381 }
382 search.factors.push_back(candidate);
383 search.remaining = std::move(quotient);
384 for (size_t cursor = positions.size(); cursor > 0; --cursor) {
385 search.active.erase(search.active.begin() +
386 static_cast<std::ptrdiff_t>(positions[cursor - 1]));
387 }
388 return Result<bool>::success(true);
389}
Result< void > consume_steps(std::size_t amount=1, const std::string &operation={})
const std::vector< Polynomial< BigInt > > & lifted
static Polynomial< Rational > zc_make_primitive(const Polynomial< Rational > &poly)
使候选多项式首一化(首项系数归一).
static bool zc_divides_exactly(const Polynomial< Rational > &f, const Polynomial< Rational > &candidate)
检验候选因子是否整除原多项式(精确有理除法).
static Polynomial< Rational > zc_reconstruct_candidate(const std::vector< BigInt > &product_coeffs, const BigInt &mod, const std::string &var)
对子集乘积的所有系数执行有理重构,构造有理系数多项式.
static std::vector< size_t > zc_select_indices(const std::vector< size_t > &active, const std::vector< size_t > &positions)
static Result< std::vector< BigInt > > zc_subset_product(const std::vector< Polynomial< BigInt > > &lifted_factors, const std::vector< size_t > &indices, const BigInt &mod, ComputationContext &context)
在模 m 下乘以按字典序枚举的提升因子子集.

引用了 LMCAS::ZcFactorSearch::active, LMCAS::ComputationContext::consume_steps(), LMCAS::ZcFactorSearch::context, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Polynomial< CoeffType >::div_mod(), LMCAS::ZcFactorSearch::factors, LMCAS::Result< T >::failure(), InternalInvariant, LMCAS::ZcFactorSearch::lifted, LMCAS::ZcFactorSearch::modulus, LMCAS::ZcFactorSearch::remaining, LMCAS::Result< T >::success(), LMCAS::Polynomial< CoeffType >::variable_name, zc_divides_exactly(), zc_make_primitive(), zc_reconstruct_candidate(), zc_select_indices(), zc_subset_product() , 以及 zc_try_candidate().

被这些函数引用 zc_find_factor() , 以及 zc_try_candidate().

函数调用图:
这是这个函数的调用关系图:

◆ zc_validate_lifted_product()

Result< void > LMCAS::zc_validate_lifted_product ( const Polynomial< Rational > & poly,
const std::vector< Polynomial< BigInt > > & lifted_factors,
const BigInt & modulus,
ComputationContext & context )
static

在文件 zassenhaus_combine.cpp 第 267 行定义.

271 {
272 if (lifted_factors.empty()) {
273 return Result<void>::success();
274 }
275
276 std::vector<size_t> all_indices(lifted_factors.size());
277 for (size_t i = 0; i < all_indices.size(); ++i) {
278 all_indices[i] = i;
279 }
280 auto product_result =
281 zc_subset_product(lifted_factors, all_indices, modulus, context);
282 if (!product_result) {
283 return Result<void>::failure(product_result.error());
284 }
285 auto product = std::move(product_result.value());
286
287 BigInt denominator_lcm(1);
288 for (const Rational& coefficient : poly.coeffs) {
289 denominator_lcm =
290 BigInt::lcm(denominator_lcm, coefficient.get_denominator());
291 }
292 std::vector<BigInt> expected;
293 expected.reserve(poly.coeffs.size());
294 for (const Rational& coefficient : poly.coeffs) {
295 BigInt integer_coefficient =
296 coefficient.get_numerator() *
297 (denominator_lcm / coefficient.get_denominator());
298 expected.push_back(
299 detail::symmetric_remainder(integer_coefficient, modulus));
300 }
301 while (!expected.empty() && expected.back().is_zero()) {
302 expected.pop_back();
303 }
304 while (!product.empty() && product.back().is_zero()) {
305 product.pop_back();
306 }
307 if (!(product == expected)) {
310 "lifted factors are not congruent to the normalized polynomial",
311 "zassenhaus_combine");
312 }
313 return Result<void>::success();
314}

引用了 LMCAS::Polynomial< CoeffType >::coeffs, context, LMCAS::Result< T >::failure(), InvalidArgument, lifted_factors, LMCAS::Result< T >::success(), LMCAS::detail::symmetric_remainder(), zc_subset_product() , 以及 zc_validate_lifted_product().

被这些函数引用 zassenhaus_combine_impl() , 以及 zc_validate_lifted_product().

函数调用图:
这是这个函数的调用关系图:

◆ zero_remainder()

bool LMCAS::zero_remainder ( const detail::SymbolicNodePtr & value,
detail::RewriteBudget & budget )
static

在文件 integration_linearity.cpp 第 68 行定义.

68 {
69 detail::RewriteScope scope(&budget);
70 if (value->is_zero()) { return true; }
71 const auto* piecewise = dynamic_cast<const PiecewiseNode*>(value.get());
72 if (!piecewise) { return false; }
73 for (const auto& branch : piecewise->branches()) {
74 if (!zero_remainder(branch.expression, budget)) { return false; }
75 }
76 return !piecewise->default_expr() || zero_remainder(piecewise->default_expr(), budget);
77}
static bool zero_remainder(const detail::SymbolicNodePtr &value, detail::RewriteBudget &budget)

引用了 LMCAS::PiecewiseNode::default_expr(), value , 以及 zero_remainder().

被这些函数引用 zero_remainder().

函数调用图:
这是这个函数的调用关系图:

◆ zt_abs_expr()

std::shared_ptr< SymbolicExpr > LMCAS::zt_abs_expr ( const std::shared_ptr< SymbolicExpr > & expr)
static

在文件 transform_z.cpp 第 74 行定义.

74 {
75 if (!expr || !LMCAS::detail::node(expr)) return nullptr;
79 std::vector<std::shared_ptr<const SymbolicNode>>{LMCAS::detail::node(expr)}));
80}

引用了 LMCAS::FunctionNode::Abs, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node() , 以及 zt_abs_expr().

被这些函数引用 zt_abs_expr(), zt_base_roc() , 以及 zt_unit_roc().

函数调用图:
这是这个函数的调用关系图:

◆ zt_base_roc()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::zt_base_roc ( const std::shared_ptr< SymbolicExpr > & base,
const std::string & z )
static

在文件 transform_z.cpp 第 89 行定义.

91 {
92 auto condition = te_gt_condition(zt_abs_expr(SymbolicExpr::variable(z)),
93 zt_abs_expr(base));
94 return condition ? std::vector<std::shared_ptr<SymbolicExpr>>{condition}
95 : std::vector<std::shared_ptr<SymbolicExpr>>{};
96}
static std::shared_ptr< SymbolicExpr > zt_abs_expr(const std::shared_ptr< SymbolicExpr > &expr)

引用了 LMCAS::transform_detail::te_gt_condition(), zt_abs_expr() , 以及 zt_base_roc().

被这些函数引用 zt_base_roc() , 以及 zt_lookup_roc().

函数调用图:
这是这个函数的调用关系图:

◆ zt_exponential()

std::shared_ptr< SymbolicExpr > LMCAS::zt_exponential ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & n,
const std::shared_ptr< SymbolicExpr > & z,
ComputationContext & context )
static

在文件 transform_z.cpp 第 149 行定义.

151 {
152
153 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
154 (context).limits().max_ast_nodes, "transform");
155 std::shared_ptr<SymbolicExpr> base;
156 const bool plain = zt_is_exp_seq(f, n, base);
157 if (!plain && !zt_is_weighted_exp(f, n, base)) return nullptr;
158 auto difference = SymbolicExpr::add(z, SymbolicExpr::multiply(SymbolicExpr::number(-1), base));
159 if (plain) return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(z, difference)), transform_budget));
160 auto denominator = SymbolicExpr::power(difference, SymbolicExpr::number(2));
161 return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(SymbolicExpr::multiply(base, z), denominator)), transform_budget));
162}
static bool zt_is_weighted_exp(const std::shared_ptr< SymbolicExpr > &f, const std::string &n, std::shared_ptr< SymbolicExpr > &base)
static bool zt_is_exp_seq(const std::shared_ptr< SymbolicExpr > &f, const std::string &n, std::shared_ptr< SymbolicExpr > &base_out)

引用了 context, denominator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), zt_exponential(), zt_is_exp_seq() , 以及 zt_is_weighted_exp().

被这些函数引用 z_transform_core() , 以及 zt_exponential().

函数调用图:
这是这个函数的调用关系图:

◆ zt_is_exp_seq()

bool LMCAS::zt_is_exp_seq ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & n,
std::shared_ptr< SymbolicExpr > & base_out )
static

在文件 transform_z.cpp 第 9 行定义.

10 {
11 if (!f || !detail::node(f)) {
12 return false;
13 }
14 auto power = std::dynamic_pointer_cast<const PowerNode>(detail::node(f));
15 if (!power) {
16 return false;
17 }
18 auto exponent = std::dynamic_pointer_cast<const VariableNode>(power->exponent());
19 if (!exponent || exponent->is_constant() || exponent->name() != n) {
20 return false;
21 }
22 auto base = detail::make_expression_ptr(power->base());
23 if (te_depends_on(base, n)) {
24 return false;
25 }
26 base_out = base;
27 return true;
28}

引用了 exponent, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::transform_detail::te_depends_on() , 以及 zt_is_exp_seq().

被这些函数引用 zt_exponential(), zt_is_exp_seq(), zt_is_weighted_exp() , 以及 zt_lookup_roc().

函数调用图:
这是这个函数的调用关系图:

◆ zt_is_weighted_exp()

bool LMCAS::zt_is_weighted_exp ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & n,
std::shared_ptr< SymbolicExpr > & base )
static

在文件 transform_z.cpp 第 30 行定义.

32 {
33 auto product = std::dynamic_pointer_cast<const MultiplyNode>(detail::node(f));
34 if (!product || product->operands().size() != 2) {
35 return false;
36 }
37 for (std::size_t i = 0; i < 2; ++i) {
38 auto variable = std::dynamic_pointer_cast<const VariableNode>(product->operands()[i]);
39 auto other = detail::make_expression_ptr(product->operands()[1 - i]);
40 if (variable && !variable->is_constant() && variable->name() == n &&
41 zt_is_exp_seq(other, n, base)) {
42 return true;
43 }
44 }
45 return false;
46}

引用了 LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), variable, zt_is_exp_seq() , 以及 zt_is_weighted_exp().

被这些函数引用 zt_exponential(), zt_is_weighted_exp() , 以及 zt_lookup_roc().

函数调用图:
这是这个函数的调用关系图:

◆ zt_lookup_roc()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::zt_lookup_roc ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & n,
const std::string & z )
static

在文件 transform_z.cpp 第 98 行定义.

99 {
101 std::shared_ptr<SymbolicExpr> base;
102 if (zt_is_exp_seq(f, n, base) || zt_is_weighted_exp(f, n, base)) return zt_base_roc(base, z);
103 bool is_sin = false;
104 std::shared_ptr<SymbolicExpr> frequency;
105 if (te_is_trig(f, n, is_sin, frequency)) return zt_unit_roc(z);
106 return {};
107}
static std::vector< std::shared_ptr< SymbolicExpr > > zt_base_roc(const std::shared_ptr< SymbolicExpr > &base, const std::string &z)
static std::vector< std::shared_ptr< SymbolicExpr > > zt_unit_roc(const std::string &z)
static ZPolynomialPattern zt_polynomial_pattern(const std::shared_ptr< SymbolicExpr > &f, const std::string &n)

引用了 None, LMCAS::transform_detail::te_is_trig(), zt_base_roc(), zt_is_exp_seq(), zt_is_weighted_exp(), zt_lookup_roc(), zt_polynomial_pattern() , 以及 zt_unit_roc().

被这些函数引用 zt_lookup_roc() , 以及 zt_roc().

函数调用图:
这是这个函数的调用关系图:

◆ zt_polynomial()

std::shared_ptr< SymbolicExpr > LMCAS::zt_polynomial ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & n,
const std::shared_ptr< SymbolicExpr > & z,
const std::string & z_var,
ComputationContext & context )
static

在文件 transform_z.cpp 第 127 行定义.

129 {
130
131 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
132 (context).limits().max_ast_nodes, "transform");
133 auto pattern = zt_polynomial_pattern(f, n);
134 if (pattern == ZPolynomialPattern::None) return nullptr;
135 if (pattern == ZPolynomialPattern::Cubic) {
136 auto square = SymbolicExpr::power(SymbolicExpr::variable(n), SymbolicExpr::number(2));
137 auto quadratic = zt_polynomial(square, n, z, z_var, context);
139 SymbolicExpr::multiply(SymbolicExpr::number(-1), z),
140 detail::make_expression_ptr(detail::differentiate_node(detail::node(quadratic), z_var, transform_budget)))), transform_budget));
141 }
142 auto denominator = SymbolicExpr::power(SymbolicExpr::add(z, SymbolicExpr::number(-1)),
143 SymbolicExpr::number(pattern == ZPolynomialPattern::Linear ? 2 : 3));
144 auto numerator = pattern == ZPolynomialPattern::Linear ? z : SymbolicExpr::multiply(z,
145 SymbolicExpr::add(z, SymbolicExpr::number(1)));
146 return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(numerator, denominator)), transform_budget));
147}

引用了 context, Cubic, denominator, LMCAS::detail::differentiate_node(), Linear, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), None, LMCAS::detail::normalize_node(), z_var, zt_polynomial() , 以及 zt_polynomial_pattern().

被这些函数引用 z_transform_core() , 以及 zt_polynomial().

函数调用图:
这是这个函数的调用关系图:

◆ zt_polynomial_pattern()

ZPolynomialPattern LMCAS::zt_polynomial_pattern ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & n )
static

在文件 transform_z.cpp 第 50 行定义.

51 {
52 auto variable = std::dynamic_pointer_cast<const VariableNode>(detail::node(f));
53 if (variable && !variable->is_constant() && variable->name() == n) {
55 }
56 auto power = std::dynamic_pointer_cast<const PowerNode>(detail::node(f));
57 if (!power) {
59 }
60 variable = std::dynamic_pointer_cast<const VariableNode>(power->base());
61 if (!variable || variable->is_constant() || variable->name() != n) {
63 }
64 auto exponent = std::dynamic_pointer_cast<const NumberNode>(power->exponent());
65 BigInt integer;
68 }
69 if (integer == BigInt(2)) return ZPolynomialPattern::Quadratic;
70 if (integer == BigInt(3)) return ZPolynomialPattern::Cubic;
72}

引用了 Cubic, exponent, integer, Linear, LMCAS::detail::node(), None, Quadratic, try_get_integer_value(), variable , 以及 zt_polynomial_pattern().

被这些函数引用 zt_lookup_roc(), zt_polynomial() , 以及 zt_polynomial_pattern().

函数调用图:
这是这个函数的调用关系图:

◆ zt_roc()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::zt_roc ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & n,
const std::string & z )
static

在文件 transform_z.cpp 第 109 行定义.

110 {
111 if (!f || !detail::node(f)) return {};
112 auto addition = std::dynamic_pointer_cast<const AddNode>(detail::node(f));
113 if (addition) {
114 std::vector<std::shared_ptr<SymbolicExpr>> combined;
115 for (const auto& operand : addition->operands()) {
116 auto conditions = zt_roc(detail::make_expression_ptr(operand), n, z);
117 combined.insert(combined.end(), conditions.begin(), conditions.end());
118 }
119 return combined;
120 }
121 if (!te_depends_on(f, n)) return zt_unit_roc(z);
122 auto [coefficient, body] = te_split_coeff(f, n);
123 if (!coefficient->is_one()) return zt_roc(body, n, z);
124 return zt_lookup_roc(f, n, z);
125}
static std::vector< std::shared_ptr< SymbolicExpr > > zt_lookup_roc(const std::shared_ptr< SymbolicExpr > &f, const std::string &n, const std::string &z)

引用了 LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::transform_detail::te_depends_on(), LMCAS::transform_detail::te_split_coeff(), zt_lookup_roc(), zt_roc() , 以及 zt_unit_roc().

被这些函数引用 z_transform_checked() , 以及 zt_roc().

函数调用图:
这是这个函数的调用关系图:

◆ zt_sum()

std::shared_ptr< SymbolicExpr > LMCAS::zt_sum ( const std::shared_ptr< SymbolicExpr > & f,
const AddNode & addition,
const std::string & n,
const std::string & z,
ComputationContext & context )
static

在文件 transform_z.cpp 第 193 行定义.

195 {
196 std::shared_ptr<SymbolicExpr> result;
197 for (const auto& operand : addition.operands()) {
198 auto transformed = z_transform_core(detail::make_expression_ptr(operand), n, z, context);
199 if (!transformed) return zt_unevaluated(f, n, z);
200 result = result ? SymbolicExpr::add(result, transformed) : transformed;
201 }
202 return result;
203}

引用了 context, LMCAS::detail::make_expression_ptr(), LMCAS::AddNode::operands(), z_transform_core(), zt_sum() , 以及 zt_unevaluated().

被这些函数引用 z_transform_core() , 以及 zt_sum().

函数调用图:
这是这个函数的调用关系图:

◆ zt_trigonometric()

std::shared_ptr< SymbolicExpr > LMCAS::zt_trigonometric ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & n,
const std::shared_ptr< SymbolicExpr > & z,
ComputationContext & context )
static

在文件 transform_z.cpp 第 164 行定义.

166 {
167
168 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
169 (context).limits().max_ast_nodes, "transform");
170 bool is_sin = false;
171 std::shared_ptr<SymbolicExpr> frequency;
172 if (!te_is_trig(f, n, is_sin, frequency)) return nullptr;
173 auto cosine = SymbolicExpr::cos(frequency);
174 auto cross = SymbolicExpr::multiply(SymbolicExpr::multiply(SymbolicExpr::number(-2), z), cosine);
175 auto denominator = SymbolicExpr::add(SymbolicExpr::add(
176 SymbolicExpr::power(z, SymbolicExpr::number(2)), cross), SymbolicExpr::number(1));
177 auto factor = is_sin ? SymbolicExpr::sin(frequency) : SymbolicExpr::add(z,
178 SymbolicExpr::multiply(SymbolicExpr::number(-1), cosine));
179 return detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(SymbolicExpr::multiply(z, factor), denominator)), transform_budget));
180}

引用了 context, denominator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::transform_detail::te_is_trig() , 以及 zt_trigonometric().

被这些函数引用 z_transform_core() , 以及 zt_trigonometric().

函数调用图:
这是这个函数的调用关系图:

◆ zt_unevaluated()

std::shared_ptr< SymbolicExpr > LMCAS::zt_unevaluated ( const std::shared_ptr< SymbolicExpr > & f,
const std::string & n,
const std::string & z )
static

在文件 transform_z.cpp 第 182 行定义.

引用了 LMCAS::SymbolicFactory::create_variable(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), zt_unevaluated() , 以及 LMCAS::TransformNode::ZTransform.

被这些函数引用 z_transform_core(), zt_sum() , 以及 zt_unevaluated().

函数调用图:
这是这个函数的调用关系图:

◆ zt_unit_roc()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::zt_unit_roc ( const std::string & z)
static

在文件 transform_z.cpp 第 82 行定义.

82 {
83 auto condition = te_gt_condition(zt_abs_expr(SymbolicExpr::variable(z)),
84 SymbolicExpr::number(1));
85 return condition ? std::vector<std::shared_ptr<SymbolicExpr>>{condition}
86 : std::vector<std::shared_ptr<SymbolicExpr>>{};
87}

引用了 LMCAS::transform_detail::te_gt_condition(), zt_abs_expr() , 以及 zt_unit_roc().

被这些函数引用 zt_lookup_roc(), zt_roc() , 以及 zt_unit_roc().

函数调用图:
这是这个函数的调用关系图:

变量说明

◆ a

const std::string const std::shared_ptr< SymbolicExpr > & LMCAS::a

在文件 vector_calculus_curves.hpp 第 50 行定义.

被这些函数引用 LMCAS::detail::ExactBoundArithmetic::add(), add_number_nodes(), add_numbers(), LMCAS::groebner_detail::add_poly(), LMCAS::groebner_detail::align_variables(), LMCAS::detail::inequality_support::append_affine_root(), LMCAS::detail::inequality_support::append_quadratic_roots(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::arc_length_checked_impl(), arc_length_x_checked(), arc_length_x_checked(), arc_length_y_checked(), arc_length_y_checked(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::arithmetic(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::arithmetic_budget(), assemble_frobenius_polynomial(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::binary_logical_truth(), LMCAS::berlekamp_detail::bk_div_mod(), LMCAS::berlekamp_detail::bk_gcd_mod(), LMCAS::berlekamp_detail::bk_mod_inverse(), LMCAS::berlekamp_detail::bk_poly_mul_mod(), LMCAS::calculus_utils_detail::calculus_utils_expr_equal(), calculus_utils_try_symbolic_definite(), LMCAS::calculus_utils_detail::calculus_utils_validate_expr_bounds(), LMCAS::detail::definite::certify_continuity_checked(), LMCAS::modular_detail::checked_positive_product(), choose_main_variable(), classify_hessian_pair(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::combine(), LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::comparable_surd(), LMCAS::detail::definite::compare_boundaries(), LMCAS::MonomialOrder::compare_deglex(), LMCAS::MonomialOrder::compare_grevlex(), LMCAS::MonomialOrder::compare_lex(), complex_add_checked(), complex_add_checked(), complex_div_checked(), complex_div_checked(), complex_locus_circle_checked(), complex_locus_circle_checked(), complex_locus_perpendicular_bisector_checked(), complex_locus_perpendicular_bisector_checked(), complex_mul_checked(), complex_mul_checked(), complex_sub_checked(), complex_sub_checked(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::conjunction(), cross_product(), cross_product_impl(), curve_integral_scalar(), curve_integral_scalar_checked(), curve_integral_scalar_checked(), LMCAS::vector_calculus_detail::curve_integral_scalar_strict(), curve_integral_vector(), curve_integral_vector_checked(), curve_integral_vector_checked(), LMCAS::vector_calculus_detail::curve_integral_vector_strict(), deduplicate_roots(), LMCAS::detail::definite::definite_partition_checked(), LMCAS::detail::definite::definite_segment_checked(), LMCAS::detail::detect_difference_of_squares(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::disjunction(), LMCAS::NormalizationVisitor::distribute_product(), LMCAS::detail::ExactBoundArithmetic::div(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::divide_complex(), LMCAS::groebner_detail::divides_mono(), dot_product(), dot_product_impl(), LMCAS::detail::definite::evaluate_segment_endpoints(), LMCAS::anonymous_namespace{relation_store.cpp}::expr_equals(), extended_gcd(), extended_gcd_poly(), LMCAS::detail::anonymous_namespace{complex_root_isolation.cpp}::factor_biquadratic(), LMCAS::detail::anonymous_namespace{mixed_transcendental_isolation.cpp}::RootIsolation::finish(), LMCAS::NormalizationVisitor::fuse_matrix_product(), LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::fused_dot_three(), LMCAS::Polynomial< CoeffType >::gcd(), LMCAS::Polynomial< Rational >::gcd(), LMCAS::detail::definite::gcd_checked(), LMCAS::Polynomial< Rational >::gcd_coeff(), gcd_coeff_impl(), greens_theorem_area(), greens_theorem_area_checked(), greens_theorem_area_checked(), LMCAS::vector_calculus_detail::greens_theorem_area_strict(), LMCAS::detail::ExactBoundArithmetic::growth(), hl_mod_inverse(), hl_poly_add_mod(), hl_poly_divmod(), hl_poly_mul_mod(), hl_poly_sub_mod(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::integrate_even_case(), LMCAS::anonymous_namespace{interval_set_operations.cpp}::intersection_candidate(), intervals_overlap_checked_impl(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::jordan_dimensions_match(), kronecker(), lammp_gcd(), LMCAS::groebner_detail::lcm_mono(), lcm_monomial(), LMCAS::detail::ExactBoundArithmetic::less(), LMCAS::integration_table_detail::load_algebraic_radicals_rules(), LMCAS::integration_table_detail::load_algebraic_reciprocals_rules(), LMCAS::integration_table_detail::load_exponential_base_rules(), LMCAS::integration_table_detail::load_exponential_rules(), LMCAS::integration_table_detail::load_scaled_radical_rules(), LMCAS::integration_table_detail::load_scaled_trig_rules(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::logical(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::logical_predicate_truth(), LMCAS::detail::make_integration_entries(), LMCAS::NormalizationVisitor::matrix_product_element(), mixed_product(), mixed_product_impl(), LMCAS::detail::ExactBoundArithmetic::mul(), LMCAS::groebner_detail::mul_mono(), LMCAS::groebner_detail::mul_poly(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::multiply(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::multiply(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::multiply_complex(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::multiply_intervals(), multiply_number_nodes(), multiply_numbers(), LMCAS::Irrational::EnclosureRound::multiply_positive(), LMCAS::anonymous_namespace{inference_engine_product.cpp}::multiply_sign_sets(), multivariate_gcd(), normalization_factor_less(), LMCAS::AddNode::normalize_operands(), LMCAS::detail::ExactBoundArithmetic::operands(), LMCAS::fglm_detail::MonomialEnumerator::HeapCmp::operator()(), LMCAS::groebner_detail::MonomialLess::operator()(), LMCAS::MonomialOrder::operator()(), LMCAS::NodeLess::operator()(), LMCAS::Polynomial< Rational >::operator+(), LMCAS::Polynomial< Rational >::operator-(), LMCAS::detail::definite::ordered_partition_roots(), ordinary_series_recurrence(), plane_general(), LMCAS::detail::definite::polynomial_sign_checked(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::power_bounds(), power_series_add(), power_series_multiply_checked(), power_series_multiply_checked(), LMCAS::detail::definite::prepare_segment_primitive(), LMCAS::detail::definite::product_checked(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::rational_critical_points(), LMCAS::detail::definite::rational_divergence_checked(), rational_gcd(), LMCAS::detail::definite::rational_pole_divergence(), LMCAS::detail::real_quadratic_roots_checked(), recursive_multivariate_gcd(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::relation(), LMCAS::detail::inequality_support::root_less_than(), LMCAS::detail::inequality_support::roots_equal(), scalar_project(), scalar_project_impl(), LMCAS::detail::definite::segment_expression_checked(), LMCAS::anonymous_namespace{property_store.cpp}::signs_conflict(), singular_series_recurrence(), solve_biquadratic(), LMCAS::polynomial_solver_detail::solve_biquadratic_impl(), solve_closed_form_from_poly(), solve_closed_form_poly(), solve_complex_quadratic_checked(), solve_complex_quadratic_checked(), solve_cubic(), LMCAS::polynomial_solver_detail::solve_cubic_impl(), solve_euler_ode_impl(), solve_linear2_homogeneous(), solve_linear2_ode(), solve_linear2_ode_checked(), solve_linear2_ode_checked(), LMCAS::polynomial_solver_detail::solve_quadratic_internal(), solve_quartic(), LMCAS::polynomial_solver_detail::solve_quartic_impl(), LMCAS::detail::inequality_support::solve_symbolic_poly(), LMCAS::detail::ExactBoundArithmetic::sub(), LMCAS::polynomial_solver_detail::sub(), LMCAS::groebner_detail::sub_poly(), LMCAS::anonymous_namespace{normalization_arithmetic.cpp}::sum_term_less(), surface_area_revolution_x_checked(), surface_area_revolution_x_checked(), surface_area_revolution_y_checked(), surface_area_revolution_y_checked(), symbolic_cubic_roots(), LMCAS::polynomial_solver_detail::symbolic_quartic_depression(), te_inv_power(), te_laplace_lookup(), te_laplace_roc(), tf_nodes_equal(), LMCAS::detail::anonymous_namespace{interval_endpoint_order.cpp}::to_algebraic(), LMCAS::NormalizationVisitor::try_normalize_squared_norm(), LMCAS::integration_table_detail::u_is_var_a_indep(), LMCAS::integration_table_detail::u_is_var_a_nonzero(), univariate_gcd(), LMCAS::geometry_detail::validate_same_dimension_vectors(), vector_angle_checked(), vector_angle_checked(), vector_angle_symbolic(), vector_angle_symbolic_impl(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), vector_calculus_definite_integral_strict(), LMCAS::vector_calculus_detail::vector_calculus_integrate_with_fallback(), vector_calculus_numerical_definite(), vector_calculus_try_definite(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_parametrization(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_scalar_inputs(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_vector_inputs(), vector_cross(), vector_cross_checked(), vector_cross_checked(), vector_dot(), vector_dot_checked(), vector_dot_checked(), vector_project(), vector_project_impl(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::verify_jordan_decomposition(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::verify_root(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::volume_of_revolution_checked_impl(), volume_of_revolution_x_checked(), volume_of_revolution_x_checked(), volume_of_revolution_y_checked(), volume_of_revolution_y_checked(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_has_trig_of_var(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_replace() , 以及 zc_rational_reconstruction().

◆ b

const VectorField & LMCAS::b

在文件 multivariate_factor.hpp 第 92 行定义.

被这些函数引用 LMCAS::PowerNode::PowerNode(), LMCAS::ProductNode::ProductNode(), LMCAS::SummationNode::SummationNode(), LMCAS::TransformNode::TransformNode(), LMCAS::detail::ExactBoundArithmetic::add(), add_number_nodes(), add_numbers(), LMCAS::groebner_detail::add_poly(), LMCAS::groebner_detail::align_variables(), LMCAS::detail::inequality_support::append_affine_root(), LMCAS::detail::inequality_support::append_quadratic_roots(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::arc_length_checked_impl(), arc_length_x_checked(), arc_length_x_checked(), arc_length_y_checked(), arc_length_y_checked(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::arithmetic(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::arithmetic_budget(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::binary_logical_truth(), LMCAS::berlekamp_detail::bk_div_mod(), LMCAS::berlekamp_detail::bk_gcd_mod(), LMCAS::berlekamp_detail::bk_poly_mul_mod(), LMCAS::anonymous_namespace{assumption_serialization.cpp}::boundedness_to_string(), LMCAS::calculus_utils_detail::calculus_utils_expr_equal(), calculus_utils_try_symbolic_definite(), LMCAS::calculus_utils_detail::calculus_utils_validate_expr_bounds(), LMCAS::detail::definite::certify_continuity_checked(), LMCAS::modular_detail::checked_positive_product(), choose_main_variable(), classify_hessian_pair(), LMCAS::PiecewiseNode::clone(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::combine(), LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::comparable_surd(), LMCAS::detail::definite::compare_boundaries(), LMCAS::MonomialOrder::compare_deglex(), LMCAS::MonomialOrder::compare_grevlex(), LMCAS::MonomialOrder::compare_lex(), complex_add_checked(), complex_add_checked(), complex_div_checked(), complex_div_checked(), complex_locus_perpendicular_bisector_checked(), complex_locus_perpendicular_bisector_checked(), complex_mul_checked(), complex_mul_checked(), complex_sub_checked(), complex_sub_checked(), LMCAS::PiecewiseNode::compute_hash(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::conjunction(), cross_product(), cross_product_impl(), curve_integral_scalar(), curve_integral_scalar_checked(), curve_integral_scalar_checked(), LMCAS::vector_calculus_detail::curve_integral_scalar_strict(), curve_integral_vector(), curve_integral_vector_checked(), curve_integral_vector_checked(), LMCAS::vector_calculus_detail::curve_integral_vector_strict(), deduplicate_roots(), LMCAS::detail::definite::definite_partition_checked(), LMCAS::detail::definite::definite_segment_checked(), LMCAS::detail::detect_difference_of_squares(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::disjunction(), LMCAS::NormalizationVisitor::distribute_product(), LMCAS::detail::ExactBoundArithmetic::div(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::divide_complex(), LMCAS::groebner_detail::divides_mono(), dot_product(), dot_product_impl(), eliminate_parametric_column(), LMCAS::detail::definite::evaluate_segment_endpoints(), LMCAS::anonymous_namespace{relation_store.cpp}::expr_equals(), extended_gcd(), extended_gcd_poly(), LMCAS::detail::anonymous_namespace{complex_root_isolation.cpp}::factor_biquadratic(), LMCAS::detail::anonymous_namespace{mixed_transcendental_isolation.cpp}::RootIsolation::finish(), LMCAS::NormalizationVisitor::fuse_matrix_product(), LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::fused_dot_three(), LMCAS::Polynomial< CoeffType >::gcd(), LMCAS::Polynomial< Rational >::gcd(), LMCAS::detail::definite::gcd_checked(), LMCAS::Polynomial< Rational >::gcd_coeff(), gcd_coeff_impl(), gram_schmidt(), greens_theorem_area(), greens_theorem_area_checked(), greens_theorem_area_checked(), LMCAS::vector_calculus_detail::greens_theorem_area_strict(), LMCAS::detail::ExactBoundArithmetic::growth(), hl_mignotte_bound(), hl_poly_add_mod(), hl_poly_divmod(), hl_poly_mul_mod(), hl_poly_sub_mod(), hl_two_factor_lift(), LMCAS::anonymous_namespace{interval_set_operations.cpp}::intersection_candidate(), intervals_overlap_checked_impl(), LMCAS::NumberNode::is_positive(), kronecker(), lammp_gcd(), LMCAS::groebner_detail::lcm_mono(), lcm_monomial(), LMCAS::detail::ExactBoundArithmetic::less(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::logical(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::logical_predicate_truth(), LMCAS::detail::make_integration_entries(), LMCAS::NormalizationVisitor::matrix_product_element(), mixed_product(), mixed_product_impl(), LMCAS::detail::ExactBoundArithmetic::mul(), LMCAS::groebner_detail::mul_mono(), LMCAS::groebner_detail::mul_poly(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::multiply(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::multiply(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::multiply_complex(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::multiply_intervals(), multiply_number_nodes(), multiply_numbers(), LMCAS::Irrational::EnclosureRound::multiply_positive(), LMCAS::anonymous_namespace{inference_engine_product.cpp}::multiply_sign_sets(), multivariate_gcd(), normalization_factor_less(), LMCAS::AddNode::normalize_operands(), LMCAS::detail::ExactBoundArithmetic::operands(), LMCAS::fglm_detail::MonomialEnumerator::HeapCmp::operator()(), LMCAS::groebner_detail::MonomialLess::operator()(), LMCAS::MonomialOrder::operator()(), LMCAS::NodeLess::operator()(), LMCAS::Polynomial< Rational >::operator+(), LMCAS::Polynomial< Rational >::operator-(), LMCAS::detail::definite::ordered_partition_roots(), parametric_linear_solution(), plane_general(), LMCAS::detail::definite::polynomial_sign_checked(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::power_bounds(), power_series_add(), power_series_multiply_checked(), power_series_multiply_checked(), LMCAS::detail::definite::prepare_segment_primitive(), LMCAS::detail::definite::product_checked(), LMCAS::ode_root_detail::anonymous_namespace{ode_characteristic_roots.cpp}::quadratic_characteristic_roots(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::rational_critical_points(), LMCAS::detail::definite::rational_divergence_checked(), rational_gcd(), LMCAS::detail::definite::rational_pole_divergence(), LMCAS::detail::real_quadratic_roots_checked(), recursive_multivariate_gcd(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::relation(), LMCAS::detail::inequality_support::root_less_than(), LMCAS::detail::inequality_support::roots_equal(), scalar_project(), scalar_project_impl(), LMCAS::detail::definite::segment_expression_checked(), LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_is_inv_var(), LMCAS::anonymous_namespace{property_store.cpp}::signs_conflict(), solve_biquadratic(), LMCAS::polynomial_solver_detail::solve_biquadratic_impl(), solve_closed_form_from_poly(), solve_closed_form_poly(), solve_complex_quadratic_checked(), solve_complex_quadratic_checked(), solve_cubic(), LMCAS::polynomial_solver_detail::solve_cubic_impl(), solve_degenerate_cubic(), solve_euler_ode_impl(), solve_linear2_homogeneous(), solve_linear2_ode(), solve_linear2_ode_checked(), solve_linear2_ode_checked(), LMCAS::polynomial_solver_detail::solve_quadratic_internal(), solve_quartic(), LMCAS::polynomial_solver_detail::solve_quartic_impl(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::solve_real_quadratic(), LMCAS::detail::inequality_support::solve_symbolic_poly(), LMCAS::detail::ExactBoundArithmetic::sub(), LMCAS::polynomial_solver_detail::sub(), LMCAS::groebner_detail::sub_poly(), LMCAS::anonymous_namespace{normalization_arithmetic.cpp}::sum_term_less(), surface_area_revolution_x_checked(), surface_area_revolution_x_checked(), surface_area_revolution_y_checked(), surface_area_revolution_y_checked(), symbolic_cubic_roots(), LMCAS::polynomial_solver_detail::symbolic_quartic_depression(), LMCAS::transform_detail::te_split_coeff(), tf_nodes_equal(), LMCAS::detail::anonymous_namespace{interval_endpoint_order.cpp}::to_algebraic(), LMCAS::groebner_detail::to_poly(), LMCAS::NormalizationVisitor::try_normalize_squared_norm(), univariate_gcd(), LMCAS::geometry_detail::validate_same_dimension_vectors(), vector_angle_checked(), vector_angle_checked(), vector_angle_symbolic(), vector_angle_symbolic_impl(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), vector_calculus_definite_integral_strict(), LMCAS::vector_calculus_detail::vector_calculus_integrate_with_fallback(), vector_calculus_numerical_definite(), vector_calculus_try_definite(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_parametrization(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_scalar_inputs(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_vector_inputs(), vector_cross(), vector_cross_checked(), vector_cross_checked(), vector_dot(), vector_dot_checked(), vector_dot_checked(), vector_project(), vector_project_impl(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::verify_root(), LMCAS::groebner_detail::PolyBuilder::visit(), LMCAS::groebner_detail::PolyBuilder::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::volume_of_revolution_checked_impl(), volume_of_revolution_x_checked(), volume_of_revolution_x_checked(), volume_of_revolution_y_checked() , 以及 volume_of_revolution_y_checked().

◆ basis

const std::vector<FGLMPoly>& LMCAS::basis

在文件 fglm.hpp 第 102 行定义.

被这些函数引用 LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::ParametricBranchSolver(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::PolynomialSystemSearch(), LMCAS::detail::anonymous_namespace{exact_matrix_solve.cpp}::assemble_linear_solution(), LMCAS::berlekamp_detail::bk_null_space(), LMCAS::groebner_detail::buchberger(), LMCAS::anonymous_namespace{fglm.cpp}::dependent_polynomial(), LMCAS::anonymous_namespace{solver_groebner.cpp}::extend_basis(), gram_schmidt(), LMCAS::groebner_detail::anonymous_namespace{solver_groebner_basis.cpp}::initial_pairs(), LMCAS::groebner_detail::anonymous_namespace{solver_groebner_basis.cpp}::initialize_sugar(), is_zero_dimensional(), LMCAS::fglm_detail::leading_monomials(), linear2_root_basis(), LMCAS::groebner_detail::anonymous_namespace{solver_groebner_basis.cpp}::minimal_basis(), normal_form(), LMCAS::detail::nullspace_exact(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::parametric_basis(), quotient_dimension(), LMCAS::anonymous_namespace{solver_groebner.cpp}::reconstruct_basis(), LMCAS::groebner_detail::reduce_basis(), LMCAS::anonymous_namespace{fglm_polynomial.cpp}::reduce_leading_term(), LMCAS::groebner_detail::reduced_groebner_basis_impl(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::simplified_basis() , 以及 LMCAS::anonymous_namespace{solver_groebner_system.cpp}::solve_polynomial_system_impl().

◆ binding

const Binding & LMCAS::binding

在文件 expr.hpp 第 303 行定义.

被这些函数引用 binding(), expr_match() , 以及 substitute().

◆ bindings

◆ c

const VectorField const VectorField& LMCAS::c

在文件 vector_calculus_vectors.hpp 第 60 行定义.

被这些函数引用 LMCAS::MatrixNode::MatrixNode(), LMCAS::MatrixNode::MatrixNode(), LMCAS::Polynomial< Rational >::Polynomial(), LMCAS::Polynomial< Rational >::Polynomial(), LMCAS::groebner_detail::add_poly(), LMCAS::groebner_detail::Poly::add_term(), LMCAS::fglm_detail::GaussianEliminator::add_vector(), LMCAS::detail::inequality_support::append_quadratic_roots(), berlekamp_factor(), LMCAS::berlekamp_detail::bk_gcd_mod(), LMCAS::berlekamp_detail::bk_reduce_to_mod_coeffs(), LMCAS::berlekamp_detail::bk_split_one_factor(), bk_to_poly_modint(), classify_hessian_pair(), classify_higher_order_ode(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::compatible_periodic_conditions(), LMCAS::MatrixNode::create_storage_from_grid(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::deduplicate_candidates(), LMCAS::Polynomial< Rational >::differentiate(), diophantine_target(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::divide_complex(), extended_gcd_poly(), LMCAS::detail::anonymous_namespace{complex_root_isolation.cpp}::factor_biquadratic(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::find_interval_comma(), LMCAS::Polynomial< CoeffType >::gcd(), LMCAS::MatrixNode::get(), hensel_lift_checked(), hl_extended_gcd_poly(), hl_l2_norm_squared(), hl_reduce_coeffs(), hl_two_factor_lift(), LMCAS::detail::transcendental::invert_exp_base(), LMCAS::detail::transcendental::invert_lambert_w(), is_constant_coefficient(), LMCAS::expr_detail::ExprParser::is_ident_continue(), LMCAS::expr_detail::ExprParser::is_ident_start(), LMCAS::assumption_detail::is_serialized_numeric_atom(), lagrange_basis_coefficients(), LMCAS::Polynomial< Rational >::make_monic(), LMCAS::expr_detail::ExprParser::match(), matrix_reflection_checked(), matrix_rotation_checked(), mixed_product(), mixed_product_impl(), LMCAS::groebner_detail::mul_poly_term(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::multiply_complex(), operator<<(), LMCAS::detail::parse_finite_decimal(), LMCAS::assumption_detail::AssumptionParser::parse_monotonicity(), plane_general(), LMCAS::Polynomial< CoeffType >::primitive_part(), LMCAS::Polynomial< CoeffType >::pseudo_div_mod(), LMCAS::ode_root_detail::anonymous_namespace{ode_characteristic_roots.cpp}::quadratic_characteristic_roots(), rational_to_symbolic_poly(), LMCAS::anonymous_namespace{integration_rational_coefficients.cpp}::rd_fill_factor_columns(), LMCAS::anonymous_namespace{integration_rational_collection.cpp}::rd_normalize_fraction(), LMCAS::detail::real_quadratic_roots_checked(), solve_biquadratic(), LMCAS::polynomial_solver_detail::solve_biquadratic_impl(), solve_closed_form_from_poly(), LMCAS::detail::solve_coefficients(), solve_complex_nth_root_checked(), solve_complex_nth_root_checked(), solve_complex_quadratic_checked(), solve_complex_quadratic_checked(), solve_cubic(), LMCAS::polynomial_solver_detail::solve_cubic_impl(), solve_degenerate_cubic(), solve_euler_ode_impl(), solve_linear2_homogeneous(), solve_linear2_ode(), solve_linear2_ode_checked(), solve_linear2_ode_checked(), LMCAS::polynomial_solver_detail::solve_quadratic_internal(), solve_quartic(), LMCAS::polynomial_solver_detail::solve_quartic_impl(), LMCAS::groebner_detail::sub_poly(), symbolic_cubic_roots(), LMCAS::polynomial_solver_detail::symbolic_quartic_depression(), LMCAS::transform_detail::te_split_coeff(), tf_build_polynomial_impl(), LMCAS::MatrixNode::validate_dense_storage(), LMCAS::MatrixNode::validate_sparse_storage(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::verify_root(), LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit(), zc_bigint_to_rational_poly() , 以及 zc_reconstruct_candidate().

◆ context

const SymbolicExpr ComputationContext & LMCAS::context

在文件 exact_factorization.hpp 第 65 行定义.

被这些函数引用 LMCAS::assumption_detail::AssumptionParser::AssumptionParser(), LMCAS::anonymous_namespace{integration_definite.cpp}::DefiniteInterval::DefiniteInterval(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::FormalResidual(), LMCAS::InferenceEngine::Impl::Impl(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::MixedRootCollection(), LMCAS::NormalizationVisitor::NormalizationVisitor(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::ParametricBranchSolver(), LMCAS::anonymous_namespace{inference_engine_periodicity.cpp}::PeriodInference::PeriodInference(), LMCAS::groebner_detail::PolyContext::PolyContext(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::PolynomialSystemSearch(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::Reader(), LMCAS::serialization_detail::Recursion::Recursion(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::RecursionFrame::RecursionFrame(), LMCAS::anonymous_namespace{numeric_evaluation.cpp}::RecursionScope::RecursionScope(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::RecursionScope::RecursionScope(), LMCAS::anonymous_namespace{residual_verification.cpp}::ResidualRecursionScope::ResidualRecursionScope(), LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::SideBranchRewriter(), LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::Writer(), __attribute__(), abs(), abs(), LMCAS::InferenceEngine::Impl::absolute_domain(), LMCAS::InferenceEngine::Impl::absolute_sign(), LMCAS::InferenceEngine::Impl::accumulate_product_sign(), LMCAS::anonymous_namespace{integration_definite.cpp}::accumulate_segments(), LMCAS::InferenceEngine::Impl::accumulate_sum_relation_sign(), acos(), acos(), adaptive_simpson_numeric(), adaptive_simpson_numeric(), add(), add(), add_fourier_harmonic(), alternating_sequence_bound(), analytic_continuation(), any_nonreal_sqrt(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::append_exact_factor_roots(), append_factor_solutions(), LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::append_symbolic_plane_edges(), LMCAS::anonymous_namespace{newton_raphson.cpp}::append_verified_root(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::apply_profile(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::arc_length_checked_impl(), arc_length_x_checked(), arc_length_x_checked(), arc_length_y_checked(), arc_length_y_checked(), LMCAS::InferenceEngine::Impl::arctangent_domain(), asin(), asin(), LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::assemble_plane(), asymptote_candidates(), asymptotes_checked(), asymptotes_checked(), asymptotic_expand(), atan(), atan(), attach_unit(), attach_unit(), bisection_checked(), bisection_checked(), LMCAS::anonymous_namespace{property_store.cpp}::bounded_interval_candidate(), LMCAS::anonymous_namespace{univariate_factor_bridge.cpp}::bridge_append_repeated(), LMCAS::anonymous_namespace{univariate_factor_bridge.cpp}::bridge_factor(), LMCAS::anonymous_namespace{univariate_factor_bridge.cpp}::bridge_lift_and_combine(), LMCAS::anonymous_namespace{univariate_factor_bridge.cpp}::bridge_lift_bound(), LMCAS::anonymous_namespace{univariate_factor_bridge.cpp}::bridge_reduction(), LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::build_plane_edges(), calculate_residue_checked(), calculate_residue_checked(), calculate_residue_impl(), calculus_utils_contains_nonreal_sqrt(), calculus_utils_extract_real_candidate(), calculus_utils_oblique_from_rational(), calculus_utils_product(), calculus_utils_split_rational(), calculus_utils_try_symbolic_definite(), LMCAS::calculus_utils_detail::calculus_utils_validate_expr(), LMCAS::calculus_utils_detail::calculus_utils_validate_expr_bounds(), LMCAS::calculus_utils_detail::calculus_utils_validate_expr_target(), LMCAS::calculus_utils_detail::calculus_utils_validate_two_exprs(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::cancel_polynomial_gcd(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::cancel_variable(), cauchy_integral_checked(), cauchy_integral_checked(), cauchy_integral_impl(), ceil(), ceil(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::certified_jordan(), LMCAS::anonymous_namespace{integration_definite.cpp}::certify_partition(), check_equivalent(), LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::check_plane_normal_nonzero(), LMCAS::anonymous_namespace{residual_verification.cpp}::check_residual_coefficient(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::check_term_budget(), LMCAS::anonymous_namespace{poly_utils.cpp}::check_zero_power_base(), check_zero_residual(), LMCAS::anonymous_namespace{quantity.cpp}::checked_binary(), checked_derivative(), checked_inference_result(), LMCAS::anonymous_namespace{interval_set_operations.cpp}::checked_interval_views(), LMCAS::geometry_detail::checked_nonzero_numeric_or_exact(), LMCAS::geometry_detail::checked_nonzero_numeric_vector(), cholesky_decomposition_checked(), cholesky_decomposition_checked(), christoffel_first_kind_checked(), christoffel_first_kind_checked(), christoffel_first_kind_impl(), christoffel_second_kind_checked(), christoffel_second_kind_checked(), christoffel_second_kind_impl(), clamp(), clamp(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::classify_constant_equation(), LMCAS::anonymous_namespace{calculus_continuity.cpp}::classify_continuity_point_value(), classify_first_order_ode(), classify_hessian_eigenvalues(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_function(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_power(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_product(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_sum(), classify_inflection_candidates(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_limit_result(), classify_quadratic_form(), classify_quadric_checked(), classify_quadric_checked(), classify_ratio_limit(), LMCAS::anonymous_namespace{residual_verification.cpp}::classify_residual(), classify_singular_point_checked(), classify_singular_point_checked(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::clear_denominators(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::coalesce_periodic_families(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::coalesce_periodic_pair(), coefficient_power_radius(), collect_bernoulli_coefficients(), collect_exact_solutions(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::collect_fraction_terms(), collect_infinite_asymptotes(), LMCAS::anonymous_namespace{interval_normalization.cpp}::collect_nonempty_intervals(), collect_oblique_asymptote(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::collect_polynomial_operands(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::collect_polynomial_variables(), LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::collect_variables(), collect_vertical_asymptotes(), LMCAS::anonymous_namespace{normalization_products.cpp}::collectable_power_exponent(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::combine_fraction_terms(), LMCAS::anonymous_namespace{limit_result.cpp}::combine_one_sided_limits(), LMCAS::anonymous_namespace{residual_comparison.cpp}::compare_defined_values(), LMCAS::expr_detail::expr_common::comparison_value(), complex_abs_checked(), complex_abs_checked(), complex_add_checked(), complex_add_checked(), complex_arg_checked(), complex_arg_checked(), complex_conj_checked(), complex_conj_checked(), complex_div_checked(), complex_div_checked(), complex_exp_form_checked(), complex_exp_form_checked(), complex_locus_circle_checked(), complex_locus_circle_checked(), complex_locus_perpendicular_bisector_checked(), complex_locus_perpendicular_bisector_checked(), complex_mul_checked(), complex_mul_checked(), LMCAS::anonymous_namespace{limit_result.cpp}::complex_polynomial_nonzero(), LMCAS::anonymous_namespace{limit_result.cpp}::complex_punctured_condition(), LMCAS::anonymous_namespace{limit_result.cpp}::complex_punctured_domain(), complex_sub_checked(), complex_sub_checked(), complex_trig_form_checked(), complex_trig_form_checked(), LMCAS::InferenceEngine::Impl::composite_integer(), LMCAS::InferenceEngine::Impl::composite_negative(), LMCAS::InferenceEngine::Impl::composite_nonnegative(), LMCAS::InferenceEngine::Impl::composite_nonpositive(), LMCAS::InferenceEngine::Impl::composite_nonzero(), LMCAS::InferenceEngine::Impl::composite_positive(), LMCAS::InferenceEngine::Impl::composite_real(), composition_inner_powers(), conj(), conj(), conjugate_checked(), conjugate_checked(), LMCAS::anonymous_namespace{symbolic_set.cpp}::consume(), continuity_at_checked(), continuity_at_checked(), LMCAS::anonymous_namespace{calculus_continuity.cpp}::continuity_from_limits(), LMCAS::anonymous_namespace{calculus_continuity.cpp}::continuity_point_value(), LMCAS::anonymous_namespace{calculus_continuity.cpp}::continuity_with_limit(), convergence_radius_checked(), convergence_radius_checked(), convergence_radius_checked(), convergence_radius_checked(), convergence_test_checked(), convergence_test_checked(), convergence_test_impl(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::convert_basis_polynomial(), LMCAS::anonymous_namespace{solver_groebner.cpp}::convert_polynomials(), LMCAS::polynomial_solver_detail::convert_to_rational_poly(), convert_to_unit(), convert_to_unit_definition(), convert_unit(), convert_unit(), convolve_checked(), convolve_checked(), cos(), cos(), LMCAS::SymbolicFactory::create_power(), cross_product(), crt_checked(), crt_checked(), curl(), curl_checked(), curl_checked(), curvature_checked(), curvature_checked(), curvature_parametric_checked(), curvature_parametric_checked(), curve_integral_scalar(), curve_integral_scalar_checked(), curve_integral_scalar_checked(), LMCAS::vector_calculus_detail::curve_integral_scalar_strict(), curve_integral_vector(), curve_integral_vector_checked(), curve_integral_vector_checked(), LMCAS::vector_calculus_detail::curve_integral_vector_strict(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::definite_integral_geometry_checked(), dep_var_is_positive(), detect_parity(), detect_substitution(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::diagonalization_checked(), differential(), differentiate(), differentiate(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::differentiate_geometry_checked(), differentiate_if_dependent(), LMCAS::anonymous_namespace{symbolic_geometry_surface.cpp}::differentiate_surface_checked(), dihedral_angle_checked(), dihedral_angle_checked(), directional_derivative(), directional_derivative_checked(), directional_derivative_checked(), LMCAS::anonymous_namespace{symbolic_factory.cpp}::discardable_zero_factor(), dispatch_equation(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::distinct_denominator_product(), div(), div(), divergence(), divergence_checked(), divergence_checked(), divergence_theorem(), divergence_theorem_checked(), divergence_theorem_checked(), LMCAS::vector_calculus_detail::divergence_theorem_strict(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_root(), dot_product(), double_root_inequality_intervals(), LMCAS::anonymous_namespace{symbolic_matrix_eigen.cpp}::eigenvalue_already_collected(), LMCAS::anonymous_namespace{symbolic_matrix_eigen.cpp}::eigenvalue_nullspace(), eliminate_parametric_column(), eq(), eq(), LMCAS::anonymous_namespace{integration_definite.cpp}::equal_endpoint_integral(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::equality_condition_truth(), equivalent(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::equivalent_with_budget(), essential_exponent(), essential_laurent(), LMCAS::anonymous_namespace{numerical_integration.cpp}::eval_bound_checked(), eval_complex(), eval_complex(), evalf(), evalf(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_components(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_exponent(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_node(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_operands(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_power(), LMCAS::anonymous_namespace{numerical_integration.cpp}::evaluate_interval(), evaluate_numeric(), LMCAS::anonymous_namespace{limit_result.cpp}::evaluate_one_sided_node(), LMCAS::anonymous_namespace{newton_raphson.cpp}::evaluate_root_function(), LMCAS::InferenceEngine::Impl::even_power_sign(), exact_factor_roots(), LMCAS::equivalence_detail::exact_integer_node(), LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::exact_operands(), LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::exact_polynomial_nodes(), LMCAS::polynomial_solver_detail::exact_polynomial_roots(), exp(), exp(), expand(), expand(), LMCAS::InferenceEngine::Impl::exponential_domain(), LMCAS::InferenceEngine::Impl::exponential_sign(), expr_match(), expr_match(), expr_set_difference(), expr_set_intersection(), expr_set_symmetric_difference(), expr_set_union(), exterior_derivative_checked(), exterior_derivative_checked(), extract_bernoulli_factor(), extract_bernoulli_monomial(), extract_coeff_value< BigInt >(), extract_coefficient(), extract_constant_term(), extract_laurent_regular_part(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::extract_sec_power(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::extract_sin_cos_powers(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::extract_tan_power(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_binomial_power(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_common_monomial(), factor_common_polynomial(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_difference_of_squares(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_embedded_univariate(), LMCAS::multivariate_checked_detail::factor_evaluated_linear(), LMCAS::multivariate_checked_detail::factor_linear_hensel(), factor_multivariate_checked(), factor_multivariate_checked(), factor_multivariate_expression(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_multivariate_impl(), factor_numeric_content(), factor_rational_univariate(), factor_symbolic_quadratic(), factor_transcendental(), factor_transcendental(), factor_transcendental_expression(), factor_univariate_bridge_checked(), factor_variable_rational_roots(), LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::factors_defined(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::filter_denominators(), find_extrema(), find_extrema_checked(), find_extrema_checked(), find_extrema_impl(), find_integrating_factor(), find_integrating_factor_impl(), find_parametric_pivot(), LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::finish(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::finish_cancellation(), LMCAS::anonymous_namespace{bigint_combinatorics.cpp}::finish_combinatorial(), finite_set(), finite_set(), finite_set_difference(), finite_set_intersection(), finite_set_symmetric_difference(), finite_set_union(), LMCAS::anonymous_namespace{limit_result.cpp}::finite_sign(), floor(), floor(), fourier_constant_coefficient(), fourier_harmonics(), fourier_series_checked(), fourier_series_checked(), fourier_transform_checked(), fourier_transform_checked(), fourier_transform_core(), frobenius_coefficient_limit(), LMCAS::groebner_detail::from_poly_ext(), LMCAS::InferenceEngine::Impl::function_domain(), LMCAS::InferenceEngine::Impl::function_sign(), gradient(), gradient_checked(), gradient_checked(), gram_schmidt(), greens_theorem(), greens_theorem_area(), greens_theorem_area_checked(), greens_theorem_area_checked(), LMCAS::vector_calculus_detail::greens_theorem_area_strict(), greens_theorem_checked(), greens_theorem_checked(), LMCAS::vector_calculus_detail::greens_theorem_strict(), LMCAS::InferenceEngine::Impl::has_negated_operand(), LMCAS::anonymous_namespace{residual_verification.cpp}::has_zero_root_remainder(), hessian(), hessian_checked(), hessian_checked(), imag(), imag(), imag_part_checked(), imag_part_checked(), implicit_diff(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::include_rational_zeros(), LMCAS::anonymous_namespace{inference_engine_periodicity.cpp}::PeriodInference::infer(), infinity_sign(), inflection_curve_defined(), inflection_points_checked(), inflection_points_checked(), LMCAS::InferenceEngine::Impl::integer_power_sign(), LMCAS::InferenceEngine::Impl::integral_power_domain(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_interval_checked(), integrate_multiple_checked(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_ordered_interval(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_segment_primitive(), integrating_factor_from_antiderivative(), integrating_factor_from_ratio(), interval(), interval(), interval_contains_checked(), interval_contains_checked(), interval_covers_checked_impl(), interval_is_empty_checked(), interval_is_empty_checked(), intervals_overlap_checked_impl(), inverse_branch_derivative(), inverse_derivative_checked(), inverse_derivative_checked(), inverse_fourier_transform_checked(), inverse_fourier_transform_checked(), inverse_fourier_transform_core(), inverse_function_checked(), inverse_function_checked(), inverse_laplace_checked(), inverse_laplace_checked(), inverse_laplace_core(), is_analytic_checked(), is_analytic_checked(), is_analytic_impl(), is_bernoulli_ode(), is_euler_equation(), is_exact_ode(), is_homogeneous_ode(), is_linear_first_order(), LMCAS::anonymous_namespace{limit_result.cpp}::ComplexPuncturedFacts::is_negative(), LMCAS::FactsQuery::is_negative(), LMCAS::anonymous_namespace{limit_result.cpp}::ComplexPuncturedFacts::is_nonnegative(), LMCAS::FactsQuery::is_nonnegative(), is_nonreal_sqrt(), LMCAS::anonymous_namespace{limit_result.cpp}::ComplexPuncturedFacts::is_nonzero(), LMCAS::FactsQuery::is_nonzero(), LMCAS::anonymous_namespace{limit_result.cpp}::ComplexPuncturedFacts::is_positive(), LMCAS::FactsQuery::is_positive(), LMCAS::anonymous_namespace{limit_result.cpp}::ComplexPuncturedFacts::is_real(), LMCAS::FactsQuery::is_real(), is_vertical_asymptote(), isolate_linear_coeff(), isolate_real_roots_checked(), isolate_real_roots_checked(), isolate_roots(), jacobian(), jacobian_checked(), jacobian_checked(), jordan_form_checked(), jordan_form_checked(), kronecker(), lagrange_multipliers_checked(), lagrange_multipliers_checked(), lagrange_multipliers_strict(), laplace_transform_checked(), laplace_transform_checked(), LMCAS::transform_detail::laplace_transform_core(), laplacian(), laplacian_checked(), laplacian_checked(), laurent_series_checked(), laurent_series_checked(), laurent_series_full_checked(), laurent_series_full_checked(), laurent_series_full_impl(), lie_derivative_checked(), lie_derivative_checked(), lie_derivative_impl(), lim_inf_checked(), lim_inf_checked(), lim_sup_checked(), lim_sup_checked(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_at_checked_point(), limit_checked(), limit_checked(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_complex_at_point(), limit_expression_checked(), limit_expression_checked(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_one_sided_checked(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_real_at_point(), line_from_two_points_checked(), line_from_two_points_checked(), line_plane_intersection_checked(), line_plane_intersection_checked(), LMCAS::integration_table_detail::load_exponential_base_rules(), LMCAS::integration_table_detail::load_polynomial_rules(), log(), log(), log10(), log10(), log_differentiate(), LMCAS::InferenceEngine::Impl::logarithm_domain(), LMCAS::InferenceEngine::Impl::logarithm_monotonicity(), LMCAS::InferenceEngine::Impl::logarithm_sign(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::logical_condition_truth(), lu_decomposition_checked(), lu_decomposition_checked(), LMCAS::expr_detail::expr_common::make_binary_expr(), LMCAS::expr_detail::expr_common::make_binary_math_expr(), make_finite_set(), make_interval(), make_membership(), make_rootof_checked(), make_rootof_checked(), make_rootof_solutions(), LMCAS::expr_detail::expr_common::make_unary_function_expr(), LMCAS::expr_detail::expr_common::make_unary_math_expr(), LMCAS::anonymous_namespace{matrix_decomposition.cpp}::matrix_axis_sum(), matrix_characteristic_polynomial_checked(), matrix_characteristic_polynomial_checked(), matrix_determinant_checked(), matrix_determinant_checked(), matrix_eigenvalues_checked(), matrix_eigenvalues_checked(), matrix_eigenvectors_checked(), matrix_eigenvectors_checked(), matrix_exp(), matrix_inverse_checked(), matrix_inverse_checked(), matrix_log(), matrix_multiply_checked(), matrix_multiply_checked(), matrix_norm(), matrix_nullspace_checked(), matrix_nullspace_checked(), matrix_rank_checked(), matrix_rank_checked(), matrix_reflection_checked(), matrix_reflection_checked(), matrix_rotation_checked(), matrix_rotation_checked(), matrix_rref_checked(), matrix_rref_checked(), matrix_scaling_checked(), matrix_scaling_checked(), matrix_solve_linear_checked(), matrix_solve_linear_checked(), matrix_trace(), LMCAS::anonymous_namespace{matrix_decomposition.cpp}::maximum_axis_sum(), member(), membership(), LMCAS::anonymous_namespace{interval_normalization.cpp}::merge_checked_intervals(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::merged_half_period_value(), metric_inverse_checked(), metric_inverse_checked(), mixed_product(), mul(), mul(), multi_crt_checked(), multi_crt_checked(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::multiply_checked(), LMCAS::InferenceEngine::Impl::multiply_domain(), multipoly_to_symbolic(), multivariate_factor_expression(), neg(), neg(), newton_raphson_checked(), newton_raphson_checked(), newton_raphson_checked(), newton_raphson_checked(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::node_to_multivariate_polynomial(), LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::nonlinear_solution(), LMCAS::InferenceEngine::Impl::nonzero_power_sign(), normalization_can_discard(), normalize_intervals_checked(), normalize_intervals_checked(), LMCAS::geometry_detail::numeric_vector_scale_checked(), LMCAS::InferenceEngine::Impl::operand_sign(), ordinary_frobenius_solution(), ordinary_taylor_coefficients(), LMCAS::anonymous_namespace{limit_result.cpp}::oscillatory_one_sided_limit(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::parameter_constraint(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::parametric_basis(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::parametric_input_polynomials(), parametric_linear_solution(), parametric_nonzero_value(), parametric_residual_zero(), parametric_zero(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_relations.cpp}::parse_conditional_relation(), parse_expr(), parse_expr(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::parse_general_expression(), LMCAS::assumption_detail::parse_interval(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::parse_interval_endpoint(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::parse_interval_expression(), LMCAS::assumption_detail::parse_relation(), LMCAS::anonymous_namespace{root_of_identity.cpp}::parse_rootof_request(), LMCAS::assumption_detail::parse_serialized_expression(), LMCAS::anonymous_namespace{inference_engine_periodicity.cpp}::periodicity_checked(), plane_from_three_points_checked(), plane_from_three_points_checked(), LMCAS::anonymous_namespace{symbolic_geometry_line.cpp}::point_difference_scale_checked(), point_plane_distance_checked(), point_plane_distance_checked(), LMCAS::anonymous_namespace{residual_comparison.cpp}::pointwise_values_defined(), LMCAS::InferenceEngine::Impl::positive_integer_power_sign(), LMCAS::InferenceEngine::Impl::positive_power_sign(), LMCAS::InferenceEngine::Impl::positive_relation_chain(), pow(), pow(), power_series_add(), power_series_compose_checked(), power_series_compose_checked(), power_series_multiply_checked(), power_series_multiply_checked(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::power_to_polynomial(), prepare_fourier_period(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prepare_operands(), LMCAS::InferenceEngine::Impl::product_relation_sign(), LMCAS::InferenceEngine::Impl::product_sign(), project_finite_expr_set(), LMCAS::solver_detail::project_unconditional_linear_system(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::propagate(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_checked_operands(), LMCAS::anonymous_namespace{matrix_decomposition_qr.cpp}::prove_exact_full_column_rank_qr_support(), LMCAS::anonymous_namespace{residual_verification.cpp}::prove_exact_root_residual(), LMCAS::anonymous_namespace{matrix_decomposition_cholesky.cpp}::prove_exact_spd(), LMCAS::anonymous_namespace{residual_verification.cpp}::prove_normalized_residual(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_operands(), LMCAS::anonymous_namespace{residual_verification.cpp}::prove_piecewise_residual(), LMCAS::equivalence_detail::prove_rational_polynomial_equivalence(), LMCAS::anonymous_namespace{residual_verification.cpp}::prove_with_profiles(), qr_decomposition_checked(), qr_decomposition_checked(), LMCAS::anonymous_namespace{matrix_quadratic_form.cpp}::quadratic_coefficients(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::quadratic_eigenvalue_sign(), quadratic_form_matrix(), LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::quadratic_solution(), quadrature_gaussian_numeric(), quadrature_gaussian_numeric(), quadrature_simpson_numeric(), quadrature_simpson_numeric(), quantity_add(), quantity_divide(), quantity_multiply(), quantity_power(), quantity_subtract(), LMCAS::InferenceEngine::Impl::query_natural(), LMCAS::InferenceEngine::Impl::query_rational(), LMCAS::InferenceEngine::Impl::query_zero(), LMCAS::InferenceEngine::Impl::quotient_sign(), ratio_convergence_test(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::rational_critical_points(), rational_reconstruction_checked(), rational_reconstruction_checked(), rational_root_factors(), LMCAS::anonymous_namespace{integration_rational.cpp}::rd_add_fraction_primitives(), real(), real(), LMCAS::InferenceEngine::Impl::real_definedness(), LMCAS::InferenceEngine::Impl::real_or_integer(), real_part_checked(), real_part_checked(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_node(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_power(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_product(), recognize_rational_polynomial(), recognize_regular_laurent(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_sum(), LMCAS::anonymous_namespace{solver_groebner.cpp}::reconstruct_basis(), reconstruct_rational_root_factors(), reconstruct_rational_roots(), LMCAS::anonymous_namespace{matrix_quadratic_form.cpp}::reconstructs_expression(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::reduce_fraction(), LMCAS::groebner_detail::reduced_groebner_basis_impl(), LMCAS::anonymous_namespace{integration_definite.cpp}::reduced_integrand_checked(), refine_root(), LMCAS::InferenceEngine::Impl::relation_rhs_nonnegative(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::relational_condition_truth(), LMCAS::anonymous_namespace{residual_verification.cpp}::replace_exact_root(), LMCAS::anonymous_namespace{bigint_combinatorics.cpp}::reserve_product(), residue_checked(), riemann_curvature_tensor_checked(), riemann_curvature_tensor_checked(), riemann_curvature_tensor_with_inverse(), rootof_evaluate_checked(), rootof_evaluate_checked(), rootof_evaluate_complex_checked(), rootof_evaluate_complex_checked(), rootof_simplify(), roots(), roots(), round(), round(), LMCAS::anonymous_namespace{newton_raphson.cpp}::run_bisection_backend(), LMCAS::anonymous_namespace{newton_raphson.cpp}::run_newton_backend(), scalar_project(), LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::scale_plane_edges_for_cross(), LMCAS::anonymous_namespace{limit_result.cpp}::scaled_one_sided_limit(), LMCAS::anonymous_namespace{calculus_continuity.cpp}::select_continuity_branch(), sequence_extreme_limit(), series_abs(), series_negate(), LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_match_exp_neg_quad(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::simplified_basis(), simplify(), simplify(), LMCAS::geometry_detail::simplify_checked(), simplify_finite_limit(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::simplify_geometry_checked(), sin(), sin(), singular_frobenius_solution(), singular_taylor_coefficients(), LMCAS::anonymous_namespace{symbolic_geometry_line.cpp}::skew_distance_from_directions(), skew_lines_distance_checked(), skew_lines_distance_checked(), solution_is_excluded(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::solve(), solve(), solve(), solve_bernoulli_ode_checked(), solve_bernoulli_ode_checked(), solve_bernoulli_ode_impl(), solve_biquadratic(), LMCAS::polynomial_solver_detail::solve_biquadratic_impl(), solve_by_factoring(), LMCAS::polynomial_solver_detail::solve_by_factoring_impl(), solve_closed_form_from_poly(), solve_closed_form_poly(), solve_complex_nth_root_checked(), solve_complex_nth_root_checked(), solve_complex_quadratic_checked(), solve_complex_quadratic_checked(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::solve_condition_truth(), solve_constant_inequality(), solve_cubic(), LMCAS::polynomial_solver_detail::solve_cubic_impl(), solve_degenerate_cubic(), solve_equation(), solve_equation(), solve_euler_ode_checked(), solve_euler_ode_checked(), solve_euler_ode_impl(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::solve_exact_affine_inequality_impl(), solve_exact_factor(), solve_exact_ode_checked(), solve_exact_ode_checked(), solve_exact_ode_impl(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::solve_exact_polynomial_inequality_impl(), solve_exact_polynomial_set(), solve_expr_set(), solve_expr_set(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::solve_factor(), solve_finite_checked(), solve_finite_checked(), solve_finite_mixed(), solve_frobenius_checked(), solve_frobenius_checked(), solve_frobenius_impl(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_function_pattern(), solve_higher_exact_roots(), solve_higher_order_ode_checked(), solve_higher_order_ode_checked(), solve_higher_order_ode_impl(), solve_homogeneous_ode_checked(), solve_homogeneous_ode_checked(), solve_homogeneous_ode_impl(), LMCAS::anonymous_namespace{newton_raphson.cpp}::solve_initial_guess(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_inner_equation(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_inverted_values(), LMCAS::anonymous_namespace{newton_raphson.cpp}::solve_isolated_polynomial(), solve_lagrange_strict(), solve_linear1_ode(), solve_linear2_homogeneous(), solve_linear2_ode(), solve_linear2_ode_checked(), solve_linear2_ode_checked(), LMCAS::solver_detail::solve_linear_system_impl(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::solve_mixed_equation(), solve_mixed_transcendental_checked(), solve_mixed_transcendental_checked(), solve_numeric_checked(), solve_numeric_checked(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::solve_polynomial_factor(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::solve_polynomial_system_impl(), solve_product_factor(), solve_product_set(), LMCAS::polynomial_solver_detail::solve_quadratic_internal(), solve_quartic(), LMCAS::polynomial_solver_detail::solve_quartic_impl(), solve_separable_ode(), solve_set(), solve_set(), solve_set_core(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::solve_single_equation(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_substitution(), solve_symbolic_polynomial_set(), solve_symbolic_quadratic(), solve_transcendental(), solve_transcendental(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_transcendental_constant(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::solve_transcendental_factor(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_transcendental_impl(), solve_variation_of_parameters_checked(), solve_variation_of_parameters_checked(), solve_variation_of_parameters_core(), solve_with_assumptions_checked(), solve_with_assumptions_checked(), solve_with_assumptions_impl(), LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::solved_inequality(), LMCAS::anonymous_namespace{interval_normalization.cpp}::sort_checked_intervals(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::sort_exact_inequality_roots(), LMCAS::anonymous_namespace{complex_analysis.cpp}::split_real_imag(), sqrt(), sqrt(), LMCAS::InferenceEngine::Impl::square_root_domain(), LMCAS::InferenceEngine::Impl::square_root_sign(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::squared_profile(), stokes_theorem(), stokes_theorem_checked(), stokes_theorem_checked(), LMCAS::vector_calculus_detail::stokes_theorem_strict(), strip_to_base_value(), strip_to_display_value(), strip_unit(), sub(), sub(), substitute(), substitute(), substitute(), substitute(), substitute(), substitute(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::substitute_assignment(), LMCAS::anonymous_namespace{limit_visitor_taylor.cpp}::substitute_infinity_series(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::substitute_solution(), LMCAS::anonymous_namespace{integration_substitution.cpp}::substitution_primitive(), LMCAS::InferenceEngine::Impl::subtraction_sign(), LMCAS::InferenceEngine::Impl::subtrahend(), LMCAS::InferenceEngine::Impl::sum_nonzero(), LMCAS::InferenceEngine::Impl::sum_relation_sign(), LMCAS::InferenceEngine::Impl::sum_sign(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::sum_to_polynomial(), surface_area_revolution_x_checked(), surface_area_revolution_x_checked(), surface_area_revolution_y_checked(), surface_area_revolution_y_checked(), LMCAS::anonymous_namespace{symbolic_geometry_surface.cpp}::surface_gradient_at_point_checked(), LMCAS::anonymous_namespace{symbolic_geometry_surface.cpp}::surface_gradient_scale_checked(), surface_integral_scalar(), surface_integral_scalar_checked(), surface_integral_scalar_checked(), LMCAS::vector_calculus_detail::surface_integral_scalar_strict(), surface_integral_vector(), surface_integral_vector_checked(), surface_integral_vector_checked(), LMCAS::vector_calculus_detail::surface_integral_vector_strict(), surface_normal_checked(), surface_normal_checked(), svd_decomposition_checked(), svd_decomposition_checked(), symbolic_cubic_roots(), LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::symbolic_line_plane_intersection(), LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::symbolic_point_plane_distance(), symbolic_poly_to_expr(), symbolic_polynomial_content(), symbolic_polynomial_gcd(), symbolic_power_to_poly(), symbolic_product(), symbolic_product_to_poly(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::symbolic_quadratic_sign(), LMCAS::polynomial_solver_detail::symbolic_quartic_depression(), LMCAS::polynomial_solver_detail::symbolic_quartic_roots(), symbolic_sum(), symbolic_sum_to_poly(), symbolic_to_poly_recursive(), LMCAS::anonymous_namespace{symbolic_geometry_vector.cpp}::symbolic_vector_finite_numeric(), tan(), tan(), tangent_plane_checked(), tangent_plane_checked(), te_abs_decay(), te_abs_fourier(), te_accept_decay(), te_convolve_core(), te_convolve_sum(), LMCAS::transform_detail::te_factorial(), te_fourier_sum(), te_inv_power(), te_inv_product(), te_laplace_lookup(), te_laplace_sum(), te_validate_convolution_inputs(), LMCAS::transform_detail::te_validate_expr_vars(), LMCAS::groebner_detail::anonymous_namespace{solver_groebner_reconstruction.cpp}::term_node(), tf_back_substitute(), tf_build_polynomial(), tf_build_polynomial_impl(), tf_detect_exponential_separation(), tf_factor_substitution(), tf_restore_factors(), tf_simplify_factors(), tf_simplify_factors_impl(), total_differential(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::trig_extract_factor(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::trig_extract_nonneg_int(), LMCAS::InferenceEngine::Impl::trigonometric_sign(), LMCAS::anonymous_namespace{integration_trig_substitution.cpp}::trigsub_match_radical(), LMCAS::anonymous_namespace{integration_trig_substitution.cpp}::trigsub_quadratic_coefficients(), LMCAS::integration_table_detail::u_is_real_var(), LMCAS::integration_table_detail::u_is_var_a_indep(), LMCAS::integration_table_detail::u_is_var_a_nonzero(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::validate_basis_input(), LMCAS::anonymous_namespace{complex_analysis.cpp}::validate_complex_expr_input(), LMCAS::anonymous_namespace{complex_analysis.cpp}::validate_complex_expr_point_input(), LMCAS::anonymous_namespace{symbolic_complex.cpp}::validate_complex_symbolic(), LMCAS::anonymous_namespace{symbolic_complex.cpp}::validate_expr(), LMCAS::anonymous_namespace{differential_geometry.cpp}::validate_form_coefficients(), validate_frobenius_regular_singular_domain(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::validate_geometry_inputs(), LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::validate_intersection_inputs(), LMCAS::geometry_detail::validate_line_checked(), LMCAS::anonymous_namespace{differential_geometry.cpp}::validate_metric_matrix(), validate_ode_expr_var_pair(), validate_ode_pair_var_pair(), validate_ode_three_expr_one_var(), validate_ode_two_expr_point(), validate_ode_variables(), LMCAS::geometry_detail::validate_plane_checked(), LMCAS::anonymous_namespace{series_engine.cpp}::validate_power_series_order(), validate_property_interval(), LMCAS::geometry_detail::validate_same_dimension_vectors(), validate_series_expr_point(), LMCAS::geometry_detail::validate_surface_point(), LMCAS::groebner_detail::anonymous_namespace{solver_groebner_reconstruction.cpp}::variable_node(), vector_angle_checked(), vector_angle_checked(), vector_angle_symbolic(), LMCAS::vector_calculus_detail::vector_calculus_checked_finite_numeric(), vector_calculus_classify_critical_point(), vector_calculus_constant_integrand(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), vector_calculus_definite_integral_strict(), vector_calculus_evaluate_hessian_at_point(), LMCAS::vector_calculus_detail::vector_calculus_expr_zero_after_substitution(), LMCAS::vector_calculus_detail::vector_calculus_integrate_with_fallback(), vector_calculus_multiple_integral_strict(), vector_calculus_numerical_definite(), vector_calculus_try_definite(), LMCAS::vector_calculus_detail::vector_calculus_validate_bound_pair(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_parametrization(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_scalar_inputs(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_vector_inputs(), LMCAS::vector_calculus_detail::vector_calculus_validate_distinct_vars(), LMCAS::vector_calculus_detail::vector_calculus_validate_expr_vars(), LMCAS::vector_calculus_detail::vector_calculus_validate_field_vars(), LMCAS::vector_calculus_detail::vector_calculus_validate_functions_vars(), LMCAS::vector_calculus_detail::vector_calculus_validate_surface_parametrization(), LMCAS::vector_calculus_detail::vector_calculus_validate_surface_scalar_inputs(), LMCAS::vector_calculus_detail::vector_calculus_validate_surface_vector_inputs(), vector_cross_checked(), vector_cross_checked(), vector_dot_checked(), vector_dot_checked(), vector_project(), verified_quadratic_boundaries(), verified_real_inverse_candidates(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::verify_jordan_decomposition(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::verify_jordan_identity(), verify_lagrange_solutions(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::verify_quadratic_boundary(), LMCAS::ExpandVisitor::visit(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::volume_of_revolution_checked_impl(), volume_of_revolution_x_checked(), volume_of_revolution_x_checked(), volume_of_revolution_y_checked(), volume_of_revolution_y_checked(), LMCAS::InferenceEngine::Impl::weak_subtraction_sign(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_rational_power(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_reduce_rational(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_to_rational(), with_unit(), with_unit_definition(), z_transform_checked(), z_transform_checked(), z_transform_core(), zassenhaus_combine_checked(), zassenhaus_combine_checked(), zassenhaus_combine_impl(), zc_enumerate(), zc_subset_product(), zc_validate_lifted_product(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::zero_difference(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::zero_numerator_domain(), LMCAS::InferenceEngine::Impl::zero_power_sign(), zt_exponential(), zt_polynomial(), zt_sum() , 以及 zt_trigonometric().

◆ definition

std::string UnitDefinition LMCAS::definition

在文件 expr.hpp 第 167 行定义.

被这些函数引用 attach_unit(), attach_unit(), convert_to_unit_definition(), convert_unit() , 以及 with_unit_definition().

◆ denominator

const ExprPtr & LMCAS::denominator

在文件 expr.hpp 第 200 行定义.

被这些函数引用 asymptote_candidates(), LMCAS::anonymous_namespace{bigint_arithmetic.cpp}::bigint_div(), LMCAS::anonymous_namespace{differential_geometry.cpp}::bounded_binomial(), calculus_utils_extract_denominator(), calculus_utils_oblique_from_rational(), calculus_utils_split_rational(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::cancel_polynomial_gcd(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::cauchy_index_on_edge(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::classify_fraction_factor(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::collect_fraction_terms(), collect_vertical_asymptotes(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::combine(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::combine_fraction_terms(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::construct_roots(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::count_sheared_edges(), LMCAS::DifferentiationVisitor::differentiate_atan2(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::distinct_denominator_product(), div(), div(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::divide(), LMCAS::detail::matrix_kernel::exact_divide(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_projection.cpp}::exact_poly_divide(), LMCAS::detail::anonymous_namespace{complex_root_isolation.cpp}::exact_rational_square_root(), extract_laurent_regular_part(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::filter_denominators(), implicit_diff(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::integrate_even_case(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::integrate_odd_case(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::left_pole_sample(), log10(), normalization_exact_square_root(), normalization_pi_function(), LMCAS::NormalizationVisitor::normalize_logarithm(), LMCAS::ode_root_detail::Complex::operator/(), parse_fraction(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::pole_index(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::pole_interval_is_clear(), LMCAS::detail::anonymous_namespace{exact_sturm.cpp}::polynomial_sign_at(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::product_bounds(), LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::protected_coordinate_intersection(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::prove(), LMCAS::anonymous_namespace{query_conditions.cpp}::quotient_conditions(), LMCAS::InferenceEngine::Impl::quotient_sign(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::rational(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::rational_critical_points(), rational_reconstruction_checked(), rational_root_candidate(), LMCAS::detail::rational_square_root(), LMCAS::anonymous_namespace{integration_rational_terms.cpp}::rd_fraction_term(), LMCAS::anonymous_namespace{integration_rational_terms.cpp}::rd_quadratic_logarithm(), LMCAS::detail::definite::recover_rational_cut(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::refine_pole_interval(), LMCAS::Irrational::EnclosureRound::refine_sign(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::register_canonical_radical(), LMCAS::detail::definite::roots_checked(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::same_denominators(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::separate_num_den(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_winding.cpp}::shear_is_valid(), solve_symbolic_quadratic(), LMCAS::detail::NumericEvaluator::square_root(), sym_rational(), te_abs_fourier(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentFacts::value_sign_impl(), vector_angle_checked(), verified_quadratic_boundaries(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_reduce_rational(), z_transform_core(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::zero_numerator_domain(), zt_exponential(), zt_polynomial() , 以及 zt_trigonometric().

◆ depth

◆ dim

◆ direction

◆ display_unit

std::string LMCAS::display_unit

在文件 expr.hpp 第 166 行定义.

被这些函数引用 attach_unit(), convert_to_unit_definition(), convert_unit() , 以及 with_unit_definition().

◆ domain

const std::string const LimitExprPtr LimitDirection Domain LMCAS::domain = Domain::Real)

在文件 expr.hpp 第 378 行定义.

被这些函数引用 LMCAS::NormalizationVisitor::NormalizationVisitor(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_function(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_power(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_product(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_sum(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_limit_result(), LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::collect_variables(), LMCAS::anonymous_namespace{normalization_products.cpp}::collectable_power_exponent(), LMCAS::anonymous_namespace{residual_comparison.cpp}::compare_defined_values(), LMCAS::anonymous_namespace{limit_result.cpp}::complex_punctured_domain(), domain_contains(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_complex(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_fractional_power(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_function(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_negative_integer_power(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_node(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_number(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_operands(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_positive_integer_power(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_power(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_root(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_rank(), domain_requires_real(), LMCAS::property_detail::domain_str(), exact_radical_domain_excludes(), exact_rational_domain_excludes(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::exact_sqrt_contains(), expr_set_subset_domain(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::extended_node(), LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::factors_defined(), LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::finish(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_at_checked_point(), limit_checked(), limit_checked(), limit_expression_checked(), limit_expression_checked(), normalization_can_discard(), numeric_domain_excludes(), LMCAS::anonymous_namespace{limit_result.cpp}::oscillatory_one_sided_limit(), LMCAS::anonymous_namespace{residual_comparison.cpp}::pointwise_values_defined(), solution_is_excluded(), solve_with_assumptions_impl(), LMCAS::anonymous_namespace{limit_result.cpp}::validate_limit_input(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::RewriteVisitor::visit() , 以及 LMCAS::RewriteVisitor::visit().

◆ element

◆ exponent

const ExprPtr & LMCAS::exponent

在文件 expr.hpp 第 215 行定义.

被这些函数引用 LMCAS::detail::definite::absolute_argument(), accumulate_bernoulli_exponent(), LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::add_base(), LMCAS::anonymous_namespace{bigint_number_theory.cpp}::binary_modular_power(), LMCAS::anonymous_namespace{complex_analysis.cpp}::bounded_complex_power(), build_euler_solution(), calculus_utils_split_rational(), LMCAS::NormalizationVisitor::can_combine_nested_power(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::canonicalize_power(), LMCAS::anonymous_namespace{poly_utils.cpp}::check_power_coefficient_count(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::classify_fraction_factor(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_power(), LMCAS::detail::anonymous_namespace{exact_matrix_support.cpp}::classify_numeric_power(), LMCAS::detail::anonymous_namespace{facts_query_rational.cpp}::closed_rational_power(), collect_bernoulli_coefficients(), LMCAS::NormalizationVisitor::collect_expanded_product(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::collect_integer_power(), LMCAS::anonymous_namespace{limit_visitor_composition.cpp}::collect_log_power_factors(), LMCAS::InferenceEngine::Impl::collect_node_exponent(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::collect_polynomial_variables(), LMCAS::NormalizationVisitor::collect_product(), LMCAS::anonymous_namespace{normalization_products.cpp}::ProductAccumulator::collect_variables(), LMCAS::anonymous_namespace{normalization_products.cpp}::collectable_power_exponent(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::convert(), LMCAS::SymbolicFactory::create_power(), denominator_factor(), LMCAS::detail::detect_binomial_power(), LMCAS::NormalizationVisitor::distribute_power(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_fractional_power(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_power(), essential_exponent(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_exponent(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_power(), LMCAS::InferenceEngine::Impl::even_power_sign(), LMCAS::detail::exact_double_rational(), exact_scalar_radicand(), extract_bernoulli_factor(), extract_bernoulli_monomial(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_multivariate_impl(), LMCAS::fglm_detail::generate_degree(), LMCAS::anonymous_namespace{fglm.cpp}::generate_standard_degree(), geometric_term_convergence(), LMCAS::groebner_detail::anonymous_namespace{solver_groebner_basis.cpp}::initialize_sugar(), LMCAS::anonymous_namespace{normalization_numeric_powers.cpp}::integer_numeric_power(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::integer_power(), LMCAS::InferenceEngine::Impl::integer_power_sign(), LMCAS::InferenceEngine::Impl::integral_power_domain(), LMCAS::detail::integrate_power_primitive(), integrating_factor_from_antiderivative(), integration_bounded_exponent(), LMCAS::anonymous_namespace{integration_by_parts.cpp}::integration_by_parts_score(), inverse_fourier_transform_core(), is_alternating_factor(), is_bernoulli_ode(), LMCAS::anonymous_namespace{normalization_numeric_powers.cpp}::is_half_exponent(), LMCAS::fglm_detail::anonymous_namespace{fglm_dimension.cpp}::is_pure_power(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::is_undefined_zero_power(), LMCAS::detail::series_support::laurent_power_of_power(), LMCAS::integration_table_detail::load_polynomial_rules(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::multiply(), LMCAS::anonymous_namespace{irrational_representation.cpp}::named_power(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::nonintegral_domain(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::nonintegral_power(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::nonintegral_value(), LMCAS::InferenceEngine::Impl::nonzero_power_sign(), normalization_imaginary_power(), normalization_numeric_power(), LMCAS::NormalizationVisitor::normalize_nested_imaginary_power(), LMCAS::NormalizationVisitor::normalize_nested_power(), LMCAS::NormalizationVisitor::normalize_power_identity(), LMCAS::NormalizationVisitor::normalize_product_power(), LMCAS::anonymous_namespace{normalization_norms.cpp}::normalized_norm_argument(), LMCAS::expr_detail::ExprParser::parse_power(), LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::parse_surd_power(), LMCAS::anonymous_namespace{symbolic_factor.cpp}::polynomial_exponent(), LMCAS::detail::anonymous_namespace{exact_sturm.cpp}::polynomial_sign_at(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::positive_denominator_exponent(), LMCAS::InferenceEngine::Impl::positive_integer_power_sign(), pow(), pow(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::power(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::power(), LMCAS::detail::NumericEvaluator::power(), LMCAS::Irrational::EnclosureRound::power(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::power_bounds(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::power_candidate(), LMCAS::anonymous_namespace{limit_result.cpp}::power_continuous_structure(), LMCAS::groebner_detail::anonymous_namespace{solver_groebner_builder.cpp}::power_degrees_fit(), LMCAS::solver_detail::anonymous_namespace{solver_imaginary.cpp}::power_is_imaginary(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::power_pattern(), power_term_convergence(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::power_to_polynomial(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::product_bounds(), LMCAS::anonymous_namespace{query_conditions.cpp}::product_conditions(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::quantity(), quantity_power(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::radical_radicand(), LMCAS::detail::definite::rational_power_checked(), LMCAS::anonymous_namespace{symbolic_ode.cpp}::reciprocal_on_regular_region(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_power(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::reduce_radicals(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::register_new_atom(), LMCAS::anonymous_namespace{residual_verification.cpp}::replace_root_power(), restore_main_exponent(), LMCAS::equivalence_detail::rewrite_exp_log_basic_identity(), LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::rewrite_square_absolute(), LMCAS::equivalence_detail::rewrite_trig_basic_identity(), separable_reciprocal(), LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_is_inv_ln_var(), LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_is_inv_var(), LMCAS::NormalizationVisitor::simplify_assumed_square_root(), LMCAS::anonymous_namespace{normalization_numeric_powers.cpp}::small_exact_power(), LMCAS::InferenceEngine::Impl::small_positive_exponent(), solve_bernoulli_ode_impl(), solve_product_factor(), LMCAS::anonymous_namespace{complex_analysis.cpp}::split_real_imag(), sqrt(), LMCAS::detail::anonymous_namespace{squared_norm.cpp}::square_root_argument(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::squared_profile(), LMCAS::detail::anonymous_namespace{squared_norm.cpp}::squared_term(), LMCAS::anonymous_namespace{irrational_symbolic.cpp}::symbolic_named_power(), symbolic_power_to_poly(), symbolic_to_poly_recursive(), te_convolve_core(), te_gaussian_fourier(), te_inv_power(), te_is_denominator_factor(), tf_power_degree(), LMCAS::anonymous_namespace{integration_trig_substitution.cpp}::trigsub_half_exponent(), LMCAS::anonymous_namespace{integration_trig_substitution.cpp}::trigsub_match_radical(), LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit(), LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visit(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::groebner_detail::PolyBuilder::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::zero_base_power_value(), zt_is_exp_seq() , 以及 zt_polynomial_pattern().

◆ growth

std::size_t std::size_t std::size_t LMCAS::growth

◆ imag

◆ integer

template<typename Integer, std::enable_if_t< std::is_integral_v< Integer > &&!std::is_same_v< Integer, int >, int > = 0>
ExprResult LMCAS::integer(Integer)=delete ( Integer )
delete

被这些函数引用 LMCAS::InferenceEngine::Impl::absolute_domain(), LMCAS::anonymous_namespace{complex_analysis.cpp}::bounded_complex_power(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_power(), classify_ratio_limit(), LMCAS::anonymous_namespace{normalization_products.cpp}::collectable_power_exponent(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::double_angle_multiple(), eq(), LMCAS::detail::exact_rational_value(), LMCAS::detail::anonymous_namespace{numeric_evaluation_power.cpp}::exponent_parity(), geometric_term_convergence(), get_pi_coeff(), LMCAS::anonymous_namespace{normalization_numeric_powers.cpp}::half_numeric_power(), imaginary_unit(), integer(), integer(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::integer_complex_power(), LMCAS::detail::series_support::integer_value_from_node(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::integral_power(), LMCAS::anonymous_namespace{integration_linearity.cpp}::integration_exponential_argument(), LMCAS::NumberNode::is_negative_one(), neg(), normalization_exact_square_root(), normalization_numeric_power(), LMCAS::NormalizationVisitor::normalize_nested_imaginary_power(), LMCAS::NormalizationVisitor::normalize_product_power(), LMCAS::anonymous_namespace{normalization_numeric_functions.cpp}::number_equals_integer(), LMCAS::anonymous_namespace{normalization_numeric_functions.cpp}::numeric_absolute(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::polynomial_exponent(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::positive_denominator_exponent(), LMCAS::anonymous_namespace{normalization_signs.cpp}::positive_negative_number(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::power(), LMCAS::detail::NumericEvaluator::power(), LMCAS::anonymous_namespace{limit_result.cpp}::power_continuous_structure(), power_term_convergence(), LMCAS::InferenceEngine::Impl::query_rational(), LMCAS::anonymous_namespace{normalization_numeric_powers.cpp}::reciprocal_exact_number(), LMCAS::detail::RewriteBudget::Measurement::require_bits(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::rewrite_function(), LMCAS::detail::inequality_support::anonymous_namespace{inequality_solver_ordering.cpp}::root_number_sign(), LMCAS::anonymous_namespace{normalization_numeric_powers.cpp}::small_exact_power(), LMCAS::detail::NumericEvaluator::square_root(), LMCAS::solver_detail::anonymous_namespace{solver_imaginary.cpp}::square_root_is_imaginary(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::trigonometric_periodic_values(), try_get_integer_value(), LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit(), LMCAS::detail::RewriteBudget::Measurement::visit() , 以及 zt_polynomial_pattern().

◆ integrator

◆ kEquivalentOperation

◆ kEquivalentProfileOperation

const char* LMCAS::kEquivalentProfileOperation
inlineconstexpr

◆ kEvalComplexOperation

◆ kExprSetOperation

const char* LMCAS::kExprSetOperation = "LMCAS.expr_set"
inlineconstexpr

◆ kParseOperation

const char* LMCAS::expr_detail::kParseOperation
inlineconstexpr

在文件 expr_parser.hpp 第 12 行定义.

被这些函数引用 parse_expr().

◆ kSolveExprSetOperation

const char* LMCAS::kSolveExprSetOperation = "LMCAS.solve_expr_set"
inlineconstexpr

在文件 expr_internal.hpp 第 15 行定义.

被这些函数引用 error_name() , 以及 project_finite_expr_set().

◆ l2

const LineSymbolic & LMCAS::l2

在文件 symbolic_geometry_line_plane.hpp 第 96 行定义.

被这些函数引用 skew_lines_distance_checked() , 以及 skew_lines_distance_checked().

◆ lift_bound

const std::vector<Polynomial<ModInt> > int64_t int LMCAS::lift_bound

在文件 exact_factorization.hpp 第 51 行定义.

被这些函数引用 hensel_lift_checked().

◆ lifted_factors

◆ lower

const ExprPtr & LMCAS::lower

在文件 expr.hpp 第 255 行定义.

被这些函数引用 LMCAS::anonymous_namespace{integration_definite.cpp}::DefiniteInterval::DefiniteInterval(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentFacts::SegmentFacts(), adaptive_simpson_numeric(), adaptive_simpson_numeric(), LMCAS::detail::anonymous_namespace{exact_root.cpp}::approximate_component(), LMCAS::detail::anonymous_namespace{exact_root.cpp}::approximate_real_isolation(), LMCAS::detail::anonymous_namespace{exact_algebraic_refinement.cpp}::approximate_root(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::arctangent_bounds(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::arctangent_endpoint(), bisection_checked(), bisection_checked(), LMCAS::detail::definite::certify_continuity_checked(), LMCAS::detail::anonymous_namespace{exact_algebraic_refinement.cpp}::certify_dyadic_candidate(), LMCAS::anonymous_namespace{interval_set_operations.cpp}::checked_interval_views(), clamp(), clamp(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::closed_bounds(), LMCAS::anonymous_namespace{interval_normalization.cpp}::collect_nonempty_intervals(), LMCAS::anonymous_namespace{interval_set_operations.cpp}::complement_lower_from_upper(), LMCAS::anonymous_namespace{interval_set_operations.cpp}::complement_upper_from_lower(), LMCAS::detail::anonymous_namespace{exact_sturm.cpp}::count_open_roots(), LMCAS::detail::count_real_roots_exact(), LMCAS::detail::definite::definite_partition_checked(), LMCAS::detail::definite::definite_segment_checked(), LMCAS::anonymous_namespace{matrix_decomposition_lu.cpp}::eliminate_lu_column(), LMCAS::detail::anonymous_namespace{mixed_transcendental_refinement.cpp}::RootRefinement::endpoint_root(), LMCAS::anonymous_namespace{integration_definite.cpp}::equal_endpoint_integral(), LMCAS::anonymous_namespace{numerical_integration.cpp}::evaluate_interval(), LMCAS::anonymous_namespace{symbolic_set.cpp}::exact_interval_membership(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::exact_polynomial_sign_intervals(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::extended_node(), LMCAS::anonymous_namespace{matrix_decomposition_lu.cpp}::factor_lu(), LMCAS::solver_detail::finite_midpoint(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_interval_checked(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_ordered_interval(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_segment_primitive(), LMCAS::expr_detail::ExprParser::interval(), interval(), interval(), interval_contains_checked(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::interval_delimiters_valid(), interval_is_empty_checked(), interval_to_expr(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::lambert_w_domain(), LMCAS::InferenceEngine::Impl::logarithm_monotonicity(), make_interval(), LMCAS::expr_detail::ExprParser::parse_interval_literal(), parse_interval_lower(), parse_single_interval(), LMCAS::detail::definite::prepare_segment_primitive(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_rectangles.cpp}::projection_bands(), quadrature_gaussian_numeric(), quadrature_gaussian_numeric(), quadrature_simpson_numeric(), quadrature_simpson_numeric(), LMCAS::Irrational::EnclosureRound::radical(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::rational_bounds(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::rational_endpoint_bound(), LMCAS::anonymous_namespace{newton_raphson.cpp}::run_bisection_backend(), LMCAS::detail::definite::segment_expression_checked(), LMCAS::Irrational::EnclosureRound::separated_sign(), LMCAS::anonymous_namespace{newton_raphson.cpp}::solve_isolated_polynomial(), LMCAS::anonymous_namespace{interval_normalization.cpp}::sort_checked_intervals(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::sum_bounds(), symbolic_product(), symbolic_sum(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::trigonometric_target_range(), LMCAS::anonymous_namespace{integration_definite.cpp}::unresolved_integral(), valid_newton_bracket(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::validate_geometry_inputs(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::validate_interval_endpoints(), LMCAS::anonymous_namespace{numerical_integration.cpp}::validate_quadrature_args(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::variable_bounds(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::RewriteVisitor::visit(), LMCAS::RewriteVisitor::visit(), LMCAS::RewriteVisitor::visit() , 以及 LMCAS::RewriteVisitor::visit().

◆ lower_closed

◆ main_var

◆ mod_factors

const std::vector<Polynomial<ModInt> >& LMCAS::mod_factors

在文件 exact_factorization.hpp 第 49 行定义.

被这些函数引用 hensel_lift_checked().

◆ MODULAR_PRIMES

int64_t LMCAS::MODULAR_PRIMES[]
constexpr
初始值:
= {
1000000007, 1000000009, 1000000021, 1000000033,
1000000087, 1000000093, 1000000097, 1000000103,
1000000123, 1000000181, 1000000207, 1000000223,
1000000231, 1000000271, 1000000289, 1000000297
}

预定义的大素数表,用于模运算多素数方案

在文件 modular_arithmetic.hpp 第 458 行定义.

◆ name

__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string& LMCAS::name

在文件 equivalence_options.hpp 第 41 行定义.

被这些函数引用 LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeVariableFinder::FreeVariableFinder(), LMCAS::expr_detail::ExprParser::apply_function(), LMCAS::detail::anonymous_namespace{assumption_simplification.cpp}::assumed_transform(), LMCAS::anonymous_namespace{quantity.cpp}::checked_binary(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::compound_node(), LMCAS::detail::constant_expression(), LMCAS::SymbolicFactory::create_variable(), LMCAS::property_detail::domain_str(), eqv_profile_from_name(), LMCAS::anonymous_namespace{assumption_conditionals.cpp}::evaluate_symbol_sign(), expr_match(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::extended_node(), find_extrema_impl(), LMCAS::expr_detail::anonymous_namespace{expr_parser_functions.cpp}::find_unary_function(), function(), LMCAS::expr_detail::ExprParser::function_node(), LMCAS::anonymous_namespace{inference_engine_periodicity.cpp}::PeriodInference::independent(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeVariableCollector::is_bound(), LMCAS::detail::is_imaginary_unit_name(), LMCAS::expr_detail::expr_common::is_reserved_symbol_name(), lookup_integral(), LMCAS::anonymous_namespace{matrix_quadratic_form.cpp}::make_variables(), match_recursive(), LMCAS::anonymous_namespace{irrational_representation.cpp}::named_power(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::node(), LMCAS::expr_detail::ExprParser::parse_call(), LMCAS::expr_detail::ExprParser::parse_identifier_or_call(), LMCAS::assumption_detail::AssumptionParser::parse_record(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::quantity(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::root_of(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::select_equation(), set_eqv_profile(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::solve(), solve_lagrange_strict(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::substitute_assignment(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::substitute_solution(), sym(), LMCAS::anonymous_namespace{irrational_symbolic.cpp}::symbolic_named_power(), LMCAS::expr_detail::ExprParser::uninterpreted_function(), LMCAS::anonymous_namespace{unit.cpp}::valid_unit_name(), LMCAS::anonymous_namespace{symbolic_complex.cpp}::validate_complex_symbolic(), LMCAS::detail::matrix_decomposition::validate_decomposition_output(), LMCAS::anonymous_namespace{symbolic_complex.cpp}::validate_expr(), LMCAS::anonymous_namespace{differential_geometry.cpp}::validate_index(), LMCAS::detail::series_support::validate_power_series_coefficients(), LMCAS::geometry_detail::validate_symbolic_vector(), verify_lagrange_solutions(), LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit() , 以及 wildcard().

◆ negated

const ExprPtr bool LMCAS::negated = false)

在文件 expr.hpp 第 161 行定义.

被这些函数引用 LMCAS::expr_detail::ExprParser::membership() , 以及 membership().

◆ NUM_MODULAR_PRIMES

size_t LMCAS::NUM_MODULAR_PRIMES = sizeof(MODULAR_PRIMES) / sizeof(MODULAR_PRIMES[0])
constexpr

预定义素数表的长度

在文件 modular_arithmetic.hpp 第 465 行定义.

◆ op

const ExprPtr RelationOp LMCAS::op

在文件 expr.hpp 第 151 行定义.

被这些函数引用 LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::binary_logical_truth(), LMCAS::calculus_utils_detail::calculus_utils_is_infinity(), LMCAS::AddNode::clone(), LMCAS::MultiplyNode::clone(), LMCAS::anonymous_namespace{limit_visitor_composition.cpp}::collect_log_power_factors(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::collect_transcendental_subexprs(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::compound_node(), LMCAS::AddNode::compute_hash(), LMCAS::MultiplyNode::compute_hash(), LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_multiply(), LMCAS::anonymous_namespace{relation_store.cpp}::declare_comparison_sign(), LMCAS::anonymous_namespace{relation_store.cpp}::derive_comparison_sign(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::equality_condition_truth(), LMCAS::anonymous_namespace{assumption_conditionals.cpp}::evaluate_symbol_sign(), LMCAS::anonymous_namespace{mixed_transcendental_search.cpp}::extract_linear_coefficient(), factor_common_polynomial(), get_node_degree_helper(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::has_exp_k_var_terms(), interval_to_expr(), inverse_fourier_transform_core(), inverse_laplace_core(), LMCAS::anonymous_namespace{symbolic_factor.cpp}::is_poly_expr_node(), LMCAS::solver_detail::is_polynomial_node(), LMCAS::anonymous_namespace{relation_store.cpp}::is_transitive_op(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::logical(), LMCAS::expr_detail::ExprParser::logical(), LMCAS::anonymous_namespace{expr_facade.cpp}::logical_expression(), make_normalized_multiply_node(), LMCAS::solver_detail::multiply_no_expand(), LMCAS::AddNode::normalize_operands(), LMCAS::MultiplyNode::normalize_operands(), LMCAS::expr_detail::ExprParser::parse_equality(), LMCAS::expr_detail::ExprParser::parse_relational(), polynomial_logic(), polynomial_relation(), LMCAS::anonymous_namespace{integration_rational_collection.cpp}::rd_collect_rational(), LMCAS::anonymous_namespace{integration_rational_collection.cpp}::rd_collect_sum(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::relation(), relation(), LMCAS::expr_detail::ExprParser::relational(), LMCAS::anonymous_namespace{assumption_serialization.cpp}::relop_to_string(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::SubstNodeVisitor::replace(), LMCAS::detail::reversed_relation(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::rewrite_exp_as_u_power(), LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::sign_condition(), LMCAS::anonymous_namespace{complex_analysis.cpp}::split_real_imag(), symbolic_node_to_multipoly(), te_inv_product(), LMCAS::transform_detail::te_split_coeff(), tf_collect_transcendental(), tf_degree_in(), tf_detect_exponential_separation(), tf_detect_multiplicative_structure(), tf_extract_exp_factor(), tf_remove_exp_factor(), tf_simplify_pythagorean_node(), tf_substitute_expr(), LMCAS::anonymous_namespace{mixed_transcendental_classification.cpp}::TranscendentalDetector::visit(), LMCAS::anonymous_namespace{mixed_transcendental_classification.cpp}::TranscendentalDetector::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::groebner_detail::PolyBuilder::visit(), LMCAS::groebner_detail::PolyBuilder::visit(), LMCAS::RewriteVisitor::visit(), LMCAS::RewriteVisitor::visit(), LMCAS::solver_detail::anonymous_namespace{solver_imaginary.cpp}::ContainsImaginaryVisitor::visit(), LMCAS::solver_detail::anonymous_namespace{solver_imaginary.cpp}::ContainsImaginaryVisitor::visit(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_has_trig_of_var(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_is_rational_trig(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_replace() , 以及 LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_to_rational().

◆ options

const ExprPtr ComputationContext const LMCAS::EqvOptions & LMCAS::options = {})

在文件 expr.hpp 第 355 行定义.

被这些函数引用 __attribute__(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::apply_profile(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::apply_root_representation_policy(), LMCAS::detail::anonymous_namespace{exact_root.cpp}::approximate_real_isolation(), bisection_checked(), bisection_checked(), check_equivalent(), check_zero_residual(), equivalent(), LMCAS::detail::equivalent_impl(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::equivalent_with_budget(), LMCAS::detail::evaluate_root_complex(), LMCAS::detail::evaluate_root_real(), LMCAS::equivalence_detail::exact_integer_node(), LMCAS::detail::finalize_solution_set(), LMCAS::anonymous_namespace{newton_raphson.cpp}::invalid_root_options(), newton_raphson_checked(), newton_raphson_checked(), newton_raphson_checked(), newton_raphson_checked(), project_finite_expr_set(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_checked_operands(), LMCAS::anonymous_namespace{residual_verification.cpp}::prove_normalized_residual(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_operands(), LMCAS::anonymous_namespace{residual_verification.cpp}::prove_piecewise_residual(), LMCAS::equivalence_detail::prove_rational_polynomial_equivalence(), LMCAS::anonymous_namespace{residual_verification.cpp}::prove_with_profiles(), LMCAS::detail::refine_complex_isolation(), LMCAS::anonymous_namespace{newton_raphson.cpp}::root_config(), roots(), roots(), LMCAS::anonymous_namespace{newton_raphson.cpp}::run_bisection_backend(), LMCAS::anonymous_namespace{newton_raphson.cpp}::run_newton_backend(), set_eqv_budget(), set_eqv_profile(), solve(), solve(), solve_expr_set(), solve_expr_set(), solve_finite_checked(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_function_pattern(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_inner_equation(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_inverted_values(), solve_numeric_checked(), solve_product_factor(), solve_product_set(), solve_set(), solve_set(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_substitution(), solve_transcendental(), solve_transcendental(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_transcendental_impl(), LMCAS::detail::anonymous_namespace{exact_root.cpp}::valid_options() , 以及 LMCAS::equivalence_detail::validate_eqv_options().

◆ order

const std::vector<FGLMPoly> const MonomialOrder& LMCAS::order

在文件 fglm.hpp 第 103 行定义.

被这些函数引用 LMCAS::fglm_detail::MonomialEnumerator::MonomialEnumerator(), assemble_frobenius_polynomial(), asymptotic_expand(), calculate_residue_checked(), calculate_residue_checked(), calculate_residue_impl(), composition_inner_powers(), LMCAS::anonymous_namespace{fglm.cpp}::dependent_polynomial(), directional_derivative(), directional_derivative_checked(), directional_derivative_checked(), LMCAS::vector_calculus_detail::directional_derivative_impl(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_interval_checked(), lie_derivative_checked(), lie_derivative_checked(), lie_derivative_impl(), normal_form(), ordinary_series_recurrence(), ordinary_taylor_coefficients(), power_series_compose_checked(), power_series_compose_checked(), power_series_multiply_checked(), power_series_multiply_checked(), LMCAS::anonymous_namespace{matrix_decomposition_qr.cpp}::prove_exact_full_column_rank_qr_support(), LMCAS::anonymous_namespace{matrix_decomposition_cholesky.cpp}::prove_exact_spd(), quadrature_gaussian_numeric(), quadrature_gaussian_numeric(), LMCAS::anonymous_namespace{fglm_polynomial.cpp}::reduce_leading_term(), residue_checked(), residue_checked(), singular_series_recurrence(), singular_taylor_coefficients(), solve_frobenius_checked(), solve_frobenius_checked(), solve_frobenius_impl(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::sort_exact_inequality_roots(), LMCAS::anonymous_namespace{fglm_polynomial.cpp}::subtract_leading_multiple(), LMCAS::anonymous_namespace{complex_analysis.cpp}::validate_complex_expr_point_input(), LMCAS::anonymous_namespace{series_engine.cpp}::validate_power_series_order(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::variable_bounds() , 以及 LMCAS::vector_calculus_detail::vector_calculus_coord_vars().

◆ p2

◆ parametrization

const std::vector< std::string > const VectorField & LMCAS::parametrization

在文件 vector_calculus_curves.hpp 第 49 行定义.

被这些函数引用 curve_integral_scalar(), curve_integral_scalar_checked(), curve_integral_scalar_checked(), LMCAS::vector_calculus_detail::curve_integral_scalar_strict(), curve_integral_vector(), curve_integral_vector_checked(), curve_integral_vector_checked(), LMCAS::vector_calculus_detail::curve_integral_vector_strict(), greens_theorem_area(), greens_theorem_area_checked(), greens_theorem_area_checked(), LMCAS::vector_calculus_detail::greens_theorem_area_strict(), stokes_theorem(), stokes_theorem_checked(), stokes_theorem_checked(), LMCAS::vector_calculus_detail::stokes_theorem_strict(), surface_integral_scalar(), surface_integral_scalar_checked(), surface_integral_scalar_checked(), LMCAS::vector_calculus_detail::surface_integral_scalar_strict(), surface_integral_vector(), surface_integral_vector_checked(), surface_integral_vector_checked(), LMCAS::vector_calculus_detail::surface_integral_vector_strict(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), LMCAS::vector_calculus_detail::vector_calculus_cross_product_partials(), vector_calculus_cross_product_partials_strict(), vector_calculus_surface_dot_strict(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_parametrization(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_scalar_inputs(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_vector_inputs(), LMCAS::vector_calculus_detail::vector_calculus_validate_surface_parametrization(), LMCAS::vector_calculus_detail::vector_calculus_validate_surface_scalar_inputs() , 以及 LMCAS::vector_calculus_detail::vector_calculus_validate_surface_vector_inputs().

◆ plane

◆ point

const std::vector< std::shared_ptr< SymbolicExpr > > & LMCAS::point

在文件 limit_result.hpp 第 29 行定义.

被这些函数引用 LMCAS::anonymous_namespace{solve_transcendental.cpp}::append_parametric_union(), LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::assemble_plane(), LMCAS::detail::definite::boundary_value_checked(), collect_vertical_asymptotes(), continuity_at_checked(), continuity_at_checked(), LMCAS::anonymous_namespace{calculus_continuity.cpp}::continuity_from_limits(), LMCAS::anonymous_namespace{calculus_continuity.cpp}::continuity_with_limit(), LMCAS::anonymous_namespace{limit_result.cpp}::continuous_function_branch(), double_root_inequality_intervals(), LMCAS::anonymous_namespace{limit_result.cpp}::elementary_continuous_structure(), LMCAS::anonymous_namespace{limit_result.cpp}::evaluate_one_sided_node(), LMCAS::detail::anonymous_namespace{exact_algebraic_refinement.cpp}::evaluate_polynomial_double(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::extended_node(), extract_laurent_regular_part(), find_extrema_impl(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::include_rational_zeros(), inflection_curve_defined(), interval_contains_checked(), inverse_derivative_checked(), inverse_derivative_checked(), is_vertical_asymptote(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_at_checked_point(), limit_checked(), limit_checked(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_complex_at_point(), limit_expression_checked(), limit_expression_checked(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_one_sided_checked(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_real_at_point(), LMCAS::anonymous_namespace{limit_result.cpp}::oscillatory_one_sided_limit(), point_plane_distance_checked(), point_plane_distance_checked(), LMCAS::detail::anonymous_namespace{exact_sturm.cpp}::polynomial_sign_at(), LMCAS::anonymous_namespace{limit_result.cpp}::power_continuous_structure(), LMCAS::anonymous_namespace{limit_result.cpp}::scaled_one_sided_limit(), LMCAS::anonymous_namespace{symbolic_geometry_surface.cpp}::surface_gradient_at_point_checked(), surface_normal_checked(), surface_normal_checked(), LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::symbolic_line_plane_intersection(), LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::symbolic_point_plane_distance(), tangent_plane_checked(), tangent_plane_checked(), LMCAS::anonymous_namespace{limit_result.cpp}::validate_limit_input(), LMCAS::geometry_detail::validate_surface_point(), LMCAS::detail::anonymous_namespace{exact_sturm.cpp}::variations_at(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), LMCAS::vector_calculus_detail::vector_calculus_expr_zero_after_substitution(), LMCAS::vector_calculus_detail::vector_calculus_point_has_vars(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::ExpandVisitor::visit() , 以及 LMCAS::RewriteVisitor::visit().

◆ prime

◆ r

std::shared_ptr< SymbolicExpr > LMCAS::r

在文件 symbolic_complex.hpp 第 209 行定义.

被这些函数引用 LMCAS::ComplexNode::ComplexNode(), LMCAS::LogicalNode::LogicalNode(), LMCAS::MatrixNode::MatrixNode(), LMCAS::MatrixNode::MatrixNode(), LMCAS::RelationalNode::RelationalNode(), LMCAS::berlekamp_detail::bk_div_mod(), LMCAS::berlekamp_detail::bk_gcd_mod(), LMCAS::berlekamp_detail::bk_poly_mul_mod(), LMCAS::berlekamp_detail::bk_poly_pow_mod(), complex_exp_form_checked(), complex_exp_form_checked(), complex_locus_circle_checked(), complex_locus_circle_checked(), complex_trig_form_checked(), complex_trig_form_checked(), LMCAS::MatrixNode::create_storage_from_grid(), deduplicate_roots(), eliminate_parametric_column(), evaluated_lifting_cofactors(), extended_gcd(), extended_gcd_poly(), LMCAS::Polynomial< CoeffType >::gcd(), LMCAS::MatrixNode::get(), get_integer_value(), hl_extended_gcd_poly(), hl_poly_divmod(), hl_two_factor_lift(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::logical_condition_truth(), multivariate_diophantine(), multivariate_hensel_lift(), LMCAS::detail::definite::polynomial_sign_checked(), rational_root_factors(), rational_root_product(), LMCAS::anonymous_namespace{integration_rational_factorization.cpp}::rd_factor_piece(), LMCAS::anonymous_namespace{integration_rational_factorization.cpp}::rd_factor_quadratic(), LMCAS::anonymous_namespace{integration_rational_terms.cpp}::rd_integrate_linear_term(), LMCAS::anonymous_namespace{integration_rational_terms.cpp}::rd_var_minus(), recursive_multivariate_gcd(), LMCAS::groebner_detail::reduce(), LMCAS::polynomial_solver_detail::solve_by_factoring_impl(), LMCAS::Polynomial< CoeffType >::square_free_part(), LMCAS::polynomial_solver_detail::symbolic_quartic_depression(), LMCAS::polynomial_solver_detail::symbolic_quartic_roots(), tf_power_degree(), LMCAS::MatrixNode::validate_dense_storage(), LMCAS::MatrixNode::validate_sparse_storage(), LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit() , 以及 LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_to_rational().

◆ reconstruction_modulus

const std::vector< Polynomial< BigInt > > const BigInt & LMCAS::reconstruction_modulus

◆ rhs

const SymbolicExpr & LMCAS::rhs

在文件 expr.hpp 第 150 行定义.

被这些函数引用 LMCAS::NormalizationVisitor::NormalizationVisitor(), add(), add(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::add_complex(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::apply_profile(), LMCAS::ode_root_detail::approximate_polynomial_gcd(), LMCAS::anonymous_namespace{bigint_arithmetic.cpp}::bigint_mul(), LMCAS::FiniteSetNode::canonicalize(), LMCAS::anonymous_namespace{quantity.cpp}::checked_binary(), classify_first_order_ode(), LMCAS::NormalizationVisitor::collect_expanded_product(), LMCAS::MultiplyNode::compare_operands(), LMCAS::InferenceEngine::Impl::deduce_function_relation(), LMCAS::InferenceEngine::Impl::deduce_power_relations(), LMCAS::anonymous_namespace{relation_store.cpp}::derive_comparison_sign(), LMCAS::NormalizationVisitor::distribute_product(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::divide_complex(), domain_subset(), eq(), eq(), equivalent(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::equivalent_with_budget(), LMCAS::NormalizationVisitor::expand_complex_product(), LMCAS::NormalizationVisitor::expand_product(), expr_set_difference(), expr_set_intersection(), expr_set_subset(), expr_set_symmetric_difference(), expr_set_union(), finite_set_difference(), finite_set_intersection(), finite_set_symmetric_difference(), finite_set_union(), ge(), gt(), is_bernoulli_ode(), is_homogeneous_ode(), is_linear_first_order(), is_separable(), le(), LMCAS::expr_detail::ExprParser::logical(), logical_and(), LMCAS::anonymous_namespace{expr_facade.cpp}::logical_expression(), logical_or(), lt(), LMCAS::expr_detail::expr_common::make_binary_expr(), LMCAS::expr_detail::expr_common::make_binary_math_expr(), matrix_solve_linear_checked(), mul(), mul(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::multiply_checked(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::multiply_complex(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::multiply_intervals(), ne(), LMCAS::NodeCompare::operator()(), LMCAS::NodeEqual::operator()(), LMCAS::expr_detail::ExprParser::parse_additive(), LMCAS::expr_detail::ExprParser::parse_equality(), LMCAS::expr_detail::ExprParser::parse_logical_and(), LMCAS::expr_detail::ExprParser::parse_logical_or(), LMCAS::expr_detail::ExprParser::parse_membership(), LMCAS::expr_detail::ExprParser::parse_multiplicative(), LMCAS::expr_detail::ExprParser::parse_primary(), LMCAS::expr_detail::ExprParser::parse_relational(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prepare_operands(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_checked_operands(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_operands(), quantity_add(), quantity_divide(), quantity_multiply(), quantity_subtract(), relation(), LMCAS::expr_detail::ExprParser::relational(), solve_homogeneous_ode_checked(), solve_homogeneous_ode_checked(), solve_homogeneous_ode_impl(), solve_separable_ode(), structurally_equal(), sub(), sub(), sym_sub(), symbolic_polynomial_gcd(), LMCAS::transform_detail::te_gt_condition(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::verify_gcd_candidate() , 以及 LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::zero_numerator_domain().

◆ right

const ExprPtr& LMCAS::right

在文件 residual_verification.hpp 第 50 行定义.

被这些函数引用 LMCAS::anonymous_namespace{symbolic_geometry_vector.cpp}::accumulate_angle_product(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::add(), LMCAS::anonymous_namespace{poly_utils.cpp}::add_checked_coefficients(), LMCAS::anonymous_namespace{fglm_polynomial.cpp}::add_monomials(), LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::append_symbolic_plane_edges(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::cartesian_add(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::cartesian_multiply(), check_equivalent(), LMCAS::anonymous_namespace{poly_utils.cpp}::checked_product_count(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::coalesce_periodic_pair(), LMCAS::anonymous_namespace{poly_utils.cpp}::coefficient_arithmetic(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::combine(), LMCAS::anonymous_namespace{limit_result.cpp}::combine_one_sided_limits(), LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::combine_surd_product(), LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::combine_surd_sum(), LMCAS::detail::ExactRootId::compare(), LMCAS::detail::definite::compare_boundaries(), LMCAS::detail::compare_comparable(), LMCAS::anonymous_namespace{residual_comparison.cpp}::compare_defined_values(), LMCAS::anonymous_namespace{symbolic_number_order.cpp}::compare_exact_nodes(), LMCAS::anonymous_namespace{symbolic_number_order.cpp}::compare_exact_to_rational(), LMCAS::detail::anonymous_namespace{complex_root_isolation.cpp}::compare_isolations(), LMCAS::anonymous_namespace{symbolic_node_order.cpp}::compare_matrix_elements(), LMCAS::detail::compare_pointwise_values(), LMCAS::detail::anonymous_namespace{interval_endpoint_order.cpp}::compare_rationals(), LMCAS::NumberNode::compare_same_type(), LMCAS::anonymous_namespace{symbolic_number_order.cpp}::compare_values(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::compatible_periodic_conditions(), LMCAS::anonymous_namespace{limit_visitor_direction.cpp}::conjunctive_near_point_truth(), continuity_at_checked(), LMCAS::anonymous_namespace{calculus_continuity.cpp}::continuity_from_limits(), LMCAS::anonymous_namespace{limit_visitor_direction.cpp}::disjunctive_near_point_truth(), LMCAS::NormalizationVisitor::distribute_product(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::divide_complex(), endpoints_equivalent(), eq(), LMCAS::detail::matrix_kernel::exact_add(), LMCAS::detail::matrix_kernel::exact_multiply(), LMCAS::detail::matrix_kernel::exact_subtract(), LMCAS::NormalizationVisitor::expand_complex_product(), LMCAS::NormalizationVisitor::expand_product(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_multivariate_impl(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::finish(), finite_set_difference(), finite_set_intersection(), finite_set_symmetric_difference(), finite_set_union(), LMCAS::NormalizationVisitor::fuse_matrix_product(), hl_coeff_vectors_equal(), LMCAS::detail::RewriteBudget::input_nodes(), intervals_equivalent(), intervals_overlap_checked_impl(), is_vertical_asymptote(), LMCAS::detail::complex_root::isolate_nonreal_roots(), LMCAS::detail::anonymous_namespace{exact_sturm.cpp}::isolate_sturm_sequence(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_real_at_point(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::logical_condition_truth(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::logical_predicate_truth(), matrix_multiply_checked(), LMCAS::NormalizationVisitor::matrix_product_element(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::multiply(), LMCAS::anonymous_namespace{poly_utils.cpp}::multiply_checked_coefficients(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::multiply_complex(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::multiply_intervals(), LMCAS::anonymous_namespace{inference_engine_product.cpp}::multiply_sign_sets(), normalization_factor_less(), LMCAS::detail::definite::ordered_partition_roots(), LMCAS::anonymous_namespace{residual_comparison.cpp}::pointwise_values_defined(), polynomial_logic(), polynomial_product_fits(), polynomial_relation(), LMCAS::detail::definite::polynomial_sign_checked(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prepare_operands(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_operands(), quantity_add(), quantity_divide(), quantity_multiply(), quantity_subtract(), LMCAS::detail::definite::rational_pole_divergence(), LMCAS::detail::anonymous_namespace{complex_root_isolation.cpp}::same_polynomial(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_rectangles.cpp}::separate_projection_intervals(), solve_equation(), solve_set_core(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::structural(), structurally_equal(), LMCAS::detail::anonymous_namespace{exact_sturm.cpp}::subdivide_isolation(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::subtract(), LMCAS::anonymous_namespace{fglm_polynomial.cpp}::subtract_monomials(), LMCAS::anonymous_namespace{normalization_arithmetic.cpp}::sum_term_less(), LMCAS::anonymous_namespace{symbolic_algebra_adapter.cpp}::sylvester_matrix(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_projection.cpp}::sylvester_matrix(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_projection.cpp}::sylvester_resultant(), te_convolve_core(), tf_pair_constraint(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), LMCAS::vector_calculus_detail::vector_calculus_cross_component(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::verify_jordan_identity(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::RewriteVisitor::visit(), LMCAS::RewriteVisitor::visit() , 以及 LMCAS::anonymous_namespace{solve_transcendental.cpp}::zero_difference().

◆ set

◆ steps

◆ sy

double LMCAS::sy

在文件 symbolic_matrix.hpp 第 167 行定义.

被这些函数引用 matrix_scaling_checked() , 以及 matrix_scaling_checked().

◆ t

const std::string & LMCAS::t

在文件 vector_calculus_curves.hpp 第 50 行定义.

被这些函数引用 LMCAS::FunctionNode::FunctionNode(), add_lagrange_value(), asymptotic_expand(), LMCAS::berlekamp_detail::bk_mod_inverse(), crt_checked(), curvature_parametric_checked(), curvature_parametric_checked(), curve_integral_scalar(), curve_integral_scalar_checked(), curve_integral_scalar_checked(), LMCAS::vector_calculus_detail::curve_integral_scalar_strict(), curve_integral_vector(), curve_integral_vector_checked(), curve_integral_vector_checked(), LMCAS::vector_calculus_detail::curve_integral_vector_strict(), extended_gcd(), extended_gcd_poly(), LMCAS::detail::extract_common_monomial(), fourier_transform_checked(), fourier_transform_checked(), fourier_transform_core(), greens_theorem_area(), greens_theorem_area_checked(), greens_theorem_area_checked(), LMCAS::vector_calculus_detail::greens_theorem_area_strict(), hl_multi_factor_lift(), hl_two_factor_lift(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::integrate_even_case(), LMCAS::ModInt::inverse(), inverse_fourier_transform_checked(), inverse_fourier_transform_checked(), inverse_fourier_transform_core(), inverse_laplace_checked(), inverse_laplace_checked(), inverse_laplace_core(), LMCAS::anonymous_namespace{mixed_transcendental_search.cpp}::is_periodic_func(), LMCAS::anonymous_namespace{mixed_transcendental_classification.cpp}::is_transcendental_func(), laplace_transform_checked(), laplace_transform_checked(), LMCAS::transform_detail::laplace_transform_core(), LMCAS::groebner_detail::mul_poly_term(), LMCAS::anonymous_namespace{integration_rational_coefficients.cpp}::rd_factor_complements(), LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_is_fn_of_var(), LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::symbolic_line_plane_intersection(), te_abs_decay(), te_extract_exp(), te_fourier_sum(), te_fourier_unevaluated(), te_inv_power(), te_inv_product(), te_laplace_lookup(), te_laplace_roc(), te_laplace_sum(), te_unevaluated_inv_laplace(), te_unevaluated_laplace(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_parametrization(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_scalar_inputs(), LMCAS::vector_calculus_detail::vector_calculus_validate_curve_vector_inputs() , 以及 LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_replace_function().

◆ target

const ExprPtr & LMCAS::target

在文件 expr.hpp 第 317 行定义.

被这些函数引用 LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::FreeSubstitution(), LMCAS::InferenceEngine::Impl::absolute_domain(), LMCAS::InferenceEngine::Impl::absolute_sign(), LMCAS::InferenceEngine::Impl::arctangent_domain(), LMCAS::anonymous_namespace{univariate_factor_bridge.cpp}::bridge_lift_bound(), LMCAS::calculus_utils_detail::calculus_utils_validate_expr_target(), complementary_square(), convert_unit(), LMCAS::anonymous_namespace{query_conditions.cpp}::difference_conditions(), diophantine_target(), divides_monomial(), LMCAS::InferenceEngine::Impl::even_power_sign(), LMCAS::detail::exact_e_bounds(), LMCAS::InferenceEngine::Impl::exponential_domain(), LMCAS::InferenceEngine::Impl::exponential_sign(), expr_match(), expr_match(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::extended_node(), LMCAS::InferenceEngine::Impl::function_domain(), LMCAS::InferenceEngine::Impl::function_sign(), LMCAS::InferenceEngine::Impl::integer_power_sign(), LMCAS::InferenceEngine::Impl::integral_power_domain(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::inverse_trig(), LMCAS::InferenceEngine::Impl::known_sign(), LMCAS::InferenceEngine::Impl::logarithm_domain(), LMCAS::InferenceEngine::Impl::logarithm_sign(), match_function(), match_operation(), match_recursive(), LMCAS::InferenceEngine::Impl::multiply_domain(), multivariate_diophantine(), LMCAS::InferenceEngine::Impl::nonnegative_sign(), LMCAS::InferenceEngine::Impl::nonzero_power_sign(), LMCAS::InferenceEngine::Impl::operand_sign(), LMCAS::InferenceEngine::Impl::positive_integer_power_sign(), LMCAS::InferenceEngine::Impl::positive_power_sign(), LMCAS::anonymous_namespace{query_conditions.cpp}::product_conditions(), LMCAS::InferenceEngine::Impl::product_parity_sign(), LMCAS::InferenceEngine::Impl::product_relation_sign(), LMCAS::InferenceEngine::Impl::product_sign(), LMCAS::anonymous_namespace{query_conditions.cpp}::quotient_conditions(), LMCAS::InferenceEngine::Impl::quotient_sign(), record_remainder(), LMCAS::detail::anonymous_namespace{exact_matrix.cpp}::reduce_above(), LMCAS::detail::anonymous_namespace{exact_rational_solve.cpp}::reduce_rational_pivot(), LMCAS::detail::reduce_rational_rows(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::select_equation(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::select_target(), LMCAS::anonymous_namespace{inference_engine_product.cpp}::sign_set(), LMCAS::detail::anonymous_namespace{exact_constant_bounds.cpp}::small_atan(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::solve(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::solve(), solve_diophantine_pair(), LMCAS::InferenceEngine::Impl::square_root_domain(), LMCAS::InferenceEngine::Impl::square_root_sign(), LMCAS::detail::anonymous_namespace{exact_matrix.cpp}::subtract_pivot_row(), LMCAS::InferenceEngine::Impl::subtraction_sign(), LMCAS::anonymous_namespace{query_conditions.cpp}::sum_conditions(), LMCAS::InferenceEngine::Impl::sum_relation_sign(), LMCAS::InferenceEngine::Impl::sum_sign(), LMCAS::detail::anonymous_namespace{exact_matrix_determinant.cpp}::symbolic_determinant_value(), LMCAS::anonymous_namespace{query_conditions.cpp}::variable_operand_conditions(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::RewriteVisitor::visit(), LMCAS::InferenceEngine::Impl::weak_subtraction_sign() , 以及 LMCAS::InferenceEngine::Impl::zero_power_sign().

◆ u

const std::vector< std::string > const VectorField const std::string & LMCAS::u

在文件 vector_calculus_surfaces.hpp 第 59 行定义.

被这些函数引用 gram_schmidt(), is_analytic_impl(), LMCAS::integration_table_detail::load_algebraic_elementary_rules(), LMCAS::integration_table_detail::load_algebraic_radicals_rules(), LMCAS::integration_table_detail::load_algebraic_reciprocals_rules(), LMCAS::integration_table_detail::load_exponential_base_rules(), LMCAS::integration_table_detail::load_exponential_rules(), LMCAS::integration_table_detail::load_exponential_trig_rules(), LMCAS::integration_table_detail::load_hyperbolic_rules(), LMCAS::integration_table_detail::load_inverse_trig_rules(), LMCAS::integration_table_detail::load_logarithmic_rules(), LMCAS::integration_table_detail::load_polynomial_rules(), LMCAS::integration_table_detail::load_scaled_radical_rules(), LMCAS::integration_table_detail::load_scaled_trig_rules(), LMCAS::integration_table_detail::load_trig_derivatives_rules(), LMCAS::integration_table_detail::load_trig_primitives_rules(), LMCAS::integration_table_detail::load_trig_squares_rules(), LMCAS::polynomial_solver_detail::solve_biquadratic_impl(), stokes_theorem(), stokes_theorem_checked(), stokes_theorem_checked(), LMCAS::vector_calculus_detail::stokes_theorem_strict(), LMCAS::anonymous_namespace{integration_substitution.cpp}::substitute_candidate(), LMCAS::anonymous_namespace{integration_substitution.cpp}::substitution_primitive(), surface_integral_scalar(), surface_integral_scalar_checked(), surface_integral_scalar_checked(), LMCAS::vector_calculus_detail::surface_integral_scalar_strict(), surface_integral_vector(), surface_integral_vector_checked(), surface_integral_vector_checked(), LMCAS::vector_calculus_detail::surface_integral_vector_strict(), symbolic_cubic_roots(), LMCAS::polynomial_solver_detail::symbolic_quartic_roots(), symbolic_sum(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), LMCAS::vector_calculus_detail::vector_calculus_cross_product_partials(), vector_calculus_cross_product_partials_strict(), LMCAS::vector_calculus_detail::vector_calculus_validate_surface_parametrization(), LMCAS::vector_calculus_detail::vector_calculus_validate_surface_scalar_inputs(), LMCAS::vector_calculus_detail::vector_calculus_validate_surface_vector_inputs() , 以及 LMCAS::DifferentiationVisitor::visit().

◆ u_bounds

const std::vector< std::string > const VectorField const std::string const std::string const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & LMCAS::u_bounds

◆ u_lower

◆ u_upper

◆ unit

◆ upper

const ExprPtr const ExprPtr & LMCAS::upper

在文件 expr.hpp 第 148 行定义.

被这些函数引用 LMCAS::anonymous_namespace{integration_definite.cpp}::DefiniteInterval::DefiniteInterval(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentFacts::SegmentFacts(), adaptive_simpson_numeric(), adaptive_simpson_numeric(), alternating_sequence_bound(), LMCAS::detail::anonymous_namespace{exact_root.cpp}::approximate_component(), LMCAS::detail::anonymous_namespace{exact_root.cpp}::approximate_real_isolation(), LMCAS::detail::anonymous_namespace{exact_algebraic_refinement.cpp}::approximate_root(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::arctangent_bounds(), bisection_checked(), bisection_checked(), LMCAS::detail::definite::certify_continuity_checked(), LMCAS::detail::anonymous_namespace{exact_algebraic_refinement.cpp}::certify_dyadic_candidate(), LMCAS::anonymous_namespace{interval_set_operations.cpp}::checked_interval_views(), clamp(), clamp(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::closed_bounds(), LMCAS::anonymous_namespace{interval_normalization.cpp}::collect_nonempty_intervals(), LMCAS::anonymous_namespace{interval_set_operations.cpp}::complement_lower_from_upper(), LMCAS::anonymous_namespace{interval_set_operations.cpp}::complement_upper_from_lower(), LMCAS::detail::anonymous_namespace{exact_sturm.cpp}::count_open_roots(), LMCAS::detail::count_real_roots_exact(), LMCAS::detail::definite::definite_partition_checked(), LMCAS::detail::definite::definite_segment_checked(), LMCAS::anonymous_namespace{matrix_decomposition_lu.cpp}::eliminate_lu_column(), LMCAS::anonymous_namespace{integration_definite.cpp}::equal_endpoint_integral(), LMCAS::anonymous_namespace{numerical_integration.cpp}::evaluate_interval(), LMCAS::anonymous_namespace{symbolic_set.cpp}::exact_interval_membership(), LMCAS::anonymous_namespace{expr_serialization_reader.cpp}::Reader::extended_node(), LMCAS::anonymous_namespace{matrix_decomposition_lu.cpp}::factor_lu(), LMCAS::solver_detail::finite_midpoint(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_interval_checked(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_ordered_interval(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_segment_primitive(), LMCAS::expr_detail::ExprParser::interval(), interval(), interval(), interval_contains_checked(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::interval_delimiters_valid(), interval_is_empty_checked(), interval_to_expr(), make_interval(), LMCAS::expr_detail::ExprParser::parse_interval_literal(), parse_interval_upper(), parse_single_interval(), LMCAS::detail::definite::prepare_segment_primitive(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_rectangles.cpp}::projection_bands(), quadrature_gaussian_numeric(), quadrature_gaussian_numeric(), quadrature_simpson_numeric(), quadrature_simpson_numeric(), LMCAS::Irrational::EnclosureRound::radical(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::rational_bounds(), LMCAS::detail::anonymous_namespace{exact_matrix.cpp}::reduce_above(), LMCAS::anonymous_namespace{newton_raphson.cpp}::run_bisection_backend(), LMCAS::detail::definite::segment_expression_checked(), sequence_extreme_limit(), LMCAS::anonymous_namespace{newton_raphson.cpp}::solve_isolated_polynomial(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::sum_bounds(), symbolic_product(), symbolic_sum(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::trigonometric_target_range(), LMCAS::anonymous_namespace{integration_definite.cpp}::unresolved_integral(), valid_newton_bracket(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::validate_geometry_inputs(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::validate_interval_endpoints(), LMCAS::anonymous_namespace{numerical_integration.cpp}::validate_quadrature_args(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::variable_bounds(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::RewriteVisitor::visit(), LMCAS::RewriteVisitor::visit(), LMCAS::RewriteVisitor::visit() , 以及 LMCAS::RewriteVisitor::visit().

◆ upper_closed

◆ v

const std::vector< std::string > const VectorField const std::string const std::string & LMCAS::v

在文件 vector_calculus_surfaces.hpp 第 59 行定义.

被这些函数引用 LMCAS::detail::SymbolicVisitor::DepthGuard::DepthGuard(), LMCAS::DifferentiationVisitor::DifferentiationVisitor(), LMCAS::ModInt::ModInt(), LMCAS::NumberNode::NumberNode(), LMCAS::NumberNode::NumberNode(), LMCAS::NumberNode::NumberNode(), LMCAS::anonymous_namespace{mixed_transcendental_search.cpp}::PeriodicCollector::PeriodicCollector(), LMCAS::groebner_detail::PolyBuilder::PolyBuilder(), LMCAS::groebner_detail::PolyBuilder::PolyBuilder(), LMCAS::anonymous_namespace{mixed_transcendental_classification.cpp}::TranscendentalDetector::TranscendentalDetector(), LMCAS::fglm_detail::GaussianEliminator::add_vector(), LMCAS::SymbolicFactory::create_number(), LMCAS::SymbolicFactory::create_number(), LMCAS::SymbolicFactory::create_number(), LMCAS::anonymous_namespace{mixed_transcendental_classification.cpp}::degree_in_var(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::extract_exp_multiplier(), LMCAS::anonymous_namespace{mixed_transcendental_search.cpp}::extract_linear_coefficient(), gram_schmidt(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::integrate_sec_power(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::integrate_tan_power(), is_analytic_impl(), LMCAS::anonymous_namespace{solver_assumptions.cpp}::is_integer_value(), LMCAS::integration_table_detail::load_polynomial_rules(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::make_cos_scaled(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::make_sin_scaled(), LMCAS::anonymous_namespace{integration_rational_collection.cpp}::rd_collect_rational(), LMCAS::anonymous_namespace{integration_rational.cpp}::rd_integrate_polynomial(), LMCAS::anonymous_namespace{integration_rational_terms.cpp}::rd_var_minus(), LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_is_fn_of_var(), stokes_theorem(), stokes_theorem_checked(), stokes_theorem_checked(), LMCAS::vector_calculus_detail::stokes_theorem_strict(), surface_integral_scalar(), surface_integral_scalar_checked(), surface_integral_scalar_checked(), LMCAS::vector_calculus_detail::surface_integral_scalar_strict(), surface_integral_vector(), surface_integral_vector_checked(), surface_integral_vector_checked(), LMCAS::vector_calculus_detail::surface_integral_vector_strict(), symbolic_cubic_roots(), te_is_hyp(), te_is_power_of_var(), LMCAS::transform_detail::te_split_coeff(), tf_degree_in(), total_differential(), LMCAS::anonymous_namespace{integration_trigonometric.cpp}::trig_match_of_var(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), LMCAS::vector_calculus_detail::vector_calculus_cross_product_partials(), vector_calculus_cross_product_partials_strict(), vector_calculus_magnitude_squared(), LMCAS::vector_calculus_detail::vector_calculus_validate_surface_parametrization(), LMCAS::vector_calculus_detail::vector_calculus_validate_surface_scalar_inputs(), LMCAS::vector_calculus_detail::vector_calculus_validate_surface_vector_inputs() , 以及 LMCAS::DifferentiationVisitor::visit().

◆ v_bounds

const std::vector< std::string > const VectorField const std::string const std::string const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & LMCAS::v_bounds

◆ v_lower

◆ v_upper

◆ value

double LMCAS::value

在文件 expr.hpp 第 293 行定义.

被这些函数引用 LMCAS::SymbolicPolyCoeff::SymbolicPolyCoeff(), LMCAS::SymbolicPolyCoeff::SymbolicPolyCoeff(), LMCAS::SymbolicPolyCoeff::abs, LMCAS::modular_detail::abs_to_u64(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::accept_symbolic(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::accept_symbolic_witness(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::accept_value(), accumulate_bernoulli_exponent(), add_lagrange_value(), LMCAS::anonymous_namespace{transcendental_rewrite.cpp}::FactorSimplification::append_number(), append_product_roots(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::approx_part(), approx_real(), LMCAS::detail::anonymous_namespace{exact_root.cpp}::approximate_component(), LMCAS::detail::anonymous_namespace{exact_root.cpp}::approximate_real_isolation(), LMCAS::detail::anonymous_namespace{exact_algebraic_refinement.cpp}::approximate_root(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::arctangent_endpoint(), LMCAS::detail::anonymous_namespace{assumption_simplification.cpp}::assumed_transform(), attach_unit(), attach_unit(), bernoulli_integer_exponent(), binding(), LMCAS::detail::definite::boundary_checked(), LMCAS::anonymous_namespace{differential_geometry.cpp}::bounded_binomial(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::certified_jordan(), LMCAS::detail::anonymous_namespace{exact_algebraic_refinement.cpp}::certify_dyadic_candidate(), LMCAS::anonymous_namespace{residual_verification.cpp}::check_residual_coefficient(), checked_derivative(), LMCAS::anonymous_namespace{numerical_integration.cpp}::checked_finite_value(), LMCAS::anonymous_namespace{calculus_continuity.cpp}::classify_continuity_point_value(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_product(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_sum(), LMCAS::detail::anonymous_namespace{exact_matrix_support.cpp}::classify_numeric_value(), LMCAS::detail::anonymous_namespace{symbolic_quadric_classification.cpp}::classify_translated_quadric(), LMCAS::detail::anonymous_namespace{facts_query_rational.cpp}::closed_rational_power(), LMCAS::detail::closed_rational_value(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::coefficient(), LMCAS::detail::anonymous_namespace{symbolic_quadric_classification.cpp}::coefficient_of_square(), LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::collect_exact_factors(), LMCAS::detail::anonymous_namespace{interval_endpoint_order.cpp}::compare_algebraic_to_rational(), LMCAS::anonymous_namespace{limit_result.cpp}::complex_polynomial_nonzero(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::constant(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_projection.cpp}::constant_poly(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::constant_satisfies(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_relations.cpp}::consume_delimiter(), LMCAS::anonymous_namespace{calculus_continuity.cpp}::continuity_point_value(), LMCAS::anonymous_namespace{calculus_continuity.cpp}::continuity_with_limit(), LMCAS::detail::anonymous_namespace{exact_root.cpp}::conversion_ulp(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::convert_number(), convert_unit(), convert_unit(), crt_checked(), LMCAS::anonymous_namespace{symbolic_construction.cpp}::decimal_rational(), deduplicate_roots(), LMCAS::detail::differentiate_expression(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_number(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_root(), LMCAS::anonymous_namespace{symbolic_matrix_eigen.cpp}::eigenvalue_nullspace(), LMCAS::serialization_detail::enum_name(), LMCAS::anonymous_namespace{integration_definite.cpp}::equal_endpoint_integral(), LMCAS::anonymous_namespace{numerical_integration.cpp}::estimated_quadrature_result(), LMCAS::detail::NumericEvaluator::evaluate(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_operands(), LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_power(), LMCAS::anonymous_namespace{numerical_integration.cpp}::evaluate_quadrature_callback(), LMCAS::anonymous_namespace{newton_raphson.cpp}::evaluate_root_callback(), LMCAS::anonymous_namespace{newton_raphson.cpp}::evaluate_root_function(), LMCAS::detail::exact_atan_bounds(), LMCAS::detail::exact_double_rational(), LMCAS::anonymous_namespace{symbolic_set.cpp}::exact_interval_membership(), LMCAS::anonymous_namespace{value.cpp}::exact_number_as_floating(), LMCAS::detail::matrix_decomposition::exact_number_expr(), LMCAS::detail::inequality_support::exact_numeric_sign(), exact_rational_domain_excludes(), LMCAS::detail::matrix_decomposition::exact_rational_expr(), LMCAS::detail::matrix_decomposition::exact_rational_matrix(), LMCAS::detail::matrix_decomposition::anonymous_namespace{matrix_decomposition_support.cpp}::exact_rational_product(), LMCAS::detail::anonymous_namespace{complex_root_isolation.cpp}::exact_rational_square_root(), LMCAS::detail::matrix_decomposition::anonymous_namespace{matrix_decomposition_support.cpp}::exact_rational_sum(), exact_small_integer_node(), LMCAS::anonymous_namespace{expr_number_domains.cpp}::exact_sqrt_contains(), LMCAS::anonymous_namespace{symbolic_set.cpp}::exact_value(), LMCAS::detail::expand_expression(), LMCAS::detail::anonymous_namespace{numeric_evaluation_power.cpp}::exponent_parity(), expr_match(), extract_bernoulli_factor(), LMCAS::anonymous_namespace{normalization_numeric_powers.cpp}::extract_small_square_factor(), LMCAS::detail::NumericEvaluator::extremum(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::SolutionFinalizer::finalize_value(), find_extrema_impl(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::finish(), LMCAS::anonymous_namespace{bigint_combinatorics.cpp}::finish_combinatorial(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::finite_endpoint(), finite_values_to_set(), LMCAS::anonymous_namespace{value.cpp}::format_float(), frobenius_coefficient_limit(), LMCAS::detail::NumericEvaluator::function(), get_integer_value(), hash_combine(), hl_is_prime(), LMCAS::anonymous_namespace{limit_result.cpp}::infinity_sign(), LMCAS::detail::definite::infinity_sign(), inflection_curve_defined(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::integer(), integer(), integer(), LMCAS::groebner_detail::anonymous_namespace{solver_groebner_builder.cpp}::integer_exponent(), LMCAS::detail::series_support::integer_value_from_node(), integration_bounded_exponent(), interval_contains_checked(), interval_contains_checked(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::invert_exponential(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::invert_logarithm(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::invert_trigonometric(), LMCAS::assumption_detail::is_closing_delimiter(), is_euler_equation(), LMCAS::NormalizationVisitor::is_positive_integer_number(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentFacts::is_real(), is_representable_small_integer(), is_vertical_asymptote(), LMCAS::anonymous_namespace{integrator.cpp}::is_zero(), LMCAS::anonymous_namespace{bigint_combinatorics.cpp}::kernel_argument(), LMCAS::InferenceEngine::Impl::known_sign(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_complex_at_point(), limit_expression_checked(), LMCAS::InferenceEngine::Impl::logarithm_sign(), LMCAS::anonymous_namespace{quantity.cpp}::make_quantity(), matrix_characteristic_polynomial_checked(), matrix_eigenvalues_checked(), LMCAS::anonymous_namespace{normalization_matrices.cpp}::matrix_element(), LMCAS::detail::mixed_evaluate_at(), LMCAS::detail::mixed_evaluate_with_retry(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::negate(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::negate_truth(), norm_subst_index(), normalization_numeric_function(), normalization_numeric_power(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::normalize(), LMCAS::NormalizationVisitor::normalize_unary_function(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::number(), LMCAS::detail::NumericEvaluator::number(), LMCAS::anonymous_namespace{normalization_numeric_functions.cpp}::number_equals_integer(), LMCAS::detail::numeric_approximation(), numeric_domain_excludes(), numeric_sign_excludes(), operator<<(), LMCAS::anonymous_namespace{limit_result.cpp}::outcome(), parametric_linear_solution(), LMCAS::expr_detail::ExprParser::parse_approx_literal(), parse_approximate_atom(), LMCAS::detail::parse_finite_decimal(), LMCAS::assumption_detail::parse_finite_number_node(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::parse_interval_endpoint(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_values.cpp}::parse_named_value(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::polish_value(), LMCAS::anonymous_namespace{symbolic_factor.cpp}::polynomial_exponent(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::polynomial_exponent(), LMCAS::ode_root_detail::polynomial_root_backward_error(), LMCAS::detail::anonymous_namespace{exact_sturm.cpp}::polynomial_sign_at(), LMCAS::anonymous_namespace{limit_result.cpp}::ComplexContinuityPoint::positive(), LMCAS::anonymous_namespace{symbolic_cancel.cpp}::positive_denominator_exponent(), LMCAS::detail::NumericEvaluator::power(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::power_candidate(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::power_pattern(), LMCAS::detail::NumericEvaluator::product(), LMCAS::detail::definite::product_checked(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::product_exp_multiplier(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentFacts::property(), LMCAS::detail::anonymous_namespace{exact_algebraic_refinement.cpp}::propose_dyadic_bracket(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::prove(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_operands(), LMCAS::equivalence_detail::prove_rational_polynomial_equivalence(), LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::put_integer(), LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::put_rational(), LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::put_size(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::quadratic_eigenvalue_sign(), quadrature_gaussian_numeric(), quadrature_simpson_numeric(), rational(), LMCAS::detail::anonymous_namespace{exact_matrix_determinant.cpp}::rational_determinant(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::rational_endpoint_bound(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::rational_is_negative(), LMCAS::detail::anonymous_namespace{exact_matrix_solve.cpp}::rational_linear_solve(), LMCAS::anonymous_namespace{quantity.cpp}::rational_node(), LMCAS::detail::definite::rational_pole_divergence(), LMCAS::detail::anonymous_namespace{interval_endpoint_order.cpp}::rational_sign(), LMCAS::detail::complex_root::rational_sign(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::rational_sign_intervals(), LMCAS::anonymous_namespace{rational_parsing.cpp}::RationalLiteral::read_exponent(), LMCAS::anonymous_namespace{rational_parsing.cpp}::RationalLiteral::read_exponent_magnitude(), LMCAS::detail::refine_exact_real_algebraic(), LMCAS::detail::refine_exact_real_algebraic_to_tolerance(), LMCAS::detail::complex_root::anonymous_namespace{complex_root_rectangles.cpp}::refine_projection_interval(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::relational_predicate_truth(), LMCAS::anonymous_namespace{residual_verification.cpp}::FormalResidual::rewrite_function(), LMCAS::equivalence_detail::rewritten_complex(), LMCAS::detail::inequality_support::anonymous_namespace{inequality_solver_ordering.cpp}::root_number_sign(), LMCAS::anonymous_namespace{newton_raphson.cpp}::run_bisection_backend(), scale_integral_field(), LMCAS::detail::anonymous_namespace{exact_algebraic_refinement.cpp}::search_dyadic_scale(), separable_reciprocal(), LMCAS::detail::anonymous_namespace{exact_algebraic.cpp}::sign(), LMCAS::detail::definite::sign(), LMCAS::NormalizationVisitor::simplify_assumed_square_root(), LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::simplify_coefficients(), LMCAS::detail::simplify_expression(), simplify_finite_limit(), LMCAS::anonymous_namespace{normalization_numeric_powers.cpp}::small_exact_power(), solution_is_excluded(), solve_complex_nth_root_checked(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::solve_exact_affine_inequality_impl(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_function_pattern(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_inner_equation(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_inverted_values(), LMCAS::detail::solve_linear_exact(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_substitution(), solve_symbolic_polynomial_set(), solve_transcendental(), LMCAS::detail::anonymous_namespace{numeric_evaluation_functions.cpp}::special(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::specialize_absolute(), LMCAS::detail::NumericEvaluator::square_root(), LMCAS::detail::anonymous_namespace{squared_norm.cpp}::square_root_argument(), LMCAS::solver_detail::anonymous_namespace{solver_imaginary.cpp}::square_root_is_imaginary(), LMCAS::detail::anonymous_namespace{squared_norm.cpp}::squared_term(), strip_unit(), substitute(), substitute(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::substitute_assignment(), LMCAS::detail::substitute_expression(), LMCAS::detail::substitute_expression(), LMCAS::detail::substitute_raw(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::substitute_solution(), LMCAS::anonymous_namespace{fglm_polynomial.cpp}::subtract_leading_multiple(), LMCAS::detail::NumericEvaluator::sum(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::symbolic_quadratic_sign(), LMCAS::detail::symmetric_remainder(), tf_power_degree(), LMCAS::detail::anonymous_namespace{interval_endpoint_order.cpp}::to_algebraic(), LMCAS::detail::anonymous_namespace{facts_query.cpp}::DomainTraversal::trigonometric_domain(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::trim_interval_endpoint(), try_get_integer_value(), LMCAS::integration_table_detail::u_is_var(), LMCAS::anonymous_namespace{differential_geometry.cpp}::validate_expr_vector(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentFacts::value_sign_impl(), LMCAS::vector_calculus_detail::vector_calculus_checked_finite_numeric(), vector_calculus_classify_critical_point(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), LMCAS::vector_calculus_detail::vector_calculus_expr_zero_after_substitution(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::verify_jordan_decomposition(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::verify_jordan_identity(), verify_lagrange_solutions(), LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit(), LMCAS::detail::RecursiveSymbolicVisitor::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::groebner_detail::PolyBuilder::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::RewriteVisitor::visit(), with_unit(), with_unit_definition() , 以及 zero_remainder().

◆ variable

const std::string & LMCAS::variable

在文件 expr.hpp 第 286 行定义.

被这些函数引用 LMCAS::anonymous_namespace{complex_analysis.cpp}::FunctionDependencyFinder::FunctionDependencyFinder(), LMCAS::anonymous_namespace{inference_engine_periodicity.cpp}::PeriodInference::PeriodInference(), __attribute__(), __attribute__(), active_univariate_variable(), adaptive_simpson_numeric(), adaptive_simpson_numeric(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::append_exact_factor_roots(), LMCAS::expr_detail::ExprParser::apply_integral(), LMCAS::expr_detail::ExprParser::apply_limit(), LMCAS::expr_detail::ExprParser::apply_rootof(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::arc_length_checked_impl(), binding(), bisection_checked(), bisection_checked(), LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::check_arguments(), checked_derivative(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_function(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_power(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_product(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_sum(), LMCAS::anonymous_namespace{limit_result.cpp}::classify_limit_result(), LMCAS::multivariate_checked_detail::collect_linear_samples(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_proof.cpp}::collect_polynomial_variable_names(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::collect_polynomial_variables(), LMCAS::anonymous_namespace{limit_result.cpp}::complex_polynomial_nonzero(), LMCAS::anonymous_namespace{limit_result.cpp}::complex_punctured_condition(), LMCAS::anonymous_namespace{limit_result.cpp}::complex_punctured_domain(), conditional_equation(), conditional_linear_polynomial(), LMCAS::anonymous_namespace{poly_utils.cpp}::constant_to_poly(), contains(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::definite_integral_geometry_checked(), depends_on_integration_variable(), LMCAS::anonymous_namespace{relation_store.cpp}::derive_comparison_sign(), differentiate(), differentiate(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::differentiate_geometry_checked(), differentiate_if_dependent(), embed_hensel_terms(), LMCAS::anonymous_namespace{limit_result.cpp}::evaluate_one_sided_node(), LMCAS::anonymous_namespace{newton_raphson.cpp}::evaluate_root_function(), LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::exact_operands(), LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::exact_polynomial_nodes(), expression_depends_on_variable(), extract_bernoulli_factor(), LMCAS::multivariate_checked_detail::factor_evaluated_linear(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_multivariate_impl(), find_extrema_impl(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::free_unknowns(), LMCAS::groebner_detail::PolyBuilder::function_depends_on_variables(), LMCAS::fglm_detail::generate_degree(), LMCAS::anonymous_namespace{fglm.cpp}::generate_standard_degree(), get_pi_coeff(), LMCAS::fglm_detail::has_pure_generators(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::has_unrecognized_variable_polynomial(), LMCAS::anonymous_namespace{matrix_quadratic_form.cpp}::independent_of_variables(), integrating_factor_from_antiderivative(), integrating_factor_from_ratio(), interval_to_expr(), is_pi_variable(), LMCAS::anonymous_namespace{symbolic_factor.cpp}::is_poly_expr_node(), LMCAS::fglm_detail::anonymous_namespace{fglm_dimension.cpp}::is_pure_power(), is_zero_dimensional(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_at_checked_point(), limit_checked(), limit_checked(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_complex_at_point(), limit_expression_checked(), limit_expression_checked(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_one_sided_checked(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_real_at_point(), linear2_root_basis(), LMCAS::anonymous_namespace{integration_substitution.cpp}::linear_reduced_expression(), make_rootof_checked(), make_rootof_checked(), matrix_characteristic_polynomial_checked(), matrix_characteristic_polynomial_checked(), newton_raphson_checked(), newton_raphson_checked(), newton_raphson_checked(), newton_raphson_checked(), LMCAS::anonymous_namespace{symbolic_gcd.cpp}::node_to_multivariate_polynomial(), numeric_sign_excludes(), LMCAS::anonymous_namespace{limit_result.cpp}::oscillatory_one_sided_limit(), LMCAS::assumption_detail::AssumptionParser::parse_periodic(), LMCAS::anonymous_namespace{inference_engine_periodicity.cpp}::periodicity_checked(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::product_exp_multiplier(), LMCAS::anonymous_namespace{mixed_transcendental_search.cpp}::product_linear_coefficient(), project_finite_expr_set(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::propagate(), LMCAS::equivalence_detail::prove_rational_polynomial_equivalence(), quadrature_gaussian_numeric(), quadrature_gaussian_numeric(), quadrature_simpson_numeric(), quadrature_simpson_numeric(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::rational_critical_points(), LMCAS::anonymous_namespace{inequality_solver_polynomial.cpp}::rational_polynomial_expression(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_node(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_number(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_power(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_product(), recognize_rational_polynomial(), LMCAS::anonymous_namespace{rational_polynomial_recognition.cpp}::recognize_sum(), reconstruct_rational_roots(), LMCAS::anonymous_namespace{transcendental_solver_substitution.cpp}::redundant_variable_candidate(), roots(), roots(), LMCAS::anonymous_namespace{newton_raphson.cpp}::run_bisection_backend(), LMCAS::anonymous_namespace{newton_raphson.cpp}::run_newton_backend(), LMCAS::anonymous_namespace{limit_result.cpp}::scaled_one_sided_limit(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::select_equation(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::select_target(), LMCAS::anonymous_namespace{assumption_serialization.cpp}::serialize_symbol_properties(), series_index_variable(), solution_is_excluded(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::solve(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::solve(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::solve(), solve(), solve(), solve_biquadratic(), solve_by_factoring(), solve_cubic(), LMCAS::polynomial_solver_detail::solve_cubic_impl(), solve_expr_set(), solve_expr_set(), solve_finite_checked(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::solve_free_unknown(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_inner_equation(), solve_product_factor(), solve_product_set(), solve_quartic(), solve_set(), solve_set(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::solve_single_equation(), solve_symbolic_polynomial_set(), solve_with_assumptions_checked(), solve_with_assumptions_checked(), solve_with_assumptions_impl(), LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::solved_inequality(), substitute(), substitute(), substitute(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::substitute_basis(), substitute_free(), symbol_name(), symbolic_power_to_poly(), symbolic_product_to_poly(), symbolic_root_term(), symbolic_sum_to_poly(), symbolic_to_poly_recursive(), LMCAS::transform_detail::anonymous_namespace{transform_support.cpp}::te_accumulate_gaussian_factor(), LMCAS::transform_detail::anonymous_namespace{transform_support.cpp}::te_atomic_gaussian_rate(), te_convolve_core(), te_convolve_sum(), LMCAS::transform_detail::te_depends_on(), LMCAS::transform_detail::anonymous_namespace{transform_support.cpp}::te_gaussian_product_rate(), te_inverse_pole(), te_inverse_pole_term(), te_is_abs_variable(), te_is_denominator_factor(), LMCAS::transform_detail::te_is_trig(), LMCAS::transform_detail::anonymous_namespace{transform_support.cpp}::te_is_variable_square(), LMCAS::transform_detail::te_linear_coefficient(), LMCAS::transform_detail::te_match_pure_gaussian(), LMCAS::transform_detail::te_match_scaled_gaussian(), LMCAS::groebner_detail::anonymous_namespace{solver_groebner_reconstruction.cpp}::term_node(), tf_polynomial_variables(), tf_select_main_variable(), truncated_factor_product(), validate_integration_steps(), LMCAS::anonymous_namespace{limit_result.cpp}::validate_limit_input(), LMCAS::anonymous_namespace{numerical_integration.cpp}::validate_quadrature_args(), LMCAS::anonymous_namespace{inference_engine_bounds.cpp}::BoundsPropagation::variable_bounds(), LMCAS::anonymous_namespace{query_conditions.cpp}::variable_operand_conditions(), vector_calculus_constant_integrand(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), verify_lagrange_solutions(), LMCAS::anonymous_namespace{symbolic_geometry.cpp}::volume_of_revolution_checked_impl(), LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_rational_function(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::zero_numerator_domain(), zt_is_weighted_exp() , 以及 zt_polynomial_pattern().

◆ vars

const std::vector< std::string > & LMCAS::vars

在文件 vector_calculus_differential.hpp 第 36 行定义.

被这些函数引用 LMCAS::detail::adjust_homogeneous_constant(), apply_hensel_lift_steps(), choose_main_variable(), LMCAS::detail::classify_quadric_impl(), LMCAS::detail::anonymous_namespace{symbolic_quadric_classification.cpp}::classify_translated_quadric(), LMCAS::detail::anonymous_namespace{symbolic_quadric_classification.cpp}::coefficient_of_constant(), LMCAS::detail::anonymous_namespace{symbolic_quadric_classification.cpp}::coefficient_of_linear(), curl(), curl_checked(), curl_checked(), LMCAS::vector_calculus_detail::curl_impl(), LMCAS::detail::detect_binomial_power(), LMCAS::detail::detect_difference_of_squares(), directional_derivative(), directional_derivative_checked(), directional_derivative_checked(), LMCAS::vector_calculus_detail::directional_derivative_impl(), divergence(), divergence_checked(), divergence_checked(), LMCAS::vector_calculus_detail::divergence_impl(), divergence_theorem(), divergence_theorem_checked(), divergence_theorem_checked(), LMCAS::vector_calculus_detail::divergence_theorem_strict(), embed_univariate_gcd(), embed_without_lifting(), evaluated_lifting_cofactors(), extended_gcd_interpolation(), exterior_derivative_checked(), exterior_derivative_checked(), LMCAS::anonymous_namespace{differential_geometry.cpp}::exterior_derivative_component(), LMCAS::anonymous_namespace{differential_geometry.cpp}::exterior_derivative_term(), LMCAS::detail::anonymous_namespace{symbolic_quadric_classification.cpp}::extract_axis_coefficients(), extract_coefficients(), LMCAS::detail::extract_common_monomial(), LMCAS::detail::anonymous_namespace{symbolic_quadric_classification.cpp}::extract_mixed_coefficients(), LMCAS::detail::factor_homogeneous_bivariate(), find_extrema(), find_extrema_checked(), find_extrema_checked(), find_extrema_impl(), formal_derivative(), gradient(), gradient_checked(), gradient_checked(), LMCAS::vector_calculus_detail::gradient_impl(), greens_theorem(), greens_theorem_checked(), greens_theorem_checked(), LMCAS::vector_calculus_detail::greens_theorem_strict(), hessian(), hessian_checked(), hessian_checked(), LMCAS::vector_calculus_detail::hessian_impl(), LMCAS::detail::homogenize_factor(), jacobian(), jacobian_checked(), jacobian_checked(), LMCAS::vector_calculus_detail::jacobian_impl(), lagrange_gradient_strict(), lagrange_multipliers(), lagrange_multipliers_checked(), lagrange_multipliers_checked(), lagrange_multipliers_strict(), laplacian(), laplacian_checked(), laplacian_checked(), LMCAS::vector_calculus_detail::laplacian_impl(), lie_derivative_checked(), lie_derivative_checked(), lie_derivative_impl(), lifting_error_coefficient(), lifting_shift_powers(), multipoly_to_symbolic(), multivariate_content(), multivariate_diophantine(), multivariate_gcd(), multivariate_hensel_lift(), quadratic_form_matrix(), recursive_multivariate_gcd(), solve_diophantine_pair(), square_free_decompose(), stokes_theorem(), stokes_theorem_checked(), stokes_theorem_checked(), LMCAS::vector_calculus_detail::stokes_theorem_strict(), symbolic_node_to_multipoly(), total_differential(), truncate_mod_var(), univariate_gcd(), LMCAS::anonymous_namespace{differential_geometry.cpp}::validate_expr_vector(), LMCAS::anonymous_namespace{differential_geometry.cpp}::validate_form_coefficients(), LMCAS::anonymous_namespace{differential_geometry.cpp}::validate_form_coordinates(), LMCAS::vector_calculus_detail::vector_calculus_coord_vars(), vector_calculus_curl_strict(), LMCAS::vector_calculus_detail::vector_calculus_point_has_vars(), vector_calculus_single_dir_deriv(), LMCAS::vector_calculus_detail::vector_calculus_validate_distinct_vars(), LMCAS::vector_calculus_detail::vector_calculus_validate_expr_vars(), LMCAS::vector_calculus_detail::vector_calculus_validate_field_vars(), LMCAS::vector_calculus_detail::vector_calculus_validate_functions_vars() , 以及 verify_lagrange_solutions().

◆ wildcards

const ExprPtr const std::vector< std::string > & LMCAS::wildcards

◆ x_bounds

◆ y_bounds

const std::vector< std::string > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & LMCAS::y_bounds

◆ z_bounds

const std::vector< std::string > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & LMCAS::z_bounds

◆ z_var