algebraeon_rings/natural/
mod.rs1use 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