Salta al contenuto
Note per Studenti Esercizio - algoritmo di Strassen sulle matrici supercircolanti (esercizi su supercircolanti e circolanti, es. SC 6)

Esercizio - algoritmo di Strassen sulle matrici supercircolanti (esercizi su supercircolanti e circolanti, es. SC 6)

In questa pagina 6

Esercizio supplementare 6 sulle matrici supercircolanti, dalle note ed esercizi del corso di Algoritmi per l'Ingegneria (Ing. Informatica UniPD) su supercircolanti e circolanti. Teoria usata: Algoritmo di Strassen e ibridazioneStrassen calcola il prodotto n x n con 7 chiamate ricorsive invece di 8, usando 10 somme/sottrazioni nel divide e 8 nel conquer: T(n) = 7T(n/2) + (9/2)n^2, Theta(n^(log2 7)) con soluzione esatta 7n^(log2 7) - 6n^2; la costante 7 è più che tripla di quella dell'iterativo (2) e Strassen batte l'iterativo solo da n = 655 (per le potenze di 2, da 1024). L'ibridazione cambia il caso base (iterativo per n <= n0): costo n^(log2 7)(2n0+5)/n0^(log2 7 - 2) - 6n^2, minimo per n0 = 8 con costante ~3.92.Algoritmo di Strassen e ibridazione →, Matrici circolanti e supercircolanti - algoritmi divide and conquerle matrici supercircolanti (quadranti alternati ricorsivi) hanno solo n valori distinti: somma in n operazioni, prodotto in 4n log2 n + n con il trucco (A1+A2)(B1+B2) e (A1-A2)(B1-B2) invece delle 4 chiamate (Theta(n^2)); gli autovalori sono la trasformata di Hadamard della prima riga (FHT, n log2 n) e il prodotto passa dalla base diagonalizzante; le matrici circolanti sono polinomi nella matrice di rotazione R, il loro prodotto è la convoluzione ciclica delle prime righe e si diagonalizzano con la matrice di Fourier: prodotto in O(n log n) con la FFT.Matrici circolanti e supercircolanti - algoritmi divide and conquer →, Master Theorem - enunciato, casi e applicazioniMaster Theorem per T(n) = aT(n/b) + w(n): si confronta w(n) con la funzione soglia n^(log_b a). Caso 1 (w minore di una potenza polinomiale): Theta(n^(log_b a)); caso 2 (w della stessa taglia): Theta(n^(log_b a) log n); caso 3 (w maggiore e regolare): Theta(w(n)). Prova completa dai livelli dell'albero, versione estesa (parti intere, n0 qualsiasi), esempi, e l'uso scorretto quando nessun caso si applica (w = n log n).Master Theorem - enunciato, casi e applicazioni → e Albero della ricorrenza e formula generale per le ricorrenzeL'albero della ricorrenza ha la forma dell'albero delle chiamate dell'istanza peggiore e T(n) è la somma dei lavori dei nodi. Per la famiglia T(n) = s(n)T(f(n)) + w(n) con base T0 per n <= n0, contando i nodi per livello con le iterate di f e il livello f(n,n0) si ottiene la formula chiusa T(n) = somma_l [prodotto_j s(f^(j)(n))] w(f^(l)(n)) + [prodotto s] T0, verificata per induzione e applicata a esempi (merge sort, Hanoi, ricorrenze con radice).Albero della ricorrenza e formula generale per le ricorrenze →.*

Testo

Strassen SC. Si analizzi come si semplifica la proprietà di sottostruttura dell'algoritmo di Strassen quando le matrici da moltiplicare sono supercircolanti (SC). Suggerimenti:

  • Onde evitare confusione tra i blocchi delle SC e i fattori n2×n2\frac n2 \times \frac n2 predisposti da Strassen in fase di divide, si denotino questi ultimi come SiS_i e DiD_i (i=1,2,…,7i = 1, 2, \dots, 7) invece che come AiA_i e BiB_i (notazione delle dispense).
  • Le semplificazioni possono derivare, in fase di divide, dall'uguaglianza (talvolta a meno del segno) dei fattori, ma anche in fase di conquer, considerando che la matrice prodotto deve essere SC.

Si analizzi il numero di operazioni di un algoritmo per moltiplicare matrici SC basato sulla proprietà di sottostruttura come da voi semplificata. L'algoritmo ottenuto è competitivo con quello O(nlog⁡2n)O(n \log_2 n)?

Punto di partenza

Per due SC A=(A1A2A2A1)A = \begin{pmatrix} A_1 & A_2 \\ A_2 & A_1 \end{pmatrix} e B=(B1B2B2B1)B = \begin{pmatrix} B_1 & B_2 \\ B_2 & B_1 \end{pmatrix} i quadranti sono

A11=A22=A1,A12=A21=A2,B11=B22=B1,B12=B21=B2.A_{11} = A_{22} = A_1, \quad A_{12} = A_{21} = A_2, \qquad B_{11} = B_{22} = B_1, \quad B_{12} = B_{21} = B_2.

Si riscrivono le formule di Strassen (Algoritmo di Strassen e ibridazioneStrassen calcola il prodotto n x n con 7 chiamate ricorsive invece di 8, usando 10 somme/sottrazioni nel divide e 8 nel conquer: T(n) = 7T(n/2) + (9/2)n^2, Theta(n^(log2 7)) con soluzione esatta 7n^(log2 7) - 6n^2; la costante 7 è più che tripla di quella dell'iterativo (2) e Strassen batte l'iterativo solo da n = 655 (per le potenze di 2, da 1024). L'ibridazione cambia il caso base (iterativo per n <= n0): costo n^(log2 7)(2n0+5)/n0^(log2 7 - 2) - 6n^2, minimo per n0 = 8 con costante ~3.92.Algoritmo di Strassen e ibridazione →) con SiS_i e DiD_i al posto di AiA_i e BiB_i dei fattori:

Pi=Si×Di,C11=P1+P2−P4+P6,C12=P4+P5,C21=P6+P7,C22=P2−P3+P5−P7,P_i = S_i \times D_i, \quad C_{11} = P_1 + P_2 - P_4 + P_6, \quad C_{12} = P_4 + P_5, \quad C_{21} = P_6 + P_7, \quad C_{22} = P_2 - P_3 + P_5 - P_7,

con S1=A12−A22S_1 = A_{12} - A_{22}, S2=A11+A22S_2 = A_{11} + A_{22}, S3=A11−A21S_3 = A_{11} - A_{21}, S4=A11+A12S_4 = A_{11} + A_{12}, S5=A11S_5 = A_{11}, S6=A22S_6 = A_{22}, S7=A21+A22S_7 = A_{21} + A_{22}, e D1=B21+B22D_1 = B_{21} + B_{22}, D2=B11+B22D_2 = B_{11} + B_{22}, D3=B11+B12D_3 = B_{11} + B_{12}, D4=B22D_4 = B_{22}, D5=B12−B22D_5 = B_{12} - B_{22}, D6=B21−B11D_6 = B_{21} - B_{11}, D7=B11D_7 = B_{11}.

Semplificazione del divide

Sostituendo i quadranti SC:

ii SiS_i DiD_i
1 A2−A1A_2 - A_1 B2+B1B_2 + B_1
2 A1+A1=2A1A_1 + A_1 = 2A_1 B1+B1=2B1B_1 + B_1 = 2B_1
3 A1−A2A_1 - A_2 B1+B2B_1 + B_2
4 A1+A2A_1 + A_2 B1B_1
5 A1A_1 B2−B1B_2 - B_1
6 A1A_1 B2−B1B_2 - B_1
7 A2+A1A_2 + A_1 B1B_1

Si leggono quattro uguaglianze:

  • S1=−S3S_1 = -S_3 e D1=D3D_1 = D_3, quindi P1=−P3P_1 = -P_3 (uguaglianza a meno del segno);
  • S5=S6S_5 = S_6 e D5=D6D_5 = D_6, quindi P5=P6P_5 = P_6;
  • S4=S7S_4 = S_7 e D4=D7D_4 = D_7, quindi P4=P7P_4 = P_7;
  • S2=2A1S_2 = 2A_1 e D2=2B1D_2 = 2B_1, quindi P2=4 A1B1P_2 = 4\,A_1B_1.

I sette prodotti si riducono a quattro prodotti distinti, di matrici SC di ordine n2\frac n2 (i fattori sono somme e differenze di SC, quindi SC):

Q1=(A1−A2)(B1+B2),Q2=A1B1,Q4=(A1+A2)B1,Q5=A1(B2−B1),Q_1 = (A_1 - A_2)(B_1 + B_2), \quad Q_2 = A_1B_1, \quad Q_4 = (A_1 + A_2)B_1, \quad Q_5 = A_1(B_2 - B_1),

con P1=−Q1P_1 = -Q_1, P3=Q1P_3 = Q_1, P2=4Q2P_2 = 4Q_2, P4=P7=Q4P_4 = P_7 = Q_4, P5=P6=Q5P_5 = P_6 = Q_5. Per i fattori servono 44 operazioni su SC di ordine n2\frac n2: A1−A2A_1 - A_2, B1+B2B_1 + B_2, A1+A2A_1 + A_2, B2−B1B_2 - B_1 (i fattori A1A_1 e B1B_1 sono blocchi, senza costo). Sono 4⋅n2=2n4 \cdot \frac n2 = 2n operazioni di divide, contro le 10⋅n2410 \cdot \frac{n^2}{4} di Strassen generale.

Semplificazione del conquer

C11=P1+P2−P4+P6=−Q1+4Q2−Q4+Q5,C12=P4+P5=Q4+Q5,C21=P6+P7=Q5+Q4,C_{11} = P_1 + P_2 - P_4 + P_6 = -Q_1 + 4Q_2 - Q_4 + Q_5, \qquad C_{12} = P_4 + P_5 = Q_4 + Q_5, \qquad C_{21} = P_6 + P_7 = Q_5 + Q_4,

C22=P2−P3+P5−P7=4Q2−Q1+Q5−Q4.C_{22} = P_2 - P_3 + P_5 - P_7 = 4Q_2 - Q_1 + Q_5 - Q_4.

Poiché il prodotto di due SC è SC, i due quadranti uguali sono C1=C11=C22C_1 = C_{11} = C_{22} e C2=C12=C21C_2 = C_{12} = C_{21}; le formule lo confermano: C12=C21=Q4+Q5C_{12} = C_{21} = Q_4 + Q_5 e C11=C22=−Q1+4Q2−Q4+Q5C_{11} = C_{22} = -Q_1 + 4Q_2 - Q_4 + Q_5. Basta calcolare due matrici:

C1=−Q1+4Q2−Q4+Q5,C2=Q4+Q5.C_1 = -Q_1 + 4Q_2 - Q_4 + Q_5, \qquad C_2 = Q_4 + Q_5.

Controllo con la definizione (C1=A1B1+A2B2C_1 = A_1B_1 + A_2B_2, C2=A1B2+A2B1C_2 = A_1B_2 + A_2B_1): Q4+Q5=A1B1+A2B1+A1B2−A1B1=A2B1+A1B2=C2Q_4 + Q_5 = A_1B_1 + A_2B_1 + A_1B_2 - A_1B_1 = A_2B_1 + A_1B_2 = C_2 ✓; e, sviluppando, −Q1+4Q2−Q4+Q5=−(A1B1+A1B2−A2B1−A2B2)+4A1B1−(A1B1+A2B1)+(A1B2−A1B1)=A1B1(−1+4−1−1)+A1B2(−1+1)+A2B1(1−1)+A2B2=A1B1+A2B2=C1-Q_1 + 4Q_2 - Q_4 + Q_5 = -(A_1B_1 + A_1B_2 - A_2B_1 - A_2B_2) + 4A_1B_1 - (A_1B_1 + A_2B_1) + (A_1B_2 - A_1B_1) = A_1B_1(-1 + 4 - 1 - 1) + A_1B_2(-1 + 1) + A_2B_1(1 - 1) + A_2B_2 = A_1B_1 + A_2B_2 = C_1 ✓.

Algoritmo e conteggio

S_STRASSEN(A, B)              { A, B SC di ordine n = 2^k }
  n <- rows(A)
  if n = 1 then return [a11 * b11]
  * A = [A1 A2; A2 A1],  B = [B1 B2; B2 B1] *
  Q1 <- S_STRASSEN(S_SUB(A1, A2), S_SUM(B1, B2))
  Q2 <- S_STRASSEN(A1, B1)
  Q4 <- S_STRASSEN(S_SUM(A1, A2), B1)
  Q5 <- S_STRASSEN(A1, S_SUB(B2, B1))
  C1 <- S_SUM( S_SUB( S_SUB( S_SCALPROD(4, Q2), Q1), Q4), Q5)
  C2 <- S_SUM(Q4, Q5)
  return [C1 C2; C2 C1]

Operazioni sui nodi interni, ciascuna su SC di ordine n2\frac n2 (costo n2\frac n2, vedi Matrici circolanti e supercircolanti - algoritmi divide and conquerle matrici supercircolanti (quadranti alternati ricorsivi) hanno solo n valori distinti: somma in n operazioni, prodotto in 4n log2 n + n con il trucco (A1+A2)(B1+B2) e (A1-A2)(B1-B2) invece delle 4 chiamate (Theta(n^2)); gli autovalori sono la trasformata di Hadamard della prima riga (FHT, n log2 n) e il prodotto passa dalla base diagonalizzante; le matrici circolanti sono polinomi nella matrice di rotazione R, il loro prodotto è la convoluzione ciclica delle prime righe e si diagonalizzano con la matrice di Fourier: prodotto in O(n log n) con la FFT.Matrici circolanti e supercircolanti - algoritmi divide and conquer →):

  • divide: 44 (le due differenze A1−A2A_1 - A_2, B2−B1B_2 - B_1 e le due somme B1+B2B_1 + B_2, A1+A2A_1 + A_2);
  • conquer: S_SCALPROD(4,Q2)\mathrm{S\_SCALPROD}(4, Q_2), due sottrazioni e una somma per C1C_1, e una somma per C2C_2: 55.

Totale 9⋅n2=92n9 \cdot \frac n2 = \frac 92 n:

T(n)={1n=1,4 T ⁣(n2)+92nn>1.T(n) = \begin{cases} 1 & n = 1, \\ 4\,T\!\left(\frac n2\right) + \frac 92 n & n > 1. \end{cases}

Master Theorem: a=4a = 4, b=2b = 2, soglia nlog⁡24=n2n^{\log_2 4} = n^2; w(n)=92n=O(n2−ε)w(n) = \frac 92 n = O(n^{2 - \varepsilon}) con ε=1\varepsilon = 1: caso 1, T(n)=Θ(n2)T(n) = \Theta(n^2).

Soluzione esatta (formula generale): il livello ℓ\ell ha 4ℓ4^\ell nodi su taglia n2ℓ\frac{n}{2^\ell} con lavoro 92n2ℓ\frac 92 \frac{n}{2^\ell}, le foglie sono 4k=n24^k = n^2:

T(n)=∑ℓ=0k−14ℓ⋅92n2ℓ+4k=92n∑ℓ=0k−12ℓ+n2=92n(n−1)+n2=112n2−92n.T(n) = \sum_{\ell=0}^{k-1} 4^\ell \cdot \frac 92 \frac{n}{2^\ell} + 4^k = \frac 92 n \sum_{\ell=0}^{k-1} 2^\ell + n^2 = \frac 92 n (n - 1) + n^2 = \frac{11}{2} n^2 - \frac 92 n.

Controllo: n=1n = 1 dà 11; n=2n = 2 dà 22−9=1322 - 9 = 13 (quattro prodotti di scalari, più 99 operazioni).

Conclusione: è competitivo?

No. La semplificazione toglie tre dei sette prodotti, ma ne restano quattro: a=4a = 4 e la soglia resta n2n^2, quindi T(n)=Θ(n2)T(n) = \Theta(n^2), contro Θ(nlog⁡n)\Theta(n \log n) dell'algoritmo con U=(A1+A2)(B1+B2)U = (A_1 + A_2)(B_1 + B_2) e V=(A1−A2)(B1−B2)V = (A_1 - A_2)(B_1 - B_2) (T=4nlog⁡2n+nT = 4n\log_2 n + n, due sole chiamate). Anzi, la costante è peggiore anche del metodo con quattro chiamate dalla definizione (T=2n2−nT = 2n^2 - n): 112n2\frac{11}{2} n^2 contro 2n22n^2. Il motivo è che Strassen generale elimina una moltiplicazione sfruttando combinazioni delle sottomatrici in generale distinte; qui la ripetizione dei quadranti A11=A22A_{11} = A_{22} ecc. fa collassare i sette prodotti a quattro, ma non basta per arrivare a due prodotti, che sono quelli che bastano per le SC (UU e VV determinano i due quadranti distinti). Per esempio per n=1024n = 1024: 112⋅10242−92⋅1024=5 762 560\frac{11}{2} \cdot 1024^2 - \frac 92 \cdot 1024 = 5\,762\,560 operazioni contro 4⋅1024⋅10+1024=41 9844 \cdot 1024 \cdot 10 + 1024 = 41\,984 di S_MUL.

Verifica con un programma. Un'implementazione di S_STRASSEN sulle prime righe, con conteggio delle operazioni, confrontata con il prodotto delle matrici SC piene per n=1,2,…,128n = 1, 2, \dots, 128, dà il prodotto corretto e il conteggio 112n2−92n\frac{11}{2} n^2 - \frac 92 n; e le uguaglianze P5=P6P_5 = P_6, P1=−P3P_1 = -P_3, P4=P7P_4 = P_7 valgono su matrici SC casuali di ordine 44.

Versione ripasso

Punto di partenza: SC con A11=A22=A1A_{11} = A_{22} = A_1, A12=A21=A2A_{12} = A_{21} = A_2 (e così per BB), poi le formule di Algoritmo di Strassen e ibridazioneStrassen calcola il prodotto n x n con 7 chiamate ricorsive invece di 8, usando 10 somme/sottrazioni nel divide e 8 nel conquer: T(n) = 7T(n/2) + (9/2)n^2, Theta(n^(log2 7)) con soluzione esatta 7n^(log2 7) - 6n^2; la costante 7 è più che tripla di quella dell'iterativo (2) e Strassen batte l'iterativo solo da n = 655 (per le potenze di 2, da 1024). L'ibridazione cambia il caso base (iterativo per n <= n0): costo n^(log2 7)(2n0+5)/n0^(log2 7 - 2) - 6n^2, minimo per n0 = 8 con costante ~3.92.Algoritmo di Strassen e ibridazione → con fattori SiS_i, DiD_i.

  • Divide semplificato: S1=A2−A1S_1 = A_2 - A_1, D1=B2+B1D_1 = B_2 + B_1; S2=2A1S_2 = 2A_1, D2=2B1D_2 = 2B_1; S3=A1−A2S_3 = A_1 - A_2, D3=B1+B2D_3 = B_1 + B_2; S4=S7=A1+A2S_4 = S_7 = A_1 + A_2, D4=D7=B1D_4 = D_7 = B_1; S5=S6=A1S_5 = S_6 = A_1, D5=D6=B2−B1D_5 = D_6 = B_2 - B_1.
  • Uguaglianze: P1=−P3P_1 = -P_3, P5=P6P_5 = P_6, P4=P7P_4 = P_7, P2=4A1B1P_2 = 4A_1B_1. Sette prodotti diventano quattro: Q1=(A1−A2)(B1+B2)Q_1 = (A_1 - A_2)(B_1 + B_2), Q2=A1B1Q_2 = A_1B_1, Q4=(A1+A2)B1Q_4 = (A_1 + A_2)B_1, Q5=A1(B2−B1)Q_5 = A_1(B_2 - B_1).
  • Conquer: il prodotto è SC, quindi C11=C22=C1C_{11} = C_{22} = C_1 e C12=C21=C2C_{12} = C_{21} = C_2 con C1=−Q1+4Q2−Q4+Q5C_1 = -Q_1 + 4Q_2 - Q_4 + Q_5 e C2=Q4+Q5C_2 = Q_4 + Q_5. Controllo con C1=A1B1+A2B2C_1 = A_1B_1 + A_2B_2: i termini si cancellano (A1B1A_1B_1: −1+4−1−1=1-1 + 4 - 1 - 1 = 1; A1B2A_1B_2: −1+1=0-1 + 1 = 0; A2B1A_2B_1: +1−1=0+1 - 1 = 0; resta A2B2A_2B_2 da −Q1-Q_1).
  • Costo: divide 44 operazioni su SC di ordine n2\frac n2, conquer 55 (prodotto per 44, tre per C1C_1, una per C2C_2): lavoro 9⋅n29 \cdot \frac n2. T(n)=4T(n2)+92n,T(1)=1.T(n) = 4T(\tfrac n2) + \tfrac 92 n, \quad T(1) = 1. Master Theorem: soglia n2n^2, caso 1, Θ(n2)\Theta(n^2) (Master Theorem - enunciato, casi e applicazioniMaster Theorem per T(n) = aT(n/b) + w(n): si confronta w(n) con la funzione soglia n^(log_b a). Caso 1 (w minore di una potenza polinomiale): Theta(n^(log_b a)); caso 2 (w della stessa taglia): Theta(n^(log_b a) log n); caso 3 (w maggiore e regolare): Theta(w(n)). Prova completa dai livelli dell'albero, versione estesa (parti intere, n0 qualsiasi), esempi, e l'uso scorretto quando nessun caso si applica (w = n log n).Master Theorem - enunciato, casi e applicazioni →). Esatto: 92n(n−1)+n2=112n2−92n\frac 92 n(n - 1) + n^2 = \frac{11}{2} n^2 - \frac 92 n (n=2n = 2: 1313).
  • Conclusione: non è competitivo con O(nlog⁡n)O(n\log n) (due chiamate con U,VU, V, 4nlog⁡2n+n4n\log_2 n + n), e ha costante peggiore anche dei 2n2−n2n^2 - n delle quattro chiamate dalla definizione; per n=1024n = 1024: 5 762 5605\,762\,560 contro 41 98441\,984. Con UU e VV bastano due prodotti.
  • Errori tipici: non accorgersi che P1=−P3P_1 = -P_3 vale a meno del segno; dimenticare il fattore 44 in P2=(2A1)(2B1)P_2 = (2A_1)(2B_1); calcolare anche C22C_{22} (coincide con C11C_{11}); concludere Θ(nlog⁡27)\Theta(n^{\log_2 7}) (con quattro prodotti il costo è Θ(n2)\Theta(n^2)).

Teoria collegata