02.06.2013 Views

Algoritmi di moltiplicazione veloce

Algoritmi di moltiplicazione veloce

Algoritmi di moltiplicazione veloce

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<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!