httk.core.exactmath¶
Exact math on rationals and decimals: type-preserving transcendentals.
This module provides the transcendental and helper functions used by
FracVector. Every value is computed with 100% exact
integer/rational arithmetic, so results are platform-independent and deterministic by
construction — no floating point is used anywhere in the computation.
Two output domains are supported, selected by a single documented rule. All scalar functions also
accept ScalarLike and VectorLike inputs. Vectors are mapped elementwise and retain their
shape. The optional keyword-only coerce= presents the natural result through a requested view
or value type; coerce="natural" returns the pre-presentation result unchanged. By default,
presentation is view-neutral and best-effort: ordinary inputs are presented in the input type
family, while strings, bools, and Backend inputs retain the natural result. Explicit coercion
is strict. exact=True keeps its exact SurdScalar/SurdVector result unless an explicit
coerce= is supplied.
The default presentation therefore returns an int for an integral integer result, an exact
Fraction for non-integral integer results, a float for float inputs (and explicit
coerce=float is lossy), nested lists for list inputs, native tuple views for tuple inputs, and
float64 numpy views for numpy inputs. Numpy view values are lossy, but the exact result remains
recoverable with unwrap(). Decimal inputs or digits= select the Decimal domain. Fraction
inputs remain Fractions. Surd inputs are embedded back into the Surd family
when the natural result is rational.
The exact-symbolic domain is selected by exact=True on sqrt and degree-mode trigonometric
functions. It returns exact squarefree-radical values (or exact inverse angles), with no
approximation. Exact trigonometry is available only for the complete surd-cosine angle set:
multiples of 15 and 36 degrees; unsupported values raise ValueError. Exact inverse
trigonometry accepts surd values and returns exact degree Fractions.
When a genuinely irrational SurdScalar is used by ordinary Fraction-mode functions, it is
reduced to the deterministic Fraction hub at the active Decimal context precision plus three guard
digits. Exact symbolic operations preserve the surd and never use that lossy approximation.
In the Fraction domain each function returns a rational (fractions.Fraction)
approximation to a target precision prec (the error bound), with limit controlling the
result denominator. In the Decimal domain the same rational algorithms
drive Ziv’s adaptive strategy to produce a correctly rounded Decimal to digits significant
digits (default: the active decimal.getcontext() precision, matching stdlib Decimal’s own
model) under rounding ("half_even" = correctly rounded, "down" = correct truncation
toward zero). A Decimal input is converted to a Fraction exactly (fractions.Fraction
accepts a Decimal), so the rational core is identical in both domains; this gives deterministic
cos/sin/atan2/… for Decimals, which the stdlib decimal module does not offer.
The implementation uses the standard-library fractions.
Attributes¶
Functions¶
|
Yield the terms of the continued fraction expansion of |
|
Return the rational number with the smallest denominator lying in |
|
Reconstruct a |
|
Parse a numeric string into a central value and an uncertainty (delta). |
|
Convert an arbitrary numeric-like object into a |
|
Return the integer square root of |
|
Return the square root of |
|
Return the cosine of |
|
Return the sine of |
|
Return the tangent of |
|
Return |
|
Return the logarithm of |
|
Return the base-10 logarithm of |
|
Return the arc sine of |
|
Return the arc cosine of |
|
Return the arc tangent of |
|
Return the arc tangent of |
|
Return pi. |
Module Contents¶
- httk.core.exactmath.get_continued_fraction(p: int, q: int) collections.abc.Iterator[int][source]¶
Yield the terms of the continued fraction expansion of
p/q.
- httk.core.exactmath.best_rational_in_interval(low: Any, high: Any) fractions.Fraction[source]¶
Return the rational number with the smallest denominator lying in
[low, high].
- httk.core.exactmath.fraction_from_continued_fraction(cf: list[int]) fractions.Fraction[source]¶
Reconstruct a
fractions.Fractionfrom a list of continued-fraction terms.
- httk.core.exactmath.string_to_val_and_delta(arg: str, min_accuracy: fractions.Fraction | None = fractions.Fraction(1, 10000)) tuple[fractions.Fraction, fractions.Fraction][source]¶
Parse a numeric string into a central value and an uncertainty (delta).
Recognizes plain decimals, fractions (
"2/3"), scientific notation, and explicit standard-deviation notation ("0.33342(10)"). When no explicit uncertainty is present andmin_accuracyis not None, an uncertainty is inferred from the number of written digits (capped atmin_accuracy).
- httk.core.exactmath.any_to_fraction(arg: Any, min_accuracy: fractions.Fraction | None = fractions.Fraction(1, 10000)) fractions.Fraction[source]¶
Convert an arbitrary numeric-like object into a
fractions.Fraction.- Parameters:
arg – a number, string, Decimal, Fraction, or anything the Fraction constructor accepts. Strings are parsed for uncertainty via
string_to_val_and_delta().min_accuracy – the minimum assumed accuracy for string input. With the default
1/10000,0.33is taken to mean0.3300(= 33/100), whereas0.3333is taken to mean1/3. Set to None to convert strings exactly.
- httk.core.exactmath.integer_sqrt(n: int) int[source]¶
Return the integer square root of
n(the floor of its exact square root).
- httk.core.exactmath.sqrt(x: httk.core.vectors.scalar_like.ScalarLike | httk.core.vectors.vector_like.VectorLike, prec: fractions.Fraction = default_accuracy, limit: bool = True, digits: int | None = None, rounding: str = 'half_even', max_refinements: int | None = None, exact: bool = False, *, coerce: Any = None) Any[source]¶
Return the square root of
x.Fraction domain (Fraction/int/str input, no
digits=): a rational approximation withinprec(exact for perfect squares),limitcontrolling the denominator. Decimal domain (Decimal input ordigits=given): the correctly-rounded Decimal todigitssignificant digits underrounding.With
exact=Truethe output-domain rule is overridden: the result is the exactSurdScalarsquare root ofx— an element of the squarefree-radical field, with no approximation at all (sqrt(2, exact=True)squares back to exactly2,sqrt(9/4, exact=True)is the rational3/2).xmust be a nonnegative rational;prec/limit/digits/roundingare ignored in this mode.
- httk.core.exactmath.cos(x: httk.core.vectors.scalar_like.ScalarLike | httk.core.vectors.vector_like.VectorLike, prec: fractions.Fraction = default_accuracy, limit: bool = True, degrees: bool = False, digits: int | None = None, rounding: str = 'half_even', max_refinements: int | None = None, exact: bool = False, *, coerce: Any = None) Any[source]¶
Return the cosine of
x(radians unlessdegreesis True). See the module docstring for the type-preservation rule; Decimal mode renders the special-angle exact values exactly (e.g.cos(Decimal("60"), degrees=True) == Decimal("0.5")).
- httk.core.exactmath.sin(x: httk.core.vectors.scalar_like.ScalarLike | httk.core.vectors.vector_like.VectorLike, prec: fractions.Fraction = default_accuracy, limit: bool = True, degrees: bool = False, digits: int | None = None, rounding: str = 'half_even', max_refinements: int | None = None, exact: bool = False, *, coerce: Any = None) Any[source]¶
Return the sine of
x(radians unlessdegreesis True). See the module docstring for the type-preservation rule.
- httk.core.exactmath.tan(x: httk.core.vectors.scalar_like.ScalarLike | httk.core.vectors.vector_like.VectorLike, degrees: bool = False, prec: fractions.Fraction = default_accuracy, limit: bool = True, digits: int | None = None, rounding: str = 'half_even', max_refinements: int | None = None, exact: bool = False, *, coerce: Any = None) Any[source]¶
Return the tangent of
x. See the module docstring for the type-preservation rule.
- httk.core.exactmath.exp(x: httk.core.vectors.scalar_like.ScalarLike | httk.core.vectors.vector_like.VectorLike, prec: fractions.Fraction = default_accuracy, limit: bool = True, digits: int | None = None, rounding: str = 'half_even', max_refinements: int | None = None, *, coerce: Any = None) Any[source]¶
Return
eraised to the powerx. See the module docstring for the type-preservation rule.
- httk.core.exactmath.log(x: httk.core.vectors.scalar_like.ScalarLike | httk.core.vectors.vector_like.VectorLike, base: httk.core.vectors.scalar_like.ScalarLike | None = None, prec: fractions.Fraction = default_accuracy, limit: bool = True, digits: int | None = None, rounding: str = 'half_even', max_refinements: int | None = None, *, coerce: Any = None) Any[source]¶
Return the logarithm of
xtobase(natural log whenbaseis None). See the module docstring for the type-preservation rule; a Decimalbasealso promotes the result.
- httk.core.exactmath.log10(x: httk.core.vectors.scalar_like.ScalarLike | httk.core.vectors.vector_like.VectorLike, prec: fractions.Fraction = default_accuracy, limit: bool = True, digits: int | None = None, rounding: str = 'half_even', max_refinements: int | None = None, *, coerce: Any = None) Any[source]¶
Return the base-10 logarithm of
x. See the module docstring for the type-preservation rule.max_refinementsis honored and is forwarded to the logarithm implementation.
- httk.core.exactmath.asin(x: httk.core.vectors.scalar_like.ScalarLike | httk.core.vectors.vector_like.VectorLike, degrees: bool = False, prec: fractions.Fraction = default_accuracy, limit: bool = True, digits: int | None = None, rounding: str = 'half_even', max_refinements: int | None = None, exact: bool = False, *, coerce: Any = None) Any[source]¶
Return the arc sine of
x(radians, or degrees ifdegrees). See the module docstring for the type-preservation rule.
- httk.core.exactmath.acos(x: httk.core.vectors.scalar_like.ScalarLike | httk.core.vectors.vector_like.VectorLike, degrees: bool = False, prec: fractions.Fraction = default_accuracy, limit: bool = True, digits: int | None = None, rounding: str = 'half_even', max_refinements: int | None = None, exact: bool = False, *, coerce: Any = None) Any[source]¶
Return the arc cosine of
x(radians, or degrees ifdegrees). See the module docstring for the type-preservation rule.
- httk.core.exactmath.atan(x: httk.core.vectors.scalar_like.ScalarLike | httk.core.vectors.vector_like.VectorLike, degrees: bool = False, prec: fractions.Fraction = default_accuracy, limit: bool = True, digits: int | None = None, rounding: str = 'half_even', max_refinements: int | None = None, exact: bool = False, *, coerce: Any = None) Any[source]¶
Return the arc tangent of
x(radians, or degrees ifdegrees). See the module docstring for the type-preservation rule.
- httk.core.exactmath.atan2(y: httk.core.vectors.scalar_like.ScalarLike | httk.core.vectors.vector_like.VectorLike, x: httk.core.vectors.scalar_like.ScalarLike | httk.core.vectors.vector_like.VectorLike, degrees: bool = False, prec: fractions.Fraction = default_accuracy, limit: bool = True, digits: int | None = None, rounding: str = 'half_even', max_refinements: int | None = None, exact: bool = False, *, coerce: Any = None) Any[source]¶
Return the arc tangent of
y/xwithmath.atan2()quadrant conventions (radians, or degrees ifdegrees). See the module docstring for the type-preservation rule; a Decimal in either argument promotes the result (atan2(Decimal, Fraction)returns a Decimal). Vector inputs are mapped elementwise; a scalar argument is broadcast across the vector.
- httk.core.exactmath.pi(prec: fractions.Fraction = default_accuracy, limit: bool = True, digits: int | None = None, rounding: str = 'half_even', max_refinements: int | None = None) fractions.Fraction | decimal.Decimal[source]¶
Return pi.
With no
digits=the Fraction contract holds (a rational withinprec,limitcontrolling the denominator);pi(digits=n)returns the correctly-rounded Decimal tonsignificant digits underrounding.