Il caso d'uso standard per BigInteger.isProbablePrime(int)
è in crittografia. In particolare, alcuni algoritmi crittografici, come RSA , richiedono grandi numeri primi scelti a caso. È importante sottolineare che, tuttavia, questi algoritmi non richiedono che questi numeri siano garantiti come primi: devono solo essere primi con una probabilità molto alta.
Quanto è alto molto alto? Bene, in un'applicazione crittografica, si chiamerebbe tipicamente .isProbablePrime()
con un argomento da qualche parte tra 128 e 256. Pertanto, la probabilità che un numero non primo superi tale test è inferiore a uno su 2 128 o 2 256 .
Mettiamolo in prospettiva: se avessi 10 miliardi di computer, ciascuno che genera 10 miliardi di probabili numeri primi al secondo (che significherebbe meno di un ciclo di clock per numero su qualsiasi CPU moderna), e la primalità di quei numeri è stata testata con .isProbablePrime(128)
te si aspetterebbe, in media, che un numero non primo si inserisca una volta ogni 100 miliardi di anni .
Cioè, sarebbe il caso se quei 10 miliardi di computer potessero in qualche modo funzionare tutti per centinaia di miliardi di anni senza subire alcun guasto hardware. In pratica, tuttavia, è molto più probabile che un raggio cosmico casuale colpisca il tuo computer proprio nel momento e nel luogo giusto per invertire il valore di ritorno.isProbablePrime(128)
da falso a vero, senza causare altri effetti rilevabili, rispetto a un non -prime numero per superare effettivamente il test probabilistico di primalità a quel livello di certezza.
Naturalmente, lo stesso rischio di raggi cosmici casuali e altri guasti hardware si applica anche ai test di primalità deterministici come AKS . Pertanto, in pratica, anche questi test hanno un (molto piccolo) tasso di falsi positivi di base a causa di guasti hardware casuali (per non parlare di tutte le altre possibili fonti di errore, come i bug di implementazione).
Poiché è facile spingere il tasso intrinseco di falsi positivi del test di primalità di Miller-Rabin utilizzato di .isProbablePrime()
gran lunga al di sotto di questo tasso di riferimento, semplicemente ripetendo il test un numero sufficiente di volte e poiché, anche ripetuto così tante volte, il test di Miller-Rabin è ancora molto più veloce nella pratica dei più noti test di primalità deterministica come AKS, rimane il test di primalità standard per le applicazioni crittografiche.
(Inoltre, anche se ti capitasse di selezionare accidentalmente uno pseudoprime forte come uno dei fattori del tuo modulo RSA, generalmente non porterebbe a un fallimento catastrofico. Tipicamente, tali pseudoprimi sarebbero prodotti di due (o raramente più) numeri primi di circa metà della lunghezza, il che significa che ti ritroveresti con una chiave RSA multi-prime . Finché nessuno dei fattori era troppo piccolo (e se lo fossero, il test di primalità avrebbe dovuto rilevarli), l'algoritmo RSA lo farà funziona ancora bene e la chiave, sebbene un po 'più debole contro alcuni tipi di attacchi rispetto alle normali chiavi RSA della stessa lunghezza, dovrebbe comunque essere ragionevolmente sicura se non si risparmia inutilmente sulla lunghezza della chiave.)