Bonito entretenimiento, yo tambien me apunto
Con esto calculo los 15.000.000 primeros primos en 20 minutos
Es una aplicacion de consola:
Código Delphi
[-]
program Primos;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils;
const
Limit = 15000000;
procedure WriteTable(T: PInteger);
begin
Writeln(1);
while T^<>0 do
begin
Writeln(T^);
inc(T);
end;
end;
procedure SaveTable(T: PInteger; Filename: String);
var
F: Text;
begin
AssignFile(F, Filename);
{$I-}
Rewrite(F);
{$I+}
if IOResult = 0 then
begin
Writeln(F,1);
while T^<>0 do
begin
Writeln(F,T^);
inc(T);
end;
CloseFile(F);
end;
end;
function Test(N: Integer; T: PInteger): Boolean;
var
i: Integer;
begin
Result:= TRUE;
i:= Trunc(Sqrt(N));
while (T^<>0) and (T^<=i) do
if N mod T^ = 0 then
begin
Result:= FALSE;
break;
end else
inc(T);
end;
procedure Generate(T: PInteger);
var
i,j: Integer;
P: PInteger;
begin
P:= T;
P^:= 2;
inc(P);
j:= 3;
i:= 2;
while i <= Limit do
begin
if Test(j,T) then
begin
Write(Format('Generados: %d Ultimo: %d %s',[i,j,#13]));
P^:= j;
inc(P);
inc(i);
end;
inc(j,2);
end;
end;
var
Table: PInteger;
Ticks: Cardinal;
begin
GetMem(Table,(Limit + 1) * Sizeof(Integer));
try
FillChar(Table^,(Limit + 1) * Sizeof(Integer),#0);
Writeln('Generando numeros primos ...');
Ticks:= GetTickCount;
Generate(Table);
Ticks:= GetTickCount - Ticks;
Writeln;
Writeln;
Writeln(Format('Se han empleado %d ms',[Ticks]));
SaveTable(Table,ChangeFileExt(ParamStr(0),'.txt'));
finally
FreeMem(Table);
end;
end.
El programa anterior muestra algo como esto:
Código:
Generando numeros primos ...
Generados: 15000000 Ultimo: 275604541
Se han empleado 1217984 ms
Y además crea un fichero de texto con todos los números primos generados. (Ojo! es un archivo de 150 MB)
Alguno se anima a mejorar el tiempo