Complessità di calcolo della trasformata discreta di Fourier?


18

Qual è la complessità (sulla RAM intera standard) del calcolo della trasformata di Fourier discreta standard di un vettore di numeri interi?n

L' algoritmo classico per trasformazioni veloci di Fourier , impropriamente [1] attribuito a Cooley e Tukey, viene generalmente descritto come in esecuzione nel tempo . Ma la maggior parte delle operazioni aritmetiche eseguite in questo algoritmo iniziano con complesse radici di unità, che sono (per la maggior parte ) irrazionali, quindi una valutazione esatta a tempo costante non è ragionevole. Lo stesso problema sorge con l' algoritmo -time (che si moltiplica per una matrice Vandermonde di radici complesse di unità).n n O ( n 2 )O(nlogn)nnO(n2)

Non è nemmeno chiaro come rappresentare esattamente l'output del DFT (in qualsiasi forma utile). In altre parole, non è chiaro che il calcolo dei DFT sia effettivamente possibile!

Supponiamo quindi di aver bisogno solo di bit di precisione in ciascun valore di output. Qual è la complessità del calcolo della trasformata di Fourier discreta, in funzione di e ? (Per concretezza, sentiti libero di assumere è un potere di ).n b nbnbn2

O ogni istanza di "FFT" in letteratura significa in realtà "rapida trasformazione teorica dei numeri "? [2]

Vedi le mie domande correlate sulla complessità dell'eliminazione gaussiana e sui percorsi più brevi euclidei .

[1] Dovrebbe davvero essere chiamato (qualche prefisso di) l'algoritmo Gauss-Runge-König-Yates-Stumpf-Danielson-Lánczos-Cooley-Tukey.

[2] E se sì, perché la maggior parte dei libri di testo descrive solo l'algoritmo dei numeri complessi?


1
Penso che sia questo il suo punto: in teoria non devi preoccuparti di , ma in qualsiasi implementazione EFFETTIVA devi preoccuparti di ciò e dell'errore che potrebbe verificarsi. b
Suresh Venkat,

1
In realtà questa è una buona domanda ogni ulteriore bit di precisione aggiunge alla potenza del segnale (moltiplicando per ). Quindi penso che la domanda sarà molto utile se le dimensioni delle parole intermedie possono essere ampliate! 23dB2
vs

3
L'analisi calcolabile ha preso in considerazione questo e le relative domande. Questo documento produce una complessità legata al calcolo della trasformata di Fourier nel quadro dell'efficacia di tipo II di Weirauch. Il limite è che è lineare nella presentazione dell'input (infinito, con valori reali). Sia l'input che l'output sono definiti con parametri di precisione wrt in questo sistema, quindi potrebbe esserci un modo per tradurlo nel modello RAM.
Aaron Sterling,

3
Dai un'occhiata al metodo A nel documento di Schönhage e Strassen sulla moltiplicazione dei numeri interi. Utilizza trasformazioni di Fourier complesse con precisione limitata. Penso che sia anche descritto in Knuth Vol. 2.
Markus Bläser,

2
Markus, Aaron: convertire in risposte?
Suresh Venkat,

Risposte:


9

Questa risposta è una variante dell'analisi del primo algoritmo ("Methode A") di Schönhage e Strassen per la moltiplicazione di numeri interi lunghi.

Supponiamo di voler calcolare un FFT di lunghezza . Scalare l'input tale che tutti i valori sono più piccoli 1. Vediamo prima presupposto che si calcola con bit fisso aritmetica ( bit dopo il punto binario). Sia essere l'unità ("complessa") della posizione minima. Let . m m δ = 2 1 / 2 - m ω = exp ( 2 π i / K )K=2kmmδ=21/2mω=exp(2πi/K)

1) Si possono calcolare approssimazioni tali che per tutti . Questo può essere fatto nel tempo dove è il tempo necessario per moltiplicare i numeri -bit. (vedi Knuth Vol. 2, 3a ed., pagina 309). | ω j - ω j | ( 2 k - 1 ) δ 0 j K - 1 O ( K M ( m ) ) M ( m ) mωj|ωjωj|(2k1)δ0jK1O(KM(m))M(m)m

Se la RAM intera standard significa costo logaritmico, allora . Se la RAM intera standard indica la parola RAM, allora . (Schönhage e Strassen mostrano in "Methode A" come ridurre in tempo lineare la moltiplicazione dei numeri -bit alla moltiplicazione dei numeri di bit . Quest'ultimo può essere fatto a costi unitari.)M(m)=O(mlogm)M(m)=O(m)mmO(logm)

2) La classica FFT Cooley-Tukey calcola le operazioni della forma . Usiamo l' aritmetica a punto fisso bit, queste operazioni diventano . Se conosciamo e fino a un errore di , otteniamo fino a un errore di .a=b+ωjcma=truncate(b+ωjc)bcϵa2ϵ+2kδ

3) Usando l'induzione, è facile vedere che otteniamo il risultato finale con errore . Per ottenere la precisione alla fine, . (2k1)2kδbmk+logk+b+O(1)

4) Quindi il tempo di esecuzione finale è .O(KkM(k+b))

Questo dovrebbe funzionare anche con numeri in virgola mobile: 1) può ancora essere fatto con aritmetica in virgola fissa, 2) vale anche per numeri in virgola mobile.


Nell'aritmetica a virgola fissa, penso, può anche essere fatto più velocemente. Innanzitutto riduciamo il calcolo della FFT alla moltiplicazione dei polinomi usando il trucco di Bluestein. La lunghezza dei coefficienti necessari per ottenere la precisione desiderata dovrebbe essere . Quindi riduciamo la moltiplicazione dei polinomi alla moltiplicazione di numeri interi lunghi. (Aggiungi i coefficienti a un numero lungo e separali con blocchi di zero di lunghezza .) La lunghezza degli interi è .O(k+b)O(k+b)O(K(k+b))


Quindi dal punto (4), impostando K = n e b = O (log n), e supponendo che stiamo correndo sulla parola RAM, otteniamo un tempo di esecuzione di . Giusto? O(nlog2n)
Jeffε,

Sì. Il secondo algoritmo produce anche , supponendo che la precisione sia sufficiente. (Non vedo alcun motivo per cui ciò non sia sufficiente, ma non ho fatto i dettagli.)O(nlogn)O(k+b)
Markus Bläser

2
A proposito, se è piccolo come , anche il primo algoritmo fornisce il tempo di esecuzione poiché . bO ( n registro n ) M ( O ( registro n ) ) = 1O(logn)O(nlogn)M(O(logn))=1
Markus Bläser,

Mi è capitato di guardare il libro di Aho, Hopcroft e Ullman su "Il design e l'analisi degli algoritmi" e discutono dell'algoritmo nel modello di bit e delle relative problematiche in dettaglio.
Chandra Chekuri,

Ma per quanto mi ricordo, discutono solo della "FFT teorica dei numeri" nel bit-modello.
Markus Bläser,

8

Questa non è una risposta completa, ma posso indicarti alcuni documenti pertinenti e anche parzialmente spiegare perché non è così facile estrarre una risposta alla tua domanda specifica dalla letteratura.

Vorrei iniziare chiedendomi, perché vuoi sapere la risposta a questa domanda? In genere, le persone che si prendono cura di questo tipo di problema sono quelle che devono effettivamente implementare una FFT ad alte prestazioni per un'applicazione pratica. Queste persone si preoccupano meno della complessità asintotica in alcuni modelli computazionali idealizzati che della massimizzazione delle prestazioni in base ai loro particolari vincoli hardware e software. Ad esempio, gli sviluppatori della Fastest Transform di Fourier in Occidente scrivono nel loro articolo:

La scelta migliore dipende dai dettagli hardware come il numero di registri, la latenza e il throughput delle istruzioni, le dimensioni e l'associatività delle cache, la struttura della pipeline del processore, ecc.

Questi sono problemi che i teorici in genere non vogliono imbrattare, ma sono di grande importanza nelle implementazioni reali. Se un teorico dichiara: "Ho capito la migliore complessità assoluta di bit asintotici nel modello RAM", il praticante potrebbe dire: "È bello", ma potrebbe trovare un risultato teorico così inutile per i suoi scopi.

Detto questo, penso che la cosa migliore da fare sia guardare la letteratura sull'analisi numerica. Ad esempio, Tasche e Zeuner hanno esaminato da vicino la stabilità numerica dell'algoritmo FFT. Questo potrebbe non essere esattamente quello che vuoi, perché il consenso generale tra i professionisti sembra essere che per raggiungere una determinata quantità di precisione numerica, il miglior approccio pratico è precompilare determinati numeri chiamati "fattori di twiddle " con elevata precisione. Se stai eseguendo solo un FFT, questo non sarà l'approccio più veloce perché non puoi ammortizzare il costo del tuo precomputazione una tantum su un gran numero di calcoli FFT. Tuttavia, la loro analisi dell'errore di arrotondamento nel caso peggiore dovrebbe comunque essere pertinente alla tua domanda.


Scommetto che la gente sarebbe interessato a sapere se possono spremere extra po 'di dire precisione se possono fare un punto FFT (OFDM in WLAN) nel dire moltiplicazioni in più nel corso degli algoritmi attuali. 1024 10011024100
vs

1
Sono interessato come una domanda puramente teorica, nell'interesse della borsa di studio corretta e onesta. È abbastanza comune leggere "e qui usiamo un FFT, che come tutti sanno viene eseguito nel tempo O (n log n)" nel mezzo di un algoritmo altrimenti puramente combinatorio, altrimenti analizzato in termini di attraversamenti di puntatori e O (log n ) aritmetica a interi bit. Se, in effetti, la convoluzione intera può essere eseguita in tempo O (n log n) usando una leggera variante della FFT, questo è forse perdonabile ma ancora sciatto. Altrimenti, qualsiasi povero schmuck che cerca di implementare l'algoritmo otterrà THE WRONG ANSWER.
Jeffε

E, naturalmente, non mi aspetto che la risposta alla mia domanda abbia alcun impatto nella pratica.
Jeffε

2
Jeff, per quanto riguarda l'onesta borsa di studio, non è sufficiente dire che la FFT richiede operazioni O (n log n) ring? Questo è il modo naturale per misurare la complessità dell'algoritmo FFT. Non vedo la motivazione per convertire tutto in un particolare modello di calcolo. C'è qualche teorema che stai cercando di dimostrare dove è cruciale tenere traccia del numero di bit di precisione? Per quanto riguarda il tuo povero schmuck, non compro che otterrà la "risposta sbagliata". In qualsiasi implementazione effettiva, è molto improbabile che la domanda che stai ponendo qui sia la preoccupazione dominante.
Timothy Chow,

Tim: Certo, è sufficiente dire le operazioni dell'anello se stai analizzando la FFT in isolamento. Ma se la FFT è solo una delle componenti di un algoritmo più grande, la segnalazione del tempo di esecuzione dell'algoritmo più grande richiede un modello di calcolo coerente per tutte le sue subroutine costituenti, inclusa la FFT. Ad esempio, "convolgere le due sequenze di numeri interi usando l'algoritmo Cooley-Tukey FFT e quindi inserire i coefficienti risultanti in una tabella di hash" (per fare un esempio totalmente falso) sta chiedendo problemi. O(nlogn)
Jeffε,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.