实在是 美丽的数学啊

关于傅里叶变换的博客 讲的很细致 图片非常易于理解http://blog.jobbole.com/70549/

大概能明白傅里叶变换是干吗的了

但是还是不能明白为什么用傅里叶变换来算多项式求和

在多项式中,DFT就是系数表式转换成点值表示的过程。

我们熟知的是多项式的系数表示法,通过给定一组  来确定一个唯一的多项式:

而多项式还可以有另一种表示法,称为点值表示法

其中

可以证明,对一组互不相同的该方法也可以唯一地表示一个多项式。

为什么要引入点值表示法这个并不“直观”的形式呢?下表显示了它的好处:

执行运算 系数表示 点值表示
A(x)+B(x) O(n) O(n)
A(x)∗B(x) O(n2) O(n)

*当然,点值表示法下的运算均要求 A(x)和 B(x) 所取的点集 {x0,x1,...,xn−1}是相同的,且运算出的 C(x) 也为点值表示法。

FFT只是快速的求DFT的方法罢了,不是一个新的概念。 在ACM-ICPC竞赛中, FFT算法常被用来为多项式乘法加速。

FFT原理就是通过奇偶分开,把规模减半,递归分治 在O(nlogn)时间内完成DFT运算

普通的计算多项式乘法的计算,时间复杂度O(n2)O(n2)。而FFT先将多项式点值表示(O(nlogn)),在O(n)下完成对点值的乘法,再以O(nlogn)O(nlog⁡n)完成IFFT,重新得到系数表示。

利用FFT求卷积

普通的计算多项式乘法的计算,时间复杂度O(n2)O(n2)。而FFT先将多项式点值表示(O(nlogn)),在O(n)下完成对点值的乘法,再以O(nlogn)完成IFFT,重新得到系数表示。

步骤一(补0)

在两个多项式前面补0,得到两个2n次多项式,设系数向量分别为v1v1和v2v2。

步骤二(求值)

使用FFT计算f1=DFT(v1)和f2=DFT(v2)。则f1f1与f2f2为两个多项式在2n2n次单位根处的取值(即点值表示)。

步骤三(乘法)

把f1f1与f2f2每一维对应相乘,得到ff,代表对应输入多项式乘积的点值表示。

步骤四(插值)

使用IFFT计算v=IDFT(f),其中vv就是乘积的系数向量。

综上

fft(x1, len, 1);
fft(x2, len, 1);
for (int i = 0;i < len;i++) {x[i] = x1[i] * x2[i];
}
fft(x, len, -1);

FFT算法步骤:https://wenku.baidu.com/view/8bfb0bd476a20029bd642d85.html

kuangbin模板:

const double PI = acos(-1.0);
//复数结构体
struct complex
{double r,i;complex(double _r = 0.0,double _i = 0.0){r = _r; i = _i;}complex operator +(const complex &b){return complex(r+b.r,i+b.i);}complex operator -(const complex &b){return complex(r-b.r,i-b.i);}complex operator *(const complex &b){return complex(r*b.r-i*b.i,r*b.i+i*b.r);}
};
/** 进行FFT和IFFT前的反转变换。* 位置i和 (i二进制反转后位置)互换* len必须去2的幂*/
void change(complex y[],int len)
{int i,j,k;for(i = 1, j = len/2;i < len-1; i++){if(i < j)swap(y[i],y[j]);//交换互为小标反转的元素,i<j保证交换一次//i做正常的+1,j左反转类型的+1,始终保持i和j是反转的k = len/2;while( j >= k){j -= k;k /= 2;}if(j < k) j += k;}
}
/** 做FFT* len必须为2^k形式,* on==1时是DFT,on==-1时是IDFT*/
void fft(complex y[],int len,int on)
{change(y,len);for(int h = 2; h <= len; h <<= 1){complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h));for(int j = 0;j < len;j+=h){complex w(1,0);for(int k = j;k < j+h/2;k++){complex u = y[k];complex t = w*y[k+h/2];y[k] = u+t;y[k+h/2] = u-t;w = w*wn;}}}if(on == -1)for(int i = 0;i < len;i++)y[i].r /= len;
}

沃尔什变换https://www.cnblogs.com/ACMLCZH/p/8022502.html

主要功能是求:,其中为集合运算符。

  就像FFT一样,FWT是对数组的一种变换,我们称数组X的变换为FWT(X)。

  所以FWT的核心思想是:

    为了求得C=A★B,我们瞎搞搞出一个变换FWT(X),

    使得FWT(C)=FWT(A)  FWT(B),然后根据FWT(C)求得C。

    (其中★表示卷积运算,表示将数组对应下标的数相乘的运算)

    也就是说我们可以通过FWT(X)变换把复杂度O(n^2)的★运算变为O(n)的运算。

  跟FFT是完全相同的。所以我们考虑怎么搞出这个FWT(X)。

转载于:https://www.cnblogs.com/wyboooo/p/9643385.html

FFT【快速傅里叶变换】FWT【快速沃尔什变换】相关推荐

  1. c语言做快速傅里叶变换和快速逆傅里叶变换

    C语言做快速傅里叶变换和快速逆傅里叶变换 快速傅里叶变换(FFT)和快速逆傅里叶变换(IFFT)要求做傅里叶变换的数据点数只能是2的整数次幂,比如2,4,8,16,32,64,128,256,512, ...

  2. 快速傅里叶变换python_快速傅里叶变换及python代码实现

    一.前言 我想认真写好快速傅里叶变换(Fast Fourier Transform,FFT),所以这篇文章会由浅到细,由窄到宽的讲解,但是傅里叶变换对于寻常人并不是很容易理解的,所以对于基础不牢的人我 ...

  3. FFT 快速傅里叶变换 NTT 快速数论变换

    SDNU 1531 a*b III (FFT模板) Description 计算a乘b,多组输入(50组以内). Input 输入a b,数据范围0 <= a,b <= 10^100000 ...

  4. 快速傅里叶变换python_FFT快速傅里叶变换的python实现过程解析

    FFT是DFT的高效算法,能够将时域信号转化到频域上,下面记录下一段用python实现的FFT代码. # encoding=utf-8 import numpy as np import pylab ...

  5. 傅里叶变换 一维快速傅里叶变换(快速的一维离散傅里叶变换、分治法)

    一.介绍 1.一维离散傅里叶变换DFT. DFT:(Discrete Fourier Transform)离散傅里叶变换是傅里叶变换在时域和频域上都呈离散的形式,将信号的时域采样变换为其DTFT的频域 ...

  6. 离散傅里叶变换 (DFT)、快速傅里叶变换 (FFT)

    目录 离散傅里叶变换 (DFT) 离散傅里叶变换的基 离散傅里叶变换 快速傅里叶变换 (FFT) 卷积 线性时不变系统 傅里叶级数 参考文献 离散傅里叶变换 (DFT) 离散傅里叶变换的基 对于周期为 ...

  7. 卷积、傅里叶级数、傅里叶变换、快速傅里叶变换、pytorch中的fft,rfft

    卷积: 连续形式: 离散形式:  '卷' :  翻转 和 滑动    '积' : 积分 翻转:g(t)  - >  g(-t) 滑动:g(-t) - > g(n-t) 平移n个单位 举个例 ...

  8. C++ 快速傅里叶变换

    快速傅里叶变换 1 快速傅立换变换的简介 1.1 傅里叶变换的不足 1.2 快速傅里叶变换 2 快速傅里叶变换的实现 2.1一些变量的说明: 2.2代码实现 2.3程序的输出 3 小结   之前我们已 ...

  9. 傅里叶变换 一维和二维快速傅里叶变换(代码和性能的优化)

    1.介绍. 在类FourierUtils的fftProgress方法中,有这个代码段,我们可以将Complext.euler(flag * i)提前计算好,设置大小为2次幂N,如果没有的话,也要调节到 ...

  10. [多项式算法](Part 4)FWT 快速沃尔什变换 学习笔记

    其他多项式算法传送门: [多项式算法](Part 1)FFT 快速傅里叶变换 学习笔记 [多项式算法](Part 2)NTT 快速数论变换 学习笔记 [多项式算法](Part 3)MTT 任意模数FF ...

最新文章

  1. 电子工程师必须掌握的20个模拟电路
  2. 第十五届全国大学生智能汽车竞赛ROS组车模线上比赛
  3. react-native 查看对象属性
  4. Mpmovieplayercontroller 黑屏
  5. 有了 serverless,前端也可以快速开发一个 Puppeteer 网页截图服务
  6. FI 与MM SD的接口配置基本方法
  7. oracle 邻接模型,【原创】MySQL 模拟Oracle邻接模型树形处理
  8. 格鲁吉亚理工学院计算机全美排名,乔治亚理工大学环境工程排名2019年
  9. docker 日志_Filebeat 采集 Docker 日志
  10. cisco 模拟器安装及交换机的基本配置实验心得_网络工程师的Python之路 -- 自动监测网络配置变化...
  11. 问题五十四:怎么用ray tracing画参数方程表示的曲面(2)—— bezier surface
  12. 头发mod_《巫师3》:新MOD为三个大妹子,4K超清贴图看过来
  13. java本地储存set_没有数据库的情况下,JAVA如何在本地保存信息
  14. XMind 2022 使用教程
  15. 有一个测试微信删除软件叫wool,如果出现这三种情况,便可以删除这些微信好友,此操作适用所有人...
  16. 数据库设计案例(1)
  17. 图片干扰背景处理,简单易懂
  18. vue常用插件(一)
  19. 《漫画机器学习入门》总结
  20. 蓝牙通信的简要设计与开发(附加题)

热门文章

  1. 拓端tecdat|R语言中实现层次聚类模型
  2. 拓端tecdat|卡尔曼滤波器:用R语言中的KFAS建模时间序列
  3. Java从入门到精通 第5章 数据类型
  4. mysql建立聚族索引语句,MySQL学习教程之聚簇索引
  5. opencv+Dlib python大眼代码
  6. caffe上手:caffe训练一般过程--wanglei 写给自己
  7. python基于Flask构建Web服务,解决Flask数据请求中的跨域问题
  8. Neural networks and deep learning C1总结(一)
  9. mysql关于连接查询
  10. 用java判断x奇或偶_改善java程序——用偶判断,不用奇判断