<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Amsilevich</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Amsilevich"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Amsilevich"/>
		<updated>2026-04-08T23:11:06Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5&amp;diff=71950</id>
		<title>Быстрое преобразование Фурье</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5&amp;diff=71950"/>
				<updated>2019-12-01T19:50:05Z</updated>
		
		<summary type="html">&lt;p&gt;Amsilevich: /* Алгоритм построения БПФ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Быстрое преобразование Фурье''' (англ. ''Fast Fourier Transform, FFT'') {{---}} метод, позволяющий вычислять [[Дискретное преобразование Фурье | дискретное преобразование Фурье]] за время &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Описание задачи ==&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition=&lt;br /&gt;
Необходимо научиться вычислять прямое и обратное дискретное преобразование Фурье многочлена &amp;lt;tex&amp;gt;A(x)&amp;lt;/tex&amp;gt; степени &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; за время &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Метод основывается на том, что степени одних комплексных корней единицы в степени &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; дают другие. &lt;br /&gt;
&lt;br /&gt;
Cначала мы разделяем вектор коэффициентов на два вектора, рекурсивно вычисляем значение ДПФ для них, и объединяем их в одно ДПФ.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм построения БПФ ==&lt;br /&gt;
Пусть имеется многочлен &amp;lt;tex&amp;gt;A(x)&amp;lt;/tex&amp;gt; порядка &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n &amp;gt; 1, n = 2^t&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; не является степенью двойки, добавим недостающие члены и положим коэффициенты равными нулю.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt; A(x) = a_0 x^0 + a_1 x^1 + \ldots + a_{n-1} x^{n-1} &amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разделим &amp;lt;tex&amp;gt;A(x)&amp;lt;/tex&amp;gt; на два многочлена, где один будет с четными, а другой с нечетными коэффициентами:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; A_0(x) = a_0 x^0 + a_2 x^1 + \ldots + a_{n-2} x^{\frac{n}{2} - 1} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; A_1(x) = a_1 x^0 + a_3 x^1 + \ldots + a_{n-1} x^{\frac{n}{2} - 1} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Многочлен &amp;lt;tex&amp;gt;A(x)&amp;lt;/tex&amp;gt; получается из &amp;lt;tex&amp;gt;A_0(x)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A_1(x)&amp;lt;/tex&amp;gt; следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;A(x) = A_0(x^2) + xA_1(x^2) \ \ \ \ \  (1)&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Мы разбили исходный многочлен на два многочлена, имеющих вдвое меньшую степень. Нам необходимо по вычисленным &amp;lt;tex&amp;gt;\mathrm{DFT}(A_0)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{DFT}(A_1)&amp;lt;/tex&amp;gt; за линейное время вычислить &amp;lt;tex&amp;gt;\mathrm{DFT}(A)&amp;lt;/tex&amp;gt;. Так как здесь используется идея ''разделяй и властвуй'', то асимптотическая оценка будет &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathrm{DFT}(A_0) = \{y_k^0\}^{\frac{n}{2}-1}_{k=0}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{DFT}(A_1) = \{y_k^1\}^{\frac{n}{2} - 1}_{k=0}&amp;lt;/tex&amp;gt;. Найдем вектор значений &amp;lt;tex&amp;gt;\mathrm{DFT}(A) = \{y_k\}^{n-1}_{k=0}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Из &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt; получаем значения для первой половины коэффициентов:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;y_k = y_k^0 + \omega^k_n y_k^1, \ \ k = 0 \ldots \dfrac{n}{2} - 1 &amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
* Для второй половины получаем:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;y_{k+\frac{n}{2}}= A(\omega_n^{k+\frac{n}{2}})= A_0(\omega_n^{2k+n})+ \omega_n^{k+\frac{n}{2}} A_1(\omega_n^{2k+n})= &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;A_0(\omega_n^{2k} \omega_n^{n})+ \omega_n^k \omega_n^{\frac{n}{2}} A_1(\omega_n^{2k} \omega_n^n) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt; \omega_n^n = 1, \omega_n^{\frac{n}{2}} = -1&amp;lt;/tex&amp;gt;, тогда:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;y_{k+\frac{n}{2}}= A_0(\omega_n^{2k})- \omega_n^k A_1(\omega_n^{2k})= y_k^0- \omega_n^k y_k^1&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, мы получили:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;y_k = y_k^0 + \omega^k_n y_k^1, \ \ k = 0 \ldots \dfrac{n}{2} - 1 &amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;y_{k+\frac{n}{2}}= y_k^0- \omega_n^k y_k^1, \ \ k = 0 \ldots \dfrac{n}{2} - 1 &amp;lt;/tex&amp;gt;. &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Алгоритм построения обратного БПФ == &lt;br /&gt;
Пусть вектор &amp;lt;tex&amp;gt;(y_0, y_1, \ldots , y_{n-1})&amp;lt;/tex&amp;gt; {{---}} значения многочлена &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; степени &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; в точках &amp;lt;tex&amp;gt;n = \omega_n^k&amp;lt;/tex&amp;gt;. Необходимо, по данному вектору восстановить коэффициенты &amp;lt;tex&amp;gt;(a_0, a_1, \ldots , a_{n-1})&amp;lt;/tex&amp;gt; многочлена.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим ДПФ в матричном виде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
\omega_n^0 &amp;amp; \omega_n^0 &amp;amp; \omega_n^0 &amp;amp; \ldots &amp;amp; \omega_n^0\\&lt;br /&gt;
\omega_n^0 &amp;amp; \omega_n^1 &amp;amp; \omega_n^2 &amp;amp; \ldots &amp;amp; \omega_n^{n-1} \\&lt;br /&gt;
\omega_n^0 &amp;amp; \omega_n^2 &amp;amp; \omega_n^4 &amp;amp; \ldots &amp;amp; \omega_n^{2(n-1)} \\&lt;br /&gt;
\vdots&amp;amp; \vdots &amp;amp; \vdots &amp;amp;\ddots &amp;amp; \vdots\\&lt;br /&gt;
\omega_n^0 &amp;amp; \omega_n^{n-1} &amp;amp; \omega_n^{2(n-1)} &amp;amp;\ldots &amp;amp; \omega_n^{(n-1)(n-1)}&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
a_0 \\&lt;br /&gt;
a_1 \\&lt;br /&gt;
a_2 \\&lt;br /&gt;
\vdots \\&lt;br /&gt;
a_{n-1}&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
=&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
y_0 \\&lt;br /&gt;
y_1 \\&lt;br /&gt;
y_2 \\&lt;br /&gt;
\vdots \\&lt;br /&gt;
y_{n-1}&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отсюда можно найти вектор &amp;lt;tex&amp;gt;(a_0, a_1, \ldots ,a_{n-1})&amp;lt;/tex&amp;gt;, умножив вектор &amp;lt;tex&amp;gt;(y_0, y_1, \ldots ,y_{n-1})&amp;lt;/tex&amp;gt; на матрицу обратную матрице Вандермонда (матрица слева).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
a_0 \\&lt;br /&gt;
a_1 \\&lt;br /&gt;
a_2 \\&lt;br /&gt;
\vdots \\&lt;br /&gt;
a_{n-1}&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
=&lt;br /&gt;
{\begin{pmatrix}&lt;br /&gt;
\omega_n^0 &amp;amp; \omega_n^0 &amp;amp; \omega_n^0 &amp;amp; \ldots &amp;amp; \omega_n^0\\&lt;br /&gt;
\omega_n^0 &amp;amp; \omega_n^1 &amp;amp; \omega_n^2 &amp;amp; \ldots &amp;amp; \omega_n^{n-1} \\&lt;br /&gt;
\omega_n^0 &amp;amp; \omega_n^2 &amp;amp; \omega_n^4 &amp;amp; \ldots &amp;amp; \omega_n^{2(n-1)} \\&lt;br /&gt;
\vdots&amp;amp; \vdots &amp;amp; \vdots &amp;amp;\ddots &amp;amp; \vdots\\&lt;br /&gt;
\omega_n^0 &amp;amp; \omega_n^{n-1} &amp;amp; \omega_n^{2(n-1)} &amp;amp;\ldots &amp;amp; \omega_n^{(n-1)(n-1)}&lt;br /&gt;
\end{pmatrix}}^{-1}&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
y_0 \\&lt;br /&gt;
y_1 \\&lt;br /&gt;
y_2 \\&lt;br /&gt;
\vdots \\&lt;br /&gt;
y_{n-1}&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Непосредственной проверкой можно убедиться, что обратная матрица имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
\dfrac{1}{n}&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
\omega_n^0 &amp;amp; \omega_n^0 &amp;amp; \omega_n^0 &amp;amp; \ldots &amp;amp; \omega_n^0\\&lt;br /&gt;
\omega_n^0 &amp;amp; \omega_n^{-1} &amp;amp; \omega_n^{-2} &amp;amp; \ldots &amp;amp; \omega_n^{-(n-1)} \\&lt;br /&gt;
\omega_n^0 &amp;amp; \omega_n^{-2} &amp;amp; \omega_n^{-4} &amp;amp; \ldots &amp;amp; \omega_n^{-2(n-1)} \\&lt;br /&gt;
\vdots&amp;amp; \vdots &amp;amp; \vdots &amp;amp;\ddots &amp;amp; \vdots\\&lt;br /&gt;
\omega_n^0 &amp;amp; \omega_n^{-(n-1)} &amp;amp; \omega_n^{-2(n-1)} &amp;amp;\ldots &amp;amp; \omega_n^{-(n-1)(n-1)}&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Получаем формулу для &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a_k = \dfrac{1}{n}\sum \limits_{j=0}^{n-1} {y_j \omega_n^{-kj}} &amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аналогично прямому ДПФ, по принципу ''разделяй и властвуй'' посчитаем &amp;lt;tex&amp;gt;\mathrm{InvDFT}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Дискретное преобразование Фурье]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://ru.wikipedia.org/wiki/%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5 Википедия {{---}} Быстрое преобразование Фурье]&lt;br /&gt;
*[http://e-maxx.ru/algo/fft_multiply MAXimal::algo::Быстрое преобразование Фурье за O (N log N)]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Алгоритмы алгебры и теории чисел]]&lt;br /&gt;
[[Категория: Основные элементы теории чисел]]&lt;br /&gt;
[[Категория: Основные алгоритмы теории чисел]]&lt;/div&gt;</summary>
		<author><name>Amsilevich</name></author>	</entry>

	</feed>