19#include <unordered_map>
43 if (!std::isfinite(
v)) {
47 lmmc_double_nearly_equal_tol(
v, std::round(
v), 1
e-12, 1
e-12, &
eq);
61 if (!is_integer_value(
value)) {
72 lmmc_double_nearly_equal(
value, 0.0, &equal);
73 if (equal ||
value <= 0.0) {
88 lmmc_double_nearly_equal(
value, 0.0, &equal);
89 if (equal ||
value <= 0.0) {
107 if (
const auto* power =
dynamic_cast<const PowerNode*
>(node)) {
115 function->arguments().size() == 1) {
124 const auto* product =
dynamic_cast<const MultiplyNode*
>(node);
127 return radicand !=
nullptr;
129 for (
const auto& factor : product->operands()) {
142 return radicand !=
nullptr;
149 if (!
value.is_integer()) {
153 return value < Rational(0);
156 return value <= Rational(0);
166 Rational coefficient(1);
171 if (coefficient == Rational(0)) {
192 root->exact_id(),
context,
"solve_with_assumptions");
194 if (std::holds_alternative<detail::ComplexIsolation>(isolated.value())) {
205 if (!try_get_numeric_value(solution,
value)) {
215 const std::shared_ptr<SymbolicExpr>& equation,
217 const AssumptionContext* ctx,
225 auto all_solutions = std::move(solved.value());
228 return all_solutions;
233 std::vector<std::shared_ptr<SymbolicExpr>> filtered;
234 filtered.reserve(all_solutions.size());
242 return all_solutions;
245 for (
const auto& sol : all_solutions) {
252 if (!excluded.value()) {
253 filtered.push_back(sol);
261 const std::shared_ptr<SymbolicExpr>& equation,
263 const AssumptionContext* assumptions,
266 constexpr const char* operation =
"solve_with_assumptions";
267 if (!equation ||
variable.empty()) {
270 "assumption-aware solve requires an equation and variable",
273 auto budget =
context.consume_steps(1, operation);
282 }
catch (
const std::bad_alloc&) {
285 "allocation failed while solving with assumptions",
287 }
catch (
const std::length_error& error) {
289 }
catch (
const std::exception& ex) {
295 const std::shared_ptr<SymbolicExpr>& equation,
297 const AssumptionContext* assumptions)
AssumptionContext class with scoped push/pop management.
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
static Result failure(CasErrc code, std::string message, std::string operation={})
static bool try_get_numeric_value(const std::shared_ptr< SymbolicExpr > &expr, double &out_value)
从解表达式提取 double 数值。
static bool is_integer_value(double v)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
Result< RootIsolation > isolate_exact_root(const ExactRootId &root, ComputationContext &context, const std::string &operation)
std::shared_ptr< SymbolicExpr > num(int value)
bool solver_number_value(const NumberNode &number, double &value)
bool contains_imaginary(const std::shared_ptr< SymbolicExpr > &expression)
const std::string & variable
ExprResult eq(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
Result< std::vector< std::shared_ptr< SymbolicExpr > > > AssumptionSolveResult
__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< Polynomial< BigInt > > const BigInt ComputationContext & context
Domain
Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational...
@ Complex
Complex numbers (default, least specific)
@ Rational
Rational numbers
@ Natural
Non-negative integers (0, 1, 2, ...)
@ Algebraic
Algebraic numbers (roots of polynomials with rational coefficients)
@ PositiveInt
Positive integers (1, 2, 3, ...)
static bool collect_scalar_radical(const SymbolicNode *node, Rational &coefficient, const NumberNode *&radicand)
static bool exact_radical_domain_excludes(const SymbolicNode *node, Domain domain)
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)
std::shared_ptr< const NumberNode > normalization_exact_square_root(const NumberNode &number)
static bool numeric_domain_excludes(double value, Domain domain)
LMCAS::FiniteSolveResult solve_finite_checked(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)
static Result< bool > solution_is_excluded(const std::shared_ptr< SymbolicExpr > &solution, Domain domain, const AssumptionContext &ctx, const std::string &variable, ComputationContext &context)
const NumberDomainSet & domain
static bool numeric_sign_excludes(double value, const AssumptionContext &ctx, const std::string &variable)
static const NumberNode * exact_scalar_radicand(const SymbolicNode *node)
const std::string const ExprPtr & value
Rational exact_number_as_rational(const NumberNode &node)
static const NumberNode * exact_scalar_number(const SymbolicNode *node)
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)
static bool exact_rational_domain_excludes(const Rational &value, Domain domain)
static bool domain_requires_real(Domain domain)
方程求解策略调度器 solve_dispatch 及相关选项结构体.
多项式方程组求解器 Solver,包含 Gröbner 基、线性系统求解。