Skip to main content

malachite_base/num/basic/
unsigneds.rs

1// Copyright © 2026 Mikhail Hogrefe
2//
3// This file is part of Malachite.
4//
5// Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU
6// Lesser General Public License (LGPL) as published by the Free Software Foundation; either version
7// 3 of the License, or (at your option) any later version. See <https://www.gnu.org/licenses/>.
8
9use crate::num::arithmetic::traits::{
10    AbsDiff, AbsDiffAssign, BalancedMod, BalancedModPowerOf2, BellNumber, CeilingDivAssignNegMod,
11    CeilingDivNegMod, CeilingLogBase, CeilingLogBase2, CeilingLogBasePowerOf2, CheckedBellNumber,
12    CheckedDoubleFactorial, CheckedFactorial, CheckedFibonacci, CheckedLcm, CheckedLogBase,
13    CheckedLogBase2, CheckedLogBasePowerOf2, CheckedLucasNumber, CheckedMultifactorial,
14    CheckedNextPowerOf2, CheckedPrimorial, CheckedSubfactorial, CoprimeWith, DoubleFactorial,
15    ExtendedGcd, Factorial, Fibonacci, FloorLogBase, FloorLogBase2, FloorLogBasePowerOf2, Gcd,
16    GcdAssign, Lcm, LcmAssign, LucasNumber, ModAbsSquared, ModAbsSquaredAssign, ModAdd,
17    ModAddAssign, ModAddMul, ModAddMulAssign, ModAddMulShl, ModAddMulShlAssign, ModInverse,
18    ModIsReduced, ModMul, ModMulAssign, ModMulPrecomputed, ModMulPrecomputedAssign, ModNeg,
19    ModNegAssign, ModPow, ModPowAssign, ModPowPrecomputed, ModPowPrecomputedAssign, ModPowerOf2,
20    ModPowerOf2AbsSquared, ModPowerOf2AbsSquaredAssign, ModPowerOf2Add, ModPowerOf2AddAssign,
21    ModPowerOf2AddMul, ModPowerOf2AddMulAssign, ModPowerOf2AddMulShl, ModPowerOf2AddMulShlAssign,
22    ModPowerOf2Inverse, ModPowerOf2IsReduced, ModPowerOf2Mul, ModPowerOf2MulAssign, ModPowerOf2Neg,
23    ModPowerOf2NegAssign, ModPowerOf2Pow, ModPowerOf2PowAssign, ModPowerOf2Product, ModPowerOf2Shl,
24    ModPowerOf2ShlAssign, ModPowerOf2Shr, ModPowerOf2ShrAssign, ModPowerOf2Sqrt, ModPowerOf2Square,
25    ModPowerOf2SquareAssign, ModPowerOf2Sub, ModPowerOf2SubAssign, ModPowerOf2SubMul,
26    ModPowerOf2SubMulAssign, ModPowerOf2SubMulShl, ModPowerOf2SubMulShlAssign, ModPowerOf2Sum,
27    ModProduct, ModSquare, ModSquareAssign, ModSquarePrecomputed, ModSquarePrecomputedAssign,
28    ModSub, ModSubAssign, ModSubMul, ModSubMulAssign, ModSubMulShl, ModSubMulShlAssign, ModSum,
29    Multifactorial, NegMod, NegModAssign, NegModPowerOf2, NegModPowerOf2Assign, NextPowerOf2,
30    NextPowerOf2Assign, Primorial, RootAssignRem, RootRem, SqrtAssignRem, SqrtRem, Subfactorial,
31    UnsignedAbs, XMulYToZZ, XXAddYYToZZ, XXDivModYToQR, XXSubYYToZZ, XXXAddYYYToZZZ,
32    XXXSubYYYToZZZ, XXXXAddYYYYToZZZZ,
33};
34use crate::num::basic::integers::PrimitiveInt;
35use crate::num::basic::signeds::PrimitiveSigned;
36use crate::num::comparison::traits::OrdDouble;
37use crate::num::conversion::traits::{
38    Digits, FromOtherTypeSlice, IntegerMantissaAndExponent, PowerOf2DigitIterable, PowerOf2Digits,
39    SciMantissaAndExponent, VecFromOtherType, VecFromOtherTypeSlice,
40};
41use crate::num::factorization::primes::{PrimesIterator, PrimesLessThanIterator};
42use crate::num::factorization::traits::Primes;
43use crate::num::logic::traits::{BitBlockAccess, HammingDistance};
44
45/// Defines functions on primitive unsigned integer types: uxx and usize.
46pub trait PrimitiveUnsigned:
47    AbsDiff<Self, Output = Self>
48    + AbsDiffAssign<Self>
49    + BalancedMod<Self, Output: PrimitiveSigned + UnsignedAbs<Output = Self>>
50    + BalancedModPowerOf2<Output: PrimitiveSigned + UnsignedAbs<Output = Self>>
51    + BitBlockAccess<Bits = Self>
52    + CeilingLogBase<Output = u64>
53    + CeilingLogBase2<Output = u64>
54    + CeilingLogBasePowerOf2<u64, Output = u64>
55    + CeilingDivAssignNegMod<Self, ModOutput = Self>
56    + CeilingDivNegMod<Self, DivOutput = Self, ModOutput = Self>
57    + CheckedDoubleFactorial
58    + BellNumber
59    + CheckedBellNumber
60    + CheckedFactorial
61    + CheckedFibonacci
62    + CheckedMultifactorial
63    + CheckedLucasNumber
64    + CheckedPrimorial
65    + CheckedSubfactorial
66    + CheckedLcm<Self, Output = Self>
67    + CheckedLogBase<Output = u64>
68    + CheckedLogBase2<Output = u64>
69    + CheckedLogBasePowerOf2<u64, Output = u64>
70    + CheckedNextPowerOf2<Output = Self>
71    + CoprimeWith<Self>
72    + DoubleFactorial
73    + Digits<u8>
74    + Digits<u16>
75    + Digits<u32>
76    + Digits<u64>
77    + Digits<u128>
78    + Digits<usize>
79    + ExtendedGcd<Self, Gcd = Self>
80    + Factorial
81    + Fibonacci
82    + FloorLogBase<Output = u64>
83    + FloorLogBase2<Output = u64>
84    + FloorLogBasePowerOf2<u64, Output = u64>
85    + From<u8>
86    + FromOtherTypeSlice<u8>
87    + FromOtherTypeSlice<u16>
88    + FromOtherTypeSlice<u32>
89    + FromOtherTypeSlice<u64>
90    + FromOtherTypeSlice<u128>
91    + FromOtherTypeSlice<usize>
92    + Gcd<Self, Output = Self>
93    + GcdAssign<Self>
94    + HammingDistance
95    + IntegerMantissaAndExponent<Self, u64>
96    + Lcm<Self, Output = Self>
97    + LcmAssign<Self>
98    + LucasNumber
99    + ModIsReduced<Self>
100    + ModAdd<Self, Self, Output = Self>
101    + ModAddAssign<Self, Self>
102    + ModInverse<Self, Output = Self>
103    + ModMul<Self, Self, Output = Self>
104    + ModMulAssign<Self, Self>
105    + ModAddMul<Self, Self, Self, Output = Self>
106    + ModAddMulAssign<Self, Self, Self>
107    + ModSubMul<Self, Self, Self, Output = Self>
108    + ModSubMulAssign<Self, Self, Self>
109    + ModAddMulShl<Self, Self, Self, Output = Self>
110    + ModAddMulShlAssign<Self, Self, Self>
111    + ModSubMulShl<Self, Self, Self, Output = Self>
112    + ModSubMulShlAssign<Self, Self, Self>
113    + ModSum<Self, Self>
114    + for<'a> ModSum<&'a Self, Self>
115    + ModProduct<Self, Self>
116    + for<'a> ModProduct<&'a Self, Self>
117    + ModMulPrecomputed<Self, Self, Output = Self>
118    + ModMulPrecomputedAssign<Self, Self>
119    + ModNeg<Self, Output = Self>
120    + ModNegAssign<Self>
121    + ModPow<u64, Self, Output = Self>
122    + ModPowAssign<u64, Self>
123    + ModPowerOf2<Output = Self>
124    + ModPowerOf2Add<Self, Output = Self>
125    + ModPowerOf2AddAssign<Self>
126    + ModPowerOf2Inverse<Output = Self>
127    + ModPowerOf2IsReduced
128    + ModPowerOf2Mul<Self, Output = Self>
129    + ModPowerOf2MulAssign<Self>
130    + ModPowerOf2AddMul<Self, Self, Output = Self>
131    + ModPowerOf2AddMulAssign<Self, Self>
132    + ModPowerOf2SubMul<Self, Self, Output = Self>
133    + ModPowerOf2SubMulAssign<Self, Self>
134    + ModPowerOf2AddMulShl<Self, Self, Output = Self>
135    + ModPowerOf2AddMulShlAssign<Self, Self>
136    + ModPowerOf2SubMulShl<Self, Self, Output = Self>
137    + ModPowerOf2SubMulShlAssign<Self, Self>
138    + ModPowerOf2Sum
139    + for<'a> ModPowerOf2Sum<&'a Self>
140    + ModPowerOf2Product
141    + for<'a> ModPowerOf2Product<&'a Self>
142    + ModPowerOf2Neg<Output = Self>
143    + ModPowerOf2NegAssign
144    + ModPowerOf2Pow<u64, Output = Self>
145    + ModPowerOf2PowAssign<u64>
146    + ModPowerOf2Shl<i8, Output = Self>
147    + ModPowerOf2Shl<i16, Output = Self>
148    + ModPowerOf2Shl<i32, Output = Self>
149    + ModPowerOf2Shl<i64, Output = Self>
150    + ModPowerOf2Shl<i128, Output = Self>
151    + ModPowerOf2Shl<u8, Output = Self>
152    + ModPowerOf2Shl<u16, Output = Self>
153    + ModPowerOf2Shl<u32, Output = Self>
154    + ModPowerOf2Shl<u64, Output = Self>
155    + ModPowerOf2Shl<u128, Output = Self>
156    + ModPowerOf2ShlAssign<u8>
157    + ModPowerOf2ShlAssign<u16>
158    + ModPowerOf2ShlAssign<u32>
159    + ModPowerOf2ShlAssign<u64>
160    + ModPowerOf2ShlAssign<u128>
161    + ModPowerOf2ShlAssign<usize>
162    + ModPowerOf2ShlAssign<i8>
163    + ModPowerOf2ShlAssign<i16>
164    + ModPowerOf2ShlAssign<i32>
165    + ModPowerOf2ShlAssign<i64>
166    + ModPowerOf2ShlAssign<i128>
167    + ModPowerOf2ShlAssign<isize>
168    + ModPowerOf2Shr<i8, Output = Self>
169    + ModPowerOf2Shr<i16, Output = Self>
170    + ModPowerOf2Shr<i32, Output = Self>
171    + ModPowerOf2Shr<i64, Output = Self>
172    + ModPowerOf2Shr<i128, Output = Self>
173    + ModPowerOf2ShrAssign<i8>
174    + ModPowerOf2ShrAssign<i16>
175    + ModPowerOf2ShrAssign<i32>
176    + ModPowerOf2ShrAssign<i64>
177    + ModPowerOf2ShrAssign<i128>
178    + ModPowerOf2ShrAssign<isize>
179    + ModPowerOf2Sqrt<Output = Self>
180    + ModPowerOf2AbsSquared<Output = Self>
181    + ModPowerOf2AbsSquaredAssign
182    + ModPowerOf2Square<Output = Self>
183    + ModPowerOf2SquareAssign
184    + ModPowerOf2Sub<Self, Output = Self>
185    + ModPowerOf2SubAssign<Self>
186    + ModPowPrecomputed<u64, Self, Output = Self>
187    + ModPowPrecomputedAssign<u64, Self>
188    + ModAbsSquared<Self, Output = Self>
189    + ModAbsSquaredAssign<Self>
190    + ModSquare<Self, Output = Self>
191    + ModSquareAssign<Self>
192    + ModSquarePrecomputed<u64, Self, Output = Self>
193    + ModSquarePrecomputedAssign<u64, Self>
194    + ModSub<Self, Self, Output = Self>
195    + ModSubAssign<Self, Self>
196    + Multifactorial
197    + NegMod<Self, Output = Self>
198    + NegModAssign<Self>
199    + NegModPowerOf2<Output = Self>
200    + NegModPowerOf2Assign
201    + NextPowerOf2<Output = Self>
202    + NextPowerOf2Assign
203    + OrdDouble<Self>
204    + PowerOf2Digits<u8>
205    + PowerOf2Digits<u16>
206    + PowerOf2Digits<u32>
207    + PowerOf2Digits<u64>
208    + PowerOf2Digits<u128>
209    + PowerOf2Digits<usize>
210    + PowerOf2DigitIterable<u8>
211    + PowerOf2DigitIterable<u16>
212    + PowerOf2DigitIterable<u32>
213    + PowerOf2DigitIterable<u64>
214    + PowerOf2DigitIterable<u128>
215    + PowerOf2DigitIterable<usize>
216    + Primes<I = PrimesIterator<Self>, LI = PrimesLessThanIterator<Self>>
217    + PrimitiveInt
218    + Primorial
219    + RootRem<u64, RootOutput = Self, RemOutput = Self>
220    + RootAssignRem<u64, RemOutput = Self>
221    + SciMantissaAndExponent<f32, u64>
222    + SciMantissaAndExponent<f64, u64>
223    + SqrtRem<SqrtOutput = Self, RemOutput = Self>
224    + SqrtAssignRem<RemOutput = Self>
225    + Subfactorial
226    + VecFromOtherType<u8>
227    + VecFromOtherType<u16>
228    + VecFromOtherType<u32>
229    + VecFromOtherType<u64>
230    + VecFromOtherType<u128>
231    + VecFromOtherType<usize>
232    + VecFromOtherTypeSlice<u8>
233    + VecFromOtherTypeSlice<u16>
234    + VecFromOtherTypeSlice<u32>
235    + VecFromOtherTypeSlice<u64>
236    + VecFromOtherTypeSlice<u128>
237    + VecFromOtherTypeSlice<usize>
238    + XXAddYYToZZ
239    + XXDivModYToQR
240    + XXSubYYToZZ
241    + XMulYToZZ
242    + XXXAddYYYToZZZ
243    + XXXSubYYYToZZZ
244    + XXXXAddYYYYToZZZZ
245{
246}
247
248macro_rules! impl_basic_traits {
249    ($u:ident) => {
250        impl PrimitiveUnsigned for $u {}
251    };
252}
253apply_to_unsigneds!(impl_basic_traits);