mirror of
https://github.com/arnaucube/poulpy.git
synced 2026-02-10 13:16:44 +01:00
32 lines
809 B
Rust
32 lines
809 B
Rust
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;
|
|
}
|
|
}
|