Esercizio - convoluzione con il vettore delle potenze di due in tempo lineare (compito del 5 settembre 2025, es. 2)
In questa pagina 4
Testo (compito d'esame del 5 settembre 2025 di Algoritmi per l'Ingegneria, Ing. Informatica UniPD, seconda parte, esercizio 2, 17 punti). Sia . Dato un arbitrario vettore , si consideri l'operazione di convoluzione lineare , con il vettore che ha come componente -esima, per .
- (a) [3 punti] Per , si esprimano le componenti di in funzione delle componenti di .
- (b) [4 punti] Per , si specializzi la sommatoria associata alla generica componente della convoluzione lineare, ottenendo due sommatorie associate ai due sottoinsiemi di componenti e .
- (c) [6 punti] Con riferimento ai due sottoinsiemi di componenti specificati nel punto (b), si determinino due ricorrenze, una per sottoinsieme: la prima ricorrenza con caso di base e che esprima in funzione di , per ; la seconda ricorrenza con caso di base e che esprima in funzione di , per .
- (d) [4 punti] Sulla base delle ricorrenze sviluppate al punto (c) si sviluppi un algoritmo iterativo
POWER_CONV(x)che restituisca eseguendo operazioni aritmetiche tra scalari complessi.
Teoria usata: Polinomi - rappresentazione per coefficienti e per valori e convoluzioneun polinomio di grado limitato da n si rappresenta con n coefficienti o con n valori su n punti distinti (teorema di interpolazione, matrice di Vandermonde). Per coefficienti la somma costa n e il prodotto, la convoluzione lineare, n^2 prodotti e (n-1)^2 somme; per valori il prodotto costa 2n-1 prodotti ma serve una base estesa di almeno 2n-1 punti. Le conversioni generali costano troppo: valutazione n volte con Horner 2n(n-1), interpolazione con Gauss-Jordan n^3 o con Lagrange n^2. Serve una base speciale: la DFT.Polinomi - rappresentazione per coefficienti e per valori e convoluzione → (definizione di convoluzione lineare, regola di Horner), 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 → (invarianti dei cicli), Esponenziazione veloce per quadrature successivepotenza x^n con un operatore associativo con elemento neutro, costo = numero di applicazioni dell'operatore; STUPID_POWER costa n-1, la sottostruttura x^n = (x^floor(n/2))^2 (per n dispari per x) dà POWER con T(n) = floor(log2 n) + (numero di bit a 1 di n) - 1, Theta(log n) (caso peggiore 2 floor(log2 n), n = 2^t - 1); versioni iterative POWER2 e POWER3 dalla rappresentazione binaria di n; esempio con la matrice di Fibonacci; il modello a costo unitario vale solo se l'operatore non fa crescere gli operandi.Esponenziazione veloce per quadrature successive → (potenza di in tempo logaritmico).
La convoluzione per definizione costa operazioni (nota sui polinomi) e la FFT darebbe (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 →). Qui il secondo vettore ha una struttura (progressione geometrica di ragione ) che permette di scendere a con due semplici ricorrenze, senza trasformate.
(a) Il caso
La componente somma i prodotti con , (convoluzione lineare, vedi la definizione nella nota sui polinomi). Per si possono usare tutti gli indici : Per l'esponente non può superare , quindi : si parte da e si arriva a : Controllo con : completato con zeri, come deve essere perché è l'elemento neutro della convoluzione.
(b) Le due sommatorie
La definizione di convoluzione lineare per vettori di lunghezza è cioè , per . Si distinguono due casi:
- se allora e , quindi e ;
- se allora e , quindi e .
Perciò Per danno esattamente le espressioni del punto (a) (per esempio : da a , ).
(c) Le due ricorrenze
Prima metà, . Caso base: . Per si separa l'ultimo addendo (, con ) e si raccoglie dai restanti: (la somma che resta è proprio per la formula del punto (b), valida perché ). Questa è una regola di Horner calcolata in ( è il polinomio con coefficienti valutato in , vedi Polinomi - rappresentazione per coefficienti e per valori e convoluzioneun polinomio di grado limitato da n si rappresenta con n coefficienti o con n valori su n punti distinti (teorema di interpolazione, matrice di Vandermonde). Per coefficienti la somma costa n e il prodotto, la convoluzione lineare, n^2 prodotti e (n-1)^2 somme; per valori il prodotto costa 2n-1 prodotti ma serve una base estesa di almeno 2n-1 punti. Le conversioni generali costano troppo: valutazione n volte con Horner 2n(n-1), interpolazione con Gauss-Jordan n^3 o con Lagrange n^2. Serve una base speciale: la DFT.Polinomi - rappresentazione per coefficienti e per valori e convoluzione →).
Seconda metà, . Caso base: (un solo addendo, ). Per si ha , quindi per la formula del punto (b) La somma di ha lo stesso intervallo con in più l'addendo , che vale : Controllo per , : , come in (a).
(d) L'algoritmo e il suo costo
La prima ricorrenza si percorre in avanti da a ; la seconda all'indietro da a . Serve , che si ottiene man mano nel primo ciclo, dove pow2 assume il valore .
POWER_CONV(x)
n <- x.len
if n = 1 then return (x[0])
c[0] <- x[0]
pow2 <- 1
for i <- 1 to n-1
pow2 <- 2 * pow2 { pow2 = 2^i }
c[i] <- 2 * c[i-1] + x[i]
{ ora pow2 = 2^(n-1) }
c[2n-2] <- x[n-1] * pow2
for i <- 2n-3 downto n
c[i] <- c[i+1] / 2 + x[i-n+1] * pow2
return cCorrettezza. Primo ciclo, invarianti: all'inizio dell'iterazione vale pow2 e c[i-1] (per perché c[0] e pow2 ). L'iterazione calcola pow2 e , corretto per la prima ricorrenza. Alla fine pow2 e le componenti sono corrette. Dopo il ciclo, c[2n-2] è il caso base della seconda ricorrenza. Secondo ciclo, invariante: all'inizio dell'iterazione la componente c[i+1] è corretta (vero per dopo l'assegnamento del caso base); l'iterazione calcola , corretto per la seconda ricorrenza. Quindi alla fine tutte le componenti sono corrette. Verificato con un'implementazione confrontata con numpy.convolve per con complesso casuale.
Costo (operazioni tra complessi: somme, prodotti, divisioni; per ):
- primo ciclo, iterazioni, ciascuna con un prodotto per aggiornare
pow2, un prodotto per e una somma: ; c[2n-2]: prodotto;- secondo ciclo, iterazioni (da a ), ciascuna con una divisione, un prodotto e una somma: .
Totale: . Per nessuna operazione. Il conteggio è stato verificato contando le operazioni dell'implementazione per ().
Miglioramento della costante. pow2 serve solo dopo il primo ciclo, e si può ottenere per quadrature successive con prodotti (Esponenziazione veloce per quadrature successivepotenza x^n con un operatore associativo con elemento neutro, costo = numero di applicazioni dell'operatore; STUPID_POWER costa n-1, la sottostruttura x^n = (x^floor(n/2))^2 (per n dispari per x) dà POWER con T(n) = floor(log2 n) + (numero di bit a 1 di n) - 1, Theta(log n) (caso peggiore 2 floor(log2 n), n = 2^t - 1); versioni iterative POWER2 e POWER3 dalla rappresentazione binaria di n; esempio con la matrice di Fibonacci; il modello a costo unitario vale solo se l'operatore non fa crescere gli operandi.Esponenziazione veloce per quadrature successive →). Allora il primo ciclo costa ( e la somma) e il totale diventa , con coefficiente del termine dominante al posto di . In entrambi i casi la complessità è lineare, contro il della convoluzione per definizione.
Versione ripasso
Testo. con , arbitrario. (a) [3] , le componenti; (b) [4] specializzare la sommatoria nei due insiemi e ; (c) [6] due ricorrenze, la prima da in funzione di , la seconda da in funzione di ; (d) [4] algoritmo iterativo POWER_CONV con operazioni. Teoria: Polinomi - rappresentazione per coefficienti e per valori e convoluzioneun polinomio di grado limitato da n si rappresenta con n coefficienti o con n valori su n punti distinti (teorema di interpolazione, matrice di Vandermonde). Per coefficienti la somma costa n e il prodotto, la convoluzione lineare, n^2 prodotti e (n-1)^2 somme; per valori il prodotto costa 2n-1 prodotti ma serve una base estesa di almeno 2n-1 punti. Le conversioni generali costano troppo: valutazione n volte con Horner 2n(n-1), interpolazione con Gauss-Jordan n^3 o con Lagrange n^2. Serve una base speciale: la DFT.Polinomi - rappresentazione per coefficienti e per valori e convoluzione →, Esponenziazione veloce per quadrature successivepotenza x^n con un operatore associativo con elemento neutro, costo = numero di applicazioni dell'operatore; STUPID_POWER costa n-1, la sottostruttura x^n = (x^floor(n/2))^2 (per n dispari per x) dà POWER con T(n) = floor(log2 n) + (numero di bit a 1 di n) - 1, Theta(log n) (caso peggiore 2 floor(log2 n), n = 2^t - 1); versioni iterative POWER2 e POWER3 dalla rappresentazione binaria di n; esempio con la matrice di Fibonacci; il modello a costo unitario vale solo se l'operatore non fa crescere gli operandi.Esponenziazione veloce per quadrature successive →.
- (a) , , , , , , .
- (b) , cioè se e se .
- (c) Prima metà: e (si isola e si raccoglie ; è Horner in ). Seconda metà: e (l'addendo che manca in è ).
- (d)
pow2 <- 2*pow2ec[i] <- 2*c[i-1]+x[i]per ; poic[2n-2] <- x[n-1]*pow2; poic[i] <- c[i+1]/2 + x[i-n+1]*pow2per giù a . Correttezza per invarianti (;c[i+1]corretto prima dell'iterazione ). - Costo: ; con per quadrature successive . Per nessuna operazione.
- Controllo: dà con zeri; confronto con
numpy.convolveper . - Errori tipici: limiti sbagliati della sommatoria nella seconda metà (, non ); dimenticare l'addendo nella seconda ricorrenza; contare invece di iterazioni del secondo ciclo; usare la FFT quando la struttura dà .