多项式部分运算

乘法

NTT

构造模意义单位根。

发现 δpgk=(p1)gcd(k,p1)\delta_pg^k=\dfrac{(p-1)}{\gcd(k, p -1)},当 n(p1)n|(p-1) 时, δpg(p1)/n=(p1)gcd(p1n,p1)=n\delta_pg^{(p-1)/n}=\dfrac{(p-1)}{\gcd(\frac{p-1}{n}, p-1)}=n

ωn=g(p1)/n\omega_n=g^{(p-1)/n} ,则 ωn0,ωn1,,ωnn1\omega_n^0,\omega_n^1,\cdots,\omega_n^{n-1} 互不相同,且有:

  • ω2n2k=(g(p1)/2n)2k=(g(p1)/n)k=ωnk\omega_{2n}^{2k}=(g^{(p-1)/2n})^{2k}=(g^{(p-1)/n})^{k}=\omega_n^k
  • wnn=gp1=1w_n^n=g^{p-1}=1
  • ωnn/2=g(p1)/2=1\omega_n^{n/2}=g^{(p-1)/2}=-1(任何数 aa 满足 aφ(p)/2±1(modp)a^{\varphi(p)/2}\equiv \pm1\pmod p,显然 gφ(p)/21g^{\varphi(p)/2}\neq1
  • ωnk+n/2=ωnk\omega_n^{k+n/2}=-\omega_n^k

一些实现上的细节:

  • 使用 unsigned long long ,避开部分取模
  • 关于代码中的 std::reverse(f + 1, f + n)

(咕)