关于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.real-a.imag*b.imag,a.real*b.imag+a.imag*b.real};

}

double pi=acos(-1.0);

int lim,rev[N],len;

cp w[N],inv[N],a[N],b[N];

void get_w()

{

for(int i=0;i<=lim;i++)

{

double angle=(double)i*2*pi/lim;

w[i].imag=sin(angle);

w[i].real=cos(angle);

inv[i]=(cp){w[i].real,-w[i].imag};

}

}

fft参数解释

$arr:$系数数组,在$fft$后变为点值数组,$arr_{i}$表示将$w^i_n$带入多项式后求得的值

$w:$预处理好的w单位根,在$fft$的时候正常带入即可,在$idft$的时候带入单位根的倒数(具体参见$idft$)void fft(cp *arr,cp *w)

{

for(int i=0;i

{

//处理每一个系数在分治过程中的实际位置;

//if是因为只需交换一次,所以选择由小的一方来执行

if(i

}

for(int i=2;i<=lim;i*=2)//枚举区间长度

{

int l=i/2;

for(int j=0;j

{

//枚举带入的单位根w(k,l),k>=l的单位根也可以在这里一并求出

for(int k=0;k

{

意义变更

在这里$arr$的意义从系数变为$w^k_i$的点值,$a_{j,j+i-1}$分别表示将$w^{0,i-1}_i$的点值

下面的的t相当于文首博客中的$w^k_n * A_2(w^k_{n \over 2})$

cp t=arr[j+k+l]*w[lim/i*k];//w(k,i)=w(k/i,1)=w(n*k/i,n)

arr[j+k+l]=arr[j+k]-t;

arr[j+k]=arr[j+k]+t;

}

}

}

}

int main()

{

int n,m;

cin>>n>>m;

for(int i=0;i<=n;i++) scanf("%lf",&a[i].real);

for(int i=0;i<=m;i++) scanf("%lf",&b[i].real);

lim=1;

while(lim<=n+m)len++,lim<<=1;//这样会比用cmath的log要快?

for(int i=0;i>1]>>1)|((i&1)<

get_w();

fft(a,w);

fft(b,w);

for(int i=0;i<=lim;i++) a[i]=a[i]*b[i];

fft(a,inv);

for(int i=0;i<=n+m;i++) printf("%d ", (int)(a[i].real/lim+0.5));

//除以lim的原因具体参见idft,0.5是为了四舍五入

}

fft qt 代码_FFT代码详解相关推荐

  1. java 注释 超链接_java_Java代码注释规范详解,代码附有注释对程序开发者来 - phpStudy...

    Java代码注释规范详解 代码附有注释对程序开发者来说非常重要,随着技术的发展,在项目开发过程中,必须要求程序员写好代码注释,这样有利于代码后续的编写和使用. 基本的要求: 1.注释形式统一 在整个应 ...

  2. php调用C代码的方法详解和zend_parse_parameters函数详解

    来源:http://my.oschina.net/Customs/blog/490873 http://blog.csdn.net/super_ufo/article/details/3863731 ...

  3. c调用python脚本如何获取结果_使用C++调用Python代码的方法详解

    一.配置python环境问题 1.首先安装Python(版本无所谓),安装的时候选的添加python路径到环境变量中 安装之后的文件夹如下所示: 2.在VS中配置环境和库 右击项目->属性-&g ...

  4. Tomcat 项目代码上线步骤详解

    Tomcat 项目代码上线步骤详解 1.上线内容(JSP代码,图片,包文件(jar|war|ear)) 2.上线内容来源 a.开发人员提供(邮件形式).tar.gz 压缩包(包文件开发负责编译 编译命 ...

  5. python交互式和文件式区别_Python 运行.py文件和交互式运行代码的区别详解

    代码版本:3.6.3 1. 交互式运行代码会直接给出表达式的结果,运行代码文件必须print才能在控制台看到结果. 直接给出结果: 没有print是看不到结果的: 有print才能看到结果: 另:交互 ...

  6. 史上最详细的Pytorch版yolov3代码中文注释详解(四)

    史上最详细的Pytorch版yolov3代码中文注释详解(一):https://blog.csdn.net/qq_34199326/article/details/84072505 史上最详细的Pyt ...

  7. Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自:http://xiaozu.renren.com/xiaozu/106512/336681453 function [center, U, obj_fc ...

  8. Apollo6.0代码Lattice算法详解——Part4:计算障碍物ST/SL图

    Apollo6.0代码Lattice算法详解--Part4:计算障碍物ST/SL图 0.前置知识 1.涉及主要函数 2.函数关系 3.部分函数代码详解 3.1 lattice_planner.cc中代 ...

  9. Apollo6.0代码Lattice算法详解——Part5: 生成横纵向轨迹

    Apollo6.0代码Lattice算法详解--Part5: 生成横纵向轨迹 0.前置知识 1.涉及主要函数 2.函数关系 3.部分函数代码详解 3.1 lattice_planner.cc中代码部分 ...

  10. Java: static,final,代码块 的详解

    Java: static,final,代码块 的详解 每博一文案 山本文绪说过这样一句话:哪些决定放弃了的事,就请放弃得干干净净.哪些决定再也不见面的人,就真 的不要再见面了,不要再做背叛自己的事,如 ...

最新文章

  1. nginx try_files的理解
  2. Ambari安装之部署 (Metrics Collector和 Metrics Monitor) Install Pending ...问题
  3. vuex分模块后,如何获取state的值
  4. OpenGL 与 GLSL 版本号
  5. Leetcode PHP题解--D5 804. Unique Morse Code Words
  6. c语言作业答案N个公约数公倍数,c语言程序题,输入两个正整数m和n,求其最大公约数和最小公倍数。...
  7. Spring —— 静态成员的注入
  8. html框架 book,HTML框架的基本结构的.doc
  9. c语言仿宋gb2312字体,仿宋gb2312字体
  10. 高等数学(第七版)同济大学 总习题八 个人解答
  11. 四路模拟高清解码,CVI,四通道多合一同轴高清解码芯片方案
  12. LibreOffice 6.2.2 Office办公套件发布
  13. 结构体类型的定义及所占内存的字节数
  14. 自己动手提高ubuntu性能
  15. .h文件和.cpp文件组织结构
  16. LTE系统名词解释及上下行过程
  17. [BUUCTF] 逆向 reverse1
  18. 用数学书写的人生格言
  19. 内核解惑:zw函数和nt函数的区别
  20. java抽象类列子_Java 抽象类,求个范例

热门文章

  1. 系统字体服务器,把字体放到服务器
  2. python win32api键盘_Python win32api.keybd_event模拟键盘输入
  3. STM32控制AD7124采集调试流程
  4. 64行代码实现简单人脸识别
  5. 非 ROOT 安卓内录
  6. 羡慕写字漂亮的人,怎么样练字?
  7. eclipse配置java环境_java环境搭建(Eclipse)
  8. 傅里叶光学MATLAB编程系列【1】基本函数
  9. 精锐万能票据打印专家
  10. 思考的乐趣-Matrix67数学笔记