Skip to content

Instantly share code, notes, and snippets.

@theunraveler
Created July 3, 2019 17:08
Show Gist options
  • Select an option

  • Save theunraveler/4cd2c00b52dd3eab6de736b44e6cfe88 to your computer and use it in GitHub Desktop.

Select an option

Save theunraveler/4cd2c00b52dd3eab6de736b44e6cfe88 to your computer and use it in GitHub Desktop.
defmodule Prime do
@doc """
Generates the nth prime.
"""
@spec nth(non_neg_integer) :: non_neg_integer
def nth(n) when n < 1, do: raise :error
def nth(n) do
Stream.iterate(2, &(&1 + 1))
|> Stream.filter(&prime?/1)
|> Enum.at(n - 1)
end
@spec prime?(non_neg_integer) :: boolean
defp prime?(number), do: number |> factors |> Enum.empty?
defguardp is_divisible(x, y) when rem(x, y) == 0
@spec factors(non_neg_integer, non_neg_integer, [non_neg_integer]) :: [non_neg_integer]
defp factors(number, i \\ 2, acc \\ [])
defp factors(number, i, acc) when number < i * i, do: acc
defp factors(number, i, acc) when is_divisible(number, i), do: factors(number, i + 1, [i, div(number, i) | acc])
defp factors(number, i, acc), do: factors(number, i + 1, acc)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment