02.06.2013 Views

Algoritmi di moltiplicazione veloce

Algoritmi di moltiplicazione veloce

Algoritmi di moltiplicazione veloce

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong><br />

Ultime notizie sui meto<strong>di</strong> <strong>di</strong> Toom-Cook<br />

Alberto Zanoni<br />

zanoni@volterra.uniroma2.it<br />

Roma, 6 ottobre 2010<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Interi luuuuuuuuuuuuuuuuunghi<br />

Un intero lungo<br />

m = 574627456789283791827392845746478273478129318349379<br />

Può esser visto come un polinomio in molti mo<strong>di</strong>:<br />

In base B = 10 =⇒ 5B d + 7B d−1+ · · · + 3B 2 + 7B + 9<br />

In base B = 10 2 =⇒ 5B D + 74B D−1+ · · · + 34B 2 + 93B + 79<br />

. . .<br />

In base B = 10 ⌈(d+1)/2⌉ =⇒ 5746 · · · 3928B + 4574 · · · 9379<br />

E similmente in base B = 2 k .<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Interi lunghi e <strong>moltiplicazione</strong> <strong>di</strong> polinomi<br />

Notazione<br />

Sia R = Z o Z[X ],<br />

da <br />

a(x) = aix i<br />

i=0<br />

Vogliamo calcolare il prodotto<br />

db <br />

, b(x) = bix i ∈ R[x]<br />

i=0<br />

dc <br />

c(x) = cix i ∈ R[x]<br />

i=0<br />

deg(a) = da ; deg(b) = db ; deg(c) = dc = da + db<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Interi lunghi e <strong>moltiplicazione</strong> <strong>di</strong> polinomi<br />

Approccio classico<br />

I meto<strong>di</strong> Toom-Cook costituiscono una famiglia <strong>di</strong> algoritmi<br />

per la <strong>moltiplicazione</strong> <strong>di</strong> polinomi in una variabile.<br />

Il metodo Toom-n si usa quando i fattori hanno ciascuno n<br />

coefficienti<br />

(gra<strong>di</strong> da = db = n − 1).<br />

Usare questi meto<strong>di</strong> per moltiplicare interi lunghi. . .<br />

è un attimo.<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


<strong>Algoritmi</strong> per la <strong>moltiplicazione</strong><br />

Sono noti vari algoritmi per la <strong>moltiplicazione</strong> <strong>di</strong> polinomi<br />

Naif O(d 2 )<br />

Karatsuba (1962) O(d log 2 3 )<br />

Toom-Cook-n (1963) O(d log n (2n−1) )<br />

Schönhage-Strassen (1971) O(d log d log log d)<br />

Fürer (2007) O(d log d2 O(log∗ d) )<br />

Ciascuno ha una propria complessità ed un certo intervallo in cui è<br />

il più <strong>veloce</strong>.<br />

Dopo Zuras e Zimmermann, Bodrato e Z. hanno analizzato<br />

l’ottimalità dei meto<strong>di</strong> Toom-Cook nei rispettivi intervalli <strong>di</strong><br />

applicabilità. Scoperta un’intera nuova famiglia <strong>di</strong> algoritmi.<br />

Solo due parole sull’algoritmo <strong>di</strong> Karatsuba. . .<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


L’algoritmo <strong>di</strong> Karatsuba<br />

A. A. Karatsuba ha proposto il primo metodo subquadratico <strong>di</strong><br />

<strong>moltiplicazione</strong>, per i polinomi <strong>di</strong> primo grado.<br />

a(x) = a1x + a0 ; b(x) = b1x + b0<br />

a(x)b(x) = c(x) = c2x 2 + c1x + c0<br />

− − − − − − − − − − − − − − − − −<br />

c(x) = (a1b1)x 2 + (a1b0 + a0b1)x + (a0b0)<br />

4 moltiplicazioni, 1 somma<br />

⇓<br />

c(x) = (a1b1)x 2 + ((a1 + a0)(b1 + b0) − a1b1 − a0b0)x + (a0b0)<br />

3 moltiplicazioni, 4 somme<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong><br />

Continua


Algoritmo <strong>di</strong> Karatsuba (1962)<br />

a(x) = a 1 x + a 0 ; b(x) = b 1 x + b 0 a(x), b(x) ∈ R[x]<br />

c(x) = a(x)∙b(x) = c 2 x 2 + c 1 x + c 0<br />

= (a 1 b 1 )x 2 + (a 1 b 0 +a 0 b 1 )x + (a 0 b 0 )<br />

a 1 b 1<br />

= c 2<br />

= (a 1 b 1 )x 2 + [(a 1 + a 0 )(b 1 + b 0 ) ­ a 1 b 1 ­ a 0 b 0 ] x + (a 0 b 0 )<br />

Naif – O ( n 2 = n log4/log2 ) Karatsuba – O ( n log3/log2 )<br />

a 0 b 1<br />

a 1 b 0<br />

a 0 b 0<br />

= c 0<br />

a 1 b 1<br />

4 prodotti 3 prodotti<br />

= c 2<br />

(a 1 + a 0 )(b 1 + b 0 )<br />

­ c 0 ­ c 2<br />

a 0 b 0<br />

= c 0


Algoritmo <strong>di</strong> Karatsuba<br />

a(x) = a d1 x d1 + a d1­1 x d1­1 + ∙∙∙ + a 1 x + a 0<br />

b(x) = b d2 x d2 + b d2­1 x d2­1 + ∙∙∙ + b 1 x + b 0<br />

d = max(d1,d2) y = x ⌈ (d+1)/2 ⌉<br />

Ricorsione sul grado<br />

a(x) = A(y) = A 1 (x) y + A 0 (x)<br />

b(x) = B(y) = B 1 (x) y + B 0 (x)


Ripassino dei meto<strong>di</strong> Toom-n<br />

Il cuore è composto da 3 fasi<br />

1 Spezzettamento: scegliamo una base e scomponiamo<br />

2 Valutazione<br />

5 Ricomposizione: sommiamo nei posti giusti.<br />

Fase 2, un po’ <strong>di</strong> algebra lineare<br />

Valutiamo i polinomi a(x), b(x) in 2n − 1 punti {vi} ∈ Z <strong>di</strong>versi.<br />

Questo equivale a moltiplicare una matrice <strong>di</strong> Vandermonde (non<br />

quadrata) per il vettore dei coefficienti.<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Ripassino dei meto<strong>di</strong> Toom-n<br />

Il cuore è composto da 3 fasi<br />

1 Spezzettamento: scegliamo una base e scomponiamo<br />

2 Valutazione: 2 prodotti matrice-vettore<br />

3 Prodotti<br />

5 Ricomposizione: sommiamo nei posti giusti.<br />

Fase 3, applicazione ricorsiva<br />

Caso sbilanciato<br />

Calcoliamo la valutazione del prodotto moltiplicando le valutazioni<br />

dei fattori.<br />

c(vi) = a(vi) · b(vi)<br />

(grado n − 1) × (grado n − 1) grado 2n − 2.<br />

(n parti) × (n parti) 2n − 1 parti. ⇒ 2n − 1 prodotti.<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Ripassino dei meto<strong>di</strong> Toom-n<br />

Il cuore è composto da 3 fasi<br />

1 Spezzettamento: scegliamo una base e scomponiamo<br />

2 Valutazione: 2 prodotti matrice-vettore<br />

3 Prodotti: (2n − 1) prodotti “più piccoli”<br />

4 Interpolazione<br />

5 Ricomposizione: sommiamo nei posti giusti.<br />

Fase 4, un altro po’ <strong>di</strong> algebra lineare<br />

Interpoliamo per ottenere i coefficienti del polinomio prodotto.<br />

Li otteniamo semplicemente moltiplicando l’inversa <strong>di</strong> una matrice<br />

<strong>di</strong> Vandermonde (o giù <strong>di</strong> lì) per il vettore delle valutazioni.<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Ripassino dei meto<strong>di</strong> Toom-n<br />

Il cuore è composto da 3 fasi<br />

1 Spezzettamento: scegliamo una base e scomponiamo<br />

2 Valutazione: 2 prodotti matrice-vettore<br />

3 Prodotti: (2n − 1) prodotti “più piccoli”<br />

4 Interpolazione: prodotto matrice inversa-vettore<br />

5 Ricomposizione: sommiamo nei posti giusti.<br />

Le fasi 2 e 4 sono “critiche”<br />

Dividendo in n parti si hanno (2n − 1) prodotti nella fase 3, con<br />

comportamento asintotico Θ(d log n (2n−1) ). Punto.<br />

La costante moltiplicativa <strong>di</strong>pende dai punti <strong>di</strong> valutazione/<br />

interpolazione e dalla sequenza <strong>di</strong> operazioni per le fasi 2 e 4.<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Operan<strong>di</strong> sbilanciati<br />

Fattori con gra<strong>di</strong> <strong>di</strong>versi<br />

Toom-(n+m)/2<br />

(grado n − 1) × (grado m − 1) grado n + m − 2<br />

(n parti) × (m parti) n + m − 1 parti<br />

Caso bilanciato<br />

I meto<strong>di</strong> Toom possono essere applicati anche a polinomi con gra<strong>di</strong><br />

<strong>di</strong>versi. La fase <strong>di</strong> valutazione <strong>di</strong>pende da m e n separatamente,<br />

mentre la fase <strong>di</strong> interpolazione solo da n + m.<br />

Toom-2.5 Toom-3 sbilanciato<br />

(deg 2) × (deg 1) deg 3 (deg 3) × (deg 1) deg 4<br />

(3 parti) × (2 parti) 4 parti (4 parti) × (2 parti) 5 parti<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Esempi per due casi base<br />

Le matrici <strong>di</strong> interpolazione per Toom-2.5 e Toom-3 sono<br />

⎛<br />

1<br />

⎜<br />

A2.5 = ⎜−1<br />

⎝ 1<br />

0<br />

0 0<br />

1 −1<br />

1 1<br />

0 0<br />

⎞<br />

0<br />

1 ⎟<br />

1 ⎠<br />

1<br />

;<br />

⎛<br />

1 0<br />

⎜<br />

⎜16<br />

8<br />

A3 = ⎜ 1 −1<br />

⎝ 1 1<br />

0 0<br />

0 0<br />

4 2<br />

1 −1<br />

1 1<br />

0 0<br />

0<br />

1<br />

1<br />

1<br />

1<br />

Teorema<br />

Per n 3, det(An) non è una potenza <strong>di</strong> 2 (serve una <strong>di</strong>visione).<br />

Teorema<br />

Sia An generata da {∞, 1, −1, v4, . . . , v2n−2, 0}. Al più 2n − 5<br />

<strong>di</strong>visioni sono necessarie nella fase <strong>di</strong> interpolazione.<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong><br />

⎞<br />

⎟<br />


Alcune definizioni utili<br />

Per una matrice quadrata M:<br />

Definizione<br />

M[i, j] : il coefficiente in posizione (i, j)<br />

M (i) : l’i ma riga<br />

M [j] : la j ma colonna<br />

Il supporto s(M (i) ) <strong>di</strong> M (i) è l’insieme <strong>di</strong> in<strong>di</strong>ci <strong>di</strong> colonne j ∈ N<br />

tali che M[i, j] = 0. Similmente per M [i] .<br />

Il supporto s(M) <strong>di</strong> M è l’insieme <strong>di</strong> coppie (i, j) ∈ N × N tali che<br />

M[i, j] = 0.<br />

# M (i) = car<strong>di</strong>nalità <strong>di</strong> s(M (i) ). Similmente per # M [i] and # M.<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


La partita da giocare<br />

SCOPO DEL GIOCO: trovare la migliore (più efficiente)<br />

sequenza <strong>di</strong> operazioni elementari <strong>di</strong> riga per trasformare la matrice<br />

An nella matrice identica.<br />

Ci sono ∞ possibili sequenze d’inversione (SdI).<br />

Restringiamo le operazioni ammissibili definendo due criteri.<br />

Questi definiscono un “modello finito”, in modo tale da<br />

rendere possibile una ricerca esaustiva.<br />

Descriviamo tale modello come un grafo pesato.<br />

Vinciamo la partita risolvendo un problema <strong>di</strong> cammini minimi<br />

su tale grafo.<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


I criteri del modello<br />

· · · → M (i)<br />

−→ M → · · · → I<br />

(A) Riduzione del supporto :<br />

# M (i) < # M (i) ∧ M[i, j] = 0 ⇒ M[i, j] = 0 <br />

Almeno un coefficiente nullo in più. I “vecchi” 0 non<br />

vengono mo<strong>di</strong>ficati.<br />

(B) Regolarizzazione : M[i, j]/M[i ′ , j] = M[i, j ′ ]/M[i ′ , j ′ ].<br />

Più coefficienti che <strong>di</strong>fferiscono dai corrispondenti in<br />

un’altra linea per un fattore moltiplicativo comune.<br />

Esempio (A,B): in A3,<br />

(16 8 4 2 1) + 2(1 -1 1 -1 1) →(18 6 6 0 3)<br />

( 1 1 1 1 1)<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Operazioni lineari che consideriamo<br />

Combinazioni lineari<br />

li ← (ci · li + cj · lj)/<strong>di</strong>, con ci, cj, <strong>di</strong> costanti “piccole”.<br />

“piccole” vuol <strong>di</strong>re fissate: asintoticamente piccole. Tipicamente <strong>di</strong> 1 parola.<br />

Basic on long operands: linear operations<br />

|ci| |cj| <strong>di</strong> cost<br />

Somma/Sottrazione 1 1 1 ADD<br />

c.l. del primo tipo 1 2 k 1 ADD + ( 1 2)<br />

2 k 1 1 ADD + ( 1 2)<br />

c.l. del secondo tipo 1 = 2 k 1 ADD + ( 1 X)<br />

= 2 k 1 1 ADD + ( 1 X)<br />

Divisione per 2 k (shift) 1 0 2 k SHIFT<br />

Divisione esatta 1 0 = 2 k DIV<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Il grafo <strong>di</strong> Toom<br />

Sia G = (V , E, w) il grafo pesato così definito<br />

1 V è l’insieme <strong>di</strong> matrici ottenuto da An tramite → ∗ , soggetta<br />

ai criteri (A) e (B).<br />

2 E è l’insieme <strong>di</strong> archi tale che (M, M) ∈ E ⇔ M può essere<br />

ottenuta da M con una combinazione lineare ammissibile.<br />

Definizione: funzione peso<br />

Per ε ∈ E, w(ε) è il costo della combinazione lineare<br />

corrispondente. Per una catena C, w(C) = <br />

w(ε).<br />

w(M) = min<br />

C(M,I ) {w(C)}<br />

ε∈C<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Esempio (grafo <strong>di</strong> Karatsuba): Sia (v1 = ∞, v2 = 1, v3 = 0)<br />

<br />

1 0 0<br />

1 1 1<br />

<br />

1 0 0<br />

ε1<br />

−−−−→ 0 1 1<br />

0 0 1<br />

⏐<br />

ε2<br />

0 0 1<br />

⏐<br />

ε3 <br />

1 0 0<br />

1 1 0<br />

0 0 1<br />

ε4<br />

−−−−→ I<br />

Esempio (grafo <strong>di</strong> Knuth): Sia (v1 = ∞, v2 = −1, v3 = 0)<br />

<br />

1 0 0<br />

1 0 0<br />

ε1<br />

1 −1 1 −−−−→ 0 −1 1<br />

0 0 1<br />

⏐<br />

ε2<br />

0 0 1<br />

⏐<br />

ε3 <br />

1 0 0<br />

1 −1 0<br />

ε4<br />

−−−−→ I<br />

0 0 1<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Euristiche per la “potatura” del grafo<br />

Usiamo una funzione ricorsiva f per visitare G, che ricorda alcuni<br />

vertici per un po’ <strong>di</strong> tempo per trarre beneficio dai valori calcolati<br />

in precedenza.<br />

Calcoliamo stime e(M) (dal basso) <strong>di</strong> w(M) applicando varie<br />

euristiche (car<strong>di</strong>nalità del supporto della matrice, valore del<br />

determinanate, presenza <strong>di</strong> sottomatrici, ecc).<br />

Introduciamo una soglia t (parametro per f ) per evitare <strong>di</strong><br />

analizzare sottografi non interessanti. Se e(M) > t il<br />

sottografo “sotto” M non viene analizzato (non è possibile<br />

trovare una SdI migliore).<br />

t viene aggiornato via via che f visita G: se M ε<br />

−→ M e<br />

f (M, t) si richiama, la chiamata ricorsiva è f ( M, t − w(ε)).<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


SdI ottima per Toom-2.5<br />

A2.5, generata da {∞, −1, 1, 0}, con det(A2.5) = 2.<br />

Il grafo <strong>di</strong> Toom ha 17 no<strong>di</strong>. Il costo totale è<br />

4 · ADD + SHIFT<br />

⎛ ⎞<br />

1 0 0 0<br />

⎜−1<br />

1 −1 1⎟<br />

A3,2 = ⎝ 1 1 1 1⎠<br />

0 0 0 1<br />

2+=3<br />

⎛ ⎞ ⎛ ⎞<br />

1 0 0 0 1 0 0 0<br />

2≫(1)<br />

⎜0<br />

2 0 2⎟<br />

⎜0<br />

1 0 1⎟<br />

=⇒ ⎝1<br />

1 1 1⎠<br />

=⇒ ⎝<br />

3−=1 0 1 1 1⎠<br />

0 0 0 1 0 0 0 1<br />

3−=2<br />

=⇒<br />

2−=4 I<br />

ci sono 16 SdI minime equivalenti.<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


SdI ottima per Toom-3<br />

A3, generata da {∞, 2, −1, 1, 0}, con det(A3) = 12.<br />

La SdI implementata in GMP 4.2.1 usava entrambi i criteri. Il suo<br />

costo era<br />

wGMP = 8 · ADD + DIV + 2 · SHIFT + 2 · ( 1 2)<br />

La soluzione da noi trovata usando solo il criterio (A) ha costo<br />

wBZ = 8 · ADD + DIV + SHIFT + min( 1 X, SHIFT) + 1 2<br />

a seconda <strong>di</strong> quale tra 1 X, SHIFT sia minore.<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


SdI ottima per Toom-3, quando SHIFT < 1 X<br />

⎛ ⎞<br />

1 0 0 0 0<br />

⎛ ⎞<br />

1 0 0 0 0<br />

⎛ ⎞<br />

1 0 0 0 0<br />

⎜16<br />

8 4 2 1⎟<br />

2−=4 ⎜15<br />

9 3 3 0⎟<br />

4=3−4 ⎜15<br />

9 3 3 0⎟3−=5<br />

A3 = ⎜ 1 1 1 1 1⎟<br />

⎝ ⎠ =⇒ ⎜ 1 1 1 1 1⎟<br />

⎝ ⎠ =⇒ ⎜ 1 1 1 1 1⎟<br />

⎝ ⎠ =⇒<br />

1-1 1-1 1<br />

1-1 1-1 1<br />

0 2 0 2 0<br />

0 0 0 0 1<br />

0 0 0 0 1<br />

0 0 0 0 1<br />

⎛ ⎞<br />

1 0 0 0 0<br />

⎛ ⎞<br />

1 0 0 0 0<br />

⎜15<br />

9 3 3 0⎟<br />

2/=(3) ⎜5<br />

3 1 1 0⎟<br />

⎜ 1 1 1 1 0⎟<br />

⎝ ⎠ =⇒ ⎜1<br />

1 1 1 0⎟<br />

0 2 0 2 0 4≫(1) ⎝ ⎠<br />

0 1 0 1 0<br />

0 0 0 0 1<br />

0 0 0 0 1<br />

⎛ ⎞<br />

1 0 0 0 0<br />

⎜2<br />

1 0 0 0⎟<br />

⎜1<br />

1 1 1 0⎟<br />

⎝ ⎠<br />

0 1 0 1 0<br />

0 0 0 0 1<br />

2−=3<br />

=⇒<br />

⎛ ⎞<br />

1 0 0 0 0<br />

⎜4<br />

2 0 0 0⎟<br />

⎜1<br />

1 1 1 0⎟<br />

⎝ ⎠<br />

0 1 0 1 0<br />

0 0 0 0 1<br />

2≫(1)<br />

=⇒<br />

⎛ ⎞<br />

1 0 0 0 0<br />

⎛ ⎞<br />

1 0 0 0 0<br />

3−=4 ⎜2<br />

1 0 0 0⎟2−=(2)1⎜0<br />

1 0 0 0⎟4−=2<br />

=⇒ ⎜1<br />

0 1 0 0⎟<br />

⎝ ⎠ =⇒ ⎜0<br />

0 1 0 0⎟<br />

0 1 0 1 0 3−=1 ⎝ ⎠ =⇒ I<br />

0 1 0 1 0<br />

0 0 0 0 1<br />

0 0 0 0 1<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Toom-3.5 (prodotti sbilanciati 4 × 3 o 5 × 2)<br />

A3.5, generata da {∞, 2, −2, 1, −1, 0}. Il costo è<br />

12 · ADD + 2 · DIV + 2 · SHIFT + 2 · ( 1 2)<br />

⎛<br />

1 0 0 0 0 0<br />

⎜ 32<br />

⎜<br />

⎜−32<br />

A3.5 = ⎜ 1<br />

⎝ −1<br />

16<br />

16<br />

1<br />

1<br />

8<br />

−8<br />

1<br />

−1<br />

4<br />

4<br />

1<br />

1<br />

2<br />

−2<br />

1<br />

−1<br />

1<br />

1<br />

1<br />

1<br />

0 0 0 0 0 1<br />

È necessario un passo <strong>di</strong> regolarizzazione (B).<br />

⎞<br />

⎟<br />

⎠<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Toom-4 (4 × 4 o 5 × 3 o 6 × 2)<br />

<br />

A4, generata da ∞, 2, 1, −1, 1<br />

<br />

, −1 , 0 . Il peso è<br />

2 2<br />

18·ADD + 3·DIV + SHIFT + min ( 1 X , SHIFT) + 2·( 1 X) + 4·( 1 2)<br />

⎛<br />

1<br />

⎜ 64<br />

⎜ 1<br />

⎜<br />

A4 = ⎜ 1<br />

⎜ 1<br />

⎝ 1<br />

0<br />

32<br />

1<br />

−1<br />

2<br />

−2<br />

0<br />

16<br />

1<br />

1<br />

4<br />

4<br />

0<br />

8<br />

1<br />

−1<br />

8<br />

−8<br />

0<br />

4<br />

1<br />

1<br />

16<br />

16<br />

0<br />

2<br />

1<br />

−1<br />

32<br />

−32<br />

⎞<br />

0<br />

1 ⎟<br />

1 ⎟<br />

1 ⎟<br />

64<br />

⎟<br />

64 ⎠<br />

0 0 0 0 0 0 1<br />

È necessario un passo <strong>di</strong> regolarizzazione (B).<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Toom-4.5 (5 × 4 o 6 × 3 o 7 × 2)<br />

<br />

A4.5, generata da ∞, −1, −2, 1<br />

<br />

, 1, 2, −1 , 0 . Il peso è<br />

2 2<br />

22 · ADD + 4 · DIV + SHIFT + 3 ·( 1 X) + 6 ·( 1 2)<br />

⎛<br />

1 0 0 0 0 0 0<br />

⎞<br />

0<br />

⎜ −1<br />

⎜<br />

⎜−128<br />

⎜<br />

A4.5 = ⎜ 1<br />

⎜<br />

1<br />

⎜ 128<br />

⎝<br />

1<br />

1 −1<br />

64 −32<br />

2 4<br />

1 1<br />

64 32<br />

−2 4<br />

1<br />

16<br />

8<br />

1<br />

16<br />

−8<br />

−1 1<br />

−8 4<br />

16 32<br />

1 1<br />

8 4<br />

16 −32<br />

−1 1⎟<br />

−2 1 ⎟<br />

64 128 ⎟<br />

1 1 ⎟<br />

2 1⎟<br />

⎠<br />

64 −128<br />

0 0 0 0 0 0 0 1<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Toom-5 (5 × 5 o 6 × 4 o 7 × 3 o 8 × 2)<br />

<br />

A5, generata da ∞, −2, 1<br />

<br />

, 4, 2, −1, 1, −1 , 0 . Il peso è<br />

2 2<br />

32 · ADD + 5 · DIV + 2 · SHIFT + 6 ·( 1 X) + 8 ·( 1 2)<br />

⎛<br />

1 0 0 0 0 0 0 0 0<br />

⎜256<br />

−128<br />

⎜ 1 2<br />

⎜ 4<br />

A5 = ⎜<br />

⎝<br />

64 −32<br />

4 8<br />

16 −8<br />

16 32<br />

4 −2<br />

64 128<br />

1<br />

256<br />

8 47 46 45 ⎞<br />

256 128<br />

1 −1<br />

1 1<br />

1 −2<br />

64 32<br />

1 −1<br />

1 1<br />

4 −8<br />

256 64<br />

16 8<br />

1 −1<br />

1 1<br />

16 −32<br />

16 4<br />

4 2<br />

1 −1<br />

1 1<br />

64 −128<br />

⎟<br />

1 ⎟<br />

1 ⎟<br />

1 ⎟<br />

1 ⎟<br />

⎠<br />

256<br />

0 0 0 0 0 0 0 0 1<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Il guadagno per Toom-3<br />

Abbiamo implementato co<strong>di</strong>ce GMP per Toom-3 con la nuova SdI.<br />

101<br />

100<br />

99<br />

98<br />

97<br />

96<br />

Toom-3 new/old %<br />

100 %<br />

95<br />

0 500 1000 1500 2000 2500 3000 3500<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>


Bibliografia temporanea<br />

(Bodrato, Zanoni) Sequenze complete d’inversione per<br />

Toom-3.5, Toom-4, Toom-4.5, Toom-5 in<br />

What About Toom-Cook Matrices Optimality ?<br />

Preprint 605, Centro ”Vito Volterra”, Ottobre 2006<br />

Integer and Polynomial Multiplication: Towards Optimal<br />

Toom-Cook Matrices<br />

Procee<strong>di</strong>ngs ISSAC 2007, Waterloo, Canada, Luglio 2007<br />

Alberto Zanoni <strong>Algoritmi</strong> <strong>di</strong> <strong>moltiplicazione</strong> <strong>veloce</strong>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!