statrs/
euclid.rs

1//! Provides number theory utility functions
2
3/// Provides a trait for the canonical modulus operation since % is technically
4/// the remainder operation
5pub trait Modulus {
6    /// Performs a canonical modulus operation between `self` and `divisor`.
7    ///
8    /// # Examples
9    ///
10    /// ```
11    /// use statrs::euclid::Modulus;
12    ///
13    /// let x = 4i64.modulus(5);
14    /// assert_eq!(x, 4);
15    ///
16    /// let y = -4i64.modulus(5);
17    /// assert_eq!(x, 4);
18    /// ```
19    fn modulus(self, divisor: Self) -> Self;
20}
21
22impl Modulus for f64 {
23    fn modulus(self, divisor: f64) -> f64 {
24        ((self % divisor) + divisor) % divisor
25    }
26}
27
28impl Modulus for f32 {
29    fn modulus(self, divisor: f32) -> f32 {
30        ((self % divisor) + divisor) % divisor
31    }
32}
33
34impl Modulus for i64 {
35    fn modulus(self, divisor: i64) -> i64 {
36        ((self % divisor) + divisor) % divisor
37    }
38}
39
40impl Modulus for i32 {
41    fn modulus(self, divisor: i32) -> i32 {
42        ((self % divisor) + divisor) % divisor
43    }
44}
45
46impl Modulus for u64 {
47    fn modulus(self, divisor: u64) -> u64 {
48        ((self % divisor) + divisor) % divisor
49    }
50}
51
52impl Modulus for u32 {
53    fn modulus(self, divisor: u32) -> u32 {
54        ((self % divisor) + divisor) % divisor
55    }
56}