Karatsuba-Ofman乘法器是俄羅斯人Karatsuba於1962年提出的,主要思想是採用分治算法計算整數乘法,將計算複雜度向前推進到,而此前普遍認爲整數乘法的計算複雜度是。
來看一個例子:假設,,是-位整數,於是:
可以通過3個-位的整數乘法(而不是-位的整數乘法)和2個乘法,2個減法算式計算出來。
若數值較大,加法和減法相對乘法的計算代價可以忽略。在經典算例中,程序可以反覆迭代到中位數,並一直執行到滿足閾值(可能的值是機器字長度)的條件才停止。
對於大小適中的整數,Karatsuba算法的執行上限是需要考慮的因素。不同於傳統方法,Karatsuba算法的執行儘可能減少移位請求(對於和乘法),並且高效使用面向字節的操作。例如:採用拆分字節的邊界的方法有可能更好,一個指定階段的分裂可以拆分成2個以上片段。
例1(Karatsuba-Ofman方法):考慮224-位整數和的乘法,運算設備的字節長度爲。2個深度爲2的方法展現如下圖所示,顯然,圖a的裂項從數學上看可能更爲優雅並且在代碼上更具備重用性。然而,卻需要更多的移位操作,這是因爲裂變並非以字長單位爲邊界進行。如果56-位數的乘法的代價近似於64-位數乘法,顯然裂項對於硬件容量利用不足,這是因爲如圖b所示,9個64位乘法與1個32位、8個64位乘法的代價完全不同。另外,圖b的列項建立在字長單位爲邊界的基礎上,由於存在加法移位,具有更多的複雜的跨項計算。例如,深度爲2的跨項具有形式
上圖展示了224-位的整數分裂成深度爲2的二叉樹。圖a所示的乘積包括採用3個位乘法,每個執行又採用3個5656位的乘法。b圖所示的xy包括採用一個9696位乘法(列項爲一個3232位和2個6464位乘法)和2個128128位的乘法(每個產生3個位乘法)。
如下:
其中,和在圖a爲57-位數,在圖b爲65-位數。雖然可以被1個6464位乘法和2個加法計算出來,圖b列項的代價仍然有點大。
上圖展現了192-位整數的深度爲2的裂項。圖a的乘法具有3個的乘法,每個乘法執行1個和2個的乘法(每個乘法需要3個32*32位乘法),總共需要21個位乘法。圖b或圖c,僅需要18個位乘法就可以完成計算。
例2(192位數乘法):考慮Karatsuba-Ofman算法應用於192-位整數乘法的例子,假設設備字長。按上圖所示的3個深度位2的方法,圖a需要21個位乘法,圖b和圖c只需要18個。主要的思路是-位整數和能夠計算如下:
有限域的乘法性能在橢圓曲線機制中是非常重要的。囿於硬件乘法器和傳播成本的限制,執行以上算法勢必會引起明顯的瓶頸。
Karatsuba-Ofman乘法器
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.