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

本章涉及知识点:

1、多项式乘法的时间复杂度

2、多项式的表示:系数

3、多项式的表示:点值

4、复数的表示

5、单位复数根

6、单位复数根的性质—消去引理

7、单位复数根的性质—折半引理

8、离散傅里叶变换:DFT和IDFT

9、快速傅里叶变换:FFT

10、FFT求解多项式乘法的步骤

11、python编程实战FFT大数乘法

12、结果分析

一、多项式乘法的时间复杂度

数学中,我们可以将任意一个n位的数字写为一个n-1次多项式,如456可以写为

数字转为多项式

即可抽象定义出以x为变量的多项式函数A(x)

多项式函数

其中aj表示:长度为N-1位数字的第j为数字

例如要计算456 * 123 = ?,则我们用多项式A(x)和B(x)来分别表示其各自的数字,C(x)表示两个多项式的乘积

两个数字的多项式

由乘法的运算规则,两个数的每一位数字都要与另一个数的每一位相乘,最后相加同一位上所有的数字,得到乘积中该位的数字,即

多项式乘法

将x=10为带入结果,即可以得到456 * 123 = 4 * 10**4 + 13 * 10**3 + 28 * 10**2 + 27 * 10 + 18 = 56088

我们可以归纳出乘积C(x)的每一位数字的计算关系为

乘积数位的计算

其中cj表示:乘积数中的第j位的数字

则乘积多项式C(x)可以写为

乘积多项式

至此我们可以看到,由于受限于乘法运算自身的规则,计算两个多项式乘积(将数字转换为多项式)的时间复杂度为:O(n^{2}),当n很大的时候复杂度将非常高

那么需要研究的问题就是:有没有方法可以高效的提高多项式乘法复杂度呢?

二、多项式的表示:系数

为了降低多项式乘法的复杂度,我们首先需要了解几个数学知识

从多项式函数的定义,我们将所有系数视为系数向量,而由全部系数组成的向量a叫做该多项式的系数表达

系数表达

PS:乘积多项式C(x)的系数向量cj,也称输入向量a和b的卷积,记为

卷积运算

从之前的分析可知,要计算出乘积C(x)的每一个系数向量cj,需要的时间复杂度为O(n^{2})

三、多项式的表示:点值

我们任意选取n个不同的自变量x带入多项式函数A(x)进行求值运算,将得到n个不同数值的y,即

求值运算

则多项式的点值表达就是由这n个数值点组成的集合

点值表达

因为可以选取任意n个不同点所构成的集合,所有一个多项式可以有很多不同的点值表达

我们把任意n个点构成的集合叫做点值表达的

从点值表达的基入手,选取适当的xk来优化多项式乘法效率,为此,我们选取单位复数根作为多项式的基

四、复数的表示

复数的定义:设a,b为实数,则形如z = a + bi的数称为复数,其中a称为实部,b称为虚部

PS:当a=0时,复数为纯虚数;当b=0时,复数可视为实数

将复数的实部与虚部的平方和的正平方根值称为该复数的,即

复数的模

五、单位复数根

任意一个复数w,其n次幂的结果为1,就称复数w是n次单位复数根,即

n次单位复数根

可以看到,n次单位复数根有n个,其几何意义为:n个单位复数根均匀的分布在以复平面原点为圆心的单位圆上

n次单位复数根的几何意义

在几何意义的单位圆中,我们将圆周角2\pi均分成n份,则\frac{2\pi}{n}叫做单位根的幅角

由欧拉公式得

欧拉公式

我们定义w_{n}表示一个n次单位根,则

主n次单位根

w_{n}又被称为主n次单位根,而其余w_{n}^{1}w_{n}^{2}等叫做n次单位根的幂次,记为:w_{n}^{k},则

n次单位根的幂次

可以很容易知道

n次单位根的性质

下面我们证明n次单位根的两个性质

六、单位复数根的性质—消去引理

设d>0为任何一个整数,则

消去引理

七、单位复数根的性质—折半引理

折半引理

则可以得到

折半引理

至此,可以看到通过消去和折半引理,我们将n的规模降低到了原来的一半

八、离散傅里叶变换:DFT和IDFT

回顾之前我们的多项式函数

多项式函数

我们将n次单位根的幂次项:w_{n}^{0},w_{n}^{1},w_{n}^{2},...,w_{n}^{n-1}依次带入A(x),则得到

离散傅里叶正变换

记向量y = (y_{0}, y_{1},..., y_{n-1})是系数向量a = (a_{0}, a_{1},..., a_{n-1})的离散傅里叶变换,也称离散傅里叶正变换(DFT)

则对应的离散傅里叶逆变换(IDFT)

离散傅里叶逆变换

可以看到:

(1)DFT对应着多项式求值

(2)IDFT对应着插值,即求多项式的系数

九、快速傅里叶变换:FFT

由DFT定义可知,将w_{n}^{0},w_{n}^{1},w_{n}^{2},...,w_{n}^{n-1}全部依次带入A(x)计算出多项式的时间复杂度仍然是O(n^{2})

此时我们就需要利用之前所讲的n次单位复数根的知识,将A(x)中的偶数下标奇数下标的系数,分别用两个新的多项式A1(x)和A2(x)来表示,即

偶数下标的多项式
奇数下标的多项式

注意:A(x)的次数界为n,A1(x)的次数界为n/2,A2(x)的次数界也为n/2

则可以得到A(x)和A1(x)、A2(x)的关系为

多项式函数关系

我们将x=w_{n}^{k}带入得,其中k=0,1,2,...,\frac{n}{2} - 1

快速傅里叶变换1

至此,我们就得到了在[0, \frac{n}{2} - 1]之间w_{n}^{k}的所有求值

下面还需要计算[\frac{n}{2} , n-1]之间的w_{n}^{k}的值,根据折半引理,我们将x =  w_{n}^{k + \frac{n}{2}}带入得

快速傅里叶变换2

至此,我们就得到了[\frac{n}{2} , n-1]之间w_{n}^{k}的所有求值

观察上面两个式子,不难发现:

(1)A(w_{n}^{k}) A(w_{n}^{k + \frac{n}{2}}) 的计算式子里只有一个常数项互为相反数

(2)在[0, \frac{n}{2} - 1]之间枚举出A(w_{n}^{k}) 后,就可以在O(1)的时间里得到[\frac{n}{2} , n-1]A(w_{n}^{k + \frac{n}{2}})

(3)原问题的规模缩小了一半(分治法的思想)

至此,我们利用数学中n次单位复数根的性质,将DFT优化为FFT(快速傅里叶正变换),即

快速傅里叶正变换

十、FFT求解多项式乘法的步骤

通过以上的研究,我们可以总结出使用FFT计算多项式乘法的时间复杂度

FFT计算多项式乘法的时间复杂度

FFT利用n次单位复数根和分治法的思想,将多项式乘法的时间复杂度由O(n^{2})降低到了O(n\lg n)

最后我们可以总结出求解多项式乘法的高效算法步骤为:

(1)加倍次数界:由分治法的思想,将两个多项式的次数界补全为2的幂次

(2)求值:通过FFT计算出两个多项式的点值表达,即2n次单位复数根的多项式函数取值

(3)逐点相乘:将两个多项式的点值依次相乘,得到相乘结果的点值

(4)插值:通过IDFT计算相乘结果的点值,得到相乘结果的每一个系数

十一、python编程实战FFT大数乘法

计算离散傅里叶正变换
计算离散傅里叶逆变换
FFT
IFFT
使用矩阵乘法的DFT和FFT

十二、结果分析

我们随便用两个386位和422位的整数,进行下面实验比较计算乘法的时间消耗

(1)不使用矩阵乘法的离散傅里叶变换DFT

(2)使用矩阵乘法的离散傅里叶变换DFT

(3)使用矩阵乘法的快速傅里叶变换FFT

(4)直接使用numpy封装的FFT

运行代码,实验结果如下

结果分析

至此,我们可以总结出

(1)FFT采用分治算法的思想,利用数学中n次单位复数根的性质,将时域转化为频域,再到频域转化为时域,非常高效的提高了多项式乘法效率!

(2)我们根据数学理论一步步封装的FFT和numpy封装的FFT性能上非常接近

案例代码见:大数乘法—多项式与快速傅里叶变换

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容