36 lines
678 B
Elixir
36 lines
678 B
Elixir
defmodule AoC.Util.Math do
|
|
@moduledoc """
|
|
Math utility methods.
|
|
"""
|
|
|
|
@doc """
|
|
Returns the greatest common divisor of integers a and b.
|
|
"""
|
|
@spec gcd(integer(), integer()) :: integer()
|
|
def gcd(0, 0) do
|
|
0
|
|
end
|
|
|
|
@spec gcd(integer(), integer()) :: integer()
|
|
def gcd(a, a) do
|
|
a
|
|
end
|
|
|
|
@spec gcd(integer(), integer()) :: integer()
|
|
def gcd(a, b) when a > b do
|
|
gcd(a - b, b)
|
|
end
|
|
|
|
@spec gcd(integer(), integer()) :: integer()
|
|
def gcd(a, b) do
|
|
gcd(a, b - a)
|
|
end
|
|
|
|
@doc """
|
|
Returns the least common multiple of integers a and b.
|
|
"""
|
|
@spec lcm(integer(), integer()) :: integer()
|
|
def lcm(a, b) do
|
|
div(a * b, gcd(a, b))
|
|
end
|
|
end
|