Esercizio - matrici ARB, prodotto con tre chiamate ricorsive (compito del 19 giugno 2024, es. 1)
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 una potenza di . Una matrice si dice Antisimmetrica Ricorsiva a Blocchi di ordine (in breve, -ARB) se oppure se e
dove i blocchi e di sono a loro volta matrici -ARB.
- Punto 1.(a) [4 punti] Si dimostri induttivamente che, date due matrici -ARB e , il loro prodotto è una matrice -ARB. Nella dimostrazione, si dia per già dimostrato che la somma e la differenza di due matrici -ARB è una matrice -ARB.
- Punto 1.(b) [8 punti] Si fornisca lo pseudocodice di un algoritmo ricorsivo efficiente
ARB_MULper moltiplicare due matrici -ARB e e se ne argomenti la correttezza. L'algoritmo potrà usare (senza che ne venga descritto il codice) le subroutineARB_SUM,ARB_SUBeARB_SCALPRODper il calcolo, rispettivamente, di , e , dove e sono ARB dello stesso ordine e . - Punto 1.(c) [5 punti] Supponendo che, per matrici -ARB, , si scriva l'equazione di ricorrenza per il numero esatto 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à . (Suggerimento: si cerchi una proprietà di sottostruttura con solo tre prodotti ricorsivi.)
Come si legge la struttura
Una -ARB è fatta con due blocchi ripetuti, e , con che compare anche cambiato di segno: ha valori indipendenti. Per e :
con e . La somiglianza con i numeri complessi è utile: si moltiplica come (con ), 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 con . Base (): ogni scalare complesso è -ARB e il prodotto di due scalari è uno scalare. Ipotesi: il prodotto di due matrici -ARB è -ARB. Passo: siano -ARB con ,
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 è somma di due prodotti dei quadranti di (riga) e di (colonna):
con e (nel quadrante in basso a sinistra perché la somma delle matrici è commutativa; in basso a destra ). Poiché sono -ARB, per ipotesi induttiva i quattro prodotti sono -ARB; allora (differenza) e (somma) sono -ARB per la chiusura per somma e differenza, che si può assumere. Quindi ha la forma con -ARB: è -ARB.
Punto (b): algoritmo con tre prodotti ricorsivi
Dalla dimostrazione, con e . Calcolarli con la definizione richiede quattro prodotti -ARB () e quindi , soglia , caso 1: , non . Servono tre prodotti (suggerimento). Si pongono
e si osserva che e, dall'espansione di , . Con e ARB per la chiusura per somma. Tre prodotti ricorsivi (, , ) 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 : per restituisce il prodotto degli scalari. Per , sono ARB per definizione e le somme , 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 , , . Le identità e sono quelle mostrate sopra, e la matrice restituita coincide con per il punto (a); la parte in basso a sinistra è , ottenuta con ARB_SCALPROD.
Punto (c): ricorrenza e Master Theorem
Per : una moltiplicazione tra scalari, . Per : tre chiamate ricorsive su ordine e sei invocazioni di subroutine su matrici ARB di ordine , ciascuna di costo (perché e analogamente le altre):
| subroutine | numero |
|---|---|
ARB_SUM e ARB_SUM |
2 |
ARB_SUB (per ) |
1 |
ARB_SUM e ARB_SUB (per ) |
2 |
ARB_SCALPROD |
1 |
| totale | 6 |
Lavoro: . La ricorrenza è
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 →): , , soglia . Esiste con (per esempio , perché ): caso 1, .
Soluzione esatta (non richiesta, ma utile come controllo). Con la formula generale: livello ha nodi su taglia con lavoro , foglie :
Controllo: dà ; dà : tre prodotti di scalari (, , ) e operazioni (due somme per e , , , , e il cambio di segno contato dal testo), ✓. Se invece si considerasse gratis il cambio di segno si avrebbe di lavoro e .
Esempio (). , : , , , . , , , , . Quindi . Controllo con la definizione: ✓.
Verifica con un programma. Un'implementazione di ARB_MUL sulla prima riga , con conteggio delle operazioni e confronto con il prodotto delle matrici piene, per , dà , coerente con la ricorrenza .
Versione ripasso
Struttura: con -ARB (come : 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 ): con , Prodotti -ARB per ipotesi; ARB per la chiusura di somma e differenza.
- (b) Tre prodotti (trucco di Gauss): , , ; allora e . Con la definizione sarebbero quattro prodotti: , , non .
ARB_MUL: base ; con tre chiamate ( suARB_SUM,ARB_SUM);ARB_SUB,ARB_SUB,ARB_SUM,ARB_SCALPROD; ritorna . Correttezza per induzione e per il punto (a).- (c) Costo: sei subroutine su ordine (due
SUMiniziali,SUB,SUM,SUB,SCALPROD), ciascuna : lavoro . Master Theorem: soglia , (): caso 1, (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: (: ). - Esempio : , : , , , , , .
- Errori tipici: scrivere come se fosse senza dire che la somma è commutativa; contare solo cinque subroutine (sono sei con
SCALPROD); usare il caso 2 al posto del caso 1 (il lavoro è polinomialmente più piccolo della soglia); dimenticare che e devono essere ARB per poter ricorrere.