You are on page 1of 9

UNIVERSIDAD AUT

ONOMA METROPOLITANA
MAESTR

IA EN CIENCIAS
MATEM

ATICAS APLICADAS E INDUSTRIALES


CRIPTOGRAFIA I
Algoritmos de factorizaci on
Alumna: Pe na Tellez Leticia.
16 de Julio del 2012.
Introducci on
La factorizacion de enteros consiste en descomponer un n umero compuesto
en divisores no triviales.
Por el teorema fundamental de la aritmetica, cada entero positivo tiene una
unica descomposicion en n umeros primos. La mayor parte de los algoritmos
de factorizacion elementales son de proposito general, es decir, permiten des-
componer cualquier n umero introducido, y solo se diferencian sustancialmente
en el tiempo de ejecucion.
1
Algunos algoritmos para factorizar est an especializados para que funcionen
muy bien cuando el entero n tiene alguna forma especial; estos son llamados
algoritmos de factorizacion de proposito especial. Ejemplos de algoritmos de
prop osito especial son el metodo de divisi on, el algoritmo de Pollard, el
algoritmo p 1 de Pollard, la factorizaci on por curvas elpticas, y la criba
especial de campos numericos. Los algoritmos que tienen una complejidad
que depende exclusivamente del tama no de n, por otro lado, son algoritmos
de factorizacion generales. Ejemplos de algoritmos de factorizacion generales
son la criba cuadr atica y la criba general de campos numericos.
Estrategia general para factorizar un n umero:
1. Buscar factores primos peque nos mediante division, con primos p < b
1
para alguna cota b
1
.
2. Despues, aplicar el algoritmo de Pollard, buscando factores primos p
con b
1
p < b
2
para alguna cota b
2
.
3. Utilizar el algoritmo de factorizacion con curvas elpticas para buscar
factores primos p, b
2
p < b
3
para alguna cota b
3
.
4. Finalmente, si todo lo anterior falla, aplicar un algoritmo general como
la criba cuadr atica o la criba de campos numericos.
Vamos a suponer que nos dan un entero compuesto impar positivo n, que no
es primo y no es una potencia perfecta.
Divisi on
Hacemos divisiones
n
p
i
con i = 1, 2, . . . , t, donde p
t

n y nos detenemos
si encontramos p
i
tal que n 0(modp
i
).
En el peor caso, la divisi on es un algoritmo costoso. Si se empieza en 2 y se
va subiendo hasta llegar a

n, el algoritmo requiere
(

n)
2

n
ln n
2
divisiones, donde (x) = {q N : es primo y q x.
Este algoritmo es r apido para encontrar factores peque nos de n.
Algoritmo de factorizacion de Pollard
Este algoritmo es bueno para encontrar factores primos peque nos de enteros
que sean compuestos. Fue inventado por John Pollard en 1975.
Sea f : S S una funci on arbitraria de un conjunto de tama no n. Sea
x
0
S, y denimos x
i+1
= f(x
i
). En alg un momento la sucesi on se repite, es
decir se tiene x
i
= x
j
para i = j, y son i, j lo que estamos buscando.
El algoritmo de Pollard busca repeticiones con x
0
= 2, x
i+1
= x
i
2
+1(modp),
donde p es un factor primo de n. Si logramos encontrar x
i
x
j
(modp),
entonces p|(x
i
x
j
, n).
Pero como no conocemos los factores primos de n, lo que hacemos es calcular
x
i+1
x
i
2
+ 1(modn), y calculamos (x
i
x
j
, n) en cada paso.
Si 1 < (x
i
x
2i
, n) < n, entonces hemos encontrado un factor propio de
n y terminamos.
Si (x
i
x
2i
, n) = n, entonces pasamos a x
i+1
y x
2i+2
, y repetimos.
Si (x
i
x
2i
, n) = n, entonces terminamos con fracaso. La probabilidad es
baja, pero si el algoritmo termina con fracaso, podemos tratar de nuevo
con una nueva funcion, por ejemplo f(x) = x
2
+ c, con c = 0, 2.
Ejemplo 0.1 Consideremos n = 385513, empezemos con x
0
= 2; luego
tenemos los siguientes valores donde x
i+1
x
i
2
+ 1(mod385513) y d =
(x
i
x
2i
, 385513)
3
i x
i
x
2i
d
1 5 26 1
2 26 72817 1
3 677 139866 1
4 72817 61930 1
5 355201 103477 1
5 139866 72122 73
Por lo tanto un factor no trivial de n = 385513 es 73.
El algoritmo de Pollard encuentra un factor primo p de n en aproxima-
damente

p operaciones. Por lo tanto si n es compuesto, podemos esperar
que este algoritmo encuentre los factores primos de n en O(n
1
4
) operaciones
modulares, pues como n es compuesto tiene al menos un factor p primo tal
que p <

n, y para encontrar este factor necesitamos

p operaciones, por lo
que para encontrar p necesitamos aproximadamente

p < n
1
4
operaciones.
El algoritmo de Pollard hecho en Mathematica es:
f[x_, n_] := Mod[PowerMod[x, 2, n] + 1, n];
RhodePollard[n_] := Module[{x, y, d},
x = 2;
y = 2;
d = 1;
While[d == 1,
x = f[x, n];
y = f[f[y, n], n];
d = GCD[Abs[x - y], n];];
If[d == n, Print["FRACASO"];,
Print["Un factor de ", n, " es: ", d]];]
Algoritmo p 1 de Pollard
Antes de explicar el algoritmo p 1 de Pollard, veamos las siguientes deni-
ciones:
4
Denici on: Sea B > 0 un entero positivo. Decimos que n es B-homogeneo
B-liso si y solo si para todo n umero primo p, si p|n, entonces p < B.
Denici on: Decimos informalmente que un entero n es homogeneo si es
B-homogeneo para alguna B sucientemente chica.
El algoritmo p 1 de Pollard se usa para encontrar de manera eciente un
factor primo p de un entero compuesto n, con la propiedad de que p 1 es
homogeneo con respecto a alguna cota B relativamente peque na.
La idea detr as del algoritmo es la siguiente: sea Q el mnimo com un m ultiplo
de todos los n umeros p
a
, donde:
1. p es primo, a > 0.
2. p B.
3. p
a
n.
Si p
a
n, entonces alog(p) log(n), y por lo tanto,
a

log(n)
log(p)

Es decir, tenemos que


Q =

qB
qprimo
q

log(n)
log(p)

Sea entonces p un factor primo de n, tal que p1 es B-homogeneo. Entonces


p 1|Q. Si a es tal que (a, p) = 1, entonces tenemos que a
p1
1(modp),
por el Peque no Teorema de Fermat, y por lo tanto, que a
Q
1(modp). Sea
entonces d = (a
Q
1, n). Puesto que p divide a ambos terminos, p|d y esto
nos da un factor d > 1 de n.
Es posible que d = n, y entonces el algoritmo termina con fracaso. Pero eso
casi no sucede si n tiene al menos dos factores primos que sean grandes
comparados con B, de manera que el algoritmo es eciente si ya descartamos
5
la posibilidad de que n sea B-homogeneo (usando, por ejemplo, division y el
algoritmo de Pollard).
El algoritmo, explcitamente, es el siguiente: primero, elegimos una cota B
de homogeneidad.
Despues escogemos a, 2 a n 1, de manera arbitraria, y calculamos
d = (a, n).
Si d 2, entonces d es un factor propio de n, y hemos terminado. Si d = 1,
entonces para cada primo q B, calculamos
q
=

log(n)
log(q)

, y luego tomamos
Q =

qB
qprimo
q

q
= a
Q
Finalmente, calculamos d = ( 1, n).Si d = 1 o d = n, terminamos el
algoritmo con fracaso. Si 1 < d < n, entonces d es un factor propio de n.
Si n tiene un factor primo p tal que p 1 es B-homogeneo tenemos que para
encontrar los primos menores o iguales a B, que son
B
log(B)
, por lo que para
obtener Q necesitamos
B
log(B)
multiplicaciones, y para calcular a
Q
(modn) y
terminar el algoritmo necesitamos O

Blog(n)
log(B)

multiplicaciones modulares.
En la pr actica se suele elegir B con 10
5
B 10
6
.
Si el algoritmo termina en fracaso con d = 1, entonces podemos buscar pri-
mos q
1
, q
2
, . . . , q
r
mayores que B, tomando y elevando a la q
i
para cada i
sucesivamente, y al nal calcular nuevamente el maximo com un divisor del
resultado menos uno, y n.
Ejemplo 0.2 Consideremos n = 578141, B = 29 y a = 6. Tenemos que
(6, n) = 1.
Los valores de q y
q
estan en la siguiente tabla:
6
q
q
2 19
3 12
5 8
7 6
11 5
13 5
17 4
19 4
23 4
29 3
De aqu Q = 42857, y as a
Q
140533(modn); por lo que (1405331, 578141) =
239.
Por lo tanto 239 es un factor de primo de n.
El algoritmo p 1 de Pollard hecho en Mathematica es:
P1Pollard[n_, B_] := Module[{q, a, al, lq, g},
q = {2};
a = 2;
For[i = 1, i < PrimePi[B],
a = NextPrime[a];
q = Append[q, a]; i++];
lq = q;
For[i = 1, i <= PrimePi[B],
lq[[i]] = Floor[Log[n]/Log[q[[i]]]];
i++];
Q = 1;
For[i = 1, i <= PrimePi[B],
a1 = q[[i]];
b1 = lq[[i]];
Q = Mod[Q*Power[a1, b1], n];
i++];
al = 2;
7
While[al < n,
c1 = PowerMod[al, Q, n];
g = GCD[c1 - 1, n];
If[g == 1, al += al;, Print["Un factor de ", n, " es: ", g];
al = n];];
If[g == 1, Print["FRACASO"];];]
Metodo de diferencia de cuadrados de Fermat
Si podemos expresar n como una diferencia de cuadrados, n = a
2
b
2
, en-
tonces n = (a + b)(a b). Siempre y cuando a b = 1, eso nos da una
descomposici on no trivial de n (asumimos que tanto a como b son enteros
positivos, de manera que a + b nunca vale 1).
En general, si n = ab, con 1 < b < a < n, entonces podemos escribir
ab =

1
2
(a + b)

1
2
(a b)

2
lo cual se puede hacer pues estamos suponiendo que n es impar, por lo que
a, b son impares y as a +b, a b son pares. Eso nos da una factorizacion con
factores propios como diferencia de cuadrados. Es decir. si podemos expresar
n como una diferencia de cuadrados, n = a
2
b
2
, con a b > 1, entonces de
esta diferencia podemos encontrar factores propios de n, entonces es posible
utilizarlos para encontrar una expresi on de n como diferencia de cuadrados.
El metodo de Fermat es entonces buscar cuadrados u y v tales que n = u
2
v
2
;
para ello, tomamos u =

n, y vemos si u
2
n es un cuadrado; si lo es, ya
terminamos; si no lo es, sumamos 1 a u y volvemos a tratar. Continuamos
hasta encontrar la diferencia de cuadrados que nos da una descomposici on
no trivial de n.
Ejemplo 0.3 Consideremos n = 119, y

119 = 10,9; por lo que u = 11


8
u u
2
n

u
2
n
11 2

2
12 25 5
As n = 12
2
5
2
, por lo que n = (12 + 5)(12 5) = (17)(7)
Por lo tanto los factores no triviales de n = 119 son 7 y 17.
La idea fundamental del metodo de Fermat es la base de la criba cuadr atica
y la criba generalizada sobre el cuerpo de los n umeros, los algoritmos mejor
conocidos para la factorizaci on de semiprimos grandes ((en el peor de los
casos)). La principal mejora de la criba cuadratica sobre la factorizacion de
Fermat es que, en lugar de buscar un cuadrado en la sucesi on de u
2
n, lo que
hace es hallar un subconjunto de elementos de esta sucesion cuyo producto es
un cuadrado, y lo hace de forma muy eciente. El resultado nal es el mismo:
una diferencia de cuadrados modn que, si no es trivial, puede emplearse para
factorizar n.
9