Criterios de Primalidad
description
Transcript of Criterios de Primalidad
Universidad de Panamá
Facultad de Ciencias Naturales Exactas y Tecnologías
Escuela de Matemática
Criterios de Primalidad.
Presentado por:
Fezel Bhana Hafeji
Ced: 8-815-486
Dirigido por:
Dr. Jaime Gutiérrez
Este trabajo es presentado en el
Seminario para optar por el Título de
Licenciatura en Matemática.
Ciudad Universitaria, Octavio Méndez Pereira
Panamá, 2010
Dedicatoria
A mi padre Aziz Bhana, mi madre Fátima Aziz Bhana, a mis hermanos
Yasin y Sohel Bhana; a toda mi familia y amigos, en especial a mi gran
amiga Zugeily D. Tejeira C.
Agradecimiento
En primer lugar a mi Dios misericordioso, por darme la oportunidad y conocimiento para llevar a cabo este trabajo; a mis
padres y hermanos; a todos los profesores, en especial al Prof. Dr. Jaime Gutiérrez, por dirigir mí trabajo de seminario; a mis compañeros; y por último, que siempre están presentes, a mis
sinceros y verdaderos amigos.
Gracias…
Índice
Introducción
Marco Histórico Anteriores a la Antigua Grecia Antigua Grecia Edad Oscura Matemáticas modernas Siglo XIX Siglo XX y la algorítmica moderna.
Marco Teórico
Definición de Divisibilidad La existencia de infinitos números primos Teorema Fundamental de la Aritmética Definición de Primalida Tests de Primalidad (definición). Algoritmos de factorización Los Criterios de Primalidad
ₒ División por Tentativaₒ Criba de Eratosthenesₒ Pequeño teorema de Fermatₒ El método de factorización de Fermatₒ Primos de Mersenne
ₒ Método de factorización de Eulerₒ El teorema de Prothₒ Test de Pépinₒ Test de Wilsonₒ Teorema de Wolstenholmeₒ Test de Lucas
ₒ Test de Pocklington
ₒ Test de Lucas-Lehmerₒ Solovay-Strassen(SS)
ₒ Método de factorización rho de Pollard.ₒ Primalidad y curvas elípticas
Aplicación
Conclusiones
Bibliografía
Introducción
En este trabajo queremos ilustrar la fascinación por los números primos de matemáticos,
profesionales y aficionados por igual, desde la antigüedad hasta nuestros días.
Explicaremos la evolución de los números primos a lo largo de la historia, como ha
sido el esfuerzo de la humanidad por comprender los números primos que en mi opinión
son un claro ejemplo de la belleza y el encanto de esta ciencia. El estudio de los
números primos ocupa un lugar destacado en la historia de las Matemáticas y muchos
de los grandes matemáticos han ligado su nombre y esfuerzo a ellos. La lista sería
interminable, citemos solo algunos: Euclides, Fermat, Euler, Gauss, etc. Todos ellos y
otros muchos han ido añadiendo piezas al rompecabezas de los números primos.
Hay que destacar una cantidad infinita de primos, y la demostración de este teorema se
remonta sobre el año 300 A.C. por el matemático Euclides y es un buen ejemplo de la
belleza de las Matemáticas. La propiedad más importante de los números primos es que
constituyen las piezas básicas en las que se descompone cualquier número natural. El
Teorema Fundamental de la Aritmética dice que todo numero natural mayor o igual que
2 puede ser expresado, de manera única, como producto de números primos.
Otro aspecto importante es aquel que los hace útiles: la seguridad del comercio por vía
electrónica se confía hoy a códigos construidos usando estos números indivisibles.
Gracias a los números primos y sus propiedades se pueden hacer conexiones seguras
por canales inseguros, acreditar identidades, etc. Por tanto interesan a informáticos e
ingenieros y al mundo gubernamental y empresarial.
Mi objetivo principal en este trabajo ha sido en presentar los criterios de primalida,
realizando un recorrido a través de la historia de la Matemática, además enlistaremos
estos criterios.
Comenzaremos con los distintos algoritmos usados para comprobar la primalidad.
Empezaremos por los algoritmos griegos y árabes.
Seguidamente trataremos los certificados de primalidad y composición clásicos, como
por ejemplo, el test de Willson nos ilustra un algoritmo que a primera vista parece
eficiente, pero del que actualmente no se sabe si lo es o no.
Más adelante, en el siglo XX y la algorítmica moderna. Entre los más importante se
encuentra el algoritmo de Solovay-Strassen. También podemos destacar el algoritmo de
Miller-Rabin, hoy por hoy, uno de los mejores y más rápido test de primalidad.
Posteriormente nos meteremos con los test en la clase RP basados en curvas elípticas.
Hablamos del ECPP y del APRCL. Para finalizar este apartado introduciremos el
reciente test AKS. Para terminar, comentaremos las implicaciones que trae el algoritmo
en sí mismo, sobre todo lo referente a la seguridad informática, criptografía y el
criptosistema RSA.
Uno de los problemas más estudiados en la historia de las matemáticas ha sido el
determinar si un número es primo o compuesto. Dichos estudios y sus propiedades
fueron estudiados de manera exhaustiva por los matemáticos de la antigua Grecia.
Anteriores a la Antigua Grecia:
Paleolítico Superior (33.000 a. C. y el año 9.000 a.c.)
Antes de la Antigua Grecia, se puede resaltar, se cree que el hombre primitivo tenía
conocimiento acerca de los números primos, prueba de estos se encuentra en el hombre
del Paleolítico Superior (33.000 a. C. y el año 9.000 a.c.), gracias a que en 1960 fue
hallado por el arqueólogo Jean de Heinzelin de Braucourt[], las muescas presentes en el
hueso de Ishango y parece aislar cuatro números primos: 11, 13, 17 y 19.
Los Egipcios:
Siglos más tarde en las matemáticas egipcias. Los egipcios sólo operaban con las
llamadas fracciones egipcias, suma de fracciones unitarias, es decir, aquellas cuyo
numerador es 1, como:
12
,13
,14
,15
, …
El cálculo de fracciones requería conocimientos sobre las operaciones, la división de
naturales y la factorización. Es por ello que, en cierta manera, tenían que conocer o
intuir los números primos.
Antigua Grecia:
Ya en la antigua Grecia aparecen numerosos estudios.
Escuela Pitagórica (500 a. c. a 300 a. c.):
Los números primos y sus propiedades fueron estudiados intensamente por los antiguos
matemáticos griegos, especialmente por la escuela Pitagórica. Pitágoras de Samos es
uno de los personajes más misteriosos de las matemáticas. Estudió las propiedades de
cada número, las relaciones entre ellos y las figuras que forman. Fundó la Hermandad
Pitagórica, una comuna formada con discípulos que debían prestar juramento de no
revelar al mundo exterior ninguno de sus descubrimientos. Esto explica que hoy
dispongamos de tan pocos datos fidedignos sobre sus logros matemáticos.
La doctrina de los pitagóricos tenía esencialmente carácter religioso, fundamentalmente
consistió en que la sustancia de las cosas era el número. Los pitagóricos tuvieron gran
interés por ellos debido a que pensaban que los números gobernaban el mundo y tenían
propiedades místicas y "mágicas". La naturaleza, las estrellas, todo estaba basado en
relaciones numéricas enteras o fraccionarias.
La obsesión por los números y la adoración que les profesaban, condujeron a los
pitagóricos a un estudio minucioso de los números.
De entre la infinidad de números la hermandad se fijó en los que poseen propiedades
especiales y entre ellos se encontraban los números primos, por su naturaleza
indivisible, presentan todas las características para ser "adorados" por los discípulos de
Pitágoras y los números perfectos o divinos. Según Pitágoras, la perfección numérica
dependía de los divisores del número. Es por eso que ellos comprendían la idea de
primalidad.
Euclides de Alejandría (300 a. C.):
Seguidamente en el año 300 a. C. en que los Elementos Euclidianos aparecieron, ya
habían sido probados varios resultados importantes acerca de números primos. En el
Libro IX de los Elementos, "El Padre de la Geometría" Euclides de Alejandría prueba
que hay infinidad de números primos. Esta es una de las primeras demostraciones
conocidas en la que se utiliza el método del absurdo para establecer el resultado.
Además demuestra el Teorema Fundamental de Aritmética: Todo entero puede ser
escrito como un producto único de primos.
Euclides también demostró que si el número 2n - 1 es primo, entonces el número 2n-1(2n -
1) es un número perfecto. Como aparece en el libro IX, proposición 36 de sus
“Elementos”, Euclides escribe: “Si tantos números como se quiera a partir de una
unidad se disponen en proporción duplicada hasta que su suma total resulte un número
primo, y el total multiplicado por el último produce algún número, el producto será un
número perfecto.”
Notemos que la suma, s = 1 + 2 + 22 + · · · + 2n−1, es igual a 2n-1. Así podemos
establecer este enunciado de la siguiente manera:
Teorema (Euclides). Si 2n-1 es un número primo, entonces (2 n-1) · 2 n -1 es un número
perfecto.
Euclides descubrió la fórmula para obtener números perfectos. Así pues, el número
encerrado entre paréntesis es un primo, el cual es un número muy conocido (más
adelante lo mencionaremos).
Eratóstenes de Cirene 200 a. C.:
Eratóstenes, nació en Cirene, la actual Libia. Estudió en Alejandría y, durante algún
tiempo, en Atenas y fue gran amigo de Arquímedes. En 236 a. c. Ptolomeo Evergetes le
llamó a Egipto para que se hiciera cargo de la Biblioteca de Alejandría, puesto que
ocupó hasta el fin de sus días, ocurrido durante el gobierno de Ptolomeo V Epífanes.
Griego Eratóstenes ideó un algoritmo para calcular números primos llamado el Tamiz
de Eratóstenes. Este fue el primer criterio de primalidad.
Estas son las más importantes contribuciones de Antigua Grecia a los números primos.
Edad Oscura:
Después de las matemáticas griegas, se da luego un gran vacío en la historia de los
números primos que es usualmente llamado la Edad Oscura.
Matemáticas Modernas:
Como muchas otras aportaciones matemáticas, el problema de la primalidad llegó a la
Europa moderna a través de los árabes, pero no fue hasta muchos siglos después que
aparecieron los primeros registros escritos sobre la primalidad y su solución. Estos
corresponden al matemático italiano Leonardo de Pisa (Fibonacci) quien presentó un
algoritmo muy simple para determinar si un número n dado es primo.
Pietro Cataldi (1603).
En 1603 El primero en utilizar relaciones observadas entre los números para determinar
la primalidad fue el boloñés Pietro Antonio Cataldi con su trabajo sobre los números
perfectos.
Cataldi determinó que si 2n − 1 es primo entonces n ha de ser primo y 2n − 1(2n − 1) ha de
ser perfecto. Este teorema nos introduce una familia de números especialmente
importante para la historia de la primalidad, los llamados números de Mersenne en
honor del filósofo Marin Mersenne (1588-1665), que son números de la forma Mp = 2p −
1 donde p es un número primo.
Cataldi descubrió los factores de todos los números hasta 800 y una tabla de todos los
números primos hasta 750 (hay 132). Cataldi usó su lista de primos para demostrar que
217- 1 = 131071 es primo (ya que 7502 = 562500 > 131071, pudo comprobar con un
tedioso cálculo que 131071 no tenía divisores primos). A partir de ahí, Cataldi ahora
conocía el sexto número perfecto: 216(217 - 1) = 8589869056. Además Cataldi usó
también su lista de números primos para comprobar que 219 - 1 = 524287 era primo (de
nuevo ya que 7502 = 562500 > 524287) y de este modo encontró el séptimo número
perfecto: 218(219 - 1) = 137438691328.
Cataldi, a pesar de haber descubierto dos números perfectos, también cometió errores.
Escribió en Utriusque Arithmetices que los exponentes p = 2, 3, 5, 7, 13, 17, 19, 23, 29,
31, 37 daban números perfectos 2p-1(2p - 1). Tenía razón para p = 2, 3, 5, 7, 13, 17, 19
para los que tenía una prueba en su tabla de números primos, pero sólo una de sus
cuatro siguientes aserciones 23, 29, 31, 37 es correcta. En 1640 Fermat mostró que
Cataldi se equivocó para n= 23 y 37, 2n-1 no era primo para esos números; más tarde
Euler en 1738 mostró que Cataldi también había errado para n=29, 2n-1 no era primo
para el número anterior. Más tarde el gran Euler mostró la aserción de Cataldi para
n=31 era correctos.
Pierre de Fermat 1640.
Jurista de profesión y enamorado de las Matemáticas, fue un genio de esta ciencia en su
época. Gracias a él se avanzó en multitud de campos pero, como ya se sabe, su mayor
afición fue la teoría de números.
El próximo gran descubrimiento fue realizado por Fermat en los inicios del siglo XVII.
Fermat, trabajaba la mayor parte del tiempo en soledad. Su único contacto con el resto
de la comunidad matemática fue gracias a Marin Mersenne. Cabe destacar también un
breve intercambio de cartas con Blaise Pascal. Tuvo la costumbre de no publicar nada,
sino que anotaba o hacía cálculos en los márgenes de los libros o escribía casualmente
sus descubrimientos en cartas a amigos. Realizó una serie de investigaciones sobre las
propiedades de los números, las cuales nunca quiso publicar.
Tras dar detalles sobre un descubrimiento termina diciendo "lo lamento, pero este
margen es insuficiente para dar los detalles de la demostración". Los resultados de
Fermat fueron conocidos por otros pensadores europeos gracias a Mersenne, que los
reenvió e hizo una amplia distribución.
Fermat, en una carta a Mersenne, es capaz de refutar los casos p = 23 y p = 37 de
Cataldi. Prueba que 223− 1 y 237−1 son compuestos dando sus factorizaciones y el
procedimiento seguido para encontrarlas:
223−1 = 47·178 481, 237−1 = 223·616 318 177.
Además Fermat es muy conocido en la historia de la matemática por los números que
llevan su nombre (números de Fermat). Fermat conjeturó que todos los números de la
forma Fn=22n
+1 eran números primos, Leonhard Euler demostró en 1732 que eso no
era cierto al obtener para n = 5 un número compuesto:
Fn=(225
+1 )=4294967297 = 641*6700417.
En 1640 Pierre de Fermat estableció (aunque sin demostración) el pequeño teorema de
Fermat, posteriormente demostrado por Leibniz y Euler, usando casos especiales de su
pequeño teorema. Este Teorema de Fermat es la base de otros muchos resultados en la
Teoría de Números y además es la base de métodos de verificación de números primos
que se utilizan aún hoy en ordenadores electrónicos.
Y por último Pierre Fermat ideo un método de factorización, después de la división por
tentativa, es uno de los métodos más antiguo que se conocen, se basa en las diferencias
entre cuadrados y que es especialmente eficaz cuando n es el producto de dos números
primos próximos entre sí.
Marin Mersenne (1644)
Fue un fraile franciscano que pasó la mayor parte de su vida en los monasterios
parisinos.
Paralelamente a Pierre Fermat en el siglo XVII. El monje francés. Mersenne fue lo más
parecido al centro de una red de intercambio de información científica. Tuvo una
nutrida correspondencia con diversos eruditos de Francia, Italia, Inglaterra y Holanda,
tales como Pierre Gassendi, Descartes, Pierre de Fermat, Galileo Galilei, Blaise Pascal,
Giovanni Doni y Constantijn Huygens. Durante la estancia de Descartes en Holanda,
Mersenne fue su principal corresponsal y su intermediario con los sabios de la época.
Este intercambio de correspondencia contribuyó al desarrollo de la teoría de números.
Hoy día, Mersenne es recordado principalmente gracias a los números que llevan su nombre,
los números primos de Mersenne. Entonces Mersenne en 1644, en el prólogo de su libro
Cogitata Physica-Mathematica, escribe que considerando un primo p entre 2 y 257, el
número 2p-1 es primo sólo para los números p siguientes: 2, 3, 5, 7, 13, 17, 19, 31, 67,
127 y 257. Toda la comunidad matemática opinaba que era imposible que Mersenne
hubiese estudiado tal cantidad de números, pero tampoco había nadie capaz de probar
que su enunciado era incorrecto.
La afirmación estaba tan por encima de las posibilidades de la época que tuvieron que
pasar más de 100 años para que alguien hiciese un avance real en su estudio: finalmente
se logró probar que efectivamente el número 231-1 es un número primo, éste es sólo uno
de la cantidad ingente de resultados matemáticos asociados al nombre del matemático
más prolífico de la historia, el suizo Leonhard Euler.
Desde el punto de vista histórico, es interesante indicar que la prueba de que el número
de Mersenne correspondiente a n=19 es primo fue dada por Cataldi en 1588. El primer
error en la lista de Mersenne fue descubierto en 1876 por Lucas, probando que 2 67 − 1
era compuesto, aunque no halla sus factores. Además prueba que 2127 − 1 es un número
primo.
El procedimiento empleado por Lucas fue posteriormente convertido en algoritmo por
Lehmer en 1930 y en la actualidad es la base de toda búsqueda de primos de Mersenne.
En 1883, el monje ruso Pervushin prueba que 261− 1 era primo, luego Mersenne había
errado con este.Mientras, otros errores de Mersenne siguen apareciendo. En 1911
Powers muestra que Mersenne también había errado con los primos 289−1 y 2107−1, en
1922 Kraitchik prueba que 2257 − 1 no es primo. El estudio del resultado anunciado por
Mersenne no se completó hasta 1947, estableciéndose que la lista correcta es: 2, 3, 5, 7,
13, 17, 19, 31, 61, 89, 107 y 127. Al fi final resultó que Mersenne había puesto dos
números de más y tres de menos en su lista original.
Leonhard Euler:
100 años más tarde. Otro eminente matemático que estuvo interesado en el problema de
la primalidad fue el suizo Leonhard Euler. Euler, se sintió atraído por los resultados de
Fermat.
Encontró un divisor de Fn (contradiciendo pues la conjetura de Fermat sobre la
primalidad de F5 ). Sin embargo, su aportación más importante al problema fue el
enunciado de un teorema relacionado que establece que todo divisor primo de Fn debe
ser de la forma 2n + 1k + 1 para algúnk∈N .
Además como ya conocemos el teorema de los números perfectos de Euclides. Si
p=2n−1 (2n−1 ) con ( 2n−1 ) primo, entonces p es perfecto.
Euler demostró el recíproco (evidentemente, sólo para perfectos pares), Euler: Un
número par p es perfecto si y solo si p=2n−1 (2n−1 ) con ( 2n−1 ) primo. Con lo que quedó
establecida una correspondencia biunívoca entre los números perfectos pares y los
números de Mersenne primos. Desde entonces se conoce como Teorema de Euclides-
Euler.
Euler también determino un método de factorización, hoy en día se conoce como el
método de Euler, que se basa en la representación de n como suma de dos cuadrados de
dos formas distintas.
John Wilson (1770)
El teorema de Wilson es un resultado de teoría de números relacionado con la
primalidad de un número entero positivo. Wilson fue un matemático que no estuvo a la
altura de las expectativas que originó, cuando antes de su graduación en Cambridge
descubrió el teorema que lleva su nombre. Fue atribuido a John Wilson por su profesor
Edward Waring. Éste último comentó que Wilson había dejado anotado este resultado
en un cuaderno pero que no lo había demostrado. No hay evidencia de que Wilson
hubiese hallado la prueba. El propio Waring tampoco pudo hacerlo y tuvo que ser
Lagrange en 1770 quien dio la primera prueba.
Sucede con frecuencia, en la historia de las matemáticas, que los nombres asignados a
las conjeturas, teoremas y principios olvidan a personajes que tuvieron la idea original o
hicieron una contribución fundamental a los mismos. El Teorema de Wilson, en este
sentido, no es una excepción. Este teorema fue descubierto por un matemático hindú
llamado Bhaskara en el siglo VII, luego explicado por Ibn al-Haytham en el año 1000
DC, el teorema era conocido por Leibniz un siglo antes de nacer Wilson, el inglés
Edward Waring lo planteó por primera vez en una publicación matemática llamada
Meditationes Algebraicae.
Joseph Wolstenholme (1862):
Joseph Wolstenholme, como una consecuencia del test de Wilson, nos da una propiedad
que verifican los números primos ≥ 5, y que fue demostrado por wolstenholme.
Los números de Wolstenholme se nombran en honor a Joseph Wolstenholme, quien
demostró el teorema que lleva su nombre, el equivalente a la relación matemática p3 en
1862, siguiendo a Charles Babbage quien demostró la equivalencia para p2 en 1819.
François Éduard Anatole Lucas (1878):
El último de los matemáticos clásicos del que hablaremos que obtuvo notables
resultados sobre la cuestión fue el francés François Éduard Anatole Lucas.
Lucas trabajó sobre los números de Fibonacci y de Mersenne, obtuvo resultados sobre la
divisibilidad de los primeros y determinó una prueba de primalidad para los números de
Mersenne (que aplicó a la comprobación de primalidad de M127)
La prueba de Lucas-Lehmer es una prueba que sirve para determinar si un determinado
número de Mersenne Mp es primo. El test fue desarrollado por Edouard Lucas en 1878 y
subsecuentemente mejorado por Derrick Henry Lehmer en la década de 1930.
Siglo XIX
Durante este siglo se desarrollaron algoritmos para saber si un número es primo o no
factorizando completamente el número siguiente (p+1) o el anterior (p-1). Dentro del
primer caso se encuentra el test de Lucas-Lehmer, desarrollado a partir de 1856. Dentro
del segundo caso se encuentra el test de Pépin para los números de Fermat (1877). El
caso general de test de primalidad cuando el número inmediatamente anterior se
encuentra completamente factorizando se denomina test de Lucas.
Siglo XX y la algorítmica moderna.
Durante este siglo se desarrollan algoritmos eficaces, que contribuyen enormemente a
encontrar los números primos.
Test de Solovay-Strassen (SS). Este test está basado en el criterio de Euler. Sin
embargo años más tarde aparecería otra caracterización de los números primos que
posibilitaría un test sustancialmente mejor que el de Solovay-Strassen. La idea del test
se la debemos a Miller y la posterior mejora a Rabin (que transformó el algoritmo en
probabilista usando las ideas de Solovay y Strassen).
En 1983, Adleman, Pomerance y Rumely presentan el primer algoritmo determinista.
Este algoritmo es conocido como el método ciclotímico por usar precisamente los
polinomios ciclotímicos,
Hasta agosto del 2002, el mejor algoritmo determinista era el de Adleman, Pomerance y
Rumely con una complejidad superpolinomial y algunas modificaciones debidas a
Mihˇailescu.
El 6 de agosto del 2002 varios medios alrededor del mundo dieron a conocer que tres
investigadores del Tecnológico de Madras, en la India, M. Agrawal, N. Kayal y N.
Sexena encontraron un algoritmo polinomial determinista para certificar que un número
es primo, cuando en efecto lo es.
Además los métodos de factorización son parte de los criterios de primalidad. Podemos
destacar entre los más recientemente, se han elaborado algoritmos basados en una gran
variedad de técnicas, como las fracciones continuas o las curvas elípticas, aunque
algunos son mejoras de métodos anteriores (la criba cuadrática, por ejemplo, se basa en
una mejora del método de Fermat). Otros, como el método rho de Pollard, son
probabilísticos, y no garantizan hallar los divisores de un número compuesto.
Hoy por hoy, el algoritmo determinístico más rápido de uso general es el General
Number Field Sieve.[]
De esta forma damos concluido un breve recorrido en la historia del fascinante mundo
de los números primos. Empapándonos sobre el surgimiento y los algoritmos para la
determinación de los números primos.
Antes de enlistar los criterios es importante mencionar, las diversas propiedades
aritméticas de los primos, establecidas por los matemáticos que, fundamentalmente
entre los siglos XVII y XIX, se ocuparon del tema de forma altruista, sin conexión con
las actividades humanas ordinarias, proporcionan como veremos.
Para introducir el concepto de primalidad es necesario, antes, definir previamente el de
divisibilidad:
Definición de Divisibilidad:
Dados dos enteros a, b decimos que a es un divisor de b si existe otro x∈Z tal que
b = a · x. Esta ampliamente generalizada la notación a|b para indicar que a divide b.
Ya estamos en condiciones de definir: primalidad.
En primer lugar observemos que si a es cualquier número entero mayor que 1, entonces
a = a · 1, con 1 ∈ Z, es decir, a es un divisor de a.
a = 1 · a, con a ∈ Z, es decir, 1 es un divisor de a.
Luego todo número entero a > 1 tiene, al menos, dos divisores, el 1 y el propio a.
La existencia de infinitos números primos:
Euclides fue el primer matemático conocido que dio la primera demostración formal
sobre la infinitud de los números primos, publicada en el libro IX de los Elementos.
Allá por el 300 a.C. en Grecia Euclides publicó la siguiente demostración:
Euclides supuso que había sólo un número finito de números primos.
Sean P1 , P2 , …, Pn todos los números primos donden∈N .
Construyó el siguiente número. Q=( P1 · P2 · ·· · ·Pn )+1
Es obvio que Q es distinto de cero y además Q no es el elemento de {P1 ·P2 ·· · ·· Pn}, es
decir Q no es un número primo, entonces Q es divisible por algún Picon.i ϵ {1 ,…, n }
Ahora bien:
Q ≡1 mod Pi∀ iϵ {1 , …, n }
Dado que Q no es divisible por ninguno de los primos, es decir no es un número
compuesto, se deduce que Q es un número primo.
Habíamos supuesto que teníamos un número finito, completamente identificado de
números primos y hemos hallado otro número primo distinto. Entonces se demuestra
que los números primos son infinitos. Si incluimos este nuevo número primo en el
conjunto de números primos podemos construir el siguiente número:
R=( P1 · P2 · ·· · · Pn ·Q )+1
y siguiendo el razonamiento anterior llegaremos a que R es otro número primo y así
queda demostrado la infinitud de los números primos.
Teorema Fundamental de la Aritmética
Cualquier número entero n mayor que 1 puede escribirse de manera única, salvo el
orden, como un producto de números primos.
Demostración:
Sea a un número entero mayor que 1. Probaremos, primero, que a puede escribirse
como un producto de números primos y, posteriormente, veremos que esa
descomposición es, salvo en el orden de los factores, única.
Descomposición.
Si a es primo, consideramos el número como un producto de un sólo factor y el
teorema ésta demostrado.
Si a no es primo, entonces es compuesto, y la proposición que dice: todo número
compuesto posee, al menos, un divisor primo, asegura que tendría, al menos, un
divisor primo.
Sea p1 el menor divisor primo de a. Entonces existirá un entero a1 tal que a = p1· a1
Si a1 es primo, entonces el teorema está demostrado.
Si a1 no es primo, será compuesto y aplicando de nuevo la proposición anterior
tendría, al menos, un divisor primo.
Sea p2 el menor divisor primo de a1, entonces existirá un entero a2 tal que
a1 = p2 · a2, con a1 > a2
Sustituyendo esta igualdad en la anterior, tendremos que
a= p1 · p2 · a2
Repitiendo el proceso un número finito de veces, obtendremos
a1 > a2 > a3 >… > ak−1
Con
a= p1· p2 · a2 ·…· pk – 1 · ak-1,
Donde ak−1 es primo o es la unidad, entonces tomando ak−1 = pk, si es primo o ak−1 =
1, se sigue que
a = p1 · p2 · p3 ·…· pk−1
Ó
a = p1 · p2 · p3 ·…· pk−1 · pk
y a está escrito como un producto de factores primos.
Definición de Primalidad:
Definición: Diremos que el número entero p > 1 es un número primo si los únicos
divisores positivos que tiene son 1 y p. Si un número entero no es primo, lo llamaremos
compuesto.
Nota. Obsérvese que de la definición de número primo se sigue que p es primo si, y sólo
si es imposible escribir p = ab con a, b ∈ Z y 1 < a, b < p.
Paradójicamente, la definición en apariencia tan sencilla e intuitiva, sin embargo da
lugar a algunas de las preguntas más difíciles que se ha planteado nuestra inteligencia,
muchas de las cuales aún restan sin resolver. Y es que lo más interesante de los números
primos es que, a priori es una parte de la matemática de la que cualquier persona puede
leer el capítulo introductorio. En cambio, por poco que uno se adentra, rápidamente se
da cuenta de que el problema no es tan sencillo como aparenta y que son necesarias
estructuras muy complejas y un conocimiento muy interdisciplinario para poder avanzar
en su estudio.
Algunas de las preguntas más importantes relativas a la posición de los números primos
dentro de los números naturales son:
¿Cuántos números primos existen?
¿Cómo saber si un número es primo o no?
¿Hay funciones que definan los números primos de forma eficiente?
¿Cómo están distribuidos los números primos dentro de los números naturales?
¿Como factorizar de forma eficiente un número natural cualquiera?
La dificultad de responder a las preguntas expuestas varía mucho de unas a otras. Por
ejemplo hace miles de años que se conoce la respuesta a la primera pregunta, y es que
existen una infinidad de demostraciones sencillas que nos dicen que existen un número
infinito de números primos.
Otras en cambio son tan complicadas que hoy en día aún no se conoce la respuesta,
como por ejemplo las relativas a la factorización de los números primos o a la
obtención de una función eficiente que los defina.
La cuestión que da razón a éste trabajo es la segunda pregunta, la de discernir entre si un
número dado de Z es primo o no.
Comprobar si un número es compuesto o primo, se puede tratar de varias maneras, una
muy simple es factorizarlo, así con solo mostrar los factores primos, convenceríamos sin
tener que mostrar una teoría compleja o argumentos auxiliares. Otra forma bastante
parecida seria encontrarle un divisor a dicho número, con esto lo demostraríamos de
manera sencilla a cualquier persona. Pero como persuadir a alguien si el numero es
primo, para esto debemos acudir a teorías auxiliares, que serán simples o complejas
según el nivel de fortaleza de nuestro algoritmo, con las cuales se demuestran
condiciones que debe cumplir un número para ser primo o no, de esta manera las
comprobaríamos y en caso de cumplirse o no, sabríamos que es primo o compuesto
algunas veces con seguridad y otras con una alta probabilidad.
La primera conclusión a la que llega una persona corriente cuando lee el enunciado del
problema que nos ocupa es que, efectivamente, existe un algoritmo, sencillo y fácil de
aplicar, para resolverlo.
TESTS DE PRIMALIDAD
La demanda del mercado de números primos grandes plantea el problema de encontrar
tales números de manera eficiente: por ejemplo, el sistema RSA solo sería factible si la
oferta de los primos p y q necesarios es abundante y barata. Para encontrar un tal primo
puede elegirse n, número impar arbitrario del tamaño requerido y comprobar si es
primo. El problema que resta es: ¿Cómo comprobar si n es primo?
Definición: Un Test de Primalidad es un algoritmo que permite decidir si un número
natural n es primo o compuesto.
Cualquier método de factorización (por ejemplo la división por los números, impares,
menores que √n), constituye un test de primalidad.
Algoritmos de factorización
Un algoritmo de factorización es un algoritmo que separa uno a uno los factores primos
de un número. Los algoritmos de factorización pueden funcionar también a modo de
tests de primalidad.
Como ya sabemos la definición formal de número primo, además vimos la
demostración de Euclides de Alejandría, quien prueba que hay infinidad de números
primos, aparte demuestra el Teorema Fundamental de Aritmética: Todo entero puede
ser escrito como un producto único de primos. Con esto nos metemos de lleno para
enlistar en un orden cronológico los diferentes Criterios de Primalidad que existen, para
la determinación de los números primos.
Encontraremos dos clases algoritmos para la determinación de los números primos:
Deterministas, los cuales demuestran matemáticamente la naturaleza prima (o
compuesta) de un número,
Probabilísticos, los cuales solo garantizan, con una probabilidad tan alta como se
desee, la primalidad de un número.
De lo anterior podemos concluir, encontraremos dos clases de criterios para la
determinación de los números primos, uno es el test (prueba) determinista y el segundo
test (prueba) probabilístico.
A continuación desarrollaremos los diferentes criterios de primalidad, eso sí en un orden
cronológico, a medida que fueron surgiendo los test de primalidad.
División por Tentativa
La división por tentativa es el algoritmo de factorización de enteros más sencillo y fácil
de entender.
Dado un entero compuesto n (n será el entero a factorizar), la división por tentativa
consiste en intentar dividir n entre todo número primo menor o igual a . Si se
encuentra un número que es divisor de n, en división entera, ese número es un factor de
n.
Es posible determinar un límite para los factores primos. Supón que P(i) es el i-ésimo
primo, de modo que P(1) = 2, P(2) = 3, etc. Entonces el valor del último número primo
probado como un posible factor de n es P(i) donde P(i + 1)2 > n; la igualdad aquí
querría decir que P(i + 1) es un factor. Aunque todo esto está muy bien, normalmente el
inconveniente de inspeccionar un n concreto para determinar el valor correcto de i es
más costoso que simplemente probar con el único candidato innecesario P(i + 1) que
estaría incluido en la tentativa con todos los P(i) tales que P ( i )<√n .Puede la raíz
cuadrada de n ser entera, entonces es un factor y n es un cuadrado perfecto, pero no es
esta una manera buena de encontrarlos.
La división por tentativa garantiza encontrar un factor de n, puesto que comprueba todos
los factores primos posibles de n. Por tanto, si el algoritmo no encuentra ningún factor,
es una prueba de que n es primo.
Por ejemplo, queremos saber se 323 es un número primo. La raíz cuadrada de 323 es
323½ = 17,9722, por lo tanto, vamos a dividir 323 por 2, 3, 5, 7, 11 y 17. Si ninguno de
estos primos dividir 323, entonces él será primo:
El entero 323 no es primo porque es dividido por 17.
Si estuviéramos buscando por un primo titánico, con más de 10.000 dígitos decimales,
nunca podríamos dividirlo por todos los primos menores que su raíz cuadrada. Aun así,
aún en estos casos la división por tentativa es utilizada, solamente para hacer un rastreo
inicial. Se hace divisiones por algunos millones de primos pequeños y después se aplica
una prueba de primalidad.
En el caso de que n haya 25 dígitos o más, la división por tentativa usando primos
menores que su raíz cuadrada es impracticable. Si n tuviera 200 dígitos, entonces la
división por tentativa es imposible.
Criba de Eratosthenes
Una vez conocida la existencia de infinitos números primos, se plantea un nuevo
problema cual es la forma en que dichos números están distribuidos en el conjunto de
los números naturales. Este problema es complicado y se conocen sólo resultados
parciales. Un primer método para resolver esta cuestión fue establecido en el 200 a.c.
por el astrónomo Eratostenes de Cirene, el cual ideo un algoritmo para calcular números
primos llamado Criba o Tamiz de Eratostenes y es consecuencia del siguiente teorema
cuya primera demostración rigurosa se debe a Fermat. _
Teorema. Si un número entero mayor que 1 no tiene divisores primos menores o iguales
que su raíz, entonces es primo.
Demostración:
Sea p entero estrictamente mayor que 1. Utilizamos el método de demostración por la
contrarrecíproca, es decir veremos que si p no es primo, entonces existe, al menos, un
divisor primo de p menor o igual que su raíz.
En efecto, si p no es primo, entonces es compuesto y (por la proposición: todo número
compuesto posee, al menos, un divisor primo.) tendrá, al menos, un divisor primo a.
Veamos que es menor o igual que la raíz de p. En efecto,
a|p ⇒ p = aq, con 1< a < p, y q ∈ Z: 1< q < p.
Además, si suponemos que a ≤ q , entonces
a ≤ q ⇒ a2 ≤ aq ⇒ a2 ≤ p ⇒ a ≤√ p.
Así pues, hemos encontrado un divisor primo de p menor o igual que la raíz de p.
La criba de Eratóstenes es un algoritmo que permite hallar todos los números primos
menores que un número natural dado.
Partimos de una lista de números que van de 2 hasta un determinado número.
Eliminamos de la lista los múltiplos de 2.
Luego tomamos el primer número después del 2 que no fue eliminado y
eliminamos de la lista sus múltiplos, y así sucesivamente.
El proceso termina cuando el cuadrado del mayor número confirmado como
primo es menor que el número final de la lista.
Los números que permanecen en la lista son los primos.
Ejemplo: deseamos calcular los números primos desde el número dos hasta 120.
Aplicando los pasos anteriores obtenemos la lista de los números primos, la cual
aparece en la parte derecha del siguiente cuadro.
Para este algoritmo necesitamos demasiado tiempo y espacio para realizar el algoritmo
con enteros suficientemente grandes. Aún así, este método tan antiguo casi como la
noción de primalidad, es la base para estudios realizados sobre la estimación de la
cantidad (nos referimos a la proporción en relación a los enteros y a su colocación
dentro de ellos) de números primos que existen.
Además es interesante ya que caracteriza a los primos de forma indirecta, sin recurrir a
la definición. Para él, los números primos son los que restan en la tabla sin ser
eliminados y observemos que para su construcción no necesitamos conocer, a priori,
ninguna propiedad sobre los números primos.
Como ya hemos dicho, todos los resultados de éste trabajo se basan en caracterizaciones
de los números primos que resultan ser ligeramente mejores que su definición para
atacar el problema de la primalidad.
Pequeño teorema de Fermat:
Fermat Alrededor de 1636, Pierre de Fermat enunció el teorema. Aparece en una de sus
cartas a su confidente Frénicle de Bessy, fechada el 18 de octubre de 1640, con el
siguiente texto: Todo número a no divisible por un primo p deja residuo 1 al elevarse a
la potencia p-1 y dividirse entre p.
Si a es un número natural cualquiera, por ejemplo 9 y p un número primo que no es
divisor de a, por ejemplo 5; siempre se cumple que p, es en este caso 5, es divisor
exacto de a p-1 -1, en nuestro caso 95 - 1 - 1.
En efecto 94 - 1 = 6561 - 1 = 6560 que es divisible por 5.
Esta brillante joya numérica se conoce como el "pequeño teorema de Fermat". Y, fue
demostrado por Euler cuando tenía 29 años. En términos de congruencias, esto se
escribe así:
a p−1≡1(mod p)
Otra forma de presentar este teorema es multiplicando por a:
a p≡ a(mod p)
El método en cuestión es el llamado test de primalidad de Fermat. Dicho test utiliza el
pequeño teorema de Fermat para descartar que cierto número sea primo o para alcanzar
cierta certeza de que un número es primo, según el caso.
Comencemos recordando el pequeño teorema de Fermat (una versión equivalente al
original):
Si P es un número primo, entonces para todo a menor que P, que sea primo relativo con
el propio P se cumple que:
a p−1≡1(mod p)
Es decir, si P es primo entonces a p−1es congruente con 1 módulo P. Esto significa que
si nosotros tenemos un número P que sabemos que es primo y tomamos un número
cualquiera a que no tenga ningún divisor común con P, al dividir el resultado de la
operación a p−1entre P el resto es 1 (o equivalentemente: al dividir a p−1−1entre P el
resto es 0).
Vamos con el primer uso del teorema: si tomamos un número p y otro a primo relativo
con él y el resto de dividir a p−1entre p no es 1, entonces el número p es compuesto. Es
sencillo darse cuenta de esto simplemente tomando el contra recíproco del teorema: si la
congruencia no se cumple, entonces el número n no es primo, por lo que necesariamente
debe ser compuesto.
El segundo uso que se le puede dar a este teorema es el que más nos interesa.
Imaginemos que tomamos un número, por ejemplo p = 11, que en principio no sabemos
si es primo o compuesto. Para aplicar el teorema debemos tomar un número a primo
relativo con 11. Sea, por ejemplo. a = 4 Tenemos que:
a p−1=411−1=104857 6
Si dividimos este número entre 11 el resto es 1. ¿Nos dice algo esto? Pues no mucho:
simplemente que no podemos descartar que 11 sea primo. Si seguimos probando con
todos los primos relativo con 11 menores que el propio 11 obtenemos siempre resto 1 al
realizar las operaciones anteriores. Al pasar con todos, ¿podemos asegurar algo? Pues
por desgracia tampoco. La razón es muy sencilla: todo número primo p cumple que para
cualquier a primo relativo con él el resto de dividir a p−1entre p es 1 (es lo que dice el
pequeño teorema de Fermat), pero también hay número compuesto que tienen la misma
propiedad. Por ello el hecho de que un número cualquiera pase el test de Fermat no nos
asegura que el propio número sea primo.
Un número que pase el test de Fermat para un cierto a se denomina pseudoprimo en
base a. Por tanto, en el caso anterior al probar con a= 4 tendríamos que 11 es un número
pseudoprimo en base 4. La denominación pseudoprimo se debe a que el número cumple
una propiedad que también cumplen todos los números primos, pero no podemos
asegurar que él también lo sea. De esta forma un número n es llamado un pseudoprimo
de Fermat si es pseudoprimo a toda base 0 < b < n.
Pero continuando con la prueba hemos dicho que 11 pasa el test de Fermat para
cualquier a menor que 11 y primo relativo con él. Aunque se ha comentado que eso no
nos asegura nada, sabíamos de antemano que 11 es primo. Podría ser que los únicos
números que pasan el test de Fermat en cualquier base fueran los números primos, pero
no es así. Existen números compuestos que pasan el test de Fermat para cierta base a,
esos números se le conoce como pseudoprimo de base con el cual pasan el test.
Por ejemplo:
341 = 11 · 31 es pseudoprimo a 2
91 = 7 · 13 es pseudoprimo a 3
217 = 7 · 31 es pseudoprimo a 5
25 = 5 · 5 es pseudoprimo a 7
Los números naturales que pasan el test de Fermat en cualquier base pero resultan ser
compuesto son los denominados números de Carmichael (también se les llama
pseudoprimos absolutos). Es decir, son números p para los cuales sea cual sea a menor
que p y primo relativo con él se verifica qué a p−1≡1(mod p), pero no son primos.
El primer número de Carmichael es el 561. Es decir, a560−1es divisible por 561 para
cualquier a menor que 561y primo relativo con él, pero no es primo. De hecho.
561=3·11·17.
El método de factorización de Fermat
La cuestión es factorizar un cierto número n. La idea de Fermat es la siguiente:
Si n es igual a la diferencia de dos cuadrados, digamos n=x2− y2, entonces n puede
factorizarse de forma muy sencilla de forma evidente:
n=( x+ y ) ( x− y ) .
Como x2 debe ser mayor que n se tiene que x debe ser mayor que √n. A partir de esto ya
podemos adentrarnos en el método de factorización de Fermat:
Dado un número entero positivo n que queremos factorizar tomamos un entero positivo
x mayor que √n (podemos calcular una aproximación de esa raíz cuadrada a ojo o con el
método normal y después elegir x). Calculamos x2 y le restamos n. Si obtenemos un
cuadrado hemos terminado. Si no es así tomamos x+1, calculamos¿, restamos n y si
hemos obtenido un cuadrado se acaba. Procedemos de la misma forma hasta encontrar
un cuadrado.
Ejemplos de aplicación del método:
Vamos a factorizar el número13837. Su raíz cuadrada está entre 117 y 118. Tomamos x
= 118. Pero 1182 – 13837 = 87, que no es un cuadrado. Tomamos ahora x =119. Ahora
1192 – 13837 = 324 = 182. Por tanto despejando n = 13837 de esta expresión tenemos
su factorización:
13837 = 1192 – 182 = (119 + 18)(119 -18) =137 ·101
Como podemos ver el método está muy bien si la diferencia entre los factores del
número no es muy grande pero no es demasiado eficiente si los dos factores están muy
alejados el uno del otro, ya que en ese caso la cantidad de cálculos que deberíamos
realizar sería enorme.
Primos de Mersenne
Definición: Un número de Mersenne es un número Mp de la forma,M p=2p−1, cuando p
es primo y Mp también lo es, Mp se denomina primo de Mersenne.
Los primos de Mersenne tienen un origen curioso y están relacionados con los llamados
números perfectos que ya fueron estudiados en la antigua Grecia.
Hasta 1536 se pensó que los números de la forma 2n-1 eran todos primos, pero ese año
Hudalricus Regius, demostró que 211 - 1 = 2047 era el producto de 23 y 89. Sin
embargo, muchos (se supone que infinitos) números primos cumplen esa condición. A
los números primos que cumplen esa condición se les llama números primos de
Mersenne. A pesar de todo, los números de Mersenne han proporcionado
tradicionalmente un método de cálculo de números primos gigantescos.
Existen pruebas especiales de primalidad y búsqueda de factores que los hacen
matemáticamente atractivos. Dos resultados importantes sobre estos números son: la
forma especial que tienen sus divisores y un test rápido (Lucas-Lehmer) para averiguar
si son primos o no.
Ejemplo: M19 = 219 - 1 = 524287 es un primo de Mersenne (encontrado por Cataldi en
1588).
El descubrimiento de los números de Mersenn se debe al grupo GIMPS, concretamente
a Odd Magnar Strindmo, persona que lleva colaborando con GIMPS desde 1996. El
proyecto Great Internet Mersenne Prime Search (GIMPS) ha anunciado el
descubrimiento, no de uno, sino de dos números primos de Mersenne. El método
empleado es el de la computación distribuida en la que muchos voluntarios permiten el
uso de CPU de sus máquinas. No es la primera vez que se descubre un número primo de
este tipo con este método por esta misma organización. El que ahora hace el número 46
es el número primo más grande conocido hasta la fecha. Además se ha confirmado el
descubrimiento del primo de Mersenne número 47. En concreto es este número:
242.643 .801−1. El número en cuestión tiene la friolera de 12837064 dígitos.
La definición de estos números permite saber que el n-ésimo número de Mersenne es
una cadena de n unos cuando se escribe en binario (base 2). Por ejemplo, M7 = 27 - 1 =
127 = 11111112 es un número de Mersenne. Esta propiedad permite implementar
cálculos con números de Mersenne en los computadores de manera más sencilla. No
todos los primos son primos de Mersenne, pero como éstos se pueden implementar
fácilmente en un programa de ordenador los 8 mayores primos conocidos son de
Mersenne.
Método de factorización de Euler:
La idea de que dos representaciones distintas de un entero positivo dieran lugar a una
factorización fue aparentemente planteada por primera vez por Marin Mersenne. Sin
embargo, no fue hasta Euler, cien años después, que su uso empezara a extenderse. Su
más celebrado uso del método que hoy lleva su nombre fue el de factorizar el número N
= 1000009, que, al parecer, se pensaba que era primo.
Este método de factorización basado en la representación de un entero positivo N como
la suma de dos cuadrados de dos maneras distintas:
N = a2 + b2 = c2 + d2
Aunque la factorización algebraica de números binomiales no sirve para factorizar
sumas de dos cuadrados (en efecto un número que se puede expresar de una forma
como suma de dos cuadrados es un número primo) si se pueden hallar dos
representaciones distintas de un número como suma de dos cuadrados se sigue de ahí
una factorización:
Partiendo de
N = a2 + b2 = c2 + d2
se resta b2 + c2 a ambos lados de la igualdad para crear una diferencia de dos cuadrados:
a2 − c2 = d2 − b2
y de ahí se sigue que:
(a−c ) · ( a+c )=(d−b ) · (d+b )
Supóngase sin pérdida de generalidad que d y b son ambos pares o bien ambos impares,
de forma que su diferencia es par. Ahora se define una constante k igual al máximo
común divisor de (a − c) y (d − b) de forma que:
(a − c) = kl y (d − b) = km, con mcd(l,m) = 1
de forma que, tras sustituir en la expresión anterior:
l· (a+c )=m· (d+b )
Como l y m son primos entre sí, se sigue que (a + c) es divisible por m, lo que nos da:
(a + c) = mn y;
(d + b) = ln
La factorización del número original n se puede mostrar que es igual a:
N=[( k2 )
2
+( n2 )
2] ·(m2+l2)
Ejemplo:
Usaremos N = 1000009, como mencionamos anteriormente, se pensaba que era primo,
Euler con el uso de este método comprobó que no era primo.
Como:
N=1000009 = 10002 + 32 = 9722 + 2352
se tiene por las fórmulas anteriores:
a =
1000
a - c = 28 k = 4
b = 3 a + c = 1972 l = 7
c = 972 d - b = 232 m = 58
d = 235 d + b = 238 n = 34
Así,
1000009=[( 42 )
2
+( 342 )
2] ·(582+72)
=(22+172 ) · (582+72 )
= (4+289) · (3364+49)
= 293·3413
El método de factorización de Euler es más efectivo que el de Fermat para números
naturales cuyos factores no sean próximos entre sí y es potencialmente mucho más
eficiente que la división por tentativa si se pueden hallar representaciones de números
como suma de cuadrados de forma razonablemente fácil. El desarrollo de Euler permitió
una factorización mucho más eficiente, y, para los años 1910, el desarrollo de una tabla
de factores de números hasta 10 millones.
El Teorema de Proth (1878)
Es un test de primalidad para los números de Proth inventado por François Proth
alrededor de 1878.
Un número de Proth es primo, es decir, un número de la forma N=k·2n+1, para k impar,
n un número entero positivo, y 2n >k.
Números primos de Proth satisfacen el teorema de Proth, es decir, un número N de esta
forma es primo si y solo si existe un número a tal que a¿¿es congruente con -1 módulo N
entonces n es un número primo llamado primo de Proth. Este test funciona en la
práctica porque si n es primo, el 50% de los valores de a cumplen con la condición
indicada arriba.
Si a es un número primo y p no es un residuo cuadrático módulo a entonces a tampoco
es residuo cuadrático módulo p y se cumple la condición del teorema. En la práctica se
usan diferentes números primos pequeños para la variable a y se calcula el símbolo de
Jacobi hasta que:
( ap )=−1
lo cual es mucho más rápido que la exponenciación modular para hallar el valor de a, ya
que en este caso, luego de calcular p mod a, se deben realizar unos pocos cálculos
usando números menores que a, mientras que con la congruencia se deben realizar más
de (ln p/ln 2) multiplicaciones modulares modulo p, lo que es muy costoso en tiempo de
cálculo.
Ejemplo: sea N el número de Proth ya que N=13 = 3· 22 + 1.
Con el uso del teorema tenemos que, tomando a=5, se tiene:
5(13−1)/2=56≡−1(mod 13)
Es decir para n = 13, 56 + 1 = 15626 es divisible por 13, por lo que 13 es primo de proth.
A continuación se muestran ejemplos de uso del teorema de Proth:
Para n = 3, 21 + 1 = 3 es divisible por 3, por lo que 3 es primo.
Para n = 5, 32 + 1 = 10 es divisible por 5, por lo que 5 es primo.
Para n = 9, que no es primo, no existe valor de a tal que a4 + 1 sea divisible por
9.
Los primeros primos de Proth son: 3, 5, 13, 17, 41, 97, 113, 193, 241, 257, 353, 449,
577, 641, 673, 769, 929, 1153,… A julio de 2009, el mayor primo de Proth conocido es
19249 · 213018586 + 1, hallado por el proyecto Seventeen or Bust. Posee 3918990 dígitos
decimales y es el mayor primo conocido que no es de Mersenne.
Test de Pépin
En matemáticas, el test de Pépin (por el matemático francés P. Pépin) es un test de
primalidad que se puede emplear para determinar si un número de Fermat es primo. Es
una variante del test de Proth.
Sea Fn=22n
+1el n-ésimo número de Fermat. El test de Pépin establece que para cada n
> 0, Fn es primo si y sólo si 3¿ ¿ (mod Fn).
Ejemplo: queremos comprobar si F2 es primo, como F2 = 222
+1 = 17. Usando el test de
Pépin tenemos, 3¿ ¿ 38 = 6561
La expresión 3¿ ¿se puede evaluar módulo Fn elevándolo repetidamente al cuadrado. Esto
permite que el test tenga un tiempo de ejecución polinómico, es decir, en principio se
trata de un algoritmo rápido. Sin embargo, los números de Fermat crecen tan
rápidamente que sólo se pueden evaluar unos pocos en un intervalo de tiempo
razonable.
También pueden emplearse otras bases en lugar de 3, por ejemplo, 5, 6, 7 ó 10.
Test de Wilson:
Teorema de Wilson fue una de las primeras caracterizaciones completas de los números
primos, de forma que no era necesario conocer la factorización del número en cuestión
para obtener un resultado concreto sobre su primalidad.
Test de Wilson: (n − 1)! ≡ −1 (mod n) si y solo si n es primo.
Ejemplo: sea n=7, entonces n-1 = 6 es primo dado que (n-1)! = (6)! ≡ -1 (mod 7)
(El inconveniente es que el cómputo del factorial es un problema computacionalmente
más complejo que la factorización).
Teorema de Wolstenholme
El teorema de Wolstenholme afirma que para un número primo p > 3, la congruencia
(2 p−1p−1 )≡1mod p3
es verdadera, donde la parte izquierda de la igualdad es un coeficiente binomial.
El teorema fue demostrado por Joseph Wolstenholme en 1862; Charles Babbage había
mostrado la equivalencia para p2 en 1819.
No se sabe si un número compuesto cumple el teorema de Wolstenholme. Los números
que cumplen con la congruencia son llamados números de Wolstenholme.
Este teorema puede ser descompuesto en otros dos resultados:
( p−1 )! (1+12+ 1
3+…+ 1
p−1 )≡0 mod p2
y
( p−1 )!2(1+1
22 +1
32 +…+1
( p−1)2 )≡ 0mod p .
Test de Lucas:
El teorema pequeño de Fermat dice que si p es primo, entonces se cumple que ∀a ϵ Zno
multiplo de p → ap−1≡ 1(mod p). Sabemos ya que el recíproco del teorema no es cierto,
e incluso le hemos dado un nombre a los números enteros que no cumplen la propiedad
reciproca para todos los enteros inferiores que ellos, los números de Carmichel.
Lucas, en 1876 formuló un recíproco del teorema de Fermat, bajo ciertas condiciones.
Proposición: Test de Lucas 1:
Sea N > 1, supongamos que existe un entero n > 1 tal que:
nN−1 ≡1(mod N)
nm≢ 1 (mod N) para todo m = 1, 2, . . . ,N − 2
Entonces N es primo.
Demostración:
De la definición de la función de Euler(Si a y p son dos enteros tales que mcd(a, p)=1,
entonces aΦ(n )≡1 (mod p)) es suficiente ver que Φ (N) = N−1. Para ello simplemente
necesitamos obtener un número entero t tal que: 1 ≤ t < N, Mcd (t, N) = 1 tal que el
orden de t módulo N sea N−1. Estas son precisamente la hipótesis expresada en el
enunciado.
El principal problema de éste test es que requiere de N-2 exponenciaciones modulares
del supuesto número t, operación demasiado costosa, ya que nos proporcionaría un coste
computacional exponencial.
En 1891, Lucas enunció este otro test:
Proposición. Test de Lucas 2:
Sea N > 1. Supongamos que existe un entero a > 1 tal que:
aN −1 ≡1 (mod N)
am≢ 1 (mod N) para todo m < N tal que m | (N − 1)
Entonces N es primo.
El principal problema asociado a éste test es que es necesario conocer la factorización
en números primos de N − 1 para poder realizarlo, problema, que como ya sabemos, se
conjetura más complejo que el de la primalidad. Solo puede ser utilizado, entonces, en
el caso de tener una caracterización realmente efectiva de los factores que componen N-
1 como puede ser en los primos del tipo,N=2n+1.
El comentario anterior, a propósito del test de Lucas, muestra que, para números
particulares, pueden ser factibles tests deterministas de primalidad eficientes y fáciles de
implementar.
Ejemplo, tómese N = 71. Entonces, N − 1 = 70 = (2)(5)(7). Tómese ahora n = 11. En
primer lugar:
1170 ≡1(mod 71)
Esto nos demuestra que el orden multiplicativo de 11 mod 71 es 70, porque algún factor de 70 aún podría funcionar arriba. Verificamos entonces 70 dividido por sus factores primos: 1135 ≡70 ≢1(mod 71)
1114 ≡54 ≢ 1(mod 71)
1110 ≡32 ≢1(mod 71)
Entonces, el orden multiplicativo de 11 mod 71 es 70 y de esta manera, 71 es primo.
Test de Pocklington
Enunció la siguiente proposición en 1914:
Proposición Sea N − 1 = qrR dónde q es un número primo, ≥ 1 y q no divide a R.
Supongamos además que existe un entero a > 1 tal que:
aN −1 ≡1 (mod N)
mcd (aN−1
q −1 , N )=1
Entonces todos los factores primos de N son de la forma m · qn+1 con m ≥ 1.
Demostración:
Sea p un factor primo de N y llamemos e al orden de a módulo p. Por consiguiente
sabemos que e divide a p−1. Por la segunda condición expuesta en el enunciado de la
proposición e no puede dividir N−1
q ya que en caso contrario a
N −1q ≡1(mod p) y por
lo tanto qn ⃓e y consiguientemente, como queríamos ver, qn ⃓(q−1).
Esta proposición puede ser interpretada como un test de primalidad en el siguiente
sentido:
Proposición: Test de Pocklington 1.
En las condiciones de la proposición anterior, si todo factor primo p=m· qn+1>√N
entonces N es primo.
Pocklington, incluso realizó un refinamiento de su caracterización sobre los factores
primos de N − 1 como sigue:
Proposición: Sea N − 1 = FR, dónde mcd(F,R) = 1 y la factorización de F es conocida.
Si para todo primo q que divida a F existe un entero a = a (q) > 1 tal que:
aN −1 ≡1
mcd (aN−1
q −1 , N )=1
entonces todos los factores primos de N son de la forma m·F +1, con m ≥ 1.
Lo que nos lleva a poder formular un test de primalidad análogo al enunciado del test de
Pocklington 1.
A continuación Pocklington propuso otro test de primalidad, refinando los anteriores,
imponiendo ciertas condiciones sobre R, la parte no factorizada de N:
Proposición: Test de Pocklington 2:
Sea N −1 = F·R dónde mcd (F,R) = 1 y la factorización de F es conocida. Supongamos
que B es tal que FB >√ N y que R no tiene más factores primos que los de B, entonces
si:
1. Para cada primo q que divida a F existe un entero a = a(q) > 1 tal que
aN −1 ≡1 (mod N) y mcd (aN−1
q −1 , N )=1.
2. Existe un entero b > 1 tal que bN −1 ≡1 (mod N) y mcd ( bF−1 , N )=1.
Entonces N es primo.
Ejemplo1: prueba por Pocklington para el número N=11. Se supone conocida la
factorización parcial N-1=2·5 y también conocido el hecho de que F=5 es un número
primo, por tanto q es único e igual a F.
Puesto que 210≡ 1 (mod 11), y
mcd (2105 −1, 11)=1, podemos concluir que n es primo.
Ejemplo 2: prueba por Pocklington para el número N = 11351, N-1 = 2 · 52 · 227
Escogemos A = 227 · 52, con lo que significa B =2. Ahora está claro que mcd (A,B) = 1
y A > √ N
Encontramos un ap para cada factor primo p de A. Esto es tomando
a = 2.
aN −1 ≡211350 ≡1(mod 11351)
mcd ¿
Así cumple las condiciones necesarias. Ahora escogemos a = 7
aN −1 ≡711350≡1(mod 11351)
mcd ¿
Así que funciona para a, por lo tanto N es primo.
El algoritmo es sencillo. Se limita a realizar una serie de cálculos con aritmética
modular y comprobar el resultado. La contrapartida es que se necesita una factorización
parcial de n.
Test de Lucas-Lehmer:
En 1967, Brillhart, Lehmer y Selfridge hicieron más flexibles y potentes los test de las
proposiciones 1 y 2 de Lucas. Enunciaron el siguiente test:
La teoría para este test fue iniciada por Lucas en 1876 y convertida en algoritmo en
1930 por Lehmer.
Los números de Mersenne son los que tienen la forma: 2n-1.
Para que un número de Mersenne sea primo, el exponente n debe ser primo. Lo
contrario no es cierto, para la mayoría de exponentes primos, el número de Mersenne
correspondiente no es primo. En los últimos años los primos de Mersenne se han
buscado utilizando el test de Lucas-Lehmer:
Los números primos más grandes que se han encontrado son primos de Mersenne, esto
es debido a dos motivos:
1.- En notación binaria estos números se representan con una hilera de unos tan larga
como el exponente n, es decir, tienen una estructura muy simple.
2.- El test de Lucas-Lehmer permite certificar rápidamente la primalidad de estos
números.
El test de Lucas-Lehmer dice que para todo p primo impar (es decir, exceptuando el 2),
el número de Mersenne 2p-1 es primo si y solo si el resto de dividir Sp-1 entre 2p-1 es 0,
donde S1 = 4 y Sn+1 es el resultado de la congruencia (Sn2 - 2) mod (2p-1)
Por ejemplo, sea p = 5. El número de Mersenne M5 es: 25 -1 = 31
La serie correspondiente es: S1 = 4, S2 = 14, S3 = 194 (mod 31) = 8, S4 = 62, resto de
dividir 62 entre 31 = 0, luego 31 es primo. M5 es primo.
Los tests anteriores tienen una complejidad similar a la de los tests probabilísticos (en
concreto O(log3n)) y han permitido obtener los records, de primos conocidos. Así, el
primo número 38 de Mersenne.
Teorema. Para p un primo impar, el número de Mersenne2p− 1 es primo si y solo si 2p−
1 divide a Sp−1 donde S1 = 4 y Sn+1 = S2n − 2.
Solovay-Strassen(SS):
Otro test muy conocido y utilizado en criptografía es el test de Solovay-Strassen (SS).
El test de primalidad de Solovay-Strassen, que fue desarrollado por Robert M. Solovay
y Volker Strassen, es un algoritmo aleatorio para determinar si un número es un número
compuesto o es un número primo probable.
Este test está basado en el criterio de Euler que establece que si n es un número primo
impar, entonces a(n−1)/2 ≡( a
n )(mod n) para todos los enteros que satisfacen que el
mcd(a, n)=1, donde( an ) representa el símbolo de Jacobi definido por ( a
n )=∏j=1
k
( ap j
)e j
donde cada pj es un primo distinto, e j ∈N y ( ap j
) es el símbolo de Legendre definido
por
( cp )={
0 si p dividea c ,1 si c esresiduo
cuadraticomodulo p ,
−1de otromodo.
Se puede calcular si se cumple o no la congruencia
a(n−1)/2 ≡( an )(mod n)
para varios valores de a. Si es un número primo, entonces la congruencia es verdad para
todo a. Así, si se eligen valores de a aleatoriamente y se prueba la congruencia,
entonces, tan pronto como se encuentre un a que no cumple la congruencia, se sabe que
no es primero
Los valores de a que cumplen el criterio de Euler se 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.
Veamos a qué clase de complejidad pertenece:
Para toda entrada es polinomial en tiempo. Si el valor de entrada es primo entonces
siempre devuelve primo.
Si el valor de entrada es compuesto la probabilidad de darlo por primo es menor que
1/2k, donde k es el número de repeticiones.
Con lo cual concluimos que este algoritmo funciona para decidir si un número es
compuesto o no y es probable que puede dar por primos, números que en realidad son
compuestos.
El mayor problema de este algoritmo radica en la dificultad para implementar el cálculo
del símbolo de Legendre.
Algoritmo Test de Solovay-Strassen.
Este es el primer ejemplo que se propuso de algoritmo probabilista y se puede
considerar a Solovay y Strassen como los padres de dichos algoritmos.
Ejemplo: supongamos que deseamos determinar si n = 221 es primo. Escribimos
(n−1)/2=110. Seleccionamos aleatoriamente un a < n, en este caso a = 47. Calculamos
a(n−1)/2 mod n = 47110 mod 221 = −1 mod 221.
( an ) mod n = ( 47
221 ) mod 221 = −1 mod 221.
Esto da que, o bien 221 es primo, o 47 es un falseador de Euler para 221. Tratamos otro
al azar una, eligiendo esta vez a = 2
a(n−1)/2 mod n = 2110 mod 221 = 30 mod 221
( an )mod n = ( 2
221 )mod 221 = −1 mod 221.
Por lo tanto 2 es un verificador de Euler para la descomposición de 221, y 47 era en
realidad un mentiroso Euler.
Método de factorización rho de Pollard.
Un es algoritmo de factorización para determinar números primos, conocido como
método de factorización de Pollard Monte Carlo.
En el método de factorización por ensayo y error, probamos con todos los números
entre 2 y √ Npara hallar un factor de N. Si no lo hallamos, N es primo.
En vez de hacer estos ≈ √ N pasos, vamos a escoger una lista aleatoria de números, más
pequeña que √ N , y probar con ellos.
A menudo se construyen sucesiones seudo-aleatorias x0 , x1 , x2 ,…usando una iteración
de la forma x i+1=f (x i) (mod N), con x0 = random(0, N −1). Entonces {x0 , x1 , …}⊆Z N.
Por lo tanto los xi’s se empiezan a repetir en algún momento.
La idea es esta: Supongamos que ya calculamos la sucesión x0 , x1 , x2 ,… y que es
“suficientemente aleatoria”. Si p es un factor primo de N y si
{ x i≡ x j(mod p)xi ≢ x j(mod N )
Test es el Miller-Rabin
La idea del test se la debemos a Miller y la posterior mejora a Rabin (que transformó el
algoritmo en probabilista usando las ideas de Solovay y Strassen).
La idea detrás del algoritmo es la siguiente. Sabemos que si n es primo, Zn es un cuerpo
y por lo tanto x2 −1 tiene exactamente dos raíces, 1 y −1. Sin embargo esto no es cierto
cuando n es compuesto, es más, se puede comprobar que podrá tomar tantos valores
distintos como dos elevado al número de factores primos que posea.
Ahora bien, por el Teorema pequeño de Fermat sabemos que an−1≡1 mod n, con lo cual
an−1
2 es una raíz cuadrada de la unidad y por lo tanto sólo puede ser 1 o −1. Repitiendo el
proceso mientras tengamos factores pares, obtenemos una serie de valores que puede ser
o bien {1, 1,. . ., 1} o bien {1, 1,. . ., −1}. A los números con esta propiedad los
podemos llamar testigos y se puede probar que más de la mitad de los enteros entre 1 y
n cumplen dicha propiedad. Con lo cual probando con a = 1, 2,. . ., n/2 averiguaríamos
si efectivamente n es primo o compuesto.
A partir de esta idea surge el siguiente algoritmo determinista que certifica primalidad
Test determinista de Miller:
Sea n un entero positivo, tenemos s tal que 1< s < n, si n-1 = 2s·t, con s ≥ 0 y t un entero
positivo impar. Decimos que n pasa el test de Miller en la base b si b t ≡1mod n o bien
que b2j·t ≡−1 mod n para algún j, con 0 ≤ j ≤ s−1
La correctitud de este algoritmo está garantizada por la caracterización dada
anteriormente de los números primos, salvo por el pequeño detalle: sólo comprobamos
los primeros 2 log2(n) números. Esto se debe a que este algoritmo fue diseñado
suponiendo cierta la siguiente conjetura (la cual nos permite acotar la distancia entre
números primos y nos da cierta una idea de su distribución):
Conjetura: (Hipótesis de Riemann).
Definimos ζ(s) =∑n=1
∞1ns con s∈C\ {1} función zeta de Riemann.
∀ s∈C\ {1,-2,-4,…,-2k} tales que ζ(s) =0 ⇒Re (s )=1/2
Volviendo al algoritmo de Miller, la complejidad viene determinada por el bucle
anidado. En el peor caso realizamos en el bucle externo 2 log2(n) operaciones y en cada
una de ellas O(log2(n)) pues s es del orden O(log(n)) y mediante cuadratura iterada se
tarda del orden O(log n) en realizar cada potencia. Obtenemos por tanto un algoritmo de
orden O(log4(n)).
Ahora bien, supongamos que no nos creemos la hipótesis de Riemann, Rabin realizó
una pequeña modificación (usando las ideas de Solovay y Strassen como indicamos
anteriormente) en el algoritmo para convertirlo en probabilista.
Test es el Miller-Rabin (también conocido como test fuerte del pseudoprimo).
Como ya sabemos, el recíproco del teorema de Fermat no siempre es cierto. De éste
modo se pueden definir los pseudoprimos débiles, como aquellos que fallan para una
base en concreto en el recíproco del teorema de Fermat.
De forma similar, pero con otra congruencia, podemos definir el concepto de
pseudoprimo fuerte.
Test de primalidad que proporciona un algoritmo eficiente probabilístico para
determinar si un número dado es primo. Se basa en las propiedades de pseudoprimos
fuerte.
El test de (MR) es un test de primalidad, es decir, un algoritmo para determinar si un
número dado es primo, similar al test de primalidad de Fermat. Está basado en el
siguiente hecho: Si tenemos un número primo n y n − 1 = 2s r donde r es impar, se
cumple que ∀a∈N /mcd (a , n )=1, entonces o bien ar≡ 1(mod n) o bien
∃ j∈ ¿ (Orden de complejidad O(k × log3 n)).
Supóngase que n > 1 es un número impar del cual queremos saber si es primo o no. Sea
m un valor impar tal que n − 1 = 2k m y a un entero escogido aleatoriamente entre 2 y
n − 2.
Cuando se cumple
am≡ ±1 mod n
o bien
a2r m ≡−1 mod n
para al menos un r entero entre 1 y k−1, se considera que n es un probable primo; en
caso contrario n no puede ser primo. Si n es un probable primo se escoge un nuevo
valor para a, y se itera nuevamente reduciendo el margen de error probable. Al utilizar
exponenciación binaria las operaciones necesarias se realizan muy rápidamente.
Se puede demostrar que un número compuesto es clasificado "probable primo" en una
iteración del algoritmo con una probabilidad inferior a 1/4; de hecho, en la práctica la
probabilidad es mucho menor.
El algoritmo es de orden O(k log2(n)) = O(log2(n)) como vimos anteriormente.
Un comentario acerca de la probabilidad de error en estos algoritmos. Realizar 50
iteraciones del algoritmo de Miller-Rabin es algo plausible de llevar a cabo y
tendríamos que la probabilidad de errar sería 1/450 = 1/2100 una probabilidad muy
inferior a la de que caiga un meteorito y destroce el laboratorio donde se está realizando
el experimento. Pero es que incluso realizando “sólo” 20 iteraciones tenemos que la
probabilidad de error es 1/240 que es inferior a la probabilidad de que se produzca un
error de hardware que produzca un error de cálculo y haga fallar al algoritmo. Teniendo
en cuenta estas afirmaciones se ve claramente que hay que tener muy mala suerte para
que uno de estos algoritmos falle en la práctica.
Ejemplo: Supongamos que queremos determinar si n=221 es primo. Escribimos n-1 =220
como 22 · 55, de modo que tenemos s = 2 y d=55. Seleccionamos al azar a < n de 174.
Procedemos a calcular:
a20 · d mod n = 17455 mod 221 = 47 ≠ 1, n − 1
a21 · d mod n = 174110 mod 221 = 220 = n − 1.
Desde 220 ≡ −1 mod n, 221 es primo, o 174 es mentiroso fuerte para 221. Tomamos otro a,
esta vez escogemos a=137:
a20 · dmod n = 13755 mod 221 = 188 ≠ 1, n − 1
a21 · dmod n = 137110 mod 221 = 205 ≠ n − 1.
Por lo tanto 137 es un testigo de la descomposición de 221, y 174 en realidad era un mentiroso
fuerte.
Primalidad y Curvas Elípticas
El siguiente paso en el estudio de la primalidad consiste en sustituir los grupos cíclicos
o de Galois utilizados en anteriores certificados por otros grupos donde, tal vez, sea más
sencillo trabajar. Este es el caso de el grupo de puntos de una curva elíptica modulo n.
El proceso es el mismo que el utilizado para determinar la primalidad de un entero
cuando trabajábamos con grupos Z/(nZ)* y comprobábamos que existía un elemento de
orden n − 1 o que el cardinal era n − 1.
En éste caso utilizamos propiedades sobre el cardinal del grupo de puntos de una curva
elíptica módulo n cuando n es un número primo.
Debido al gran desarrollo que ha tenido el mundo de las curvas elípticas en los últimos
años, se disponen de bastantes propiedades y algoritmos relacionados con el propósito
que buscamos.
El algoritmo de Goldwasser-Kilian
Iniciamos la discusión con el siguiente teorema:
Teorema: Sea N un entero primo con 6 y E una curva elíptica sobre Z/(NZ), junto con
un punto P en E. Sean además dos enteros m y s tales que s | m.
Para cada divisor primo q de s, anotamos(mq )P=(xq : yq : zq) Asumimos que
mP = OE y que mcd ( zq , N )=1 ∀q . Entonces si p es un divisor de N, se cumple que:
# E(Z/ (pZ)) ≡0 (mod s).
En las condiciones del teorema anterior podemos, entonces formular que:
Proposición Certificado de Goldwasser-Kilian:
En las condiciones del teorema anterior, si s>(√√N+1 )2, entonces N es primo.
Entonces, combinando el teorema y la proposición anterior, con el algoritmo de Schoof
(permite que uno calcule el número de puntos en curva elíptica sobre un campo finito)
que computa # E(Z/ (pZ)) en tiempo O(( log p )8+e), obtenemos el algoritmo de
Goldwasser-Kilian:
ALGORITMO:
1. Escogemos una curva elíptica E sobre Z/(NZ), tal que el número de puntos m
(computados con el algoritmo de Schoof) satisfaga que m = 2q, con q un primo
probable(entero que ha pasado todos los pseudo test de primalidad).
2. Si (E, m) satisface las condiciones del teorema con s = m, entonces N es primo, en
caso contrario es compuesto.
3. La primalidad de q se prueba de la misma forma.
4. Final.
El algoritmo ECPP
El algoritmo anterior, sucesivamente vamos creando curvas y computamos su cardinal
hasta obtener una que realmente nos sirva para realizar el certificado. De hecho, lo que
hacemos es buscar una curva específica para el primo dado, es decir, que para cada
primo creamos un certificado específico.
En este algoritmo se hace justamente lo contrario, creamos una curva con el número de
puntos que necesitamos, sin necesidad de realizar prueba y error. En éste algoritmo,
debido a la complejidad que supone la aplicación del algoritmo de Schoof para primos
grandes, se cambia esa técnica por las propiedades derivadas de la multiplicación
compleja en las curvas elípticas.
Este método es muy utilizado actualmente. Se conjetura que tiene complejidad
polinomica de orden O((logN¿4+e) para todos los numero enteros, pero no está
totalmente probado, aunque se ha probado para la mayoría.
Test de primalidad AKS
Manindra Agrawal, Neeraj Kayal y Nitin Saxena publicaron en 2002, en su artículo
PRIMES is in P el primer certificado de primalidad cuya complejidad polinómica está
completamente probada, sin tener que recurrir a ninguna conjetura no probada.
presentaron un algoritmo determinista de clase P para la determinación de la primalidad
de un número.
La clave del nuevo algoritmo AKS está en la siguiente extensión del pequeño teorema
de Fermat: dados dos enteros a; N tales que mcd(a;N) = 1, entonces N es primo si y sólo
si
(x−a)N ≡ ( x N−a )(mod N )
Por tanto, dado N como entrada, para ejecutar un test de primalidad para
N escogemos a con mcd(a;N) = 1 y verificamos la ecuación. El cálculo de
(x−a)N, sin embargo, es exponencial (en logN) si hemos de probar todos las
a's posibles. Para superar este problema, los autores evalúan los dos lados de la ecuación
módulo un polinomio xr−a para un valor adecuado de r, es decir, calculan
(x−a)N ≡ ( x N−a ) (mod xr−a , N )¿.
En esta ultima ecuación, quiere decir que r es un número primo y que r - 1 tiene un
factor primo q grande que divide al orden de N (mod r). La existencia de un r con esta
propiedad está garantizada por resultados previos en teoría de números. Además, los
autores prueban que, para un N muy grande, un valor adecuado de r se puede conseguir
en el intervalo [c1(logN)6; c2(logN)6] para unas ciertas constantes positivas c1 y c2.
Por tanto, para ejecutar un test de primalidad para un N dado, el algoritmo
AKS consiste en dos iteraciones. En la primera, se selecciona un valor adecuado de r.
Comenzando en r = 2 e incrementando r en una unidad en cada paso, se comprueba que
mcd(r, N) = 1 (en otro caso N es compuesto), se comprueba que r es primo por
búsqueda exhaustiva (lo que supone comprobar O(logN)6 posibles factores), que el
factor más grande q, de r-1 satisface
q ≥4(log N)r1 /2 y que n(r−1)/q ≠ 1(mod r ). Una vez seleccionado el valor de r, el algoritmo
hace una segunda iteración que verifica la ecuación (**) para todos los valores de a
entre 1 y 4(log N)r1 /2 (la elección del rango en esta segunda iteración se hace por
razones técnicas en la demostración de la corrección del algoritmo). Si en cualquier
iteración la ecuación (**) deja de satisfacerse, entonces N es compuesto. Si no, N es
primo.
Los autores se las arreglaron para formular el siguiente algoritmo, que se ha probado
puede ejecutarse en un tiempo de complejidad máxima de
O ((log n¿¿12+ ϵ n).
Los autores demostraron además que si determinados números primos (llamados
Primosde 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.
Números primos y criptografía
El Teorema Fundamental de la Aritmética es un resultado de existencia. Nos dice que
para cada número existe una manera de escribirlo como producto de números primos
pero no nos dice cómo hacerlo. Si consideramos un número natural “pequeño”, digamos
3.780, podemos descomponerlo fácilmente en producto de primos haciendo divisiones
sencillas: 3.780 = 2 × 2 × 3 × 3 × 3 × 5 × 7.
Uno pensaría que esta operación, se puede hacer con cualquier número. Esto no es así ni
mucho menos. En general, encontrar los números primos que dividen a un número dado
es un problema muy difícil, y no sólo desde un punto de vista teórico, sino también
computacional. Es decir, que ni el ordenador más potente puede encontrar, en un tiempo
razonable, los divisores primos de un número un poco grande. Tanto es así que muchos
métodos de codificación de información usan este hecho.
Los primeros sistemas de transmisión de mensajes secretos se basaban en el intercambio
de una clave entre el emisor y el receptor con un contacto directo previo. Esto, en
comunicaciones a grandes distancias no era muy práctico ya que hacía necesario que
emisor y receptor se juntasen cada vez que motivos de seguridad obligaban a cambiar la
clave. En 1977, Rivest, Shamir y Adleman, científicos del MIT (Masachussests Institute
of Technology) en EEUU, idearon un esquema de cifrado de clave pública. Según este
método, llamado RSA por las iniciales de los apellidos de sus creadores, el receptor
hace público un número natural “grande”, del cual conoce su descomposición en
factores primos.
Lo anterior se basa en criptografía de clave pública. Cuya idea es cifrar un mensaje de
alguna manera, de forma que sea ilegible para el que no sepa descifrarlo. Para ello
necesitamos dos elementos básicos: un algoritmo de cifrado, y dos clave.
Este tipo de cifrado, es llamado cifrado asimétrico, en el que se utilizan dos claves
relacionadas, de forma que si se cifra con una, se debe descifrar con la otra, y viceversa.
Si mantenemos una de ellas secreta, y sólo entregamos la otra, cualquiera puede cifrar
mensajes que sólo yo puedo descifrar. Y al revés, si yo cifro un mensaje, cualquiera
puede descifrarlo, pero sabe que sólo yo he podido cifrarlo. Esto es lo que se conoce
como sistemas de clave pública: de la pareja de claves, una se distribuye libremente
(clave pública), y la otra se mantiene secreta (clave privada). Estos sistemas son
ampliamente utilizados en informática, tanto para cifrar mensajes como para firmarlos
digitalmente. En efecto, si yo cifro un mensaje con mi clave privada, existe la certeza de
que sólo yo he podido cifrar ese mensaje, por lo que es el equivalente a una firma.
¿Cómo se consigue esto? La criptografía asimétrica se basa en algoritmos no
reversibles, es decir, no tienen un algoritmo inverso. Además, tienen la peculiaridad de
que una pareja de claves se relaciona de la forma mencionada antes. Si cifro con una,
sólo puedo descifrar con la otra. Un punto fundamental es que la relación entre las
claves no es evidente, es decir, no se puede deducir la clave privada a partir de la clave
pública.
La base de todo este tinglado son los números primos. Supongo que todo el mundo
recuerda lo que es un número primo. Otra definición importante a tener en cuenta es la
de números coprimos. Bien, una vez recordadas estas nociones básicas de matemáticas,
vamos a explicar de forma sencilla uno de los algoritmos de cifrado asimétrico más
utilizados: RSA. La generación de la pareja de claves en RSA se hace de la siguiente
manera:
1. Buscamos dos números primos distintos (y bastante grandes), a los que
llamaremos p y q.
2. Obtenemos el producto de dichos números (p · q), al que llamaremos n. Es decir,
n = p·q.
3. Obtenemos el producto de los dos números primos menos uno, es decir (p-1) (q-
1), al que llamaremos z. Es decir, z = (p-1) · (q-1). Ésta es la llamada función φ
de Euler, y nos indica el número de todos los números coprimos con n, menores
o iguales que n.
4. Buscamos un número primo, menor que z, y coprimo con z, es decir, que no sea
factor de z, o dicho de otra manera, que z no sea múltiplo de ese número. A este
número lo llamaremos e. Tenemos por tanto que z no es divisible por e.
5. Buscamos un número, al que llamaremos d, tal que su producto con e, se pueda
dividir entre z, dando como resto 1. O dicho de otra manera, d·e - 1 es divisible
entre z.
Una vez hecho esto, resulta que estos números tienen unas propiedades muy
interesantes. Si escogemos un número cualquiera m, y realizamos la operación me mod
n (donde mod se refiere al resto de la división, es decir, calculo el resto de me/n),
obtengo un número, al que llamaremos c, que cumple lo siguiente: m=cd mod n. Es
decir, si utilizo e, como exponente, obtengo un número, al que si le aplico el mismo
algoritmo, pero con d como exponente, me da el número original. Así que ya tenemos
nuestra pareja de claves. El par (e, n) sería la clave pública, y el par (d, n) sería la clave
privada.
Hemos calculado e y d (las claves) a partir de z, pero este último número no lo
necesitamos para nada una vez calculadas las claves, y por tanto lo podemos borrar para
siempre (al igual que los números p y q). Si conociéramos z, podríamos deducir una
clave a partir de la otra, ya que eso es lo que hemos hecho durante la generación de
claves (primero generamos e, y luego d a partir de z y e). Y para obtener z, necesitamos
factorizar n (es decir, obtener los números primos que lo componen, p y q). Con nuestro
conocimiento actual de matemáticas, tenemos herramientas para saber si un número es
primo o no, sin necesidad de factorizarlo. Factorizar un número suficientemente grande,
puede llevar siglos aunque utilicemos los ordenadores más rápidos del mundo, mientras
que averiguar si un número del mismo tamaño es primo o no, se puede hacer en
segundos (o minutos).
Esto quiere decir que si encontramos una forma de factorizar números grandes en poco
tiempo, habremos descifrado el algoritmo RSA. O dicho de otra forma, para descifrar el
algoritmo, necesitamos encontrar nuevas técnicas de factorización de números. Es decir,
necesitamos conocimientos de matemáticas que, a día de hoy, nadie tiene. No importa
los conocimientos de informática que uno tenga, sino los conocimientos de
matemáticas. Otra posible forma de reventar el algoritmo sería desarrollando
supercomputadoras millones de veces más rápidas que las actuales, algo que de
momento no es posible con la actual tecnología de semiconductores de silicio (tal vez se
consiga con futuros ordenadores cuánticos).
Este número es usado por el emisor para cifrar sus mensajes. La idea es que aunque
todo el mundo tiene acceso a la clave pública y al mensaje cifrado, éste sólo pueden ser
descifrado si se conocen los números primos que dividen al número clave. Para que nos
hagamos una idea de qué significa “grande”, actualmente se considera segura una clave
pública dada por un número natural de más de 300 cifras. Por supuesto, a medida que
evolucionan las capacidades de los ordenadores, la idea de lo que es un número
“grande” va cambiando.
Estas aplicaciones de los números primos en el campo de la criptografía muestran cómo
las Matemáticas más abstractas pueden tener relación directa con actividades tan
mundanas como el uso de un cajero automático.
Conclusiones
Luego de realizar este trabajo llegamos a las siguientes conclusiones:
El aporte de los griegos a los números primos, ayudó enormemente para la creación de los criterios de primalidad.
El constante perfeccionamiento y mejora ha facilitado a compilar los mejores tests de primalidad.
Desde la Criba de Eratóstenes hasta el test de AKS, todos los criterios son efectivos para el cálculo de estos números primos.
Los criterios de primalidad ha permitido seguir formando la lista de los números primos.
Como señalamos en el trabajo, los criterios probabilísticos son tan efectivos como los criterios determinísticos.
El pequeño teorema de Fermat es considerado hoy en día la base de métodos de
verificación de números primos que se utilizan aún hoy en ordenadores
electrónicos.
En los últimos años los primos de Mersenne se han buscado utilizando el test de
Lucas-Lehmer y son los números primos más grandes que se han encontrado.
Los métodos de factorización también han contribuido a determinar los números primos.
A la hora de encontrar los números primos, el test de AKS es el criterio más efectivo para encontrarlos.
Los criterios señalados en este trabajo son empleados y es de gran ayuda en la criptografía.
Bibliografía
T.M. apostol, Introducción a la teoría analítica de números.
Alberto Rodríguez García, Certificados de Primalidad
José L. Bueso Montero, Números Perfectos Y Matemáticos Imperfectos.
Rocío Gutiérrez Bermejo, Historia De Las Matemáticas
Los Números Primos.
Equipo Torneo El Numero de Oro, Apuntes De Matemáticas Olímpicas, Santiago De Chile, 2008.
Páginas web:
http://ciencia.astroseti.org/matematicas/articulo.php?num=3492
http://es.wikilingue.com/ca/N
%C3%BAmero_primo#Teorema_de_Tchebychev
http://es.wikilingue.com/ca/Test_de_primalitat_de_Solovay-Strassen
http://en.wikipedia.org/wiki/Pocklington_primality_test
http://www.lorem-ipsum.es/blogs/hal9000/?p=35