Fast Fourier Transform

Sto avendo dei problemi a risolvere “Camera dei segreti”, ho bisogno di utilizzare la trasformata di Fourier per le moltiplicazioni tra polinomi. Va tutto bene finchè non devo aggiungere il modulo. Sto consultando https://cp-algorithms.com/algebra/fft.html#number-theoretic-transform e vedo che il sito propone questo metodo.
Io ho:

#define mod 104857601
const int root = 3;
const int root_1 = 34952534;
const int root_pw = 1 << 20;

Ovviamente il modulo è quello proposto dal problema di Camera dei segreti.
Non so se ho calcolato bene la radice e la radice inversa.
Per la costante “root_pw” non ho capito che calcolo bisogna fare.

Qualcuno potrebbe aiutarmi? Grazie in anticipo

Ciao, in realtà il problema passa agevolmente anche con FFT (io ho usato quello di USACO guide).

Per NTT root_pw in realtà può essere un qualunque numero 2^k tale che esista una radice (primitiva) 2^k-esima dell’unità sotto il tuo modulo. 2^k è la dimensione della più grande trasformata che puoi fare, quindi va scelto sufficientemente grande (però 2^{20} dovrebbe bastare per questo problema)

root deve essere una radice root_pw-esima primitiva di 1 (e mi pare che in realtà root ** root_pw % mod != 1 al momento).

root_1 deve essere l’inverso di root modulo mod, cioè quel numero tale che root * root_1 % mod == 1. Puoi calcolarlo con Euclide esteso oppure facendo root ** (mod - 2)

Ciao, grazie, provo a sistemare i valori delle mie radici con i tuoi accorgimenti :blush: