Scalar division of a BigUint by a BigDigit
A BigUint can be divided by a BigDigit - this is one of several operations being implemented to allow scalar operations on BigInt and BigUint across the board.
This commit is contained in:
parent
530e2f6022
commit
784d26bbf8
|
@ -479,7 +479,17 @@ impl<'a, 'b> Div<&'b BigUint> for &'a BigUint {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn div(self, other: &BigUint) -> BigUint {
|
fn div(self, other: &BigUint) -> BigUint {
|
||||||
let (q, _) = self.div_rem(other);
|
let (q, _) = self.div_rem(other);
|
||||||
return q;
|
q
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Div<BigDigit> for BigUint {
|
||||||
|
type Output = BigUint;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn div(self, other: BigDigit) -> BigUint {
|
||||||
|
let (q, _) = div_rem_digit(self, other);
|
||||||
|
q
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -491,7 +501,17 @@ impl<'a, 'b> Rem<&'b BigUint> for &'a BigUint {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn rem(self, other: &BigUint) -> BigUint {
|
fn rem(self, other: &BigUint) -> BigUint {
|
||||||
let (_, r) = self.div_rem(other);
|
let (_, r) = self.div_rem(other);
|
||||||
return r;
|
r
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Rem<BigDigit> for BigUint {
|
||||||
|
type Output = BigDigit;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn rem(self, other: BigDigit) -> BigDigit {
|
||||||
|
let (_, r) = div_rem_digit(self, other);
|
||||||
|
r
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -866,6 +866,41 @@ fn test_div_rem() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_scalar_div_rem() {
|
||||||
|
for elm in MUL_TRIPLES.iter() {
|
||||||
|
let (a_vec, b_vec, c_vec) = *elm;
|
||||||
|
let c = BigUint::from_slice(c_vec);
|
||||||
|
|
||||||
|
if a_vec.len() == 1 && a_vec[0] != 0 {
|
||||||
|
let a = a_vec[0];
|
||||||
|
let b = BigUint::from_slice(b_vec);
|
||||||
|
assert!(c.clone() / a == b);
|
||||||
|
assert!(c.clone() % a == Zero::zero());
|
||||||
|
}
|
||||||
|
|
||||||
|
if b_vec.len() == 1 && b_vec[0] != 0 {
|
||||||
|
let a = BigUint::from_slice(a_vec);
|
||||||
|
let b = b_vec[0];
|
||||||
|
assert!(c.clone() / b == a);
|
||||||
|
assert!(c.clone() % b == Zero::zero());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for elm in DIV_REM_QUADRUPLES.iter() {
|
||||||
|
let (a_vec, b_vec, c_vec, d_vec) = *elm;
|
||||||
|
let a = BigUint::from_slice(a_vec);
|
||||||
|
let c = BigUint::from_slice(c_vec);
|
||||||
|
|
||||||
|
if b_vec.len() == 1 && b_vec[0] != 0 {
|
||||||
|
let b = b_vec[0];
|
||||||
|
let d = d_vec[0];
|
||||||
|
assert!(a.clone() / b == c);
|
||||||
|
assert!(a.clone() % b == d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_checked_add() {
|
fn test_checked_add() {
|
||||||
for elm in SUM_TRIPLES.iter() {
|
for elm in SUM_TRIPLES.iter() {
|
||||||
|
|
Loading…
Reference in New Issue