From 12a80ea453af5f2050dbf58a9829bc2f64cf197e Mon Sep 17 00:00:00 2001 From: Alexander Abdugafarov Date: Wed, 23 Sep 2026 19:43:43 +0100 Subject: [PATCH 1/2] Implement CheckedNeg for BigInt --- src/bigint.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/bigint.rs b/src/bigint.rs index c2fcdef7..b7578ad4 100644 --- a/src/bigint.rs +++ b/src/bigint.rs @@ -11,7 +11,7 @@ use core::ops::{Neg, Not}; use core::str; use num_integer::{Integer, Roots}; -use num_traits::{ConstZero, Num, One, Pow, Signed, Zero}; +use num_traits::{CheckedNeg, ConstZero, Num, One, Pow, Signed, Zero}; use self::Sign::{Minus, NoSign, Plus}; @@ -344,6 +344,13 @@ impl Neg for &BigInt { } } +impl CheckedNeg for BigInt { + #[inline] + fn checked_neg(&self) -> Option { + Some(self.neg()) + } +} + impl Integer for BigInt { #[inline] fn div_rem(&self, other: &BigInt) -> (BigInt, BigInt) { From e2f5376c9ee1a9b0ba540b84f1998b3abd45d7c7 Mon Sep 17 00:00:00 2001 From: Alexander Abdugafarov Date: Wed, 23 Sep 2026 20:04:52 +0100 Subject: [PATCH 2/2] Implement CheckedRem for BigInt and BigUint --- src/bigint/division.rs | 12 +++++++++++- src/biguint/division.rs | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/bigint/division.rs b/src/bigint/division.rs index 0d4d23f3..a7731236 100644 --- a/src/bigint/division.rs +++ b/src/bigint/division.rs @@ -6,7 +6,7 @@ use crate::{IsizePromotion, UsizePromotion}; use core::ops::{Div, DivAssign, Rem, RemAssign}; use num_integer::Integer; -use num_traits::{CheckedDiv, CheckedEuclid, Euclid, Signed, ToPrimitive, Zero}; +use num_traits::{CheckedDiv, CheckedEuclid, CheckedRem, Euclid, Signed, ToPrimitive, Zero}; forward_all_binop_to_ref_ref!(impl Div for BigInt, div); @@ -447,6 +447,16 @@ impl CheckedDiv for BigInt { } } +impl CheckedRem for BigInt { + #[inline] + fn checked_rem(&self, v: &BigInt) -> Option { + if v.is_zero() { + return None; + } + Some(self.rem(v)) + } +} + impl CheckedEuclid for BigInt { #[inline] fn checked_div_euclid(&self, v: &BigInt) -> Option { diff --git a/src/biguint/division.rs b/src/biguint/division.rs index 62bedd12..f79c2007 100644 --- a/src/biguint/division.rs +++ b/src/biguint/division.rs @@ -10,7 +10,7 @@ use core::cmp::Ordering::{Equal, Greater, Less}; use core::mem; use core::ops::{Div, DivAssign, Rem, RemAssign}; use num_integer::Integer; -use num_traits::{CheckedDiv, CheckedEuclid, Euclid, ToPrimitive, Zero}; +use num_traits::{CheckedDiv, CheckedEuclid, CheckedRem, Euclid, ToPrimitive, Zero}; pub(super) const FAST_DIV_WIDE: bool = cfg!(any(target_arch = "x86", target_arch = "x86_64")); @@ -784,6 +784,16 @@ impl CheckedDiv for BigUint { } } +impl CheckedRem for BigUint { + #[inline] + fn checked_rem(&self, v: &BigUint) -> Option { + if v.is_zero() { + return None; + } + Some(self.rem(v)) + } +} + impl CheckedEuclid for BigUint { #[inline] fn checked_div_euclid(&self, v: &BigUint) -> Option {