Дискретное преобразование Фурье — различия между версиями
(→Источники информации) |
м (rollbackEdits.php mass rollback) |
||
(не показано 13 промежуточных версий 8 участников) | |||
Строка 4: | Строка 4: | ||
<tex> | <tex> | ||
− | DFT(a_0, a_1, \ldots , a_{n-1}) = (y_0, y_1, \ldots , y_{n-1}) = (A(\omega_{n,0}), A(\omega_{n,1}), \ldots , A(\omega_{n,n-1})) | + | \mathrm{DFT}(a_0, a_1, \ldots , a_{n-1}) = (y_0, y_1, \ldots , y_{n-1}) = (A(\omega_{n,0}), A(\omega_{n,1}), \ldots , A(\omega_{n,n-1})) |
</tex> | </tex> | ||
<tex> | <tex> | ||
Строка 31: | Строка 31: | ||
<center> | <center> | ||
<tex> | <tex> | ||
− | A \times B = \mathrm{InvDFT}(\mathrm{DFT}(A) \times \mathrm{ | + | A \times B = \mathrm{InvDFT}(\mathrm{DFT}(A) \times \mathrm{DFT}(B)). |
</tex> | </tex> | ||
</center> | </center> | ||
Так как ДПФ многолчена {{---}} это вектор его значений, значит, перемножение двух ДПФ требует только <tex>O(n)</tex> операций. Осталось только вычислять ДПФ и обратное ДПФ за время <tex>O(n \log n)</tex>. Для этого используем [[Быстрое преобразование Фурье| быстрое преобразование Фурье]]. | Так как ДПФ многолчена {{---}} это вектор его значений, значит, перемножение двух ДПФ требует только <tex>O(n)</tex> операций. Осталось только вычислять ДПФ и обратное ДПФ за время <tex>O(n \log n)</tex>. Для этого используем [[Быстрое преобразование Фурье| быстрое преобразование Фурье]]. | ||
+ | |||
+ | |||
+ | ДПФ также применяют для быстрого умножения двух длинных чисел, которые в свою очередь могут быть представлены в виде полиномов. | ||
== ДПФ в модульной арифметике == | == ДПФ в модульной арифметике == | ||
Строка 56: | Строка 59: | ||
== Следствия == | == Следствия == | ||
{{Утверждение | {{Утверждение | ||
− | |statement= <tex>\mathrm{DFT}(\mathrm{DFT}(a_0, a_1, \ldots , a_{n-1})) = | + | |statement= <tex>\mathrm{DFT}(\mathrm{DFT}(a_0, a_1, \ldots , a_{n-1})) = n (a_0, a_{n-1}, \ldots , a_1) </tex> |
|proof= | |proof= | ||
Применим к обеим частям обратное ДПФ и получим: | Применим к обеим частям обратное ДПФ и получим: | ||
Строка 62: | Строка 65: | ||
<center> | <center> | ||
<tex> | <tex> | ||
− | \mathrm{DFT}(a_0, a_1, a_{n-1}) = \mathrm{InvDFT}\left( | + | \mathrm{DFT}(a_0, a_1, \ldots , a_{n-1}) = \mathrm{InvDFT}\left(n (a_0, a_{n-1}, \ldots , a_1)\right) |
</tex> | </tex> | ||
</center> | </center> | ||
Строка 70: | Строка 73: | ||
<center> | <center> | ||
<tex> | <tex> | ||
− | y_k = \sum\limits_{j=0}^{n} a_j e^{i\frac{2\pi k}{n} j} | + | y_k = \sum\limits_{j=0}^{n-1} a_j e^{i\frac{2\pi k}{n} j} |
</tex> | </tex> | ||
</center> | </center> | ||
− | Теперь рассмотрим правую часть. По определению, справа у нас находится вектор коэффициентов многочлена со значениями <tex>\left( | + | Теперь рассмотрим правую часть. По определению, справа у нас находится вектор коэффициентов многочлена со значениями <tex>\left( n a_0, n a_{n-1}, \ldots , n a_1 \right)</tex> в точках <tex>x = \omega_n^k</tex>. Обозначим его как <tex>(y_0 ', y_1 ', \ldots , y_{n-1} ')</tex>, где: |
<center> | <center> | ||
<tex> | <tex> | ||
− | y_k '= \dfrac{1}{n} \sum\limits_{j=0}^{n} z_j e^{-i\frac{2\pi k}{n} j}, | + | y_k '= \dfrac{1}{n} \sum\limits_{j=0}^{n-1} z_j e^{-i\frac{2\pi k}{n} j}, |
</tex> | </tex> | ||
</center> | </center> | ||
Строка 95: | Строка 98: | ||
= | = | ||
\begin{pmatrix} | \begin{pmatrix} | ||
− | + | n{a_0}\\ | |
− | + | n{a_{n-1}}\\ | |
− | + | n{a_{n-2}}\\ | |
\vdots \\ | \vdots \\ | ||
− | + | n{a_1} | |
\end{pmatrix} | \end{pmatrix} | ||
</tex> | </tex> | ||
Строка 108: | Строка 111: | ||
<center> | <center> | ||
<tex> | <tex> | ||
− | y_k ' = a_0 e^0 + \sum\limits_{j=1}^{n} a_j e^{-i\frac{2\pi k}{n} (n - j)} = a_0 + \sum\limits_{j=1}^{n} a_j e^{-i 2\pi k} e^{i\frac{2\pi k}{n} j} | + | y_k ' = a_0 e^0 + \sum\limits_{j=1}^{n-1} a_j e^{-i\frac{2\pi k}{n} (n - j)} = a_0 + \sum\limits_{j=1}^{n-1} a_j e^{-i 2\pi k} e^{i\frac{2\pi k}{n} j} |
</tex> | </tex> | ||
</center> | </center> | ||
Строка 116: | Строка 119: | ||
<center> | <center> | ||
<tex> | <tex> | ||
− | y_k ' = a_0 + \sum\limits_{j=1}^{n} a_j e^{i \frac{2\pi k}{n} j} = \sum\limits_{j=0}^{n} a_j e^{i\frac{2\pi k}{n} j} = y_k. | + | y_k ' = a_0 + \sum\limits_{j=1}^{n-1} a_j e^{i \frac{2\pi k}{n} j} = \sum\limits_{j=0}^{n-1} a_j e^{i\frac{2\pi k}{n} j} = y_k. |
</tex> | </tex> | ||
</center> | </center> | ||
Строка 133: | Строка 136: | ||
<center> | <center> | ||
<tex> | <tex> | ||
− | x_0 = \ \ | + | x_0 = \ \ 5 \\ |
x_1 = \ \ 2 \\ | x_1 = \ \ 2 \\ | ||
x_2 = \ \ 4 \\ | x_2 = \ \ 4 \\ | ||
Строка 148: | Строка 151: | ||
1 & i & -1 & -i \\ | 1 & i & -1 & -i \\ | ||
1 & -1 & 1 & -1 \\ | 1 & -1 & 1 & -1 \\ | ||
− | 1 & -i & 1 & i | + | 1 & -i & -1 & i |
\end{pmatrix} | \end{pmatrix} | ||
\begin{pmatrix} | \begin{pmatrix} | ||
Строка 250: | Строка 253: | ||
*[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:21, 4 сентября 2022
Определение: |
Дискретное преобразование Фурье (англ. Discrete Fourier Transform, DFT) многочлена где — ый из комплексных корней из единицы. называется главным значением корня -ой степени из единицы, а все остальные корни являются его степенями: . | называют вектор значений этого многочлена в точках :
Определение: |
Обратное дискретное преобразование Фурье (англ. Inverse DFT) для вектора значений многочлена
| — вектор коэффициентов этого многочлена :
Содержание
Применение ДПФ
Дискретное преобразование Фурье используют для быстрого перемножения двух полиномов
и .Для того чтобы получить произведение двух многочленов за время, меньшее чем
, необходимо сначала посчитать обоих многочленов. Так как при умножении двух многочленов их значения просто перемножаются в каждой точке. Следовательно, если — это вектор значений многочлена, то мы можем получить значение произведения двух многочленов, просто перемножив их ДПФ. Значит, чтобы получить коэффициенты полученного многочлена, применим обратное ДПФ.
Так как ДПФ многолчена — это вектор его значений, значит, перемножение двух ДПФ требует только быстрое преобразование Фурье.
операций. Осталось только вычислять ДПФ и обратное ДПФ за время . Для этого используем
ДПФ также применяют для быстрого умножения двух длинных чисел, которые в свою очередь могут быть представлены в виде полиномов.
ДПФ в модульной арифметике
В основе ДПФ используются комплексные числа, являющиеся корнями группу, то есть степень одного корня всегда является другим корнем. Среди них есть корень, называемый примитивным.
-ой степени из единицы. Для эффективного вычисления использовались свойства комплексных корней, которые образуютОднако, то же верно и в случае корней
-ой степени из единицы в модульной арифметике. Не для любого модуля найдется различных корней, но такие модули все же существуют. Необходимо найти примитивный корень, то есть:
Как и с комплексными корнями, остальные
корней -ой степени из единицы по модулю можно получить как степени примитивного корняСледствия
Утверждение: |
Применим к обеим частям обратное ДПФ и получим:
Заметим, что слева у нас находится вектор значений многочлена с коэффициентами и обозначим его за . Заметим, что:
Теперь рассмотрим правую часть. По определению, справа у нас находится вектор коэффициентов многочлена со значениями в точках . Обозначим его как , где:
где
Тогда, подставляя значения , получаем:
А так как , получаем:
|
Пример
Посчитаем
для полинома степени .
Тогда подставляя значения
в получаем:
Построим матрицу Вандермонда:
Получаем вектор значений многочлена
:
В итоге получаем:
Аналогично, получаем обратное ДПФ.