Изменения

Перейти к: навигация, поиск

Быстрое преобразование Фурье

581 байт добавлено, 19:06, 4 сентября 2022
м
rollbackEdits.php mass rollback
{{Определение
|definition=
'''Быстрое преобразование Фурье''' (англ. ''Fast Fourier Transform (, FFT)'') {{---}} это метод, позволяющий вычислять [[Дискретное преобразование Фурье | дискретное преобразование Фурье ]] за время <tex>O(nlognn \log n)</tex>.
}}
{{Задача
|definition=
Необходимо научиться вычислять прямое и обратное дискретное преобразование Фурье многочлена <tex>A(x)</tex> степени <tex>n</tex> за время <tex>O(nlognn \log n)</tex>.
}}
Метод основывается на том, что степени одних комплексных корней единицы в степени <tex>n</tex> дают другие.
Идея заключается в том, что сначала Cначала мы разделяем вектор коэффициентов на два вектора, рекурсивно вычисляем значение ДПФ для них, и объединяем их в одно ДПФ.
== Алгоритм построения БПФ ==
Пусть имеется многочлен <tex>A(x)</tex> степени порядка <tex>n</tex>, где <tex>n > 1, n = 2^t</tex>. Если <tex>n</tex> не является степенью двойки, добавим недостающие члены и положим коэффициенты равными нулю.
<center><tex> A(x) = a_0 x^0 + a_1 x^1 + \ldots + a_{n-1} x^{n-1} </tex></center>
Мы разбили исходный многочлен на два многочлена, имеющих вдвое меньшую степень. Нам необходимо по вычисленным <tex>\mathrm{DFT}(A_0)</tex> и <tex>\mathrm{DFT}(A_1)</tex> за линейное время вычислить <tex>\mathrm{DFT}(A)</tex>. Так как здесь используется идея "''разделяй и властвуй"'', то асимптотическая оценка будет <tex>O(nlognn \log n)</tex>.
Пусть <tex>\mathrm{DFT}(A_0) = \{y_k^0\}^{\frac{n}{2}-1}_{k=0}</tex> и <tex>\mathrm{DFT}(A_1) = \{y_k^1\}^{\frac{n}{2} - 1}_{k=0}</tex>. Найдем вектор значений <tex>\mathrm{DFT}(A) = \{y_k\}^{n-1}_{k=0}</tex>.
* Из <tex>(1)</tex> получаем значения для первой половины коэффициентов:
<center><tex>y_k = y_k^0 + \omega^k_n y_k^1, \ \ k = 0 \ldots \dfrac{n}{2} - 1 </tex></center>
</tex></center>
Отсюда можно найти вектор <tex>(a_0, a_1, \ldots ,a_{n-1})</tex>, умножив вектор <tex>(y_0, y_1, \ldots ,y_{n-1})</tex> на матрицу обратную матрице Вандермонда (матрица слева).
<center><tex>
Получаем формулу для <tex>a_k</tex>:
<center><tex>a_k = \dfrac{1}{n}\sum \limits_{j=0}^{n-1} {y_j \omega_n^{-kj}} </tex></center> Аналогично прямому ДПФ, по принципу ''разделяй и властвуй'' посчитаем <tex>\mathrm{InvDFT}</tex>.
== См. также ==
*[[Дискретное преобразование Фурье]]
== Источники информации ==
*[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 Википедия {{---}} Быстрое преобразование Фурье]
*[http://e-maxx.ru/algo/fft_multiply MAXimal::algo::Быстрое преобразование Фурье за O (N log N)]
 
[[Категория: Алгоритмы и структуры данных]]
[[Категория: Алгоритмы алгебры и теории чисел]]
[[Категория: Основные элементы теории чисел]]
[[Категория: Основные алгоритмы теории чисел]]
1632
правки

Навигация