Multiplicação de inteiros - Algoritmo de Karatsuba - IME-USP

Propaganda
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
Download