1. COLEGIO NACIONAL “AMAZONAS”
PRUEBA DEL TERCER PARCIAL DE INFORMÁTICA
PROYECTO:
NUMEROS PRIMOS
NOMBRE:
DENNIS CORREA
CURSO:
5to CONTABILIDAD
SECCIÓN:
NOICTURNO
LIC. MONICA BARRAGÁN
AÑO LECTIVO: 2012-2013
2. Números primos
Un número primo es un número entero mayor que cero, que tiene exactamente
dos divisores positivos. También podemos definirlo como aquel número entero
positivo que no puede expresarse como producto de dos números enteros
positivos más pequeños que él, o bien, como producto de dos enteros positivos de
más de una forma. Conviene observar que con cualquiera de las dos definiciones
el 1 queda excluido del conjunto de los números primos.
Ejemplos: a) El 7 es primo. Sus únicos divisores son 1 y 7. Sólo puede
expresarse como producto de 7·1.
b) El 15 no es primo. Sus divisores son 1, 3, 5 y 15. Puede
expresarse como 3·5. (y también como 15·1)
El término primo no significa que sean parientes de alguien. Deriva del latín
"primus" que significa primero (protos en griego). El teorema fundamental de la
aritmética afirma que todo número entero se expresa de forma única como
producto de números primos. Por eso se les considera los "primeros", porque a
partir de ellos obtenemos todos los demás números enteros. (El 15 se obtiene
multiplicando los primos 3 y 5)
Los 25 primeros números primos son 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89 y 97, que son todos los primos
menores que 100.
En la siguiente tabla tenemos todos los primos menores que 1000, que hacen
un total de 168 (21×8)
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73
79 83 89 97 10
1
10
3
10
7
10
9
11
3
12
7
13
1
13
7
13
9
14
9
15
1
15
7
16
3
16
7
17
3
17
9
18
1
19
1
19
3
19
7
19
9
21
1
22
3
22
7
22
9
23
3
23
9
24
1
25
1
25
7
26
3
26
9
27
1
27
7
28
1
28
3
29
3
30
7
31
1
31
3
31
7
33
1
33
7
34
7
34
9
35
3
35
9
36
7
37
3
37
9
38
3
38
9
39
7
40
1
40
9
41
9
42
1
43
1
43
3
43
9
44
3
44
9
45
7
46
1
46
3
46
7
47
9
48
7
49
1
49
9
50
3
50
9
52
1
52
3
54
1
54
7
55
7
56
3
56
9
57
1
57
7
58
7
59
3
59
9
60
1
60
7
61
3
61
7
61
9
63
1
64
1
64
3
64
7
65
3
65
9
66
1
67
3
67
7
68
3
69
1
70
1
3. 70
9
71
9
72
7
73
3
73
9
74
3
75
1
75
7
76
1
76
9
77
3
78
7
79
7
80
9
81
1
82
1
82
3
82
7
82
9
83
9
85
3
85
7
85
9
86
3
87
7
88
1
88
3
88
7
90
7
91
1
91
9
92
9
93
7
94
1
94
7
95
3
96
7
97
1
97
7
98
3
99
1
99
7
Póster con los números primos hasta 1000 (pdf) Listado con los primos
menores que 1.000.000 (txt)
Para ver los 10.000 primeros números primos pincha aquí
Primos en el anillo de los enteros de Gauss
OBJETIVO
Cómo averiguar si un número es primo.
El algoritmo más sencillo que puede utilizarse para saber si un número n es
primo es el de la división. Se trata de ir probando para ver si tiene algún divisor
propio. Para ello vamos dividiendo el número n entre 2, 3, 4, 5, ... , n-1. Si alguna
de las divisiones es exacta (da resto cero) podemos asegurar que el número n es
compuesto. Si ninguna de estas divisiones es exacta, el número n es primo. Este
método puede hacerse más eficiente observando simplemente, que si un número
es compuesto alguno de sus factores (sin contar el 1) debe ser menor o igual que
√ n. Por lo tanto, el número de divisiones a realizar es mucho menor. Sólo hay
que dividir entre 2, 3, 4, 5, ... , [√ n]. En realidad, bastaría hacer las divisiones
entre los números primos menores o iguales que √ n.
Ejemplo: Para probar que 227 es primo sabiendo que √227 = 15'0665... basta
con ver que no es divisible entre 2, 3, 5, 7, 11 y 13.
Este procedimiento resulta eficiente para números pequeños o que tienen
factores pequeños. Sin embargo si el número tiene por ejemplo unas 20 cifras y
es primo, habrá que realizar miles de millones de divisiones para comprobarlo.
Aunque un ordenador pueda realizar millones de divisiones en un segundo, el
tiempo necesario es bastante considerable. Y cuando el número de dígitos
aumenta el tiempo necesario ¡¡crece de forma exponencial!!
Ejemplo práctico: Supongamos que queremos saber si un número de unas 50 cifras es primo. La raíz
cuadrada de un número de este orden está en torno a 1025
. Si un ordenador hace 1000 millones de divisiones
por segundo, necesitará 1025
/109
segundos; es decir, 1016
segundos. Este tiempo equivale, aproximadamente, a
1'6*1014
minutos, que son 2'7*1012
horas, o también 1'16*1011
días, aproximadamente 3'17*108
años. Que
4. para hacer esto se necesiten 317.097.920 años se me antoja una tarea poco recomendable. Y si nos
decidiésemos a llevarla a cabo, ¿sería útil esta información pasado todo este tiempo? O más drástico todavía,
¿seguiría existiendo nuestra especie entonces?
Debemos pues, buscar una alternativa que nos permita responder a este
problema de una forma más favorable; necesitamos un algoritmo más eficiente.
Una respuesta puede ser el teorema pequeño de Fermat. Este teorema afirma
que si n es primo y mcd(a,n) = 1, entonces an-1
≡ 1 (mod n). Hay que tener en
cuenta que la exponenciación modular puede realizarse en un tiempo bastante
favorable, si se hace de forma adecuada (hay algoritmos que nos dan la respuesta
en tiempo polinómico)
Ejemplo: Queremos comprobar si el número 15 es primo o no (utilizando esta
propiedad). Tomamos a = 2, n = 15, y evaluamos 214
(mod 15). La respuesta es
214
≡ 4 (mod 15). Podemos asegurar entonces que 15 es compuesto. Probemos
con a = 2, n = 341, evaluamos 2340
(mod 341) y obtenemos que 2340
≡ 1 (mod
341). Esto no nos permite deducir que 341 sea compuesto, pero tampoco que sea
primo. Al probar con a=3 tenemos 3340
≡ 56 (mod 341), lo cual implica que 341
es compuesto.
A los números que se comportan como el 341 en el ejemplo anterior se les
llama pseudoprimos para la base 2 (se comportan como un primo para a=2). Este
comportamiento es bastante más peculiar peculiar para algunos números.
Tomando por ejemplo a=2 y n=561, obtenemos que 2560
≡ 1 (mod 561), 3560
≡ 1
(mod 561), 5560
≡ 1 (mod 561) y así con todas las bases con las que probemos.
Es decir, se comporta como un primo para cualquier base que elijamos. Sin
embargo, 561 es compuesto (561 = 3·11·17). A los números que como éste, son
pseudoprimos para todas las bases se les llama números de Carmichael. Los
números de Carmichael menores que 100.000 son 561, 1105, 1729, 2465, 2821,
6601, 8911, 10585, 15841, 29341, 41041, 46657, 52633, 62745, 63973 y 75361.
Desde luego, no parecen muy abundantes. Los expertos se preguntaban en los
años 80 si serían un conjunto finito, con lo cual una vez identificados se podrían
"evitar" fácilmente, aunque la creencia generalizada apuntaba a que el conjunto
era infinito. Se demostró que si un número es de Carmichael debe ser libre de
cuadrados y producto de al menos tres primos distintos. En 1994, Alford,
Granville y Pomerance demostraron que existen infinitos números de
Carmichael. De hecho, su resultado indica que para n suficientemente grande
C(n) > n2/7
, donde C(n) es la cantidad de números de Carmichael menores que n.
Para evitar este contratiempo, podemos recurrir a un teorema un poco más fino
debido a Euler. Este resultado afirma que si n es primo y mcd (a,n)=1, entonces
5. a(n-1)/2
≡ ±1 (mod n). Con esto evitamos que algunos números compuestos puedan
pasar por primos como ocurre utilizando el teorema pequeño de Fermat.
Ejemplo: Para comprobar que 91 es compuesto basta ver 245
≡ 57 (mod 91). ¿Y
que pasa con un número de Carmichael como el 561?. Veamos 2280
≡ 1(mod
561), pero 5280
≡ 67 (mod 561). Parece que esto funciona.
Pero todavía podemos afinar un poco más. La idea es que si n es primo,
entonces Zn es un cuerpo. Y en un cuerpo las únicas raíces cuadradas de 1 son 1 y
-1. En el último ejemplo estamos diciendo que Z561 no es un cuerpo porque en él,
la raíz de 1 es 67, y por tanto 561 no es primo. Si tomamos n-1 y lo dividimos
entre 2 de forma sucesiva, mientras sea posible, estamos extrayendo raíces
cuadradas y se trata de comprobar si los resultados dan siempre 1 ó -1. Esto da
lugar al test de Miller-Rabin.
Ejemplo: Tomando n = 561 hacemos 2280
(mod 561) ≡ 1 , 2140
(mod 561) ≡ 67,
que continuaría con 270
y 235
, pero ya no es necesario calcularlos porque
tenemos que la raíz cuadrada de 1 es 67 (mod 561). Por tanto, 561 es compuesto.
Si al llegar a 235
no obtenemos un resultado distinto de +1 ó -1, tendríamos que
elegir otra base. Y ahí es donde podemos tener dificultades, porque si n es
bastante grande quizá tengamos que probar con muchas bases y la respuesta
tardará en llegar. Y podemos empezar a preguntarnos si la tardanza se debe a que
n es primo o porque es un compuesto que se comporta como un primo para un
conjunto "grande" de bases. ¿Qué debemos hacer entonces? La solución es
determinar el número de bases con las que tenemos que probar para asegurar que
un número compuesto no pase la prueba como si fuese primo.
Definiciones: Si un entero n compuesto e impar verifica la congruencia de Euler
para la base b, entonces n es un pseudoprimo de Euler para la base b. Asímismo,
si n pasa el test de Miller-Rabin para la base b, entonces n es un pseudoprimo
fuerte para la base b. Los siguientes resultados nos dan la respuesta a la cuestión
del párrafo anterior.
Proposición: Si n es compuesto e impar, al menos la mitad de las bases b que
verifican 0<b<n, no satisfacen la congruencia de Euler.
Teorema (Rabin): Si n es un entero compuesto impar, entonces n es un
pseudoprimo fuerte para la base b, para a lo sumo un 25% de las posibles bases
que verifican 0 < b < n, mcd(b,n) = 1.
6. Desde luego que el teorema anterior no es para tirar cohetes. Probar con un
25% de las bases es algo descomunal si n es un número grande. Sin embargo,
también hay que decir, que experimentalmente se ha comprobado que el test es
mucho más eficiente de lo que indica la acotación del 25%. Es decir, cuando el
número es compuesto, basta probar con unas pocas bases (la mayoría de veces
con una sola) para demostrar que el número es compuesto. Si probamos con
varias bases y nuestro número pasa el test, la probabilidad de que sea primo es
muy pequeña. Y se puede elegir el número de bases que queramos de manera que
la probabilidad sea menor que una cota prefijada de antemano.
Yendo un poco más lejos, hay un resultado de Miller basado en la hipótesis
generalizada de Riemann, que afirma lo siguiente:
Teorema (Miller, 1976): Si la hipótesis generalizada de Riemann es cierta y n es
un entero compuesto impar, entonces n no pasa el test de Miller-Rabin para
alguna base b < 2·log2
n (¿¿teorema de bach, aukemy, montgomery 1985??)
Este resultado implicaría un test de primalidad en tiempo polinómico del orden
de O(log5
n).
En la tabla de abajo podemos ver la cantidad de números de Carmichael y
pseudoprimos para la base 2. Por ejemplo, el primer 1 de la fila que comienza
con 103
indica que sólo hay un número de Carmichael menor que 1000, y el 3 que
sigue que hay 3 pseudoprimos para la base 2 menores que 1000.
( Nota: Los pseudoprimos de Euler también son llamados a veces pseudoprimos de Euler-Jacobi )
10n
Carmichael psprimos(2) pspEuler(2) pspFuerte(2)
101
0 0 0 0
102
0 0 0 0
103
1 3 1 0
104
7 22 12 5
105
16 78 36 16
106
43 245 114 46
107
105 750 375 162
108
255 2057 1071 488
109
646 5597 2939 1282
1010
1547 14884 7706 3291
1011
3605 38975 20417 8607
1012
8241 101629 53332 22407
7. 1013
19279 264239 124882 58892
Tabla 2: Pseudoprimos y números de Carmichael
Los primeros pseudoprimos para la base 2 son 341, 561, 645, 1105, 1387,
1729, 1905, 2047, 2465, 2701, ...
Los primeros pseudoprimos para la base 3 son 91, 121, 286, 671, 703, 949,
1105, 1541, 1729, 1891, 2821,...
Los primeros pseudoprimos para la base 5 son 4, 124, 217, 561, 781, 1541,
1729, 1891, ...
Los primeros pseudoprimos de Euler para la base 2 son 561, 1105, 1729, 1905,
2047, 2465, ...
Los primeros pseudoprimos de Euler para la base 3 son 121, 703, 1729, 1891,
2821, 3281, 7381, ...
Los primeros pseudoprimos fuertes para la base 2 son 2047, 3277, 4033, 4681,
8321, 15841, 29341, 42799, 49141, 52633, 65281, 74665, 80581, 85489, 88357,
90751, ...
Los primeros pseudoprimos fuertes para la base 3 son 121, 703, 1891, 3281,
8401, 8911, 10585, 12403, 16531, 18721, 19345, 23521, 31621, 44287, 47197,
55969, 63139, 74593, 79003, 82513, 87913, 88573, 97567, ...
Estos ejemplos nos permiten ver que si en lugar de la base 2 utilizamos las
bases 2 y 3, los números que pueden pasar el test siendo compuestos son muchos
menos. Y si tomamos más bases todavía, los resultados mejoran
considerablemente. Por ejemplo, sólo hay un pseudoprimo fuerte para las bases
2, 3, 5 y 7 menor que 25·109
, y este número es 3,215,031,751.
La sucesión de los números impares más pequeños que pasan el test de Miller-
Rabin usando los primeros k números primos para k = 1, 2, 3,... está dada por
2047, 1373653, 25326001, 3215031751, 2152302898747, 3474749660383,
341550071728321, 341550071728321, ... (Sloane A014233; Jaeschke 1993). Por
lo tanto, el test es totalmente determinista si usamos los siete primeros números
primos (con 8 no da ninguna mejora) para números menores menores de
3,4·10^14.
Lo que se hace en la práctica para números muy grandes es tomar una serie de
bases al azar y comprobar si se verifican las congruencias. Si no se verifica en
8. algún caso, el número es compuesto con total seguridad. Si se verifican todas,
hay una "sospecha" muy grande de que el número es primo, aunque no puede
asegurarse. La probabilidad de error puede hacerse tan pequeña como se quiera
con solo coger un número suficiente de bases.
Gracias a los trabajos de Pomerance, Selfridge y Wagstaff (1980) y Jaeschke
(1993) podemos elaborar tests de rápida ejecución y completamente
deterministas (usando Miller-Rabin) si consideramos números hasta un cierto
tamaño:
Para números menores que 25,326,001 basta probar con las bases 2,
3 y 5.
Para números menores que 4,759,123,141 basta probar con las
bases 2, 7 y 61.
Para números menores que 2,152,302,898,747 basta probar con las
bases 2, 3, 5, 7 y 11.
Para números menores que 341,550,071,728,321 basta probar con
las bases 2, 3, 5, 7, 11, 13 y 17.
En 1980, Adleman publica un artículo titulado "On distinguishing prime
numbers from composite numbers". Sus resultados son mejorados por
Pomerance, Rumely, Cohen, H.W. Lenstra y A.K. Lenstra. Esta trabajo conjunto
junto con el teorema que viene a continuación dan lugar a un test de primalidad
conocido como APR (hay más de una versión de este test)
Teorema (Odlyzko-Pomerance, 1982): Existe una constante c>0 efectivamente
computable tal que para todo n > ee
existe un entero positivo t que satisface:
i) t es libre de cuadrados.
ii) 0 < t < (log n)c·log(log(log n))
y tal que s(t) > √ n , donde s(t) = Π { q ∈ Z+
/ q
primo y q-1 divisor de t }
9. MARCO TEÓRICO
Cómo averiguar si un número es primo.Un número primo es un número entero mayor que
cero, que tiene exactamente dos divisores positivos.
También podemos definirlo como aquel número
entero positivo que no puede expresarse como
producto de dos números enteros positivos más
pequeños que él, o bien, como producto de dos
enteros positivos de más de una forma.
NUMEROS PRIMOS
Ejemplos: a) El 7 es primo. Sus únicos
divisores son 1 y 7. Sólo puede expresarse
como producto de 7·1.
Gracias a los trabajos de Pomerance, Selfridge y Wagstaff (1980) y
Jaeschke (1993) podemos elaborar tests de rápida ejecución y
completamente deterministas (usando Miller-Rabin) si
consideramos números hasta un cierto tamaño:
Para números menores que 25,326,001 basta probar con las bases 2,
3 y 5.
Para números menores que 4,759,123,141 basta probar con las bases
2, 7 y 61.
Ejemplo: Para probar que
227 es primo sabiendo que
√227 = 15'0665... basta con
ver que no es divisible entre
2, 3, 5, 7, 11 y 13.
El algoritmo más sencillo que
puede utilizarse para saber si un
número n es primo es el de la
división. Se trata de ir probando
para ver si tiene algún divisor
propio. Para ello vamos
dividiendo el número n entre 2,
3, 4, 5, ... , n-1. Si alguna de las
divisiones es exacta (da resto
cero) podemos asegurar que el
número n es compuesto.