Qual è un possibile caso d'uso di .isProbablePrime () di BigInteger?


84

Il metodoBigInteger.isProbablePrime() è piuttosto strano; dalla documentazione, questo dirà se un numero è primo con una probabilità di 1 - 1 / 2^arg, dove argè l'argomento intero.

È presente nel JDK da molto tempo, quindi significa che deve avere usi. La mia conoscenza limitata in informatica e algoritmi (e matematica) mi dice che non ha davvero senso sapere se un numero è "probabilmente" un primo ma non esattamente un primo.

Allora, qual è un possibile scenario in cui si vorrebbe utilizzare questo metodo? Crittografia?



6
Inoltre, test di primalità di Miller-Rabin . Il vantaggio principale è la velocità . Ad esempio, quando si desidera verificare i fattori, è possibile eseguire un test di questo tipo per accelerare il processo di factoring. Puoi mantenere la parte "probabilmente" piuttosto bassa, ed è utile in pratica. Ma sono d'accordo sul fatto che sia un po 'traballante e strano, come i galleggianti.
keyser

2
@ maxx777 è un dato di fatto - chiedo un caso d'uso effettivo
fge

4
Vorrei davvero che i downvoters spiegassero le ragioni alla base dei downvote, per favore
fge

17
"È presente nel JDK da molto tempo, quindi significa che deve avere usi." - oppure è stato aggiunto per un motivo inutile, quindi non rimosso perché non viene mai rimosso nulla.
user253751

Risposte:


67

Sì, questo metodo può essere utilizzato in crittografia. La crittografia RSA implica la ricerca di enormi numeri primi, a volte dell'ordine di 1024 bit (circa 300 cifre). La sicurezza di RSA dipende dal fatto che la scomposizione in fattori di un numero composto da 2 di questi numeri primi moltiplicati insieme è estremamente difficile e richiede tempo. Ma perché funzioni, devono essere prime.

Si scopre che anche provare questi numeri primi è difficile. Ma il test di primalità di Miller-Rabin , uno dei test di primalità utilizzato da isProbablePrime, rileva che un numero è composto o non fornisce alcuna conclusione. L'esecuzione di questi ntempi di test consente di concludere che esiste una probabilità su 2 n che questo numero sia realmente composto. Eseguendolo 100volte si ottiene il rischio accettabile di 1 su 2 100 che questo numero sia composto.


3
@ Mr.777 Ho visto Rabin-Miller una o due volte ma Miller-Rabin decine di volte. Non sono sicuro che esista un nome ufficiale.
keyser

3
@ Mr.777 La pagina di Wikipedia che ho collegato sopra afferma prima "Miller-Rabin", ma riconosce entrambi i nomi: "Il test di primalità di Miller-Rabin o il test di primalità di Rabin-Miller".
rgettman

5
L'implementazione di isProbablyPrimeè (per quanto ne so) completamente deterministica. In che modo l'esecuzione dei ntempi del test migliorerebbe le probabilità di un risultato corretto? (Anche se fosse un elemento di casualità, sarebbe necessario che la casualità di più chiamate sia indipendente per influenzare il rischio nel modo in cui descrivi.)
Ted Hopp

11
@TedHopp L'implementazione utilizza un generatore casuale e ogni round con un nuovo numero casuale dà una possibilità di 3/4 di rilevare un composto. Il generatore predefinito è SecureRandom, con forti garanzie di casualità.
quell'altro ragazzo l'

4
Può essere difficile, tuttavia ricorda che PRIMES è in P. Il test AKS può essere più lento di Miller-Rabin ma non c'è una differenza esponenziale o un polinomio tra di loro. Puoi usare Miller-Rabin per trovare un mucchio di numeri primi probabili e usare AKS per dimostrare definitivamente che sono numeri primi.
Bakuriu

20

Se il test ti dice che un numero intero non è primo , puoi certamente crederlo al 100%.

È solo l'altro lato della domanda, se il test ti dice che un numero intero è "un numero primo probabile", che potresti nutrire dubbi. La ripetizione del test con "basi" variabili consente di ridurre la probabilità di riuscire falsamente a "imitare" un numero primo (essendo uno pseudo primo forte rispetto a basi multiple) a piacere.

L'utilità del test sta nella sua velocità e semplicità. Non si sarebbe necessariamente soddisfatti dello stato di "numero primo probabile" come risposta finale, ma si eviterebbe sicuramente di perdere tempo su quasi tutti i numeri compositi utilizzando questa routine prima di introdurre i grandi cannoni della verifica della primalità .

Il confronto con la difficoltà di factoring degli interi è una sorta di falsa pista. È noto che la primalità di un intero può essere determinata in tempo polinomiale, e in effetti c'è una prova che un'estensione del test di Miller-Rabin a un numero sufficiente di basi è definitiva (nella rilevazione dei numeri primi, in opposizione ai probabili numeri primi), ma questo presuppone l'ipotesi di Riemann generalizzata, quindi non è così certa come il (più costoso) test di primalità AKS .


4
Vale la pena notare che AKS è stato scoperto solo nell'agosto 2002, mentre questo metodo è stato in JDK dal febbraio 2002
James_pic

3
No, aspetta, questo è stato nel JDK dal febbraio 1997 (stavo guardando il probablePrimemetodo, non il isProbablePrimemetodo)
James_pic

1
In effetti, il titolo dell'articolo del 2002 di Agrawal, Kayal e Saxena "PRIMES is in P" segnala la prima dimostrazione incondizionata della complessità polinomiale (in bit di n ) per test di primalità deterministica (numero intero generale). Miller (1975) aveva dimostrato che, assumendo GRH , la primalità di un intero può essere verificata deterministicamente in passi proporzionali alla quarta potenza della lunghezza del bit, un esponente molto migliore di quello attualmente noto per AKS o sue varianti.
hardmath

Sebbene AKS sia asintoticamente più veloce, metodi come ECPP sarebbero molto più efficienti per i numeri primi "crittografici" o "industriali".
Brett Hale

2
AKS è follemente lento e non sarà più veloce di APR-CL per qualsiasi numero calcolabile in scala geologica, molto meno a scala umana. APR-CL ed ECPP esistevano già nel 1997. Come afferma Brett, ECPP è una buona scelta se vogliamo una prova. Tutti questi sono lenti rispetto ai probabili metodi principali (es. MR, BPSW, Frobenius).
DanaJ

19

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.)


Il problema di errore è uno dei motivi per cui AKS non viene effettivamente utilizzato (la velocità sorprendentemente bassa è l'altra) e ECPP è più comune. Come noti, gli errori di implementazione negli algoritmi sono del tutto possibili, quindi è utile avere un certificato verificato con codice indipendente.
DanaJ

8

Un possibile caso d'uso è testare la primalità di un dato numero (al test che di per sé ha molti usi). L' isProbablePrimealgoritmo verrà eseguito molto più velocemente di un algoritmo esatto, quindi se il numero fallisce isProbablePrime, non è necessario andare a scapito dell'esecuzione dell'algoritmo più costoso.


Quindi, è per motivi di praticità allora? E per il fatto che la scomposizione in fattori primi è un problema NP?
fge

@fge - Sì, il caso d'uso che ho proposto è per praticità. Non so se questo aiuti con la scomposizione in fattori primi, che è un problema significativamente più difficile del testare la primalità. Per quest'ultimo, esiste un algoritmo tempo-polinomiale: il test di primalità AKS .
Ted Hopp

5
@ fge: La fattorizzazione è effettivamente in NP, ma sospetto che intendessi "NP-completo", che non è nota essere la fattorizzazione . Al contrario, si sospetta fortemente che non sia NP-hard.
hmakholm ha lasciato Monica l'

6

Trovare probabili numeri primi è un problema importante in crittografia. Si scopre che una strategia ragionevole per trovare un probabile numero di k-bit primo consiste nel selezionare ripetutamente un numero casuale di k-bit e testarlo per una probabile primalità usando un metodo come isProbablePrime().

Per ulteriori discussioni, vedere la sezione 4.4.1 del Manuale di crittografia applicata .

Vedi anche Sulla generazione di numeri primi probabili mediante ricerca incrementale di Brandt e Damgård.


5

Algoritmi come la generazione di chiavi RSA si basano sulla capacità di determinare se un numero è primo o meno.

Tuttavia, al momento in cui il isProbablePrimemetodo è stato aggiunto al JDK (febbraio 1997), non esisteva un modo comprovato per decidere in modo deterministico se un numero fosse primo in un ragionevole lasso di tempo. L'approccio più noto a quel tempo era l' algoritmo Miller-Rabin, un algoritmo probabilistico che a volte dava falsi positivi (cioè, riportava i non primi come numeri primi), ma poteva essere regolato per ridurre la probabilità di falsi positivi, a scapito di modesti aumenti di runtime.

Da allora, sono stati scoperti algoritmi che possono decidere in modo deterministico se un numero è primo ragionevolmente rapidamente, come l' algoritmo AKS scoperto nell'agosto 2002. Tuttavia, va notato che questi algoritmi non sono ancora veloci come Miller-Rabin.

Forse una domanda migliore è perché nessun isPrimemetodo è stato aggiunto al JDK dal 2002.


Grazie per la prospettiva storica! Sembra che @immibis fosse sulla strada giusta con il suo commento su "nel JDK ma mai rimosso", quindi? :)
fge

1
So che notoriamente Java non rimuove mai elementi dalla libreria standard, ma non sono sicuro che lo rimuoverebbero anche se potessero. Per alcune applicazioni, essere sicuri al 99,999999999% di qualcosa è abbastanza buono ed è molto più veloce che essere sicuri al 100%.
James_pic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.