From dfe3d2d77826d32dd2123fe0ad2a06c900bdde51 Mon Sep 17 00:00:00 2001 From: Philippe Antoine Date: Fri, 3 Sep 2021 09:29:36 +0200 Subject: [PATCH 1/4] rust: use explicitily Integer::div_ceil cf https://github.com/rust-lang/rust/issues/88581 (cherry picked from commit a8fc78c1e28c55af83a57d97dff3f6a93c45b46c) --- src/biguint.rs | 2 +- src/biguint/convert.rs | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/biguint.rs b/src/biguint.rs index b790c57a..5d22d145 100644 --- a/src/biguint.rs +++ b/src/biguint.rs @@ -390,7 +390,7 @@ impl Roots for BigUint { // Try to guess by scaling down such that it does fit in `f64`. // With some (x * 2ⁿᵏ), its nth root ≈ (ⁿ√x * 2ᵏ) let extra_bits = bits - (core::f64::MAX_EXP as u64 - 1); - let root_scale = extra_bits.div_ceil(&n64); + let root_scale = Integer::div_ceil(&extra_bits, &n64); let scale = root_scale * n64; if scale < bits && bits - scale > n64 { (self >> scale).nth_root(n) << root_scale diff --git a/src/biguint/convert.rs b/src/biguint/convert.rs index 278ec782..d5dd171e 100644 --- a/src/biguint/convert.rs +++ b/src/biguint/convert.rs @@ -65,9 +65,8 @@ fn from_inexact_bitwise_digits_le(v: &[u8], bits: u8) -> BigUint { debug_assert!(!v.is_empty() && bits <= 8 && big_digit::BITS % bits != 0); debug_assert!(v.iter().all(|&c| BigDigit::from(c) < (1 << bits))); - let big_digits = (v.len() as u64) - .saturating_mul(bits.into()) - .div_ceil(&big_digit::BITS.into()) + let big_digits = (v.len() as u64).saturating_mul(bits.into()); + let big_digits = Integer::div_ceil(&big_digits, &big_digit::BITS.into()) .to_usize() .unwrap_or(core::usize::MAX); let mut data = Vec::with_capacity(big_digits); @@ -580,9 +579,8 @@ pub(super) fn to_bitwise_digits_le(u: &BigUint, bits: u8) -> Vec { let last_i = u.data.len() - 1; let mask: BigDigit = (1 << bits) - 1; let digits_per_big_digit = big_digit::BITS / bits; - let digits = u - .bits() - .div_ceil(&u64::from(bits)) + let digits = u.bits(); + let digits = Integer::div_ceil(&digits, &u64::from(bits)) .to_usize() .unwrap_or(core::usize::MAX); let mut res = Vec::with_capacity(digits); @@ -608,9 +606,8 @@ fn to_inexact_bitwise_digits_le(u: &BigUint, bits: u8) -> Vec { debug_assert!(!u.is_zero() && bits <= 8 && big_digit::BITS % bits != 0); let mask: BigDigit = (1 << bits) - 1; - let digits = u - .bits() - .div_ceil(&u64::from(bits)) + let digits = u.bits(); + let digits = Integer::div_ceil(&digits, &u64::from(bits)) .to_usize() .unwrap_or(core::usize::MAX); let mut res = Vec::with_capacity(digits); From 43eaeec0cf65612baef0a82bbb0b6c4b61279592 Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Fri, 3 Sep 2021 09:36:53 -0700 Subject: [PATCH 2/4] Adjust shadowed names around div_ceil (cherry picked from commit de57106cd499eb1a9d7330606b5bb3021209350a) --- src/biguint/convert.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/biguint/convert.rs b/src/biguint/convert.rs index d5dd171e..c2e94792 100644 --- a/src/biguint/convert.rs +++ b/src/biguint/convert.rs @@ -65,8 +65,8 @@ fn from_inexact_bitwise_digits_le(v: &[u8], bits: u8) -> BigUint { debug_assert!(!v.is_empty() && bits <= 8 && big_digit::BITS % bits != 0); debug_assert!(v.iter().all(|&c| BigDigit::from(c) < (1 << bits))); - let big_digits = (v.len() as u64).saturating_mul(bits.into()); - let big_digits = Integer::div_ceil(&big_digits, &big_digit::BITS.into()) + let total_bits = (v.len() as u64).saturating_mul(bits.into()); + let big_digits = Integer::div_ceil(&total_bits, &big_digit::BITS.into()) .to_usize() .unwrap_or(core::usize::MAX); let mut data = Vec::with_capacity(big_digits); @@ -579,8 +579,7 @@ pub(super) fn to_bitwise_digits_le(u: &BigUint, bits: u8) -> Vec { let last_i = u.data.len() - 1; let mask: BigDigit = (1 << bits) - 1; let digits_per_big_digit = big_digit::BITS / bits; - let digits = u.bits(); - let digits = Integer::div_ceil(&digits, &u64::from(bits)) + let digits = Integer::div_ceil(&u.bits(), &u64::from(bits)) .to_usize() .unwrap_or(core::usize::MAX); let mut res = Vec::with_capacity(digits); @@ -606,8 +605,7 @@ fn to_inexact_bitwise_digits_le(u: &BigUint, bits: u8) -> Vec { debug_assert!(!u.is_zero() && bits <= 8 && big_digit::BITS % bits != 0); let mask: BigDigit = (1 << bits) - 1; - let digits = u.bits(); - let digits = Integer::div_ceil(&digits, &u64::from(bits)) + let digits = Integer::div_ceil(&u.bits(), &u64::from(bits)) .to_usize() .unwrap_or(core::usize::MAX); let mut res = Vec::with_capacity(digits); From 3affee964c918640a53de1eea5efc24de0e0ed8a Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Fri, 3 Sep 2021 09:52:50 -0700 Subject: [PATCH 3/4] Fix div_ceil with rand and serde too (cherry picked from commit 1469ed68d16bcaa069965dcecf4cab0dbcde3b92) --- src/bigrand.rs | 2 +- src/biguint/serde.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bigrand.rs b/src/bigrand.rs index cb440327..8f0ce5b3 100644 --- a/src/bigrand.rs +++ b/src/bigrand.rs @@ -66,7 +66,7 @@ impl RandBigInt for R { let len = (digits + (rem > 0) as u64) .to_usize() .expect("capacity overflow"); - let native_digits = bit_size.div_ceil(&64); + let native_digits = Integer::div_ceil(&bit_size, &64); let native_len = native_digits.to_usize().expect("capacity overflow"); let mut data = vec![0u64; native_len]; unsafe { diff --git a/src/biguint/serde.rs b/src/biguint/serde.rs index 573b0a7b..ed663c6d 100644 --- a/src/biguint/serde.rs +++ b/src/biguint/serde.rs @@ -89,7 +89,7 @@ impl<'de> Visitor<'de> for U32Visitor { use num_integer::Integer; let u32_len = seq.size_hint().unwrap_or(0); - let len = u32_len.div_ceil(&2); + let len = Integer::div_ceil(&u32_len, &2); let mut data = Vec::with_capacity(len); while let Some(lo) = seq.next_element::()? { From 6c8442b6edca12e28a86b1e214c273d0e9a52799 Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Fri, 3 Sep 2021 10:00:25 -0700 Subject: [PATCH 4/4] Release 0.3.3 --- Cargo.toml | 2 +- RELEASES.md | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 76c374cc..3915bffe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ categories = [ "algorithms", "data-structures", "science" ] license = "MIT OR Apache-2.0" name = "num-bigint" repository = "https://github.com/rust-num/num-bigint" -version = "0.3.2" +version = "0.3.3" readme = "README.md" build = "build.rs" exclude = ["/bors.toml", "/ci/*", "/.github/*"] diff --git a/RELEASES.md b/RELEASES.md index f7897041..3904242c 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,3 +1,11 @@ +# Release 0.3.3 (2021-09-03) + +- [Use explicit `Integer::div_ceil` to avoid the new unstable method.][219] + +**Contributors**: @catenacyber, @cuviper + +[219]: https://github.com/rust-num/num-bigint/pull/219 + # Release 0.3.2 (2021-03-04) - [The new `BigUint` methods `count_ones` and `trailing_ones`][175] return the