Skip to content

Instantly share code, notes, and snippets.

@dzyubam
Created March 18, 2011 23:48
Show Gist options
  • Save dzyubam/877042 to your computer and use it in GitHub Desktop.
Save dzyubam/877042 to your computer and use it in GitHub Desktop.
Euler 35
-module(euler35).
-export([is_circular_pr/1, solve/0]).
is_circular_pr(Number) -> % takes a prime number as input, does not check the number if it itself is prime
Check = lists:any(fun(X) -> (X - 48) rem 2 =:= 0 orelse (X - 48) == 5 end, integer_to_list(Number)),
Length = length(integer_to_list(Number)),
if
Length =:= 1 -> is_prime(Number);
Length > 1 ->
case Check of
true -> false;
false -> is_circular_pr(integer_to_list(Number), length(integer_to_list(Number)) - 1, false)
end
end.
is_circular_pr(_New_number, 0, Bool) ->
Bool;
is_circular_pr([H | Tail], Count, _Bool) ->
New_number = lists:append(Tail, [H]),
Is_it_prime = is_prime(list_to_integer(New_number)),
case Is_it_prime of
true -> is_circular_pr(New_number, Count - 1, true);
false -> false
end.
% reused from another problem
is_prime(X) ->
is_prime(X, 2).
is_prime(1, _) ->
false;
is_prime(2, _) ->
true;
is_prime(3, _) ->
true;
is_prime(X, Last_divisor) when Last_divisor * Last_divisor > X ->
true;
is_prime(X, Last_divisor) ->
if
X rem Last_divisor == 0 ->
false;
Last_divisor == 2 ->
is_prime(X, Last_divisor + 1);
true ->
is_prime(X, Last_divisor + 2)
end.
% reused
primes(Below) ->
[X || X <- [2 | lists:seq(3, Below, 2)],
is_prime(X)].
solve() ->
solve(primes(1000000), 0). % this step (generating primes) takes the most of the time needed to find the answer
solve([], Cnt) ->
Cnt;
solve([H | T], Cnt) ->
Check = is_circular_pr(H),
case Check of
true ->
solve(T, Cnt + 1);
false ->
solve(T, Cnt)
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment