Test di Miller-Rabin
Il test di primalità di Miller-Rabin è un test di primalità probabilistico (appartenente alla categoria degli algoritmi Monte Carlo). La sua versione originale, ideata da Gary Miller nel 1976, è deterministica, ma la sua correttezza dipende dall'ipotesi di Riemann generalizzata, un'importante congettura matematica tuttora aperta.
L'algoritmo è stato modificato nel 1980 da Michael Rabin per diventare un algoritmo probabilistico in tempo polinomiale, simile al test di Fermat e al test di Solovay-Strassen. L'algoritmo determina in modo estremamente efficiente se un dato numero sia composto; di contro, non fornisce una dimostrazione rigorosa della primalità di un numero, ma stabilisce con un margine di certezza arbitrariamente alto se esso sia un "probabile primo".
Fondamenti matematici
Analogamente ai test di Fermat e Solovay-Strassen, il test di Miller-Rabin si basa su specifiche proprietà algebriche dell'aritmetica modulare che risultano sempre vere per i numeri primi. In particolare, sfrutta il piccolo teorema di Fermat e le proprietà delle radici quadrate dell'unità.
Se è un numero primo, valgono due regole fondamentali:
- Per il piccolo teorema di Fermat, per ogni intero non divisibile per si ha: .
- Le uniche soluzioni dell'equazione sono e . Questo deriva dal fatto che ; per il lemma di Euclide, essendo primo, deve dividere necessariamente uno dei due fattori.
La fattorizzazione fondamentale
Sia un numero dispari (candidato a essere primo). Possiamo sempre scrivere il numero pari estraendo tutte le potenze di 2, ossia nella forma:
dove è un intero positivo e è un numero dispari.
Presa una base casuale nell'intervallo , possiamo sfruttare i prodotti notevoli per riscrivere l'espressione del piccolo teorema di Fermat mediante fattorizzazione progressiva della differenza di quadrati:
Reiterando la scomposizione per volte, otteniamo la seguente espressione:
Se è un numero primo, affinché il prodotto di questi fattori sia congruo a zero modulo , per la legge di annullamento del prodotto (valida nel campo o dominio d'integrità dei resti modulo un primo) almeno uno di questi fattori deve essere un multiplo di .
Da questo si deduce che, se è primo, per ogni base coprima con deve valere necessariamente almeno una delle seguenti condizioni:
- ;
- per qualche tale che .
Un numero che soddisfa queste condizioni per una determinata base prende il nome di pseudoprimo forte in base .
Testimoni e forti bugiardi
La sequenza delle quadrature calcolate modulo permette di scoprire se è composto.
- Se la sequenza non inizia con e non contiene mai , allora non rispetta le proprietà dei numeri primi. La base che rivela la scomposizione prende il nome di testimone di Miller-Rabin per la non-primalità di .
- Se è composto ma passa comunque il test per una determinata base , la base viene definita falso testimone o forte bugiardo.
Nessun numero composto (nemmeno i temibili numeri di Carmichael) è uno pseudoprimo forte per tutte le basi. L'insieme dei "forti bugiardi" di un numero composto forma un sottogruppo proprio del gruppo moltiplicativo . Per il Teorema di Lagrange, l'ordine di un sottogruppo proprio deve dividere l'ordine del gruppo, il che implica che i bugiardi possono essere al massimo la metà degli elementi totali. In realtà, Rabin ha dimostrato un limite ancora più stringente: i forti bugiardi sono sempre meno di 1/4 delle basi possibili.
L'algoritmo
L'algoritmo consiste nell'isolare la parte dispari di e testare una o più basi casuali eseguendo quadrature successive.
Pseudocodice
Input: n > 3 (un intero dispari da testare), k (numero di iterazioni per aumentare la precisione)
Output: "Composto" oppure "Probabilmente primo"
Scrivi n - 1 come 2^s * d, con d dispari, dividendo progressivamente per 2.
Ciclo per k iterazioni:
Campiona a uniformemente a caso in [2, n - 2]
x = a^d mod n
Se x = 1 oppure x = n - 1:
Passa alla prossima iterazione (il test per questa base è superato, a è un possibile bugiardo)
ciclo_interno_superato = Falso
Ripeti s - 1 volte:
x = x^2 mod n
Se x = n - 1:
ciclo_interno_superato = Vero
Interrompi il ciclo interno
Se ciclo_interno_superato = Falso:
Restituisci "Composto" (a è un testimone)
Restituisci "Probabilmente primo"
Si nota che l'algoritmo non fa uso di grandi numeri in memoria; ogni valore viene calcolato sfruttando l'elevamento a potenza modulare, mantenendo i risultati sempre minori di .
Complessità e affidabilità
Il test di Miller-Rabin è estremamente efficiente. Se è il numero da testare, rappresentabile con bit, le operazioni di elevamento a potenza modulare e quadratura richiedono un tempo pari a usando moltiplicazioni standard.
Probabilità di errore
A differenza del test di Fermat, il test di Miller-Rabin non soffre del problema dei numeri di Carmichael. Per qualsiasi numero dispari composto , la probabilità che esso passi il test per una singola base casuale è minore o uguale a .
Ripetendo il test per basi generate in modo indipendente, la probabilità che un numero composto venga erroneamente classificato come "probabilmente primo" è limitata da:
Tale probabilità decresce in modo esponenziale, permettendo di raggiungere una certezza virtuale (es. errore con ) in pochissimi millisecondi di calcolo.
Versione deterministica
Se l'ipotesi di Riemann generalizzata (GRH) risultasse vera, sarebbe possibile convertire il test di Miller-Rabin da un test probabilistico a un test deterministico rigoroso. Secondo la GRH, per dimostrare la primalità o composizione di , sarebbe sufficiente controllare tutte le basi tali che:
In questo caso, nessun numero composto potrebbe sfuggeire a tutti i testimoni in quell'intervallo. L'algoritmo risulterebbe eseguibile in tempo strettamente polinomiale, come dimostrato originariamente da Gary Miller nel 1976.[1]
Test con piccoli insiemi di basi
Nel caso della programmazione pratica, se rientra nei tipici interi a 32 o 64 bit dei linguaggi di programmazione, non è necessario usare basi casuali. Un insieme preselezionato di poche basi piccole garantisce l'identificazione di tutti i numeri composti fino a un massimo precalcolato:
- Se (circa , tutti i numeri a 32 bit), è sufficiente testare e .
- Se (circa ), è sufficiente testare i primi 13 numeri primi da 2 a 41.
Note
Voci correlate
Altri progetti
Wikibooks contiene testi o manuali sul Test di Miller-Rabin
Collegamenti esterni
- (EN) Miller-Rabin test, su Enciclopedia Britannica, Encyclopædia Britannica, Inc.
- (EN) Eric W. Weisstein, Rabin-Miller Strong Pseudoprime Test, su MathWorld, Wolfram Research.