math: gcd and lcm functions

pull/1049/head
Rustem B 2019-06-29 20:24:55 +05:00 committed by Alexander Medvednikov
parent 0afcadcfd1
commit 7eab373922
2 changed files with 39 additions and 0 deletions

View File

@ -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)
}

View File

@ -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
}