From: Mark Date: Fri, 13 Oct 2023 20:33:36 +0000 (-0600) Subject: correct (mod)/2 (#2103, #2107) X-Git-Tag: remove~32 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=1ea397a80736184ee7f6fc83a3392fa1ddb16453;p=scryer-prolog.git correct (mod)/2 (#2103, #2107) --- diff --git a/src/machine/arithmetic_ops.rs b/src/machine/arithmetic_ops.rs index 149338b5..d1f764d6 100644 --- a/src/machine/arithmetic_ops.rs +++ b/src/machine/arithmetic_ops.rs @@ -1,5 +1,6 @@ -use dashu::base::Abs; -use dashu::base::Gcd; +use dashu::base::{Abs, Gcd, UnsignedAbs}; +use dashu::integer::IBig; +use dashu::integer::fast_div::ConstDivisor; use divrem::*; use num_order::NumOrd; @@ -854,7 +855,9 @@ pub(crate) fn modulus(x: Number, y: Number, arena: &mut Arena) -> Result &Integer::ZERO { ((n1 + Integer::ONE) / n2) - Integer::ONE } else { - n1 / n2 + let ring = ConstDivisor::new(n2.unsigned_abs()); + let n1 = n1.clone(); + IBig::from(ring.reduce(n1).residue()) } }