Lucas-Lehmer test for Mersenne numbers (Erlang)

From LiteratePrograms

Jump to: navigation, search
Other implementations: Erlang | Haskell | J | Java | Lisp | Python | Ruby | Scheme

This program is a code dump.
Code dumps are articles with little or no documentation or rearrangement of code. Please help to turn it into a literate program. Also make sure that the source of this code does consent to release it under the MIT or public domain license.


-module(lucas_lehmer).
-export([lucas_lehmer/1]).
lucas_lehmer(P) ->
    M = pow(2, P) - 1,
    lucas_lehmer(P, M, 4, P - 2).
lucas_lehmer(_, _, S, I) when I == 0 ->
    if
        S == 0 ->
            prime;
        true ->
            composite
    end;
lucas_lehmer(P, M, S0, I) ->
    S = ((S0 * S0) - 2) rem M,
    lucas_lehmer(P, M, S, I - 1).
%% Replace math:pow/2 which return a float
pow(_Base, 0) ->
    1;
pow(Base, Exponent) when Exponent rem 2 =:= 1 ->
    Base * pow(Base, Exponent-1);
pow(Base, Exponent) when Exponent rem 2 =:= 0 ->
    pow(Base*Base, Exponent div 2).
Download code
Views