Professional Documents
Culture Documents
martintmlg@gmail.com
1 Introducción
Este trabajo presenta un análisis comparativo entre tres algoritmos que resuelven el
problema de la Multiplicación de Enteros de N Dígitos (de 1 a 2048 dígitos). Este es
un problema que requiere de soluciones eficientes, especialmente para cálculos
matemáticos de gran complejidad.
El trabajo hace una descripción del problema y de los métodos a ser analizados, así
como de los resultados experimentales obtenidos de la comparación de dichos
métodos.
4 Análisis teórico
4.1 Karatsuba
El paso básico del algoritmo de Karatsuba es una fórmula que permite calcular el
producto de dos números relativamente grandes x e y, usando tres multiplicaciones de
números más pequeños, cada uno con más o menos de la mitad de los dígitos de x e y,
más algunas sumas y desplazamientos de dígitos.
Supongamos que x e y están representados como cadenas de n dígitos de alguna
base b uno puede dividir los dos números dados de la siguiente manera, donde n/2 es
un número redondeado por exceso:
x = x1bn/2 + x0 (1)
y = y1bn/2 + y0 (2)
n/2
Donde x0 e y0 son menores que b . El producto de xy es entonces:
n/2 n/2
xy = (x1b + x0) (y1b + y0)
n n/2
xy = x1y1b + (x1y0 + x0y1)b + x0y0 (3)
Por tanto podemos decir que para calcular xy hay que efectuar 4 productos entre
enteros de tamaño n/2. La recurrencia que se obtiene para este caso es:
T(n) = 4T(n/2 + O (n) (4)
2
y su coste asociado es O(n ) [1].
En el algoritmo propuesto por Karatsuba se aplica exactamente la misma
fragmentación que se acaba de utilizar, pero se reduce el número de nuevos productos
a calcular. Entonces, la fórmula (3) se puede reducir a 3 multiplicaciones haciendo
que el segundo término (x1y0 + x0y1) quede en relación con el primero (x 1y1) y con el
tercero (x0y0), por lo que:
(x1y0 + x0y1) = (x1 + x0) (y1 + y0) – x1y1 – x0y0 (5)
Por lo tanto tenemos que para obtener el segundo término bastará con hacer una
multiplicación y cuatro sumas (mucho menos costosas que las multiplicaciones).
Finalmente tenemos que para calcular las 3 multiplicaciones de números de n/2 cifras
necesarias para Karatsuba podemos modificar la fórmula (3) de la siguiente manera:
n n/2
xy = x1y1b + [(x1 + x0) (y1 + y0) – x1y1 – x0y0]b + x0y0 (6)
De este modo se calculan tres nuevos productos entre enteros de tamaño n/2 y
tenemos que la nueva recurrencia que se obtiene es:
T(n) = 3T(n/2) + O(n) (7)
1.57
y su coste asociado es O(n ).
Se tiene que, para un n suficientemente grande, el algoritmo de Karatsuba
realizará menos desplazamientos y sumas de un solo dígito que la multiplicación
clásica, incluso cuando su paso básico use más sumas y desplazamientos que la
fórmula sencilla. Para valores pequeños de n, sin embargo, los desplazamientos y
operaciones de suma pueden hacerlo ir más lentamente que el método a mano. Todo
depende de la plataforma del ordenador y del contexto. Por norma general, Karatsuba
normalmente más rápido cuando los multiplicandos son del orden 2320 ≈ 2×109 o
mayor [2].
Sean x0, x1 ...., xn-1 números complejos. La transformada discreta de Fourier (DFT),
por sus siglas en inglés) se define como:
(8)
2
La evaluación directa de esta fórmula requiere O(n ) operaciones aritméticas.
Mediante un algoritmo FFT se puede obtener el mismo resultado con sólo O(n log n)
operaciones. En general, dichos algoritmos dependen de la factorización de n pero, al
contrario de lo que frecuentemente se cree, existen FFT’s para cualquier n, incluso
con n primo.
La idea que permite esta optimización es la descomposición de la transformada a
tratar en otras más simples y éstas a su vez hasta llegar a transformadas de 2
elementos donde k puede tomar los valores 0 y 1. Una vez resueltas las transformadas
más simples hay que agruparlas en otras de nivel superior que deben resolverse de
nuevo y así sucesivamente hasta llegar al nivel más alto. Al final de este proceso, los
resultados obtenidos deben reordenarse [3].
4.3 Multiplicación Directa
5 Resultados Experimentales
12 34 = 12 × 10 2+ 34
56 78 = 56 × 10 2 + 78
z 2= 12 × 56 = 672
z 0= 34 × 78 = 2652
z 1= (12 + 34) (56 + 78) - z 2- z 0= 46 × 134 - 672 - 2.652 = 2.840
resultado = z 2× 102 × 2 + z 1× 102+ z 0 = 672 × 2840 × 10000 + 100 + 2652 = 7006652
Fig. 1. Ejemplo de una multiplicación con el método de Karatsuba
mult_FFT ( 197, 95 )
k = 2 ya que 2^2 >= 2+3-1
Hay que rellenar con 0 la parte imaginaria y hasta 2^k
xc = { {7,0}{9,0}{1,0}{0,0} }
yc={ {5,0}{9,0}{0,0}{0,0} }
Transformación
xt ={ {17,0}{6,-9}{-1,0}{6,9} }
yt ={ {14,0}{5,-9}{-4,0}{5,9} }
Multiplicación
xytc ={{238, -0}{-51, 99}{4, 0}{-51, -99}}
xyc = { {35,0}{108,0}{86,0}{9,0} }
xy = {35}{108}{86}{9}
haciendo el acarreo...
xy={5}{1}{7}{8}{1}
return xy
2 3 9 5 8 2 3 3 Multiplicando
x 5 2 8 0 Multiplicador
0 0 0 0 0 0 0 0
1 9 1 6 6 5 8 6 4
4 7 9 1 6 4 6 6
1 1 9 7 9 1 1 6 5
1 2 6 4 9 9 4 7 0 2 4 0 Producto
Fig. 4. Ejemplo de multiplicación de dos números mediante FFT.
Finalmente, podemos decir que si hay que multiplicar enteros de longitud superior a
500 bits ó dígitos conviene utilizar el algoritmo de Karatsuba, pero si los enteros son
más pequeños es más eficiente utilizar el algoritmo de Multiplicación Directa.
Además en todo caso es más eficiente el algoritmo de multiplicación Transformación
Rápida de Fourier (FFT).
En la Tabla2 se observa la complejidad de los algoritmos utilizados para este
trabajo.
Método Complejidad
Karatsuba O (n1.57)
FFT O (n log n)
Directa O (n2)
6 Conclusión
[3] Ramirez, R. W. The FFT: Fundamentals and Concepts. Englewood Cliffs, NJ:
Prentice-Hall, 1985.