diff --git a/vlib/math/math.v b/vlib/math/math.v index 7d071a037d..c709637d96 100644 --- a/vlib/math/math.v +++ b/vlib/math/math.v @@ -68,6 +68,36 @@ pub fn fmod(a, b f64) f64 { return C.fmod(a, b) } +// gcd calculates greatest common (positive) divisor (or zero if x and y are both zero). +pub fn gcd(a, b int) int { + if a < 0 { + a = -a + } + if b < 0 { + b = -b + } + for b != 0 { + a %= b + if a == 0 { + return b + } + b %= a + } + return a +} + +// lcm calculates least common (non-negative) multiple. +pub fn lcm(a, b int) int { + if a == 0 { + return a + } + res := a * (b / gcd(b, a)) + if res < 0 { + return -res + } + return res +} + pub fn log(a f64) f64 { return C.log(a) } diff --git a/vlib/math/math_test.v b/vlib/math/math_test.v new file mode 100644 index 0000000000..d7b8c9fd44 --- /dev/null +++ b/vlib/math/math_test.v @@ -0,0 +1,9 @@ +import math + +fn test_gcd_and_lcm() { + assert math.gcd(6, 9) == 3 + assert math.gcd(6, -9) == 3 + + assert math.lcm(2, 3) == 6 + assert math.lcm(-2, 3) == 6 +}