next up previous contents
Next: Multiplicação de polinômios usando Up: Aspectos computacionais Previous: Alguns programas usando a

O algoritmo de multiplicação de Karatsuba

A forma de multiplicar inteiros ensinada na escola é simples e conveniente para inteiros relativamente pequenos, mas vejamos seu custo. Para multiplicar dois inteiros de n algarismos na base dprocedemos basicamente a partir da fórmula:

\begin{displaymath}(\sum_i a_i d^i)(\sum_j b_j d^j) = \sum_{i,j} a_i b_j d^{i+j}:\end{displaymath}

calculamos (ou olhamos na tabuada) todos os produtos de um algarismo de um dos inteiros com um algarismo do outro, multiplicamos pela potência de d apropriada (o que equivale a acrescentar zeros à direita) e somamos as n2parcelas obtidas. Efetuamos no processo n2 multiplicações e um número comparável de somas; assim, o tempo gasto com este algoritmo é aproximadamente A n2para alguma constante positiva A. Se isto fosse o melhor que pudéssemos fazer, o tempo para checar a primalidade de Mp seria aproximadamente A p3. Existem entretanto outros algoritmos de multiplicação: examinemos primeiro um algoritmo relativamente simples, o algoritmo de Karatsuba, usado pela biblioteca gmp (e portanto por nossos programas acima).

Sejam A e B dois inteiros com n algarismos cada um. Se $m = \lceil n/2 \rceil$, podemos escrever A = A1 dm + A0, B = B1 dm + B0 e AB = A1 B1 d2m + (A1 B0 + A0 B1) dm + A0 B0. Pelo algoritmo anterior, calcularíamos os quatro produtos de inteiros com m algarismos. Entretanto, os produtos A1 B0 e A0 B1não são necessários individualmente, e podemos calcular sua soma da seguinte forma:

A1 B0 + A0 B1 = (A1 - A0)(B0 - B1) + A1 B1 + A0 B0.

Em outras palavras, podemos escrever

AB = A1 B1 (d2m + dm) + (A1 - A0)(B0 - B1) dm + A0 B0 (dm + 1).

Assim, podemos calcular os três coeficientes com apenas três multiplicações (ao invés de quatro) e algumas somas. Mesmo que o número de somas aumente, já sabemos que somas são rápidas e portanto podemos esperar que este algoritmo represente uma melhora substancial em relação ao anterior.

Mais precisamente, repetimos este processo para diminuirmos o tamanho dos inteiros. Assim, se denotarmos por f(n) o tempo necessário para multiplicar inteiros de n algarismos temos $f(n) \approx 3 f(\lceil n/2 \rceil) + A n$ e provamos facilmente que

\begin{displaymath}f(n) \approx A n^\alpha,\end{displaymath}

onde $\alpha = (\log 3)/(\log 2)$.


next up previous contents
Next: Multiplicação de polinômios usando Up: Aspectos computacionais Previous: Alguns programas usando a
Nicolau C. Saldanha
1999-08-09