Salta al contenuto
Note per Studenti Esercizio - matrice di Fourier per una matrice generica a sinistra e a destra e per aI + bU (compito del 27 gennaio 2025, es. 2)

Esercizio - matrice di Fourier per una matrice generica a sinistra e a destra e per aI + bU (compito del 27 gennaio 2025, es. 2)

Esame
In questa pagina 3

Testo (compito d'esame del 27 gennaio 2025 di Algoritmi per l'Ingegneria, Ing. Informatica UniPD, seconda parte, esercizio 2, 16 punti). Sia n≥2n\ge2 una potenza di due ed FF la matrice di Fourier di ordine nn (dunque Fij=ωnijF_{ij}=\omega_n^{ij} per i,j=0,…,n−1i,j=0,\dots,n-1). Sia A∈Cn×nA\in\mathbb C^{n\times n} una matrice quadrata di numeri complessi aija_{ij}, con i,j=0,…,n−1i,j=0,\dots,n-1. Si descriva concisamente (senza fornire necessariamente lo pseudocodice) come eseguire efficientemente le seguenti operazioni matriciali, analizzando in ciascun caso il numero T(n)T(n) di operazioni tra numeri complessi eseguite dal metodo proposto. (Attenzione: le operazioni di copia di un numero complesso non vanno contabilizzate.)

  1. (a) [5 punti] B=FAB=FA, dove AA è una matrice quadrata qualsiasi.
  2. (b) [5 punti] B=AFB=AF, dove AA è una matrice quadrata qualsiasi.
  3. (c) [6 punti] B=FAB=FA, dove AA è una matrice quadrata tale che aij=a+ba_{ij}=a+b per i=ji=j e aij=ba_{ij}=b per i≠ji\ne j, dove aa e bb sono numeri complessi arbitrari.

Teoria usata: DFT, matrice di Fourier e radici n-esime dell'unitàla DFT di ordine n valuta un polinomio di grado limitato da n sulle n radici n-esime dell'unità, y_i = p(ω^i) con ω = e^{2πi/n}; è il prodotto per la matrice di Fourier F_n, una Vandermonde invertibile. Le radici formano un gruppo moltiplicativo e valgono tre lemmi: cancellazione (ω_{dn}^{dk} = ω_n^k, ω_n^{n/2} = -1), dimezzamento (i quadrati delle n radici sono le n/2 radici n/2-esime, ciascuna due volte) e somma (la somma delle potenze di ω^k vale n se k è multiplo di n, 0 altrimenti). Teorema di convoluzione lineare: (c|0) = DFT^{-1}{2n}(DFT{2n}(a|0) ⊙ DFT_{2n}(b|0)).DFT, matrice di Fourier e radici n-esime dell'unità → (DFTn(a)=Fna\mathrm{DFT}_n(\mathbf a)=F_n\mathbf a), Fast Fourier Transform - algoritmo ricorsivo e trasformata inversala FFT calcola DFT_n (n potenza di due) con divide et impera: si separano i coefficienti di indice pari e dispari, p(x) = p0(x^2) + x p1(x^2), e per il lemma di dimezzamento bastano due DFT di ordine n/2; y_i = y0_i + w^i y1_i e y_{i+n/2} = y0_i - w^i y1_i. La ricorrenza T(n) = 2T(n/2) + 2n con T(1) = 0 ha soluzione esatta 2 n log2 n. L'inversa ha matrice F^{-1}{ij} = w^{-ij}/n: si ottiene con la FFT sulle potenze negative (poi si divide per n fuori dalla ricorsione) oppure con DFT_n(y) rovesciato. LIN_CONV moltiplica due polinomi con n coefficienti in 12 n log2(2n) + 4n operazioni.Fast Fourier Transform - algoritmo ricorsivo e trasformata inversa → (costo 2nlog⁡2n2n\log_2n), Trasformate notevoli ed esponenziazione di polinomi con la FFTalcune famiglie di vettori hanno DFT nota o più economica della FFT generale: il vettore costante (a,...,a) ha DFT (na,0,...,0), il vettore (a,0,...,0) ha DFT (a,...,a); un vettore (n,k)-sparso ha DFT formata da k copie della DFT{n/k} delle sue componenti di indice multiplo di k, e SPARSE_FFT costa 2 (n/k) log2(n/k) con ricorrenza T(n,k) = T(n/2,k/2). Per la potenza p(x)^k di un polinomio con n coefficienti: o si eleva a potenza per quadrature successive con LIN_CONV, O(nk log(nk)), oppure si valuta p con la FFT su h = 2^ceil(log2((n-1)k+1)) punti, si eleva alla k ogni valore e si antitrasforma, Theta(nk log(nk)).Trasformate notevoli ed esponenziazione di polinomi con la FFT → (DFT del vettore costante), Operazioni tra matriciLe matrici m×n formano uno spazio vettoriale (somma e prodotto per scalare elemento per elemento); il prodotto righe per colonne corrisponde alla composizione di funzioni lineari, è associativo ma non commutativo; la trasposta scambia righe e colonne e (AB)^T = B^T A^T.Operazioni tra matrici → (prodotto righe per colonne, trasposta di un prodotto).

Il prodotto di due matrici n×nn\times n qualsiasi richiede Θ(n3)\Theta(n^3) operazioni con l'algoritmo per definizione e circa n2,8n^{2{,}8} con 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 →. Qui un fattore è la matrice di Fourier, che non è generica: moltiplicare FF per un vettore è una DFT e costa solo Θ(nlog⁡n)\Theta(n\log n).

(a) B=FAB=FA con AA qualsiasi

La colonna jj di B=FAB=FA è FF per la colonna jj di AA: B∙j=F A∙j=DFTn(A∙j),j=0,…,n−1.B_{\bullet j}=F\,A_{\bullet j}=\mathrm{DFT}_n\bigl(A_{\bullet j}\bigr),\qquad j=0,\dots,n-1. Quindi basta applicare la FFT a ciascuna delle nn colonne di AA. Ogni FFT costa 2nlog⁡2n2n\log_2n operazioni (Fast Fourier Transform - algoritmo ricorsivo e trasformata inversala FFT calcola DFT_n (n potenza di due) con divide et impera: si separano i coefficienti di indice pari e dispari, p(x) = p0(x^2) + x p1(x^2), e per il lemma di dimezzamento bastano due DFT di ordine n/2; y_i = y0_i + w^i y1_i e y_{i+n/2} = y0_i - w^i y1_i. La ricorrenza T(n) = 2T(n/2) + 2n con T(1) = 0 ha soluzione esatta 2 n log2 n. L'inversa ha matrice F^{-1}_{ij} = w^{-ij}/n: si ottiene con la FFT sulle potenze negative (poi si divide per n fuori dalla ricorsione) oppure con DFT_n(y) rovesciato. LIN_CONV moltiplica due polinomi con n coefficienti in 12 n log2(2n) + 4n operazioni.Fast Fourier Transform - algoritmo ricorsivo e trasformata inversa →), perciò T(n)=n⋅2nlog⁡2n=2n2log⁡2n=O(n2log⁡n).T(n)=n\cdot2n\log_2n=2n^2\log_2n=O(n^2\log n). Estrarre le colonne e comporle in BB sono copie, che non si contano. Il costo è inferiore a quello di qualunque algoritmo noto per il prodotto di matrici generiche (n2,37n^{2{,}37} nel miglior risultato asintotico noto, n3n^3 per definizione). Verificato con un'implementazione che conta le operazioni, per n=2,4,…,32n=2,4,\dots,32 con AA complessa casuale: risultato uguale a F⋅AF\cdot A calcolato per definizione e numero di operazioni 2n2log⁡2n2n^2\log_2n esatto.

(b) B=AFB=AF con AA qualsiasi

Qui FF moltiplica a destra. Si usa che la trasposta di un prodotto è il prodotto delle trasposte in ordine inverso, (AF)T=FTAT(AF)^T=F^TA^T, e che FF è simmetrica: Fij=ωnij=ωnji=FjiF_{ij}=\omega_n^{ij}=\omega_n^{ji}=F_{ji}, quindi FT=FF^T=F. Allora BT=(AF)T=FTAT=F AT.B^T=(AF)^T=F^TA^T=F\,A^T. Il prodotto FATFA^T si calcola come in (a), applicando la FFT alle colonne di ATA^T, cioè alle righe di AA. Infine B=(FAT)TB=(FA^T)^T. Per capirlo senza trasposte: la riga ii di BB è la riga ii di AA per FF, e per la simmetria di FF è la DFT della riga ii di AA. Le trasposizioni sono solo copie (aji′←aija'_{ji}\leftarrow a_{ij}), non contate, quindi T(n)=2n2log⁡2n=O(n2log⁡n),T(n)=2n^2\log_2n=O(n^2\log n), come in (a). (Verificato numericamente che AF=(FAT)TAF=(FA^T)^T per n=2,…,32n=2,\dots,32.)

(c) B=FAB=FA con A=aI+bUA=aI+bU

La matrice AA ha a+ba+b sulla diagonale e bb fuori: si scrive A=a In+b Un,Un=matrice con tutti gli elementi uguali a 1.A=a\,I_n+b\,U_n,\qquad U_n=\text{matrice con tutti gli elementi uguali a }1. Per la linearità del prodotto FA=a F In+b F Un=a F+b F Un.FA=a\,F\,I_n+b\,F\,U_n=a\,F+b\,F\,U_n. Ogni colonna di UnU_n è il vettore (1,1,…,1)T(1,1,\dots,1)^T, e per la DFT del vettore costante (Trasformate notevoli ed esponenziazione di polinomi con la FFTalcune famiglie di vettori hanno DFT nota o più economica della FFT generale: il vettore costante (a,...,a) ha DFT (na,0,...,0), il vettore (a,0,...,0) ha DFT (a,...,a); un vettore (n,k)-sparso ha DFT formata da k copie della DFT_{n/k} delle sue componenti di indice multiplo di k, e SPARSE_FFT costa 2 (n/k) log2(n/k) con ricorrenza T(n,k) = T(n/2,k/2). Per la potenza p(x)^k di un polinomio con n coefficienti: o si eleva a potenza per quadrature successive con LIN_CONV, O(nk log(nk)), oppure si valuta p con la FFT su h = 2^ceil(log2((n-1)k+1)) punti, si eleva alla k ogni valore e si antitrasforma, Theta(nk log(nk)).Trasformate notevoli ed esponenziazione di polinomi con la FFT →) F (1,…,1)T=(n,0,…,0)TF\,(1,\dots,1)^T=(n,0,\dots,0)^T. Quindi F UnF\,U_n ha la prima riga fatta di nn e tutte le altre nulle: F Un=n e0 1TF\,U_n=n\,\mathbf e_0\,\mathbf 1^T (con e0=(1,0,…,0)T\mathbf e_0=(1,0,\dots,0)^T e 1=(1,…,1)T\mathbf 1=(1,\dots,1)^T). Perciò FA=a F+n b e01T,cioeˋ(FA)ij={a+nbi=0,a ωniji≥1.FA=a\,F+n\,b\,\mathbf e_0\mathbf 1^T,\qquad\text{cioè}\qquad(FA)_{ij}=\begin{cases}a+nb&i=0,\\a\,\omega_n^{ij}&i\ge1.\end{cases} (per i=0i=0: a⋅ωn0+nb=a+nba\cdot\omega_n^{0}+nb=a+nb.)

Algoritmo e costo. Anche se FF ha n2n^2 elementi, essi appartengono all'insieme di soli nn valori {ωn0,…,ωnn−1}\{\omega_n^0,\dots,\omega_n^{n-1}\} (perché ωnij=ωnij mod n\omega_n^{ij}=\omega_n^{ij\bmod n}). Basta quindi calcolare:

  • i prodotti a ωnka\,\omega_n^k per k=1,…,n−1k=1,\dots,n-1 (a⋅ωn0=aa\cdot\omega_n^0=a non richiede operazioni): n−1n-1 prodotti;
  • nbnb: 11 prodotto;
  • a+nba+nb: 11 somma.

Tutti i n2n^2 elementi di FAFA sono poi copie di questi n+1n+1 valori. Quindi T(n)=(n−1)+1+1=n+1=Θ(n),T(n)=(n-1)+1+1=n+1=\Theta(n), molto meno dei n2n^2 elementi della matrice (e del Θ(n2log⁡n)\Theta(n^2\log n) di (a)). La soluzione del corso riporta T(n)=nT(n)=n: conta n−1n-1 prodotti per le potenze e un prodotto per nbnb, ma dimentica la somma a+nba+nb della prima riga; contandola si ottiene n+1n+1 (stesso ordine, Θ(n)\Theta(n)).

Esempio (n=4n=4). Con ω4=i\omega_4=i: FA=(a+4ba+4ba+4ba+4baia−a−iaa−aa−aa−ia−aia).FA=\begin{pmatrix}a+4b&a+4b&a+4b&a+4b\\a&ia&-a&-ia\\a&-a&a&-a\\a&-ia&-a&ia\end{pmatrix}. Prodotti necessari: iaia, −a-a, −ia-ia (con ω41,ω42,ω43\omega_4^1,\omega_4^2,\omega_4^3), più 4b4b e a+4ba+4b. Confrontato con F⋅AF\cdot A calcolato per definizione con a,ba,b complessi casuali, per n=2,…,32n=2,\dots,32.

Versione ripasso

Testo. n≥2n\ge2 potenza di due, Fij=ωnijF_{ij}=\omega_n^{ij}, A∈Cn×nA\in\mathbb C^{n\times n}. Come calcolare in modo efficiente e con quante operazioni tra complessi (le copie non contano): (a) [5] B=FAB=FA con AA qualsiasi; (b) [5] B=AFB=AF; (c) [6] B=FAB=FA con aij=a+ba_{ij}=a+b se i=ji=j e bb altrimenti. Teoria: DFT, matrice di Fourier e radici n-esime dell'unitàla DFT di ordine n valuta un polinomio di grado limitato da n sulle n radici n-esime dell'unità, y_i = p(ω^i) con ω = e^{2πi/n}; è il prodotto per la matrice di Fourier F_n, una Vandermonde invertibile. Le radici formano un gruppo moltiplicativo e valgono tre lemmi: cancellazione (ω_{dn}^{dk} = ω_n^k, ω_n^{n/2} = -1), dimezzamento (i quadrati delle n radici sono le n/2 radici n/2-esime, ciascuna due volte) e somma (la somma delle potenze di ω^k vale n se k è multiplo di n, 0 altrimenti). Teorema di convoluzione lineare: (c|0) = DFT^{-1}{2n}(DFT{2n}(a|0) ⊙ DFT_{2n}(b|0)).DFT, matrice di Fourier e radici n-esime dell'unità →, Trasformate notevoli ed esponenziazione di polinomi con la FFTalcune famiglie di vettori hanno DFT nota o più economica della FFT generale: il vettore costante (a,...,a) ha DFT (na,0,...,0), il vettore (a,0,...,0) ha DFT (a,...,a); un vettore (n,k)-sparso ha DFT formata da k copie della DFT_{n/k} delle sue componenti di indice multiplo di k, e SPARSE_FFT costa 2 (n/k) log2(n/k) con ricorrenza T(n,k) = T(n/2,k/2). Per la potenza p(x)^k di un polinomio con n coefficienti: o si eleva a potenza per quadrature successive con LIN_CONV, O(nk log(nk)), oppure si valuta p con la FFT su h = 2^ceil(log2((n-1)k+1)) punti, si eleva alla k ogni valore e si antitrasforma, Theta(nk log(nk)).Trasformate notevoli ed esponenziazione di polinomi con la FFT →, Operazioni tra matriciLe matrici m×n formano uno spazio vettoriale (somma e prodotto per scalare elemento per elemento); il prodotto righe per colonne corrisponde alla composizione di funzioni lineari, è associativo ma non commutativo; la trasposta scambia righe e colonne e (AB)^T = B^T A^T.Operazioni tra matrici →.

  • (a) Colonna jj di BB =F⋅=F\cdot colonna jj di A=DFTnA=\mathrm{DFT}_n della colonna. nn FFT da 2nlog⁡2n2n\log_2n: T(n)=2n2log⁡2n=O(n2log⁡n)T(n)=2n^2\log_2n=O(n^2\log n) (meglio di n2,37n^{2,37} per matrici generiche).
  • (b) FF è simmetrica (ωnij=ωnji\omega_n^{ij}=\omega_n^{ji}), quindi (AF)T=FTAT=FAT(AF)^T=F^TA^T=FA^T: si calcola FATFA^T come in (a) (DFT delle righe di AA) e si traspone (B=(FAT)TB=(FA^T)^T). Trasposte = copie. T(n)=2n2log⁡2nT(n)=2n^2\log_2n.
  • (c) A=aI+bUA=aI+bU (UU tutta di 11): FA=aF+bFUFA=aF+bFU, con F⋅(1,…,1)T=(n,0,…,0)TF\cdot(1,\dots,1)^T=(n,0,\dots,0)^T (DFT del vettore costante), quindi FU=n e01TFU=n\,\mathbf e_0\mathbf 1^T e (FA)ij=a+nb(FA)_{ij}=a+nb per i=0i=0, aωnija\omega_n^{ij} per i≥1i\ge1.
  • Costo di (c): gli elementi di FF sono solo gli nn valori ωnk\omega_n^k: n−1n-1 prodotti aωnka\omega_n^k (k≥1k\ge1), 11 prodotto nbnb, 11 somma a+nba+nb; il resto è copia. T(n)=n+1=Θ(n)T(n)=n+1=\Theta(n) (il corso riporta nn, senza contare la somma a+nba+nb).
  • Esempio n=4n=4: riga 00 tutta a+4ba+4b; righe 1,2,31,2,3: a(1,i,−1,−i)a(1,i,-1,-i), a(1,−1,1,−1)a(1,-1,1,-1), a(1,−i,−1,i)a(1,-i,-1,i).
  • Errori tipici: applicare le FFT alle colonne per AFAF (vanno applicate alle righe, per la simmetria FT=FF^T=F); contare le copie come operazioni; usare n2log⁡nn^2\log n in (c) senza sfruttare che FF ha solo nn valori distinti.

Teoria collegata