Documentos de Académico
Documentos de Profesional
Documentos de Cultura
3-Divide y Venceras
3-Divide y Venceras
1
Divide y vencers
v Introduccin 2
v La bsqueda dicotmica 8
v La ordenacin por fusin 13
v El algoritmo de ordenacin
de Hoare 15
v Algoritmos de seleccin y
de bsqueda de la mediana 18
v Multiplicacin de enteros grandes 22
v Potenciacin de enteros 29
v Introduccin a la criptografa 36
v Multiplicacin de matrices 47
v Calendario de un campeonato 52
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 2
El esquema divide y vencers:
Introduccin
v Tcnica de diseo de algoritmos
divide y vencers:
descomponer el ejemplar a resolver en un cierto
nmero de subejemplares ms pequeos del
mismo problema;
resolver independientemente cada subejemplar;
combinar los resultados obtenidos para construir
la solucin del ejemplar original.
aplicar esta tcnica recursivamente
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 3
v Esquema genrico:
v Si k=1, el esquema anterior se llama
tcnica de reduccin.
funcin divide_y_vencers(x:tx) devuelve ty
variables x
1
,,x
k
:tx; y
1
,,y
k
:ty
principio
si x es suficientemente simple
entonces devuelve solucin_simple(x)
sino
descomponer x en x
1
,,x
k
;
para i:=1 hasta k hacer
y
i
:=divide_y_vencers(x
i
)
fpara;
devuelve combinar(y
1
,,y
k
)
fsi
fin
funcin divide_y_vencers(x:tx) devuelve ty
variables x
1
,,x
k
:tx; y
1
,,y
k
:ty
principio
si x es suficientemente simple
entonces devuelve solucin_simple(x)
sino
descomponer x en x
1
,,x
k
;
para i:=1 hasta k hacer
y
i
:=divide_y_vencers(x
i
)
fpara;
devuelve combinar(y
1
,,y
k
)
fsi
fin
El esquema divide y vencers:
Introduccin
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 4
v Sobre el coste computacional:
Sea un algoritmo A que emplea un tiempo
cuadrtico.
Sea c una constante tal que una implementacin
particular de A emplea un tiempo
para un ejemplar de tamao n.
Supongamos que A se puede descomponer en
tres subejemplares de tamao n/ 2], resolverlos
y combinar su resultados para resolver A.
Sea d una constante tal que el tiempo empleado
en la descomposicin y combinacin es t(n)dn.
t
A
(n)cn
2
El esquema divide y vencers:
Introduccin
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 5
La utilizacin de esta particin da lugar a un
nuevo algoritmo B con un tiempo:
Luego B es un 25% ms rpido que A.
Si se aplica a B la misma tcnica de descomposi-
cin se obtiene un algoritmo C con tiempo:
Donde t
A
(n) es el tiempo del algoritmo simple, n
0
es el umbral por encima del cual el algoritmo se
usa recursivamente y t(n) el tiempo de la
descomposicin y combinacin.
La solucin de la ecuacin en recurrencias da un
tiempo para el algoritmo C de n
log 3
n
1,59
.
t
C
(n)
t
A
(n) si n n
0
3t
C
n / 2
]
( )
+t (n) en otro caso
'
t
B
(n) 3t
A
n / 2
]
( )
+t (n)
3c
n +1
2
|
.
`
,
2
+dn
3
4
cn
2
+
3
2
c +d
|
.
`
,
n +
3
4
c
El esquema divide y vencers:
Introduccin
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 6
v Recordar
una de las ecuaciones en recurrencias
especialmente til para el anlisis de
algoritmos de divide y vencers:
La solucin de la ecuacin
T(n) = aT(n/ b) + (n
k
log
p
n)
con a1, b>1, p0 es
El esquema divide y vencers:
Introduccin
T (n)
O(n
log
b
a
), si a> b
k
O(n
k
log
p+ 1
n) , si a b
k
O(n
k
log
p
n) , si a< b
k
'
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 7
v Sobre el clculo del umbral ptimo:
Es un problema complejo.
Para un mismo problema, vara con la imple-
mentacin concreta y vara con el valor de n.
Puede estimarse empricamente (tablas,)...
... o tericamente: calculando el n para el que la
solucin recursiva y la solucin simple tienen
igual coste; por ejemplo, si t
A
(n)=n
2
y t(n)=16n:
da un valor de n
0
64 (ignorando los redondeos).
t
A
(n) 3t
A
( n / 2
]
) + t (n)
El esquema divide y vencers:
Introduccin
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 8
La bsqueda dicotmica
v Problema:
Dado T[1..n] vector ordenado crecientemente y
dado x, encontrar x en T, si es que est.
Formalmente: encontrar un natural i tal que
0in y T[i]x<T[i+1], con el convenio de que
T[0]=- y T[n+1]=+ (centinelas).
Solucin secuencial evidente:
funcin secuencial(T:vector[1..n]de dato;
x:dato) devuelve 0..n
variables i:0..n+1; b:booleano
principio
i:=1; b:=falso;
mq (in) and not b hacer
si T[i]>x
entonces b:=verdad
sino i:=i+1
fsi
fmq;
devuelve i-1
fin
funcin secuencial(T:vector[1..n]de dato;
x:dato) devuelve 0..n
variables i:0..n+1; b:booleano
principio
i:=1; b:=falso;
mq (in) and not b hacer
si T[i]>x
entonces b:=verdad
sino i:=i+1
fsi
fmq;
devuelve i-1
fin
Coste caso promedio y caso peor: (n)
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 9
v Bsqueda dicotmica (algoritmo de
reduccin, puesto que k=1):
La bsqueda dicotmica
funcin dicotmica(T:vector[1..n]de dato;
x:dato) devuelve 0..n
principio
si (n=0) or (x<T[1]) entonces devuelve 0
sino devuelve dicotRec(T,1,n,x)
fsi
fin
funcin dicotmica(T:vector[1..n]de dato;
x:dato) devuelve 0..n
principio
si (n=0) or (x<T[1]) entonces devuelve 0
sino devuelve dicotRec(T,1,n,x)
fsi
fin
funcin dicotRec(T:vector[1..n]de dato;
i,d:1..n;
x:dato) devuelve 1..n
{bsqueda dicotmica de x en T[i..d];
se supone que T[i]x<T[d+1] e id}
variable k:1..n
principio
si i=d entonces devuelve i
sino
k:=(i+d+1) div 2;
si x<T[k]
ent devuelve dicotRec(T,i,k-1,x)
sino devuelve dicotRec(T,k,d,x)
fsi
fsi
fin
funcin dicotRec(T:vector[1..n]de dato;
i,d:1..n;
x:dato) devuelve 1..n
{bsqueda dicotmica de x en T[i..d];
se supone que T[i]x<T[d+1] e id}
variable k:1..n
principio
si i=d entonces devuelve i
sino
k:=(i+d+1) div 2;
si x<T[k]
ent devuelve dicotRec(T,i,k-1,x)
sino devuelve dicotRec(T,k,d,x)
fsi
fsi
fin
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 10
v Versin iterativa:
La bsqueda dicotmica
funcin dicotIter(T:vector[1..n]de dato;
x:dato) devuelve 0..n
variables i,d,k:1..n
principio
si (n=0) or (x<T[1])
entonces devuelve 0
sino
i:=1; d:=n;
mq i<d hacer
{T[i]x<T[d+1]}
k:=(i+d+1) div 2;
si x<T[k]
entonces d:=k-1
sino i:=k
fsi
fmq;
devuelve i
fsi
fin
funcin dicotIter(T:vector[1..n]de dato;
x:dato) devuelve 0..n
variables i,d,k:1..n
principio
si (n=0) or (x<T[1])
entonces devuelve 0
sino
i:=1; d:=n;
mq i<d hacer
{T[i]x<T[d+1]}
k:=(i+d+1) div 2;
si x<T[k]
entonces d:=k-1
sino i:=k
fsi
fmq;
devuelve i
fsi
fin
Coste: (log n), en todos los casos.
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 11
v Mejora aparente:
La bsqueda dicotmica
funcin dicotIter2(T:vector[1..n]de dato;
x:dato) devuelve 0..n
variable i,d,k:1..n
principio
si (n=0) or (x<T[1])
entonces devuelve 0
sino
i:=1; d:=n;
mq i<d hacer
{T[i]x<T[d+1]}
k:=(i+d) div 2;
si x<T[k]
entonces d:=k-1
sino
si xT[k+1]
entonces i:=k+1
sino i:=k; d:=k
fsi
fsi
fmq;
devuelve i
fsi
fin
funcin dicotIter2(T:vector[1..n]de dato;
x:dato) devuelve 0..n
variable i,d,k:1..n
principio
si (n=0) or (x<T[1])
entonces devuelve 0
sino
i:=1; d:=n;
mq i<d hacer
{T[i]x<T[d+1]}
k:=(i+d) div 2;
si x<T[k]
entonces d:=k-1
sino
si xT[k+1]
entonces i:=k+1
sino i:=k; d:=k
fsi
fsi
fmq;
devuelve i
fsi
fin
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 12
v La mejora es slo aparente:
el primer algoritmo realiza siempre (log n)
iteraciones mientras que el segundo puede parar
antes;
clculo del nmero medio de iteraciones
suponiendo que:
u todos los elementos de T son distintos,
u x est en T,
u cada posicin tiene igual probabilidad de
contener a x
[BB90, pp. 116-119]
Es decir, el primer algoritmo realiza, en media,
una iteracin y media ms que el segundo.
Pero, cada iteracin del segundo es ligeramente
ms costosa que la del primero.
Son difcilmente comparables.
Si n es suficientemente grande, el primer
algoritmo es mejor que el segundo.
La bsqueda dicotmica
Iter
1
(n) Iter
2
(n) +
3
2
'
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 13
La ordenacin por fusin
v Dado un vector T[1..n] de n elementos
dotados de una relacin de orden total,
se trata de ordenar de forma creciente
esos elementos.
v Tcnica de divide y vencers ms
sencilla:
dividir el vector en dos mitades;
ordenar esas dos mitades recursivamente;
fusionarlas en un solo vector ordenado.
algoritmo ordFusin(e/s T:vect[1..n]de dato)
variables U:vect[1..(n div 2)]de dato;
V:vect[1..((n+1) div 2)]de dato
principio
si n es pequeo
entonces ordInsercin(T)
sino
U:=T[1..(n div 2)];
V:=T[(n div 2 + 1)..n];
ordFusin(U);
ordFusin(V);
fusin(T,U,V)
fsi
fin
algoritmo ordFusin(e/s T:vect[1..n]de dato)
variables U:vect[1..(n div 2)]de dato;
V:vect[1..((n+1) div 2)]de dato
principio
si n es pequeo
entonces ordInsercin(T)
sino
U:=T[1..(n div 2)];
V:=T[(n div 2 + 1)..n];
ordFusin(U);
ordFusin(V);
fusin(T,U,V)
fsi
fin
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 14
v Coste de ejecucin:
la descomposicin de T en U y V precisa un
tiempo lineal;
la fusin de U y V tambin necesita un tiempo
lineal;
por tanto, si t(n) es el tiempo de ejecucin del
algoritmo para ordenar n elementos,
es decir, t(n)(nlog n)
v Adems:
La fusin de T[1..k] y T[k+1..n] (ya ordenados) en
el mismo T[1..n] puede hacerse en tiempo lineal
utilizando slo una cantidad fija de variables
auxiliares (independiente de n).
Ejercicio (vase la solucin del ejercicio 18 de la
seccin 5.2.4 de [Knu73]).
La ordenacin por fusin
t (n) t n / 2
]
( )
+t n / 2
]
( )
+ (n)
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 15
El algoritmo de ordenacin de
Hoare
C.A.R. Hoare: Quick s ort,
Computer Journal, 5(1), pp. 10-15, 1962.
algoritmo ordRpida(e/s T:vect[1..n]de dato;
ent iz,de:1..n)
{Ordenacin de las componentes iz..de de T.}
variable me:1..n
principio
si de-iz es pequeo
entonces ordInsercin(T,iz,de)
sino
divide(T,iz,de,me);
{izk<meT[k]T[me] me<kdeT[k]>T[me]}
ordRpida(T,iz,me-1);
ordRpida(T,me+1,de)
fsi
fin
algoritmo ordRpida(e/s T:vect[1..n]de dato;
ent iz,de:1..n)
{Ordenacin de las componentes iz..de de T.}
variable me:1..n
principio
si de-iz es pequeo
entonces ordInsercin(T,iz,de)
sino
divide(T,iz,de,me);
{izk<meT[k]T[me] me<kdeT[k]>T[me]}
ordRpida(T,iz,me-1);
ordRpida(T,me+1,de)
fsi
fin
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 16
El algoritmo de ordenacin de
Hoare
algoritmo divide(e/s T:vect[1..n]de dato;
ent iz,de:1..n;
sal me:1..n)
{Permuta los elementos iz..de de T de forma que:
izmede,
k t.q. izk<me: T[k]p,
T[me]=p,
k t.q. me<kde: T[k]>p,
p se llama pivote y es, por ejemplo, el valor
inicial de T[iz]. }
variables p:dato; k:1..n
principio
p:=T[iz];
k:=iz; me:=de+1;
repetir k:=k+1 hasta que (T[k]>p)or(kde);
repetir me:=me-1 hasta que (T[me]p);
mq k<me hacer
intercambiar(T[k],T[me]);
repetir k:=k+1 hasta que T[k]>p;
repetir me:=me-1 hasta que T[me]p
fmq;
intercambiar(T[iz],T[me])
fin
algoritmo divide(e/s T:vect[1..n]de dato;
ent iz,de:1..n;
sal me:1..n)
{Permuta los elementos iz..de de T de forma que:
izmede,
k t.q. izk<me: T[k]p,
T[me]=p,
k t.q. me<kde: T[k]>p,
p se llama pivote y es, por ejemplo, el valor
inicial de T[iz]. }
variables p:dato; k:1..n
principio
p:=T[iz];
k:=iz; me:=de+1;
repetir k:=k+1 hasta que (T[k]>p)or(kde);
repetir me:=me-1 hasta que (T[me]p);
mq k<me hacer
intercambiar(T[k],T[me]);
repetir k:=k+1 hasta que T[k]>p;
repetir me:=me-1 hasta que T[me]p
fmq;
intercambiar(T[iz],T[me])
fin
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 17
v Coste en el peor caso: cuadrtico
(si la eleccin del pivote no es adecuada, los
subejemplares no tienen tamao parecido)
v Tiempo medio: O(nlog n)
Dem.: [BB90, pp. 123-124]
(la constante multiplicativa es menor que en los
otros algoritmos de ordenacin que hemos visto)
El algoritmo de ordenacin de
Hoare
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 18
Algoritmos de seleccin y de
bsqueda de la mediana
v Dado un vector T[1..n] de enteros, la
mediana de T es un elemento m de T
que tiene tantos elementos menores
como mayores que l en T:
(ntese que la definicin formal es ms general:
n puede ser par y adems puede haber elementos
repetidos, incluidaPrimera solucin:
Ordenar T y extraer el elemento n/ 2]-simo.
Tiempo (nlog n).
i [1.. n] | T[i ] < m
{
< n / 2, y
i [1..n] | T[i ] > m
{
n / 2
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 19
v Problema ms general: la seleccin
(o clculo de los estadsticos de orden).
Dado un vector T de n elementos y
1kn, el k-simo menor elemento de T
es aquel elemento m de T que satisface:
Es decir, el elemento en posicin k si T estuviese
ordenado crecientemente.
v Por tanto, la mediana de T es el
n/ 2]-simo menor elemento de T.
v Solucin del problema: inspirada en el
algoritmo de ordenacin de Hoare
(pero ahora slo se resuelve uno de los
subejemplares).
Algoritmos de seleccin y de
bsqueda de la mediana
i [1..n] | T[i ]< m
{
< k , y
i [1..n] | T[i ] m
{
k
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 20
Algoritmos de seleccin y de
bsqueda de la mediana
funcin seleccionar(T:vector[1..n]de dato;
k:1..n) devuelve dato
principio
devuelve selRec(T,1,n,k)
fin
funcin seleccionar(T:vector[1..n]de dato;
k:1..n) devuelve dato
principio
devuelve selRec(T,1,n,k)
fin
funcin selRec(T:vector[1..n]de dato;
i,d,k:1..n) devuelve dato
principio
si d-i es pequeo entonces
ordInsercin(T,i,d); devuelve T[k]
sino
divide(T,i,d,m);
si m-i+1k
entonces selRec(T,i,m,k)
sino selRec(T,m+1,d,k-(m-i+1))
fsi
fsi
fin
funcin selRec(T:vector[1..n]de dato;
i,d,k:1..n) devuelve dato
principio
si d-i es pequeo entonces
ordInsercin(T,i,d); devuelve T[k]
sino
divide(T,i,d,m);
si m-i+1k
entonces selRec(T,i,m,k)
sino selRec(T,m+1,d,k-(m-i+1))
fsi
fsi
fin
algoritmo divide(e/s T:vect[1..n]de dato;
ent i,d:1..n; sal m:1..n)
{Permuta los elementos i..d de T de forma que:
imd; k t.q. ik<m: T[k]p; T[m]=p;
k t.q. m<kd: T[k]>p;
p es, por ejemplo, el valor inicial de T[i]. }
algoritmo divide(e/s T:vect[1..n]de dato;
ent i,d:1..n; sal m:1..n)
{Permuta los elementos i..d de T de forma que:
imd; k t.q. ik<m: T[k]p; T[m]=p;
k t.q. m<kd: T[k]>p;
p es, por ejemplo, el valor inicial de T[i]. }
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 21
v Como en el mtodo de ordenacin de
Hoare, una eleccin desafortunada del
pivote conduce en el caso peor a un
tiempo cuadrtico.
v No obstante, el coste promedio es
lineal .
v Existe una mejora que permite un coste
lineal tambin en el peor caso, pero, en
la prctica, se comporta mejor el
algoritmo anterior [CLR90].
Algoritmos de seleccin y de
bsqueda de la mediana
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 22
Multiplicacin de enteros
grandes
v Coste de realizar las operaciones
elementales de suma y multiplicacin:
Es razonable considerarlo constante si los
operandos son directamente manipulables por el
hardware, es decir, no son muy grandes.
Si se necesitan enteros muy grandes, hay que
implementar por software las operaciones.
v Enteros muy grandes:
Representacin de un entero de n cifras: puede
hacerse en un vector con un espacio en O(n) bits.
Operaciones de suma, resta: pueden hacerse en
tiempo lineal.
Operaciones de multiplicacin y divisin entera
por potencias positivas de 10: pueden hacerse en
tiempo lineal (desplazamientos de las cifras).
Operacin de multiplicacin con el algoritmo
clsico (o con el de multiplicacin rusa): tiempo
cuadrtico.
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 23
v Tcnica de divide y vencers para la
multiplicacin de enteros muy grandes:
Sean u y v dos enteros de n cifras.
Se descomponen en mitades de igual tamao:
Por tanto, w e y tienen n/ 2] cifras
El producto es:
Multiplicacin de enteros
grandes
A. Ka r a t s u ba e Y. Ofma n :
Mu lt iplica t ion of mu lt idigit n u mber s on a u t oma t a ,
Dok l. Ak ad. Nauk SSSR, 145, pp. 293-294, 1962.
u 10
s
w + x
v 10
s
y +z
'
con 0 x <10
s
, 0 z <10
s
, y
s n 2
]
uv 10
2s
wy + 10
s
(wz + xy ) + xz
w
x
u
n
y
z v
n/2] n/2]
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 24
Multiplicacin de enteros
grandes
funcin mult(u,v:granEnt) devuelve granEnt
variables n,s:entero; w,x,y,z:granEnt
principio
n:=mx(tamao(u),tamao(v));
si n es pequeo
entonces devuelve multClsica(u,v)
sino
s:=n div 2;
w:=u div 10
s
; x:=u mod 10
s
;
y:=v div 10
s
; z:=v mod 10
s
;
devuelve mult(w,y)*10
2s
+(mult(w,z)+mult(x.y))*10
s
+mult(x,z)
fsi
fin
funcin mult(u,v:granEnt) devuelve granEnt
variables n,s:entero; w,x,y,z:granEnt
principio
n:=mx(tamao(u),tamao(v));
si n es pequeo
entonces devuelve multClsica(u,v)
sino
s:=n div 2;
w:=u div 10
s
; x:=u mod 10
s
;
y:=v div 10
s
; z:=v mod 10
s
;
devuelve mult(w,y)*10
2s
+(mult(w,z)+mult(x.y))*10
s
+mult(x,z)
fsi
fin
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 25
v Coste temporal:
Las sumas, multiplicaciones por potencias de 10
y divisiones por potencias de 10: tiempo lineal.
Operacin mdulo una potencia de 10: tiempo
lineal (puede hacerse con una divisin, una
multiplicacin y una resta).
Por tanto, si t(n) es el tiempo del algoritmo:
Si n se supone potencia de 2,
La solucin de esta recurrencia es:
Y no hemos ganado nada!?
Multiplicacin de enteros
grandes
t (n) 3t n 2
]
( )
+t n 2
]
( )
+ (n)
t (n) 4t n 2
( )
+ (n)
t (n) O(n
2
)
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 26
Truco: calcular wy, wz+xy, y xz haciendo menos
de cuatro multiplicaciones.
Teniendo en cuenta que:
Multiplicacin de enteros
grandes
r (w + x ) (y + z ) wy + (wz + xy ) + xz
funcin mult2(u,v:granEnt) devuelve granEnt
variables n,s:entero; w,x,y,z,r,p,q:granEnt
principio
n:=mx(tamao(u),tamao(v));
si n es pequeo
entonces devuelve multClsica(u,v)
sino
s:=n div 2;
w:=u div 10
s
; x:=u mod 10
s
;
y:=v div 10
s
; z:=v mod 10
s
;
r:=mult2(w+x,y+z);
p:=mult2(w,y); q:=mult2(x,z);
devuelve p*10
2s
+(r-p-q)*10
s
+q
fsi
fin
funcin mult2(u,v:granEnt) devuelve granEnt
variables n,s:entero; w,x,y,z,r,p,q:granEnt
principio
n:=mx(tamao(u),tamao(v));
si n es pequeo
entonces devuelve multClsica(u,v)
sino
s:=n div 2;
w:=u div 10
s
; x:=u mod 10
s
;
y:=v div 10
s
; z:=v mod 10
s
;
r:=mult2(w+x,y+z);
p:=mult2(w,y); q:=mult2(x,z);
devuelve p*10
2s
+(r-p-q)*10
s
+q
fsi
fin
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 27
v Eficiencia temporal de la versin 2:
Teniendo en cuenta que w+x e y+z pueden
necesitar 1+n/ 2] cifras,
Y por tanto,
Debido a la constante multiplicativa, el algoritmo
slo es interesante en la prctica para n grande.
Una buena implementacin no debe usar la base
10 sino la base ms grande posible que permita
multiplicar dos cifras (de esa base) directamen-
te en hardware.
Multiplicacin de enteros
grandes
t
2
(n) t
2
n 2
]
( )
+ t
2
n 2
]
( )
+t
2
1 + n 2
]
( )
+ (n)
t
2
(n) n
log 3
( )
O n
1, 59
( )
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 28
La diferencia entre los rdenes n
2
y n
1,59
es menos
espectacular que la existente entre n
2
y nlog n.
Ejemplo realizado en un computador en base 2
20
:
(computador con palabras de 60 dgitos, que
permite multiplicar directamente nmeros de 20
dgitos binarios)
u Multiplicacin de nmeros de unas 602
cifras (base decimal):
algoritmo clsico: 400 milisegundos
algoritmo mult2: 300 milisegundos
u Multiplicaciones de nmeros de unas 6000
cifras (base decimal):
algoritmo clsico: 40 segundos
algoritmo mult2: 15 segundos
Descomponiendo los operandos en ms de dos
partes se puede lograr la multiplicacin de dos
enteros en un tiempo del orden de n
, para
cualquier >1.
Descomponiendo los operandos en n
1/ 2
partes y
usando la transformada de Fourier, se pueden
multiplicar dos enteros de n cifras en un tiempo
O(n log n loglog n).
Multiplicacin de enteros
grandes
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 29
Potenciacin de enteros
v Problema:
Dados los enteros positivos a, n y z, se
trata de calcular a
n
mod z.
v Solucin ingenua:
Si se quita la operacin mod z final, sirve para
calcular a
n
(no modular).
Si r:=r*a se considera operacin elemental,
el coste est en (n).
Pero NO es as (p.e., 15
17
no cabe en 8 bytes).
funcin pot0(a,n,z:entero) devuelve entero
{Devuelve a
n
mod z.}
variables r,i:entero
principio
r:=1;
para i:=1 hasta n hacer
r:=r*a
fpara;
devuelve r mod z
fin
funcin pot0(a,n,z:entero) devuelve entero
{Devuelve a
n
mod z.}
variables r,i:entero
principio
r:=1;
para i:=1 hasta n hacer
r:=r*a
fpara;
devuelve r mod z
fin
J . Campos - C.P.S. Es qu emas algort micos - Divide y ven cer s P g. 30
v Inconvenientes de esta solucin:
Su coste (el bucle se ejecuta n veces).
Si se quiere aplicar a un entero a grande
(de m cifras), el coste es prohibitivo.
u (m
2
n
2
), si se usa el algoritmo clsico de
multiplicar.
n cifras(r
1
)=m (r
1
denota r tras el 1er paso)
n cifras(r
i+1
)=m+m
i
n cifras(r
i+1
)=i m
coste =
Mtodo clsico de multiplicar
coste =
u (m
log 3
n
2
), si se usa el algoritmo de divide y
vencers [BB96].
Potenciacin de enteros
M(m, i m)
i 1
n1
c m i m cm
2
i
i 1
n 1
cm
2
n
2
i 1
n1