defmodule Euler.Algebra do def divisors(n) do [ 1 | (for i <- 2..floor(:math.sqrt(n))//1, j = div(n, i), j == n / i do if i !== j, do: [i,j], else: [i] end |> Enum.flat_map(&(&1))) ] end defp fact(1, acc), do: acc defp fact(n, acc), do: fact(n - 1, n * acc) @doc """ Computes n! """ def fact(n), do: fact(n - 1, n) defp digit_sum(0, acc), do: acc defp digit_sum(n, acc), do: digit_sum(div(n, 10), rem(n, 10) + acc) @doc """ Returns the sum of the digits of `n`. """ def digit_sum(n), do: digit_sum(n, 0) end