Algoritmi di moltiplicazione veloce
Algoritmi di moltiplicazione veloce
Algoritmi di moltiplicazione veloce
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 d11 x d11 + ∙∙∙ + a 1 x + a 0<br />
b(x) = b d2 x d2 + b d21 x d21 + ∙∙∙ + 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>