Está en la página 1de 5

Problema 3. Uso de Tests de primalidad.

1. Test probabilísticos de Primalidad.


Como has estudiado, los test probabilísticos están basados en la idea de relajar la
corrección de la prueba para conseguir un comportamiento de respuesta polinomial o
subpolinomial. El primer ejemplo de test probabilístico que comentamos es el test de
Fermat. Dicho test esta basado en PTF. El algoritmo basado en este test se aplica
eligiendo varios enteros aleatorios a entre 2 y n-2 y calculando
. Si algún valor de r es distinto de 1 el algoritmo devuelve
compuesto, en otro caso devuelve primo. La fortaleza de este test radica en que tras un
número normalmente pequeño de repeticiones la probabilidad de que un número
compuesto pase como primo es muy pequeña.

El test de Fermat adolece de un conocido problema: los números de Carmichael. Los


números de Carmichael pasan la condición de Fermat para todos los posibles valores de
a; esto implica que si nuestro candidato a número primo fuese un número de
Carmichael, no importa cuantas veces pasemos el test de Fermat, el resultado siempre
sería negativo y en consecuencia el resultado del test sería un falso primo positivo. Sin
embargo, los números de Carmichael son relativamente escasos (hay 105.212 de ellos
menores de 1015) por lo que la probabilidad de elegir alguno de ellos es realmente baja.
El test de Fermat es de amplio uso en el campo de la criptografía.

Otro test muy conocido y utilizado en criptografía es el test de Solovay-Strassen (SS).


Este test está basado en el criterio de Euler que establece que si n es un número primo

impar, entonces para todos los enteros que satisfacen

que el mcd(a, n)=1, donde representa el símbolo de Jacobi definido por

donde cada pj es un primo distinto, y es el símbolo de Legendre


definido por
Los valores de a que cumplen el criterio de Euler de denominan verificadores de Euler
para la primalidad de n y los que no lo cumplen se denominan falsadores de Euler para
la primalidad de n.

Test de Solovay -Strassen


El test SS se podría codificar de la siguiente manera:

Algoritmo Test de Solovay-Strassen. (Orden de complejidad )


Entrada: Un número natural n>1, el número k de veces que se ejecuta el test y nos
determina la fiabilidad del test.

Salida: COMPUESTO si n es compuesto y POSIBLE PRIMO si n es un posible primo.

1. Para desde hasta hacer lo siguiente:


1. Función Genera_numero_aleatorio_en_intervalo
2.
3. Si entonces:
1. retorna COMPUESTO

4. /*Símbolo de Jacobi*/
5. Si entonces:
1. Retorna COMPUESTO
2. Retorne POSIBLE PRIMO

El test SS tiene una probabilidad de acierto de ½ por cada paso de j. Esto implica que la
probabilidad de que la entrada sea un número compuesto habiendo sido declarado como
primo es menor que ½t

Otro test es el Miller-Rabin (también conocido como test fuerte del pseudoprimo). El
test de Miller-Rabin (MR) está basado en el siguiente hecho: Si tenemos un número
primo n y n − 1 = 2sr donde r es impar, se cumple que ,
entonces o bien o bien
.

Test de Miller-Rabin
El test MR se podría codificar de la siguiente manera:

Algoritmo Test de Miller-Rabin. (Orden de complejidad )


Entrada: Un número natural n>1, el número k de veces que se ejecuta el test y nos
determina la fiabilidad del test.

Salida: COMPUESTO si n es compuesto y POSIBLE PRIMO si n es un posible primo.

1. Definase y tal que es impar y


2. Para desde hasta hacer lo siguiente:
1. Función Genera_numero_aleatorio_en_intervalo
2.
3. Si entonces:
1.
2. Mientras hacer lo siguiente:
1.
2. Si entonces:
1. Retorna COMPUESTO
3.
3. Si entonces:
1. Retorna COMPUESTO
3. Retorna PRIMO

El error cometido en cada paso de iteración es de ¼, (el diseño hace que existan más
falsadores de Euler que en SS) por lo que la probabilidad de que la entrada sea un
número compuesto habiendo sido declarado como primo es menor que ¼t. Por otra
parte, al utilizar exponenciación binaria las operaciones necesarias se realizan
rápidamente.

Avances recientes
Desde los años 70 se ha estado trabajando en la mejora de los algoritmos clásicos para
obtener mejores pruebas de primalidad. Para ello se ha trabajado con la factorización de
formas polinómicas de n. Entre estos algoritmos destacan el debido a Adleman,
Pomerance y Rumely (APR) y la mejora que sobre éste hicieron Cohen y Lenstra (APR-
CL) que obtienen complejidades casi polinomiales.

Por ejemplo, el test de Miller es polinomial si la hipótesis extendida de Riemann (o


conjetura ERH) es cierta. Existe una creencia generalizada en la conjetura ERH, pero al
faltar una demostración matemática no se puede concluir su terminación polinomial.

Test de primalidad AKS


En 2002 tres académicos de la Universidad de Kanpur (Agrawal, Kayal y Saxena)
presentaron un algoritmo determinista de clase P para la determinación de la primalidad
de un número. La clave del algoritmo es una versión simplificada del PTF, esto es la
condición:

Los autores se las arreglaron para formular el siguiente algoritmo, que se ha probado
puede ejecutarse en un tiempo de complejidad máxima de .

Algoritmo Test de primalidad AKS. ( Orden de complejidad )


Entrada: Un número natural n > 1.

Salida: COMPUESTO si n es compuesto y PRIMO si n es primo.

1. Si existen tal que entonces:


1. Retorne COMPUESTO
2.
3. Mientras hacer lo siguiente:
1. Si entonces:
1. Retorne COMPUESTO.
2. Si es primo > 2 entonces:
1. Mayor factor de

2. Si entonces:
1. Salga de este ciclo
3.
4. Para hasta hacer lo siguiente:
1. Si entonces:
1. Retorne COMPUESTO
5. Retorne PRIMO

Los autores demostraron además que si determinados números primos (llamados Primos
de Sophie Germain) tienen la distribución conjeturada por un matemático llamado Ardí,
el exponente 12 que aparece en la expresión de complejidad puede reducirse a 6. Sin
embargo AKS no tiene relevancia en la práctica.
Trabajo del Alumno

1. Descargar el fichero .jar suministrado en el


material.
2. Leer detenidamente la documentación y entender
como funciona el programa suministrado.
3. Implementa por ti mismo el test de Miller-Rabin.
Escribir un programa que se ejecute desde la línea
de comandos de linux que tome como parámetro el
nombre de un fichero especificado y un número
natural y genere en dicho fichero la lista de primos
con un número de bits menor que el entero dado.
4. Trabajo opcional: Haz una estimación de la
probabilidad de que el fichero contenga números
que en verdad no son primos. Incluir dicha
información en el resultado del programa.