浅谈生成函数+卷积+FFT
在写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个1元,一个2元,一个3元(假币!!)和一个4元(这是哪个国家的题啊....),之后你会很好奇你能用这些钱组合成多少种数目. 很小学的问题,只要我们稍微那笔枚举 ...
- 浅谈傅里叶——5. 短时傅里叶的缺点与卷积的基本概念
在<浅谈傅里叶 4>里,我引入了卷积的概念来简要的解释了傅里叶的改进方法--短时傅里叶.它类似一种滑动的滤波器,只不过与我们熟知的与对空间滤波.频域滤波不同,这是一个类似时域滤波的滤波器, ...
- 【转】浅谈人类视觉系统与卷积神经网络(CNN)的联系和区别
浅谈人类视觉系统与卷积神经网络(CNN)的联系和区别 文章转载:叶强 深度学习 / 强化学习 / 机器学习 / 算法 / 眼科学 声明:本文为作者原创.欢迎免费规范转载.本文使用的一些图片素材来自于网 ...
- C语言二维数组范德蒙,浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理...
浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...
- 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理...
浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...
- 卷积神经网络以及经典网络模型的浅谈
"ML炼丹路上的小学徒",记录学习过程中的所见所闻,CSDN上佛系更新,要是觉得不错,可以来访我的博客:fangkaipeng.com,第一时间在个人网站上更新,无广告无利益,有更 ...
- 形态学滤波:腐蚀与膨胀(浅谈)
形态学滤波:腐蚀与膨胀(浅谈) 一 关于二值化.膨胀.腐蚀以及拟合椭圆中心的代码如下** 二 关于腐蚀和膨胀,在此做一些浅显的总结. 三 对于上述代码中所生成的图片,进行一些说明. 四 接下来谈谈自己 ...
- 浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别
浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别 标签: caffe深度学习CaffeNet 2016-11-02 16:10 1203人阅读 评论(1) ...
最新文章
- java字符串转日期_JAVA字符串转日期或日期转字符串
- java或者jsp中修复会话标识未更新漏洞
- Spring Cloud 搭建 Hystrix Dashboard和Turbine
- 易学源码html,HTML
- 电脑主机换了什么东西才需要重新安装系统?
- VB 去除文本框粘贴功能
- Matlab 2020b安装教程
- matlab课后答案杨德平,MATLAB基础教程习题答案作者杨德平例题源程序课件.pdf
- 一款神仙儿 MySQL 审核平台,吊到不行!
- 简单实现网页登录框中的“记住我”
- 三分子模型(trimolecular model)
- QQ空间无法修改“空间描述”修复方法
- 图像处理算法之模糊检测
- js设计模式之代理模式
- 弘辽科技:拼多多发货中途改地址可以吗?怎么改?
- 计算机用户账户类型,计算机系统帐户的分类
- 移动app测试经验分享
- Python对图像进行白色区域转化为黑色
- 【题目】一根长度为M厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为每秒1厘米。当两只蚂蚁对撞时,二者同时掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算T秒后每只蚂蚁的位置
- [Python] 二维数组初始化实践
热门文章
- 用C语言输出1000到2000年之间的闰年
- 在线办公软件测试题,办公软件office excel测试题及其答案.doc
- 【圣诞系列】注意:这款Python版创意十足的专属“圣诞二维码”上线啦(赶紧收藏)
- Android 集成原生google,facebook 登录分享sdk
- 微信小程序登录页动画-云层漂浮
- python循环语句打印三角形_如何使用python语言中的语句遍历循环生成三角形
- uni-app中使用video.js
- vue实现自动播放音频
- Java大厂面试真题解析大全,附详细答案解析
- 【Datawhale|天池】心跳信号分类预测 (3) - 特征工程 ☞ tsfresh 时序特征提取