Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Numeri Primi
Forum - Pascal - Numeri Primi

Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 17:49
Mercoledì, 03/03/2010
Per una "sfida" con un amico ho cercato di fare un programma per calcolare un numero primo di 100 cifre.

program primo100;
type
cifra = type $00..$09;
numero = array[1..100]of byte;

var
cont : word;

procedure dim(var a:numero; const c : byte);
begin
if a[c]=0 then begin
dim(a,c+1);
a[c]:=9;
end else a[c] := a[c]-1;
end;
procedure aum(var a:numero; const c : byte);
begin
if a[c]=9 then begin
aum(a,c+1);
a[c]:=0;
end else a[c] := a[c]+1;
end;

operator -(a, b : numero) r : numero;
begin
for cont := 1 to 100 do
if a[cont]>=b[cont]then r[cont] := a[cont]-b[cont]
else begin
  dim(a,cont+1);
  r[cont] := a[cont]+10-b[cont];
end;
end;

operator =(a, b : numero) r : boolean;
begin
r := true;
for cont := 1 to 100 do if a[cont]<>b[cont] then begin
r := false;
exit;
end;
end;

operator >(a,b : numero) r : boolean;
begin
if a=b then r := false;
for cont := 100 downto 1 do begin
if a[cont]>b[cont] then begin r := true; exit; end;
if a[cont]<b[cont] then begin r := false; exit; end;
end;
end;

operator >=(a,b : numero) r : boolean;
begin
r := (a=b) or (a>b);
end;

procedure scrivi(n : numero);
begin
for cont := 100 downto 1 do write(n[cont]);
writeln;
end;

function euclide(a, b : numero) : numero;
begin
while a<>b do begin
if a=b then begin euclide := a; exit; end;
if a>b then a := a-b
else b := b-a;
end;
euclide := a;
end;

var
N, divis : numero;
primo : boolean;

const
uno : numero = (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
inizio : numero = (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1);
fine : numero = (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2);
radice : numero = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,2,4,2,7,8,8,6,1,0,8,8,4,0,5,9,0,3,7,3,2,6,5,3,1,2,4,1,4,1);

BEGIN
readln;
n := inizio;
repeat
primo := true;
divis:=uno;
repeat
  aum(divis,1);
  aum(divis,1);
  if euclide(n,divis)<>uno then primo := true;
until (divis=radice)or not(primo);
writeln;
scrivi(n);
if primo then begin
  writeln('!! E' primo  !!');
  readln;
end else writeln('non è primo');
aum(n,1);
aum(n,1);
until N = fine;
readln;
END.


Però si blocca e va avanti all'infinito quando si tratta di calcolare il M.C.D
(se quancuno non l'avesse capito questo è compito delle funzione Euclide, che sfrutta, appunto l' algoritmo ideato da Euclide: quello  di ab-cd=(a-c)b

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 18:16
Mercoledì, 03/03/2010
con quell'algoritmo ci metterai millenni a trovare un primo da 100 cifre...
carina però l'implementazione di bignum che hai fatto :p

se vuoi un consiglio, cerca l'algoritmo di test di primalità (deterministico) di Fibonacci e quello (probabilistico) di Rabin-Miller... ti aiuteranno parecchio ;)

Ultima modifica effettuata da TheKaneB il 03/03/2010 alle 18:17
PM Quote
Avatar
eddiewrc (Member)
Expert


Messaggi: 560
Iscritto: 30/04/2006

Segnala al moderatore
Postato alle 14:42
Giovedì, 04/03/2010
altro test probabilistico:
teorema di fermat:
se n è primo e 0 < a < n,
allora a^(n-1) mod n = 1

nel 1981 Pomerance ha dimostrato che
se n èun numero casuale di 100 cifre e a è un numero casuale positivo minore di n,
la probabilità che n non sia primo e la formula restituisca ugualmente 1 è di 10^(-13)

ripetendo il test si abbassa a piacere questa (sgradevole) probabilità.
è anche l'algoritmo usato da openssl, se non sbaglio

PM Quote