关于FFT原理部分的介绍,在网上已经有很多了,所以在此只讲代码实现部分的内容。
推荐看完它的原理解释再来看这里的代码解释
废话不多说,上代码(多项式乘法)
#include
#include
#include
#define N 4000001
using namespace std;
struct cp//手写复数类可以卡常
{
double real,imag;
};
cp operator +(cp a,cp b)
{
return (cp){a.real+b.real,a.imag+b.imag};
}
cp operator -(cp a,cp b)
{
return (cp){a.real-b.real,a.imag-b.imag};
}
复数乘法:设$R_{a}$表示$a$的实部系数,$I_{a}$表示$a$的虚部系数
则$a*b$
$=(R_{a}+I_{a})*(R_{b}+I_{b})$
$=R_{a}*R_{b}+R_{a}*I_{b}+R_{b}*I_{a}+I_{a}*I_{b}$
因为$i^2=-1$
所以结果的实部为$R_{a}*R_{b}-I_{a}*I_{b}$
虚部为$R_{a}*I_{b}+R_{b}*I_{a}$
cp operator *(cp a,cp b)
{
return (cp){a.real*b.rea