筛选eratosthenes算法

时间:2013-02-24 15:34:04

标签: erlang prime-factoring

我正试图在二郎中实施一种eratosphenes筛子。但是我无法超越算法的第二步。我用p填充标记的条目,这样当我查看列表直到找到大于p的值时,我就会知道它也是素数。

    -module(sieve).
    -export([primes/0]).

    primes() -> L = lists:seq(2,20),
    mark(L,2).

    mark(L,P) -> mark(L,P,2,[]).

    mark([],_,_,N) -> N;
    mark([_|T],P,C,N) when C =:= P -> mark(T,P,C+1,[N|[P]]);
    mark([H|T],P,C,N) -> mark(T,P,C,[N|[H]]).

我也尝试用++附加,但结果相同。

2 个答案:

答案 0 :(得分:1)

以上代码仅运行一次。

primes() ->
    List = lists:seq(2,100),
    mark([], List).

mark(Primes, []) ->
    lists:reverse(Primes);
mark(Primes, _List = [H| T]) ->
    mark([H | Primes], H, T, []).

mark(Primes, _P, [], NewList) -> 
    mark(Primes, lists:reverse(NewList));
mark(Primes, P, [H | T], NewList) when H rem P == 0 ->
    mark(Primes, P, T, NewList);
mark(Primes, P,[H | T], NewList) ->
    mark(Primes, P, T, [H | NewList]).

即使没有反向也可以工作,但为了维持正确的顺序,我们可以做反向或++

答案 1 :(得分:0)

如果您的目的是教育,将质数存储在列表中是可以的,而且vinod的解决方案很好。但是如果你必须使用这个列表,那么我认为ETS表(有序集)可能更方便。

另一点,erathostene算法的一个弱点是你首先创建一个巨大的列表(如果你需要很多)然后删除大部分元素。您可以轻松地将初始列表L = [2|lists:seq(3,Max,2)]除以2。您也可以初始化列表/表格而不是2,3,5的倍数,创建时间更短,消除时间更短。