fructose/algebra/
ring.rs

1use crate::algebra::group::{AbelianGroup, CommutativeMonoid, Monoid, Semigroup};
2use crate::operators::{
3    Additive, ClosedAdd, ClosedMul, ClosedNeg, ClosedRem, ClosedSub, Multiplicative, Operator,
4};
5use crate::properties::archimedean::ArchimedeanDiv;
6use crate::properties::bezout::Bezout;
7use crate::properties::euclidean::EuclideanDiv;
8use crate::properties::factorization::Factorizable;
9use crate::properties::gcd::GCD;
10use crate::properties::general::NonZero;
11use crate::properties::primality::Primality;
12
13// Rings
14
15/// Addition: Ring
16/// Multiplication: Ring + Commutativity + Invertibility
17pub trait DivisionRing<A: Operator = Additive, M: Operator = Multiplicative>:
18    AbelianGroup<A> + AbelianGroup<M>
19{
20}
21
22/// Addition: Ring
23/// Multiplication: Ring + Commutativity
24pub trait CommutativeRing<A: Operator = Additive, M: Operator = Multiplicative>:
25    AbelianGroup<A> + CommutativeMonoid<M>
26{
27}
28
29/// Addition: AbelianGroup
30/// Multiplication: Associative + Identity => Monoid
31pub trait Ring<A: Operator = Additive, M: Operator = Multiplicative>:
32    AbelianGroup<A> + Monoid<M>
33{
34}
35
36/// Addition: Ring - Inverse
37/// Multiplication: Ring
38pub trait Semiring<A: Operator = Additive, M: Operator = Multiplicative>:
39    CommutativeMonoid<A> + Monoid<M>
40{
41}
42
43pub trait CommutativeSemiring<A: Operator = Additive, M: Operator = Multiplicative>:
44    CommutativeMonoid<A> + CommutativeMonoid<M>
45{
46}
47
48/// Addition: Ring - Inverse - Commutativity
49/// Multiplication: Semiring - Identity
50pub trait NearRing<A: Operator = Additive, M: Operator = Multiplicative>:
51    Monoid<A> + Semigroup<M>
52{
53}
54
55// Domains
56pub trait Domain<A: Operator = Additive, M: Operator = Multiplicative>:
57    Ring<A, M> + NonZero
58{
59}
60
61pub trait IntegralDomain<A: Operator = Additive, M: Operator = Multiplicative>:
62    CommutativeRing<A, M> + NonZero
63{
64}
65
66pub trait GCDDomain<A: Operator = Additive, M: Operator = Multiplicative>:
67    IntegralDomain<A, M> + GCD
68{
69}
70
71pub trait BezoutDomain<A: Operator = Additive, M: Operator = Multiplicative>:
72    GCDDomain<A, M> + Bezout
73{
74}
75
76pub trait UFDDomain<A: Operator = Additive, M: Operator = Multiplicative>:
77    GCDDomain<A, M> + Factorizable
78{
79}
80
81pub trait PIDDomain<A: Operator = Additive, M: Operator = Multiplicative>:
82    UFDDomain<A, M> + BezoutDomain<A, M>
83{
84}
85
86pub trait EuclideanDomain<A: Operator = Additive, M: Operator = Multiplicative>:
87    PIDDomain<A, M> + EuclideanDiv
88{
89}
90
91// Domains
92pub trait Semidomain<A: Operator = Additive, M: Operator = Multiplicative>:
93    Semiring<A, M> + NonZero
94{
95}
96
97pub trait IntegralSemidomain<A: Operator = Additive, M: Operator = Multiplicative>:
98    CommutativeSemiring<A, M> + NonZero
99{
100}
101
102pub trait GCDSemidomain<A: Operator = Additive, M: Operator = Multiplicative>:
103    IntegralSemidomain<A, M> + GCD
104{
105}
106
107pub trait BezoutSemidomain<A: Operator = Additive, M: Operator = Multiplicative>:
108    GCDSemidomain<A, M> + Bezout
109{
110}
111
112pub trait UFDSemidomain<A: Operator = Additive, M: Operator = Multiplicative>:
113    GCDSemidomain<A, M> + Factorizable
114{
115}
116
117pub trait PIDSemidomain<A: Operator = Additive, M: Operator = Multiplicative>:
118    UFDSemidomain<A, M> + BezoutSemidomain<A, M>
119{
120}
121
122pub trait EuclideanSemidomain<A: Operator = Additive, M: Operator = Multiplicative>:
123    PIDSemidomain<A, M> + EuclideanDiv
124{
125}
126
127pub trait NaturalCommutativeSemiring:
128    EuclideanSemidomain + ClosedAdd + ClosedMul + ClosedRem + Primality + ArchimedeanDiv + Eq + Ord
129{
130}
131
132pub trait IntegerRing:
133    EuclideanDomain
134    + ClosedAdd
135    + ClosedSub
136    + ClosedMul
137    + ClosedRem
138    + ClosedNeg
139    + Primality
140    + ArchimedeanDiv
141    + Eq
142    + Ord
143{
144}
145
146impl<T> NearRing for T where T: Monoid<Additive> + Semigroup<Multiplicative> {}
147
148impl<T> Semiring for T where T: CommutativeMonoid<Additive> + Monoid<Multiplicative> {}
149
150impl<T> CommutativeSemiring for T where
151    T: CommutativeMonoid<Additive> + CommutativeMonoid<Multiplicative>
152{
153}
154
155impl<T> Ring for T where T: AbelianGroup<Additive> + Monoid<Multiplicative> {}
156
157impl<T> CommutativeRing for T where T: AbelianGroup<Additive> + CommutativeMonoid<Multiplicative> {}
158
159impl<T> DivisionRing for T where T: AbelianGroup<Additive> + AbelianGroup<Multiplicative> {}
160
161impl<T> Domain for T where T: Ring + NonZero {}
162impl<T> IntegralDomain for T where T: CommutativeRing + NonZero {}
163impl<T> GCDDomain for T where T: IntegralDomain + GCD {}
164impl<T> BezoutDomain for T where T: GCDDomain + Bezout {}
165impl<T> UFDDomain for T where T: GCDDomain + Factorizable {}
166impl<T> PIDDomain for T where T: UFDDomain + BezoutDomain {}
167impl<T> EuclideanDomain for T where T: PIDDomain + EuclideanDiv {}
168
169impl<T> Semidomain for T where T: Semiring + NonZero {}
170impl<T> IntegralSemidomain for T where T: CommutativeSemiring + NonZero {}
171impl<T> GCDSemidomain for T where T: IntegralSemidomain + GCD {}
172impl<T> BezoutSemidomain for T where T: GCDSemidomain + Bezout {}
173impl<T> UFDSemidomain for T where T: GCDSemidomain + Factorizable {}
174impl<T> PIDSemidomain for T where T: UFDSemidomain + BezoutSemidomain {}
175impl<T> EuclideanSemidomain for T where T: PIDSemidomain + EuclideanDiv {}
176
177impl<T> NaturalCommutativeSemiring for T where
178    T: EuclideanSemidomain
179        + ClosedAdd
180        + ClosedMul
181        + ClosedRem
182        + Primality
183        + ArchimedeanDiv
184        + Eq
185        + Ord
186{
187}
188
189impl<T> IntegerRing for T where
190    T: EuclideanDomain
191        + ClosedAdd
192        + ClosedSub
193        + ClosedMul
194        + ClosedRem
195        + ClosedNeg
196        + Primality
197        + ArchimedeanDiv
198        + Eq
199        + Ord
200{
201}