Többször említettük már, hogy a prímfaktorizálás feladatára nem ismert hatékony
algoritmus; látni fogjuk, hogy ez nem feltétlen „rossz hír”, ezen alapszik ugyanis az
RSA titkosítás. Ehhez képest meglepő, hogy egy adott számról hatékonyan el lehet
dönteni, hogy prím-e vagy sem – ezt a feladatot hívják
prímtesztelésnek:
Bemenet: $m$ pozitív egész;
Kimenet: „IGEN”, ha $m$ prím és „NEM”, ha $m$ nem prím.
A prímtesztelő algoritmusoknak az $m$ összetettségét úgy kell tudniuk kimutatni, hogy
közben $m$ egyetlen valódi osztóját sem találják meg. Az egyik legegyszerűbb
prímtesztelő módszer az 1.5.7. Euler-Fermat tételen alapszik: ha $m$
prím és $1 \le a \le m - 1$ tetszőleges, akkor $\phi(m) = m - 1$ és $(a, m) = 1$, így az
$a^{m-1} \equiv 1 \pmod m$ kongruenciának teljesülnie kell.
Ha tehát sikerül találnunk egy olyan $1 \le a \le m - 1$ egészet, amelyre $a^{m-1} \not\equiv 1 \pmod m$, akkor $m$
biztosan nem prím.
A Fermat-teszt néven közismert eljárás egymás után generál véletlen $a$
számokat, és minden $a$-ra ellenőrzi a feltételt. Az algoritmust két ponton egészítjük
ki: egyrészt először kiszámítjuk $(a, m)$ értékét (ha ez $> 1$, $m$ nem prím), másrészt
beiktatunk egy számlálót, ami egy előre rögzített számú (pl. 100) kísérlet után
megállítja az eljárást.
Fermat-teszt Algoritmus
Bemenet: $m$ egész
1 ciklus: $k$ fut 1-től 100-ig
2 Generáljunk egy $a$ véletlen számot 1 és $m
- 1$ között.
3 Számítsuk ki $(a, m)$ értékét az
EUKLIDESZI ALGORITMUSSAL.
4 ha $(a, m) \neq 1$,
akkor:
5
print „$m$ NEM prím”; stop
6 különben:
7 Számítsuk ki
$(a^{m-1} \pmod m)$ értékét az ISMÉTELT NÉGYZETRE EMELÉSEK
MÓDSZERÉVEL.
8 ha
$(a^{m-1} \pmod m) \neq 1$, akkor:
9
print „$m$ NEM prím”; stop
10 ciklus vége
11 print „IGEN, $m$ valószínűleg prím”
Kriminológiai analógia
Szokás a fenti eljárást a krimik nyelvezetét idéző módon is elmondani: az $a$
véletlen számokat sorban a tanúk padjára idézzük, az $a$
vallomása pedig (az $(a, m) = 1$ esetben) az $(a^{m-1} \pmod m)$ érték. Ha a
vallomás nem 1, a tanú leleplezte $m$ összetettségét.
Megjegyzés a bizonyosságról: Ha az algoritmus azt mondja, „NEM
prím”, az 100% biztos. Ha azt mondja, „IGEN”, az csak nagy valószínűség (léteznek
ugyanis ún. Carmichael-számok, amelyek összetettségét a Fermat-teszt nehezen mutatja
ki).