Salta al contenuto
Note per Studenti Esercizio - matrici ARB, prodotto con tre chiamate ricorsive (compito del 19 giugno 2024, es. 1)

Esercizio - matrici ARB, prodotto con tre chiamate ricorsive (compito del 19 giugno 2024, es. 1)

Esame
In questa pagina 5

Compito d'esame di Algoritmi per l'Ingegneria, Ing. Informatica UniPD, 19 giugno 2024, seconda parte, esercizio 1 (17 punti). 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 → (stesso schema: meno chiamate, più lavoro nei nodi interni), Prodotto di matrici - algoritmo iterativo e ricorsivo a blocchimodello di costo sulle matrici n x n (operazioni tra scalari, taglia n oppure N = n^2); somma in n^2 operazioni (ottima); prodotto righe per colonne iterativo con costo esatto 2n^3 - n^2; proprietà frattale del prodotto a blocchi dimostrata sugli indici; algoritmo ricorsivo RMUL con T(n) = 8T(n/2) + n^2, Theta(n^3) e soluzione esatta 2n^3 - n^2 per induzione e per srotolamento: fa le stesse operazioni dell'iterativo.Prodotto di matrici - algoritmo iterativo e ricorsivo a blocchi →, 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 Dimostrazioni, induzione e invariantiTecniche di dimostrazione (esempio, controesempio, assurdo), induzione con casi base multipli, invarianti di ciclo (inizializzazione, conservazione, uso alla fine), schema generale per provare la correttezza; esempi svolti su arrayMax, sequenza di bit e numeri di Fibonacci.Dimostrazioni, induzione e invarianti →.

Testo

Sia n≥1n \ge 1 una potenza di 22. Una matrice M∈Cn×nM \in \mathbb C^{n \times n} si dice Antisimmetrica Ricorsiva a Blocchi di ordine nn (in breve, nn-ARB) se n=1n = 1 oppure se n≥2n \ge 2 e

M=(AB−BA),M = \begin{pmatrix} A & B \\ -B & A \end{pmatrix},

dove i blocchi AA e BB di MM sono a loro volta matrici n2\frac n2-ARB.

  • Punto 1.(a) [4 punti] Si dimostri induttivamente che, date due matrici nn-ARB MM e QQ, il loro prodotto P=MQP = MQ è una matrice nn-ARB. Nella dimostrazione, si dia per già dimostrato che la somma e la differenza di due matrici nn-ARB è una matrice nn-ARB.
  • Punto 1.(b) [8 punti] Si fornisca lo pseudocodice di un algoritmo ricorsivo efficiente ARB_MUL(M,Q)(M, Q) per moltiplicare due matrici nn-ARB MM e QQ e se ne argomenti la correttezza. L'algoritmo potrà usare (senza che ne venga descritto il codice) le subroutine ARB_SUM(U,V)(U, V), ARB_SUB(U,V)(U, V) e ARB_SCALPROD(a,U)(a, U) per il calcolo, rispettivamente, di U+VU + V, U−VU - V e a⋅Ua \cdot U, dove UU e VV sono ARB dello stesso ordine e a∈Ca \in \mathbb C.
  • Punto 1.(c) [5 punti] Supponendo che, per matrici nn-ARB, TARB_SUM(n)=TARB_SUB(n)=TARB_SCALPROD(n)=nT_{ARB\_SUM}(n) = T_{ARB\_SUB}(n) = T_{ARB\_SCALPROD}(n) = n, si scriva l'equazione di ricorrenza per il numero esatto TARB_MUL(n)T_{ARB\_MUL}(n) di operazioni aritmetiche tra scalari complessi effettuate dall'algoritmo sviluppato per il punto 1.(b) e se ne determini l'ordine di grandezza con il Master Theorem.

Attenzione: per avere punteggio pieno, l'algoritmo al punto 1.(b) dovrà avere complessità o(n2)o(n^2). (Suggerimento: si cerchi una proprietà di sottostruttura con solo tre prodotti ricorsivi.)

Come si legge la struttura

Una nn-ARB è fatta con due blocchi ripetuti, AA e BB, con BB che compare anche cambiato di segno: ha nn valori indipendenti. Per n=2n = 2 e n=4n = 4:

M=(ab−ba),M=(abcd−ba−dc−c−dabd−c−ba)M = \begin{pmatrix} a & b \\ -b & a \end{pmatrix}, \qquad M = \begin{pmatrix} a & b & c & d \\ -b & a & -d & c \\ -c & -d & a & b \\ d & -c & -b & a \end{pmatrix}

con A=(ab−ba)A = \begin{pmatrix} a & b \\ -b & a \end{pmatrix} e B=(cd−dc)B = \begin{pmatrix} c & d \\ -d & c \end{pmatrix}. La somiglianza con i numeri complessi a+iba + ib è utile: (ab−ba)\begin{pmatrix} a & b \\ -b & a \end{pmatrix} si moltiplica come a+iba + ib (con i2=−1i^2 = -1), e la ricorsione porta a "numeri complessi a coefficienti ARB". Il trucco dei tre prodotti è quello di Gauss per il prodotto complesso.

Punto (a): chiusura per prodotto

Induzione su k≥0k \ge 0 con n=2kn = 2^k. Base (n=1n = 1): ogni scalare complesso è 11-ARB e il prodotto di due scalari è uno scalare. Ipotesi: il prodotto di due matrici n2\frac n2-ARB è n2\frac n2-ARB. Passo: siano M,QM, Q nn-ARB con n>1n > 1,

M=(AB−BA),Q=(CD−DC),A,B,C,D  n2-ARB.M = \begin{pmatrix} A & B \\ -B & A \end{pmatrix}, \qquad Q = \begin{pmatrix} C & D \\ -D & C \end{pmatrix}, \quad A, B, C, D \; \tfrac n2\text{-ARB}.

Per la proprietà frattale del prodotto righe per colonne (Prodotto di matrici - algoritmo iterativo e ricorsivo a blocchimodello di costo sulle matrici n x n (operazioni tra scalari, taglia n oppure N = n^2); somma in n^2 operazioni (ottima); prodotto righe per colonne iterativo con costo esatto 2n^3 - n^2; proprietà frattale del prodotto a blocchi dimostrata sugli indici; algoritmo ricorsivo RMUL con T(n) = 8T(n/2) + n^2, Theta(n^3) e soluzione esatta 2n^3 - n^2 per induzione e per srotolamento: fa le stesse operazioni dell'iterativo.Prodotto di matrici - algoritmo iterativo e ricorsivo a blocchi →), ogni quadrante di MQMQ è somma di due prodotti dei quadranti di MM (riga) e di QQ (colonna):

MQ=(AC+B(−D)AD+BC(−B)C+A(−D)(−B)D+AC)=(AC−BDAD+BC−BC−AD−BD+AC)=(EF−FE)MQ = \begin{pmatrix} AC + B(-D) & AD + BC \\ (-B)C + A(-D) & (-B)D + AC \end{pmatrix} = \begin{pmatrix} AC - BD & AD + BC \\ -BC - AD & -BD + AC \end{pmatrix} = \begin{pmatrix} E & F \\ -F & E \end{pmatrix}

con E=AC−BDE = AC - BD e F=AD+BCF = AD + BC (nel quadrante in basso a sinistra −BC−AD=−(AD+BC)=−F-BC - AD = -(AD + BC) = -F perché la somma delle matrici è commutativa; in basso a destra −BD+AC=E-BD + AC = E). Poiché A,B,C,DA, B, C, D sono n2\frac n2-ARB, per ipotesi induttiva i quattro prodotti AC,BD,AD,BCAC, BD, AD, BC sono n2\frac n2-ARB; allora EE (differenza) e FF (somma) sono n2\frac n2-ARB per la chiusura per somma e differenza, che si può assumere. Quindi MQMQ ha la forma (EF−FE)\begin{pmatrix} E & F \\ -F & E \end{pmatrix} con E,FE, F n2\frac n2-ARB: è nn-ARB. ■\blacksquare

Punto (b): algoritmo con tre prodotti ricorsivi

Dalla dimostrazione, P=MQ=(EF−FE)P = MQ = \begin{pmatrix} E & F \\ -F & E \end{pmatrix} con E=AC−BDE = AC - BD e F=AD+BCF = AD + BC. Calcolarli con la definizione richiede quattro prodotti n2\frac n2-ARB (AC,BD,AD,BCAC, BD, AD, BC) e quindi T(n)=4T(n2)+Θ(n)T(n) = 4T(\frac n2) + \Theta(n), soglia n2n^2, caso 1: Θ(n2)\Theta(n^2), non o(n2)o(n^2). Servono tre prodotti (suggerimento). Si pongono

U=AC,V=BD,Z=(A+B)(C+D)=AC+AD+BC+BD,U = AC, \qquad V = BD, \qquad Z = (A + B)(C + D) = AC + AD + BC + BD,

e si osserva che E=AC−BD=U−VE = AC - BD = U - V e, dall'espansione di ZZ, F=AD+BC=Z−AC−BD=Z−U−VF = AD + BC = Z - AC - BD = Z - U - V. Con A+BA + B e C+DC + D ARB per la chiusura per somma. Tre prodotti ricorsivi (UU, VV, ZZ) invece di quattro, con più somme e sottrazioni (è il trucco di Gauss per il prodotto complesso).

ARB_MUL(M, Q)                 { M, Q ARB dello stesso ordine n }
  n <- rows(M)
  if n = 1 then return [m11 * q11]
  * M = [A B; -B A],  Q = [C D; -D C] *
  U <- ARB_MUL(A, C)
  V <- ARB_MUL(B, D)
  Z <- ARB_MUL(ARB_SUM(A, B), ARB_SUM(C, D))
  E <- ARB_SUB(U, V)
  F <- ARB_SUB(Z, ARB_SUM(U, V))
  Fn <- ARB_SCALPROD(-1, F)
  return [E F; Fn E]

Correttezza. Per induzione su kk: per n=1n = 1 restituisce il prodotto degli scalari. Per n>1n > 1, A,B,C,DA, B, C, D sono ARB per definizione e le somme A+BA + B, C+DC + D sono ARB (il testo dà per dimostrata la chiusura per somma), quindi le tre chiamate ricorsive sono legittime (input ARB dello stesso ordine) e per ipotesi restituiscono U=ACU = AC, V=BDV = BD, Z=(A+B)(C+D)Z = (A + B)(C + D). Le identità E=U−VE = U - V e F=Z−(U+V)F = Z - (U + V) sono quelle mostrate sopra, e la matrice restituita (EF−FE)\begin{pmatrix} E & F \\ -F & E \end{pmatrix} coincide con MQMQ per il punto (a); la parte in basso a sinistra è −F-F, ottenuta con ARB_SCALPROD(−1,F)(-1, F).

Punto (c): ricorrenza e Master Theorem

Per n=1n = 1: una moltiplicazione tra scalari, T(1)=1T(1) = 1. Per n>1n > 1: tre chiamate ricorsive su ordine n2\frac n2 e sei invocazioni di subroutine su matrici ARB di ordine n2\frac n2, ciascuna di costo n2\frac n2 (perché TARB_SUM(n2)=n2T_{ARB\_SUM}(\frac n2) = \frac n2 e analogamente le altre):

subroutine numero
ARB_SUM(A,B)(A, B) e ARB_SUM(C,D)(C, D) 2
ARB_SUB(U,V)(U, V) (per EE) 1
ARB_SUM(U,V)(U, V) e ARB_SUB(Z,⋅)(Z, \cdot) (per FF) 2
ARB_SCALPROD(−1,F)(-1, F) 1
totale 6

Lavoro: 6⋅n2=3n6 \cdot \frac n2 = 3n. La ricorrenza è

TARB_MUL(n)={1n=1,3 TARB_MUL ⁣(n2)+3nn>1.T_{ARB\_MUL}(n) = \begin{cases} 1 & n = 1, \\ 3\,T_{ARB\_MUL}\!\left(\frac n2\right) + 3n & n > 1. \end{cases}

Master Theorem (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 →): a=3a = 3, b=2b = 2, soglia nlog⁡23≈n1.585n^{\log_2 3} \approx n^{1.585}. Esiste ε>0\varepsilon > 0 con w(n)=3n=O(nlog⁡23−ε)w(n) = 3n = O(n^{\log_2 3 - \varepsilon}) (per esempio ε=0.5\varepsilon = 0.5, perché 1≤1.585−0.51 \le 1.585 - 0.5): caso 1, TARB_MUL(n)=Θ(nlog⁡23)=o(n2)T_{ARB\_MUL}(n) = \Theta(n^{\log_2 3}) = o(n^2).

Soluzione esatta (non richiesta, ma utile come controllo). Con la formula generale: livello ℓ\ell ha 3ℓ3^\ell nodi su taglia n2ℓ\frac{n}{2^\ell} con lavoro 3n2ℓ3 \frac{n}{2^\ell}, foglie 3k3^k:

T(n)=∑ℓ=0k−13ℓ⋅3n2ℓ+3k=3n⋅2((32)k−1)+3k=6⋅3k−6n+3k=7⋅3k−6⋅2k=7nlog⁡23−6n.T(n) = \sum_{\ell=0}^{k-1} 3^\ell \cdot \frac{3n}{2^\ell} + 3^k = 3n \cdot 2\left( \left(\tfrac 32\right)^k - 1 \right) + 3^k = 6 \cdot 3^k - 6n + 3^k = 7 \cdot 3^k - 6 \cdot 2^k = 7n^{\log_2 3} - 6n.

Controllo: n=1n = 1 dà 11; n=2n = 2 dà 21−12=921 - 12 = 9: tre prodotti di scalari (acac, bdbd, (a+b)(c+d)(a + b)(c + d)) e 66 operazioni (due somme per a+ba + b e c+dc + d, e=u−ve = u - v, u+vu + v, z−(u+v)z - (u + v), e il cambio di segno contato dal testo), 3+6=93 + 6 = 9 ✓. Se invece si considerasse gratis il cambio di segno si avrebbe 52n\frac 52 n di lavoro e T(n)=6⋅3k−5⋅2kT(n) = 6 \cdot 3^k - 5 \cdot 2^k.

Esempio (n=2n = 2). M=(12−21)M = \begin{pmatrix} 1 & 2 \\ -2 & 1 \end{pmatrix}, Q=(31−13)Q = \begin{pmatrix} 3 & 1 \\ -1 & 3 \end{pmatrix}: A=1A = 1, B=2B = 2, C=3C = 3, D=1D = 1. U=3U = 3, V=2V = 2, Z=(1+2)(3+1)=12Z = (1 + 2)(3 + 1) = 12, E=3−2=1E = 3 - 2 = 1, F=12−5=7F = 12 - 5 = 7. Quindi MQ=(17−71)MQ = \begin{pmatrix} 1 & 7 \\ -7 & 1 \end{pmatrix}. Controllo con la definizione: (1⋅3+2⋅(−1)1⋅1+2⋅3−2⋅3+1⋅(−1)−2⋅1+1⋅3)=(17−71)\begin{pmatrix} 1 \cdot 3 + 2 \cdot (-1) & 1 \cdot 1 + 2 \cdot 3 \\ -2 \cdot 3 + 1 \cdot (-1) & -2 \cdot 1 + 1 \cdot 3 \end{pmatrix} = \begin{pmatrix} 1 & 7 \\ -7 & 1 \end{pmatrix} ✓.

Verifica con un programma. Un'implementazione di ARB_MUL sulla prima riga (A ∣ B)(A \,|\, B), con conteggio delle operazioni e confronto con il prodotto delle matrici piene, per n=1,…,128n = 1, \dots, 128, dà T(n)=7⋅3k−6⋅2kT(n) = 7 \cdot 3^k - 6 \cdot 2^k, coerente con la ricorrenza 3T(n2)+3n3T(\frac n2) + 3n.

Versione ripasso

Struttura: M=(AB−BA)M = \begin{pmatrix} A & B \\ -B & A \end{pmatrix} con A,BA, B n2\frac n2-ARB (come a+iba + ib: nn valori indipendenti). Stesso schema 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 →: meno chiamate, più lavoro nei nodi interni.

  • (a) Chiusura per prodotto (induzione su kk): con Q=(CD−DC)Q = \begin{pmatrix} C & D \\ -D & C \end{pmatrix}, MQ=(AC−BDAD+BC−BC−AD−BD+AC)=(EF−FE),E=AC−BD,  F=AD+BC.MQ = \begin{pmatrix} AC - BD & AD + BC \\ -BC - AD & -BD + AC \end{pmatrix} = \begin{pmatrix} E & F \\ -F & E \end{pmatrix}, \quad E = AC - BD, \; F = AD + BC. Prodotti n2\frac n2-ARB per ipotesi; E,FE, F ARB per la chiusura di somma e differenza.
  • (b) Tre prodotti (trucco di Gauss): U=ACU = AC, V=BDV = BD, Z=(A+B)(C+D)=AC+AD+BC+BDZ = (A + B)(C + D) = AC + AD + BC + BD; allora E=U−VE = U - V e F=Z−U−VF = Z - U - V. Con la definizione sarebbero quattro prodotti: T=4T(n2)+Θ(n)T = 4T(\frac n2) + \Theta(n), Θ(n2)\Theta(n^2), non o(n2)o(n^2).
  • ARB_MUL: base [m11q11][m_{11}q_{11}]; U,V,ZU, V, Z con tre chiamate (ZZ su ARB_SUM(A,B)(A,B), ARB_SUM(C,D)(C,D)); E←E \leftarrow ARB_SUB(U,V)(U, V), F←F \leftarrow ARB_SUB(Z(Z, ARB_SUM(U,V))(U, V)), Fn←F_n \leftarrow ARB_SCALPROD(−1,F)(-1, F); ritorna (EFFnE)\begin{pmatrix} E & F \\ F_n & E \end{pmatrix}. Correttezza per induzione e per il punto (a).
  • (c) Costo: sei subroutine su ordine n2\frac n2 (due SUM iniziali, SUB(U,V)(U,V), SUM(U,V)(U,V), SUB(Z,⋅)(Z,\cdot), SCALPROD), ciascuna n2\frac n2: lavoro 3n3n. T(n)=3T(n2)+3n,T(1)=1.T(n) = 3T(\tfrac n2) + 3n, \quad T(1) = 1. Master Theorem: soglia nlog⁡23n^{\log_2 3}, w=3n=O(nlog⁡23−ε)w = 3n = O(n^{\log_2 3 - \varepsilon}) (ε=0.5\varepsilon = 0.5): caso 1, Θ(nlog⁡23)=o(n2)\Theta(n^{\log_2 3}) = o(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: T(n)=7⋅3k−6⋅2k=7nlog⁡23−6nT(n) = 7 \cdot 3^k - 6 \cdot 2^k = 7n^{\log_2 3} - 6n (n=2n = 2: 99).
  • Esempio n=2n = 2: M=(12−21)M = \begin{pmatrix} 1 & 2 \\ -2 & 1 \end{pmatrix}, Q=(31−13)Q = \begin{pmatrix} 3 & 1 \\ -1 & 3 \end{pmatrix}: U=3U = 3, V=2V = 2, Z=12Z = 12, E=1E = 1, F=7F = 7, MQ=(17−71)MQ = \begin{pmatrix} 1 & 7 \\ -7 & 1 \end{pmatrix}.
  • Errori tipici: scrivere −BC−AD-BC - AD come se fosse −F-F senza dire che la somma è commutativa; contare solo cinque subroutine (sono sei con SCALPROD(−1,F)(-1, F)); usare il caso 2 al posto del caso 1 (il lavoro 3n3n è polinomialmente più piccolo della soglia); dimenticare che A+BA + B e C+DC + D devono essere ARB per poter ricorrere.

Teoria collegata