אלגוריתם ה-FFT של קולי-טוקי

אלגוריתם קולי-טוקי, על שמם של ג'יימס קולי וג'ון טוקי, הוא אלגוריתם התמרת פורייה מהירה (FFT) הנפוץ ביותר. הוא מבטא מחדש, באופן רקורסיבי, את התמרת פורייה הבדידה (DFT) בגודל פריק שרירותי <math>N = N_1N_2</math> במונחים של N<sub>1</sub> התמרות DFT קטנות יותר, כל אחת בגודל N<sub>2</sub>, וזאת על מנת להפחית את זמן החישוב ל-O(N log N) עבור N פריק מאוד.

מכיוון שאלגוריתם קולי-טוקי מפרק את ה-DFT להתמרות DFT קטנות יותר, ניתן לשלבו עם כל אלגוריתם DFT אחר. לדוגמה, ניתן להשתמש באלגוריתמים של Rader או Bluestein לטיפול בגורמים ראשוניים גדולים שלא ניתן לפרק על ידי קולי-טוקי, או שאפשר להשתמש באלגוריתם FFT של גורם ראשוני ליעילות רבה יותר בהפרדת גורמי מספרים זרים .

האלגוריתם, כולל יישומו הרקורסיבי, הומצא בידי קרל פרידריך גאוס. 160 שנה מאוחר יותר, קולי וטוקי פיתחו אותו מחדש והפכו אותו לפופולרי .

== היסטוריה ==
אלגוריתם זה ויישומו הרקורסיבי, הומצאו כאמור בסביבות 1805 בידי קרל פרידריך גאוס, שהשתמש בו לחישובי אינטרפולציה של מסלולי האסטרואידים פאלאס ויונו, אך עבודתו לא זכתה להכרה רחבה (היא התפרסמה רק לאחר מותו, ובנאו-לטינית ). <ref></ref><ref name="Heideman84">Heideman, M. T., D. H. Johnson, and C. S. Burrus, "[http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=1162257 Gauss and the history of the fast Fourier transform]," IEEE ASSP Magazine, 1, (4), 14–21 (1984)</ref> גאוס, בכל אופן, לא ניתח את זמן החישוב האסימפטוטי. כמה צורות מוגבלות הומצאו מחדש מספר פעמים במהלך המאה ה-19 ותחילת המאה ה-20.<ref name="Heideman84" /> FFT הפך לפופולרי לאחר שג'יימס קולי מ־IBM וג'ון טוקי מפרינסטון פרסמו ב-1965 מאמר הממציא מחדש את האלגוריתם ומתאר כיצד לבצע אותו בנוחות על מחשב.<ref name="CooleyTukey65"></ref>

על פי המדווח, טוקי הגה את הרעיון במהלך פגישה של הוועדה המייעצת למדע של הנשיא קנדי, שדנה בדרכים לאיתור ניסויים בנשק גרעיני בברית המועצות על ידי שימוש בסייסמומטרים הממוקמים מחוץ למדינה. חיישנים אלה ייצרו סדרות זמן סייסמולוגיות. הבעיה הייתה שניתוח נתונים אלה ידרוש אלגוריתמים מהירים לחישוב DFT בשל מספר החיישנים ואורך סדרות הזמן. משימה זו הייתה קריטית לצורך אשרור האיסור המוצע על ניסויים גרעיניים, כך שניתן יהיה לזהות כל הפרה ללא צורך בביקור במתקנים סובייטיים. <ref></ref> <ref>Rockmore, Daniel N., Comput. Sci. Eng. 2 (1), 60 (2000). [http://www.cs.dartmouth.edu/~rockmore/cse-fft.pdf The FFT — an algorithm the whole family can use] Special issue on "top ten algorithms of the century "</ref> משתתף אחר באותה פגישה היה ריצ'רד גארווין מ-IBM, שהכיר בפוטנציאל של השיטה ודאג ליצור קשר בין טוקי וקולי. גארווין וידא שקולי לא ידע את המטרה המקורית. במקום זאת, נאמר לו שזה נחוץ כדי לקבוע מחזוריות של כיווני הספין בגביש תלת-ממדי של הליום-3 . קולי וטוקי פרסמו לאחר מכן את המאמר המשותף שלהם, שאומץ במהירות ובאופן נרחב, וזאת בשל הפיתוח הבו-זמני של ממירי אנלוגי לדיגיטלי המסוגלים לדגום בקצבים של עד 300KHz.

העובדה שגאוס תיאר את אותו אלגוריתם (הגם שמבלי לנתח את עלותו האסימפטוטית) נודעה רק מספר שנים לאחר פרסום המאמר של קולי-טוקי בשנת 1965. המאמר שלהם ציין כהשראה רק את עבודתו של IJ Good שנקראת כיום אלגוריתם FFT של גורם ראשוני (PFA); למרות שהאלגוריתם של Good נחשב בתחילה כשקול לאלגוריתם קולי-טוקי, התברר במהרה ש-PFA הוא אלגוריתם שונה לחלוטין (עובד רק עבור גדלים שיש להם גורמים שהם מספרים זרים ומסתמך על משפט השאריות הסיני, בניגוד לתמיכה בכל גודל פריק ב-קולי-טוקי). <ref>James W. Cooley, Peter A. W. Lewis, and Peter W. Welch, "Historical notes on the fast Fourier transform," Proc. IEEE, vol. 55 (no. 10), p. 1675–1677 (1967).</ref>

== radix-2 FFT ==
FFT מסוג Radix-2 הוא הגרסה הפשוטה והנפוצה ביותר של אלגוריתם קולי-טוקי. יישומי קולי-טוקי בעלי אופטימיזציה גבוהה משתמשים לרוב בגרסאות אחרות של האלגוריתם, כפי שיתואר בהמשך. בשיטה זו גודל הקלט N הוא חזקה של שתיים. בכל שלב רקורסיבי, Radix-2 מחלק DFT בגודל N לשני DFT שזורים (interleaved) בגודל N/2.

התמרת פורייה הבדידה (DFT) מוגדרת בידי הנוסחה:

: <math> X_k = \sum_{n=0}^{N-1} x_n e^{-\frac{2\pi i}{N} nk},</math>

כאשר <math>k</math> הוא מספר שלם הנע בין 0 ל <math>N-1</math> .

אנו מניחים כאן ש-N הוא חזקה של שתיים. Radix-2 מחשב תחילה את ה-DFT של ערכי הקלט בעלי האינדקס הזוגי <math>(x_{2m}=x_0, x_2, \ldots, x_{N-2})</math> ושל ערכי הקלט בעלי האינדקס האי-זוגי <math>(x_{2m+1}=x_1, x_3, \ldots, x_{N-1})</math>, ולאחר מכן משלב את התוצאות הללו כדי לחשב את ה-DFT של הרצף כולו. את התהליך הזה ניתן לבצע באופן רקורסיבי ובכך להוריד את זמן הריצה הכולל ל-O(NlogN). היישום יכול לרוב, הגם שלא תמיד, לבחור את מספר נקודות הדגימה N באופן חופשי (למשל בעזרת שיטות כגון שינוי קצב הדגימה, גודל החלון, או zero-padding). לכן, לעיתים קרובות, הגודל של חזקה של שתיים אינו מגבלה חשובה.

אלגוריתם radix-2 מארגן מחדש את ה-DFT של הפונקציה <math>x_n</math> בשני חלקים: סכום של האינדקסים הזוגיים <math>n={2m}</math> וסכום של האי-זוגיים <math>n={2m+1}</math> :

: <math>
 \begin{matrix} X_k & =
& \sum \limits_{m=0}^{N/2-1} x_{2m}e^{-\frac{2\pi i}{N} (2m)k} + \sum \limits_{m=0}^{N/2-1} x_{2m+1} e^{-\frac{2\pi i}{N} (2m+1)k}
 \end{matrix}
</math>

בסכום השני אפשר למצוא מכפיל משותף, <math>e^{-\frac{2\pi i}{N}k}</math>, כמוצג במשוואה למטה. שני הסכומים במשוואה זו הם ה-DFT של המרכיבים הזוגיים <math>x_{2m}</math> וה-DFT של המרכיבים האי-זוגיים <math>x_{2m+1}</math> של הפונקציה <math>x_n</math> .

נסמן את ה-DFT של המרכיבים הזוגיים <math>x_{2m}</math> כ-<math>E_k</math>.

נסמן את ה-DFT של המרכיבים האי-זוגיים <math>x_{2m + 1}</math> כ-<math>O_k</math>.

ונקבל:

: <math>
\begin{matrix} X_k= \underbrace{\sum \limits_{m=0}^{N/2-1} x_{2m} e^{-\frac{2\pi i}{N/2} mk}}_{\mathrm{DFT\;of\;even-indexed\;part\;of\;} x_n} {} + e^{-\frac{2\pi i}{N}k}
 \underbrace{\sum \limits_{m=0}^{N/2-1} x_{2m+1} e^{-\frac{2\pi i}{N/2} mk}}_{\mathrm{DFT\;of\;odd-indexed\;part\;of\;} x_n} = E_k + e^{-\frac{2\pi i}{N}k} O_k\qquad\text{ for }k=0,\dots,\frac N2-1.
\end{matrix}
</math>

השוויון אמנם מתקיים עבור <math>k=0,\dots,N-1</math>, אך הנקודה המכרעת היא שאת הערכים <math>E_k</math> ו <math>O_k</math> יש לחשב רק עבור <math>k=0,\dots,\frac N2-1</math>. הודות למחזוריות של המעריך המרוכב, <math>X_{k+\frac{N}{2}}</math> מחושב גם הוא מ <math>E_k</math> ו <math>O_k</math>, כלהלן :

: <math>
\begin{align} X_{k + \frac{N}{2}} & = \sum \limits_{m=0}^{N/2-1} x_{2m} e^{-\frac{2\pi i}{N/2} m(k + \frac{N}{2})} + e^{-\frac{2\pi i}{N}(k + \frac{N}{2})}
 \sum \limits_{m=0}^{N/2-1} x_{2m+1} e^{-\frac{2\pi i}{N/2} m(k + \frac{N}{2} )} \\
 & = \sum \limits_{m=0}^{N/2-1} x_{2m} e^{-\frac{2\pi i}{N/2} mk} e^{-2\pi m i} + e^{-\frac{2\pi i}{N}k}e^{-\pi i}
 \sum \limits_{m=0}^{N/2-1} x_{2m+1} e^{-\frac{2\pi i}{N/2} mk} e^{-2\pi m i} \\
 & = \sum \limits_{m=0}^{N/2-1} x_{2m} e^{-\frac{2\pi i}{N/2} mk} - e^{-\frac{2\pi i}{N}k}
 \sum \limits_{m=0}^{N/2-1} x_{2m+1} e^{-\frac{2\pi i}{N/2} mk} \\
& = E_k - e^{-\frac{2\pi i}{N}k} O_k
\end{align}
</math>

אנחנו יכולים לכתוב מחדש את <math> X_k </math> ו <math> X_{k+\frac{N}{2}} </math> כלהלן:

: <math>
\begin{matrix}
X_k & =
& E_k + e^{-\frac{2\pi i}{N}{k}} O_k \\
X_{k+\frac{N}{2}} & =
& E_k - e^{-\frac{2\pi i}{N}{k}} O_k
\end{matrix}
</math>

תוצאה זו, ביטויו הרקורסיבי של DFT באורך N במונחי שני DFT באורך N/2, היא הליבה של התמרת פורייה המהירה radix-2. מקור המהירות של האלגוריתם הוא השימוש החוזר בתוצאות חישובי ביניים כדי לחשב כמה תוצאות DFT. התוצאות הסופיות מתקבלות על ידי שילוב +/− של <math>E_k</math> ו <math>O_k \exp(-2\pi i k/N)</math>, שהוא פשוט DFT בגודל 2 (הנקרא לעיתים פרפר בהקשר הזה); כאשר מכלילים לבסיסים גדולים יותר כמתואר להלן, ה-DFT בגודל 2 מוחלף בידי DFT גדול יותר (שבעצמו ניתן לחישוב בעזרת FFT).
דיאגרמת זרימת נתונים עבור N =8. אלגוריתם ה-FFT מסוג radix-2 מפרק DFT באורך N לשני DFT באורך N/2 ולאחר מכן משלב מספר DFT באורך 2 הנקראים פעולות "פרפר" (מקור השם בצורה של דיאגרמות זרימת הנתונים).
תהליך זה מדגים את הטכניקה הכללית של אלגוריתמי הפרד ומשול ; עם זאת, ביישומים רבים, נמנעת הרקורסיה המפורשת, ובמקום זאת עוברים על העץ החישובי באלגוריתם חיפוש לרוחב .

הביטוי-מחדש של DFT בגודל N כשני DFT בגודל N/2, כמפורט לעיל, נקרא לעיתים הלמה של Danielson–Lanczos, מאחר ששני המחברים כתבו על זהות זו ב-1942 <ref>Danielson, G. C., and C. Lanczos, "Some improvements in practical Fourier analysis and their application to X-ray scattering from liquids," J. Franklin Inst. 233, 365–380 and 435–452 (1942).</ref> (בהשפעת עבודתו של Runge משנת 1903 ). הם יישמו את הלמה שלהם כרקורסיה "לאחור", כך שגודל ה-DFT הוכפל שוב ושוב עד שספקטרום ההתמרה התכנס (הגם שנראה שהם לא הבינו שהם השיגו את הסיבוכיות האסימפטוטית O(NlogN)). עבודתם קדמה לזמינות נרחבת של מחשבים מכניים או אלקטרוניים והצריכה חישוב ידני (אפשר שעם עזרים מכניים כגון מכונת חיבור); הם דיווחו על זמן חישוב של 140 דקות עבור DFT בגודל 64 הפועל על קלט ממשי בדיוק של 3–5 ספרות. המאמר של קולי-טוקי משנת 1965 דיווח על זמן ריצה של 0.02 דקות עבור DFT מרוכב בגודל 2048 בריצה על IBM 7094 (כנראה תוך שימוש בנקודה צפה של 36 סיביות, כ-8 ספרות). בשינוי קנה המידה של הזמן לפי מספר הפעולות, דיווח זה מתאים להכפלת מהירות בערך פי 800,000. (כדי לתת פרספקטיבה לזמן החישוב הידני, 140 דקות עבור גודל 64 תואמות לממוצע של לא יותר מ-16 שניות לכל פעולת נקודה צפה, כש-20% מהן הן פעולות כפל. )

יישומי FFT בעלי ביצועים גבוהים עורכים שינויים רבים במימוש האלגוריתם בהשוואה למימוש הבסיסי הפשוט. לדוגמה, אפשר להשתמש במקרה בסיס גדול מ- N =1 להפחתת התקורה של הרקורסיה, גורם הסיבוב (twiddle factor) <math>\exp[-2\pi i k/ N]</math> ניתן לחישוב מראש, ולעיתים קרובות נעשה שימוש בבסיסים גדולים יותר משיקולי זיכרון מטמון ; אופטימיזציות אלו ואחרות יכולות ביחד לשפר את הביצועים בסדר גודל או יותר.<ref name="Johnson08">S. G. Johnson and M. Frigo, "[http://cnx.org/content/m16336/ Implementing FFTs in practice]," in Fast Fourier Transforms (C. S. Burrus, ed.), ch. 11, Rice University, Houston TX: Connexions, September 2008.</ref> (במימושים של האלגוריתם בספרי לימוד רבים, הרקורסיה של האלגוריתם חיפוש לעומק נשמטת לטובת הגישה הלא-רקורסיבית של אלגוריתם חיפוש לרוחב, אם כי נטען כי לרקורסיה של חיפוש לעומק ישנה מקומיות זיכרון טובה יותר.<ref name="Johnson08" /><ref name="Singleton67"></ref> )

== הרעיון ==
ניתן לראות את הצעד הבסיסי של קולי-טוקי FFT כפירוש מחדש של DFT חד־ממדי כדומה ל-DFT דו־ממדי. מערך הקלט החד־ממדי באורך N=N<sub>1</sub>N<sub>2</sub> מפורש מחדש כמטריצת N<sub>1</sub>&#xD7;N<sub>2</sub> המאוחסנת בסדר עמודה ראשי. אנו מחשבים DFT קטנים יותר לאורך כיוון N<sub>2</sub> (הכיוון הלא רציף), ואז מכפילים בגורמי סיבוב (Twiddle factors), ולבסוף מחשבים DFT לאורך כיוון N<sub>1</sub>. ניתן לבצע את שלב השחלוף (transposition) באמצע, כמוצג כאן, או בהתחלה או בסוף. התהליך הזה הוא רקורסיבי.
איור של סדר עיקרי בשורה ובעמודה
כללית, אלגוריתמים של קולי-טוקי מבטאים-מחדש באופן רקורסיבי DFT בגודל מורכב N=N<sub>1</sub>N<sub>2</sub> כ:<ref name="DuhamelVe90">Duhamel, P., and M. Vetterli, "Fast Fourier transforms: a tutorial review and a state of the art," Signal Processing 19, 259–299 (1990)</ref>

# חשב N<sub>1</sub> התמרות DFT בגודל N<sub>2</sub>.
# הכפל בגורמי סיבוב.
# חשב N<sub>2</sub> התמרות DFT בגודל N<sub>1</sub>.

לרוב, N1 או N2 הוא גורם קטן (לא בהכרח ראשוני), הנקרא בסיס והוא יכול להיות שונה בין שלבי הרקורסיה. גורמי הסיבוב הם שורשי יחידה מרוכבים, שהם נקודות על מעגל היחידה. דהיינו, הכפלתם במספר מרוכב אחר, משנה רק את הזווית שלו. גורמי הסיבוב במקרה של DFT בגודל 2 הם 1-/+. ה-DFT הקטן של הבסיס נקרא לעיתים פרפר, בשל צורת תרשים זרימת הנתונים במקרה של radix-2.

== וריאציות ==
ישנן וריאציות רבות של אלגוריתם קולי-טוקי. יישומי האלגוריתם עם בסיסים מעורבים מטפלים בגדלים מורכבים שאפשר לפרק לכמה גורמים (לרוב קטנים) בנוסף ל-2, בדרך כלל (אך לא תמיד) תוך שימוש באלגוריתם הישיר, בסיבוכיות O(N <sup>2</sup>), עבור מקרי הבסיס העיקריים של הרקורסיה <nowiki>(</nowiki> אפשר גם להשתמש באלגוריתם O(NlogN) עבור מקרי הבסיס העיקריים, כגון האלגוריתמים של Rader או Bluestein <nowiki>)</nowiki> . בסיס מפוצל ממזג בסיסים 2 ו-4, תוך ניצול העובדה שההתמרה הראשונה של בסיס 2 אינה דורשת גורם סיבוב, על מנת להשיג את מה שהיה זמן רב מספר הפעולות האריתמטיות הנמוך ביותר הידוע עבור גדלים שהם חזקה של 2, למרות שווריאציות שפותחו לאחרונה השיגו מספר פעולות נמוך עוד יותר. <ref>Lundy, T., and J. Van Buskirk, "A new matrix approach to real FFTs and convolutions of length 2<sup>k</sup>," Computing 80, 23–45 (2007).</ref> <ref>Johnson, S. G., and M. Frigo, "[http://www.fftw.org/newsplit.pdf A modified split-radix FFT with fewer arithmetic operations]," IEEE Trans. Signal Process. 55 (1), 111–119 (2007).</ref> (במחשבים של ימינו, הביצועים נקבעים יותר על ידי שיקולי זיכרון מטמון וצינורות עיבוד נתונים מאשר על ידי ספירת פעולות קפדנית; יישומי FFT אופטימליים משתמשים לעיתים קרובות בבסיסים גדולים יותר ו/או התמרות בסיסיות מקודדות בגודל משמעותי.<ref name="FrigoJohnson05"></ref> ).

אפשר גם לראות את האלגוריתם של קולי-טוקי כביטוי מחדש של DFT חד-ממדי בגודל N כ-DFT דו־ממדי בגודל N<sub>1</sub> על N<sub>2</sub> (בתוספת סיבובים), כאשר מטריצת הפלט עוברת שחלוף. עבור אלגוריתם radix-2, התוצאה נטו של השחלופים תואמת להיפוך סיביות של האינדקס של הקלט או הפלט. אם, במקום להשתמש בבסיס קטן, נשתמש בבסיס של בערך השורש הריבועי של N, ובשחלופים מפורשים של מטריצת קלט/פלט, נקבל אלגוריתם שנקרא אלגוריתם בן ארבעה צעדים (או שישה צעדים, תלוי במספר השחלופים). האלגוריתם הוצע בתחילה כדי לשפר את מקומיוּת הזיכרון,<ref name="GenSande66">Gentleman W. M., and G. Sande, "Fast Fourier transforms—for fun and profit," Proc. AFIPS 29, 563–578 (1966).</ref><ref name="Bailey90">Bailey, David H., "FFTs in external or hierarchical memory," J. Supercomputing 4 (1), 23–35 (1990)</ref> למשל עבור אופטימיזציה של זיכרון מטמון או פעולות מחוץ לזיכרון, ומאוחר יותר הוכח כי הוא אופטימלי כ-cache-oblivious algorithm .<ref name="Frigo99">M. Frigo, C. E. Leiserson, H. Prokop, and S. Ramachandran. Cache-oblivious algorithms. In Proceedings of the 40th IEEE Symposium on Foundations of Computer Science (FOCS 99), p.285-297. 1999. [http://ieeexplore.ieee.org/iel5/6604/17631/00814600.pdf?arnumber=814600 Extended abstract at IEEE], [http://citeseer.ist.psu.edu/307799.html at Citeseer].</ref>

הפירוק הכללי של קולי-טוקי משכתב את האינדקסים k ו-n כ<math>k = N_2 k_1 + k_2</math> ו <math>n = N_1 n_2 + n_1</math>, בהתאמה, כאשר האינדקסים k<sub>a</sub> ו-n<sub>a</sub> הם בתחום שבין 0 ו-N<sub>a</sub>-1 (כאשר a הוא 1 או 2). כלומר, הפירוק מארגן מחדש את הקלט (n) ואת הפלט (k) כמערכים דו-ממדיים של N<sub>1</sub> על N<sub>2</sub> בסדר עמודה ושורה, בהתאמה; ההבדל בין האינדקסים הללו הוא שחלוף, כמוזכר לעיל. כאשר האינדקסים החדשים האלה מוחלפים בנוסחת DFT עבור nk, הביטוי הצולב <math>N_1 n_2 N_2 k_1</math> נעלם (המעריך שלו הוא 1), ושאר הביטויים נותנים

: <math>X_{N_2 k_1 + k_2} =
 \sum_{n_1=0}^{N_1-1} \sum_{n_2=0}^{N_2-1}
 x_{N_1 n_2 + n_1}
 e^{-\frac{2\pi i}{N_1 N_2} \cdot (N_1 n_2 + n_1) \cdot (N_2 k_1 + k_2) }</math>
:: <math>=
 \sum_{n_1=0}^{N_1-1}
 \left[ e^{-\frac{2\pi i}{N_1N_2} n_1 k_2 } \right]
 \left( \sum_{n_2=0}^{N_2-1} x_{N_1 n_2 + n_1}
 e^{-\frac{2\pi i}{N_2} n_2 k_2 } \right)
 e^{-\frac{2\pi i}{N_1} n_1 k_1 }
</math>
:: <math>=
 \sum_{n_1=0}^{N_1-1}

 \left( \sum_{n_2=0}^{N_2-1} x_{N_1 n_2 + n_1}
 e^{-\frac{2\pi i}{N_2} n_2 k_2 } \right)
 e^{-\frac{2\pi i}{N_1N_2} n_1(N_2k_1+k_2) }
</math> .

כאשר כל סכום פנימי הוא DFT בגודל N<sub>2</sub>, כל סכום חיצוני הוא DFT בגודל N<sub>1</sub>, והביטוי <nowiki>[...]</nowiki> בסוגריים הוא גורם הסיבוב.

אפשר להשתמש בבסיס r שרירותי (כמו גם בסיסים מעורבים), כפי שהראו הן קולי וטוקי והן גאוס (שנתן דוגמאות של שלבים של בסיס-3 ושל בסיס-6). קולי וטוקי הניחו במקור שפרפר הבסיס עבור r מחייב סיבוכיות חישובית של O(r<sup>2</sup>) ומכאן חישבו שהסיבוכיות עבור בסיס r היא O(r<sup>2</sup>&nbsp;N/r&nbsp;log<sub>r</sub>N) = O(N&nbsp;log<sub>2</sub>(N)&nbsp;r/log<sub>2</sub>r); מחישוב ערכי r/log<sub>2</sub>r עבור ערכי r בין 2 ל-12, נמצא שהבסיס האופטימלי הוא 3 (המספר השלם הקרוב ביותר ל-e, אשר ממזער את הביטוי r/log<sub>2</sub>r ).<ref name="CooleyTukey65" /> <ref>Cooley, J. W., P. Lewis and P. Welch, "The Fast Fourier Transform and its Applications", IEEE Trans on Education 12, 1, 28–34 (1969)</ref> אולם ניתוח זה היה שגוי: פרפר הבסיס הוא גם DFT וניתן לחישוב באמצעות אלגוריתם FFT בסיבוכיות O(rlogr), ומכאן שבסיס מבטל למעשה את הסיבוכיות O(r&nbsp;log(r)&nbsp;N/r&nbsp;log<sub>r</sub>N), וה- r האופטימלי נקבע על סמך שיקולים מורכבים יותר. בפועל, r גדול למדי (32 או 64) חשוב על מנת לנצל למשל בצורה יעילה את המספר הגדול של האוגרים במעבדים מודרניים, ואפילו בסיס לא מוגבל r = √ N משיג גם הוא סיבוכיות של O(N&nbsp;log&nbsp;N) ויש לו יתרונות תאורטיים ומעשיים עבור N גדול.

== הערות שוליים ==

קטגוריה:אלגוריתמים
קטגוריה:התמרת פורייה