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