From 016c04ac4d6757d455578e1433b6001e35e73f71 Mon Sep 17 00:00:00 2001
From: Josh Stone <cuviper@gmail.com>
Date: Fri, 29 Apr 2022 16:36:23 -0700
Subject: [PATCH] Fix is_multiple_of with a 0 arg

---
 src/biguint.rs   |  3 +++
 tests/bigint.rs  | 12 ++++++++++++
 tests/biguint.rs | 12 ++++++++++++
 3 files changed, 27 insertions(+)

diff --git a/src/biguint.rs b/src/biguint.rs
index 623823c8..d634a7d4 100644
--- a/src/biguint.rs
+++ b/src/biguint.rs
@@ -283,6 +283,9 @@ impl Integer for BigUint {
     /// Returns `true` if the number is a multiple of `other`.
     #[inline]
     fn is_multiple_of(&self, other: &BigUint) -> bool {
+        if other.is_zero() {
+            return self.is_zero();
+        }
         (self % other).is_zero()
     }
 
diff --git a/tests/bigint.rs b/tests/bigint.rs
index f244bc4b..4ba5bb57 100644
--- a/tests/bigint.rs
+++ b/tests/bigint.rs
@@ -1036,6 +1036,18 @@ fn test_lcm() {
     check(11, 5, 55);
 }
 
+#[test]
+fn test_is_multiple_of() {
+    assert!(BigInt::from(0).is_multiple_of(&BigInt::from(0)));
+    assert!(BigInt::from(6).is_multiple_of(&BigInt::from(6)));
+    assert!(BigInt::from(6).is_multiple_of(&BigInt::from(3)));
+    assert!(BigInt::from(6).is_multiple_of(&BigInt::from(1)));
+
+    assert!(!BigInt::from(42).is_multiple_of(&BigInt::from(5)));
+    assert!(!BigInt::from(5).is_multiple_of(&BigInt::from(3)));
+    assert!(!BigInt::from(42).is_multiple_of(&BigInt::from(0)));
+}
+
 #[test]
 fn test_next_multiple_of() {
     assert_eq!(
diff --git a/tests/biguint.rs b/tests/biguint.rs
index 821b754a..bc47d1be 100644
--- a/tests/biguint.rs
+++ b/tests/biguint.rs
@@ -1085,6 +1085,18 @@ fn test_lcm() {
     check(99, 17, 1683);
 }
 
+#[test]
+fn test_is_multiple_of() {
+    assert!(BigUint::from(0u32).is_multiple_of(&BigUint::from(0u32)));
+    assert!(BigUint::from(6u32).is_multiple_of(&BigUint::from(6u32)));
+    assert!(BigUint::from(6u32).is_multiple_of(&BigUint::from(3u32)));
+    assert!(BigUint::from(6u32).is_multiple_of(&BigUint::from(1u32)));
+
+    assert!(!BigUint::from(42u32).is_multiple_of(&BigUint::from(5u32)));
+    assert!(!BigUint::from(5u32).is_multiple_of(&BigUint::from(3u32)));
+    assert!(!BigUint::from(42u32).is_multiple_of(&BigUint::from(0u32)));
+}
+
 #[test]
 fn test_next_multiple_of() {
     assert_eq!(