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

pub mod cont_frac;
pub mod quadratic;
pub mod symbols;
mod traits;

#[doc(no_inline)]
pub use cont_frac::{ContinuedFraction, GeneralContinuedFraction, InfiniteContinuedFraction};
#[doc(no_inline)]
pub use quadratic::{QuadraticInt, QuadraticSurd};
pub use traits::*;

#[cfg(feature = "complex")]
pub use quadratic::GaussianInt;

/// [QuadraticSurd] with 32-bit integers
pub type Quadratic32 = QuadraticSurd<i32>;
/// [QuadraticSurd] with 64-bit integers
pub type Quadratic64 = QuadraticSurd<i64>;
/// [QuadraticInt] with 32-bit integers
pub type QuadraticInt32 = QuadraticInt<i32>;
/// [QuadraticInt] with 64-bit integers
pub type QuadraticInt64 = QuadraticInt<i64>;

#[cfg(feature = "num-bigint")]
/// [QuadraticSurd] with big integers
pub type BigQuadratic = QuadraticSurd<num_bigint::BigInt>;
#[cfg(feature = "num-bigint")]
/// [QuadraticInt] with big integers
pub type BigQuadraticInt = QuadraticInt<num_bigint::BigInt>;

// XXX: add support for general algebraic numbers in future
// REF: https://github.com/programmerjake/algebraics/
// REF: https://web.williams.edu/Mathematics/sjmiller/public_html/book/papers/vdp/BombieriPoorten_CFofAlgNumbs.pdf
// Might need to build a complex interval arithmetic library for the purpose