Vai al contenuto

Test di Miller-Rabin

Da Wikipedia, l'enciclopedia libera.

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:

  1. Per il piccolo teorema di Fermat, per ogni intero non divisibile per si ha: .
  2. 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 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 .

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.
  1. (EN) Gary Miller, Riemann's Hypothesis and Tests for Primality, in J. Comput. System Sci., vol. 13, n. 3, 1976, pp. 300-317. (PDF)

Voci correlate

[modifica | modifica wikitesto]

Altri progetti

[modifica | modifica wikitesto]

Collegamenti esterni

[modifica | modifica wikitesto]
  Portale Matematica: accedi alle voci di Wikipedia che trattano di matematica