Salta al contenuto
Note per Studenti Esercizio - polinomio con tutte le radici dell'unità tranne 1 e -1, valutazione e DFT dei coefficienti (compito del 26 giugno 2025, es. 1)

Esercizio - polinomio con tutte le radici dell'unità tranne 1 e -1, valutazione e DFT dei coefficienti (compito del 26 giugno 2025, es. 1)

Esame
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 ωn=ei2π/n\omega_n=e^{i2\pi/n} la radice principale dell'unità di ordine n≥1n\ge1, nel campo complesso. Per ogni naturale pari n≥4n\ge4 si definisce il polinomio pn(x)=(x−ωn1)(x−ωn2)⋯(x−ωnn/2−1)⋅(x−ωnn/2+1)(x−ωnn/2+2)⋯(x−ωnn−1).p_n(x)=(x-\omega_n^1)(x-\omega_n^2)\cdots(x-\omega_n^{n/2-1})\cdot(x-\omega_n^{n/2+1})(x-\omega_n^{n/2+2})\cdots(x-\omega_n^{n-1}). Si noti che pn(x)p_n(x) si annulla sulle radici nn-esime dell'unità, a eccezione di ωn0=1\omega_n^0=1 e ωnn/2=−1\omega_n^{n/2}=-1. Il polinomio ha grado n−2n-2, ma conviene considerarlo di degree-bound nn e scrivere pn(x)=∑i=0n−1aixi,p_n(x)=\sum_{i=0}^{n-1}a_ix^i, dove i coefficienti a0,a1,…,an−2,an−1=0a_0,a_1,\dots,a_{n-2},a_{n-1}=0 sono univocamente determinati da nn. In tutte le parti, per complessità di un algoritmo si intende il numero di operazioni aritmetiche su operandi complessi.

  1. (a) [4 punti] Si descriva un semplice algoritmo A0A_0 che, dato in input nn, restituisca pn(+1)p_n(+1) e pn(−1)p_n(-1). Si analizzi la complessità Ta(n)T_a(n) di A0A_0.
  2. (b) [3 punti] L'algoritmo A0A_0 proposto ha complessità polinomiale? Si motivi la risposta.
  3. (c) [5 punti] Si descriva un algoritmo efficiente (possibilmente O(n)O(n)) per il calcolo della DFT (A0,A1,…,An−1)(A_0,A_1,\dots,A_{n-1}) del vettore (a0,a1,…,an−1)(a_0,a_1,\dots,a_{n-1}) e se ne analizzi la complessità Tc(n)T_c(n). (Si ricordi la relazione tra DFT e valutazione di un polinomio in un opportuno insieme di punti.)
  4. (d) [5 punti] Si descriva un algoritmo efficiente (possibilmente O(n)O(n)) per calcolare i coefficienti a0,a1,…,an−1a_0,a_1,\dots,a_{n-1} di pn(x)p_n(x), provandone la correttezza e analizzandone la complessità Td(n)T_d(n).

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 (n,k)(n,k)-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 aia_i, ma si sa valutarlo in un punto zz con un prodotto di n−2n-2 fattori. Questo è il dato di partenza di tutto l'esercizio.

(a) Un algoritmo semplice per pn(1)p_n(1) e pn(−1)p_n(-1)

Si calcolano le potenze ωnh\omega_n^h una dopo l'altra e si accumulano i due prodotti ∏h(1−ωnh)\prod_h(1-\omega_n^h) e ∏h(−1−ωnh)\prod_h(-1-\omega_n^h), saltando h=n/2h=n/2 (il fattore mancante) e partendo dal primo fattore senza moltiplicare per 11.

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 h=1,…,n−1h=1,\dots,n-1 con h≠n/2h\ne n/2, cioè n−2n-2 fattori. Conteggio:

  • aggiornamenti di pw: n−2n-2 prodotti;
  • calcolo dei fattori: 2(n−2)2(n-2) operazioni;
  • accumulo: i due prodotti partono dal secondo fattore, quindi 2(n−3)2(n-3) prodotti.

Totale: Ta(n)=(n−2)+2(n−2)+2(n−3)=5n−12T_a(n)=(n-2)+2(n-2)+2(n-3)=5n-12 operazioni (verificato contando le operazioni di un'implementazione per n=4,8,16,32n=4,8,16,32: 8,28,68,1488,28,68,148). La soluzione del corso riporta 5n−135n-13: calcola 3n−83n-8 per ciascuna valutazione contando n−3n-3 potenze, e condivide le potenze tra le due valutazioni; la differenza di 11 dipende solo da come si contano le potenze di ωn\omega_n (qui si passa anche per ωnn/2\omega_n^{n/2}, che serve per ottenere le potenze successive). In ogni caso Ta(n)=Θ(n)T_a(n)=\Theta(n).

Miglioramento della costante. Le radici escluse sono 11 e −1-1, quindi le radici rimaste si raggruppano in coppie ωnh\omega_n^h e ωnh+n/2=−ωnh\omega_n^{h+n/2}=-\omega_n^h, per h=1,…,n/2−1h=1,\dots,n/2-1: pn(x)=∏h=1n/2−1(x−ωnh)(x+ωnh)=∏h=1n/2−1(x2−ωn2h)=∏h=1n/2−1(x2−ωn/2h),p_n(x)=\prod_{h=1}^{n/2-1}(x-\omega_n^h)(x+\omega_n^h)=\prod_{h=1}^{n/2-1}\bigl(x^2-\omega_n^{2h}\bigr)=\prod_{h=1}^{n/2-1}\bigl(x^2-\omega_{n/2}^h\bigr), dove l'ultimo passaggio è il lemma di cancellazione. Da qui pn(−x)=pn(x)p_n(-x)=p_n(x): il polinomio è pari, quindi pn(1)=pn(−1)p_n(1)=p_n(-1) e basta una sola valutazione, con soli n/2−1n/2-1 fattori 1−ωn/2h1-\omega_{n/2}^h. Con le potenze di ωn/2\omega_{n/2} ottenute di seguito (n/2−2n/2-2 prodotti), i fattori (n/2−1n/2-1 differenze) e gli accumuli (n/2−2n/2-2 prodotti) il costo è 32n−5\frac32n-5 (verificato per n=4,…,64n=4,\dots,64: 1,7,19,43,911,7,19,43,91), cioè 32n+O(1)\frac32n+O(1).

Osservazione, forma chiusa. Il prodotto di tutti i fattori (x−ωnh)(x-\omega_n^h), h=0,…,n−1h=0,\dots,n-1, è xn−1x^n-1 (polinomio monico di grado nn con le nn radici distinte ωnh\omega_n^h). Quindi pn(x) (x−1)(x+1)=xn−1p_n(x)\,(x-1)(x+1)=x^n-1 e pn(x)=xn−1x2−1=1+x2+x4+⋯+xn−2.p_n(x)=\frac{x^n-1}{x^2-1}=1+x^2+x^4+\dots+x^{n-2}. Per n=4n=4: p4(x)=(x−i)(x+i)=x2+1p_4(x)=(x-i)(x+i)=x^2+1. Da questa forma si leggono subito ai=1a_i=1 per ii pari con i≤n−2i\le n-2, ai=0a_i=0 per ii dispari, e pn(1)=pn(−1)=n/2p_n(1)=p_n(-1)=n/2 (verificato con numpy per n=4,8,16,32n=4,8,16,32; per n=64n=64 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 nn, scritto in binario con ∣⟨n⟩∣=⌊log⁡2n⌋+1|\langle n\rangle|=\lfloor\log_2n\rfloor+1 bit, e la complessità di un algoritmo si dice polinomiale quando è limitata da un polinomio nella taglia dell'input, non nel valore. Da n≥2∣⟨n⟩∣−1n\ge2^{|\langle n\rangle|-1} segue Ta(n)=5n−12 ≥ 5⋅2∣⟨n⟩∣−1−12,T_a(n)=5n-12\ \ge\ 5\cdot2^{|\langle n\rangle|-1}-12, che è esponenziale nella taglia ∣⟨n⟩∣|\langle n\rangle|. Il costo Θ(n)\Theta(n) sembra buono solo se si confonde il valore nn con la taglia dell'istanza (come in un algoritmo di primalità che prova tutti i divisori fino a nn: lineare nel valore, esponenziale nei bit). Anche la versione migliorata, di costo 32n−5\frac32n-5, è esponenziale nella taglia. Con la forma chiusa pn(1)=pn(−1)=n/2p_n(1)=p_n(-1)=n/2 dell'osservazione in (a), invece, bastano O(1)O(1) operazioni.

(c) La DFT dei coefficienti

La DFT di ordine nn del vettore dei coefficienti restituisce le valutazioni di pnp_n sulle radici nn-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à →): Ah=pn(ωnh),0≤h≤n−1.A_h=p_n(\omega_n^h),\qquad 0\le h\le n-1. Per definizione pnp_n si annulla in tutte le radici tranne 1=ωn01=\omega_n^0 e −1=ωnn/2-1=\omega_n^{n/2}. Quindi Ah=0A_h=0 per h∉{0,n/2}h\notin\{0,n/2\}, A0=pn(1)A_0=p_n(1), An/2=pn(−1)A_{n/2}=p_n(-1), e per la parità pn(−1)=pn(1)=:Pp_n(-1)=p_n(1)=:P: (A0,…,An−1)=(P,0,…,0,Pposto n/2,0,…,0).(A_0,\dots,A_{n-1})=(P,0,\dots,0,\underset{\text{posto }n/2}{P},0,\dots,0). Algoritmo: calcolare PP (parte (a), versione migliorata) e scrivere il vettore con PP nelle posizioni 00 e n/2n/2 e zeri altrove. Scrivere gli n−2n-2 zeri non è un'operazione aritmetica. Costo: Tc(n)=Ta′(n)=32n+O(1)=O(n)T_c(n)=T_a'(n)=\frac32n+O(1)=O(n), dove Ta′T_a' è il costo della valutazione migliorata. (La soluzione del corso scrive Tc(n)=Ta(n)=3n−8T_c(n)=T_a(n)=3n-8, 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 (Ah)(A_h). Per la formula dell'inversa ([Fn−1]ih=1nωn−ih[F_n^{-1}]_{ih}=\frac1n\omega_n^{-ih}, 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 →): ai=1n∑h=0n−1Ah ωn−ih=1n(A0 ωn0+An/2 ωn−in/2)=Pn(1+(ωnn/2)−i)=Pn(1+(−1)i),a_i=\frac1n\sum_{h=0}^{n-1}A_h\,\omega_n^{-ih}=\frac1n\Bigl(A_0\,\omega_n^0+A_{n/2}\,\omega_n^{-in/2}\Bigr)=\frac Pn\Bigl(1+(\omega_n^{n/2})^{-i}\Bigr)=\frac Pn\bigl(1+(-1)^{i}\bigr), perché tutti gli altri addendi sono nulli e ωnn/2=−1\omega_n^{n/2}=-1 (quindi (−1)−i=(−1)i(-1)^{-i}=(-1)^i). Dunque ai={2Pni pari,0i dispari.a_i=\begin{cases}\dfrac{2P}{n}&i\text{ pari},\\[2mm]0&i\text{ dispari}.\end{cases} In particolare an−1=0a_{n-1}=0 (n−1n-1 è dispari), come richiesto dal testo.

Algoritmo: si calcola PP, poi q=2P/nq=2P/n (una divisione e un prodotto), e si riempie il vettore con qq agli indici pari e 00 a quelli dispari. Correttezza: è la formula appena dimostrata, che discende dal teorema sulla matrice inversa di Fourier e dal fatto che DFTn(a)\mathrm{DFT}_n(\mathbf a) è proprio il vettore trovato in (c). Costo: Td(n)=32n+O(1)+2=O(n)T_d(n)=\frac32n+O(1)+2=O(n), dominato dal calcolo di PP; le nn componenti si scrivono per copia.

Controllo. Con la forma chiusa dell'osservazione, P=n/2P=n/2 e q=2⋅n2⋅1n=1q=2\cdot\frac n2\cdot\frac1n=1: i coefficienti pari sono 11 e quelli dispari 00, come in 1+x2+⋯+xn−21+x^2+\dots+x^{n-2}. Per n=8n=8: a=(1,0,1,0,1,0,1,0)\mathbf a=(1,0,1,0,1,0,1,0) e la DFT è (4,0,0,0,4,0,0,0)(4,0,0,0,4,0,0,0) (verificato: sommando i coefficienti si ottiene 4=p8(1)4=p_8(1), e p8(−1)=1+1+1+1=4p_8(-1)=1+1+1+1=4).

Con i vettori sparsi. Lo stesso risultato segue riconoscendo che (A0,…,An−1)(A_0,\dots,A_{n-1}) è (n,n/2)(n,n/2)-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 ωn−1\omega_n^{-1} al posto di ωn\omega_n (stessi lemmi), FFT_NEG\mathrm{FFT\_NEG} è fatta di n/2n/2 copie della trasformata di ordine 22 delle componenti non banali (A0,An/2)=(P,P)(A_0,A_{n/2})=(P,P), cioè di (P+P, P−P)=(2P,0)(P+P,\,P-P)=(2P,0) ripetuto n/2n/2 volte; dividendo per nn si ottiene (2P/n,0,2P/n,0,… )(2P/n,0,2P/n,0,\dots), lo stesso vettore.

Versione ripasso

Testo. pn(x)=∏h≠0, n/2(x−ωnh)p_n(x)=\prod_{h\ne0,\,n/2}(x-\omega_n^h) per n≥4n\ge4 pari, degree-bound nn, coefficienti a0,…,an−1a_0,\dots,a_{n-1} con an−1=0a_{n-1}=0. (a) [4] algoritmo A0A_0 per pn(1),pn(−1)p_n(1),p_n(-1) e costo; (b) [3] è polinomiale?; (c) [5] DFT del vettore dei coefficienti, in O(n)O(n); (d) [5] coefficienti, in O(n)O(n), 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 ωnh\omega_n^h successive (n−2n-2 prodotti), per h≠n/2h\ne n/2 i fattori 1−ωnh1-\omega_n^h e −(1+ωnh)-(1+\omega_n^h) (2(n−2)2(n-2) operazioni) e due prodotti accumulati (2(n−3)2(n-3)): Ta=5n−12T_a=5n-12 (il corso riporta 5n−135n-13, differenza di conteggio). Le radici escluse formano coppie ±ωnh\pm\omega_n^h: pn(x)=∏h=1n/2−1(x2−ωn/2h)p_n(x)=\prod_{h=1}^{n/2-1}(x^2-\omega_{n/2}^h), quindi pnp_n è pari, pn(1)=pn(−1)=:Pp_n(1)=p_n(-1)=:P, e basta una valutazione, costo 32n−5\frac32n-5.
  • Forma chiusa (controllo): pn(x)(x2−1)=xn−1p_n(x)(x^2-1)=x^n-1, quindi pn=1+x2+⋯+xn−2p_n=1+x^2+\dots+x^{n-2} e P=n/2P=n/2.
  • (b) No: la taglia dell'input nn è ⌊log⁡2n⌋+1\lfloor\log_2n\rfloor+1 bit e Ta=5n−12≥5⋅2∣⟨n⟩∣−1−12T_a=5n-12\ge5\cdot2^{|\langle n\rangle|-1}-12 è esponenziale in essa.
  • (c) Ah=pn(ωnh)A_h=p_n(\omega_n^h) è 00 per h∉{0,n/2}h\notin\{0,n/2\}: (A0,…,An−1)=(P,0,…,0,P,0,…,0)(A_0,\dots,A_{n-1})=(P,0,\dots,0,P,0,\dots,0), con PP al posto 00 e n/2n/2. Costo 32n+O(1)\frac32n+O(1) (il corso: 3n−83n-8, stesso ordine).
  • (d) ai=1n∑hAhωn−ih=Pn(1+(ωnn/2)−i)=Pn(1+(−1)i)a_i=\frac1n\sum_hA_h\omega_n^{-ih}=\frac Pn(1+(\omega_n^{n/2})^{-i})=\frac Pn(1+(-1)^i): ai=2Pna_i=\frac{2P}n per ii pari, 00 per ii dispari (an−1=0a_{n-1}=0). Correttezza dalla matrice inversa di Fourier ([Fn−1]ih=1nωn−ih[F_n^{-1}]_{ih}=\frac1n\omega_n^{-ih}); costo O(n)O(n), dominato dal calcolo di PP più 22 operazioni (2P/n2P/n).
  • Controllo n=8n=8: a=(1,0,1,0,1,0,1,0)\mathbf a=(1,0,1,0,1,0,1,0), DFT (4,0,0,0,4,0,0,0)(4,0,0,0,4,0,0,0).
  • Esempio n=4n=4: p4(x)=(x−i)(x+i)=x2+1p_4(x)=(x-i)(x+i)=x^2+1, coefficienti (1,0,1,0)(1,0,1,0), P=p4(1)=2=n/2P=p_4(1)=2=n/2, DFT (2,0,2,0)(2,0,2,0); formula ai=2Pn=1a_i=\frac{2P}n=1 per ii pari.
  • Con i vettori sparsi: (A0,…,An−1)(A_0,\dots,A_{n-1}) è (n,n/2)(n,n/2)-sparso; la trasformata inversa (stessi lemmi con ωn−1\omega_n^{-1}) è fatta di n/2n/2 copie di (P+P,P−P)=(2P,0)(P+P,P-P)=(2P,0), divise per nn: (2P/n,0,2P/n,0,… )(2P/n,0,2P/n,0,\dots) (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: pn(−x)=pn(x)p_n(-x)=p_n(x) perché le radici rimaste sono a coppie ±ωnh\pm\omega_n^h e (x−ωnh)(x+ωnh)=x2−ωn/2h(x-\omega_n^h)(x+\omega_n^h)=x^2-\omega_{n/2}^h (cancellazione); quindi pn(1)=pn(−1)p_n(1)=p_n(-1) e An/2=A0A_{n/2}=A_0.
  • Errori tipici: dire che O(n)O(n) è polinomiale rispetto all'input nn; dimenticare ωnn/2=−1\omega_n^{n/2}=-1 (e quindi la parità di pnp_n); contare nel costo le scritture degli zeri; mettere il fattore 1n\frac1n nel posto sbagliato dell'antitrasformata.

Teoria collegata