终于补完坑了哈哈哈

这个东西很神奇,看了半天网上的解释和课件,研究了很长时间,算是大概明白了它的原理。

话不多说先上图。

我们要求的h(x)=f(x)*g(x),f(x)=Σai*x^i,g(x)=Σbi*x^i.

朴素求复杂度是$n^2$的,但一个$x$次多项式在平面上可以由$x+1$个点唯一插值表示,所以我们可以先用求出$x+1$个点$(xi,f(xi))$和$(xi,g(xi))$,再求出$(xi,f(xi)*g(xi))$,就可以反解出$h(x)$的表达式。

那么我们需要在$nlogn$的时间内干完这两步,首先xi的取值需要特殊取,令$xi=ζ_{n}^i$(不懂复数的同学可以自行百度),令n(多项式次数,不够的话也要补)=$2^m$,那么

$(ζ_n^k=ζ_{n/2}^{k/2})$

这显然是一个分治的形式,一个节点可以转移到下一层的两个节点,而每个节点又由上一层的两个节点转移,一共$logn$层,所以复杂度是$nlogn$的。

所以按这个式子分治下去,a0,a2,a4会不停排到前边去,最后的顺序变成图里的0,4,2,6,1,5,3,7,即把它们的二进制补零后翻转然后重新排序(证明很好证,可以自行脑补)。

放代码。

    typedef complex<double> E;
for (int i = ; i < n; i <<= )
{
E wn(cos(pi / i), f*sin(pi / i));
for (int j = ; j < n; j += (i << ))
{
E w(, );
for (int k = ; k < i; k++, w *= wn)
{
E x = a[j + k],y=w*a[j+k+i];
a[j + k] = x + y; a[j + k + i] = x - y;
}
}
}

第一个循环枚举每回合并的区间长度,然后j每回跳2*i个单位,前i个由x+y转移,后i个由x-y转移,对应图上由左边和左下转移的点和由左边和左上转移的点,至于为什么这么转移。。。。。

第i层第k(从0开始)个节点代表的意义是把ζ(2^i,k%(2^i))带进一个多项式里所得的值,多项式为a0+a1*x+a2*x^2......,其中a数组是排好序的,举个例子:第二列第一个点是

a0+a4(原数组的第四个)*x,第三个点为a2+a6*x,第四个也为a2+a6*x(不过因为x不同所以值不同),第三列第五个为a1+a5*x+a3*x^2+a7*x^3。

又因为ζ(n,k)=-ζ(n,k+n/2),参考分治形式转移就很好解释了。

1号点的x=ζ(2,0),二号点为ζ(2,1),

f1=a0+a4*ζ(2,0)=f(3)+f(4)*ζ(2,0),

f2=a0+a4*ζ(2,1)=a0-a4*ζ(2,2)=a0-a4*ζ(2,0)=f(3)-f(4)*ζ(2,0)。

这就可以解释代码中w值相同但一个正一个负了。

(有什么不懂的地方可以留言,我会及时补充的>_<)。

(感谢lty大佬的帮助 )。

FFT 快速傅里叶变换浅析的更多相关文章

  1. FFT 快速傅里叶变换 学习笔记

    FFT 快速傅里叶变换 前言 lmc,ikka,attack等众多大佬都没教会的我终于要自己填坑了. 又是机房里最后一个学fft的人 早背过圆周率50位填坑了 用处 多项式乘法 卷积 \(g(x)=a ...

  2. CQOI2018 九连环 打表找规律 fft快速傅里叶变换

    题面: CQOI2018九连环 分析: 个人认为这道题没有什么价值,纯粹是为了考算法而考算法. 对于小数据我们可以直接爆搜打表,打表出来我们可以观察规律. f[1~10]: 1 2 5 10 21 4 ...

  3. 「学习笔记」FFT 快速傅里叶变换

    目录 「学习笔记」FFT 快速傅里叶变换 啥是 FFT 呀?它可以干什么? 必备芝士 点值表示 复数 傅立叶正变换 傅里叶逆变换 FFT 的代码实现 还会有的 NTT 和三模数 NTT... 「学习笔 ...

  4. FFT —— 快速傅里叶变换

    问题: 已知A[], B[], 求C[],使: 定义C是A,B的卷积,例如多项式乘法等. 朴素做法是按照定义枚举i和j,但这样时间复杂度是O(n2). 能不能使时间复杂度降下来呢? 点值表示法: 我们 ...

  5. [C++] 频谱图中 FFT快速傅里叶变换C++实现

    在项目中,需要画波形频谱图,因此进行查找,不是很懂相关知识,下列代码主要是针对这篇文章. http://blog.csdn.net/xcgspring/article/details/4749075 ...

  6. matlab中fft快速傅里叶变换

    视频来源:https://www.bilibili.com/video/av51932171?t=628. 博文来源:https://ww2.mathworks.cn/help/matlab/ref/ ...

  7. FFT快速傅里叶变换算法

    1.FFT算法概要: FFT(Fast Fourier Transformation)是离散傅氏变换(DFT)的快速算法.即为快速傅氏变换.它是根据离散傅氏变换的奇.偶.虚.实等特性,对离散傅立叶变换 ...

  8. FFT快速傅里叶变换

    FFT太玄幻了,不过我要先膜拜HQM,实在太强了 1.多项式 1)多项式的定义 在数学中,由若干个单项式相加组成的代数式叫做多项式.多项式中的每个单项式叫做多项式的项,这些单项式中的最高项次数,就是这 ...

  9. [学习笔记]FFT——快速傅里叶变换

    大力推荐博客: 傅里叶变换(FFT)学习笔记 一.多项式乘法: 我们要明白的是: FFT利用分治,处理多项式乘法,达到O(nlogn)的复杂度.(虽然常数大) FFT=DFT+IDFT DFT: 本质 ...

随机推荐

  1. PHP 装饰器模式

    装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...

  2. 应用SqlGeometry无法加载sqlserverspatial.dll

    最近需要完成一个API,通过用户上传的经纬度判断用户的所在县市省,数据量相对不是很大所以把相关数据全部扔到了内存里知行,主要用到了SqlGeometry, 代码写完后运行本地没问题,扔到服务器上开始报 ...

  3. Struts2框架深入详解版

    一.认识Struts2 1. 什么是Web框架? 1.1  模型1 1.2  模型2 和MVC 1.3   Web框架的诞生 2. Struts1 到Struts2 2.1 其他 Web框架 2.2 ...

  4. 《C#开发常用免费WebServices集合》

    天气预报 Web服务,数据来源于中国气象局 公用事业 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx 中国股票行情 分时走势预览 ...

  5. BFC深入理解

    BFC 在上一篇文章中,清除浮动方法解析,我们谈及了一些使用css属性解决浮动带来的影响.但是在解决浮动带来的影响的方法中,如果细心思考,会产生如下疑问: 为什么overflow可以清除浮动带来的影响 ...

  6. HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本 ,请添加处理程序。如果下载文件,请添加 MIME 映射。 IIS站点中添加WCF项目后浏览网站报错解决方法。

    vs2013 wcf服务 windows10 家庭中文版 上图中的红色没有出现就按照下面的方法做: 按照上图所示勾选. 刷新上图中你的网站,查看上图右边的内容是否出现,如果出现,再次重新浏览网站,看一 ...

  7. 前端css框架SASS使用教程(转)

    一.什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常的一 ...

  8. 【极品代码】一般人我不告诉他,手机端h5播放时不自动全屏代码

    已测适用于ios,某些安卓手机微信下播放视频会出现播放器控件(这个实在是无力吐槽噢,因为之前还遇到过微信播放完视频后竟然无法退出全屏出现广告的情况,只有播放完后刷新页面并且要放到框架页里才能屏蔽微信视 ...

  9. webservice入门实例,CXF方式

    1.下载CXF,及先关jar包. CXF 下载地址:http://cxf.apache.org/download.html,选择"File"列中的zip格式下载.解压后可以看到一些 ...

  10. Eclipse中JAR System library 没有怎么添加?

    1.打开  >>  Eclipse 2.右击项目   >>  Build path  >>  Configure Build path  如图1: 图1 3.进入 ...