# Certificado de primalidad

En matemáticas y ciencias de la computación, un certificado de primalidad, prueba de primalidad o certeza de primalidad es una prueba formal y sucinta de que un número es primo. Los certificados de primalidad permiten verificar rápidamente la primalidad de un número sin tener que ejecutar un test de primalidad costoso o poco fiable. "Sucinta" generalmente significa que la prueba debe ser como máximo polinómica, con una cantidad de dígitos no desmesuradamente mayor que 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 demostraciones de que problemas como los tests de primalidad y los complementos de factorización de enteros se encuentran en la categoría NP, la clase de problemas verificables en tiempo polinomial dada una solución. Estos problemas ya se encuentran trivialmente en la categoría 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 que es falso; de hecho, fue la primera demostración de un problema en NP intersección con co-NP que, en ese momento, no se sabía que estaba en P.
Producir certificados para el problema del complemento, para establecer que un número es compuesto, es sencillo: basta con dar un divisor no trivial. Las pruebas estándar de primalidad probabilística como el test de primalidad Baillie-PSW, el test de primalidad de Fermat y el test 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 primas.

## Certificados Pratt

El concepto de certificados de primalidad fue introducido históricamente por el certificado Pratt, concebido en 1975 por Vaughan Pratt, quien describió su estructura y demostró que tenía tamaño polinomial y que era verificable en tiempo polinomial. Se basa en el test de Lucas, que es esencialmente la conversión del pequeño teorema de Fermat con una condición adicional para que sea cierto:
    Teorema de Lucas': Supóngase que se tiene un entero a tal que:
   * a$^{n−1}$ ≡ 1 (modificación n),
   * para todo factor primo q de n − 1, no se da el caso de que a$^{(n−1)/q}$ ≡ 1 (mod n).
    Entonces n es primo.
Dado tal a (llamado testigo) y la descomposición en factores primos de n−1, es simple verificar rápidamente las condiciones anteriores: solo se necesita hacer un número lineal de exponenciaciones modulares, ya que cada número entero tiene menos factores primos que bits, y cada uno de estos puede hacerse mediante exponenciación binaria en O(log n) multiplicaciones (véase cota superior asintótica). Incluso con la multiplicación de enteros de la escuela primaria, esto solo supone un tiempo proporcional a O((log n)$^4$); usando el algoritmo de multiplicación con el tiempo de ejecución asintótico más conocido, el algoritmo de Schönhage-Strassen, puede reducirse a O((log n)$^3$(log log n)(log log log n)), o usando la notación soft-O Õ((log n)$^3$).
Sin embargo, es posible engañar a un criterio verificador para que acepte un número compuesto dándole una "factorización prima" de n−1 que incluya números compuestos. Por ejemplo, supóngase que se afirma que n=85 es primo, proporcionando a=4 y n−1=6×14 como su factorización prima. Entonces (usando q=6 y q=14):
* 4 es coprimo de 85,
* 4$^{85−1}$ ≡ 1 (módulo 85),
* 4$^{(85−1)/6}$ ≡ 16 (módulo 85), 4$^{(85−1)/14}$ ≡ 16 (módulo 85).
Se concluiría falsamente que 85 es primo. No se desea simplemente obligar al verificador a factorizar el número, por lo que una mejor manera de evitar este problema es otorgar certificados de primalidad para cada uno de los factores primos de n−1 también, que son solo instancias más pequeñas del problema original. Entonces, se continúa recursivamente de esta manera hasta llegar a un número primo, como 2. Finalmente, se obtiene un árbol de números primos, cada uno asociado con un testigo a. Por ejemplo, a continuación se incluye un certificado completo de Pratt para el número 229:
* 229 (a=6, 229−1 = 2$^2$×3×19),
** 2 (primo conocido),
** 3 (a=2, 3−1 = 2),
*** 2 (primo conocido),
** 19 (a=2, 19−1 = 2×3$^2$),
*** 2 (primo conocido),
*** 3 (a=2, 3−1 = 2),
**** 2 (primo conocido).
Se puede demostrar que este árbol de prueba contiene como máximo $4\log _{2}n-4$ 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, tómese p > 3 y 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 $4\log _{2}p_{i}-4$ valores, por lo que todo el árbol contiene como máximo
    $1+\sum _{i=1}^{k}(4\log _{2}p_{i}-4)=-4k+4\log _{2}p_{1}\cdots p_{k}\leq 4\log _{2}p-4,$
ya 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 verificar (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$), que es bastante factible para números en el rango en el que los teóricos de números computacionales suelen trabajar.
Sin embargo, aunque en teoría es útil y fácil de verificar, generar un certificado de Pratt para n requiere factorizar n−1 y otros números potencialmente grandes. Esto es simple para algunos números especiales como los números de Fermat, pero actualmente es mucho más difícil que una simple prueba de primalidad para números primos grandes de forma general.

## Certificados de Atkin-Goldwasser-Kilian-Morain

Para abordar el problema de la generación eficiente de certificados para números más grandes, en 1986 Shafrira Goldwasser y Joe Kilian describieron un nuevo tipo de certificado basado en la teoría de las curvas elípticas. A su vez, fue utilizado por A. O. L. Atkin y François Morain como base para los certificados Atkin-Goldwasser-Kilian-Morain, que son el tipo de certificados generados y verificados por los sistemas prueba de primalidad de curva elíptica. Así como los certificados de Pratt se basan en el teorema de Lucas, los certificados de Atkin-Goldwasser-Kilian-Morain se basan en el siguiente teorema de Goldwasser y Kilian (lema 2 de "Casi todos los números primos se pueden certificar rápidamente"):
    Teorema: Supóngase que se reciben:
   * Un entero positivo n no divisible por 2 o 3;
   * M$_x$, M$_y$, A, B en $\mathbb {Z} _{n}$ (los enteros mod n) que satisfacen M$_y$$^2$ = M$_x$$^3$ + AM$_x$ + B y con 4A$^3$ + 27B$^2$ coprimos a n;
   * Un primo $q>n^{1/2}+1+2n^{1/4}$.
    Entonces M= (M$_x$, M$_y$) es un punto de no identidad en la curva elíptica y$^2$= x$^3$ + Ax + B. Sea kM M sumado a sí mismo k veces usando la suma de curvas elípticas estándar. Entonces, si qM es el elemento de identidad I, se verifica que n es primo.
Técnicamente, una curva elíptica solo se puede construir sobre un cuerpo, y $\mathbb {Z} _{n}$ solo es un cuerpo si n es primo, por lo que parece que se asume el resultado que se está tratando de probar. La dificultad surge en el algoritmo de suma de curvas elípticas, que toma inversas en el campo que pueden no existir en $\mathbb {Z} _{n}$. Sin embargo, se puede demostrar (lema 1 de "Casi todos los números primos se pueden certificar rápidamente") que si simplemente se realizan cálculos como si la curva estuviera bien definida y en ningún momento se intenta invertir un elemento sin inverso, el resultado sigue siendo válido; si aparece un elemento sin inverso, entonces esto significa que n es compuesto.
Para deducir un certificado de este teorema, primero se codifican M$_x$, M$_y$, A, B y q, luego se codifica recursivamente la prueba de primalidad para q < n, continuando hasta llegar a un primo conocido. Este certificado tiene tamaño O((log n)$^2$) y se puede verificar en tiempo O((log n)$^4$). Además, se puede demostrar que el algoritmo que genera estos certificados es el tiempo polinomial esperado para todos menos una pequeña fracción de números primos, y esta fracción disminuye exponencialmente con el tamaño de los números primos. En consecuencia, es adecuado para generar grandes números primos aleatorios certificados, un uso que es importante en las aplicaciones de criptografía, como la generación de claves RSA comprobablemente válidas.

## Certificados basados en el teorema de Pocklington

La generación de primos demostrables basada en variantes del teorema de Pocklington (véase test de Pocklington-Lehmer) permite obtener técnicas eficientes para generar primos (el costo es generalmente menor que la generación probabilística) con el beneficio adicional de certificados de primalidad integrados. Si bien estos pueden parecer primos especiales, debe tenerse en cuenta que cada número primo podría generarse con un algoritmo de generación demostrable basado en el teorema de Pocklington.

### Pruebas de primalidad de Pocklington

Sea $P=Rh+1$ donde $R=\prod q_{j}^{e_{j}}$ y $q_{j}$ son primos distintos, con $e_{j}$ un entero mayor que cero y un testigo $g$ tal que:
| 1. $g^{Rh}\equiv 1{\bmod {P}}$ | (1) |
| 2. $\gcd((g^{Rh/q_{j}}-1{\bmod {P}}),P)=1$ for all $q_{j}$. | (2) |
Entonces P es primo si se cumple una de las siguientes condiciones:
| a) (véase) $R\geq h$ o equivalentemente $R>P^{1/2}$ | (a) |
| b) (véase$^{:Corolario1}$) $R\geq h^{1/2}$ o equivalentemente $R>P^{1/3}$ y con ${\begin{array}{lr}a\equiv h{\bmod {R}}&0\leq a<R\\b=(h-a)/R\end{array}}$, tal que $(a-4b)\neq 0$ y existe un primo pequeño $r>2$ tal que $(a-4b)^{r/2}\neq 1{\bmod {r}}$. | (b) |

### Certificado de primalidad de Pocklington

Un certificado de primalidad de Pocklington consta del primo P, un conjunto de primos $q_{j}$ que dividen a $(P-1)$, cada uno con su propio certificado de primalidad de Pocklington o lo suficientemente pequeño como para ser un primo conocido, y un testigo $g$.
Los bits necesarios para este certificado (y el orden del costo computacional) deben variar desde aproximadamente $\log _{2}{P}\left(1+\sum _{k=1}^{\infty }{\frac {1}{3^{k}}}\right)=1.5\log _{2}{P}$ para la versión (b) hasta $\log _{2}{P}\left(1+\sum _{k=1}^{\infty }{\frac {1}{2^{k}}}\right)=2\log _{2}{P}$ para la versión (a).

### Ejemplo sencillo

Sea $P=1056893$. Téngase en cuenta que $(P-1)=1621\cdot 163\cdot 2^{2}$ y que $P^{1/2}=1028.053\ldots$, $P^{1/3}=101.86156\ldots$.
* Usando el 'testigo' 2, se cumple la ecuación 1 y la ecuación 2 usando $q=163$ y $q=1621$.
* Para la versión a, el certificado necesita solo $P=1056893,\ q=1621,\ g=2$.
* Para la versión b, el certificado solo necesita $P=1056893,\ q=163,\ g=2$, pero hay un poco más de trabajo por hacer:
** $h=(1056893-1)/163=6484$
** $a\equiv h\equiv 127{\bmod {163}}$ y $b=\left(6484-127\right)/163=39$
** El uso de $r=3$ falla: $\left(127^{2}-4\cdot 39\right)^{(3-1)/2}\equiv (1^{2}-0)^{1}\equiv 1{\bmod {3}}$
** El uso de $r=5$ tiene éxito: $\left(127^{2}-4\cdot 39\right)^{(5-1)/2}\equiv (2^{2}-1)^{2}\equiv 2{\bmod {5}}$ y $P$ es primo.

## Impacto de "PRIMES is in P"

"PRIMES is in P" 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 polinomial. Los autores recibieron el Premio Gödel de 2006 y el Premio Fulkerson de 2006 por este trabajo.
Debido a que la prueba de primalidad ahora se puede realizar de manera determinista en tiempo polinomial utilizando el test de primalidad AKS, un número primo en sí mismo podría considerarse un certificado de su propia primalidad. Esta prueba se ejecuta en tiempo Õ((log n)$^6$). En la práctica, este método de verificación es más costoso que la verificación de los certificados Pratt, pero no requiere ningún cálculo para determinar el certificado en sí mismo.