关于FFT原理部分的介绍,在网上已经有很多了,所以在此只讲代码实现部分的内容。

原理可以参考https://www.cnblogs.com/RabbitHu/p/FFT.html

推荐看完它的原理解释再来看这里的代码解释

废话不多说,上代码(多项式乘法)

#include <iostream>
#include <cstdio>
#include <cmath>
#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<lim;i++)
{
//处理每一个系数在分治过程中的实际位置;
//if是因为只需交换一次,所以选择由小的一方来执行
if(i<rev[i]) swap(arr[i],arr[rev[i]]);
}
for(int i=2;i<=lim;i*=2)//枚举区间长度
{
int l=i/2;
for(int j=0;j<lim;j+=i)//枚举区间位置,这些区间是互不相交的
{
//枚举带入的单位根w(k,l),k>=l的单位根也可以在这里一并求出
for(int k=0;k<l;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<lim;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-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代码详解的更多相关文章

  1. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  2. ASP.NET MVC 5 学习教程:生成的代码详解

    原文 ASP.NET MVC 5 学习教程:生成的代码详解 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...

  3. Github-karpathy/char-rnn代码详解

    Github-karpathy/char-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-1-10 ...

  4. 代码详解:TensorFlow Core带你探索深度神经网络“黑匣子”

    来源商业新知网,原标题:代码详解:TensorFlow Core带你探索深度神经网络“黑匣子” 想学TensorFlow?先从低阶API开始吧~某种程度而言,它能够帮助我们更好地理解Tensorflo ...

  5. JAVA类与类之间的全部关系简述+代码详解

    本文转自: https://blog.csdn.net/wq6ylg08/article/details/81092056类和类之间关系包括了 is a,has a, use a三种关系(1)is a ...

  6. Java中String的intern方法,javap&cfr.jar反编译,javap反编译后二进制指令代码详解,Java8常量池的位置

    一个例子 public class TestString{ public static void main(String[] args){ String a = "a"; Stri ...

  7. Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测

    Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测 2017年12月13日 17:39:11 机器之心V 阅读数:5931   近日,Artur Suilin 等人发布了 Kaggl ...

  8. 基础 | batchnorm原理及代码详解

    https://blog.csdn.net/qq_25737169/article/details/79048516 https://www.cnblogs.com/bonelee/p/8528722 ...

  9. 非极大值抑制(NMS,Non-Maximum Suppression)的原理与代码详解

    1.NMS的原理 NMS(Non-Maximum Suppression)算法本质是搜索局部极大值,抑制非极大值元素.NMS就是需要根据score矩阵和region的坐标信息,从中找到置信度比较高的b ...

随机推荐

  1. [Atcoder AGC029C]Lexicographic constraints

    题目大意:给定$n$个字符串的长度$a_i$,问至少用几种字符可以构造出字符串$s_1\sim s_n$,满足$|s_i|=a_i$且$s_1<s_2<\cdots<s_n$. $ ...

  2. Java学习:单列集合Collection

    集合 学习集合的目标: 会使用集合存储数据 会遍历集合,把数据取出来 掌握每种集合的特性 集合和数组的区别 数组的长度是固定的.集合的长度是可变的. 数组中存储的是同一类型的元素,可以存储基本数据类型 ...

  3. Springboot 基于的SAP项目环境配置

    做SAP开发,感觉最难的莫过于前期的环境了,也就是说让程序能跑起来.. 最重要的有三个文件(较新版本,jco lib版本721.800) 下载libsapjco3.so.sapjco3.dll.sap ...

  4. ip2region.jar实现ip转地址

    ip转地址 根据ip地址查询出所在地址. GitHub地址 https://github.com/lionsoul2014/ip2region/ pom坐标 <dependency> &l ...

  5. JS JQUERY实现滚动条自动滚到底的方法

    $(function(){ var h = $(document).height()-$(window).height(); $(document).scrollTop(h); }); \ windo ...

  6. 你可能还不知道的关于JavaScript类型的细节?

    类型 七种类型: Undefined Null Boolean String Number Symbol Object Undefined.Null 阅读问题:为什么有的编程规范要求使用void 0 ...

  7. adb shell get/setprop, setenforce...

    adb shell getprop <key> 获取设备参数信息adb shell setprop <key> <value> 设置设备参数信息 例子1:>C ...

  8. Android中控件AutoCompleteTextView的使用方法和一些属性

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  9. 量化金融策略开源框架:QUANTAXIS

    简介: QUANTAXIS量化金融策略框架,是一个面向中小型策略团队的量化分析解决方案,是一个从数据爬取.清洗存储.分析回测.可视化.交易复盘的本地一站式解决方案. QUANTAXIS量化金融策略框架 ...

  10. pycharm 里运行 django 工程 You must either define the environment variable DJANGO_SETTINGS_MODULE 错误

    pycharm 里运行 django 工程出现错误(在命令行直接运行ok): django.core.exceptions.ImproperlyConfigured: Requested settin ...