Sieb des Eratosthenes(Auflister) Turbo Pascal
aus Paswiki Turbo Pascal, der freien Wissensdatenbank
Beschreibung
Hier werden die Primzahlen mit Hilfe des Siebs des Eratothenes aufgelistet. - Eines der schnellsten bekannten Verfahren, um große Bereiche zu durchsuchen.
Programm
Sucht die Primzahlen in extrem schnellem Tempo !!!
Da die Zeichenausgabe das Tempo exponential ansteigen lassen würde, sei diese unberücksichtig, kann aber auf Wunsch auch eingebaut werden - einfach ins Gästebuch schreiben!
Bei einem 1.5 Ghz-Prozessor ergaben sich folgende Durchschnittswerte:
| Obergrenze | Zeit in Sek. |
|---|---|
| 500.000 (0.5 Mio) | 0.04 |
| 1.000.000 (1 Mio) | 0.10 |
| 5.000.000 (5 Mio) | 0.38 |
| 10.000.000 (10 Mio) | 0.75 |
| 25.000.000 (25 Mio) | 1.97 |
| 50.000.000 (50 Mio) | 4.03 |
| 100.000.000 (100 Mio) | 8.32 |
{$N+}
uses dos;
type teil=array[0..60000] of boolean;
var
data : array[1..60000] of boolean;
teiler : ^teil;
i,j,count,sum : longint;
a,x,k,runde : integer;
endw,ende,bis : longint;
h,m,s,s100 : word;
time1,time2 : real;
endwert,ew : longint;
min,ew2,zaehlen : longint;
begin
writeln('Sieb des Erastosthenes');
writeln('======================');
writeln;
writeln('Bis zu welcher Obergrenze ?');
readln(ende); bis:=ende;
writeln('---------------');
ende :=( ende div 60000 ) +1;
gettime(h,m,s,s100);
time1:=3600*h + 60*m + s + (s100/100);
new(teiler);
for i:=1 to 60000 do
if odd(i) then
data[i]:=false;
endwert:=60000; zaehlen:=60000;
if endwert>bis then begin endwert:=bis; zaehlen:= bis mod 60000; end;
for j:=2 to trunc(sqrt(endwert)) do
begin
if odd(j) then
begin
sum:=j;
for i:=2 to (60000 div j) do
begin
sum:=sum+j;
if odd(i) then begin
if (sum>0) and (sum<=60000) then teiler^[sum]:=true;
end;
end;
end;
end;
for i:=1 to zaehlen do
if odd(i) then
if teiler^[i]=false then inc(count);
{----------------------------}
for runde:=2 to ende do begin
ew:=endwert;
endwert:=endwert + 60000; min:=min+zaehlen;
if endwert>bis then begin endwert:=bis; runde:=ende; zaehlen:= bis mod 60000; end;
{wenn die Primzahlengrenze höher als der endwert sind, wird nur bis zur differenz ausgezählt}
for j:=2 to trunc(sqrt(endwert)) do
begin
if teiler^[j]<>true then begin
if odd(j) then
begin
for i:=(ew div j) to (endwert div j) do
begin
if odd(i) then begin
sum:=(j*i)-min;
if (sum>0) and (sum<=60000) then data[sum]:=true;
end;
end;
end;
end;
end;
for i:=1 to zaehlen do
begin
if odd(i) then begin
if (data[i]=false) then inc(count)
else data[i]:=false;
end;
end;
end;
{----------------------------}
dispose(teiler);
gettime(h,m,s,s100);
time2:=3600*h + 60*m + s + (s100/100);
writeln(count,' Primzahlen');
writeln('Es hat ',time2-time1:0:2,' Sek. gedauert.');
readln;
end.
--Gastarbeiter 14:34, 17. Mär 2006 (CET)
