num_irrational/lib.rs
1//! This crate provides representations of irrational numbers within following categories:
2//! - Math constants (`pi`, `e`, etc.)
3//! - Values and continued fraction representations
4//! - [Quadratic Numbers](https://en.wikipedia.org/wiki/Algebraic_number#Examples)
5//! - [Quadratic Irrational](https://en.wikipedia.org/wiki/Quadratic_irrational_number): [QuadraticSurd]
6//! - [Quadratic Integer](https://en.wikipedia.org/wiki/Quadratic_integer): [QuadraticInt]
7//! - [Gaussian Integer](https://en.wikipedia.org/wiki/Gaussian_integer): [GaussianInt]
8//! - [Continued Fraction](https://en.wikipedia.org/wiki/Continued_fraction)
9//! - [Simple continued fraction](https://en.wikipedia.org/wiki/Continued_fraction): [ContinuedFraction], [InfiniteContinuedFraction]
10//! - [General continued fraction](https://en.wikipedia.org/wiki/Generalized_continued_fraction): [GeneralContinuedFraction]
11//! - Transcendental functions represented in continued fractions
12//!
13//! It's based on the `num` creates.
14//!
15//! # Examples
16//!
17//! ```rust
18//! use num_irrational::{FromSqrt, QuadraticSurd};
19//! let sq2 = QuadraticSurd::from_sqrt(2i32).unwrap();
20//! println!("Square root of 2: {}", sq2); // √2
21//!
22//! use num_irrational::Computable;
23//! let sq2_approx = sq2.approximated(&100).value();
24//! println!("Rational approximation with denominator under 100: {}", sq2_approx); // 99/70
25//!
26//! use core::convert::TryFrom;
27//! use num_irrational::ContinuedFraction;
28//! // let sq2_fraction = ContinuedFraction::from(sq2); // only if feature `complex` is disabled
29//! let sq2_fraction = ContinuedFraction::try_from(sq2).unwrap();
30//! println!("Continued Fraction: {}", sq2_fraction); // [1; (2)]
31//! ```
32//!
33//! # Optional Features
34//! - `complex`: Enable negative square root base support for [QuadraticSurd]. Note that this flag might
35//! change some behavior of the operators on [QuadraticSurd].
36//! - `num-complex`: Enable converting [QuadraticSurd] to `num_complex::Complex`. You probably want to enable
37//! the `complex` feature at the same time.
38//! - `num-bigint`: Enable using big integers as the internal representation.
39//!
40
41pub mod cont_frac;
42pub mod quadratic;
43pub mod symbols;
44mod traits;
45
46#[doc(no_inline)]
47pub use cont_frac::{ContinuedFraction, GeneralContinuedFraction, InfiniteContinuedFraction};
48#[doc(no_inline)]
49pub use quadratic::{QuadraticInt, QuadraticSurd};
50pub use traits::*;
51
52#[cfg(feature = "complex")]
53pub use quadratic::GaussianInt;
54
55/// [QuadraticSurd] with 32-bit integers
56pub type Quadratic32 = QuadraticSurd<i32>;
57/// [QuadraticSurd] with 64-bit integers
58pub type Quadratic64 = QuadraticSurd<i64>;
59/// [QuadraticInt] with 32-bit integers
60pub type QuadraticInt32 = QuadraticInt<i32>;
61/// [QuadraticInt] with 64-bit integers
62pub type QuadraticInt64 = QuadraticInt<i64>;
63
64#[cfg(feature = "num-bigint")]
65/// [QuadraticSurd] with big integers
66pub type BigQuadratic = QuadraticSurd<num_bigint::BigInt>;
67#[cfg(feature = "num-bigint")]
68/// [QuadraticInt] with big integers
69pub type BigQuadraticInt = QuadraticInt<num_bigint::BigInt>;
70
71// XXX: add support for general algebraic numbers in future
72// REF: https://github.com/programmerjake/algebraics/
73// REF: https://web.williams.edu/Mathematics/sjmiller/public_html/book/papers/vdp/BombieriPoorten_CFofAlgNumbs.pdf
74// Might need to build a complex interval arithmetic library for the purpose