このディレクトリの索引

mからnの範囲の素数(_m,_n,_mから_nの範囲の素数ならび) :-
        n以下の素数(_n,_n以下の素数ならび),
        findall(_素数,(
                    member(_素数,_n以下の素数ならび),
                    _素数 >= _m),
               _mから_nの範囲の素数ならび).

n以下の素数(_n以下,_素数ならび) :-
        findall(_数,(
                    between(2,_n以下,_数)),
                _2以上_n以下の数ならび),
        エラトステネスの篩(_2以上_n以下の数ならび,_素数ならび).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

エラトステネスの篩([],[]) :- !.
エラトステネスの篩([_或る素数|R1],[_或る素数|R2]) :-
        或る素数の倍数を篩に掛ける(_或る素数,_或る素数,[_或る素数|R1],L),
        エラトステネスの篩(L,R2).

或る素数の倍数を篩に掛ける(_,_,[],[]).
或る素数の倍数を篩に掛ける(_或る素数の倍数,_或る素数,[_或る素数の倍数|R1],R2) :-
        _或る素数の倍数_2 is _或る素数の倍数 + _或る素数,
        或る素数の倍数を篩に掛ける(_或る素数の倍数_2,_或る素数,R1,R2),!.
或る素数の倍数を篩に掛ける(_或る素数の倍数_1,_或る素数,[_数|R1],R2) :-
        _或る素数の倍数_1 < _数,
        _或る素数の倍数_2 is _或る素数の倍数_1 + _或る素数,
        或る素数の倍数を篩に掛ける(_或る素数の倍数_2,_或る素数,[_数|R1],R2),!.
或る素数の倍数を篩に掛ける(_或る素数の倍数,_或る素数,[_或る素数の倍数ではない数|R1],[_或る素数の倍数ではない数|R2]) :-
        或る素数の倍数を篩に掛ける(_或る素数の倍数,_或る素数,R1,R2),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

エラトステネスの篩([],[]) :- !.
エラトステネスの篩([_或る素数|R1],[_或る素数|R2]) :-
        或る素数の倍数を篩に掛ける(_或る素数,_或る素数,[_或る素数|R1],L),
        エラトステネスの篩(L,R2).

或る素数の倍数を篩に掛ける(_,_,[],[]).
或る素数の倍数を篩に掛ける(_或る素数の倍数,_或る素数,[_或る素数の倍数|R1],R2) :-
        _或る素数の倍数_2 is _或る素数の倍数 + _或る素数,
        或る素数の倍数を篩に掛ける(_或る素数の倍数_2,_或る素数,R1,R2),!.
或る素数の倍数を篩に掛ける(_或る素数の次の倍数,_或る素数,[_数|R1],R2) :-
        数が或る素数の次の倍数ではない場合は(_或る素数の次の倍数,_或る素数,[_数|R],R2).

数が或る素数の次の倍数ではない場合は(_或る素数の次の倍数,_或る素数,[_数|R1],R2) :-
        _或る素数の次の倍数 < _数,
        _或る素数の次の次の倍数 is _或る素数の次の倍数 + _或る素数,
        或る素数の倍数を篩に掛ける(_或る素数の次の次の倍数,_或る素数,[_数|R1],R2),!.
数が或る素数の次の倍数ではない場合は(_或る素数の次の倍数,_或る素数,[_或る素数の倍数ではない数|R1],[_或る素数の倍数ではない数|R2]) :-
        或る素数の倍数を篩に掛ける(_或る素数の次の倍数,_或る素数,R1,R2),!.