Last active
September 17, 2021 10:35
-
-
Save xavvvier/858bae60cea208e5fe92f040a3328294 to your computer and use it in GitHub Desktop.
An elixir function to calculate the nth prime number
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defmodule PrimeNumber do | |
def is_prime(2), do: true | |
def is_prime(number) do | |
not Enum.any?(2..number-1, fn x -> rem(number, x) == 0 end) | |
end | |
def prime(n) do | |
Stream.interval(1) | |
|> Stream.filter(&is_prime/1) | |
|> Enum.take(n) | |
end | |
end | |
1..100 | |
|> Enum.filter(&PrimeNumber.is_prime/1) | |
|> IO.inspect() | |
PrimeNumber.prime(25) | |
|> IO.inspect() | |
## Another version taken from elixirforum.com | |
defmodule Prime do | |
def nth_prime(n) do | |
Stream.iterate(1, &(&1 + 1)) | |
|> Stream.filter(&prime?(&1)) | |
|> Stream.with_index(1) | |
|> Enum.find(fn {_prime, x} -> x == n end) | |
end | |
def prime?(1), do: false | |
def prime?(2), do: true | |
def prime?(3), do: true | |
def prime?(5), do: true | |
def prime?(7), do: true | |
def prime?(n) when rem(n, 2) == 0, do: false | |
def prime?(n) do | |
limit = [7, round(:math.sqrt(n))] |> Enum.max | |
Stream.iterate(3, &(&1 + 2)) | |
|> Stream.take_while(fn x -> x <= limit end) | |
|> Stream.filter(fn x -> rem(n,x) == 0 end) | |
|> Enum.empty? | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment