FFT是什么?

FFT是快速傅里叶变换(fast Fourier transform)的简称。在ACM领域主要是用来快速求解多项式乘法的算法,

在信号领域也有很大用途


基础知识

  1. 卷积

    举个例子,给你两个向量 \(a (a_0, a_1, a_2), b(b_0, b_1, b_2)\)

    a和b的卷积就是$ ( a_0b_0, a_1b_0+a_0b_1, a_2b_0+a_1b_1+a_0b_2, a_1b_2+a_2b_1, a_2b_2 ) \(
    即可以看作两个多项式\)A(x)=a_0+a_1x1+a_2x2和B(x)=b_0+b_1x+b_2x^2\(相乘。
    所以卷积就可看做多项式乘法。那些形如\)c_k = \Sigma_{i=0}^{k}a_ib_{k-i}$卷积的就可以类比成多项式乘法 ,就可通过fft快速求解。

  2. 多项式

    • 多项式有两种表达形式
    • 一种是系数表达形如\(A(x) = \Sigma_{i=0}^{n-1} a_ix^i\)
    • 另一种是点值表达, 形如\((x_1, y_1), (x_2, y_2), (x_3, y_3)...(x_m, y_m)\), 且m>=n
    • 多项式的点值表示和插值表示可以互推
  3. \(w_n=e^{2\pi i/n}\)

    • \(w_n^{n/2+k}=-w_n^k\)
    • \(w_n^{2k}=w_{n/2}^k\)
    • $ \Sigma_{j=0}{n-1}w_n{jk}= (k%n==0)?n:0$

傅里叶变换的原理

在傅里叶变换里面系数表达和点值表达如何互推?

一个暴力点的方法

系数表达->点值表达 \(y_k = \Sigma_{i=0}^{n-1}a_iw_n^{ki}\)

点值表达->系数表达 \(a_k = 1/n*\Sigma_{i=0}^{n-1}y_iw_n^{-ki}\)

证明看黑板

所以不论是系数表达推点值表达还是点值表达推系数表达方法都一样

如何快速的求出上面的式子呢

假设 $A(x)=a_0+a_1x+a_2x2+...+a_{n-1}x{n-1} \(
那\)A(x)=(a_0+a_2x2+a_4x4+...+a_{n-2}x{n-2})+(a_1x+a_3x3+..+a_{n-1}x^{n-1})\(
令\)A_0(x)=a_0+a_2x+a_4x2+...+a_{n-2}x{n/2-1}, A_1(x)=a_1+a_3x+a_5x+...+a_{n-1}x^{n/2-1}\(
则\)A(x) = A_0(x2)+xA_1(x2)\(
那么就可以用\)A_0(w_{n/2}^0), A_0(w_{n/2}^1) ... A_0(w_{n/2}^{n/2-1})$ 和 \(A_1(w_{n/2}^0), A_1(w_{n/2}^1) ... A_1(w_{n/2}^{n/2-1}\)

得出\(A(w_{n}^0), A(w_{n}^1) ... A(w_{n}^{n-1})\)

\(所以可以采用递归分治的办法求解FFT\)

分治图

void ntt(ll* a, int n, int t) {
rep(i, 0, n) {
int rv = rev(i,n);
if(i<rv) swap(a[i], a[rv]);
}
ll g=1;
if(t==1) g=3;
else g=inv[3];
for(int m=2; m<n+1; m<<=1) {
ll wm= mypow(g, (MOD-1)/m);
int mid=m>>1;
for(ll *p=a; p<a+n; p+=m) {
ll w=1;
rep(i, 0, mid) {
ll t=w*(p[mid+i]);
p[mid+i] = p[i]-t;
p[i] = p[i]+t;
w = w*wm%MOD; p[i]=%MOD, p[mid+i]%=MOD;
}
}
}
if(t==-1) {
rep(i, 0, tn)
a[i]=a[i]*inv[n]%MOD;
}
}
void fft(ll *a, ll* b, int n) {
int tn=MAXN;
while(tn/4>=n) tn>>=1;
ntt(a, tn, 1);
ntt(b, tn, 1);
rep(i, 0, tn)
a[i] = a[i]*b[i]%MOD;
ntt(a, tn, -1);
}

NTT \(w_n=g^{(P-1)/n}\%P\)

FFT 专题讲解的更多相关文章

  1. Activity Process Task Application 专题讲解

    Activity Process Task Application 专题讲解 Activity.和进程 为了阅读方便,将文档转成pdf http://files.cnblogs.com/franksu ...

  2. 13Mybatis_SqlMapConfig.xml专题讲解

    Mybatis的SqlMapConfig.xml中以下的标签: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandlers(类型处理器 ...

  3. Android中View的绘制流程(专题讲解)

    Android中的UI视图有两种方式实现:.xml文件(实现代码和UI的分离)和代码实现. Android的UI框架基本概念: 1. Activity:基本的页面单元,Activity包含一个Wind ...

  4. LeetCode递归 -2(Recursion) 培训专题 讲解文章翻译 (附链接) (2019-04-09 15:50)

    递归 - 空间复杂度  在本文中, 我们将讨论如何分析递归算法的空间复杂度. 在计算递归算法的空间复杂度时,最需要考虑的两个部分就是: 递归相关空间 (recursion related space) ...

  5. LeetCode 递归(Recursion) 培训专题 讲解文章翻译 (附链接)

     递归 - 时间复杂度 在本文中, 我们主要介绍如何分析递归算法程序中的时间复杂度.. 在一个递归程序中, 它的时间复杂度 O(T) 一般来说就是他总共递归调用的次数 (定义为 R) 以及每次调用时所 ...

  6. 火柴排队(NOIP2013)(附树状数组专题讲解(其实只是粗略。。。))

    原题传送门 首先,这道题目是一道神奇的题. 看到这道题,第一眼就觉得2个数组排个序,然后一一对应的时候一定差值最小. 由于我们可以将这2个数列同时进行调换. 所以我们先把2个数列排个序. 第二个序列中 ...

  7. H3C路由器登录策略专题讲解

    password-control login-attempt login-times [ exceed { lock | lock-time time | unlock } ] undo passwo ...

  8. javascript进阶系列专题:作用域与作用域链

    字面意思,作用域是指变量和函数的作用范围,换言之,作用域决定了变量和函数的可见性和有效时间.javascript作用域是用函数来区分,与其他语言的大括号不同. for (var i=0; i<5 ...

  9. 在 Visual Studio 2013 中创建 ASP.NET Web 项目(0):专题导航 [持续更新中]

    写在前面的话 随着 Visual Studio 2013 的正式推出,ASP.NET 和 Visual Studio Web 开发工具 也发布了各自的最新版本. 新版本在构建 One ASP.NET ...

随机推荐

  1. WebAssembly:随风潜入夜

    What? WebAssembly 是一种二进制格式的类汇编代码,可以被浏览器加载和并进一步编译成可执行的机器码,从而在客户端运行.它还可以作为高级语言的编译目标,理论上任何语言都可以编译为 WebA ...

  2. Docker部署DVWA

    上次在Docker手动配置了一个Ubuntu的Lamp镜像,这次来试验一下使用这个镜像部署一个简单的web应用吧. 首先从Lamp镜像运行一个容器 root@VM-149-127-debian:~/a ...

  3. 将notepad++打造成java快速开发IDE

    参考文章:http://blog.csdn.net/mdyyzc/article/details/7653096 有时候要试验一小段代码,打开eclipse又需要忍受漫长的煎熬(电脑配置较低,见谅). ...

  4. powershell 统计AD中所有计算机及对应的操作系统信息

    要想用powershell管理域,首先先加载activedirectory模块 PS C:\> import-module activedirectory 下面就可以利用get-adcomput ...

  5. electron 使用 node-ffi C++ 动态链接库(DLL)

    一.为什么需要使用DLL 需要使用系统 API 操作或扩展应用程序: 需要调用第三方的接口API,特别是与硬件设备进行通信,而这些接口 API 基本上都是通过 C++ 动态链接库(DLL)实现的: 需 ...

  6. 以图像分割为例浅谈支持向量机(SVM)

    1. 什么是支持向量机?   在机器学习中,分类问题是一种非常常见也非常重要的问题.常见的分类方法有决策树.聚类方法.贝叶斯分类等等.举一个常见的分类的例子.如下图1所示,在平面直角坐标系中,有一些点 ...

  7. SpringMVC+Mybatis+MySQL配置Redis缓存

    SpringMVC+Mybatis+MySQL配置Redis缓存 1.准备环境: SpringMVC:spring-framework-4.3.5.RELEASE-dist Mybatis:3.4.2 ...

  8. (转)VmWare下安装CentOS7图文安装教程

    场景:克服安装Linux的恐惧,想装就装.在一篇博客中看到的,很有借鉴意义   欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源 ...

  9. 完整版百度地图点击列表定位到对应位置并有交互动画效果demo

    1.前言 将地图嵌入到项目中的需求很多,好吧,我一般都是用的百度地图.那么今天就主要写一个完整的demo.展示一个列表,点击列表的任一内容,在地图上定位到该位置,并有动画效果.来来来,直接上demo  ...

  10. 修改wampsever默认密码

    wamp初始默认mysql账号:root 密码: 空 准备修改为,账号:root 密码:xys829475 1.在phpMyAdmin界面中点击[用户],将用户概况中的所有用户名为[root]的用户的 ...