38 lines
830 B
Elixir
38 lines
830 B
Elixir
defmodule AmicableNumbers 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
|
|
end
|
|
|
|
defmodule Abundance do
|
|
def is_abundant?(n) do
|
|
cache = Process.get(:abundance, %{})
|
|
|
|
case cache |> Map.get(n) do
|
|
nil ->
|
|
sum = AmicableNumbers.divisors(n) |> Enum.sum()
|
|
is? = sum > n
|
|
Process.put(:abundance, Map.put(cache, n, is?))
|
|
is?
|
|
is? -> is?
|
|
end
|
|
end
|
|
end
|
|
|
|
# sum of all numbers that can be expressed as sum of two abundant numbers
|
|
sum = for n <- 1..28123,
|
|
mid = div(n, 2),
|
|
Enum.any?(1..mid, &(Abundance.is_abundant?(&1) and Abundance.is_abundant?(n - &1))),
|
|
reduce: 0
|
|
do
|
|
s -> s + n
|
|
end
|
|
|
|
(((28123*28124)/2) - sum)
|
|
|> IO.puts()
|
|
|