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".
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:
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:
Un numero che soddisfa queste condizioni per una determinata base prende il nome di pseudoprimo forte in base .
La sequenza delle quadrature calcolate modulo permette di scoprire se è composto.
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 consiste nell'isolare la parte dispari di e testare una o più basi casuali eseguendo quadrature successive.
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 .
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.
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.
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.
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: