Вы находитесь на странице: 1из 4

Multiplicao de Nmeros Binrios com Diviso e

Conquista utilizando o Algoritmo de Karatsuba


Thiago Mesquita

Victor Laboreiro

Fernando Antnio

Universidade Estadual do Cear


a

Universidade Estadual do Cear


a

Universidade Estadual do Cear


a

thiago.mesquita.ribeiro@gmail.com

victor.laboreiro@gmail.com

nandolacerda@gmail.com

ABSTRACT
The present paper analyses and describes in detail Karatsubas algorithm whose goal is to multiply long binary numbers fast. Pseudocode, example and a list of ways to improve
Karatsuba Algorithm are provided at the present work to
simplify the understanding of the mentioned method.

RESUMO
O presente artigo analisa e descreve detalhadamente o algoritmo de Karatsuba para multiplicaca
o de n
umeros bin
arios
longos. Pseudoc
odigo, exemplo e lista de melhorias s
ao fornecidas no presente trabalho com a finalidade de facilitar a
compreens
ao do metodo em quest
ao.

Palavras-chave
Long Number Multiplication, Karatsuba Algorithm, Fast
Multiplication

1.

INTRODUO

Devido a
`s elevadas limitaco
es dos primeiros processadores,
em alguns casos, operaco
es aritmeticas como multiplicaca
o
e divis
ao n
ao eram implementadas em nvel de hardware,
cabendo ao programador projetar e implementar tais operac
oes ausentes. Com o avanco tecnol
ogico dos tempos de
hoje, operaco
es como estas n
ao s
o s
ao implementadas em
hardware como s
ao massivamente otimizadas para permitir
o maior rendimento possvel do processador.
Apesar que seja muito improv
avel que uma implementaca
o
em software da operaca
o de multiplicaca
o, por exemplo, supere em desempenho a de uma em nvel de hardware executada no mesmo processador, ainda h
a um simples, porem
extremamente forte argumento que justifica a utilizaca
o de
uma implementaca
o em software: instruco
es em hardware
dos processadores s
ao limitadas pelo tamanho m
aximo da
palavra em bits. Isso significa que um processador de 64
bits n
ao suportar
a multiplicaco
es entre n
umeros com mais
de 20 dgitos.

Uma vez que in


umeras aplicac
oes cientficas fazem extensivo
uso de multiplicaca
o de n
umeros longos, o projeto e an
alise
de um algoritmo r
apido para realizar a tarefa eficientemente

e essencial. Areas
como, por exemplo, seguranca e geometria
computacional fazem extensivo uso de multiplicaco
es entre
n
umeros longos para, respectivamente, criptografar comunicaco
es e solucionar de maneira confi
avel problemas geometricos e algebricos.[1]

1.1

Algoritmo Clssico de Multiplicao:

Logo no ensino fundamental nos e ensinado um algoritmo


de multiplicac
ao de n
umeros com qualquer n
umero de dgitos. No presente trabalho este ser
a sempre referenciado por
Algoritmo Cl
assico de Multiplicaca
o.
Para multiplicar dois n
umeros a e b, deve-se multiplicar a
por cada dgito de b, organizando os resultados como linhas
de uma tabela, alinhadas de acordo com o dgito de b.
Supondo que ambos os n
umeros a e b possuem a mesma
quantidade n de dgitos, isso significa que para cada dgito
de b, ser
ao executadas n multiplicaco
es. Uma vez que b
possui n dgitos, isso significa que no total ser
ao executadas n2 multiplicac
oes. Este algoritmo possui complexidade
temporal na ordem de O(n2 ).
Ainda que a primeira vista possa n
ao ser muito claro, existem algoritmos com complexidade subquadr
aticas para multiplicac
ao de n
umeros longos. Neste documento ser
a abordado o algoritmo comumente referenciado na literatura como
Algoritmo de Multiplicaca
o de Complexos de Gauss. No entanto, primeiramente faremos uma breve introduca
o a
` tecnica de projeto de algoritmos de Divis
ao e Conquista, pois
esta ser
a utilizada ao longo do trabalho.

2.

TCNICA DE DIVISO E CONQUISTA

A tecnica de Divis
ao e Conquista consiste, resumidamente,
em desmembrar o problema em v
arios subproblemas que
s
ao semelhantes ao problema original, mas menores em tamanho, resolvem os subproblemas que s
ao semelhantes ao
problema original, mas menores em tamanho, resolvem os
subproblemas recursivamente e depois combinam essas soluco
es com o objtivo de criar uma soluca
o para o problema
original.[2]
Esquematicamente, a abordagem de Dividir e Conquistar
pode ser representada da seguinte maneira:

1. Divida o problema em subproblemas que s


ao inst
ancias
menores, porem do mesmo tipo de problema.
2. Repita o passo 1 recursivamente ate que os subproblemas sejam pequenos o suficiente para serem resolvidos
diretamente.
3. Combine os resultados parciais obtidos atraves dos subproblemas.

In
umeros s
ao os algoritmos que fazem uso de tal tecnica
e, como veremos a seguir, o Algoritmo de Multiplicac
ao de
Complexos de Gauss e um exemplo.

3.

ALGORITMO DE MULTIPLICAO DE
COMPLEXOS DE GAUSS

O matem
atico Carl Friedrich Gauss (1777-1855) percebeu
que apesar do produto de dois n
umeros complexos parecerem necessitar de quatro multiplicaco
es entre n
umeros reais,
na verdade e possvel realizarcom apenas tres multiplicaco
es.
Sejam A e B dois n
umeros complexos, segue:
A = a + bi
B = c + di

Multiplicando ambos n
umeros e simplificando conforme Gauss,
obtemos:
A B = (a + bi)(c + di)
A B = ac bd + (bc + ad)i
bc + ad = (a + b)(c + d) ac bd
A B = ac bd + [(a + b)(c + d) ac bd]i

A princpio, a reduca
o de 25% de multiplicac
oes n
ao aparenta ser promissora em termos de complexidade temporal
uma vez que a mesma n
ao foi reduzida assintoticamente,
mas como veremos a seguir, atraves de uma implementaca
o
com Divis
ao e Conquista ser
a possvel obter um algoritmo
com complexidade temporal subquadr
atica.

4.

ALGORITMO DE MULTIPLICAO DE
BINRIOS DE KARATSUBA

Iremos agora observar uma melhoria semelhante a que Gauss


obteve, porem voltada para n
umeros bin
arios desenvolvida
por A. Karatsuba[3]. Suponha dois n
umeros bin
arios X e
Y cada um com uma mesma quantidade n de dgitos que e
uma potencia de 2. Separaremos ent
ao X e Y em metade
esquerda e metade direta, cada uma naturalmente com n/2
dgitos.

Eq.1)X Y = XL YL 2n + (XL YR + XR YL )2 2 + XR YR

Como podemos perceber, ainda s


ao utilizadas quatro multiplicaco
es. Analisaremos ent
ao como ser
a o comportamento
assint
otico da Equaca
o 1 apresentada acima quando aplicada a uma tecnica de Divis
ao e Conquista. Desta maneira,
para calcular X Y , procederemos inicialmente dividindo o
problema em 4 subproblemas que ser
ao resolvidos recursivamente: XL YL , XL YR , XR YL e XR YR . Alem disso, para o nvel k, cada subproblema ter
a entrada de tamanho f racn2k ,
far
a 4 chamadas recursivas.
Os produtos resultantes da multiplicaca
o entre qualquer um
destes valores e alguma potencia de 2 n
ao foram includos
pelo fato que este produto pode ser calculado muito rapidamente por hardware atraves da operaca
o de deslocamento de
bit. Seja T (n) a funca
o de recorrencia: T (n) = 4T ( n2 )+O(n)
A partir do teorema mestre, e possvel calcular sua complexidade:
T (n) = aT ( nb ) + f (n)
Plog nb1 j n
a f ( bj )
T (n) = (nlogb a ) + j=0
P
n21 j
T (n) = (nlog2 4 ) + log
2 n)
j=0
P n21
j
T (n) = (n2 ) + log
2
n)
j=0
Portanto e possvel perceber que a complexidade temporal
permanece quadr
atica, resultando em um algoritmo assintoticamente equivalente ao Algoritmo Cl
assico de Multiplicaca
o. No entanto, semelhante a Gauss, Karatsuba conseguiu
reduzir a quantidade de multiplicaco
es da Equaca
o 1 para
apenas 3 operaco
es.
(XL YR + XR YL ) = (XL XR )(YR YL ) XL XR YL YR
Aplicando na Equaca
o 1, obtem-se Eq.2) X Y =
n
n
n
XL BL (2n + 2 2 ) + (XL XR )(YR YL )2 2 + XR YR (2 2 + 1)

Atraves da Equaca
o 2 e possvel obter complexidade temporal subquadr
atica como e possvel analisar a seguir:
T (n) = 3T ( n2 ) + O(n)
P n21 j n
T (n) = (nlog2 3 ) + log
3 2j )
j=0
Uma vez que log2 3 1.58496, implica que a complexidade
temporal de Karatsuba e da ordem de (n1.58 ) o que representa uma elevada reduc
ao assint
otica em relaca
o ao Algoritmo Cl
assico de Multiplicaca
o.

4.1

Desta forma,
obtemos atraves da multiplicaca
o entre X e Y:
n
X = XL 2n2 + XR
Y = YL 2 2 + YR

Pseudocdigo

A seguir e apresentado o pseudoc


odigo do Algoritmo de Karatsuba. Atente que para um primeiro momento, optamos
por apresentar uma vers
ao bastante simples do algoritmo,
mas alertamos que existem diversas melhorias que s
ao recomendadas e que ser
ao abordadas na pr
oxima subseca
o.

funcao m u l t i p l i c a (x , y )
Entrada :
I n t e i r o s p o s i t i v o s "x" e "y" ,
em b i n a r i o
Saida :
O produto

1) P1 = 0x22 + (0 0 0)2 2 + 0
1) P1 = 0 + 0 + 0 = 0
1) P2 = 11x10

n = max( tamanho de "x" , tamanho de "y" )


Se n=1
Devolva ( xy )

1.2)
1.2)
1.2)
1.2)
1.2)
1.2)

Xl = t e t o ( n / 2 ) b i t s a e s q u e r d a de x
Xr = chao ( n / 2 ) b i t s a d i r e i t a de x
Yl = t e t o ( n / 2 ) b i t s a e s q u e r d a de y
Yr = chao ( n / 2 ) b i t s a d i r e i t a de y
P1 = m u l t i p l i c a ( Xl , Yl )
P2 = m u l t i p l i c a ( Xr , Yr )
P3 = m u l t i p l i c a ( Xl+Xr , Yl+Yr )
Devolva ( P12 n + ( P3P1P2 ) 2 ( n / 2 ) + P2 )

X = 11 e Y = 10
XL = 1 e XR = 1
YL = 1 e YR = 0
P1 = 1x1 = 1
P2 = 1x0 = 0
P3 = (1 + 1)x1 = 10x1

1.2.1)
1.2.1)
1.2.1)
1.2.1)
1.2.1)
1.2.1)

X = 10 e Y = 1
XL = 1eXR = 0
YL = 0eYR = 1
P1 = 1x0 = 0
P2 = 0x1 = 0
P3 = (1 + 0)x(0 + 1) = 1x1 = 1
2

Como e possvel analisar, o algoritmo e capaz de executar


multiplicac
oes mesmo em casos em que a quantidade de dgitos entre x e y s
ao diferentes, porem logo percebe-se que
h
a espaco para uma grande melhoria neste ponto. Iremos
focar primeiro o pseudoc
odigo apresentado acima para em
seguida tecer mais coment
arios em relaca
o a
`s melhorias que
podem ser realizadas. Atente que apesar do algoritmo apresentado ser voltado para multiplicaca
o de n
umeros bin
arios,
ele facilmente pode ser adaptado para qualquer outran base
numerica, bastando trocarn todas ocorrencias de 2n e 2 2 por,
respectivamente, B n e B 2 onde B e a base almejada.

1.2) P3 = 0x22 + (1 0 0)2 2 + 0


1.2) P3 = 0 + 10 + 0 = 10
2

1) P2 = 1x22 + (10 1 0)2 2 + 0


1) P2 = 100 + 10 + 0 = 110
1) P3 = (10 + 11)x(01 + 10) = 101x11
Naturalmente e necess
ario aplicar novamente o passo recursivo da multiplicaca
o para encontrar P3 , mas como acreditamos que o leitor j
a esteja confort
avel em relaca
o ao comportamento do algoritmo ent
ao n
ao prosseguiremos com este
exemplo.

4.2

Melhorias

Algumas sugest
oes para melhoria de desempenho do Algoritmo de Karatsuba foram coletadas de outros trabalhos e
reunidas no presente documento. Em relaca
o ao pseudoc
odigo apresentado neste trabalho, imediatamente deve-se
alertar ao leitor que todas os produtos que envolvem potencia de 2 devem necessariamente ser implementados com
operadores de deslocamento de bit devido a
` sua significante
rapidez.

Para melhor exemplificar o funcionamento do algoritmo, em


seguida e apresentado um exemplo de funcionamento para
a inst
ancia 1011x0110:
1)
1)
1)
1)

X = 1011 e Y = 0110
XL = 10 e XR = 11
YL = 01 e YR = 10
P1 = 10x01

1.1)
1.1)
1.1)
1.1)
1.1)
1.1)

X = 10 e Y = 01
XL = 1 e XR = 0
YL = 0 e YR = 1
P 1 = 1x0 = 0
P 2 = 0x1 = 0
P 3 = (1 + 0)x(0 + 1) = 0x0 = 0

De acordo com S. Dasgupta, C. H. Papadimitriou e U. V.


Vazirani[4], geralmente n
ao h
a necessidade de reduzir o problema incial ate que cada subproblema possua apenas 1 dgito uma vez que a maior parte dos processadores atuais
suporta multiplicaca
o entre n
umeros de 32, 64 ou mais bits
em apenas uma operaca
o. Ent
ao, por exemplo, para um processador de 32 bits, pode-se definir a base B do algoritmo
de Karatsuba como B = 231 , poupando uma quantidade de
c
alculos e recurs
oes extremamente relevante.
Conforme J. Bernstein[5], quando a quantidade de dgitos de
um dos n
umeros for substancialmente superior a
` quantidade
do outro, pode-se reduzir o tempo de execuca
o do algoritmo
dividindo o maior dos n
umeros em partes com quantidade
de dgitos compar
avel ao do menor dos n
umeros.
Finalmente, o presente trabalho sugere que o algoritmo deva
checar se o menor dos n
umeros possui apenas 1 dgito. Se
for o caso, devolva 0 caso o dgito em quest
ao seja nulo ou
devolva o valor do maior dos n
umeros caso o dgito seja igual
a 1. A utilidade deste procedimento fica claro em situaco
es

em que a quantidade de dgitos de um dos n


umeros e superior a
` quantidade de dgitos do outro. Por exemplo, para
encontrar o valor de 10101011x1, seriam necess
arias 4 passos
recursivos enquanto que com a melhoria sugerida, o produto
seria computado imediatamente.

5.

CONCLUSES

O algoritmo de Karatsuba foi o primeiro a indicar a possibilidade de realizar multiplicaca


o em tempo subquadr
atico.
A sua simplicidade de implementaca
o torna-o, ainda hoje,
um metodo muito popular. No entanto, j
a existem algoritmos assintoticamente menos complexos que Karatsuba. O
algoritmo de Toom foi o primeiro a apreentar um metodo
de multiplicac
ao de inteiros em tempo linear Atualmente o
algoritmo de menor ordem de complexidade e o de SchonageStrassen: O(n lg n lg lg n).
No entanto, isso n
ao significa que Schonage-Strassen e o algoritmo mais r
apido de todos. Cada um dos citados algoritmos possuem faixas de tamanho da entrada em que
destacam-se. De acordo com Bernstein, D. J.[6], o Algoritmo de Karatsuba e mais r
apido que o Algoritmo Cl
assico
de Multiplicaca
o quando seus multiplicandos possuem mais
que 320-640 bits.

6.

REFERNCIAS
1. A. Eigenwillig, K. Mehlhorn, Multiplication of Long
Integers, http://www.mpi-inf.mpg.de/ mehlhorn/ftp/chapter2Aen.pdf.
2. H Cormen, Thomas, Introduction to Algorithms, MIT
Press, 3rd Edition, 2009.
3. A. Karatsuba and Yu. Ofman (1962). Multiplication
of Many-Digital Numbers by Automatic Computers.
Proceedings of the USSR Academy of Sciences 145.
4. S. Dasgupta, C. Papadimitriou, U. Vazirani, Algorithms, McGraw-Hill, 1st edition, 2006.
5. D. J. Bernstein, Fast multiplication and its applications.
6. D. J. Bernstein, Multidigit multiplication for mathematicians.

Вам также может понравиться