Test de primalidad por curvas elípticas

procedimiento para comprobar si un número es primo basado en las propiedades de los grupos asociados a las curvas elípticas

En matemáticas, las técnicas de prueba de primalidad mediante curvas elípticas, o tests de primalidad por curvas elípticas (ECPP por las siglas de su nombre en inglés, Elliptic Curve Primality Proving), se encuentran entre los métodos más rápidos y más utilizados en la prueba de primalidad.[1]​ Es una idea propuesta por Shafrira Goldwasser y Joe Kilian en 1986 y convertida en algoritmo por A. O. L. Atkin ese mismo año. El algoritmo fue alterado y mejorado por varios colaboradores posteriormente, y en particular por Atkin y François Morain, en 1993.[2]​ El concepto de usar curvas elípticas en la factorización había sido desarrollado por H. W. Lenstra en 1985, y las implicaciones para su uso en pruebas (y demostraciones) de primalidad siguieron rápidamente.

Los tests de primalidad son un campo que existe desde la época de Pierre de Fermat, en cuyo tiempo la mayoría de los algoritmos se basaban en la factorización, que se vuelve difícil de manejar con números grandes. Los algoritmos modernos tratan los problemas de determinar si un número es primo y cuáles son sus factores por separado, una cuestión que se volvió de importancia práctica con el inicio de la criptografía moderna. Aunque muchas pruebas actuales dan como resultado una salida probabilística (N se muestra como compuesto o como probablemente primo, como con el test de primalidad de Baillie-PSW o el test de primalidad de Miller-Rabin), la prueba de la curva elíptica prueba la primalidad (o composición) con un certificado rápidamente verificable.[3]

Los métodos para demostrar la primalidad de un número conocidos anteriormente, como el test de Pocklington-Lehmer, requerían al menos una factorización parcial de para demostrar que es primo. Como resultado, estos métodos requerían algo de suerte y generalmente son lentos en la práctica.

Primalidad mediante curvas elípticas editar

Es un algoritmo de uso general, lo que significa que no depende de que el número tenga una forma especial. La ECPP es actualmente en la práctica el algoritmo conocido más rápido para probar la primalidad de los números en general, pero no se conoce su tiempo de ejecución en el peor de los casos. Heurísticamente, se ejecuta en el tiempo:

 

para algunos  .[4]​ Este exponente puede reducirse a   para algunas versiones mediante argumentos heurísticos. El algoritmo funciona de la misma manera que la mayoría de los otros tests de primalidad, para lo que encuentra un grupo y muestra que su tamaño es tal que   es primo. Para la ECPP, el grupo es una curva elíptica sobre un conjunto finito de formas cuadráticas, de modo que   es trivial para la factorización sobre el grupo.

Genera un certificado de primalidad de Atkin-Goldwasser-Kilian-Morain por recursión y luego intenta verificar el certificado. El paso que requiere más tiempo de procesamiento es la generación del certificado, porque se debe realizar la factorización sobre un cuerpo de clases. El certificado se puede verificar rápidamente, lo que permite que una verificación de funcionamiento tome muy poco tiempo.

A junio de 2022, el primo más grande que se ha probado con el método ECPP es  .[5]​ La certificación fue realizada por Andreas Enge usando su software fastECPP CM.

Proposición editar

Las pruebas de primalidad por curvas elípticas se basan en criterios análogos al criterio de Pocklington,[6][7]​ donde el grupo   se reemplaza por   y E es una curva elíptica elegida adecuadamente. A continuación se enuncia una proposición sobre la cual basar la prueba, que es análoga al criterio de Pocklington y da lugar a la forma de Goldwasser-Kilian-Atkin de la prueba de primalidad de la curva elíptica:

Sea N un entero positivo y E el conjunto definido por la ecuación   Considérese E sobre   aplíquese una ley de adición usual sobre E y sea 0 para el elemento neutro en E.

Sea m un número entero. Si hay un primo q que divide a m, y es mayor que   y existe un punto P en E tal que

(1) mP= 0
(2) (m/q)P está definido y no es igual a 0

Entonces N es primo.

Prueba editar

Si N es compuesto, entonces existe un primo   que divide a N. Defínase   como la curva elíptica definida por la misma ecuación que E pero evaluada módulo p en lugar de módulo N. Définase también   como el orden del grupo  . Por el teorema sobre curvas elípticas de Hasse se sabe que

 

y por lo tanto   y existe un entero u con la propiedad de que

 

Sea   el punto P evaluado módulo p. Así, en   se tiene que

 

por (1), ya que   se calcula usando el mismo método que mP, excepto módulo p en lugar de módulo N (y  ).

Esto contradice (2), porque si (m/q)P está definido y no es igual a 0 (mod N), entonces con el mismo método se calcula módulo p en lugar de módulo N que producirá:[8]

 

Algoritmo de Goldwasser-Kilian editar

A partir de esta proposición se puede construir un algoritmo para demostrar que un número entero, N, es primo. Esto se hace de la siguiente manera:[6]

Elíjanse tres enteros al azar, a, x, y, estableciendo a continuación

 

Ahora P= (x,y) es un punto sobre E, donde se tiene que E está definido por  . A continuación, se necesita un algoritmo para contar el número de puntos en E. Aplicado a E, este algoritmo (Koblitz y otros sugieren el algoritmo de Schoof) produce un número m que es el número de puntos en la curva E sobre FN, siempre que N es primo. Si el algoritmo de conteo de puntos se detiene en una expresión indefinida, esto permite determinar un factor no trivial de N. Si tiene éxito, se aplica un criterio para decidir si la curva E es aceptable.

Si se puede escribir m en la forma   donde   es un entero pequeño y q un primo probable grande (un número que pasa un test de primalidad probabilístico, por ejemplo), entonces no se descarta E. De lo contrario, se descarta la curva y se selecciona aleatoriamente otra tripleta (a, x, y) para comenzar de nuevo. La idea aquí es encontrar una m que sea divisible por un gran número primo q. Este número primo es unos dígitos más pequeño que m (o N), por lo que q será más fácil de probar como primo que N.

Asumiendo que se halla una curva que satisface el criterio, se procede a calcular mP y kP. Si cualquiera de los dos cálculos produce una expresión indefinida, se puede obtener un factor no trivial de N. Si ambos cálculos tienen éxito, se examinan los resultados.

Si   es claro que N no es primo, porque si N fuera primo entonces E tendría orden m, y cualquier elemento de E se convertiría en 0 en la multiplicación por m. Si kP= 0, entonces el algoritmo descarta E y comienza de nuevo con una tripleta a, x, y diferente.

Ahora bien, si   y  , la proposición anterior indica que N es primo. Sin embargo, existe un posible problema, que es la primalidad de q. Esto se verifica usando el mismo algoritmo. Así que se ha descrito un procedimiento recursivo, donde la primalidad de N depende de la primalidad de q y, de hecho, de primos probables más pequeños hasta que se alcanza un umbral en el que q se considera lo suficientemente pequeño como para aplicarse un algoritmo determinista no recursivo.[9][10]

Problemas con el algoritmo editar

Atkin y Morain afirman que el problema con GK es que el algoritmo de Schoof parece casi imposible de poner en práctica.[3]​ Es muy lento y engorroso contar todos los puntos en E usando el algoritmo de Schoof, que es el algoritmo preferido para el algoritmo de Goldwasser-Kilian. Sin embargo, el algoritmo original de Schoof no es lo suficientemente eficiente para proporcionar una gran cantidad de puntos en poco tiempo.[11]​ Estos comentarios deben situarse en su contexto histórico, antes de las mejoras de Elkies y Atkin al método de Schoof.

Un segundo problema que señala Koblitz es la dificultad de encontrar la curva E cuyo número de puntos es de la forma kq, como se indicó anteriormente. No existe un teorema conocido que garantice que se pueda encontrar una E adecuada en muchos intentos polinómicos. La distribución de números primos en el intervalo de Hasse

 ,

que contiene m, no es la misma que la distribución de primos en los órdenes de grupo, contando curvas con multiplicidad. Sin embargo, esto no es un problema significativo en la práctica.[8]

Prueba de primalidad de la curva elíptica de Atkin-Morain (ECPP) editar

En un artículo de 1993, Atkin y Morain describieron un algoritmo ECPP que evitaba el problema de depender de un engorroso algoritmo de conteo de puntos (como el de Schoof). El algoritmo aún se basa en la proposición mencionada anteriormente, pero en lugar de generar aleatoriamente curvas elípticas y buscar una m adecuada, su idea era construir una curva E en la que el número de puntos sea fácil de calcular. La multiplicación compleja es clave en la construcción de la curva.

Ahora, dada una N para la que se necesita probar la primalidad, se necesita encontrar una m y una q adecuadas, como en la prueba de Goldwasser-Kilian, que cumplirá la proposición y probará la primalidad de N (por supuesto, también se debe encontrar un punto P y la curva misma, E).

La ECPP utiliza multiplicaciones complejas para construir la curva E, haciéndolo de una manera que permite calcular fácilmente m (el número de puntos en E). Ahora se describe este método:

La utilización de la multiplicación compleja requiere un discriminante negativo, D, tal que D se puede escribir como el producto de dos elementos  , o de manera completamente equivalente, se puede escribir la ecuación:

 

para algunos a, b. Si se puede describir N en términos de cualquiera de estas formas, es posible crear una curva elíptica E en   con la multiplicación compleja (descrita en detalle a continuación), y el número de puntos viene dado por:

 

Para que N se divida en los dos elementos, se necesita que   (donde   denota el símbolo de Legendre). Esta es una condición necesaria, y se logra la suficiencia si la clase numérica h(D) del orden en   es 1. Esto sucede solo para 13 valores de D, que son los elementos de {−3, −4, −7, −8, −11, −12, −16, −19, −27, −28, −43, −67, −163}

La prueba editar

Elíjanse los discriminantes D en secuencia de aumento de h(D). Para cada D, compruébese si   y si 4N se pueden escribir como:

 

Esta parte se puede verificar usando el algoritmo de Cornacchia. Una vez que se han hallado D y a aceptables, calcúlese  . Ahora bien, si m tiene un factor primo q de tamaño

 

se debe usar el método de la multiplicación compleja para construir la curva E y un punto P en ella. Entonces se puede usar la proposición para verificar la primalidad de N. Téngase en cuenta que si m no tiene un factor primo grande o no se puede factorizar lo suficientemente rápido, se puede hacer otra elección de D.[1]

Método de multiplicación complejo editar

Para completar la explicación, se va a proporcionar una descripción general de la multiplicación compleja, la forma en que se puede crear una curva elíptica, dada una D (que se puede escribir como un producto de dos elementos).

Supóngase primero que   y   (estos casos son mucho más fáciles de calcular). Es necesario determinar los j-invariantes elípticos de las clases h(D) del orden del discriminante D como números complejos. Hay varias fórmulas para calcularlos.

A continuación, créese el monomio  , cuyas raíces corresponden a los valores h(D). Téngase en cuenta que   es una clase polinómica. A partir de la teoría de la multiplicación compleja, se sabe que   tiene coeficientes enteros, lo que permite estimar estos coeficientes con la precisión suficiente para descubrir sus valores verdaderos.

Ahora, si N es primo, CM indica que   divide en módulo N en un producto de factores lineales h(D), basado en el hecho de que se eligió D para que N se divida como el producto de dos elementos. Ahora bien, si j es una de las raíces h(D) módulo N se puede definir E como:

 

c es cualquier mod no residuo cuadrático N, y r es 0 o 1.

Dada una raíz j, solo hay dos posibles elecciones no isomórficas de E, una para cada elección de r. Se tiene la cardinalidad de estas curvas como

  o  [1][10][12]

Discusión editar

Al igual que con la prueba de Goldwasser-Killian, esta conduce a un procedimiento de ejecución descendente. De nuevo, el culpable es q. Una vez que se encuentra un q que satisface la condición, se debe verificar que sea primo, así que de hecho ahora se está haciendo toda la prueba para q. Por otra parte, es posible que se tenga que realizar la prueba de los factores de q. Esto lleva a un certificado anidado donde en cada nivel se tiene una curva elíptica E, una m y el primo en duda, q.

Ejemplo de Atkin-Morain ECPP editar

Se construye un ejemplo para probar que   es primo utilizando la prueba ECPP de Atkin-Morain. Primero, procédase a través del conjunto de 13 discriminantes posibles, probando si el símbolo de Legendre   y si 4N se puede escribir como  .

Para el ejemplo se elige  . Esto se debe a que   y también, usando el algoritmo de Cornacchia, se sabe que   y por lo tanto a= 25 y b= 1.

El siguiente paso es calcular m. Esto se hace fácilmente como  , lo que da como resultado  . A continuación, se necesita encontrar un probable divisor primo de m, al que se va a denominar q. Debe cumplir la condición de que  

En este caso m= 143= 11×13. Desafortunadamente, no se puede elegir 11 o 13 como la q buscada, ya que no satisface la desigualdad necesaria. Sin embargo, existe una proposición análoga a la que se enunció acerca del algoritmo de Goldwasser-Kilian, que proviene de un artículo de Morain.[13]​ Afirma que dado el valor m, se busca un s que divida a m,  , pero que no sea necesariamente primo, y se verifica si, para cada   que divide a s

 

para algún punto P en la curva aún por construir.

Si s satisface la desigualdad y sus factores primos satisfacen lo anterior, entonces N es primo.

Entonces, en este caso, se elige s = m = 143. Por lo tanto, los posibles   son 11 y 13. Primero, está claro que  , por lo que solo se necesita verificar los valores de

 

Pero antes de que se pueda hacer esto, se debe construir la curva y elegir un punto P. Para construir la curva, se hace uso de la multiplicación compleja. En el caso estudiado se calcula el J-invariante

 

A continuación se calcula

 

y se sabe que la curva elíptica es de la forma:

 ,

donde k es como se describió anteriormente y c no es un cuadrado en  . Así que se puede empezar con

 

de donde resulta

 

Ahora, utilizando el punto P= (6,6) en E se puede verificar que  

Es sencillo comprobar que 13(6, 6)= (12, 65) y 11P= (140, 147), y así, por la proposición de Morain, N es primo.

Complejidad y tiempos de ejecución editar

El algoritmo de prueba de primalidad de la curva elíptica de Goldwasser y Kilian termina en tiempo polinomial esperado durante al menos

 

de entradas principales.

Conjetura editar

Sea   el número de primos menores que x

 

para x suficientemente grande.

Si se acepta esta conjetura, el algoritmo de Goldwasser-Kilian termina en el tiempo polinomial esperado para cada entrada. Además, si la N tiene una longitud de k, entonces el algoritmo crea un certificado de tamaño   que se puede verificar en  .[14]

Ahora considérese otra conjetura, que permitirá obtener un límite en el tiempo total del algoritmo.

Conjetura 2 editar

Supóngase que existen constantes positivas   y   tales que la cantidad de números primos en el intervalo

  es mayor que  

Entonces el algoritmo de Goldwasser Kilian prueba la primalidad de N en un tiempo esperado de

 [13]

Para el algoritmo de Atkin-Morain, el tiempo de ejecución indicado es

  para algunos  [3]

Primos de forma especial editar

Para algunas formas de números, es posible encontrar "atajos" a una prueba de primalidad. Este es el caso de los números primos de Mersenne. De hecho, debido a su estructura especial, que permite una verificación más sencilla de la primalidad, los seis números primos más grandes conocidos son todos números de Mersenne.[15]​ Ha habido un método en uso durante algún tiempo para verificar la primalidad de los números de Mersenne, conocido como test de Lucas-Lehmer. Esta prueba no se basa en curvas elípticas. Sin embargo, aquí se presenta un resultado en el que números de la forma   donde  , n impares pueden demostrarse como primos (o compuestos) usando curvas elípticas. Por supuesto, esto también proporcionará un método para probar la primalidad de los números de Mersenne, que corresponden al caso donde n= 1. El siguiente método se extrae del artículo Prueba de primalidad para   usando curvas elípticas, por Yu Tsumura.[16]

Estructura de grupo de E(FN) editar

Se toma E como la curva elíptica buscada, donde E tiene la forma   para   donde   es primo y   con   impar.

Teorema 1.[7] 
Teorema 2.   o   según que m sea o no residuo cuadrático módulo p.
Teorema 3. Sea Q= (x,y) sobre E tal que x sea un no residuo cuadrático módulo p. Entonces el orden de Q es divisible por   en el grupo cíclico  

Primero se presenta el caso donde n es relativamente pequeño con respecto a  , y esto requerirá un teorema más:

Teorema 4. Elíjase un   y supóngase que
 
Entonces p es primo si y solo si existe una Q= (x,y) en E, tal que   para i = 1, 2, ...,k − 1 y   donde   es una secuencia con valor inicial  .

El algoritmo editar

Se proporciona el siguiente algoritmo, que se basa principalmente en los teoremas 3 y 4. Para verificar la primalidad de un número dado  , realícense los siguientes pasos:

(1) Elíjase   tal que  , y encuéntrese   tal que  .

Tómese   y  .

Entonces   está en  .

Calcular  . Si   entonces   es compuesto, de lo contrario pásese a (2).

(2) Establecer   como la secuencia con valor inicial  . Calcúlese   para   .

Si   para un  , donde   entonces   es compuesto. De lo contrario, pásese a (3).

(3) Si   entonces   es primo. De lo contrario,   es compuesto. Esto completa la prueba.

Justificación del algoritmo editar

En (1), se selecciona una curva elíptica, E, junto con un punto Q en E, tal que la coordenada x de Q es un no residuo cuadrático. Se puede decir que

 

Así, si N es primo, Q' tiene un orden divisible por  , por el Teorema 3, y por lo tanto el orden de Q' es   d|n.

Esto significa que Q= nQ' tiene el orden  . Por lo tanto, si (1) concluye que N es compuesto, realmente es compuesto. (2) y (3) permiten comprobar si Q tiene orden  . Por lo tanto, si (2) o (3) concluyen que N es compuesto, es compuesto.

Ahora, si el algoritmo concluye que N es primo, entonces eso significa que   satisface la condición del teorema 4, por lo que N es verdaderamente primo.

También hay un algoritmo para cuando n es grande; sin embargo, para ello se remite al mencionado artículo.[16]

Referencias editar

  1. a b c Henri Cohen, Gerhard Frey, ed. (2006). Handbook of Elliptic and Hyperelliptic Curve Cryptography. Boca Raton: Chapman & Hall/CRC. 
  2. Top, Jaap, Elliptic Curve Primality Proving, http://www.math.rug.nl/~top/atkin.pdf
  3. a b c Atkin, A.O.L., Morain, F., Elliptic Curves and Primality Proving, https://www.ams.org/mcom/1993-61-203/S0025-5718-1993-1199989-X/S0025-5718-1993-1199989-X.pdf
  4. Lenstra, Jr., A. K.; Lenstra, H. W. Jr. (1990). «Algorithms in number theory». Handbook of Theoretical Computer Science: Algorithms and Complexity (Amsterdam and New York: The MIT Press). A: 673-715. 
  5. Caldwell, Chris. The Top Twenty: Elliptic Curve Primality Proof from the Prime Pages.
  6. a b Samuel S. Wagstaff Jr. (2013). The Joy of Factoring. Providence, RI: American Mathematical Society. pp. 187-188. ISBN 978-1-4704-1048-3. 
  7. a b Washington, Lawrence C., Elliptic Curves: Number Theory and Cryptography, Chapman & Hall/CRC, 2003
  8. a b Koblitz, Neal, Introduction to Number Theory and Cryptography, 2nd Ed, Springer, 1994
  9. m418oh27.pdf
  10. a b Blake, Ian F., Seroussi, Gadiel, Smart, Nigel Paul, Elliptic Curves in Cryptography, Cambridge University Press, 1999
  11. Lenstra, Hendrik W., Efficient Algorithms in Number Theory, https://openaccess.leidenuniv.nl/bitstream/1887/2141/1/346_081.pdf
  12. morain.html
  13. a b Morain, Francois, Implementation of the Atkin–Goldwasser–Kilian Primality Testing Algorithm, https://hal.archives-ouvertes.fr/docs/00/07/56/45/PDF/RR-0911.pdf
  14. Goldwasser, Shafi, Kilian, Joe, Almost All Primes Can Be Quickly Certified, http://www.iai.uni-bonn.de/~adrian/ecpp/p316-goldwasser.pdf Archivado el 18 de julio de 2011 en Wayback Machine.
  15. «The Largest Known prime by Year: A Brief History». 
  16. a b Tsumura, Yu, Primality Tests for   Using Elliptic Curves, arΧiv:0912.5279v1

Enlaces externos editar