http://blog.csdn.net/iamzky/article/details/22712347
一般地,x的n个单位根可以表示为:,其中:k=0,1,2,..,n-1。
单位的 n次根有n个:。
wn可以看做是复平面上x轴正方向绕逆时针方向旋转2pi/n的复数.
wnwnwnwn
大概是从[0,2*pi]逆时针转过来,分别为wn^0...wn^(n-1)。wn^0在x轴上,xn角度为2*pi/n
性质一
n次单位根的模为1,即|εk|=1
性质二
两个n次单位根εj与εk 的乘积还是一个n次单位根,且εjεk =εj+k
推论:
(n=1时,该式子不成立)
性质三
w[n]^2=w[n/2]
w[n]^m=-w[n]^(m+n/2)
性质四
多项式的点值表示可以唯一确定一个多项式(得到的方程组有唯一解)
复数相乘:模长相乘,幅角相加。
a的多项式乘b次的多项式得到的多项式的次数界应该是a+b-1的。因此我们将向量a,b的长度变成a+b-1,高位补0。这样点值就有a+b-1个值。
////////////////
注意空间要开够2*(n+m)
由于需要使用复数,
#include<complex>
...
typedef complex<double> E;
E a(3.5,6.3);
a+=3.6; printf("%lf %lf",a.real(),a.imag());
单位根的向量在复平面上是如此优美。
IDFT后每个复数虚部一定为0。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
迭代版本FFT:
观察一波性质,发现只需位反转即可得到新串。二进制加1的复杂度是严格O(n)。n+n/2+n/4+n/8+...+n/n=2n-1。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
NTT :其实和FFT类似,只不过是用g^((p-1)/n) (mod p)代替wn。p=k*2^r+1。其实有一个前提2^r>n,但是当p=998244353时,n本来也不能弄到很大。
2281701377=17⋅227+1
2281701377=17*2^27+1是一个挺好的数,平方刚好不会爆 long long
1004535809=479*2^21+1 加起来刚好不会爆int也不错
还有就是998244353=119×2^23+1原根 http://blog.csdn.net/acdreamers/article/details/8883285
1.素数一定有原根
2.阶的性质
3.[1,p-1]内i=p-1是唯一一个使得g^i==1 (mod p)的根。
4.求模素数p原根的方法:对p-1素因子分解。枚举g,若恒有g^((p-1)/pi)!=1 (mod p),则g是p的原根???
而剩下的问题就是为什么可以用原根代替单位根了
令g=原根^((p-1)/n)。我们还要证明g^0,g^1...g^(n-1)互不相同
模数任意的解决方案 还不会?
问题就是为什么
1.分治fft:结合cdq的思想,求Fi=simga(0<j<i) Fi-j*Aj hdu5730