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