الگوریتم تبدیل سریع فوریه ریدر
الگوریتم تبدیل سریع فوریه ریدر
الگوریتم ریدر یک الگوریتم تبدیل سریع فوریه(FFT) است که تبدیل فوریه گسسته(DFT) اندازه‌های اول را با ارائه دوباره DFT به عنوان کانولوشن حلقوی، محاسبه می‌کند.(الگوریتم دیگر برای FFT از اندازه‌های اول، الگوریتم تبدیل سریع فوریه بلوستین است که آن نیز بازنویسی DFT به عنوان یک کانولوشن می‌باشد.) از آنجا که الگوریتم ریدر تنها به دوره تناوب هسته DFT بستگی دارد، به‌طور مستقیم با هر تبدیل دیگری (با ترتیب اول) با یک خاصیت مشابه قابل انطباق است، مانند تبدیل نظریه عددی یا تبدیل گسسته هارتلی. این الگوریتم می‌تواند با به دست آوردن یک فاکتور از دو ذخیره از DFTها از داده‌های حقیقی، با استفاده از حذف یا اندیس‌گذاری مجددی (re-indexing/permutation) که کمی اصلاح شده، برای به دست آوردن دو نیم-اندازه کانولوشن حلقوی از داده‌های حقیقی اصلاح شود(چو و Burrus، 1982)؛تطابق جایگزین برای DFT از داده‌های واقعی، با استفاده از تبدیل گسسته هارتلی، توسط جانسون و فریگو (2007) شرح داده شد.  Winograd را گسترش داد تا شامل DFTهای توان اول از اندازه formula_1 شود، و امروزه گاهی الگوریتم ریدر به عنوان مورد خاصی از الگوریتم تبدیل سریع فوریهٔ Winograd یاد می‌شود. همچنین به نام الگوریتم ضرب تبدیل فوریه نیز شناخته می‌شود، که شامل دستهٔ بسیار بزرگتری از اندازه‌ها می‌شود. با این حال، در اندازه‌های مرکب از قبیل توان‌های اول، الگوریتم تبدیل سریع فوریه کولی-توکی بسیار ساده‌تر و برای پیاده‌سازی عملیتر هستند، بنابراین الگوریتم ریدر به‌طور معمول تنها برای موارد پایه بزرگ اول تجزیه بازگشتی DFT کولی-توکی مورد استفاده قرار می‌گیرد(جانسون و فریگو (2005).
به یاد می آورید که DFT توسط فرمول زیر تعریف می‌شود:
اگر "N" یک عدد اول باشد، بنابراین مجموعهٔ شاخص‌های غیر صفر آن N = 1،...، N - 1 یک گروه به پیمانه N تحت عمل ضرب به شکل می‌دهد. یکی از نتایج از نظریه اعداد از چنین گروه‌هایی است که یک سازنده‌ای از گروه وجود دارد(گاهی اوقات به نام ریشه اولیه)، یک عدد صحیح "g" به‌طوری‌که "n" = "g" (به پیمانه N) برای هر شاخص غیر صفر "n" و برای "q" منحصربه‌فرد در 0،...، N - 2 درخواست وجود دارد. به‌طور مشابه "k" = "g" (به پیمانه N) برای هر k در شاخص غیر صفر و P منحصربه‌فرد در 0،...، N - 2، که در آن توان منفی نشانگر ضرب معکوس g"" در پیمانهٔ "N" است. این بدان معنی است که می‌توانیم DFT را با استفاده از این شاخص‌های جدید p و q بازنویسی کنیم:
جمع نهایی بالا، دقیقاً کانولوشن حلقوی از دو توالی "a" و "b" به طول N-1 است ("q"=0,1...,"N"-2) تعریف شده به صورت زیر:
از آنجا که N - 1 مرکب است، این کانولوشن می‌تواند به‌طور مستقیم از طریق قضیه کانولوشن و الگوریتم‌های FFT معمولی انجام پذیرد. با این حال، ممکن است کارآمد نباشد اگر N - 1 خود دارای عوامل اول بزرگ باشد، نیاز به استفاده بازگشتی الگوریتم ریدر دارد. در عوض، می‌توان کانولوشن حلقوی طول (N-1) را دقیق محاسبه کرد. توسط پدینگ صفر کردن آن تا طول حداقل ((2N-1)-1) برای توان دو، که سپس می‌تواند در زمان (O(N log N بدون برنامه‌های بازگشتی الگوریتم ریدر ارزیابی شود.
این الگوریتم، نیاز به (O(N عمل جمع و زمان (O(N log N برای کانولوشن دارد. در عمل، (O(N جمع اغلب می‌تواند با جذب شدن در جمع‌های کانولوشن انجام شود. در صورتی که کانولوشن با یک جفت از FFTs انجام شود، سپس مجموع "x" که از خروجی عبارت صفرام DC FFT بدست می‌آید "a" به علاوه "x" داده می‌شود و با اضافه کردن آن را به DC از "x" می‌تواند به تمام خروجی‌های اضافه شده کانولوشن قبل از FFT معکوس اضافه شود. در عین حال، این الگوریتم نیاز به عملیات ذاتی بیشتر از FFTs از اندازه مرکب نزدیک خود دارد، و به‌طور معمول در عمل 3-10 بار به طول می انجامد.
اگر الگوریتم ریدر با استفاده از FFTs با اندازه N - 1 برای محاسبه کانولوشن انجام شود، به جای پدینگ صفر همانطور که در بالا ذکر شد، بهره وری به شدت به N و تعداد دفعاتی که الگوریتم ریدر باید به صورت بازگشتی اعمال شود وابسته می‌شود. بدترین حالت زمانی خواهد بود که "N"–1 برابر 2"N" شود که در آن "N" اول باشد، و "N"–1 = 2"N" که در آن "N" اول و به همین ترتیب تا آخر. در چنین مواردی، با فرض این که زنجیرهٔ اعداد اول تا یک مقدار محدود ادامه یابد، برنامه‌های بازگشتی الگوریتم ریدر در واقع به( O("N" زمان نیاز دارد. چنین "N" اعداد اول سوفی ژرمن نامیده می‌شوند، و چنین دنباله‌ای از آن‌ها زنجیره کانینگهام از نوع اول است. طول زنجیره کانینگهام، با این حال، مشاهده شده که آرام تر از( log("N" رشد می‌کند، بنابراین الگوریتم ریدری که به این صورت پیاده‌سازی شده باشد احتمالاً( O("N" log "N" نیست، هر چند احتمالاً برای بدترین مورد بدتر از( O("N" log "N" بوده‌است. اما خوشبختانه، با پدینگ صفر پیچیدگی( O("N" log "N" را می‌توان تضمین کرد.