]> mj.ucw.cz Git - ads2.git/commitdiff
FFT: Prepsan i zbytek kapitoly
authorMartin Mares <mj@ucw.cz>
Mon, 2 Jan 2012 21:40:37 +0000 (22:40 +0100)
committerMartin Mares <mj@ucw.cz>
Mon, 2 Jan 2012 21:40:37 +0000 (22:40 +0100)
7-fft/7-fft.tex

index c9ee32f00bd7dbf7293629dae6864c6b839d9761..6ff098249e253c7d01f583acc2663ec9dee674d9 100644 (file)
@@ -115,7 +115,7 @@ Dostaneme n
 \:Nalezneme koeficienty polynomu~$R$ tak, aby odpovídaly grafu.
 \endalgo
 
-\>Krok~4 trvá $\O(n)$, tak¾e rychlost celého algoritmu stojí a padá s~efektivitou
+\>Krok~4 trvá $\Theta(n)$, tak¾e rychlost celého algoritmu stojí a padá s~efektivitou
 pøevodù mezi koeficientovou a hodnotovou reprezentací polynomù. Uká¾e se,
 ¾e aèkoliv to obecnì není snadný problém, mù¾eme si body $x_0,\ldots,x_{n-1}$
 zvolit tak ¹ikovnì, aby pøevod probìhl rychle.
@@ -159,6 +159,7 @@ i po~n
 \h{Intermezzo: Pøipomenutí komplexních èísel}
 \def\ii{\mkern 0.5mu{\bf i}}
 \def\im{{\bf i}}
+\def\e{{\rm e}}
 \def\\{\hfil\break}
 
 \s{Základní operace}
@@ -203,188 +204,194 @@ Pak plat
 \s{Exponenciální tvar}
 
 \itemize\ibull
-\:Eulerova formule: $e^{\im\varphi} = \cos\varphi + \im\sin\varphi$.
+\:Eulerova formule: $\e^{\im\varphi} = \cos\varphi + \im\sin\varphi$.
 
-\:Ka¾dé $x\in{\bb C}$ lze tedy zapsat jako $\vert x\vert \cdot e^{\ii \varphi(x)}$.
+\:Ka¾dé $x\in{\bb C}$ lze tedy zapsat jako $\vert x\vert \cdot \e^{\ii \varphi(x)}$.
 
-\:Násobení: $xy = \left(\vert x\vert\cdot e^{\ii\varphi(x)}\right) \cdot
-       \left(\vert y\vert\cdot e^{\ii\varphi(y)}\right) = \vert x\vert
-       \cdot \vert y\vert \cdot e^{\ii(\varphi(x) + \varphi(y))}$. \\
+\:Násobení: $xy = \left(\vert x\vert\cdot \e^{\ii\varphi(x)}\right) \cdot
+       \left(\vert y\vert\cdot \e^{\ii\varphi(y)}\right) = \vert x\vert
+       \cdot \vert y\vert \cdot \e^{\ii(\varphi(x) + \varphi(y))}$. \\
 (absolutní hodnoty se násobí, argumenty sèítají)
 
-\:Umocòování: $x^\alpha = \left(\vert x\vert\cdot e^{\ii\varphi(x)}\right)^
-       \alpha = {\vert x\vert}^\alpha\cdot e^{\ii \alpha \varphi(x)}$.
-
-\:Odmocòování: $\root n\of x = {\vert x\vert}^{1/n} \cdot e^{\ii \varphi(x)/n}$. \\
-Pozor, odmocnina není jednoznaèná: $1^4=(-1)^4=\ii^4=(-\ii)^4=1$.
+\:Umocòování: $x^\alpha = \left(\vert x\vert\cdot \e^{\ii\varphi(x)}\right)^
+       \alpha = {\vert x\vert}^\alpha\cdot \e^{\ii \alpha \varphi(x)}$.
 \endlist
 
 \s{Odmocniny z~jednièky}
 
 \smallskip
 
-\>Je-li nìjaké $x\in{\bb C}$ $n$-tou odmocninou z~jednièky, musí platit:
+Odmocòování v~komplexních èíslech obecnì není jednoznaèné: jestli¾e tøeba
+budeme hledat ètvrtou odmocninu z~jednièky, toti¾ øe¹it rovnici $x^4=1$, nalezneme
+hned ètyøi taková~$x$: 1, $-1$, $\im$ a $-\im$.
+
+Prozkoumejme nyní obecnìji, jak se chovají $n$-té odmocniny z~jednièky, tedy
+komplexní koøeny rovnice $x^n=1$:
 
 \itemize\ibull
-\:$\vert x \vert = 1$, tak¾e $x=e^{\ii\varphi}$ pro nìjaké~$\varphi$.
-\:$x^n = e^{\ii\varphi n} = \cos{\varphi n} + \im\sin\varphi n = 1$,
+\:$\vert x \vert = 1$, tak¾e $x=\e^{\ii\varphi}$ pro nìjaké~$\varphi$.
+\:$x^n = \e^{\ii\varphi n} = \cos{\varphi n} + \im\sin\varphi n = 1$,
   co¾ nastane, kdykoliv $\varphi n = 2k\pi$ pro nìjaké $k\in{\bb Z}$.
-\:Dostáváme $n$ rùzných $n$-tých odmocnin: \\
-  $2k\pi/n$ pro $k=0,\ldots,n-1$.
 \endlist
 
-\>Pro obecné~$x$ pak platí: $\root n \of x = {\vert x\vert}^{1/n} \cdot e^{\ii\varphi (x)/n} \cdot u$, kde $u=\root n\of 1$.
+\>Dostáváme tedy $n$ rùzných $n$-tých odmocnin z~1, toti¾
+$\e^{2k\pi/n}$ pro $k=0,\ldots,n-1$.
+(Mimochodem, budeme-li odmocòovat nìjaké jiné komplexní èíslo ne¾ jednièku
+a nulu, dostaneme opìt $n$ rùzných $n$-tých odmocnin, které se od~sebe budou
+li¹it vynásobením nìjakou $n$-tou odmocninou z~jedné. To ale nebudeme potøebovat.)
 
 \s{Primitivní odmocniny}
 
-\s{Definice:} $x$ je {\I primitivní} $k$-tá odmocnina z 1 $\equiv x^k=1 \land \forall j: 0<j<k \Rightarrow x^j \neq 1$.
+Nás bude ov¹em zajímat jeden velice speciální druh odmocnin z~jednièky:
+
+\s{Definice:} Komplexní èíslo~$x$ je {\I primitivní} $n$-tá odmocnina z~1, pokud $x^n=1$
+a ¾ádné z~èísel $x^1,x^2,\ldots,x^{n-1}$ není rovno~1.
 
-\>Tuto definici splòují napøíklad èísla $\omega = e^{2\pi \ii / k}$ a $\overline\omega = e^{-2\pi\ii/k}$.
-Platí toti¾, ¾e $\omega^j = e^{2\pi\ii j/k}$, co¾ je rovno~1 právì tehdy,
+\s{Pøíklad:} Tuto definici splòují napøíklad èísla $\omega = \e^{2\pi \ii / k}$ a $\overline\omega = \e^{-2\pi\ii/k}$.
+Platí toti¾, ¾e $\omega^j = \e^{2\pi\ii j/k}$, co¾ je rovno~1 právì tehdy,
 je-li $j$ násobkem~$k$ (jednotlivé mocniny èísla~$\omega$ postupnì obíhají
 jednotkovou kru¾nici). Analogicky pro~$\overline\omega$.
 
-\>Uka¾me si nìkolik pozorování fungujících pro libovolné èíslo~$\omega$,
-které je primitivní $k$-tou odmocninou z~jednièky (nìkdy budeme potøebovat,
-aby navíc $k$ bylo sudé):
+\s{Pozorování:} Pro sudé~$n$ a libovolné èíslo~$\omega$, které je primitivní
+$n$-tou odmocninou z~jednièky, platí:
 
 \itemize\ibull
-\:Pro $0\leq j<l<k$ je $\omega^j \neq \omega^l$, nebo» $\omega^l /
-\omega^j = \omega^{l-j} \neq 1$, proto¾e $l-j < k$ a $\omega$ je primitivní.
-\:$\omega^{k/2} = -1$, proto¾e $(\omega^{k/2})^2 = 1$, a tedy
-$\omega^{k/2}$ je druhá odmocnina z~1. Takové odmocniny jsou dvì:
+\:$\omega^j \neq \omega^k$, kdykoliv $0\le j<k<n$, nebo» $\omega^k /
+\omega^j = \omega^{k-j} \neq 1$, proto¾e $0 < k-j < n$ a $\omega$ je primitivní.
+\:$\omega^{n/2} = -1$, proto¾e $(\omega^{n/2})^2 = 1$, a tedy
+$\omega^{n/2}$ je druhá odmocnina z~1. Takové odmocniny jsou dvì:
 1 a $-1$, ov¹em 1 to být nemù¾e, proto¾e $\omega$ je primitivní.
-\:$\omega^j = - \omega^{k/2 + j}$ -- pøímý dùsledek pøedchozího bodu, pro
-nás ale velice zajímavý: $\omega^0,\omega^1,\ldots,\omega^{k-1}$ jsou po dvou
-spárované.
-\:$\omega^2$ je $k/2$-tá primitivní odmocnina z 1 -- dosazením.
 \endlist
 
-\h{Konec intermezza}
-% end komplex
-
-\bigskip
-
-Vra»me se nyní k algoritmu. Z poslední èásti komplexního intermezza se zdá,
-¾e by nemusel být ¹patný nápad zkusit vyhodnocovat polynom v mocninách
-$n$-té primitivní odmocniny z~jedné (tedy za $x_0,x_1,\ldots,x_{n-1}$
-z~pùvodního algoritmu zvolíme $\omega^0,\omega^1,\ldots,\omega^{n-1}$).
-Aby nám v¹e vycházelo pìknì, zvolíme $n$ jako mocninu dvojky.
+\h{Algoritmus zachránìn}
 
-\ss{Celý algoritmus bude vypadat takto:}
-\>FFT($P$, $ \omega$)
+Uká¾eme, ¾e primitivních odmocnin lze vyu¾ít k~záchranì na¹eho párovacího
+algoritmu na vyhodnocování polynomù.
 
-\>{\sl Vstup:} $p_{0}, \ldots , p_{n-1}$, koeficienty polynomu $P$ stupnì
-nejvý¹e $n-1$, a~$\omega$,
-$n$-tá primitivní odmocina z jedné.
+Nejprve polynomy doplníme nulami tak, aby jejich velikost~$n$ byla mocninou dvojky.
+Poté zvolíme nìjakou primitivní $n$-tou odmocninu z~jednièky~$\omega$ a budeme
+polynom vyhodnocovat v~bodech $\omega^0,\omega^1,\ldots,\omega^{n-1}$. To jsou
+navzájem rùzná komplexní èísla, která jsou správnì spárovaná: pro $0\le j<n/2$
+je $\omega^{n/2+j} = \omega^{n/2} \omega^j = -\omega^j$. Jeliko¾ $\omega^2$
+je primitivní $(n/2)$-tá odmocnina z~jednièky, rekurzivnì se opìt voláme na
+problém tého¾ druhu, který je takté¾ správnì spárovaný.
 
-\>{\sl Výstup:} Hodnoty polynomu v~bodech $1, \omega, \omega^{2}, \ldots ,
-\omega^{n - 1}$, èili èísla $P(1), P(\omega), P(\omega^{2}),$ $\ldots ,
-P(\omega^{n - 1})$.
+Ná¹ plán tedy vy¹el, opravdu máme algoritmus o~slo¾itosti $\Theta(n\log n)$
+pro vyhodnocení polynomu. Je¹tì ho upravíme tak, aby místo s~polynomy pracoval
+s~vektory jejich koeficientù èi hodnot. Tomuto algoritmu se øíká FFT, vzápìtí
+prozradíme, proè.
 
+\s{Algoritmus FFT:}
 \algo
-\:Pokud $n = 1$, vrátíme $p_{0}$ a~skonèíme.
-\:Jinak rozdìlíme $P$ na èleny se sudými a lichými exponenty (jako v pùvodní
-my¹lence) a~rekurzivnì zavoláme FFT($P_s$, $\omega^{2}$) a~FFT($P_l$,
-$\omega^{2}$) -- $P_l$ i~$P_s$ jsou stupnì max. $n/2-1$, $\omega^2$ je
-$n/2$-tá primitivní odmocnina, a mocniny $\omega^2$ jsou stále po dvou
-spárované ($n$ je mocnina dvojky, a tedy i $n/2$ je sudé; popø. $n=2$ a je to
-zøejmé).
-\:Pro $j = 0, \ldots , n/2 - 1$ spoèítáme:
+\:\algin Èíslo~$n=2^k$, primitivní $n$-tá odmocnina z~jednièky~$\omega$
+  a vektor $(p_0,\ldots,p_{n-1})$ koeficientù polynomu~$P$.
+\:Pokud $n=1$, polo¾íme $y_0\leftarrow p_0$ a skonèíme.
+\:Jinak se rekurzivnì zavoláme na sudou a lichou èást koeficientù:
+\::$(s_0,\ldots,s_{n/2-1}) \leftarrow {\rm FFT}(p_0,p_2,p_4,\ldots,p_{n-2})$.
+\::$(\ell_0,\ldots,\ell_{n/2-1}) \leftarrow {\rm FFT}(p_1,p_3,p_5,\ldots,p_{n-1})$.
+\:Z~grafù obou èástí poskládáme graf celého polynomu:
+\::Pro $j=0,\ldots,n/2-1$:
+\:::$y_j \leftarrow s_j + \omega^j\cdot \ell_j$.
+\:::$y_{j+n/2} \leftarrow s_j - \omega^j\cdot \ell_j$.
+\:\algout Graf polynomu~$P$, tedy vektor $(y_0,\ldots,y_{n-1})$, kde $y_j = P(\omega^j)$.
+\endalgo
 
-\:\qquad $P(\omega^{j}) = P_s(\omega^{2j}) + \omega^{j}\cdot P_l(\omega^{2j})$.
+\h{Diskrétní Fourierova transformace}
 
-\:\qquad $P(\omega^{j+n/2})=P_s(\omega^{2j})-\omega^{j}\cdot P_l(\omega^{2j})$.
+Vyhodnotit polynom v~mocninách èísla~$\omega$ umíme, ale je¹tì nejsme v~cíli.
+Potøebujeme umìt provést rychle i opaèný pøevod -- z~hodnot na~koeficienty. K~tomu nám pomù¾e
+podívat se na vyhodnocování polynomu trochu abstraktnìji jako na nìjaké zobrazení,
+které jednomu vektoru komplexních èísel pøiøadí jiný vektor. Toto zobrazení
+matematici v~mnoha rùzných kontextech potkávají u¾ nìkolik staletí a nazývají
+ho Fourierovou transformací.
 
-\endalgo
+\s{Definice:}
+{\I Diskrétní Fourierova transformace (DFT)} je zobrazení ${\cal F}: { {\bb C} ^n} \rightarrow { {\bb C} ^n}$,
+které vektoru ${\bf x}$ pøiøadí vektor ${\bf y}$, jeho¾ slo¾ky jsou dány
+pøedpisem $$y_j = \sum_{k=0}^{n-1} x_k \cdot \omega^{jk},$$
+kde $\omega$ je nìjaká pevnì zvolená primitivní $n$-tá odmocnina z~jedné.
 
+\s{Pozorování:}
+Pokud oznaèíme ${\bf p}$ vektor koeficientù nìjakého polynomu~$P$, pak jeho
+Fourierova transformace ${\cal F}({\bf p})$ není nic jiného ne¾ graf tohoto polynomu
+v~bodech $\omega^0,\ldots,\omega^{n-1}$. Snadno ovìøíme dosazením do definice.
 
-\s{Èasová slo¾itost:}
-\>$T(n)=2T(n/2) + \Theta(n) \Rightarrow$ slo¾itost $\Theta(n \log n)$, jako
-MergeSort.
+Ná¹ algoritmus tedy poèítá Diskrétní Fourierovu transformaci v~èase $\Theta(n\log n)$.
+Odtud pramení jeho název FFT -- Fast Fourier Transform.
 
+\def\OO{{\bf\Omega}}
 
-Máme tedy algoritmus, který pøevede koeficienty polynomu na~hodnoty tohoto
-polynomu v~rùzných bodech. Potøebujeme ale také algoritmus, který doká¾e
-reprezentaci polynomu pomocí hodnot pøevést zpìt na~koeficienty polynomu.
-K~tomu nám pomù¾e podívat se na~ná¹ algoritmus trochu obecnìji.
+Také si v¹imnìme, ¾e DFT je lineární zobrazení. Mù¾eme ho proto zapsat
+jako násobení nìjakou maticí~$\OO$, kde $\OO_{jk} = \omega^{jk}$.
+Pro pøevod grafu na~koeficienty tedy potøebujeme najít inverzní zobrazení
+urèené inverzní maticí $\OO^{-1}$.
 
+Jeliko¾ $\omega^{-1} = \overline{\omega}$, pojïme zkusit, zda $\overline{\OO}$
+není hledanou inverzní maticí.
 
-\s{Definice:}
-\>{\I Diskrétní Fourierova transformace} $(DFT)$
-je zobrazení $f: { {\bb C} ^n} \rightarrow { {\bb C} ^n}$, kde $$y=f(x) \equiv
-\forall j \ y_{j} = \sum \limits ^{n-1}_{k=0} x_{k} \cdot \omega ^{jk}$$
-(DFT si lze mimo jiné pøedstavit jako funkci vyhodnocující polynom
-s~koeficienty $x_k$ v~bodech $\omega^j$). Takovéto zobrazení je lineární
-a~tedy popsatelné maticí $\Omega$ s~prvky $\Omega_{jk} = \omega^{jk}$.
-Chceme-li umìt pøevádìt z~hodnot polynomu na koeficienty, zajímá nás inverze
-této matice.
-
-
-\ss{Jak najít inverzní matici?}
-Znaème $\overline{\Omega}$ matici, její¾ prvky
-jsou komplexnì sdru¾ené odpovídajícím prvkùm $\Omega$, a vyu¾ijme následující
-lemma:
-
-\ss{Lemma:}$\quad \Omega\cdot \overline{\Omega} = n\cdot E$.
-
-\proof $$ (\Omega\cdot \overline{\Omega})_{jk} = \sum_{l=0}^{n-1} \omega^{jl}
-\cdot \overline{\omega^{lk}} = \sum \omega^{jl} \cdot \overline{\omega}^{lk} =
-\sum \omega^{jl} \cdot \omega^{-lk} = \sum \omega^{l(j-k)}\hbox{.}$$
-\itemize\ibull
-\:Pokud $j=k$, pak $ \sum \limits ^{n-1}_{l=0} (\omega ^{0}) ^{l} = n$.
+\s{Lemma:} $\OO \cdot \overline{\OO} = n\cdot{\bf E}$, kde ${\bf E}$ je jednotková matice.
 
-\:Pokud $j\neq k$, pou¾ijeme vzoreèek pro souèet geometrické øady
-s kvocientem $\omega ^{(j-k) }$ a~dostaneme ${{\omega^{(j-k)n} -1} \over
-{\omega^{(j-k)} -1}} ={1-1 \over \neq 0} = 0$ (
-$\omega^{j-k} - 1$ je jistì $\neq 0$, nebo» $\omega$ je $n$-tá primitivní
-odmoncina a $j-k<n$).
-\endlist
+\proof
+Dosazením do definice a elementárními úpravami:
+$$\eqalign{
+(\OO\cdot \overline{\OO})_{jk}
+&= \sum_{\ell=0}^{n-1} \OO_{j\ell}\cdot\overline{\OO}_{\ell k}
+= \sum_{\ell=0}^{n-1} \omega^{j\ell} \cdot \overline{\omega^{\ell k}}
+= \sum_{\ell=0}^{n-1} \omega^{j\ell} \cdot \overline{\omega}^{\ell k}\cr
+&= \sum_{\ell=0}^{n-1} \omega^{j\ell} \cdot (\omega^{-1})^{\ell k}
+= \sum_{\ell=0}^{n-1} \omega^{j\ell} \cdot \omega^{-\ell k}
+= \sum_{\ell=0}^{n-1} \omega^{(j-k)\ell}.\cr
+}$$
+To je ov¹em geometrická øada. Pokud je $j=k$, jsou v¹echny èleny øady
+jednièky, tak¾e se seètou na~$n$. Pro $j\ne k$ pou¾ijeme známý vztah
+pro souèet geometrické øady s~kvocientem $q=\omega^{j-k}$:
+$$
+\sum_{\ell=0}^{n-1} q^\ell
+= {q^n - 1 \over q-1}
+= {\omega^{(j-k)n} - 1 \over \omega^{j-k} - 1}
+= 0.
+$$
+Poslední rovnost platí díky tomu, ¾e
+$\omega^{(j-k)n} = (\omega^n)^{j-k} = 1^{j-k} = 1$, tak¾e
+èitatel zlomku je nulový; naopak jmenovatel urèitì nulový není, jeliko¾
+$\omega$ je primitivní a $0<\vert j-k\vert <n$.
 \qed
 
+\s{Dùsledek:} $\OO^{-1} = {1\over n}\cdot\overline{\OO}$.
 
-\>Na¹li jsme inverzi:
-$\Omega({1 \over n} \overline{\Omega}) = {1 \over n}\Omega \cdot
-\overline{\Omega} = E$, \quad $\Omega^{-1}_{jk} = {1 \over n}\overline{\omega^
-{jk}} = {1 \over n}\omega^{-jk} = {1 \over n} {(\omega^{-1})}^{jk}$, \quad
-(pøipomínáme, $\omega^{-1}$ je $\overline{\omega}$).
+Matice~$\OO$ tedy je regulární a její inverze se kromì vydìlení~$n$
+li¹í pouze komplexním sdru¾ením. Navíc $\overline{\omega} = \omega^{-1}$
+je také primitivní $n$-tá odmocnina z~jednièky, tak¾e a¾ na faktor $1/n$
+se jedná opìt o~Fourierovu transformaci, kterou mù¾eme spoèítat stejným
+algoritmem FFT. Shròme, co jsme zjistili, do následující vìty:
 
-Vyhodnocení polynomu lze provést vynásobením $\Omega$, pøevod do pùvodní
-reprezentace vynásobením $\Omega^{-1}$. My jsme si ale v¹imli chytrého
-spárování, a vyhodnocujeme polynom rychleji ne¾ kvadraticky (proto FFT,
-jako¾e {\it fast}, ne jako {\it fuj}). Uvìdomíme-li si, ¾e $\overline \omega =
-\omega^{-1}$ je také $n$-tá primitivní odmocnina z 1 (má akorát
-úhel s opaèným znaménkem), tak mù¾eme stejným trikem vyhodnotit i~zpìtný
-pøevod -- nejprve vyhodnotíme $A$ a $B$ v $\omega^j$, poté pronásobíme
-hodnoty a~dostaneme tak hodnoty polynomu $C=A\cdot B$, a pustíme na nì
-stejný algoritmus s~$\omega^{-1}$ (hodnoty $C$
-vlastnì budou v~algoritmu \uv{koeficienty polynomu}). Nakonec jen získané
-hodnoty vydìlíme $n$ a~máme chtìné koeficienty.
+\s{Vìta:} Je-li $n$ mocnina dvojky, lze v~èase $\Theta(n\log n)$ spoèítat
+diskrétní Fourierovu transformaci na~${\bb C}^n$ i její inverzi.
 
-\s{Výsledek:} Pro $n= 2^k$ lze DFT na~${\bb C}^n$ spoèítat v~èase $\Theta(n
-\log n)$ a~DFT$^{-1}$ takté¾.
+Tím jsme také doplnili poslední èást algoritmu na násobení polynomù:
 
-\s{Dùsledek:}
-Polynomy stupnì $n$ lze násobit v~èase $\Theta(n \log n)$:
-$\Theta(n \log n)$ pro vyhodnocení, $\Theta(n)$ pro vynásobení a~$\Theta(n
-\log n)$ pro pøevedení zpìt.
+\s{Vìta:} Polynomy velikosti~$n$ nad tìlesem ${\bb C}$ lze násobit v~èase
+$\Theta(n\log n)$.
 
-\s{Pou¾ití FFT:}
+V~obou vìtách pøitom èiníme pøedpoklad, ¾e základní operace s~komplexními
+èísly umíme provést v~konstantním èase. Pokud tomu tak není, staèí slo¾itost
+vynásobit slo¾itostí jedné operace.
 
-\itemize\ibull
+\s{Dal¹í pou¾ití FFT:}
+Dodejme je¹tì, ¾e Fourierova transformace se hodí i k~jiným vìcem ne¾
+k~násobení polynomù. Své uplatnìní nachází i v~dal¹ích algebraických algoritmech,
+tøeba v~násobení velkých èísel (lze se dostat a¾ ke~slo¾itosti $\Theta(n)$).
+Mimo to skýtá i lecjaké fyzikální aplikace, jeliko¾ odpovídá spektrálnímu
+rozkladu signálu na siny a cosiny o~rùzných frekvencích. Na tom jsou zalo¾eny
+algoritmy pro filtrování zvuku a tøeba také kompresi zvuku a obrazu (MP3, JPEG).
 
-\:Zpracování signálu -- rozklad na~siny a~cosiny o~rùzných frekvencích
-$\Rightarrow$ spektrální rozklad.
-\:Komprese dat -- napøíklad formát JPEG.
-\:Násobení dlouhých èísel v~èase $\Theta(n \log n)$.
-\endlist
+\h{Paralelní implementace FFT}
 
-\s{Paralelní implementace FFT}
+Zkusme si je¹tì prùbìh algoritmu FFT znázornit graficky:
 
 \figure{img.eps}{Pøíklad prùbìhu algoritmu na~vstupu velikosti 8}{3in}
 
-Zkusme si prùbìh algoritmu FFT znázornit graficky (podobnì, jako jsme kreslili
-hradlové sítì). Na~levé stranì obrázku se nachází vstupní vektor $x_0,\ldots,x_{n-1}$
+Na~levé stranì obrázku se nachází vstupní vektor $x_0,\ldots,x_{n-1}$
 (v~nìjakém poøadí), na~pravé stranì pak výstupní vektor $y_0,\ldots,y_{n-1}$.
 Sledujme chod algoritmu pozpátku: Výstup spoèítáme z~výsledkù \uv{polovièních}
 transformací vektorù $x_0,x_2,\ldots,x_{n-2}$ a $x_1,x_3,\ldots,x_{n-1}$.
@@ -394,16 +401,17 @@ krou
 transformace velikosti $n/4$ atd. Celkovì výpoèet probíhá v~$\log_2 n$ vrstvách
 po~$\Theta(n)$ operacích.
 
-Jeliko¾ operace na~ka¾dé vrstvì probíhají na sobì nezávisle, mù¾eme je poèítat
-paralelnì. Ná¹ diagram tedy popisuje hradlovou sí» pro paralelní výpoèet FFT
-v~èase $\Theta(\log n\cdot T)$ a prostoru $\O(n\cdot S)$, kde $T$ a~$S$ znaèí
-èasovou a prostorovou slo¾itost výpoètu lineární kombinace dvou komplexních èísel.
+Na obrázek se mù¾eme dívat také jako na schéma hradlové sítì pro výpoèet DFT.
+Krou¾ky jsou pøitom \uv{hradla} pracující s~komplexními èísly. V¹echny operace
+v~jedné vrstvì jsou na sobì nezávislé, tak¾e je sí» poèítá paralelnì. Sí» proto
+pracuje v~èase $\Theta(\log n)$ a prostoru $\Theta(n)$, opìt pøípadnì vynásobeno
+slo¾itostí jedné operace s~komplexními èísly
 
 \s{Cvièení:} Doka¾te, ¾e permutace vektoru $x_0,\ldots,x_{n-1}$ odpovídá bitovému
 zrcadlení, tedy ¾e na pozici~$b$ shora se vyskytuje prvek $x_d$, kde~$d$ je
 èíslo~$b$ zapsané ve~dvojkové soustavì pozpátku.
 
-\s{Nerekurzivní FFT}
+\h{Nerekurzivní FFT}
 
 Obvod z~pøedchozího obrázku také mù¾eme vyhodnocovat po~hladinách zleva doprava,
 èím¾ získáme elegantní nerekurzivní algoritmus pro výpoèet FFT v~èase $\Theta(n\log n)$
@@ -423,13 +431,13 @@ a prostoru $\Theta(n)$:
 \algout $y_0,\ldots,y_{n-1}$
 \endalgo
 
-\s{FFT v~koneèných tìlesech}
+\h{FFT v~koneèných tìlesech}
 
 Nakonec dodejme, ¾e Fourierovu transformaci lze zavést nejen nad tìlesem
 komplexních èísel, ale i v~nìkterých koneèných tìlesech, pokud zaruèíme
 existenci primitivní $n$-té odmocniny z~jednièky. Napøíklad v~tìlese ${\bb
 Z}_p$ pro prvoèíslo $p=2^k+1$ platí $2^k=-1$, tak¾e $2^{2k}=1$
-a $2^0,2^1,\ldots,2^{2k-1}$ jsou navzájem rùzná, tak¾e èíslo~2 je~primitivní
+a $2^0,2^1,\ldots,2^{2k-1}$ jsou navzájem rùzná. Èíslo~2 je tedy primitivní
 $2k$-tá odmocnina z~jedné. To se nám ov¹em nehodí pro algoritmus FFT, jeliko¾
 $2k$ bude málokdy mocnina dvojky.
 
@@ -440,12 +448,18 @@ zapsat jako mocniny n
 je jedním takovým generátorem èíslo~$3$. Jeliko¾ mezi èísly $g^1,g^2,\ldots,g^{p-1}$
 se musí ka¾dý nenulový prvek tìlesa vyskytnout právì jednou, je~$g$ primitivní
 $2^k$-tou odmocninou z~jednièky, tak¾e mù¾eme poèítat FFT pro libovolný vektor,
-jeho¾ velikost je mocnina dvojky men¹í nebo rovná $2^k$.\foot{Bli¾¹í prùzkum
+jeho¾ velikost je mocnina dvojky men¹í nebo rovná $2^k$.
+
+Bli¾¹í prùzkum
 na¹ich úvah o~FFT dokonce odhalí, ¾e není ani potøeba tìleso. Postaèí libovolný
 komutativní okruh, ve~kterém existuje pøíslu¹ná primitivní odmocnina
 z~jednièky, její multiplikativní inverze (ta ov¹em existuje v¾dy, proto¾e
 $\omega^{-1} = \omega^{n-1}$) a multiplikativní inverze èísla~$n$. To nám
 poskytuje je¹tì daleko více volnosti ne¾ tìlesa, ale není snadné takové okruhy
-hledat.}
+hledat.
+
+Výhodou tìchto podob Fourierovy transformace je, ¾e na rozdíl od~té klasické komplexní
+nejsou zatí¾eny zaokrouhlovacími chybami (komplexní odmocniny z~jednièky mají obì slo¾ky
+iracionální). To se hodí napøíklad ve~zmiòovaných algoritmech na násobení velkých èísel.
 
 \bye