Ensin Erasthoneen seulalla tein totuusarvoisen taulukon 1.5 miljardia pienemmistä alkuluvuista ja sen taulukon avulla tutkin lukuja 1.5*1.5 miljardista alaspäin.
Koodi: Valitse kaikki
Program Alkuluku;
uses math,sysutils,DateUtils,bigdecimalmath;
CONST maxind = 1500000000; {lasketaan 1,5 miljardia pienemmät alkuluvut}
VAR taulukko : ARRAY[1..maxind] OF BOOLEAN;
lkm, luku: qword;
ind: longint;
neliojuuri : Float;
ehdokas,apuri: qword;
function onalkuluku(luku:qword):boolean;
var indeksi: Longword;
onse: boolean;
begin
if (luku mod 2) = 0 then onse:=false else
begin
indeksi:=3;
onse:=true;
while (indeksi <= Sqrt(luku)) and (onse=true) do
begin
if taulukko[indeksi] then
begin
if (luku mod indeksi) = 0 then
begin onse:=false;
writeln(indeksi);
end;
end;
indeksi:=indeksi+2;
end;
end;
onalkuluku:=onse;
end;
begin
lkm:=maxind;
neliojuuri:= Sqrt(lkm);
for ind:=2 to maxind do taulukko[ind]:=true; {oletetaan kaikki alkuluvuiksi}
taulukko[1]:= false;
luku:=2;
ind:=luku;
while ind<=lkm do {poistetaan 2:n monikerrat}
begin
taulukko[ind]:= false;
ind:=ind+2;
end;
while (luku < neliojuuri) do
begin
while (taulukko[luku] = false) and (luku < neliojuuri) do
{etsitään seuraava alkuluku}
luku:=luku + 1;
ind:=luku + luku;
while ind < lkm do {poistetaan sen monikerrat}
begin
taulukko[ind]:= false;
ind:=ind+luku;
end;
luku:= luku + 1;
end;
taulukko[2]:= true;
{Nyt on taulukoitu miljardia pienemmät alkuluvut.
Tulostetaan sataa pienemmät kokeeksi.}
for ind:=1 to 100 do
if taulukko[ind]=true then writeln (ind);
//Tutkitaan ehdokaslukuja
apuri:=1;
while apuri < 100 do
begin
ehdokas:=maxind*maxind-apuri;
if onalkuluku(ehdokas) then
begin
writeln(ehdokas,' on alkuluku.')
end
else writeln(ehdokas,' ei ole alkuluku.');
apuri:=apuri+2;
end;
end.