artigo_karatsuba

Upload: gilberto-mota

Post on 01-Mar-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/25/2019 Artigo_Karatsuba

    1/4

    Multiplicao de Nmeros Binrios com Diviso eConquista utilizando o Algoritmo de Karatsuba

    Thiago MesquitaUniversidade Estadual do [email protected]

    Victor LaboreiroUniversidade Estadual do [email protected]

    Fernando AntnioUniversidade Estadual do [email protected]

    ABSTRACTThe present paper analyses and describes in detail Karat-subas algorithm whose goal is to multiply long binary num-bers fast. Pseudocode, example and a list of ways to improveKaratsuba Algorithm are provided at the present work tosimplify the understanding of the mentioned method.

    RESUMOO presente artigo analisa e descreve detalhadamente o algo-ritmo de Karatsuba para multiplicacao de numeros binarioslongos. Pseudocodigo, exemplo e lista de melhorias sao for-necidas no presente trabalho com a finalidade de facilitar acompreensao do metodo em questao.

    Palavras-chaveLong Number Multiplication, Karatsuba Algorithm, FastMultiplication

    1. INTRODUODevido as elevadas limitacoes dos primeiros processadores,em alguns casos, operacoes aritmeticas como multiplicacao

    e divisao nao eram implementadas em nvel de hardware,cabendo ao programador projetar e implementar tais ope-racoes ausentes. Com o avanco tecnologico dos tempos dehoje, operacoes como estas nao so sao implementadas emhardware como sao massivamente otimizadas para permitiro maior rendimento p ossvel do processador.

    Apesar que seja muito improvavel que uma implementacaoem software da operacao de multiplicacao, por exemplo, su-pere em desempenho a de uma em nvel de hardware exe-cutada no mesmo processador, ainda ha um simples, poremextremamente forte argumento que justifica a utilizacao deuma implementacao em software: instrucoes em hardwaredos processadores sao limitadas pelo tamanho maximo da

    palavra em bits. Isso significa que um processador de 64bits nao suportara multiplicacoes entre numeros com maisde 20 dgitos.

    Uma vez que inumeras aplicacoes cientficas fazem extensivouso de multiplicacao de numeros longos, o projeto e analisede um algoritmo rapido para realizar a tarefa eficientementee essencial. Areas como, por exemplo, seguranca e geometriacomputacional fazem extensivo uso de multiplicacoes entrenumeros longos para, respectivamente, criptografar comuni-cacoes e solucionar de maneira confiavel problemas geome-tricos e algebricos.[1]

    1.1 Algoritmo Clssico de Multiplicao:Logo no ensino fundamental nos e ensinado um algoritmode multiplicacao de numeros com qualquer numero de dgi-tos. No presente trabalho este sera sempre referenciado porAlgoritmo Classico de Multiplicacao.

    Para multiplicar dois numeros a e b, deve-se multiplicar apor cada dgito deb, organizando os resultados como linhasde uma tabela, alinhadas de acordo com o dgito de b.

    Supondo que ambos os numeros a e b possuem a mesmaquantidaden de dgitos, isso significa que para cada dgito

    de b, serao executadas n multiplicacoes. Uma vez que bpossui n dgitos, isso significa que no total serao executa-das n2 multiplicacoes. Este algoritmo possui complexidadetemporal na ordem de O(n2).

    Ainda que a primeira vista possa nao ser muito claro, exis-tem algoritmos com complexidade subquadraticas para mul-tiplicacao de numeros longos. Neste documento sera abor-dado o algoritmo comumente referenciado na literatura comoAlgoritmo de Multiplicacao de Complexos de Gauss. No en-tanto, primeiramente faremos uma breve introducao a tec-nica de projeto de algoritmos de Divisao e Conquista, poisesta sera utilizada ao longo do trabalho.

    2. TCNICA DE DIVISO E CONQUISTAA tecnica de Divisao e Conquista consiste, resumidamente,em desmembrar o problema em varios subproblemas quesao semelhantes ao problema original, mas menores em ta-manho, resolvem os subproblemas que sao semelhantes aoproblema original, mas menores em tamanho, resolvem ossubproblemas recursivamente e depois combinam essas so-lucoes com o objtivo de criar uma solucao para o problemaoriginal.[2]

    Esquematicamente, a abordagem de Dividir e Conquistarpode ser representada da seguinte maneira:

  • 7/25/2019 Artigo_Karatsuba

    2/4

    1. Divida o problema em subproblemas que sao instanciasmenores, p orem do mesmo tipo de problema.

    2. Repita o passo 1 recursivamente ate que os subproble-mas sejam pequenos o suficiente para serem resolvidosdiretamente.

    3. Combine os resultados parciais obtidos atraves dos sub-problemas.

    Inumeros sao os algoritmos que fazem uso de tal tecnicae, como veremos a seguir, o Algoritmo de Multiplicacao deComplexos de Gauss e um exemplo.

    3. ALGORITMO DE MULTIPLICAO DECOMPLEXOS DE GAUSS

    O matematico Carl Friedrich Gauss (1777-1855) percebeuque apesar do produto de dois numeros complexos parece-rem necessitar de quatro multiplicacoes entre numeros reais,na verdade e possvel realizarcom ap enas tres multiplicacoes.SejamA e B dois numeros complexos, segue:

    A= a+biB = c +di

    Multiplicando ambos numeros e simplificando conforme Gauss,obtemos:

    A B = (a+bi)(c+di)A B = ac bd+ (bc+ad)ibc+ad= (a+b)(c+d) ac bdA B = ac bd+ [(a+b)(c+d) ac bd]i

    A princpio, a reducao de 25% de multiplicacoes nao apa-

    renta ser promissora em termos de complexidade temporaluma vez que a mesma nao foi reduzida assintoticamente,mas como veremos a seguir, atraves de uma implementacaocom Divisao e Conquista sera possvel obter um algoritmocom complexidade temporal subquadratica.

    4. ALGORITMO DE MULTIPLICAO DEBINRIOS DE KARATSUBA

    Iremos agora observar uma melhoria semelhante a que Gaussobteve, porem voltada para numeros binarios desenvolvidapor A. Karatsuba[3]. Suponha dois numeros binarios X eY cada um com uma mesma quantidade n de dgitos que euma potencia de 2. Separaremos entao X e Y em metade

    esquerda e metade direta, cada uma naturalmente comn/2dgitos.

    Desta forma, obtemos atraves da multiplicacao entreX e Y:X= XL2

    n2 +XR

    Y =YL2n2 +YR

    Eq.1)X Y =XLYL2n + (XLYR+XRYL)2

    n2 +XRYR

    Como podemos perceber, ainda sao utilizadas quatro multi-plicacoes. Analisaremos entao como sera o comportamentoassintotico da Equacao 1 apresentada acima quando apli-cada a uma tecnica de Divisao e Conquista. Desta maneira,

    para calcular X

    Y, procederemos inicialmente dividindo oproblema em 4 subproblemas que serao resolvidos recursiva-mente: XLYL,XLYR,XRYLe XRYR. Alem disso, para o n-velk , cada subproblema tera entrada de tamanhof racn2k,fara 4 chamadas recursivas.

    Os produtos resultantes da multiplicacao entre qualquer umdestes valores e alguma p otencia de 2 nao foram includospelo fato que este produto pode ser calculado muito rapida-mente por hardware atraves da operacao de deslocamento debit. SejaT(n) a funcao de recorrencia: T(n) = 4T(n

    2)+O(n)

    A partir do teorema mestre, e possvel calcular sua comple-xidade:T(n) =aT(n

    b) +f(n)

    T(n) =(nlogba) +lognb1

    j=0 ajf( n

    bj)

    T(n) =(nlog24) +logn21

    j=0 2jn)

    T(n) =(n2) +logn21

    j=0 2jn)

    Portanto e possvel perceber que a complexidade temporalpermanece quadratica, resultando em um algoritmo assinto-ticamente equivalente ao Algoritmo Classico de Multiplica-cao. No entanto, semelhante a Gauss, Karatsuba conseguiureduzir a quantidade de multiplicacoes da Equacao 1 paraapenas 3 operacoes.

    (XLYR+XRYL) = (XL XR)(YR YL) XLXR YLYR

    Aplicando na Equacao 1, obtem-se Eq.2) X Y =

    XLBL(2n + 2

    n2 ) + (XLXR)(YRYL)2

    n2 +XRYR(2

    n2 + 1)

    Atraves da Equacao 2 e possvel obter complexidade tempo-ral subquadratica como e possvel analisar a seguir:

    T(n) = 3T(n2

    ) +O(n)

    T(n) =(nlog23) +logn21

    j=0 3j n

    2j)

    Uma vez que log23 1.58496, implica que a complexidade

    temporal de Karatsuba e da ordem de(n1.58) o que repre-senta uma elevada reducao assintotica em relacao ao Algo-ritmo Classico de Multiplicacao.

    4.1 PseudocdigoA seguir e apresentado o pseudocodigo do Algoritmo de Ka-ratsuba. Atente que para um primeiro momento, optamospor apresentar uma versao bastante simples do algoritmo,mas alertamos que existem diversas melhorias que sao reco-mendadas e que serao abordadas na proxima subsecao.

    .

  • 7/25/2019 Artigo_Karatsuba

    3/4

    f u n ca o m u l t i p l i c a ( x , y )Entr ada : I n t e i r o s p o s i t i v o s "x" e "y",

    e m b i n a r i oS a i da : O pr o duto

    n = max( tamanho de "x ", tam an ho d e "y" )Se n=1

    D ev o lv a (x y )

    Xl = t e t o ( n /2 ) b i t s a e sq ue rd a de xXr = 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 sq ue rd a de yYr = 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 ( X l , Y l )P2 = m u l t i p l i c a ( Xr , Yr )P3 = mu lt ip li ca (Xl+Xr, Yl+Yr)

    Devolva(P12 n + ( P 3P1P2 ) 2 ( n / 2 ) + P 2 )

    Como e possvel analisar, o algoritmo e capaz de executarmultiplicacoes mesmo em casos em que a quantidade de d-gitos entre x e y sao diferentes, porem logo percebe-se que

    ha espaco para uma grande melhoria neste ponto. Iremosfocar primeiro o pseudocodigo apresentado acima para emseguida tecer mais comentarios em relacao as melhorias quepodem ser realizadas. Atente que apesar do algoritmo apre-sentado ser voltado para multiplicacao de numeros binarios,ele facilmente pode ser adaptado para qualquer outra basenumerica, bastando trocar todas ocorrencias de 2n e 2

    n2 por,

    respectivamente,Bn e Bn2 ondeB e a base almejada.

    Para melhor exemplificar o funcionamento do algoritmo, emseguida e apresentado um exemplo de funcionamento paraa instancia 1011x0110:

    1) X= 1011 e Y = 01101) XL= 10 e XR = 111) YL= 01 e YR = 101) P1 = 10x01

    1.1) X= 10 e Y = 011.1) XL= 1 e XR= 01.1) YL= 0 e YR = 11.1) P1 = 1x0 = 01.1) P2 = 0x1 = 01.1) P3 = (1 + 0)x(0 + 1) = 0x0 = 0

    1) P1 = 0x22 + (0 0 0)2

    2

    2 + 01) P1 = 0 + 0 + 0 = 01) P2 = 11x10

    1.2) X= 11 e Y = 101.2) XL= 1 e XR = 11.2) YL= 1 e YR = 01.2) P1 = 1x1 = 1

    1.2) P2 = 1x0 = 01.2) P3 = (1 + 1)x1 = 10x1

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

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

    2

    2 + 01.2) P3 = 0 + 10 + 0 = 10

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

    2

    2 + 0

    1) P2 = 100 + 10 + 0 = 1101) P3 = (10 + 11)x(01 + 10) = 101x11

    Naturalmente e necessario aplicar novamente o passo recur-sivo da multiplicacao para encontrar P3, mas como acredi-tamos que o leitor ja esteja confortavel em relacao ao com-portamento do algoritmo entao nao prosseguiremos com esteexemplo.

    4.2 MelhoriasAlgumas sugestoes para melhoria de desempenho do Algo-ritmo de Karatsuba foram coletadas de outros trabalhos ereunidas no presente documento. Em relacao ao pseudo-

    codigo apresentado neste trabalho, imediatamente deve-sealertar ao leitor que todas os produtos que envolvem po-tencia de 2 devem necessariamente ser implementados comoperadores de deslocamento de bit devido a sua significanterapidez.

    De acordo com S. Dasgupta, C. H. Papadimitriou e U. V.Vazirani[4], geralmente nao ha necessidade de reduzir o pro-blema incial ate que cada subproblema possua apenas 1 d-gito uma vez que a maior parte dos processadores atuaissuporta multiplicacao entre numeros de 32, 64 ou mais bitsem apenas uma operacao. Entao, por exemplo, para um pro-cessador de 32 bits, pode-se definir a base B do algoritmode Karatsuba como B = 231, poupando uma quantidade decalculos e recursoes extremamente relevante.

    Conforme J. Bernstein[5], quando a quantidade de dgitos deum dos numeros for substancialmente superior a quantidadedo outro, pode-se reduzir o tempo de execucao do algoritmodividindo o maior dos numeros em partes com quantidadede dgitos comparavel ao do menor dos numeros.

    Finalmente, o presente trabalho sugere que o algoritmo devachecar se o menor dos numeros possui apenas 1 dgito. Sefor o caso, devolva 0 caso o dgito em questao seja nulo oudevolva o valor do maior dos numeros caso o dgito seja iguala 1. A utilidade deste procedimento fica claro em situacoes

  • 7/25/2019 Artigo_Karatsuba

    4/4

    em que a quantidade de dgitos de um dos numeros e su-perior a quantidade de dgitos do outro. Por exemplo, paraencontrar o valor de 10101011x1, seriam necessarias 4 passosrecursivos enquanto que com a melhoria sugerida, o produtoseria computado imediatamente.

    5. CONCLUSESO algoritmo de Karatsuba foi o primeiro a indicar a possi-

    bilidade de realizar multiplicacao em tempo subquadratico.A sua simplicidade de implementacao torna-o, ainda hoje,um metodo muito popular. No entanto, ja existem algorit-mos assintoticamente menos complexos que Karatsuba. Oalgoritmo de Toom foi o primeiro a apreentar um metodode multiplicacao de inteiros em tempo linear Atualmente oalgoritmo de menor ordem de complexidade e o de Schonage-Strassen: O(n lg n lglg n).

    No entanto, isso nao significa que Schonage-Strassen e o al-goritmo mais rapido de todos. Cada um dos citados al-goritmos possuem faixas de tamanho da entrada em quedestacam-se. De acordo com Bernstein, D. J.[6], o Algo-ritmo de Karatsuba e mais rapido que o Algoritmo Classico

    de Multiplicacao quando seus multiplicandos possuem maisque 320-640 bits.

    6. REFERNCIAS1. A. Eigenwillig, K. Mehlhorn, Multiplication of Long

    Integers, http://www.mpi-inf.mpg.de/ mehlhorn/ftp/chapter2A-en.pdf.

    2. H Cormen, Thomas, Introduction to Algorithms, MITPress, 3rd Edition, 2009.

    3. A. Karatsuba and Yu. Ofman (1962). Multiplicationof Many-Digital Numbers by Automatic Computers.Proceedings of the USSR Academy of Sciences 145.

    4. S. Dasgupta, C. Papadimitriou, U. Vazirani, Algo-rithms, McGraw-Hill, 1st edition, 2006.

    5. D. J. Bernstein, Fast multiplication and its applicati-ons.

    6. D. J. Bernstein, Multidigit multiplication for mathe-maticians.