LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
interval_endpoint_order.cpp
浏览该文件的文档.
2
3namespace LMCAS::detail {
4namespace {
5
6int rational_sign(const Rational& value) {
7 if (value == Rational(0)) {
8 return 0;
9 }
10 return value.get_numerator().is_negative() ? -1 : 1;
11}
12
13int compare_rationals(const Rational& left, const Rational& right) {
14 if (left < right) {
15 return -1;
16 }
17 if (left > right) {
18 return 1;
19 }
20 return 0;
21}
22
24 const ExactRealAlgebraic& algebraic, const Rational& rational) {
25 if (algebraic.upper < rational) {
26 return -1;
27 }
28 if (rational < algebraic.lower) {
29 return 1;
30 }
31 const Rational value = algebraic.polynomial.eval(rational);
32 if (value == Rational(0)) {
33 return 0;
34 }
35 const Rational lower_value =
36 algebraic.polynomial.eval(algebraic.lower);
37 const bool root_before_rational =
38 rational_sign(lower_value) != rational_sign(value);
39 return root_before_rational ? -1 : 1;
40}
41
44 if (endpoint.algebraic) {
46 *endpoint.algebraic);
47 }
48 if (endpoint.radical_coefficient == Rational(0)) {
51 Rational(0) - endpoint.rational,
52 Rational(1)
53 }),
54 0, 1, context);
55 }
56 const Rational a = endpoint.rational;
57 const Rational b = endpoint.radical_coefficient;
58 const Rational d = endpoint.radicand;
61 a * a - b * b * d,
62 Rational(-2) * a,
63 Rational(1)
64 }),
65 b > Rational(0) ? 1 : 0, 1, context);
66 return value;
67}
68
69}
70
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) {
89 return Result<int>::success(compare_rationals(left.rational, right.rational));
90 }
91 if (left.algebraic && !right_radical) {
93 compare_algebraic_to_rational(*left.algebraic, right.rational));
94 }
95 if (right.algebraic && !left_radical) {
97 -compare_algebraic_to_rational(*right.algebraic, left.rational));
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}
110
111}
一元多项式模板类
CoeffType eval(const CoeffType &val) const
对多项式求值(Horner 法)
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(ExactRealAlgebraic value)
int compare_algebraic_to_rational(const ExactRealAlgebraic &algebraic, const Rational &rational)
ExactRealAlgebraicResult to_algebraic(const ComparableEndpoint &endpoint, ComputationContext &context)
多元 Hensel 提升(单变量步)
Result< int > compare_exact_real_algebraic(ExactRealAlgebraic lhs, ExactRealAlgebraic rhs, ComputationContext &context)
Result< ExactRealAlgebraic > ExactRealAlgebraicResult
ExactRealAlgebraicResult make_exact_real_algebraic(Polynomial< Rational > polynomial, std::size_t root_index, std::size_t multiplicity, ComputationContext &context)
std::size_t std::size_t ComputationContext & context
Result< int > compare_comparable(const ComparableEndpoint &left, const ComparableEndpoint &right, ComputationContext &context)
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
const ExprPtr & right
const std::string const ExprPtr & value
ExprResult rational(const Rational &value)
std::optional< LMCAS::detail::ExactRealAlgebraic > algebraic