快速傅里叶变换与多项式乘法优化
5120309037 赵卓越
多项式乘法
𝑓 𝑥 = 𝑎0 + 𝑎1 𝑥 + … + 𝑎𝑛−1 𝑥 𝑛−1
𝑔 𝑥 = 𝑏0 + 𝑏1 𝑥 + … + 𝑏𝑛−1 𝑥 𝑛−1
𝑓 𝑥 ∙ 𝑔 𝑥 有2n项,直接计算的时间复杂度
为𝑂(𝑛2 )
n-1次多项式也可以用n个不同的点表示
离散傅里叶变换(DFT)
定义
逆变换(IDFT)
时间复杂度
快速傅里叶变换(FFT)
二分思想
递归实现
迭代实现
递归实现
Vector Recursive_FFT(Vector x){
if (n == 1) return x;
Vector x0, x1;
for ( auto i = x.begin(); i!=x.end();){
x0.push_back(*i++);
x1.push_back(*i++);
}
x0 = Recursive_FFT(x0);
x1 = Recursive_FFT(x1);
Complex w0(1.0);
Complex w1(exp(Complex(0.0, - 2 * pi / x.size())));
for (int i = 0; i < x0.size(); ++i, w0 *= w1){
x[i] = x0[i] + w0 * x1[i];
x[i + x0.size()] = x0[i] - w0 * x1[i];
}
return x;
}
迭代实现
调整向量中分量的顺序rev(x)
inline unsigned rev(unsigned x, unsigned l){
int ret = 0;
for (; l--; x >>= 1) ret = (ret << 1) | (x & 1);
return ret;
}
inline void bit_reverse(Vector& a){
unsigned s = a.size();
unsigned n = 0;
// length of a's indexes
while (s >>= 1) { n+=1; }
for (unsigned i = 0; i < a.size(); ++i){
s = rev(i, n);
if (s > i) swap(a[i], a[s]);
}
}
void iterative_fft(Vector& a, int sign = -1){
bit_reverse(a);
for (unsigned s = 1; s < a.size(); s <<= 1){
Complex w0(exp(Complex(0.0, sign * pi_mul2 / (s << 1))));
for (unsigned i = 0; i < a.size(); i += (s << 1)){
Complex w(1.0);
for (unsigned k = 0; k < s; ++k, w*=w0){
Complex t1 = w * a[i + k + s];
Complex t2 = a[i + k];
a[i + k] = t2 + t1;
a[i + k + s] = t2 - t1;
}
}
}
}
inline void inverse_fft(Vector& v){
iterative_fft(v, 1);
for (Vector::iterator i = v.begin(); i != v.end(); ++i) *i /=
v.size();
}
© Copyright 2026 Paperzz