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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]L'algoritmo consiste nell'isolare la parte dispari di e testare una o più basi casuali eseguendo quadrature successive.
Pseudocodice
[modifica | modifica wikitesto]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à
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]Voci correlate
[modifica | modifica wikitesto]Altri progetti
[modifica | modifica wikitesto]
Wikibooks contiene testi o manuali sul Test di Miller-Rabin
Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Miller-Rabin test, su Enciclopedia Britannica, Encyclopædia Britannica, Inc.
- (EN) Eric W. Weisstein, Rabin-Miller Strong Pseudoprime Test, su MathWorld, Wolfram Research.