Karatsuba-Ofman乘法器

Karatsuba-Ofman乘法器是俄羅斯人Karatsuba於1962年提出的,主要思想是採用分治算法計算整數乘法,將計算複雜度向前推進到O(nlog23)O(n^{log_23}),而此前普遍認爲整數乘法的計算複雜度是O(n2)O(n^2)
來看一個例子:假設n=2ln=2lx=x12l+x0x=x_12^l+x_0y=y12l+y0y=y_12^l+y_02l2l-位整數,於是:
xy=(x12l+x0)(y12l+y0)xy=(x_12^l+x_0)(y_12^l+y_0)
=x1y122l+[(x0+x1)(y0+y1)x1y1x0y0]2l+x0y0=x_1\cdot y_12^{2l}+[(x_0+x_1)\cdot(y_0+y_1)-x_1y_1-x_0\cdot y_0]2^l+x_0y_0
xyxy可以通過3個ll-位的整數乘法(而不是2l2l-位的整數乘法)和2個乘法,2個減法算式計算出來。
ll數值較大,加法和減法相對乘法的計算代價可以忽略。在經典算例中,程序可以反覆迭代到中位數,並一直執行到滿足閾值(可能的值是機器字長度)的條件才停止。
對於大小適中的整數,Karatsuba算法的執行上限是需要考慮的因素。不同於傳統方法,Karatsuba算法的執行儘可能減少移位請求(對於2l2^l22l2^{2l}乘法),並且高效使用面向字節的操作。例如:採用拆分字節的邊界的方法有可能更好,一個指定階段的分裂可以拆分成2個以上片段。
例1(Karatsuba-Ofman方法):考慮224-位整數xxyy的乘法,運算設備的字節長度爲W=32W=32。2個深度爲2的方法展現如下圖所示,顯然,圖a的裂項從數學上看可能更爲優雅並且在代碼上更具備重用性。然而,卻需要更多的移位操作,這是因爲裂變並非以字長單位爲邊界進行。如果56-位數的乘法的代價近似於64-位數乘法,顯然裂項對於硬件容量利用不足,這是因爲如圖b所示,9個64位乘法與1個32位、8個64位乘法的代價完全不同。另外,圖b的列項建立在字長單位爲邊界的基礎上,由於存在加法移位,具有更多的複雜的跨項計算。例如,深度爲2的跨項具有形式
在這裏插入圖片描述
上圖展示了224-位的整數分裂成深度爲2的二叉樹。圖a所示的xyxy乘積包括採用3個112112112*112位乘法,每個執行又採用3個5656位的乘法。b圖所示的xy包括採用一個9696位乘法(列項爲一個3232位和2個6464位乘法)和2個128128位的乘法(每個產生3個646464*64位乘法)。
如下:
(x0+x1)(y0+y1)x1y1x0y0(x_0+x_1)(y_0+y_1)-x_1y_1-x_0y_0
其中,x0+x1x_0+x_1y0+y1y_0+y_1在圖a爲57-位數,在圖b爲65-位數。雖然(x0+x1)(y0+y1)(x_0+x_1)(y_0+y_1)可以被1個64
64位乘法和2個加法計算出來,圖b列項的代價仍然有點大。
在這裏插入圖片描述
上圖展現了192-位整數的深度爲2的裂項。圖a的乘法xyxy具有3個969696*96的乘法,每個乘法執行1個323232*32和2個646464*64的乘法(每個乘法需要3個32*32位乘法),總共需要21個323232*32位乘法。圖b或圖c,僅需要18個323232*32位乘法就可以完成計算。
例2(192位數乘法):考慮Karatsuba-Ofman算法應用於192-位整數乘法的例子,假設設備字長W=32W=32。按上圖所示的3個深度位2的方法,圖a需要21個323232*32位乘法,圖b和圖c只需要18個。主要的思路是3l3l-位整數x=x222l+x12l+x0x=x_22^2l+x_12^l+x_0y=y222l+y12l+y0y=y_22^{2l}+y_12^l+y_0能夠計算如下:在這裏插入圖片描述
有限域的乘法性能在橢圓曲線機制中是非常重要的。囿於硬件乘法器和傳播成本的限制,執行以上算法勢必會引起明顯的瓶頸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章