Haastan kaikki itse tehdyllä ohjelmalla löytämään ison alkuluvun. Itse löysin alkuluvun 2249999999999999981
Ensin Erasthoneen seulalla tein totuusarvoisen taulukon 1.5 miljardia pienemmistä alkuluvuista ja sen taulukon avulla tutkin lukuja 1.5*1.5 miljardista alaspäin.
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.No nyt löyty iso alkuluku! Mikäli koodini toimisi oikein, niin sain selville, että Mersennen luku 2^1499997953 - 1 on alkuluku. Mersennen lukujen, jotka ovat muotoa 2^p-1, alkuluvullisuutta tutkitaan niin sanotulla Lucas Lehmerin testillä. En kuitenkaan luule, että koodini toimisi oikein, sillä vuonna 2016 suurin tunnettu alkuluku oli 2^74207281-1.
Mutta en tiedä mitä siinä on väärin - se toimii ainakin pienillä luvuilla. Aliohjelma LucasLehmerTest saatu ChatGPT:ltä.
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;
function LucasLehmerTest(p: Integer): Boolean;
var
s, mersenne: Int64;
i: Integer;
begin
if p = 2 then
begin
LucasLehmerTest := True;
Exit;
end;
s := 4;
mersenne := Int64(1) shl p - 1;
for i := 3 to p do
s := (s * s - 2) mod mersenne;
LucasLehmerTest := s = 0;
end;
procedure tulostaMersenne(pot: Int64);
var tulostaluku: bigdecimal;
indeksi: Int64;
begin
tulostaluku:=2;
indeksi:=1;
while indeksi < pot do
begin
tulostaluku:=tulostaluku*2;
indeksi:=indeksi+1;
end;
tulostaluku:=tulostaluku-1;
writeln(BigDecimalToStr(tulostaluku));
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;
writeln('Taulukko valmis');
//Nyt on taulukoitu 1.5 miljardia pienemmät alkuluvut.
for ind:=(maxind-3000) to maxind do //tutkitaan lukuja 2^alkuluku LucasLehmerin testillä.
if taulukko[ind] then
begin
if LucasLehmerTest(ind) then
begin
Writeln('2^', ind, ' - 1 on alkuluku.');
tulostaMersenne(ind);
end;
end;
end.PetriKeckman kirjoitti:
Mutta en tiedä mitä siinä on väärin - se toimii ainakin pienillä luvuilla.
Joutuu varmaan siitä, että tarkastuksessa on Int64 eikä isompi lukutyyppi. Kai nyt hälytyskellojen pitäisi soida jo siinä vaiheessa, kun testin ajaminen reilusti tunnettua ennätystä suuremmalle luvulle käy kotikoneella hetkessä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.