|
1 | 1 | //! [`Uint`] division operations.
|
2 | 2 |
|
3 |
| -use super::div_limb::{div_rem_limb_with_reciprocal, Reciprocal}; |
4 |
| -use crate::{CheckedDiv, ConstChoice, Limb, NonZero, Uint, Word, Wrapping}; |
| 3 | +use super::div_limb::{div_rem_limb_with_reciprocal, rem_limb_with_reciprocal, Reciprocal}; |
| 4 | +use crate::{CheckedDiv, ConstChoice, DivRemLimb, Limb, NonZero, RemLimb, Uint, Word, Wrapping}; |
5 | 5 | use core::ops::{Div, DivAssign, Rem, RemAssign};
|
6 | 6 | use subtle::CtOption;
|
7 | 7 |
|
8 | 8 | impl<const LIMBS: usize> Uint<LIMBS> {
|
9 |
| - /// Computes `self` / `rhs` using a pre-made reciprocal, |
| 9 | + /// Computes `self / rhs` using a pre-made reciprocal, |
10 | 10 | /// returns the quotient (q) and remainder (r).
|
11 | 11 | #[inline(always)]
|
12 | 12 | pub const fn div_rem_limb_with_reciprocal(&self, reciprocal: &Reciprocal) -> (Self, Limb) {
|
13 | 13 | div_rem_limb_with_reciprocal(self, reciprocal)
|
14 | 14 | }
|
15 | 15 |
|
16 |
| - /// Computes `self` / `rhs`, returns the quotient (q) and remainder (r). |
| 16 | + /// Computes `self / rhs`, returns the quotient (q) and remainder (r). |
17 | 17 | #[inline(always)]
|
18 | 18 | pub const fn div_rem_limb(&self, rhs: NonZero<Limb>) -> (Self, Limb) {
|
19 | 19 | div_rem_limb_with_reciprocal(self, &Reciprocal::new(rhs))
|
20 | 20 | }
|
21 | 21 |
|
| 22 | + /// Computes `self % rhs` using a pre-made reciprocal. |
| 23 | + #[inline(always)] |
| 24 | + pub const fn rem_limb_with_reciprocal(&self, reciprocal: &Reciprocal) -> Limb { |
| 25 | + rem_limb_with_reciprocal(self, reciprocal) |
| 26 | + } |
| 27 | + |
| 28 | + /// Computes `self % rhs`. |
| 29 | + #[inline(always)] |
| 30 | + pub const fn rem_limb(&self, rhs: NonZero<Limb>) -> Limb { |
| 31 | + rem_limb_with_reciprocal(self, &Reciprocal::new(rhs)) |
| 32 | + } |
| 33 | + |
22 | 34 | /// Computes `self` / `rhs`, returns the quotient (q) and the remainder (r)
|
23 | 35 | ///
|
24 | 36 | /// This function is constant-time with respect to both `self` and `rhs`.
|
@@ -584,6 +596,18 @@ impl<const LIMBS: usize> RemAssign<&NonZero<Uint<LIMBS>>> for Wrapping<Uint<LIMB
|
584 | 596 | }
|
585 | 597 | }
|
586 | 598 |
|
| 599 | +impl<const LIMBS: usize> DivRemLimb for Uint<LIMBS> { |
| 600 | + fn div_rem_limb_with_reciprocal(&self, reciprocal: &Reciprocal) -> (Self, Limb) { |
| 601 | + Self::div_rem_limb_with_reciprocal(self, reciprocal) |
| 602 | + } |
| 603 | +} |
| 604 | + |
| 605 | +impl<const LIMBS: usize> RemLimb for Uint<LIMBS> { |
| 606 | + fn rem_limb_with_reciprocal(&self, reciprocal: &Reciprocal) -> Limb { |
| 607 | + Self::rem_limb_with_reciprocal(self, reciprocal) |
| 608 | + } |
| 609 | +} |
| 610 | + |
587 | 611 | #[cfg(test)]
|
588 | 612 | mod tests {
|
589 | 613 | use crate::{Limb, NonZero, Uint, Word, U256};
|
|
0 commit comments