Esercizio - polinomio con tutte le radici dell'unità tranne 1 e -1, valutazione e DFT dei coefficienti (compito del 26 giugno 2025, es. 1)
In questa pagina 4
Testo (compito d'esame del 26 giugno 2025 di Algoritmi per l'Ingegneria, Ing. Informatica UniPD, seconda parte, esercizio 1, 17 punti). Sia la radice principale dell'unità di ordine , nel campo complesso. Per ogni naturale pari si definisce il polinomio Si noti che si annulla sulle radici -esime dell'unità, a eccezione di e . Il polinomio ha grado , ma conviene considerarlo di degree-bound e scrivere dove i coefficienti sono univocamente determinati da . In tutte le parti, per complessità di un algoritmo si intende il numero di operazioni aritmetiche su operandi complessi.
- (a) [4 punti] Si descriva un semplice algoritmo che, dato in input , restituisca e . Si analizzi la complessità di .
- (b) [3 punti] L'algoritmo proposto ha complessità polinomiale? Si motivi la risposta.
- (c) [5 punti] Si descriva un algoritmo efficiente (possibilmente ) per il calcolo della DFT del vettore e se ne analizzi la complessità . (Si ricordi la relazione tra DFT e valutazione di un polinomio in un opportuno insieme di punti.)
- (d) [5 punti] Si descriva un algoritmo efficiente (possibilmente ) per calcolare i coefficienti di , provandone la correttezza e analizzandone la complessità .
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à → (DFT come valutazione sulle radici, lemma di somma), 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 → (matrice inversa di Fourier), 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 → (vettori -sparsi), 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 → (valutazione).
Il polinomio è dato in forma fattorizzata: non si conoscono i coefficienti , ma si sa valutarlo in un punto con un prodotto di fattori. Questo è il dato di partenza di tutto l'esercizio.
(a) Un algoritmo semplice per e
Si calcolano le potenze una dopo l'altra e si accumulano i due prodotti e , saltando (il fattore mancante) e partendo dal primo fattore senza moltiplicare per .
A0(n)
w <- e^(i 2 pi / n) { costante: non si conta }
pw <- w { pw = w^h all'inizio dell'iterazione h }
for h <- 1 to n-1
if h >= 2 then pw <- pw * w { n-2 prodotti }
if h != n/2 then
f1 <- 1 - pw; f2 <- -(1 + pw) { 2 operazioni }
if è il primo fattore then P1 <- f1; P2 <- f2
else P1 <- P1 * f1; P2 <- P2 * f2 { 2 prodotti }
return (P1, P2)I fattori utili sono con , cioè fattori. Conteggio:
- aggiornamenti di
pw: prodotti; - calcolo dei fattori: operazioni;
- accumulo: i due prodotti partono dal secondo fattore, quindi prodotti.
Totale: operazioni (verificato contando le operazioni di un'implementazione per : ). La soluzione del corso riporta : calcola per ciascuna valutazione contando potenze, e condivide le potenze tra le due valutazioni; la differenza di dipende solo da come si contano le potenze di (qui si passa anche per , che serve per ottenere le potenze successive). In ogni caso .
Miglioramento della costante. Le radici escluse sono e , quindi le radici rimaste si raggruppano in coppie e , per : dove l'ultimo passaggio è il lemma di cancellazione. Da qui : il polinomio è pari, quindi e basta una sola valutazione, con soli fattori . Con le potenze di ottenute di seguito ( prodotti), i fattori ( differenze) e gli accumuli ( prodotti) il costo è (verificato per : ), cioè .
Osservazione, forma chiusa. Il prodotto di tutti i fattori , , è (polinomio monico di grado con le radici distinte ). Quindi e
Per : . Da questa forma si leggono subito per pari con , per dispari, e (verificato con numpy per ; per l'espansione numerica dei fattori perde precisione, ma la formula resta esatta). Il testo però chiede la strada che passa per la DFT, che si applica a qualunque insieme di radici escluse: la si segue qui sotto, usando la forma chiusa solo come controllo.
(b) La complessità è polinomiale?
No. L'input è il numero , scritto in binario con bit, e la complessità di un algoritmo si dice polinomiale quando è limitata da un polinomio nella taglia dell'input, non nel valore. Da segue che è esponenziale nella taglia . Il costo sembra buono solo se si confonde il valore con la taglia dell'istanza (come in un algoritmo di primalità che prova tutti i divisori fino a : lineare nel valore, esponenziale nei bit). Anche la versione migliorata, di costo , è esponenziale nella taglia. Con la forma chiusa dell'osservazione in (a), invece, bastano operazioni.
(c) La DFT dei coefficienti
La DFT di ordine del vettore dei coefficienti restituisce le valutazioni di sulle radici -esime dell'unità (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à →): Per definizione si annulla in tutte le radici tranne e . Quindi per , , , e per la parità : Algoritmo: calcolare (parte (a), versione migliorata) e scrivere il vettore con nelle posizioni e e zeri altrove. Scrivere gli zeri non è un'operazione aritmetica. Costo: , dove è il costo della valutazione migliorata. (La soluzione del corso scrive , il costo di una valutazione con l'algoritmo non migliorato: lo stesso ordine di grandezza.)
(d) I coefficienti con la DFT inversa
Il vettore dei coefficienti è l'antitrasformata di . Per la formula dell'inversa (, vedi 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 →): perché tutti gli altri addendi sono nulli e (quindi ). Dunque In particolare ( è dispari), come richiesto dal testo.
Algoritmo: si calcola , poi (una divisione e un prodotto), e si riempie il vettore con agli indici pari e a quelli dispari. Correttezza: è la formula appena dimostrata, che discende dal teorema sulla matrice inversa di Fourier e dal fatto che è proprio il vettore trovato in (c). Costo: , dominato dal calcolo di ; le componenti si scrivono per copia.
Controllo. Con la forma chiusa dell'osservazione, e : i coefficienti pari sono e quelli dispari , come in . Per : e la DFT è (verificato: sommando i coefficienti si ottiene , e ).
Con i vettori sparsi. Lo stesso risultato segue riconoscendo che è -sparso (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 →). Per la trasformata inversa, che usa al posto di (stessi lemmi), è fatta di copie della trasformata di ordine delle componenti non banali , cioè di ripetuto volte; dividendo per si ottiene , lo stesso vettore.
Versione ripasso
Testo. per pari, degree-bound , coefficienti con . (a) [4] algoritmo per e costo; (b) [3] è polinomiale?; (c) [5] DFT del vettore dei coefficienti, in ; (d) [5] coefficienti, in , con correttezza. 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à →, 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 →.
- (a)
A0: potenze successive ( prodotti), per i fattori e ( operazioni) e due prodotti accumulati (): (il corso riporta , differenza di conteggio). Le radici escluse formano coppie : , quindi è pari, , e basta una valutazione, costo . - Forma chiusa (controllo): , quindi e .
- (b) No: la taglia dell'input è bit e è esponenziale in essa.
- (c) è per : , con al posto e . Costo (il corso: , stesso ordine).
- (d) : per pari, per dispari (). Correttezza dalla matrice inversa di Fourier (); costo , dominato dal calcolo di più operazioni ().
- Controllo : , DFT .
- Esempio : , coefficienti , , DFT ; formula per pari.
- Con i vettori sparsi: è -sparso; la trasformata inversa (stessi lemmi con ) è fatta di copie di , divise per : (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 →).
- Perché basta una valutazione: perché le radici rimaste sono a coppie e (cancellazione); quindi e .
- Errori tipici: dire che è polinomiale rispetto all'input ; dimenticare (e quindi la parità di ); contare nel costo le scritture degli zeri; mettere il fattore nel posto sbagliato dell'antitrasformata.