Skip to content

Instantly share code, notes, and snippets.

@lucca65
Last active December 7, 2016 19:55
Show Gist options
  • Save lucca65/4c98e6bc882e242b13479fa2e17744d6 to your computer and use it in GitHub Desktop.
Save lucca65/4c98e6bc882e242b13479fa2e17744d6 to your computer and use it in GitHub Desktop.
Prime number simple cluster implementation
defmodule Worker do
def start do
pid = spawn(__MODULE__, :loop, [])
send(server_pid, {:request, pid})
pid
end
def server_pid do
:global.whereis_name("server")
end
def loop do
receive do
number ->
if result = is_prime?(number, 5) do
IO.puts "Found a prime!!! #{number}"
end
send(server_pid, {result, number})
send(server_pid, {:request, self()})
loop
end
end
def is_prime?(_, 0), do: true
def is_prime?(p, n) do
if fermat(p) do
is_prime?(p, n-1)
else
false
end
end
def fermat(1), do: true
def fermat(p) do
r = :random.uniform(p-1)
t = mpow(r, p-1, p)
if t == 1 do
true
else
false
end
end
def mpow(n, 1, _), do: n
def mpow(n, k, m), do: mpow(rem(k,2), n, k, m)
def mpow(0, m, k, m) do
x = mpow(m, div(k, 2), m)
rem(x*x, m)
end
def mpow(_, n, k, m) do
x = mpow(n, k-1, m)
rem(x*n, m)
end
end
iex --name worker@[your-ip] --cookie 123 client.exs
defmodule Server do
def start do
pid = spawn(__MODULE__, :loop, [1,1]) # spawn this module
:yes = :global.register_name("server", pid) # register it globally
pid
end
def loop(number, highest_prime) do
receive do
{:request, worker_pid} ->
send(worker_pid, number)
loop(number + 1, highest_prime)
{true, candidate_prime} ->
if candidate_prime > highest_prime do
IO.puts "New Candidate: #{candidate_prime}"
loop(number, candidate_prime)
else
loop(number, highest_prime)
end
{false, _} ->
loop(number, highest_prime)
end
end
end
iex --name server@[your-ip] --cookie 123 server.exs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment