Cât de repede să verificați un număr simplu

Q:> 2.3.3.1 Cum să verificați rapid un număr simplu?

A:> Iată programul. Funcționează foarte rapid și suficient de precis. Din păcate, în versiunea anterioară a fakka, acest program conținea o eroare. Acum pare a fi ca nu. =)







funcția mulmod (x, y, m: longint): longint; de asamblare;
asm
mov eax, x
mul y
div m
mov eax, edx
se încheie;

funcția powmod (x, a, m: longint): longint;
var
r: longint;
începe
r: = 1;
în timp ce o> 0 face
începe
dacă este impar (a) atunci r: = mulmod (r, x, m);
a: = a shr 1;






x: = mulmod (x, x, m);
se încheie;
powmod: = r;
se încheie;

funcția isprime (p: longint): boolean;
var q, i, a: longint;
const = 20;
începe
dacă este ciudat (p) atunci
începe
isprime: = adevărat;
q: = p-1;
în timp ce nu este ciudat (q) nu q: = q shr 1;
pentru i: = 1 la runde
începe
a: = Random (p-2) + 2;
dacă powmod (a, p-1, p)<>1 atunci
începe
isprime: = false;
pauză;
se încheie;
a: = powmod (a, q, p);
dacă a<>1 atunci
începe
în timp ce (a<>1) și (a<>p-1) face a: = mulmod (a, a, p);
dacă a = 1 atunci
începe
isprime: = false;
pauză;
se încheie;
se încheie;
se încheie;
sfârșitul altui isprime: = (p = 2);
se încheie;

var t: longint;
începe
Randomizează;
pentru t: = 1000000000 până la 1000100000 face dacă isprime (t) apoi writeln (t);
end.


A:> În plus, aici este o altă versiune a algoritmului: programul de exemplu de la Zyuzik
(deși pare mai lent decât cel precedent).

La prima pagină







Articole similare

Trimiteți-le prietenilor: