sieve(N, [2|PS]) :- % PS is list of odd primes up to N
retractall(mult(_)),
sieve_O(3,N,PS).
sieve_O(I,N,PS) :- % sieve odds from I up to N to get PS
( mult(I) -> sieve_O(I1,N,PS)
; ( I =< N / I ->
ISq
is I
*I
, DI
is 2*I
, add_mults
(DI
,ISq
,N
) ),
PS = [I|T],
sieve_O(I1,N,T)
).
sieve_O(I,N,[]) :- I > N.
add_mults(DI,I,N) :-
I =< N, !,
; assert(mult(I)) ),
add_mults(DI,I1,N).
add_mults(_,I,N) :- I > N.
time( sieve( N,P)), length(P,Len), last(P, LP), writeln([Len,LP]),
:- main(100000), main(1000000).
c2lldmUoTiwgWzJ8UFNdKSA6LSAgICAgICAlIFBTIGlzIGxpc3Qgb2Ygb2RkIHByaW1lcyB1cCB0byBOCiAgICByZXRyYWN0YWxsKG11bHQoXykpLAogICAgc2lldmVfTygzLE4sUFMpLgogCnNpZXZlX08oSSxOLFBTKSA6LSAgICAgICAgJSBzaWV2ZSBvZGRzIGZyb20gSSB1cCB0byBOIHRvIGdldCBQUwogICAgSSA9PCBOLCAhLCBJMSBpcyBJKzIsCiAgICAoICAgbXVsdChJKSAtPiBzaWV2ZV9PKEkxLE4sUFMpCiAgICA7ICAgKCAgIEkgPTwgTiAvIEkgLT4gCiAgICAgICAgICAgIElTcSBpcyBJKkksIERJICBpcyAyKkksIGFkZF9tdWx0cyhESSxJU3EsTikKICAgICAgICA7ICAgdHJ1ZSAKICAgICAgICApLAogICAgICAgIFBTID0gW0l8VF0sCiAgICAgICAgc2lldmVfTyhJMSxOLFQpCiAgICApLgpzaWV2ZV9PKEksTixbXSkgOi0gSSA+IE4uCiAKYWRkX211bHRzKERJLEksTikgOi0KICAgIEkgPTwgTiwgISwKICAgICggbXVsdChJKSAtPiB0cnVlIAogICAgOyBhc3NlcnQobXVsdChJKSkgKSwKICAgIEkxIGlzIEkrREksCiAgICBhZGRfbXVsdHMoREksSTEsTikuCmFkZF9tdWx0cyhfLEksTikgOi0gSSA+IE4uCgptYWluKE4pIDotIGN1cnJlbnRfcHJvbG9nX2ZsYWcodmVyYm9zZSxGKSwKICBzZXRfcHJvbG9nX2ZsYWcodmVyYm9zZSxub3JtYWwpLCAKICB0aW1lKCBzaWV2ZSggTixQKSksIGxlbmd0aChQLExlbiksIGxhc3QoUCwgTFApLCB3cml0ZWxuKFtMZW4sTFBdKSwKICBzZXRfcHJvbG9nX2ZsYWcodmVyYm9zZSxGKS4KCjotIGR5bmFtaWMoIG11bHQvMSApLgo6LSBtYWluKDEwMDAwMCksIG1haW4oMTAwMDAwMCku