fix signed modulus bug (#2134)

This commit is contained in:
Mark
2023-10-28 18:13:42 -06:00
parent 469d2bd104
commit ae7cf15c70

View File

@@ -1,4 +1,4 @@
use dashu::base::{Abs, Gcd, UnsignedAbs}; use dashu::base::{Abs, Gcd, Signed, UnsignedAbs};
use dashu::integer::IBig; use dashu::integer::IBig;
use dashu::integer::fast_div::ConstDivisor; use dashu::integer::fast_div::ConstDivisor;
use divrem::*; use divrem::*;
@@ -852,7 +852,18 @@ pub(crate) fn modulus(x: Number, y: Number, arena: &mut Arena) -> Result<Number,
fn ibig_rem_floor(n1: &Integer, n2: &Integer) -> Integer { fn ibig_rem_floor(n1: &Integer, n2: &Integer) -> Integer {
let ring = ConstDivisor::new(n2.unsigned_abs()); let ring = ConstDivisor::new(n2.unsigned_abs());
let n1 = n1.clone(); let n1 = n1.clone();
IBig::from(ring.reduce(n1).residue())
if n2.is_negative() {
let unsigned_result = IBig::from(ring.reduce(n1).residue());
if unsigned_result.is_zero() {
unsigned_result
} else {
unsigned_result + n2
}
} else {
IBig::from(ring.reduce(n1).residue())
}
} }
match (x, y) { match (x, y) {