大數(shù)乘法—多項(xiàng)式與快速傅里葉變換

本章涉及知識(shí)點(diǎn):

1蜕提、多項(xiàng)式乘法的時(shí)間復(fù)雜度

2乌妙、多項(xiàng)式的表示:系數(shù)

3使兔、多項(xiàng)式的表示:點(diǎn)值

4、復(fù)數(shù)的表示

5藤韵、單位復(fù)數(shù)根

6虐沥、單位復(fù)數(shù)根的性質(zhì)—消去引理

7、單位復(fù)數(shù)根的性質(zhì)—折半引理

8泽艘、離散傅里葉變換:DFT和IDFT

9欲险、快速傅里葉變換:FFT

10、FFT求解多項(xiàng)式乘法的步驟

11匹涮、python編程實(shí)戰(zhàn)FFT大數(shù)乘法

12天试、結(jié)果分析

一、多項(xiàng)式乘法的時(shí)間復(fù)雜度

數(shù)學(xué)中然低,我們可以將任意一個(gè)n位的數(shù)字寫為一個(gè)n-1次多項(xiàng)式喜每,如456可以寫為

數(shù)字轉(zhuǎn)為多項(xiàng)式

即可抽象定義出以x為變量的多項(xiàng)式函數(shù)A(x)

多項(xiàng)式函數(shù)

其中aj表示:長(zhǎng)度為N-1位數(shù)字的第j為數(shù)字

例如要計(jì)算456 * 123 = ?雳攘,則我們用多項(xiàng)式A(x)和B(x)來分別表示其各自的數(shù)字带兜,C(x)表示兩個(gè)多項(xiàng)式的乘積

兩個(gè)數(shù)字的多項(xiàng)式

由乘法的運(yùn)算規(guī)則,兩個(gè)數(shù)的每一位數(shù)字都要與另一個(gè)數(shù)的每一位相乘吨灭,最后相加同一位上所有的數(shù)字鞋真,得到乘積中該位的數(shù)字,即

多項(xiàng)式乘法

將x=10為帶入結(jié)果沃于,即可以得到456 * 123 =?4 * 10**4 + 13 * 10**3 + 28 * 10**2 + 27 * 10 + 18 =?56088

我們可以歸納出乘積C(x)的每一位數(shù)字的計(jì)算關(guān)系為

乘積數(shù)位的計(jì)算

其中cj表示:乘積數(shù)中的第j位的數(shù)字

則乘積多項(xiàng)式C(x)可以寫為

乘積多項(xiàng)式

至此我們可以看到涩咖,由于受限于乘法運(yùn)算自身的規(guī)則,計(jì)算兩個(gè)多項(xiàng)式乘積(將數(shù)字轉(zhuǎn)換為多項(xiàng)式)的時(shí)間復(fù)雜度為:O(n^{2})繁莹,當(dāng)n很大的時(shí)候復(fù)雜度將非常高

那么需要研究的問題就是:有沒有方法可以高效的提高多項(xiàng)式乘法復(fù)雜度呢檩互?

二、多項(xiàng)式的表示:系數(shù)

為了降低多項(xiàng)式乘法的復(fù)雜度咨演,我們首先需要了解幾個(gè)數(shù)學(xué)知識(shí)

從多項(xiàng)式函數(shù)的定義闸昨,我們將所有系數(shù)視為系數(shù)向量,而由全部系數(shù)組成的向量a叫做該多項(xiàng)式的系數(shù)表達(dá)

系數(shù)表達(dá)

PS:乘積多項(xiàng)式C(x)的系數(shù)向量cj薄风,也稱輸入向量a和b的卷積饵较,記為

卷積運(yùn)算

從之前的分析可知,要計(jì)算出乘積C(x)的每一個(gè)系數(shù)向量cj遭赂,需要的時(shí)間復(fù)雜度為O(n^{2})

三循诉、多項(xiàng)式的表示:點(diǎn)值

我們?nèi)我膺x取n個(gè)不同的自變量x帶入多項(xiàng)式函數(shù)A(x)進(jìn)行求值運(yùn)算,將得到n個(gè)不同數(shù)值的y撇他,即

求值運(yùn)算

則多項(xiàng)式的點(diǎn)值表達(dá)就是由這n個(gè)數(shù)值點(diǎn)組成的集合

點(diǎn)值表達(dá)

因?yàn)榭梢赃x取任意n個(gè)不同點(diǎn)所構(gòu)成的集合茄猫,所有一個(gè)多項(xiàng)式可以有很多不同的點(diǎn)值表達(dá)

我們把任意n個(gè)點(diǎn)構(gòu)成的集合叫做點(diǎn)值表達(dá)的

從點(diǎn)值表達(dá)的基入手,選取適當(dāng)?shù)膞k來優(yōu)化多項(xiàng)式乘法效率困肩,為此划纽,我們選取單位復(fù)數(shù)根作為多項(xiàng)式的基

四、復(fù)數(shù)的表示

復(fù)數(shù)的定義:設(shè)a锌畸,b為實(shí)數(shù)勇劣,則形如z = a + bi的數(shù)稱為復(fù)數(shù),其中a稱為實(shí)部潭枣,b稱為虛部

PS:當(dāng)a=0時(shí)比默,復(fù)數(shù)為純虛數(shù);當(dāng)b=0時(shí)卸耘,復(fù)數(shù)可視為實(shí)數(shù)

將復(fù)數(shù)的實(shí)部與虛部的平方和的正平方根值稱為該復(fù)數(shù)的退敦,即

復(fù)數(shù)的模

五、單位復(fù)數(shù)根

任意一個(gè)復(fù)數(shù)w蚣抗,其n次冪的結(jié)果為1侈百,就稱復(fù)數(shù)w是n次單位復(fù)數(shù)根,即

n次單位復(fù)數(shù)根

可以看到翰铡,n次單位復(fù)數(shù)根有n個(gè)钝域,其幾何意義為:n個(gè)單位復(fù)數(shù)根均勻的分布在以復(fù)平面原點(diǎn)為圓心的單位圓上

n次單位復(fù)數(shù)根的幾何意義

在幾何意義的單位圓中,我們將圓周角2\pi均分成n份锭魔,則\frac{2\pi}{n}叫做單位根的幅角

由歐拉公式得

歐拉公式

我們定義w_{n}表示一個(gè)n次單位根例证,則

主n次單位根

w_{n}又被稱為主n次單位根,而其余w_{n}^{1}迷捧、w_{n}^{2}等叫做n次單位根的冪次织咧,記為:w_{n}^{k}胀葱,則

n次單位根的冪次

可以很容易知道

n次單位根的性質(zhì)

下面我們證明n次單位根的兩個(gè)性質(zhì)

六、單位復(fù)數(shù)根的性質(zhì)—消去引理

設(shè)d>0為任何一個(gè)整數(shù)笙蒙,則

消去引理

七抵屿、單位復(fù)數(shù)根的性質(zhì)—折半引理

折半引理

則可以得到

折半引理

至此,可以看到通過消去和折半引理捅位,我們將n的規(guī)模降低到了原來的一半

八轧葛、離散傅里葉變換:DFT和IDFT

回顧之前我們的多項(xiàng)式函數(shù)

多項(xiàng)式函數(shù)

我們將n次單位根的冪次項(xiàng):w_{n}^{0},w_{n}^{1}艇搀,w_{n}^{2}尿扯,...,w_{n}^{n-1}依次帶入A(x)焰雕,則得到

離散傅里葉正變換

記向量y = (y_{0}, y_{1},..., y_{n-1})是系數(shù)向量a = (a_{0}, a_{1},..., a_{n-1})的離散傅里葉變換衷笋,也稱離散傅里葉正變換(DFT)

則對(duì)應(yīng)的離散傅里葉逆變換(IDFT)

離散傅里葉逆變換

可以看到:

(1)DFT對(duì)應(yīng)著多項(xiàng)式求值

(2)IDFT對(duì)應(yīng)著插值,即求多項(xiàng)式的系數(shù)

九淀散、快速傅里葉變換:FFT

由DFT定義可知右莱,將w_{n}^{0},w_{n}^{1}档插,w_{n}^{2}慢蜓,...,w_{n}^{n-1}全部依次帶入A(x)計(jì)算出多項(xiàng)式的時(shí)間復(fù)雜度仍然是O(n^{2})

此時(shí)我們就需要利用之前所講的n次單位復(fù)數(shù)根的知識(shí)郭膛,將A(x)中的偶數(shù)下標(biāo)奇數(shù)下標(biāo)的系數(shù)晨抡,分別用兩個(gè)新的多項(xiàng)式A1(x)和A2(x)來表示,即

偶數(shù)下標(biāo)的多項(xiàng)式
奇數(shù)下標(biāo)的多項(xiàng)式

注意:A(x)的次數(shù)界為n则剃,A1(x)的次數(shù)界為n/2耘柱,A2(x)的次數(shù)界也為n/2

則可以得到A(x)和A1(x)、A2(x)的關(guān)系為

多項(xiàng)式函數(shù)關(guān)系

我們將x=w_{n}^{k}帶入得棍现,其中k=0,1,2,...,\frac{n}{2} - 1

快速傅里葉變換1

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

下面還需要計(jì)算[\frac{n}{2} , n-1]之間的w_{n}^{k}的值,根據(jù)折半引理己肮,我們將x =  w_{n}^{k + \frac{n}{2}}帶入得

快速傅里葉變換2

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

觀察上面兩個(gè)式子,不難發(fā)現(xiàn):

(1)A(w_{n}^{k}) A(w_{n}^{k + \frac{n}{2}}) 的計(jì)算式子里只有一個(gè)常數(shù)項(xiàng)互為相反數(shù)

(2)在[0, \frac{n}{2} - 1]之間枚舉出A(w_{n}^{k}) 后谎僻,就可以在O(1)的時(shí)間里得到[\frac{n}{2} , n-1]A(w_{n}^{k + \frac{n}{2}})

(3)原問題的規(guī)穆α縮小了一半(分治法的思想)

至此,我們利用數(shù)學(xué)中n次單位復(fù)數(shù)根的性質(zhì)艘绍,將DFT優(yōu)化為FFT(快速傅里葉正變換)赤拒,即

快速傅里葉正變換

十、FFT求解多項(xiàng)式乘法的步驟

通過以上的研究,我們可以總結(jié)出使用FFT計(jì)算多項(xiàng)式乘法的時(shí)間復(fù)雜度

FFT計(jì)算多項(xiàng)式乘法的時(shí)間復(fù)雜度

FFT利用n次單位復(fù)數(shù)根和分治法的思想挎挖,將多項(xiàng)式乘法的時(shí)間復(fù)雜度由O(n^{2})降低到了O(n\lg n)

最后我們可以總結(jié)出求解多項(xiàng)式乘法的高效算法步驟為:

(1)加倍次數(shù)界:由分治法的思想这敬,將兩個(gè)多項(xiàng)式的次數(shù)界補(bǔ)全為2的冪次

(2)求值:通過FFT計(jì)算出兩個(gè)多項(xiàng)式的點(diǎn)值表達(dá),即2n次單位復(fù)數(shù)根的多項(xiàng)式函數(shù)取值

(3)逐點(diǎn)相乘:將兩個(gè)多項(xiàng)式的點(diǎn)值依次相乘肋乍,得到相乘結(jié)果的點(diǎn)值

(4)插值:通過IDFT計(jì)算相乘結(jié)果的點(diǎn)值鹅颊,得到相乘結(jié)果的每一個(gè)系數(shù)

十一、python編程實(shí)戰(zhàn)FFT大數(shù)乘法

計(jì)算離散傅里葉正變換
計(jì)算離散傅里葉逆變換
FFT
IFFT
使用矩陣乘法的DFT和FFT

十二墓造、結(jié)果分析

我們隨便用兩個(gè)386位和422位的整數(shù),進(jìn)行下面實(shí)驗(yàn)比較計(jì)算乘法的時(shí)間消耗

(1)不使用矩陣乘法的離散傅里葉變換DFT

(2)使用矩陣乘法的離散傅里葉變換DFT

(3)使用矩陣乘法的快速傅里葉變換FFT

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

運(yùn)行代碼锚烦,實(shí)驗(yàn)結(jié)果如下

結(jié)果分析

至此觅闽,我們可以總結(jié)出

(1)FFT采用分治算法的思想,利用數(shù)學(xué)中n次單位復(fù)數(shù)根的性質(zhì)涮俄,將時(shí)域轉(zhuǎn)化為頻域蛉拙,再到頻域轉(zhuǎn)化為時(shí)域,非常高效的提高了多項(xiàng)式乘法效率彻亲!

(2)我們根據(jù)數(shù)學(xué)理論一步步封裝的FFT和numpy封裝的FFT性能上非常接近

案例代碼見:大數(shù)乘法—多項(xiàng)式與快速傅里葉變換

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末孕锄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苞尝,更是在濱河造成了極大的恐慌畸肆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宙址,死亡現(xiàn)場(chǎng)離奇詭異轴脐,居然都是意外死亡鲁森,警方通過查閱死者的電腦和手機(jī)匀哄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焕刮,“玉大人注益,你說我怎么就攤上這事碴巾。” “怎么了丑搔?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵厦瓢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我低匙,道長(zhǎng)旷痕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任顽冶,我火速辦了婚禮欺抗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘强重。我一直安慰自己绞呈,他們只是感情好贸人,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著佃声,像睡著了一般艺智。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圾亏,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天十拣,我揣著相機(jī)與錄音,去河邊找鬼志鹃。 笑死夭问,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的曹铃。 我是一名探鬼主播缰趋,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼陕见!你這毒婦竟也來了秘血?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤评甜,失蹤者是張志新(化名)和其女友劉穎灰粮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜕着,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谋竖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了承匣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓖乘。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖韧骗,靈堂內(nèi)的尸體忽然破棺而出嘉抒,到底是詐尸還是另有隱情,我是刑警寧澤袍暴,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布些侍,位于F島的核電站,受9級(jí)特大地震影響政模,放射性物質(zhì)發(fā)生泄漏岗宣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一淋样、第九天 我趴在偏房一處隱蔽的房頂上張望耗式。 院中可真熱鬧,春花似錦、人聲如沸刊咳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娱挨。三九已至余指,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跷坝,已是汗流浹背酵镜。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柴钻,地道東北人笋婿。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像顿颅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子足丢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容