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(0), do: 1 def fact(1), do: 1 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) def fib(0), do: 1 def fib(1), do: 1 def fib(n) do cache = Process.get(:fib, %{}) case Map.get(cache, n, nil) do nil -> value = fib(n - 1) + fib(n - 2) cache = Process.get(:fib, %{}) |> Map.put_new(n, value) Process.put(:fib, cache) value m -> m end end def num_digits(0, acc), do: acc def num_digits(n, acc), do: num_digits(div(n,10),acc+1) def num_digits(0), do: 1 def num_digits(n) do num_digits(n, 0) end end