概述
计算多项式的乘法,或者计算两个大整数的乘法是在计算机中很常见的运算,如果用普通的方法进行,复杂度将会是 的,还有一种分治乘法,需要新东西吗?play daisy slots 测试您的数学能力。 可以做到
时间计算(可以看这里)。下面从计算多项式的乘法出发,介绍快速傅里叶变换(Fast Fourier Transform, FFT)如何在
的时间内计算出两个多项式的乘积。另外,存在只需要两次快速傅立叶变换就可以计算大整数乘法的方法,具体见实序列离散傅里叶变换的快速算法
准备知识
这里介绍一些后面可能会用到的知识(主要是关于多项式、卷积以及复数的),如果你已经知道觉得它太水了或者想用到的时候再看就跳过吧
多项式
简单来说,形如 的代数表达式叫做多项式,可以记作
,
叫做多项式的系数,
是一个不定元,不表示任何值,不定元在多项式中最大项的次数称作多项式的次数
多项式的系数表示法
像刚刚我们提到的那些多项式,都是以系数形式表示的,也就是将 次多项式
的系数
看作
维向量
,其系数表示(coefficient representation)就是向量
多项式的点值表示法
如果选取 个不同的数
对多项式进行求值,得到
,那么就称
为多项式
的点值表示(point-value representation)
多项式 的点值表示不止一种,你只要选取不同的数就可以得到不同的点值表示,但是任何一种点值表示都能唯一确定一个多项式,为了从点值表示转换成系数表示,可以直接通过插值的方法
复数
后面提到的 ,除非作为
求和的变量,其余的都表示虚数单位
单位根
次单位根是指能够满足方程
的复数,这些复数一共有
个它们都分布在复平面的单位圆上,并且构成一个正
边形,它们把单位圆等分成
个部分
根据复数乘法相当于模长相乘,幅角相加就可以知道, 次单位根的模长一定是
,幅角的
倍是
这样, 次单位根也就是
再根据欧拉公式
就可以知道 次单位根的算术表示
如果记 ,那么
次单位根就是
多项式的乘法
给定两个多项式
将这两个多项式相乘得到 ,在这里
如果一个个去算 的话,要花费
的时间才可以完成,但是,这是在系数表示下计算的,如果转换成点值表示,知道了
的点值表示后,由于只有
个点,就可以直接将其相乘,在
的时间内得到
的点值表示
如果能够找到一种有效的方法帮助我们在多项式的点值表示和系数表示之间转换,我们就可以快速地计算多项式的乘法了,快速傅里叶变换就可以做到这一点