Rollup merge of #146284 - Kivooeo:blazing-fast-division-bignum, r=Mark-Simulacrum
Remove `div_rem` from `core::num::bignum` This fixes very old fixme that sounds like this ``` Stupid slow base-2 long division taken from https://en.wikipedia.org/wiki/Division_algorithm FIXME use a greater base ($ty) for the long division. ``` By deleting this method since it was never used
This commit is contained in:
commit
fa63dbf301
2 changed files with 0 additions and 56 deletions
|
|
@ -335,43 +335,6 @@ macro_rules! define_bignum {
|
|||
}
|
||||
(self, borrow)
|
||||
}
|
||||
|
||||
/// Divide self by another bignum, overwriting `q` with the quotient and `r` with the
|
||||
/// remainder.
|
||||
pub fn div_rem(&self, d: &$name, q: &mut $name, r: &mut $name) {
|
||||
// Stupid slow base-2 long division taken from
|
||||
// https://en.wikipedia.org/wiki/Division_algorithm
|
||||
// FIXME use a greater base ($ty) for the long division.
|
||||
assert!(!d.is_zero());
|
||||
let digitbits = <$ty>::BITS as usize;
|
||||
for digit in &mut q.base[..] {
|
||||
*digit = 0;
|
||||
}
|
||||
for digit in &mut r.base[..] {
|
||||
*digit = 0;
|
||||
}
|
||||
r.size = d.size;
|
||||
q.size = 1;
|
||||
let mut q_is_zero = true;
|
||||
let end = self.bit_length();
|
||||
for i in (0..end).rev() {
|
||||
r.mul_pow2(1);
|
||||
r.base[0] |= self.get_bit(i) as $ty;
|
||||
if &*r >= d {
|
||||
r.sub(d);
|
||||
// Set bit `i` of q to 1.
|
||||
let digit_idx = i / digitbits;
|
||||
let bit_idx = i % digitbits;
|
||||
if q_is_zero {
|
||||
q.size = digit_idx + 1;
|
||||
q_is_zero = false;
|
||||
}
|
||||
q.base[digit_idx] |= 1 << bit_idx;
|
||||
}
|
||||
}
|
||||
debug_assert!(q.base[q.size..].iter().all(|&d| d == 0));
|
||||
debug_assert!(r.base[r.size..].iter().all(|&d| d == 0));
|
||||
}
|
||||
}
|
||||
|
||||
impl crate::cmp::PartialEq for $name {
|
||||
|
|
|
|||
|
|
@ -167,25 +167,6 @@ fn test_div_rem_small() {
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_div_rem() {
|
||||
fn div_rem(n: u64, d: u64) -> (Big, Big) {
|
||||
let mut q = Big::from_small(42);
|
||||
let mut r = Big::from_small(42);
|
||||
Big::from_u64(n).div_rem(&Big::from_u64(d), &mut q, &mut r);
|
||||
(q, r)
|
||||
}
|
||||
assert_eq!(div_rem(1, 1), (Big::from_small(1), Big::from_small(0)));
|
||||
assert_eq!(div_rem(4, 3), (Big::from_small(1), Big::from_small(1)));
|
||||
assert_eq!(div_rem(1, 7), (Big::from_small(0), Big::from_small(1)));
|
||||
assert_eq!(div_rem(45, 9), (Big::from_small(5), Big::from_small(0)));
|
||||
assert_eq!(div_rem(103, 9), (Big::from_small(11), Big::from_small(4)));
|
||||
assert_eq!(div_rem(123456, 77), (Big::from_u64(1603), Big::from_small(25)));
|
||||
assert_eq!(div_rem(0xffff, 1), (Big::from_u64(0xffff), Big::from_small(0)));
|
||||
assert_eq!(div_rem(0xeeee, 0xffff), (Big::from_small(0), Big::from_u64(0xeeee)));
|
||||
assert_eq!(div_rem(2_000_000, 2), (Big::from_u64(1_000_000), Big::from_u64(0)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_zero() {
|
||||
assert!(Big::from_small(0).is_zero());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue