终于补完坑了哈哈哈

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

话不多说先上图。

我们要求的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. Mysql FROM_UNIXTIME效率 VS PHP date()效率 数据说话!

    这几天在做数据统计,有几个统计图的需求是这样的: 按照年.月.日统计订单数量, 比方一年12个月,统计出1月多少订单,二月多少订单,按照这种模式统计. 但是数据库里存放的是 timestamp  的  ...

  2. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  3. CSS常用渐变

    边框渐变: border-image: -webkit-linear-gradient( red , blue) 30 30; border-image: -moz-linear-gradient( ...

  4. Microsoft Dynamics CRM 解决数据大于5000时,页面上只能导出5000+数据。

    页面显示: update [MSCRM_CONFIG].[dbo].[DeploymentProperties] set IntColumn=10000 --调整成10000+   页面导出: 一.在 ...

  5. 酷欧天气(CoolWeather)应用源码

    <ignore_js_op> 181420yank2y45klayhaan.jpg (35 KB, 下载次数: 0) 下载附件  保存到相册 2016-3-29 15:09 上传   酷欧 ...

  6. Spring 4 使用Freemarker模板发送邮件&添加附件

    前言 Spring对Java的邮件发送提供了很好的支持,提供了超级简单的API,大大简化了Java邮件发送功能的开发. Spring对Email的支持是基于JavaMail API开发的,所以,我们在 ...

  7. cstore_fdw的安装使用以及源码分析

    一.cstore_fdw的简介 https://github.com/citusdata/cstore_fdw,此外部表扩展是由citusdata公司开发,使用RC_file格式对数据进行列式存储. ...

  8. 如何在github上下载单个文件夹?

    作者:ce ge链接:https://www.zhihu.com/question/25369412/answer/96174755来源:知乎著作权归作者所有,转载请联系作者获得授权. Git1.7. ...

  9. python注释、脚本参数、字节码

    python注释.脚本参数.字节码 --道心 python安装 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\python27 3. ...

  10. Git各大平台(win/Linux/Mac)图形化界面客户端大汇总

    摘要: 介绍各平台下的图形化界面git客户端(本人并没有全部使用过),欢迎大家补充新的软件或者使用感受~  一.TortoiseGit - The coolest Interface to Git V ...