LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
exact_constant_bounds.hpp
浏览该文件的文档.
1#pragma once
2
4#include "rational.hpp"
5#include <algorithm>
6#include <limits>
7#include <utility>
8
9namespace LMCAS::detail {
10
11using ExactConstantInterval = std::pair<Rational, Rational>;
13 const Rational& value, std::size_t precision_bits, ComputationContext& context);
15 std::size_t precision_bits, ComputationContext& context);
17 std::size_t precision_bits, ComputationContext& context);
18
19/**
20 * @brief 常数及根式包围区间共用的内部算术策略。
21 * 保守界覆盖未约分 Rational 的交叉乘积及结果;受检入口统一捕获 CasError,仅返回完整结果。
22 */
24public:
27
28 void require(Result<void> result) const {
29 if (!result) throw result.error();
30 }
32 void bits(std::size_t count) const {
34 }
35 std::size_t growth(std::size_t a, std::size_t b) const {
36 if (b > std::numeric_limits<std::size_t>::max() - a)
37 throw CasError{CasErrc::ResourceLimit, "integer size overflow", operation_};
38 const auto size = a + b;
39 bits(size);
40 return size;
41 }
42 void operands(const Rational& a, const Rational& b, bool addition = false) const {
43 step();
44 const auto a_bits = std::max(a.get_numerator().bit_length(),
45 a.get_denominator().bit_length());
46 const auto b_bits = std::max(b.get_numerator().bit_length(),
47 b.get_denominator().bit_length());
48 const auto size = growth(a_bits, b_bits);
49 if (addition) growth(size, 1);
50 }
51 Rational add(const Rational& a, const Rational& b) const {
52 operands(a, b, true); return a + b;
53 }
54 Rational sub(const Rational& a, const Rational& b) const {
55 operands(a, b, true); return a - b;
56 }
57 Rational mul(const Rational& a, const Rational& b) const {
58 operands(a, b); return a * b;
59 }
60 Rational div(const Rational& a, const Rational& b) const {
61 operands(a, b);
62 if (b.is_zero())
63 throw CasError{CasErrc::DomainError, "zero enclosure divisor", operation_};
64 return a / b;
65 }
66 bool less(const Rational& a, const Rational& b) const {
67 operands(a, b); return a < b;
68 }
69 BigInt dyadic_scale(std::size_t precision) const {
70 step();
71 growth(precision, 1);
72 if (precision > std::numeric_limits<mp_size_t>::max())
73 throw CasError{CasErrc::ResourceLimit, "shift size overflow", operation_};
74 return BigInt(1) << static_cast<mp_size_t>(precision);
75 }
76private:
78 const char* operation_;
79};
80
81}
Result< void > consume_steps(std::size_t amount=1, const std::string &operation={})
Result< void > require_integer_bits(std::size_t amount, const std::string &operation={}) const
CasError & error()
Rational mul(const Rational &a, const Rational &b) const
std::size_t growth(std::size_t a, std::size_t b) const
ExactBoundArithmetic(ComputationContext &context, const char *operation)
Rational add(const Rational &a, const Rational &b) const
Rational div(const Rational &a, const Rational &b) const
bool less(const Rational &a, const Rational &b) const
BigInt dyadic_scale(std::size_t precision) const
void operands(const Rational &a, const Rational &b, bool addition=false) const
void require(Result< void > result) const
Rational sub(const Rational &a, const Rational &b) const
多元 Hensel 提升(单变量步)
Result< ExactConstantInterval > exact_e_bounds(std::size_t precision_bits, ComputationContext &context)
std::pair< Rational, Rational > ExactConstantInterval
Result< ExactConstantInterval > exact_atan_bounds(const Rational &value, std::size_t precision_bits, ComputationContext &context)
ComputationContext const std::string & operation
Result< ExactConstantInterval > exact_pi_bounds(std::size_t precision_bits, ComputationContext &context)
std::size_t std::size_t 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 std::string const ExprPtr & value
精确有理数 Rational,基于 BigInt 分子/分母表示,自动约分。