多项式乘法与快速傅里叶变换

全世界只有3.14 % 的人关注了

数据与算法之美


第一节、多项式乘法


我们知道,有两种表示多项式的方法,即系数表示法和点值表示法。


什么是系数表示法?所谓的系数表示法,举个例子如下图所示,A(x)=6x^3 + 7x^2 - 10x + 9,B(x)=-2x^3+4x-5,则C(x)=A(x)*B(x)就是普通的多项式相乘的算法,系数与系数相乘,这就是所谓的系数表示法。


640?wx_fmt=jpeg


那么,何谓点值表示法?一个次数为n次的多项式A(x)的点值表示就是n个点值所形成的集合:{(x0,y0), (x1,y1),..., (xn-1,yn-1)}。其中所有xk各不相同,且当k=0,1,……,n-1时,有y(k)=A(xk)。


一个多项式可以由很多不同的点值表示,这是由于任意n个相异点x0,x1,...,xn-1组成的集合,都可以看做是这种点值法的表示方法。对于一个用系数形式表示的多项式来说,在原则上计算其点值表示是简单易行的,我们只需要选取n个相异点x0,x1,...,xn-1,然后对k=0,1,...,n-1,求出A(xk),然后根据霍纳法则,求出这n个点的值所需要的时间为O(n^2)。


稍后,你将看到,如果巧妙的选取xk的话,适当的利用点值表示可以使多项式的乘法可以在线性时间内完成。所以,如果我们能恰到好处的利用系数表示法与点值表示法的相互转化,那么我们可以加速多项式乘法(下面,将详细阐述这个过程),达到O(n*logn)的最佳时间复杂度。


前面说了,当用系数表示法,即用一般的算法表示多项式时,两个 n次多项式的乘法需要用 O(n^2)的时间才能完成。但采用点值表示法时,多项式乘法的运行时间仅为O(n)。接下来,咱们要做的是,如何利用系数表示法与点值表示法的相互转化来实现多项式系数表示法的O(n*logn)的快速乘法。


第二节、多项式的快速乘法 


在此之前,我们得明白两个概念,求值与插值。通俗的讲,所谓求值(系数->点值),是指系数形式的多项式转换为点值形式的表示方式。而插值(点值->系数)正好是求值的逆过程,即反过来,它是已知点值表示法,而要你转换其为多项式的系数表示法(用n个点值对也可以唯一确定一个不超过n-1次多项式,这个过程称之为插值)


而这个系数表示法与点值表示法的相互转化,即无论是从系数表示法转化到点值表示法所谓的求值,还是从点值表示法转化到系数表示法所谓的插值,求值和插值两种过程的时间复杂度都是O(n*logn)。


前面,我们已经说了,在多项式乘法中,如果用系数表示法表示多项式,那么多项式乘法的复杂度将为O(n^2),而用点值表示法表示的多项式,那么多项式的乘法的复杂度将是线性复杂度为O(n),即:  适当的利用点值表示可以使多项式的乘法可以在线性时间内完成。


此时读者可以发挥你的想象,假设我们以下面这样一种过程来计算多项式的乘法(不过在此之前,你得先把两个要相乘的多项式A(x)和B(x)扩充为次数或者说系数为2n次的多项式),我们将会得到我们想要的结果:


系数表示法转化为点值表示法。先用系数表示法表示一个多项式,然后对这个多项式进行求值操作,即多项式从系数表示法变成了点值表示法,时间复杂度为O(n*logn);


点值表示法计算多项式乘法。用点值表示法表示多项式后,计算多项式的乘法,线性复杂度为O(n);


点值表示法转化为系数表示法。最终再次将点值表示法表示的多项式转变为系数表示法表示的多项式,这一过程,为O(n*logn)。


那么,综上上述三项操作,系数表示法表示的多项式乘法总的时间复杂度已被我们降到了O(n*logn+n+n*logn)=O(N*logN)。


如下图所示,从左至右,看过去,这个过程即是完成多项式乘法的计算过程。不过,完成这个过程有两种方法,一种就是前面第一节中所说的普通方法,即直接对系数表示法表示的多项式进行乘法运算,复杂度为O(n^2),它体现在下图中得Ordinary multiplication过程。


还有一种就是本节上文处所述的三个步骤:

1、将多项式由系数表示法转化为点值表示法(点值过程);

2、 利用点值表示法完成多项式乘法;

3、将点值表示法再转化为系数表示法(插值过程)。


三个步骤下来,总的时间复杂度为O(N*logN)。它体现在下图中的Evaluation + Pointwise multiplication + Interpolation 三个合过程。


640?wx_fmt=jpeg


由上图中,你也已经看到了。我们巧妙的利用了关于点值形式的多项式的线性时间乘法算法,来加快了系数形式表示的多项式乘法的运算速度。在此过程中,我们的工作最关键的就在于以O(n*logn)的时间快速把一个多项式从系数形式转换为点值形式(求值,我们即称之为FFT),然后再以O(n*logn)的时间从点值形式转换为系数形式(插值,我们即称之为FFT逆)


最终达到了我们以最终的系数形式表示的多项式的快速乘法为O(N*logN)的时间复杂度。好不令人心生快意。


对上图,有一点必须说明,项w2n是2n次单位复根。且不容忽视的是,在上述两种表示法即系数表示法和点值表示法相互转换的过程中, 都使用了单位复根,才得以在O(n*logn)的时间内完成求值与插值运算(至于何谓单位复根,请参考相关资料。因为为了保证本文的通俗易懂性,无意引出一大堆公式或定理)


第三节、FFT


注:本节有相当部分文字来自算法导论中文版第二版以及维基百科。


在具体介绍FFT之前,我们得熟悉知道折半定理是怎么一回事儿:如果n>0且n为偶数,那么,n个n次单位复根的平方等于n/2个n/2个单位复根。我们已经知道,通过使用一种称为快速傅里叶变换(FFT)的方法,可以在O(n*logn)的时间内计算出DFTn(a),而若采用直接的方法复杂度为O(n^2)。FFT就是利用了单位复根的特殊性质。推荐阅读《数学建模算法与应用》


你将看到,FFT方法运用的策略为分治策略,所谓分治,即分而治之。两个多项式A(x)与B(x)相乘的过程中,FFT用A(x)中偶数下标的系数与奇数下标的系数,分别定义了两个新的次数界为n/2的多项式A[0](x)和A[1](x):


A[0](x) =a0 +a2x +a4x2 +··· +an-2xn/2-1,

A[1](x) =a1 +a3x +a5x2 +··· +an-1xn/2-1.

  

注意,A[0]包含了A中所有偶数下标的系数(下标的相应二进制数的最后一位为0),而A[1]包含A中所有奇数下标的系数(下标的相应二进制数的最后一位为1)。有下式:


640?wx_fmt=jpeg

    

这样,求A(x)在640?wx_fmt=jpeg处的问题就转换为:

1)求次数界为n/2的多项式A[0]与A[1]在点 640?wx_fmt=jpeg 的值

2)将上述结果进行组合。

    

下面,我们用N次单位根WN来表示640?wx_fmt=jpeg

640?wx_fmt=png

为了简单起见,我们下面设待变换序列长度n = 2r。 根据上面单位根的对称性,求级数640?wx_fmt=png时,可以将求和区间分为两部分:


640?wx_fmt=jpeg


Fodd(k) 和 Feven(k)是两个分别关于序列640?wx_fmt=jpeg


奇数号和偶数号序列N/2点变换。由此式只能计算出yk的前N/2个点,对于后N/2个点,注意Fodd(k) 和 Feven(k) 都是周期为N/2的函数,由单位根的对称性,于是有以下变换公式:


  • 640?wx_fmt=jpeg

  • 640?wx_fmt=jpeg



这样,一个N点变换就分解成了两个N/2点变换,照这样可继续分解下去。这就是库利-图基快速傅里叶变换算法的基本原理。此时,我们已经不难分析出此时算法的时间复杂度将为O(NlogN)。


ok,没想到,本文之中还是出现了这么多的公式(没办法,搞这个FFT就是个纯数学活儿。之前买的一本小波与傅里叶分析基础也是如此,就是一本数学公式和定理的聚集书。不过,能看懂更好,实在无法弄懂也只权当做个稍稍了解)。


好了,下面,咱们来简单理解下FFT中的蝶形算法,本文将告结束。如下图所示:


640?wx_fmt=jpeg

 

有人这样解释蝶形算法:对于N(2的x次方)点的离散信号,把它按索引位置分成两个序列,分别为0,2,4,....,2K(记为A)和1,3,5,....,2K-1(记为B),由傅立叶变换可以推出N点的傅立叶变换前半部分的结果为A+B*旋转因子,后半部分的结果为A-B*旋转因子。


于是求N点的傅立叶变换就变成分别求两个N/2点序列的傅立叶变换,对每一个N/2点的序列,递归前面的步骤,直到只有两点的序列,就只变成简单的加减关系了。把这些点的加减关系用线连接,看上去就是个蝶形。ok,更多可参考算法导论第30章。


举一个例子,我们知道,4X4的矩阵运算如果按常规算法的话仍要进行64次乘法运算和48次加法,这将耗费较多的时间,于是在H.264中,有一种改进的算法(蝶形算法)可以减少运算的次数。这种矩阵运算算法构造非常巧妙,利用构造的矩阵的整数性质和对称性,可完全将乘法运算转化为加法运算。如下图所示:


640?wx_fmt=jpeg


版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。

640?wx_fmt=png精品课程推荐:

640?wx_fmt=png

640?wx_fmt=png

选购数学科普正版读物

严选“数学思维好物”

送给孩子的益智礼物   |   办公室神器

算法工程师成长阅读   |   居家高科技

理工科男女实用型礼物精选   

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


数据与算法之美

用数据解决不可能


640?wx_fmt=jpeg



长按扫码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF 模仿QQ音乐首页歌单效果

qq音乐桌面版做的效果感觉很不错,今天就模仿一下它首页歌单的效果,从简单做起。。。看一下效果:,其实也很简单,就是布局和动画,触发器。。。还用到了ItemsControl下面就看看代码:MainWindow的xa…

收藏 : 50个Excel逆天功能,一秒变“表哥”

全世界只有3.14 % 的人关注了数据与算法之美Excel的50个逆天功能,动画教程珍藏版!先看几个简单的:1、自动筛选2、在Excel中字符替换3、在Excel中冻结行列标题4、在Excel中为导入外部数据5、在Excel中行列快速转换6、共享Excel工作簿7、在Exce…

实战~~整个网络无法浏览,提示网络不存在或者尚未启动

今天早上接到同事的电脑,说其他人访问不到他的电脑,他电脑上有文件要共享才能进行工作~~故障现象:能上网,能PING通其他电脑,但是通过网上邻居和IP不能访问其他电脑上的资源。 这是在故障本机上的提示~~ 这是其他工作站…

python ctp接口_使用ctp的python接口

在github上查到一个项目ctpwrapper在按照文档按照的时候报错>>>pip install cython --upgrade>>>pip install ctpwrapper --upgrade在安装第二个命令的时候第一个问题安装yum install -y gcc-c 解决第二个问题ctpwrapper/MdApi.cpp:39:20: 致命错误:Python.h…

C# 并行和多线程编程——认识和使用Task

对于多线程,我们经常使用的是Thread。在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于“任务的编程模型”所冲击,因为task会比thread具有更小的性能开销&#xf…

Facebook上的一道题,超过50万的评论和1万3500次分享

全世界只有3.14 % 的人关注了数据与算法之美近日,有网友在Facebook发了一道数学题:发布以后,目前已经收到超过50万的评论和1万3500次分享,图中包含四个等式,前面三个已经有答案了,最后一个问题要求你得出相…

从数学入手,3招打破机器学习的边界

全世界只有3.14 % 的人关注了数据与算法之美本文约2007余字,阅读需要约6分钟;系统资料领取见文末;关键词:人工智能,机器学习,深度学习,数学,学习建议01.机器学习工程师的边界是什么&…

.NET Core 基于 Grafana Loki 日志初体验

介绍Loki: like Prometheus, but for logs.Loki是一个轻量级的日志系统,受到Prometheus项目的启发,由Grafana团队设计和开发,所以在Grafana中是原生支持的,具有可水平扩展,高度可用等特性,通过存储压缩的、…

基于开源流程引擎Activiti5的工作流开发平台BPMX3

2019独角兽企业重金招聘Python工程师标准>>> BPMX3平台是宏天软件在ESTBPM2的基础上,追随开源工作流平台Activiti5,由原班开发团队,历时一年,现重新推出一套解决中国政府及企业的业务流程的开发平台。 相对商业的工作流…

通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定...

如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了。我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础。最开始接触dapr的时候,会在其官方首页看到这么一句话“Dapr is a portabl…

三位一体,用游戏打通孩子记忆力、认知和双语启蒙的学前神器

对于孩子学习知识,现在父母多表现有2个极端,一种完全不让小小孩学硬知识,一种又希望孩子从很小开始就学硬知识。小木比较反对在孩子6岁前就给他们生硬地灌输知识,一定得认识多少个字,背多少个单词,但只要做…

分享一个CSS3的网格系统架构 - ResponsiveAeon

日期:2012-7-30 来源:GBin1.com 在线演示 本地下载 曾经介绍过其它类型的CSS3网格系统,今天我们介绍一款能够帮助你快速创建基于HTML5/CSS3的响应式布局框架 - ResponsiveAeon。 它拥有一个宽度为1104px并且基于12个列的网格框架系统&#…

网络协议,没有想象中那么难

十个人程序员里面,有十个都会说自己学过网络协议,九个人都会说自己懂网络协议。但是面试的时候,问几个问题,能回答的可能只有两三个。不信?来,我问你几道。1、TCP 协议跟 UDP 协议有什么区别?你…

Mysql实现幂等_阿里面试官:接口的幂等性怎么设计?

大家好,我是狂聊。自己最近负责的几个接口,都涉及到了幂等性的操作,抽空总结了一下,这也是面试官比较爱问的问题。一、什么是幂等?看一下维基百科怎么说的:幂等性:多次调用方法或者接口不会改变业务状态&a…

谷歌搜索揭示人性最黑暗的秘密

全世界只有3.14 % 的人关注了数据与算法之美《卫报》网站发布文章指出,我们能够从我们在网上问的问题获得对自己更多的了解呢。美国数据科学家塞斯斯蒂芬斯-大卫多维茨(Seth Stephens-Davidowitz)通过分析谷歌的匿名搜索数据,揭示…

杂集

为什么80%的码农都做不了架构师?>>> 符号相关快捷键: 千分符号:alt 0137 (小键盘) 回车符号:alt 10(小键盘) 查看目录结构:进入windows concole,执行命令tree 转载于:https://my.o…

接口管理平台YApi

介绍YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的…

saiku 连接 MySQL_Saiku连接mysql数据库(二)

Saiku连接Mysql数据库展示数据参考链接:https://www.cnblogs.com/shirui/p/8573491.html前提:Saiku已安装好,mysql已安装好1.添加Saiku的数据库驱动: mysql-connect-java-5.1.17.jar下载相应的数据库驱动放到 saiku-server\tomcat…

TreeView控件应用--访问文件或文件夹(一)

C#用TreeView访问文件或文件夹,通过递归,展开所有文件夹(类似资源管理器的树形窗体) 首先,算法是用递归算法,不断的递归文件。以此来遍历整个电脑的磁盘内容,过程也很简单。这种算法的时间复杂度…

凭自己本事单的身是一种怎样的体验?你根本配不上如此优秀的我!

全世界只有3.14 % 的人关注了数据与算法之美8月12号,微博网友烂剧斗士发了这么一条微博,称“看脱口秀大会这个哥没把我给笑死”。一位从事IT(黑客)的小哥哥,是这样回忆自己的求爱经历的↓↓#她根本配不上我这么聪明的男…