En matemáticas , las técnicas de prueba de primalidad de curva elíptica , o demostración de primalidad de curva elíptica (ECPP), se encuentran entre los métodos más rápidos y más utilizados en la demostración de primalidad. [1] Es una idea propuesta por Shafi Goldwasser y Joe Kilian en 1986 y convertida en un algoritmo por AOL Atkin el mismo año. El algoritmo fue alterado y mejorado por varios colaboradores posteriormente, y notablemente 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 HW Lenstra en 1985, y las implicaciones para su uso en pruebas (y demostraciones) de primalidad siguieron rápidamente.
La prueba de primalidad es un campo que ha existido desde la época de Fermat , en cuyo tiempo la mayoría de los algoritmos se basaban en factorización, que se vuelven difíciles de manejar con una gran cantidad de entrada ; los algoritmos modernos tratan los problemas de determinar si un número es primo y cuáles son sus factores por separado. Adquirió importancia práctica con el advenimiento de la criptografía moderna. Aunque muchas pruebas actuales dan como resultado una salida probabilística ( N se muestra compuesto o probablemente primo, como con la prueba de primalidad de Baillie-PSW o la prueba de Miller-Rabin ), la prueba de curva elíptica demuestra la primalidad (o composición) con un certificado rápidamente verificable. [3]
Los métodos de demostración de primalidad conocidos anteriormente, como la prueba de primalidad de Pocklington, 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, por lo general, son lentos en la práctica.
Es un algoritmo de propósito general , lo que significa que no depende de que el número tenga una forma especial. ECPP es actualmente en la práctica el algoritmo más rápido conocido para probar la primalidad de números generales, pero no se conoce el tiempo de ejecución en el peor de los casos . ECPP se ejecuta heurísticamente en el tiempo:
para algunos . [4] Este exponente puede reducirse a para algunas versiones mediante argumentos heurísticos. ECPP funciona de la misma manera que la mayoría de las otras pruebas de primalidad , encontrando un grupo y mostrando que su tamaño es tal que es primo. Para ECPP, el grupo es una curva elíptica sobre un conjunto finito de formas cuadráticas tal que es trivial de factorizar sobre el grupo.
ECPP genera un certificado de primalidad Atkin – Goldwasser – Kilian – Morain mediante recursión y luego intenta verificar el certificado. El paso que consume más tiempo de CPU es la generación del certificado, porque se debe realizar la factorización sobre un campo de clase . El certificado se puede verificar rápidamente, lo que permite que la comprobación de la operación tome muy poco tiempo.
A partir de mayo de 2023 [actualizar], el primo más grande que se ha demostrado con el método ECPP es . [5] La certificación fue realizada por Andreas Enge utilizando su software fastECPP CM .
Las pruebas de primalidad de curva elíptica se basan en criterios análogos al criterio de Pocklington, en el que se basa dicha prueba, [6] [7] donde el grupo se reemplaza por y E es una curva elíptica elegida adecuadamente. Ahora enunciaremos una proposición en la que basar nuestra prueba, que es análoga al criterio de Pocklington y da lugar a la forma Goldwasser-Kilian-Atkin de la prueba de primalidad de curva elíptica.
Sea N un entero positivo y E el conjunto definido por la ecuación Considere E sobre el uso de la ley de adición habitual en E y escriba 0 para el elemento neutro en E.
Sea m un 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.
Si N es compuesto, entonces existe un primo que divide a N. Se define como la curva elíptica definida por la misma ecuación que E pero evaluada módulo p en lugar de módulo N. Se define como el orden del grupo . Por el teorema de Hasse sobre curvas elípticas sabemos
y por lo tanto y existe un entero u con la propiedad que
Sea el punto P evaluado módulo p . Por lo tanto, en tenemos
por (1), como se calcula utilizando 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 el mismo método calculado módulo p en lugar de módulo N dará como resultado: [8]
A partir de esta proposición se puede construir un algoritmo para demostrar que un entero, N , es primo. Esto se hace de la siguiente manera: [6]
Elige tres números enteros al azar, a, x, y y establece
Ahora P = ( x , y ) es un punto en E , donde tenemos que E está definido por . A continuación necesitamos 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 F N , siempre que N sea primo. Si el algoritmo de conteo de puntos se detiene en una expresión no definida, esto permite determinar un factor no trivial de N . Si tiene éxito, aplicamos un criterio para decidir si nuestra curva E es aceptable.
Si podemos escribir m en la forma donde es un entero pequeño y q un primo probable grande (un número que pasa una prueba de primalidad probabilística , por ejemplo), entonces no descartamos E. De lo contrario, descartamos nuestra curva y seleccionamos aleatoriamente otra terna (a, x, y) para comenzar de nuevo. La idea aquí es encontrar un m que sea divisible por un número primo grande q . Este primo es unos pocos dígitos más pequeño que m (o N ), por lo que será más fácil demostrar que q es primo que N.
Suponiendo que encontramos una curva que cumple el criterio, procedemos a calcular mP y kP . Si cualquiera de los dos cálculos produce una expresión indefinida, podemos obtener un factor no trivial de N. Si ambos cálculos son correctos, examinamos los resultados.
Si está claro que N no es primo, porque si N lo fuera entonces E tendría orden m , y cualquier elemento de E se convertiría en 0 al multiplicarlo por m . Si kP = 0, entonces el algoritmo descarta E y comienza de nuevo con una terna a, x, y diferente .
Ahora bien, si y entonces nuestra proposición anterior nos dice que N es primo. Sin embargo, hay un problema posible, que es la primalidad de q . Esto se verifica utilizando el mismo algoritmo. Así que hemos descrito un algoritmo recursivo , donde la primalidad de N depende de la primalidad de q y de los "primos probables" más pequeños hasta que se alcanza un umbral donde q se considera lo suficientemente pequeño como para aplicar un algoritmo determinista no recursivo. [9] [10]
Atkin y Morain afirman que "el problema con GK es que el algoritmo de Schoof parece casi imposible de implementar". [3] Es muy lento y engorroso contar todos los puntos de E utilizando el algoritmo de Schoof, que es el algoritmo preferido para el algoritmo Goldwasser-Kilian. Sin embargo, el algoritmo original de Schoof no es lo suficientemente eficiente como para proporcionar el número de puntos en poco tiempo. [11] Estos comentarios deben verse en el 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 sea de la forma kq , como se indica más arriba. No se conoce ningún teorema que garantice que podemos encontrar una E adecuada en un número polinomial de intentos. La distribución de 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 las curvas con multiplicidad. Sin embargo, esto no es un problema significativo en la práctica. [8]
En un artículo de 1993, Atkin y Morain describieron un algoritmo ECPP que evitaba el problema de depender de un algoritmo de conteo de puntos engorroso (el de Schoof). El algoritmo todavía se basa en la proposición mencionada anteriormente, pero en lugar de generar curvas elípticas aleatoriamente y buscar una m adecuada , su idea era construir una curva E donde el número de puntos fuera fácil de calcular. La multiplicación compleja es clave en la construcción de la curva.
Ahora bien, dado un N para el cual se necesita demostrar la primalidad, necesitamos encontrar un m y un q adecuados , tal como en la prueba de Goldwasser-Kilian, que cumplan la proposición y demuestren la primalidad de N. (Por supuesto, también se deben encontrar un punto P y la curva misma, E ).
La ECPP utiliza una multiplicación compleja para construir la curva E , de forma que permite calcular fácilmente m (la cantidad de puntos de E ). A continuación, describiremos este método:
La utilización de la multiplicación compleja requiere un discriminante negativo , D , de modo que D pueda escribirse como el producto de dos elementos , o de manera completamente equivalente, podemos escribir la ecuación:
Para algunos a, b . Si podemos describir N en términos de cualquiera de estas formas, podemos crear una curva elíptica E con multiplicación compleja (descrita en detalle a continuación), y el número de puntos viene dado por:
Para que N se descomponga en dos elementos, necesitamos que (donde denota el símbolo de Legendre ). Esta es una condición necesaria, y logramos la suficiencia si el número de clase 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}
Elija discriminantes D en secuencia de h ( D ) crecientes. Para cada D, compruebe si 4 N puede escribirse como:
Esta parte se puede verificar utilizando el algoritmo de Cornacchia . Una vez que se han descubierto D y a aceptables, calcule . Ahora bien, si m tiene un factor primo q de tamaño
Utilizamos el método de multiplicación compleja para construir la curva E y un punto P sobre ella. Luego podemos usar nuestra proposición para verificar la primalidad de N. Nótese que si m no tiene un factor primo grande o no se puede factorizar con la suficiente rapidez, se puede hacer otra elección de D. [1]
Para completar, proporcionaremos una descripción general de la multiplicación compleja , la forma en que se puede crear una curva elíptica, dada nuestra D (que puede escribirse como un producto de dos elementos).
Supongamos primero que y (estos casos son mucho más fáciles de realizar). Es necesario calcular 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, creamos el polinomio mónico , que tiene raíces correspondientes a los valores h ( D ). Nótese que es el polinomio de clase. A partir de la teoría de la multiplicación compleja, sabemos que tiene coeficientes enteros, lo que nos permite estimar estos coeficientes con la precisión suficiente para descubrir sus valores verdaderos.
Ahora bien, si N es primo, CM nos dice que descompone módulo N en un producto de h ( D ) factores lineales, basándose en el hecho de que D fue elegido de modo que N se descomponga como el producto de dos elementos. Ahora bien, si j es una de las h ( D ) raíces módulo N podemos definir E como:
c es cualquier residuo cuadrático no módulo N , y r es 0 o 1.
Dada una raíz j, sólo hay dos posibles opciones no isomorfas de E , una para cada opción de r . Tenemos la cardinalidad de estas curvas como
Al igual que con la prueba Goldwasser-Killian, esta conduce a un procedimiento de ejecución descendente. Nuevamente, el culpable es q . Una vez que encontramos un q que funciona, debemos verificar que sea primo, por lo que, de hecho, ahora estamos haciendo toda la prueba para q . Luego, nuevamente, es posible que tengamos que realizar la prueba para los factores de q . Esto conduce a un certificado anidado donde en cada nivel tenemos una curva elíptica E , una m y el primo en duda, q .
Construimos un ejemplo para demostrar que es primo utilizando la prueba ECPP de Atkin-Morain. Primero, proceda a través del conjunto de 13 posibles discriminantes, probando si el símbolo de Legendre y si 4 N se puede escribir como .
Para nuestro ejemplo se ha elegido . Esto se debe a que y además, utilizando el algoritmo de Cornacchia , sabemos 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, debemos encontrar un divisor primo probable de m , al que se denominó q . Debe satisfacer la condición de que
En este caso, m = 143 = 11×13. Desafortunadamente, no podemos elegir 11 o 13 como nuestro q , ya que no satisface la desigualdad necesaria. Sin embargo, nos salva una proposición análoga a la que enunciamos antes del algoritmo de Goldwasser-Kilian, que proviene de un artículo de Morain. [13] Establece que, dado nuestro m , buscamos un s que divida a m , , pero que no sea necesariamente primo, y verificamos si, para cada uno que divida a s
para algún punto P en nuestra curva aún por construir.
Si s satisface la desigualdad y sus factores primos satisfacen lo anterior, entonces N es primo.
Entonces, en nuestro caso, elegimos s = m = 143. Por lo tanto, nuestros posibles son 11 y 13. Primero, está claro que , por lo que solo necesitamos verificar los valores de
Pero antes de poder hacer esto, debemos construir nuestra curva y elegir un punto P. Para construir la curva, utilizamos la multiplicación compleja. En nuestro caso, calculamos la invariante J.
A continuación calculamos
y sabemos que nuestra curva elíptica tiene la forma:
donde k es como se describió anteriormente y c no es un cuadrado en . Así que podemos empezar con
que produce
Ahora, utilizando el punto P = (6,6) en E se puede verificar que
Es sencillo comprobar que 13(6, 6) = (12, 65) y 11 P = (140, 147), y por tanto, por la proposición de Morain, N es primo.
El algoritmo de demostración de primalidad de curva elíptica de Goldwasser y Kilian termina en el tiempo polinomial esperado durante al menos
de insumos primarios.
Sea el número de primos menores que x
para x suficientemente grande .
Si se acepta esta conjetura, el algoritmo Goldwasser-Kilian termina en el tiempo polinomial esperado para cada entrada. Además, si nuestra N tiene una longitud k , entonces el algoritmo crea un certificado de tamaño que puede verificarse en . [14]
Consideremos ahora otra conjetura, que nos dará un límite para el tiempo total del algoritmo.
Supongamos que existen constantes positivas y tales que la cantidad de primos en el intervalo
Entonces el algoritmo de Goldwasser Kilian demuestra la primalidad de N en un tiempo esperado de
Para el algoritmo Atkin-Morain, el tiempo de ejecución indicado es
Para algunas formas de números, es posible encontrar "atajos" para una prueba de primalidad. Este es el caso de los números de Mersenne . De hecho, debido a su estructura especial, que permite una verificación más fácil de la primalidad, los seis números primos más grandes conocidos son todos números de Mersenne. [15] Existe un método en uso desde hace algún tiempo para verificar la primalidad de los números de Mersenne, conocido como la prueba de Lucas-Lehmer . Esta prueba no se basa en curvas elípticas. Sin embargo, presentamos un resultado donde los números de la forma donde , n impares pueden demostrarse primos (o compuestos) utilizando curvas elípticas. Por supuesto, esto también proporcionará un método para demostrar la primalidad de los números de Mersenne, que corresponden al caso donde n = 1. El siguiente método se extrae del artículo Primality Test for using Elliptic Curves , de Yu Tsumura. [16]
Tomamos E como nuestra curva elíptica, donde E tiene la forma para donde es primo y con impar.
Primero presentaremos el caso donde n es relativamente pequeño con respecto a , y esto requerirá un teorema más:
Proporcionamos el siguiente algoritmo, que se basa principalmente en los teoremas 3 y 4. Para verificar la primalidad de un número dado , realice los siguientes pasos:
(1) Elija tal que , y encuentre tal que .
Tomar y .
Entonces esta encendido .
Calcular . Si entonces es compuesto, de lo contrario proceder a (2).
(2) Establezca como la secuencia con valor inicial . Calcule para .
Si para un , donde entonces es compuesto. De lo contrario, proceda a (3).
(3) Si entonces es primo. En caso contrario, es compuesto. Con esto se completa la prueba.
En (1), se elige una curva elíptica, E , junto con un punto Q en E , de modo que la coordenada x de Q sea un residuo cuadrático no residual. Podemos decir
Así, si N es primo, Q' tiene orden divisible por , por el Teorema 3, y por lo tanto el orden de Q' es d | n .
Esto significa que Q = nQ' tiene orden . Por lo tanto, si (1) concluye que N es compuesto, es verdaderamente compuesto. (2) y (3) comprueban si Q tiene orden . Por lo tanto, si (2) o (3) concluyen que N es compuesto, es compuesto.
Ahora bien, si el algoritmo concluye que N es primo, entonces eso significa que satisface la condición del Teorema 4, y por lo tanto N es verdaderamente primo.
También existe un algoritmo para cuando n es grande; sin embargo, para esto nos remitimos al artículo mencionado anteriormente. [16]