El caso de uso estándar de BigInteger.isProbablePrime(int)
es la criptografía. Específicamente, ciertos algoritmos criptográficos, como RSA , requieren números primos grandes elegidos al azar. Sin embargo, es importante destacar que estos algoritmos realmente no requieren que se garantice que estos números sean primos, solo necesitan ser primos con una probabilidad muy alta.
¿Qué tan alto es muy alto? Bueno, en una aplicación criptográfica, uno normalmente llamaría .isProbablePrime()
con un argumento entre 128 y 256. Por lo tanto, la probabilidad de que un número no primo pase tal prueba es menor que uno en 2 128 o 2 256 .
Pongamos eso en perspectiva: si tuviera 10 mil millones de computadoras, cada una de las cuales genera 10 mil millones de números primos probables por segundo (lo que significaría menos de un ciclo de reloj por número en cualquier CPU moderna), y la primacía de esos números se probara con .isProbablePrime(128)
, usted esperaría, en promedio, que un número no primo se deslice una vez cada 100 mil millones de años .
Es decir, que sería el caso, si esos 10 mil millones de computadoras de alguna manera podría todos corren para cientos de miles de años sin experimentar ningún fallos de hardware. En la práctica, sin embargo, es mucho más probable que un rayo cósmico aleatorio golpee su computadora en el momento y lugar adecuados para cambiar el valor de retorno de .isProbablePrime(128)
falso a verdadero, sin causar ningún otro efecto detectable, que para un no. -número primo para pasar la prueba de primalidad probabilística en ese nivel de certeza.
Por supuesto, el mismo riesgo de rayos cósmicos aleatorios y otras fallas de hardware también se aplica a las pruebas de primalidad deterministas como AKS . Por lo tanto, en la práctica, incluso estas pruebas tienen una tasa de falsos positivos (muy pequeña) de referencia debido a fallas de hardware aleatorias (sin mencionar todas las otras posibles fuentes de errores, como errores de implementación).
Dado que es fácil llevar la tasa intrínseca de falsos positivos de la prueba de primaria de Miller-Rabin utilizada .isProbablePrime()
muy por debajo de esta tasa de referencia, simplemente repitiendo la prueba suficientes veces, y dado que, incluso repetida tantas veces, la prueba de Miller-Rabin sigue siendo Mucho más rápido en la práctica que las pruebas de primalidad deterministas más conocidas como AKS, sigue siendo la prueba de primalidad estándar para aplicaciones criptográficas.
(Además, incluso si seleccionara accidentalmente un pseudoprime fuerte como uno de los factores de su módulo RSA, generalmente no conduciría a una falla catastrófica. Por lo general, tales pseudoprimes serían productos de dos (o raramente más) primos de aproximadamente la mitad de la longitud, lo que significa que terminaría con una clave RSA de primos múltiples . Siempre que ninguno de los factores fuera demasiado pequeño (y si lo fueran, la prueba de primalidad debería haberlos detectado), el algoritmo RSA aún funciona bien, y la clave, aunque algo más débil contra ciertos tipos de ataques que las claves RSA normales de la misma longitud, debería ser razonablemente segura si no escatimó innecesariamente en la longitud de la clave).