Я имел в виду, что
![$N$ $N$](https://dxdy-04.korotkov.co.uk/f/f/9/c/f9c4988898e7f532b9f826a75014ed3c82.png)
должно быть достаточно большим, чтобы результат совпадал с тем, который мы имеем в поле целых чисел
В смысле конечный результат умножения? (ну и целые числа не поле, но неважно)
Да, в википедии хорошее описание (которое кто-то испортил, надо будет внимательно посмотреть и, вероятно, откатить).
В Ваших обозначениях,
![$N = 2^m$ $N = 2^m$](https://dxdy-03.korotkov.co.uk/f/2/1/a/21a9993d3653bc9e6b989c131cbcfd8d82.png)
.
2. Разбиваем на цифры примерно по
![$2^{m / 2}$ $2^{m / 2}$](https://dxdy-01.korotkov.co.uk/f/4/d/e/4de00f39f42e962bf87e03b368bb85d282.png)
бит каждая (цифр соответственно тоже
![$2^{m / 2}$ $2^{m / 2}$](https://dxdy-01.korotkov.co.uk/f/4/d/e/4de00f39f42e962bf87e03b368bb85d282.png)
). Выбираем
![$n = 3 \cdot 2^{m / 2} = 2^{m / 2 + \log_2 3}$ $n = 3 \cdot 2^{m / 2} = 2^{m / 2 + \log_2 3}$](https://dxdy-02.korotkov.co.uk/f/d/3/1/d316e2b5eb1e6d7d6f5ac87d53f624f282.png)
, и вычисления ведем по модулю
![$2^n + 1$ $2^n + 1$](https://dxdy-03.korotkov.co.uk/f/6/9/3/6936ac06cc3fdd96f89e00f9cc865fff82.png)
(в котором почти в 2 раза меньше бит чем в исходном модуле
![$2^N$ $2^N$](https://dxdy-03.korotkov.co.uk/f/6/b/d/6bd87d9e2f456bcede6b5418622a42a682.png)
).
3. Ответ получается по модулю
![$2^n + 1$ $2^n + 1$](https://dxdy-03.korotkov.co.uk/f/6/9/3/6936ac06cc3fdd96f89e00f9cc865fff82.png)
.
В результате у нас получается
![$2^{m / 2}$ $2^{m / 2}$](https://dxdy-01.korotkov.co.uk/f/4/d/e/4de00f39f42e962bf87e03b368bb85d282.png)
"псефдоцифр" (компонент свёртки до переноса), которые теперь могут быть больше
![$2^{m / 2}$ $2^{m / 2}$](https://dxdy-01.korotkov.co.uk/f/4/d/e/4de00f39f42e962bf87e03b368bb85d282.png)
, но они не меньше, чем
![$2^n + 1$ $2^n + 1$](https://dxdy-03.korotkov.co.uk/f/6/9/3/6936ac06cc3fdd96f89e00f9cc865fff82.png)
, поэтому мы посчитали их точно.
Спасибо вам за пояснения! Только я так и не понимаю зачем на
![$N$ $N$](https://dxdy-04.korotkov.co.uk/f/f/9/c/f9c4988898e7f532b9f826a75014ed3c82.png)
, если во всех операциях мы используем
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
? Ещё не понимаю почему
![$N = 2^m$ $N = 2^m$](https://dxdy-03.korotkov.co.uk/f/2/1/a/21a9993d3653bc9e6b989c131cbcfd8d82.png)
, ведь мы должны выбрать его таким, чтобы результат умножения влез в кольцо, т.е.
![$N = 2^{m+1}$ $N = 2^{m+1}$](https://dxdy-01.korotkov.co.uk/f/c/b/d/cbdf4284b8e1d5e868a271cf8a80cbbd82.png)
и модуль равен
![$2^{2^{m+1}}+1$ $2^{2^{m+1}}+1$](https://dxdy-03.korotkov.co.uk/f/2/f/1/2f1e203646a61853fe266a294a2b26eb82.png)
, т.е. размер кольца вдвое больше размеров входных чисел.
На википедии используется
![$n=\frac{2N}{2^{m / 2}} + \frac{m}{2}$ $n=\frac{2N}{2^{m / 2}} + \frac{m}{2}$](https://dxdy-01.korotkov.co.uk/f/0/4/9/049d6c70be689381e842f5d84baca06782.png)
и пишется, что результат FFT влезет в такой модуль. И вы тоже пишите похожее. Но я не понимаю какая нам выгода. Ведь в качестве корней в FFT мы используем
![$r = 2^{2n/2^{m / 2}} = 2^{\frac{4N}{2^m} + \frac{m}{2^{m/2+1}}} = [ N = 2^{m+1} ] = 2^{8 + \frac{m}{2^{m/2+1}}}$ $r = 2^{2n/2^{m / 2}} = 2^{\frac{4N}{2^m} + \frac{m}{2^{m/2+1}}} = [ N = 2^{m+1} ] = 2^{8 + \frac{m}{2^{m/2+1}}}$](https://dxdy-04.korotkov.co.uk/f/b/6/4/b64aba8a353b3cc2f12b8c3e3134073382.png)
. Таким образом мы используем
![$2^{m / 2}$ $2^{m / 2}$](https://dxdy-01.korotkov.co.uk/f/4/d/e/4de00f39f42e962bf87e03b368bb85d282.png)
корней вида
![$2^{(8 + \frac{m}{2^{m/2+1}})j}; j \in \{1 .. 2^{m/2}\}$ $2^{(8 + \frac{m}{2^{m/2+1}})j}; j \in \{1 .. 2^{m/2}\}$](https://dxdy-03.korotkov.co.uk/f/2/7/0/270871106051c2cdb1c96cfff729e19e82.png)
. Значит найдется
![$j$ $j$](https://dxdy-04.korotkov.co.uk/f/3/6/b/36b5afebdba34564d884d347484ac0c782.png)
, которое сделает корень больше
![$2^m$ $2^m$](https://dxdy-04.korotkov.co.uk/f/f/4/6/f46a5c3deaad97e010fdb1e011e7d93c82.png)
, а значит больше самого входного числа (потому что внутри FFT в случае, когда корень равен
![$2^m$ $2^m$](https://dxdy-04.korotkov.co.uk/f/f/4/6/f46a5c3deaad97e010fdb1e011e7d93c82.png)
, считается, по сути, входное число как оно есть). Таким образом, получающиеся результаты FFT больше самих чисел, а значит нет смысла в алгоритме в целом.
Скажите, пожалуйста, где я ошибаюсь?
Ещё в статье зачем-то исходные числа умножают на какой-то вектор
![$A$ $A$](https://dxdy-02.korotkov.co.uk/f/5/3/d/53d147e7f3fe6e47ee05b88b166bd3f682.png)
. Я читал где-то, что так можно делать, и что это называется взвешенным FT, но я не понимаю для чего это здесь. Это какая-то оптимизация или что-то критически важное?