algebraeon_rings/natural/
mod.rs

1use crate::structure::*;
2use algebraeon_nzq::{traits::DivMod, *};
3use algebraeon_sets::structure::*;
4
5pub mod factorization;
6pub mod functions;
7
8impl RinglikeSpecializationSignature for NaturalCanonicalStructure {}
9
10impl ZeroSignature for NaturalCanonicalStructure {
11    fn zero(&self) -> Self::Set {
12        Natural::ZERO
13    }
14}
15
16impl AdditionSignature for NaturalCanonicalStructure {
17    fn add(&self, a: &Self::Set, b: &Self::Set) -> Self::Set {
18        a + b
19    }
20}
21
22impl CancellativeAdditionSignature for NaturalCanonicalStructure {
23    fn try_sub(&self, a: &Self::Set, b: &Self::Set) -> Option<Self::Set> {
24        a.try_sub(b)
25    }
26}
27
28impl TryNegateSignature for NaturalCanonicalStructure {
29    fn try_neg(&self, a: &Self::Set) -> Option<Self::Set> {
30        let z = self.zero();
31        if a == &z { Some(self.zero()) } else { None }
32    }
33}
34
35impl AdditiveMonoidSignature for NaturalCanonicalStructure {}
36
37impl OneSignature for NaturalCanonicalStructure {
38    fn one(&self) -> Self::Set {
39        Natural::ONE
40    }
41}
42
43impl MultiplicationSignature for NaturalCanonicalStructure {
44    fn mul(&self, a: &Self::Set, b: &Self::Set) -> Self::Set {
45        a * b
46    }
47}
48
49impl CommutativeMultiplicationSignature for NaturalCanonicalStructure {}
50
51impl MultiplicativeMonoidSignature for NaturalCanonicalStructure {}
52
53impl FavoriteAssociateSignature for NaturalCanonicalStructure {
54    fn factor_fav_assoc(&self, a: &Self::Set) -> (Self::Set, Self::Set) {
55        (Natural::ONE, a.clone())
56    }
57}
58
59impl MultiplicativeAbsorptionMonoidSignature for NaturalCanonicalStructure {}
60
61impl LeftDistributiveMultiplicationOverAddition for NaturalCanonicalStructure {}
62
63impl RightDistributiveMultiplicationOverAddition for NaturalCanonicalStructure {}
64
65impl SemiRingSignature for NaturalCanonicalStructure {}
66
67impl CharacteristicSignature for NaturalCanonicalStructure {
68    fn characteristic(&self) -> Natural {
69        Natural::ZERO
70    }
71}
72
73impl TryReciprocalSignature for NaturalCanonicalStructure {
74    fn try_reciprocal(&self, a: &Self::Set) -> Option<Self::Set> {
75        match *a {
76            Natural::ZERO => None,
77            Natural::ONE => Some(Natural::ONE),
78            _ => None,
79        }
80    }
81}
82
83impl EuclideanDivisionSignature for NaturalCanonicalStructure {
84    fn norm(&self, elem: &Self::Set) -> Option<Natural> {
85        if elem == &Natural::ZERO {
86            None
87        } else {
88            Some(elem.clone())
89        }
90    }
91
92    fn quorem(&self, a: &Self::Set, b: &Self::Set) -> Option<(Self::Set, Self::Set)> {
93        if b == &Natural::ZERO {
94            None
95        } else {
96            Some(a.div_mod(b))
97        }
98    }
99}
100
101// pub trait NaturalFns {
102//     fn is_prime(&self) -> bool;
103//     fn factor(self) -> Option<Vec<(Natural, Natural)>>;
104// }
105
106// impl NaturalFns for Natural {
107//     fn is_prime(&self) -> bool {
108//         factorization::primes::is_prime(self)
109//     }
110//     fn factor(self) -> Option<Vec<(Natural, Natural)>> {
111//         factorization::factor(self)
112//     }
113// }