在写FFT的时候,经常会遇到和生成函数的结合
一开始不是能明白,结果突然有一天顿悟了
下面就xue微谈一下生成函数,卷积和FFT的关系吧

生成函数

我们经常用生成函数解决以下问题:

设hnhnh_n为方程:3∗e1+4∗e2+2∗e3+5∗e4=n3∗e1+4∗e2+2∗e3+5∗e4=n3*e_1+4*e_2+2*e_3+5*e_4=n的非负整数解得个数。
求h0,h1,…,hn,…h0,h1,…,hn,…h_0,h_1,…,h_n,…的生成函数g(x)g(x)g(x)

解:
f1=3∗e1,f2=4∗e2,f3=2∗e3,f4=5∗e4f1=3∗e1,f2=4∗e2,f3=2∗e3,f4=5∗e4f_1=3*e_1,f_2=4*e_2,f_3=2*e_3,f_4=5*e_4
那么f1f1f_1是3的倍数,f2f2f_2是4的倍数,f3f3f_3是2的倍数,f4f4f_4是5的倍数
g(x)=(1+x3+x6+...)(1+x4+x8+...)(1+x2+x4+...)(1+x5+x10+...)g(x)=(1+x3+x6+...)(1+x4+x8+...)(1+x2+x4+...)(1+x5+x10+...)g(x)=(1+x^3+x^6+...)(1+x^4+x^8+...)(1+x^2+x^4+...)(1+x^5+x^10+...)

这样我们就可以画柿子直接计算答案了
但是如果我们从题面中提取不到元素的信息,只能通过输入得到而不能直接画柿子
这种情况下我们只能计算若干个多项式的乘法

那么我们怎么计算多项式乘法呢? 继续往下看↓

卷积

之前在浅谈数论中简单的提到了卷积中的一类:狄利克雷卷积

实际上,普通的卷积是这样的:

Cn=∑ni=1aibn−iCn=∑i=1naibn−iC_n={\sum_{i=1}^{n}a_ib_{n-i}}

这就有点像竖式乘法:

a:                 4    3    2    1
b:                 4    3    2    1
//----------------------------------1*4  1*3  1*2  1*12*4  2*3  2*2  2*13*4  3*3  3*2  3*1
c: 4*4  4*3  4*2  4*1

用心感受一下


狄利克雷卷积:

Cn=∑d|nadbndCn=∑d|nadbndC_n={\sum_{d|n}a_db_{n \over d}}

上式多用于莫比乌斯反演

观察一下,可以得到一个小规律:
a,ba,ba,b下标之和等于ccc的下标


而多项式乘法也是遵循竖式乘法原则的:
A(x)=x4+3x2+2x" role="presentation" style="position: relative;">A(x)=x4+3x2+2xA(x)=x4+3x2+2xA(x)=x^4+3x^2+2x
B(x)=x3+4x2+1B(x)=x3+4x2+1B(x)=x^3+4x^2+1
A(x)∗B(x)=x7+4x6+3x5+15x4+8x3+3x2+2xA(x)∗B(x)=x7+4x6+3x5+15x4+8x3+3x2+2xA(x)*B(x)=x^7+4x^6+3x^5+15x^4+8x^3+3x^2+2x

      7   6   5   4   3   2   1   0
A:                1   0   3   2   0
B:                    1   4   0   11*1 1*0 1*3 1*2 1*00   0   0   0   0  4*1 4*0 4*3 4*2 4*01*1 1*0 1*3 1*2 1*0
A*B:  1   4   3  15   8   3   2

实际上,多项式乘法就是两个函数的卷积
C(x)=A(x)∗B(x)C(x)=A(x)∗B(x)C(x)=A(x)*B(x)
Cn=∑ni=1AiBn−iCn=∑i=1nAiBn−iC_n={\sum_{i=1}^{n}A_iB_{n-i}}

我们要是按照上面的式子计算,会有多次的乘法和加法,非常慢
所以我们要引入一个快速计算多项式乘法(即卷积)的方法

FFT

FFT,说白了就是用来快速计算卷积

首先,想明白FFT,就需要知道多项式的表示方法

多项式还有什么表示方法呢?
上文提到的多项式都是系数表达,然而还有一种方法点值表达

形象点来说,就是画出多项式的图像,用图像上的点表示多项式
对于一个n次多项式,我们需要n+1n+1n+1个点来确定多项式
因为一共有n+1n+1n+1个待定的系数(a0,a1,a2,a3...,an)(a0,a1,a2,a3...,an)(a_0,a_1,a_2,a_3...,a_n),需要n+1n+1n+1个方程

为了发现点值表达的性质,我们先看一个小例子:
A(x)=x2+2x−1A(x)=x2+2x−1A(x)=x^2+2x-1
B(x)=x2−x+2B(x)=x2−x+2B(x)=x^2-x+2
C(x)=A(x)+B(x)C(x)=A(x)+B(x)C(x)=A(x)+B(x)
D(x)=A(x)B(x)D(x)=A(x)B(x)D(x)=A(x)B(x)

可以发现,当x坐标相等的时候,A和B的y坐标相乘就是D的y坐标
那么如果我们能把多项式变成点值表达,就可以用n次乘法完成卷积

然而,FFT就可以完成多项式在系数表达和点值表达之间的转化

学妹的FFT简单讲解,感觉还不错,dada们就当看着玩吧

假设我们都会了FFT,得到了A和B的点值表达,那么答案就是:

for (int i=0;i<=fn;i++) A[i]=A[i]*B[i];

但是我们在答案输出的时候,是不接受点值表达的,我们还要把点值表达转换成系数表达
这就是FFT的逆操作:IDFT

在FFT中,我们有一个主n次单位根:ωnωn\omega_n

ωkn=e2πkin=(cos(2πkn),sin(2πkn)i)ωnk=e2πkin=(cos(2πkn),sin(2πkn)i)\omega_n^k={e^{{2 \pi ki} \over n}}=(cos({{2 \pi k} \over n}),sin({{2 \pi k} \over n})i)

我们直接把A乘上ωnωn\omega_n的逆矩阵ω−1nnωn−1n\omega_n^{-1} \over n即可

而ω−1nωn−1\omega_n^{-1}就是ωnωn\omega_n的共轭复数

共轭复数:实数部分相等,虚数部分相反
ωn=(cos(2πn),sin(2πn)i)ωn=(cos(2πn),sin(2πn)i)\omega_n=(cos({{2 \pi} \over n}),sin({{2 \pi} \over n})i)
ω−1n=(cos(2πn),−sin(2πn)i)ωn−1=(cos(2πn),−sin(2πn)i)\omega_n^{-1}=(cos({{2 \pi} \over n}),-sin({{2 \pi} \over n})i)


以上就是生成函数,卷积和FFT的关系啦

浅谈生成函数+卷积+FFT相关推荐

  1. 浅谈(线性)卷积公式为什么要翻转

    浅谈(线性)卷积公式为什么要翻转 信号系统 信号处理 卷积 文章题目之所以写 (线性)卷积,是因为卷积有很多种,如循环卷积,周期卷积以及线性卷积.本文主要讨论线性卷积,为书写方便,下文都以卷积代替.至 ...

  2. 浅谈生成函数和多项式

    我们先来看这样一个生活问题: 你手头有1个1元,一个2元,一个3元(假币!!)和一个4元(这是哪个国家的题啊....),之后你会很好奇你能用这些钱组合成多少种数目. 很小学的问题,只要我们稍微那笔枚举 ...

  3. 浅谈傅里叶——5. 短时傅里叶的缺点与卷积的基本概念

    在<浅谈傅里叶 4>里,我引入了卷积的概念来简要的解释了傅里叶的改进方法--短时傅里叶.它类似一种滑动的滤波器,只不过与我们熟知的与对空间滤波.频域滤波不同,这是一个类似时域滤波的滤波器, ...

  4. 【转】浅谈人类视觉系统与卷积神经网络(CNN)的联系和区别

    浅谈人类视觉系统与卷积神经网络(CNN)的联系和区别 文章转载:叶强 深度学习 / 强化学习 / 机器学习 / 算法 / 眼科学 声明:本文为作者原创.欢迎免费规范转载.本文使用的一些图片素材来自于网 ...

  5. C语言二维数组范德蒙,浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理...

    浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...

  6. 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理...

    浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...

  7. 卷积神经网络以及经典网络模型的浅谈

    "ML炼丹路上的小学徒",记录学习过程中的所见所闻,CSDN上佛系更新,要是觉得不错,可以来访我的博客:fangkaipeng.com,第一时间在个人网站上更新,无广告无利益,有更 ...

  8. 形态学滤波:腐蚀与膨胀(浅谈)

    形态学滤波:腐蚀与膨胀(浅谈) 一 关于二值化.膨胀.腐蚀以及拟合椭圆中心的代码如下** 二 关于腐蚀和膨胀,在此做一些浅显的总结. 三 对于上述代码中所生成的图片,进行一些说明. 四 接下来谈谈自己 ...

  9. 浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别

    浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别 标签: caffe深度学习CaffeNet 2016-11-02 16:10 1203人阅读 评论(1) ...

最新文章

  1. java字符串转日期_JAVA字符串转日期或日期转字符串
  2. java或者jsp中修复会话标识未更新漏洞
  3. Spring Cloud 搭建 Hystrix Dashboard和Turbine
  4. 易学源码html,HTML
  5. 电脑主机换了什么东西才需要重新安装系统?
  6. VB 去除文本框粘贴功能
  7. Matlab 2020b安装教程
  8. matlab课后答案杨德平,MATLAB基础教程习题答案作者杨德平例题源程序课件.pdf
  9. 一款神仙儿 MySQL 审核平台,吊到不行!
  10. 简单实现网页登录框中的“记住我”
  11. 三分子模型(trimolecular model)
  12. QQ空间无法修改“空间描述”修复方法
  13. 图像处理算法之模糊检测
  14. js设计模式之代理模式
  15. 弘辽科技:拼多多发货中途改地址可以吗?怎么改?
  16. 计算机用户账户类型,计算机系统帐户的分类
  17. 移动app测试经验分享
  18. Python对图像进行白色区域转化为黑色
  19. 【题目】一根长度为M厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为每秒1厘米。当两只蚂蚁对撞时,二者同时掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算T秒后每只蚂蚁的位置
  20. [Python] 二维数组初始化实践

热门文章

  1. 用C语言输出1000到2000年之间的闰年
  2. 在线办公软件测试题,办公软件office excel测试题及其答案.doc
  3. 【圣诞系列】注意:这款Python版创意十足的专属“圣诞二维码”上线啦(赶紧收藏)
  4. Android 集成原生google,facebook 登录分享sdk
  5. 微信小程序登录页动画-云层漂浮
  6. python循环语句打印三角形_如何使用python语言中的语句遍历循环生成三角形
  7. uni-app中使用video.js
  8. vue实现自动播放音频
  9. Java大厂面试真题解析大全,附详细答案解析
  10. 【Datawhale|天池】心跳信号分类预测 (3) - 特征工程 ☞ tsfresh 时序特征提取