这几天简单学习了 FFT 算法,在此做一个小的总结。
要解决的问题
FFT算法可以用来解决这样一类问题。
设有多项式:
A(x)=∑i=0n−1aixi
B(x)=∑i=0n−1bixi
求多项式 C(x)=A(x)⋅B(x) 。
n2 的方法
很容易想到该问题的 O(n2) 解法,这里不做解释:
void Calc(double* a, double* b, double* c, int n) {
/*
A(x) = a[0] + a[1]*x + a[2]*(x^2) + a[3]*(x^3) + ... + a[n-1]*(x^(n-1))
B(x) = b[0] + b[1]*x + b[2]*(x^2) + b[3]*(x^3) + ... + b[n-1]*(x^(n-1))
C(x) = c[0] + c[1]*x + c[2]*(x^2) + c[3]*(x^3) + ... + c[2n-2]*(x^(2n-2))
*/
for(int i=0; i<2*n; i++) c[i] = 0;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
c[i+j] += a[i] * b[j];
}
}
}
优化到 nlogn
1、多项式的两种表示方法
我们熟知的是多项式的系数表示法,通过给定一组 { a0,a1,...,an−1} 来确定一个唯一的多项式:
A(x)=a0+a1x+a2x2+a3x3+...+an−1xn−1