Добрый вечер!
Первый раз на этом форуме, просьба сильно не ругать оформление и постановку.
Итак, задача - реализовать умножение многочленов над
произвольным конечным полем с FFT (
Fast Fourier Transition). Собственно, само умножение происходит понятно - для многочленов
, заданных векторами коэффициентов, получаем их преобразования
- вектора значений в корнях из
. Почленно перемножаем преобразования и вычисляем от результата обратное преобразование Фурье (далее - iFFT).
Для понимания алгоритма использовал данную статью:
http://www.cs.berkeley.edu/~fateman/282/readings/fftnotes.pdf - по сути, единственное более-менее внятное объяснение метода для случая конечных полей, что я нашел. Прямое преобразование сложностей не вызвало: многочлен
представляется как
, если в качестве
выбрать
, где
- примитивный
-ный корень из единицы (т.е.
), получим:
. По определению это и есть преобразование Фурье (все это описано по ссылке чуть более подробно, но суть такая). В статье утверждается, что для обратного преобразования используется аналогичный алгоритм, только вместо элемента
используется
, и появляется коэффициент
- по сути, обратная матрица к исходной:
.Таким образом мы подошли к
первому вопросу - что такое
?
- натуральное число, длина вектора коэффициентов входного многочлена. Если вводить
как сумму из
единиц поля, то получим, что, в частности, для
попытка вычислить
приводит к обращению
(при четных
)- дело неблагодарное, так как противоречит определению поля.
Далее, уже сам быстрый алгоритм использует дополнение степени многочлена до степени
нулями - казалось бы, все здорово. Но не выйдет ли, что для больших
и, соответственно, дополнений до степени
, не найдется примитивного корня единицы?
Заранее спасибо за ответы!
P.S.
Буду рад так же любой литературе по данному вопросу.