large_primes/operations/
gcd.rs1use num_bigint::BigUint;
2use num_traits::Zero;
3
4pub fn gcd(a: &BigUint, b: &BigUint) -> BigUint {
30 let mut a = a.clone();
32 let mut b = b.clone();
33
34 let zero = BigUint::zero();
35
36 while b > zero {
37 let temp = b.clone();
38 b = a % b;
39 a = temp;
40 }
41
42 return a;
43}
44
45#[cfg(test)]
46mod tests {
47 use num_bigint::BigUint;
48 use num_traits::{ One, Zero };
49
50 use super::*;
51
52 #[test]
53 fn edge_cases() {
54 assert_eq!(gcd(&BigUint::zero(), &BigUint::zero()), BigUint::zero());
56
57 assert_eq!(gcd(&BigUint::one(), &BigUint::zero()), BigUint::one());
59
60 assert_eq!(gcd(&BigUint::zero(), &BigUint::one()), BigUint::one());
62
63 assert_eq!(gcd(&BigUint::from(2u32), &BigUint::from(2u32)), BigUint::from(2u32));
65
66 assert_eq!(gcd(&BigUint::from(2u32), &BigUint::from(3u32)), BigUint::one());
68
69 assert_eq!(gcd(&BigUint::from(2u32), &BigUint::from(4u32)), BigUint::from(2u32));
71
72 assert_eq!(gcd(&BigUint::from(3u32), &BigUint::from(5u32)), BigUint::one());
74
75 assert_eq!(gcd(&BigUint::from(3u32), &BigUint::from(6u32)), BigUint::from(3u32));
77
78 assert_eq!(gcd(&BigUint::from(4u32), &BigUint::from(7u32)), BigUint::one());
80
81 assert_eq!(gcd(&BigUint::from(4u32), &BigUint::from(8u32)), BigUint::from(4u32));
83
84 assert_eq!(gcd(&BigUint::from(5u32), &BigUint::from(9u32)), BigUint::one());
86
87 assert_eq!(gcd(&BigUint::from(5u32), &BigUint::from(10u32)), BigUint::from(5u32));
89 }
90
91 #[test]
92 fn general_cases() {
93 assert_eq!(
96 gcd(&BigUint::from(123456u32), &BigUint::from(123456u32)),
97 BigUint::from(123456u32)
98 );
99 assert_eq!(gcd(&BigUint::from(123456u32), &BigUint::from(123457u32)), BigUint::one());
100 assert_eq!(gcd(&BigUint::from(123456u32), &BigUint::from(123458u32)), BigUint::from(2u32));
101 assert_eq!(gcd(&BigUint::from(123456u32), &BigUint::from(123459u32)), BigUint::from(3u32));
102 assert_eq!(gcd(&BigUint::from(123456u32), &BigUint::from(123460u32)), BigUint::from(4u32));
103 assert_eq!(gcd(&BigUint::from(123456u32), &BigUint::from(123461u32)), BigUint::one());
104 assert_eq!(gcd(&BigUint::from(123456u32), &BigUint::from(123462u32)), BigUint::from(6u32));
105 assert_eq!(gcd(&BigUint::from(123456u32), &BigUint::from(123463u32)), BigUint::one());
106 assert_eq!(gcd(&BigUint::from(123456u32), &BigUint::from(123464u32)), BigUint::from(8u32));
107 assert_eq!(gcd(&BigUint::from(123456u32), &BigUint::from(123465u32)), BigUint::from(3u32));
108 }
109}