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
13pub trait DivisionRing<A: Operator = Additive, M: Operator = Multiplicative>:
18 AbelianGroup<A> + AbelianGroup<M>
19{
20}
21
22pub trait CommutativeRing<A: Operator = Additive, M: Operator = Multiplicative>:
25 AbelianGroup<A> + CommutativeMonoid<M>
26{
27}
28
29pub trait Ring<A: Operator = Additive, M: Operator = Multiplicative>:
32 AbelianGroup<A> + Monoid<M>
33{
34}
35
36pub 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
48pub trait NearRing<A: Operator = Additive, M: Operator = Multiplicative>:
51 Monoid<A> + Semigroup<M>
52{
53}
54
55pub 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
91pub 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}