fp_library/classes/field.rs
1//! Types that form a field (commutative division ring with Euclidean structure).
2//!
3//! ### Examples
4//!
5//! ```
6//! use fp_library::classes::{
7//! DivisionRing,
8//! EuclideanRing,
9//! Semiring,
10//! };
11//!
12//! let a = 6.0f64;
13//! let b = 2.0f64;
14//! assert_eq!(f64::divide(a, b), 3.0);
15//! assert_eq!(f64::reciprocate(b), 0.5);
16//! ```
17
18#[fp_macros::document_module]
19mod inner {
20 use {
21 crate::classes::*,
22 fp_macros::*,
23 };
24
25 /// A marker trait for types that form a field.
26 ///
27 /// A field is both an [`EuclideanRing`] and a [`DivisionRing`],
28 /// combining commutative ring structure with multiplicative inverses.
29 ///
30 /// ### Laws
31 ///
32 /// All [`EuclideanRing`] and [`DivisionRing`] laws apply.
33 #[document_examples]
34 ///
35 /// ```
36 /// use fp_library::classes::{
37 /// DivisionRing,
38 /// Semiring,
39 /// };
40 ///
41 /// // For fields, multiply(a, reciprocate(a)) = one
42 /// let a = 3.0f64;
43 /// assert_eq!(f64::multiply(a, f64::reciprocate(a)), f64::one());
44 /// ```
45 pub trait Field: EuclideanRing + DivisionRing {}
46
47 impl Field for f32 {}
48 impl Field for f64 {}
49}
50
51pub use inner::*;