多项式系数表示法:
多项式点值表示法
系数表示法算多项式乘法的时间复杂度是O(n^2),而通过点值表示法我们可以发现两个多项式P,Q,同时取点x时,得到的是y1和y2,即取到的点分别为(x,y1),(x,y2)而PQ会取到的点为(x,y1y2),那么计算P*Q的点表达式的时间复杂度就是O(n)的。
FFT就是将系数表示法转化成点值表示法相乘,再由点值表示法转化为系数表示法的过程,第一个过程叫做求值(DFT),第二个过程叫做插值(IDFT)
模板:
//R[]这是一个数组,用于储存二进制反转的结果
//#define il inline
const double Pi = acos(-1.0) ; //圆周率pai
struct node{
//定义一个虚数结构体:
double x, y ;
node (double xx = 0, double yy = 0){
x = xx, y = yy ;
}
}A[MAXN], B[MAXN] ;
node operator * (node J, node Q){
// 重载运算符:
return node(J.x * Q.x - J.y * Q.y , J.x * Q.y + J.y * Q.x);
}
node operator + (node J, node Q){
return node(J.x + Q.x , J.y + Q.y);
}
node operator - (node J, node Q){
return node(J.x - Q.x , J.y - Q.y );
}
il void FFT(node *J, double flag){
//将flag传入1,表示将系数表示法转换为点表示法,传入-1时表示由点表示法转换为系数表示法:
for(i = 0; i < Lim; i ++)
if(i < R[i]) swap(J[i], J[R[i]]) ;
for(j = 1; j < Lim; j <<= 1){
node T(cos(Pi / j), flag * sin(Pi / j)) ;
for(k = 0; k