math: gcd and lcm functions
parent
0afcadcfd1
commit
7eab373922
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue