1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
use super::gcd::*; pub trait Lcm: Gcd { fn lcm(self, other: Self) -> Self { (self / self.gcd(other) * other).abs() } } pub trait LcmUnsigned: GcdUnsigned { fn lcm(self, other: Self) -> Self { (self / self.gcd(other)) * other } } impl<I: Gcd> Lcm for I {} impl<I: GcdUnsigned> LcmUnsigned for I {} #[cfg(test)] mod tests { use super::*; #[test] fn test_lcm() { assert_eq!(12i32.lcm(18), 36); assert_eq!((-12i32).lcm(18), 36); assert_eq!((12i32).lcm(-18), 36); assert_eq!((-12i32).lcm(-18), 36); } }