Я имел в виду, что
должно быть достаточно большим, чтобы результат совпадал с тем, который мы имеем в поле целых чисел
В смысле конечный результат умножения? (ну и целые числа не поле, но неважно)
Да, в википедии хорошее описание (которое кто-то испортил, надо будет внимательно посмотреть и, вероятно, откатить).
В Ваших обозначениях,
.
2. Разбиваем на цифры примерно по
бит каждая (цифр соответственно тоже
). Выбираем
, и вычисления ведем по модулю
(в котором почти в 2 раза меньше бит чем в исходном модуле
).
3. Ответ получается по модулю
.
В результате у нас получается
"псефдоцифр" (компонент свёртки до переноса), которые теперь могут быть больше
, но они не меньше, чем
, поэтому мы посчитали их точно.
Спасибо вам за пояснения! Только я так и не понимаю зачем на
, если во всех операциях мы используем
? Ещё не понимаю почему
, ведь мы должны выбрать его таким, чтобы результат умножения влез в кольцо, т.е.
и модуль равен
, т.е. размер кольца вдвое больше размеров входных чисел.
На википедии используется
и пишется, что результат FFT влезет в такой модуль. И вы тоже пишите похожее. Но я не понимаю какая нам выгода. Ведь в качестве корней в FFT мы используем
. Таким образом мы используем
корней вида
. Значит найдется
, которое сделает корень больше
, а значит больше самого входного числа (потому что внутри FFT в случае, когда корень равен
, считается, по сути, входное число как оно есть). Таким образом, получающиеся результаты FFT больше самих чисел, а значит нет смысла в алгоритме в целом.
Скажите, пожалуйста, где я ошибаюсь?
Ещё в статье зачем-то исходные числа умножают на какой-то вектор
. Я читал где-то, что так можно делать, и что это называется взвешенным FT, но я не понимаю для чего это здесь. Это какая-то оптимизация или что-то критически важное?