En matemáticas e informática , un certificado de primalidad o prueba de primalidad es una prueba formal y sucinta de que un número es primo. Los certificados de primalidad permiten comprobar rápidamente la primalidad de un número sin tener que realizar una prueba de primalidad costosa o poco fiable . "Sucinta" suele significar que la prueba debe ser, como máximo, polinómicamente mayor que el número de dígitos del número en sí (por ejemplo, si el número tiene b bits, la prueba puede contener aproximadamente b 2 bits).
Los certificados de primalidad conducen directamente a pruebas de que problemas como las pruebas de primalidad y el complemento de la factorización de enteros se encuentran en NP , la clase de problemas verificables en tiempo polinomial dada una solución. Estos problemas ya se encuentran trivialmente en co-NP . Esta fue la primera evidencia sólida de que estos problemas no son NP-completos , ya que si lo fueran, implicaría que NP es un subconjunto de co-NP, un resultado que se cree ampliamente que es falso; de hecho, esta fue la primera demostración de un problema en NP intersect co-NP que no se sabía, en ese momento, que estuviera en P.
La obtención de certificados para el problema del complemento, a fin de establecer que un número es compuesto, es sencilla: basta con dar un divisor no trivial. Las pruebas de primalidad probabilísticas estándar, como la prueba de primalidad de Baillie-PSW , la prueba de primalidad de Fermat y la prueba de primalidad de Miller-Rabin , también producen certificados de composición en el caso de que la entrada sea compuesta, pero no producen certificados para entradas primos.
El concepto de certificados de primalidad fue introducido históricamente por el certificado Pratt , concebido en 1975 por Vaughan Pratt , [1] quien describió su estructura y demostró que tiene un tamaño polinómico y que es verificable en tiempo polinómico. Se basa en la prueba de primalidad de Lucas , que es esencialmente el inverso del pequeño teorema de Fermat con una condición añadida para que sea verdadero:
Dado un a (llamado testigo ) y la factorización prima de n − 1, es sencillo verificar rápidamente las condiciones anteriores: solo necesitamos hacer un número lineal de exponenciaciones modulares, ya que cada entero tiene menos factores primos que bits, y cada una de estas se puede hacer por exponenciación elevando al cuadrado en multiplicaciones de O(log n ) (ver notación O grande ). Incluso con la multiplicación de enteros de primaria, esto es solo O((log n ) 4 ) tiempo; usando el algoritmo de multiplicación con el tiempo de ejecución asintótico más conocido, debido a David Harvey y Joris van der Hoeven, podemos reducirlo a O((log n ) 3 (log log n )) tiempo, o usando la notación O suave Õ((log n ) 3 ).
Sin embargo, es posible engañar a un verificador para que acepte un número compuesto dándole una "factorización prima" de n − 1 que incluya números compuestos. Por ejemplo, supongamos que afirmamos que n = 85 es primo, proporcionando a = 4 y n − 1 = 6 × 14 como la "factorización prima". Entonces (usando q = 6 y q = 14):
Concluiríamos erróneamente que 85 es primo. No queremos simplemente obligar al verificador a factorizar el número, por lo que una mejor manera de evitar este problema es dar certificados de primalidad también para cada uno de los factores primos de n − 1, que son simplemente instancias más pequeñas del problema original. Continuamos recursivamente de esta manera hasta que llegamos a un número que sabemos que es primo, como 2. Terminamos con un árbol de números primos, cada uno asociado con un testigo a . Por ejemplo, aquí hay un certificado Pratt completo para el número 229:
Se puede demostrar que este árbol de prueba contiene como máximo valores distintos de 2 mediante una prueba inductiva simple (basada en el teorema 2 de Pratt). El resultado es válido para 3; en general, tomemos p > 3 y dejemos que sus hijos en el árbol sean p 1 , ..., p k . Por la hipótesis inductiva, el árbol con raíz en p i contiene como máximo valores, por lo que el árbol entero contiene como máximo
dado que k ≥ 2, y p 1 ... p k = p − 1. Dado que cada valor tiene como máximo log n bits, esto también demuestra que el certificado tiene un tamaño de O((log n ) 2 ) bits.
Dado que hay O(log n ) valores distintos de 2, y cada uno requiere como máximo una exponenciación para verificarse (y las exponenciaciones dominan el tiempo de ejecución), el tiempo total es O((log n ) 3 (log log n )(log log log n )), o Õ((log n ) 3 ), lo cual es bastante factible para números en el rango con el que los teóricos de números computacionales suelen trabajar.
Sin embargo, si bien es útil en teoría y fácil de verificar, generar un certificado Pratt para n requiere factorizar n − 1 y otros números potencialmente grandes. Esto es simple para algunos números especiales como los primos de Fermat , pero actualmente mucho más difícil que la simple prueba de primalidad para primos grandes de forma general.
Para abordar el problema de la generación eficiente de certificados para números mayores, en 1986 Shafi Goldwasser y Joe Kilian describieron un nuevo tipo de certificado basado en la teoría de curvas elípticas . [2] Esto fue a su vez utilizado por AOL Atkin y François Morain como base para los certificados Atkin-Goldwasser-Kilian-Morain, que son el tipo de certificados generados y verificados por sistemas de prueba de primalidad de curva elíptica . [3] Así como los certificados Pratt se basan en el teorema de Lucas, los certificados Atkin–Goldwasser–Kilian–Morain se basan en el siguiente teorema de Goldwasser y Kilian (lema 2 de "Casi todos los números primos pueden certificarse rápidamente"):
Técnicamente, una curva elíptica sólo puede construirse sobre un cuerpo, y sólo es un cuerpo si n es primo, por lo que parece que estamos asumiendo el resultado que estamos tratando de demostrar. La dificultad surge en el algoritmo de adición de curvas elípticas, que toma inversas en el cuerpo que pueden no existir en . Sin embargo, se puede demostrar (lema 1 de "Casi todos los primos pueden certificarse rápidamente") que si simplemente realizamos cálculos como si la curva estuviera bien definida y en ningún momento intentamos invertir un elemento sin inversa, el resultado sigue siendo válido; si encontramos un elemento sin inversa, esto establece que n es compuesto.
Para obtener un certificado a partir de este teorema, primero codificamos M x , M y , A, B y q , luego codificamos recursivamente la prueba de primalidad para q < n , continuando hasta que llegamos a un primo conocido. Este certificado tiene un tamaño de O((log n ) 2 ) y se puede verificar en un tiempo de O((log n ) 4 ). Además, se puede demostrar que el algoritmo que genera estos certificados es un tiempo polinomial esperado para todos los primos, excepto una pequeña fracción, y esta fracción disminuye exponencialmente con el tamaño de los primos. En consecuencia, es muy adecuado para generar primos aleatorios grandes certificados, una aplicación que es importante en aplicaciones de criptografía, como la generación de claves RSA demostrablemente válidas .
La generación de primos demostrables basada en variantes del teorema de Pocklington (ver prueba de primalidad de Pocklington ) [4] puede ser una técnica eficiente para generar primos (el costo es generalmente menor que la generación probabilística) con el beneficio adicional de contar con certificados de primalidad incorporados. Si bien estos pueden parecer primos especiales, observe que cada entero primo podría generarse con un algoritmo de generación de primos demostrables basado en Pocklington.
Sean donde donde son primos distintos con un entero mayor que cero y un testigo tales que:
Entonces P es primo si se cumple una de las siguientes condiciones:
Un certificado de primalidad de Pocklington consta del primo P, un conjunto de primos que dividen a , cada uno con su propio certificado de primo de Pocklington o lo suficientemente pequeño como para ser un primo conocido, y un testigo .
Los bits necesarios para este certificado (y el orden del costo computacional) deben oscilar aproximadamente entre para la versión ( b ) y para la versión ( a ).
Sea . Nótese que y , .
"PRIMES is in P" [7] fue un gran avance en la informática teórica. Este artículo, publicado por Manindra Agrawal , Nitin Saxena y Neeraj Kayal en agosto de 2002, demuestra que el famoso problema de comprobar la primalidad de un número se puede resolver de forma determinista en tiempo polinómico. Los autores recibieron el Premio Gödel 2006 y el Premio Fulkerson 2006 por este trabajo.
Dado que ahora es posible realizar pruebas de primalidad de manera determinista en tiempo polinomial mediante la prueba de primalidad AKS , un número primo podría considerarse en sí mismo un certificado de su propia primalidad. Esta prueba se ejecuta en un tiempo de Õ((log n ) 6 ). En la práctica, este método de verificación es más costoso que la verificación de certificados Pratt, pero no requiere ningún cálculo para determinar el certificado en sí.