Добрый вечер!
Первый раз на этом форуме, просьба сильно не ругать оформление и постановку.
Итак, задача - реализовать умножение многочленов над
произвольным конечным полем с FFT (
Fast Fourier Transition). Собственно, само умножение происходит понятно - для многочленов
![$A(x), B(x)$ $A(x), B(x)$](https://dxdy-04.korotkov.co.uk/f/f/3/7/f3771847f0858874757a81da9e9d31f182.png)
, заданных векторами коэффициентов, получаем их преобразования
![$FFT(A(x)), FFT(B(x))$ $FFT(A(x)), FFT(B(x))$](https://dxdy-02.korotkov.co.uk/f/d/9/3/d93aceaf7c34648feee1d5ec97db71d182.png)
- вектора значений в корнях из
![$1$ $1$](https://dxdy-01.korotkov.co.uk/f/0/3/4/034d0a6be0424bffe9a6e7ac9236c0f582.png)
. Почленно перемножаем преобразования и вычисляем от результата обратное преобразование Фурье (далее - iFFT).
Для понимания алгоритма использовал данную статью:
http://www.cs.berkeley.edu/~fateman/282/readings/fftnotes.pdf - по сути, единственное более-менее внятное объяснение метода для случая конечных полей, что я нашел. Прямое преобразование сложностей не вызвало: многочлен
![$A(x) = a_0 + a_1 x + ... + a_{n-1} x^{n-1}$ $A(x) = a_0 + a_1 x + ... + a_{n-1} x^{n-1}$](https://dxdy-02.korotkov.co.uk/f/9/a/9/9a956e1529d1b4401148ab54c346e1e582.png)
представляется как
![$\begin{pmatrix} A(x_0)\\A(x_1)\\...\\A(x_{n-1})\end{pmatrix} = \begin{pmatrix} x_0^0& x_0^1& ...& x_0^{n-1}\\ x_1^0& x_1^1& ...& x_1^{n-1}\\ ...&...& ...& ...\\ x_{n-1}^0& x_{n-1}^1& ...& x_{n-1}^{n-1}\end{pmatrix} \cdot \begin{pmatrix}a_0\\a_1\\...\\a_{n-1}\end{pmatrix}$ $\begin{pmatrix} A(x_0)\\A(x_1)\\...\\A(x_{n-1})\end{pmatrix} = \begin{pmatrix} x_0^0& x_0^1& ...& x_0^{n-1}\\ x_1^0& x_1^1& ...& x_1^{n-1}\\ ...&...& ...& ...\\ x_{n-1}^0& x_{n-1}^1& ...& x_{n-1}^{n-1}\end{pmatrix} \cdot \begin{pmatrix}a_0\\a_1\\...\\a_{n-1}\end{pmatrix}$](https://dxdy-01.korotkov.co.uk/f/4/f/a/4fa2b60bd14940aaa2730d33aa9ab3b182.png)
, если в качестве
![$(x_0, ..., x_{n-1})$ $(x_0, ..., x_{n-1})$](https://dxdy-01.korotkov.co.uk/f/0/8/3/083064f1941f170bf4d42c2b72b43ed382.png)
выбрать
![$(w^0, ..., w^{n-1})$ $(w^0, ..., w^{n-1})$](https://dxdy-01.korotkov.co.uk/f/4/3/2/432cc34496171838470dcfeb9d13f7d882.png)
, где
![$w$ $w$](https://dxdy-04.korotkov.co.uk/f/3/1/f/31fae8b8b78ebe01cbfbe2fe5383262482.png)
- примитивный
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
-ный корень из единицы (т.е.
![$w^n = 1, w^k \neq 1, \forall k<n$ $w^n = 1, w^k \neq 1, \forall k<n$](https://dxdy-04.korotkov.co.uk/f/7/a/d/7adae0a02cb84c0a53fd4c8d6eaba19d82.png)
), получим:
![$\begin{pmatrix} A(w^0)\\A(w^1)\\...\\A(w^{n-1})\end{pmatrix} = \begin{pmatrix} 1& 1& 1& ...& 1\\ 1& w& w^2&...& w^{n-1}\\ ...&...& ...&...& ...\\ 1& w^{n-1}& (w^{n-1})^2&...& (w^{n-1})^{n-1}\end{pmatrix} \cdot \begin{pmatrix}a_0\\a_1\\...\\a_{n-1}\end{pmatrix}$ $\begin{pmatrix} A(w^0)\\A(w^1)\\...\\A(w^{n-1})\end{pmatrix} = \begin{pmatrix} 1& 1& 1& ...& 1\\ 1& w& w^2&...& w^{n-1}\\ ...&...& ...&...& ...\\ 1& w^{n-1}& (w^{n-1})^2&...& (w^{n-1})^{n-1}\end{pmatrix} \cdot \begin{pmatrix}a_0\\a_1\\...\\a_{n-1}\end{pmatrix}$](https://dxdy-03.korotkov.co.uk/f/e/e/d/eedafc82b8cf127d6c7f0bac5219322182.png)
. По определению это и есть преобразование Фурье (все это описано по ссылке чуть более подробно, но суть такая). В статье утверждается, что для обратного преобразования используется аналогичный алгоритм, только вместо элемента
![$w$ $w$](https://dxdy-04.korotkov.co.uk/f/3/1/f/31fae8b8b78ebe01cbfbe2fe5383262482.png)
используется
![$w^{-1}$ $w^{-1}$](https://dxdy-02.korotkov.co.uk/f/9/f/1/9f1cb18214a5a792ac2f638400e25ff082.png)
, и появляется коэффициент
![$\frac{1}{n}$ $\frac{1}{n}$](https://dxdy-02.korotkov.co.uk/f/1/7/9/179b80cc86f52ed7205e115c2a3ddc1b82.png)
- по сути, обратная матрица к исходной:
![$\frac{1}{n}\begin{pmatrix} 1& 1& 1& ...& 1\\ 1& w^{-1}& w^{-2}&...& w^{-(n-1)}\\ ...&...& ...&...& ...\\ 1& w^{-(n-1)}& (w^{-(n-1)})^2&...& (w^{-(n-1)})^{n-1}\end{pmatrix}$ $\frac{1}{n}\begin{pmatrix} 1& 1& 1& ...& 1\\ 1& w^{-1}& w^{-2}&...& w^{-(n-1)}\\ ...&...& ...&...& ...\\ 1& w^{-(n-1)}& (w^{-(n-1)})^2&...& (w^{-(n-1)})^{n-1}\end{pmatrix}$](https://dxdy-03.korotkov.co.uk/f/2/c/a/2caf3d5dbcedaf22af12b0520c731c6d82.png)
.Таким образом мы подошли к
первому вопросу - что такое
![$\frac{1}{n}$ $\frac{1}{n}$](https://dxdy-02.korotkov.co.uk/f/1/7/9/179b80cc86f52ed7205e115c2a3ddc1b82.png)
?
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
- натуральное число, длина вектора коэффициентов входного многочлена. Если вводить
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
как сумму из
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
единиц поля, то получим, что, в частности, для
![$GF(2^4)/(x^4+x+1)$ $GF(2^4)/(x^4+x+1)$](https://dxdy-03.korotkov.co.uk/f/a/0/b/a0ba5c401a0e231bbf6dbb25b570648c82.png)
попытка вычислить
![$\frac{1}{n}$ $\frac{1}{n}$](https://dxdy-02.korotkov.co.uk/f/1/7/9/179b80cc86f52ed7205e115c2a3ddc1b82.png)
приводит к обращению
![$0$ $0$](https://dxdy-03.korotkov.co.uk/f/2/9/6/29632a9bf827ce0200454dd32fc3be8282.png)
(при четных
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
)- дело неблагодарное, так как противоречит определению поля.
Далее, уже сам быстрый алгоритм использует дополнение степени многочлена до степени
![$2$ $2$](https://dxdy-04.korotkov.co.uk/f/7/6/c/76c5792347bb90ef71cfbace628572cf82.png)
нулями - казалось бы, все здорово. Но не выйдет ли, что для больших
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
и, соответственно, дополнений до степени
![$2$ $2$](https://dxdy-04.korotkov.co.uk/f/7/6/c/76c5792347bb90ef71cfbace628572cf82.png)
, не найдется примитивного корня единицы?
Заранее спасибо за ответы!
P.S.
Буду рад так же любой литературе по данному вопросу.