Multiplicação de inteiros Algoritmo de Karatsuba Paulo Feofiloff Instituto de Matemática e Estatística Universidade de São Paulo 25/7/2011 Universidade Federal do ABC 35871227428009 × 11234908764388 = ? O problema Problema Dados números inteiros positivos u e v com n dígitos cada calcular o produto u × v. I exemplo: 99998888 × 77776666 I exemplo: 99998888 × 00076666 I imagine-se fazendo as contas com lápis e papel, dígito a dígito I quanto tempo vai levar? I tempo ∼ = número de operações elementares I operação elementar = adição e multiplicação de dígitos I n grande: aplicações à criptografia, fast Fourier transform, etc. P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 3 / 33 O problema Se u e v têm n dígitos cada então I u × v tem no máximo 2n dígitos I u + v tem no máximo n + 1 dígitos Exemplos: I 9999 × 9999 = 9998 0001 I 9999 + 9999 = 1 9998 P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 4 / 33 Algoritmo de multiplicação ordinário Adição ordinária 9999 7777 17776 I base do algoritmo: adição de dígitos I n operações elementares P. Feofiloff (IME-USP) u v u+v Multiplicação de inteiros 25/7/2011 5 / 33 Algoritmo de multiplicação ordinário Multiplicação ordinária 6 69 699 777 6 9 9 9 6 9 7 9 9 9 3 2 9 7 9 9 3 99 77 93 3 223 u v u×v I base do algoritmo: multiplicação e adição de dígitos I n2 operações elementares (na verdade, 2n2 + n) I n vezes mais lenta que adição I n2 é lento: (2n)2 = 4 n2 e (10n)2 = 100 n2 P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 6 / 33 Desafio Desafio: I inventar um algoritmo de multiplicação mais rápido I há 50 anos acreditava-se que não existe algoritmo mais rápido I acreditava-se que n2 operações elementares são inevitáveis I vou mostrar que n1.6 operações elementares são suficientes P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 7 / 33 Divisão e conquista “É mesmo? O meu povo sempre diz multiplique e conquiste.” P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 8 / 33 Divisão e conquista a b u 9 9 9 9 8 8 8 8 v 7 7 7 7 6 6 6 6 c d I u = a · 10n/2 + b I v = c · 10n/2 + d I u × v = (a × c) · 10n + (a × d + b × c) · 10n/2 + b × d I estamos supondo n par P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 9 / 33 Divisão e conquista 99998888 77776666 u v 99998888 8888 77776666 6666 a b c d 7776222333333333 1357753103333 59247408 ac ad + bc bd 7777580112347408 x bom algoritmo para calculadora de bolso! P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 10 / 33 Divisão e conquista Número de operações elementares: I u × v = (a × c) · 10n + (a × d + b × c) · 10n/2 + b × d I 4 multiplicações de tamanho n/2 (mais 3 adições) I operações elementares: 4 (n/2)2 = n2 I não ganhamos nada. . . Tente, então, repetir o truque recursivamente P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 11 / 33 Divisão e conquista Esqueleto do algoritmo: DIVIDA-E-CONQUISTE (u, v, n) 1 se n = 1 2 então devolva u × v 3 senão m ← n/2 4 a ← bu/10m c 5 b ← u mod 10m 6 ... 8 ... 13 devolva x Implementação: não leve as expressões bu/10m c e u mod 10m ao pé da letra P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 12 / 33 Divisão e conquista Divisão e conquista (n é potência de 2) DIVIDA-E-CONQUISTE (u, v, n) 1 se n = 1 2 então devolva u × v 3 senão m ← n/2 4 a ← bu/10m c 5 b ← u mod 10m 6 c ← bv/10m c 7 d ← v mod 10m 8 ac ← DIVIDA-E-CONQUISTE (a, c, m) 9 bd ← DIVIDA-E-CONQUISTE (b, d, m) 10 ad ← DIVIDA-E-CONQUISTE (a, d, m) 11 bc ← DIVIDA-E-CONQUISTE (b, c, m) 12 x ← ac · 102m + (ad + bc) · 10m + bd 13 devolva x P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 14 / 33 Divisão e conquista Número T (n) de operações elementares: e I T (1) = 1 I queremos uma “fórmula” I solução da recorrência: T (n) = 4 T (n/2) + n T (n) P. Feofiloff (IME-USP) para n > 1 = 4 T (n/2) + n = 4 4 T (n/4) + n/2 + n = 16 T (n/4) + 3n = 16 4 T (n/8) + n/4 + 3n = 64 T (n/8) + 7n = (2j )2 T (n/2j ) + (2j − 1)n = n2 T (n/n) + (n − 1)n = 2n2 − n Multiplicação de inteiros 25/7/2011 15 / 33 Divisão e conquista I T (n) = 2n2 − n I T (n) é proporcional a n2 I tão lento quanto o algoritmo ordinário. . . P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 16 / 33 Truque de Karatsuba Divisão e conquista: I u = a · 10n/2 + b v = c · 10n/2 + d I u × v = (a × c) · 10n + (a × d + b × c) · 10n/2 + b × d I 4 multiplicações de tamanho n/2 (e 3 adições) Truque I y = (a + b) × (c + d) = a × c + a × d + b × c + b × d I u × v = (a × c) · 10n + (y − a × c − b × d) · 10n/2 + b × d I 3 multiplicações de tamanho n/2 (e 6 adições) Estamos supondo n par P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 18 / 33 Truque de Karatsuba 99998888 77776666 7776222333334444 59247408 188873333 144433333 2727849413333 1357753103333 7777580112347408 P. Feofiloff (IME-USP) u v ac bd a+b c+d y y − ac − bd x Multiplicação de inteiros 25/7/2011 19 / 33 Truque de Karatsuba Número de operações elementares: I 3 multiplicações de tamanho n/2 I 3 (n/2)2 = 0.75 n2 operações elementares I ganhamos 25% com uma aplicação do truque I para ganhar mais, repita o truque recursivamente P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 20 / 33 Algoritmo de Karatsuba Algoritmo de Karatsuba (rascunho) RASCUNHO-DE-KARATSUBA (u, v, n) 1 se n = 1 2 então devolva u × v 3 senão m ← n/2 5 a ← bu/10m c 6 b ← u mod 10m 7 c ← bv/10m c 8 d ← v mod 10m 9 ac ← RASCUNHO-DE-KARATSUBA (a, c, m) 10 bd ← RASCUNHO-DE-KARATSUBA (b, d, m) 11 y ← RASCUNHO-DE-KARATSUBA (a + b, c + d, m + 1) 12 x ← ac · 102m + (y − ac − bd ) · 10m + bd 13 devolva x Idéia básica correta, mas tem erros técnicos P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 21 / 33 Algoritmo de Karatsuba Número de operações elementares: I T (n) = 3 T (n/2) + n para n = 2, 4, 8, 16, . . . e T (1) = 1 I solução da recorrência: T (n) = 3 nlg 3 − 2n I prova: I T (2j ) = 3 · 3j − 2 · 2j I conclusão: T (n) é proporcional a nlg 3 T (n) P. Feofiloff (IME-USP) = = = = 3 T (n/2) + n 3 (3 (n/2)lg 3 − 2(n/2)) + n 3 (nlg 3 − n) + n 3 nlg 3 − 2n Multiplicação de inteiros 25/7/2011 22 / 33 Algoritmo de Karatsuba n n2 nlg 3 8 64 27 16 256 81 32 1024 243 64 4096 729 128 16384 2187 256 65536 6561 512 262144 19683 1024 1048576 59049 2048 4194304 177147 2j P. Feofiloff (IME-USP) 4j 42% 32% 24% 18% 13% 10% 8% 6% 4% 3j Multiplicação de inteiros 25/7/2011 23 / 33 Algoritmo de Karatsuba I lg 3 ≈ 1.584 √ nlg 3 ≈ n n I nlg 3 cresce mais devagar que n2 I Karatsuba é mais rapido que o algoritmo ordinário (quando n é grande) I P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 24 / 33 Algoritmo de Karatsuba Algoritmo de Karatsuba: versão final, n arbitrário KARATSUBA (u, v, n) 1 se n ≤ 3 2 então devolva u × v 3 senão m ← dn/2e 4 a ← bu/10m c 5 b ← u mod 10m 6 c ← bv/10m c 7 d ← v mod 10m 8 ac ← KARATSUBA (a, c, m) 9 bd ← KARATSUBA (b, d, m) 10 y ← KARATSUBA (a + b, c + d, m + 1) 11 x ← ac · 102m + (y − ac − bd ) · 10m + bd 12 devolva x Linha 10: m + 1 < n pois n > 3 P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 25 / 33 Algoritmo de Karatsuba Testes de Liu, Huang, Lei: n 8 16 32 64 128 256 512 1024 2048 P. Feofiloff (IME-USP) milissegundos ordinário Karatsuba 0.000 0.002 0.007 0.027 0.101 0.388 1.541 6.079 24.460 0.008 0.010 0.019 0.045 0.128 0.368 1.111 3.400 12.000 Multiplicação de inteiros − 500% 271% 167% 127% 95% 72% 56% 49% 25/7/2011 27 / 33 Algoritmo de Karatsuba Quem é/foi Karatsuba? I A.A. Karatsuba (1937–2008), matemático russo I Karatsuba descobriu o algoritmo quando tinha 23 anos I o artigo foi publicado em 1962 sob os nomes de Karatsuba e Ofman P. Feofiloff (IME-USP) Multiplicação de inteiros homepage 25/7/2011 28 / 33 Algoritmos mais rápidos O algoritmo de Karatsuba é o mais rápido? I existem algoritmos de multiplicação ainda mais rápidos I algoritmo Toom-Cook: n1.465 I algoritmo Schönhage-Strassen: n lg n lg lg n P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 29 / 33 Conclusão I nem sempre um algoritmo óbvio é o melhor I algoritmos sofisticados podem ser mais rápidos (para n grande) I matemática ajuda a projetar algoritmos mais sofisticados I o poder do método de divisão-e-conquista I o poder da recursão I é útil saber resolver recorrências Próximo passo: multiplicação rápida de matrizes P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 30 / 33 Referências I Knuth, The Art of Computer Programming, 1997 I Brassard, and Bratley, Algorithmics: Theory and Practice, 1988 I Dasgupta, Papadimitriou, and Vazirani, Algorithms, 2006 I Kleinberg, and Tardos, Algorithm Design, 2005 I Multiplication algorithm I Karatsuba algorithm P. Feofiloff (IME-USP) Wikipedia Wikipedia Multiplicação de inteiros 25/7/2011 31 / 33 FIM Obrigado pela atenção! http://www.ime.usp.br/~pf/talks/UFABC-2011-07-25/ http://www.ime.usp.br/~pf/livrinho-AA/ P. Feofiloff (IME-USP) Multiplicação de inteiros 25/7/2011 32 / 33