use num_bigint::BigInt; use num_integer::Integer; use num_traits::{One, Signed, Zero}; pub trait Div { fn div_floor(&self, other: &Self) -> Self; fn div_round(&self, other: &Self) -> Self; } impl Div for BigInt { fn div_floor(&self, other: &Self) -> Self { let quo: BigInt = self / other; if self.sign() != other.sign() { return quo - BigInt::one(); } return quo; } fn div_round(&self, other: &Self) -> Self { let (quo, mut rem) = self.div_rem(other); rem <<= 1; if rem != BigInt::zero() && &rem.abs() > other { if self.sign() == other.sign() { return quo + BigInt::one(); } else { return quo - BigInt::one(); } } return quo; } }