RSA系列——高精度除法

為什麼要寫這個呢……

RSA演算法中涉及到大質數的找尋以及大整數的運算,高精度的除法和取模難以避免,那本文就當是對之前的RSA系列的一個補充吧。

筆者苦苦求教很久,卻發覺國內有關高精度除法的相關文獻甚少,目前大概只知道三種演算法:課本除法(也就是模擬列豎式)、分治除法(具體尚不明確)以及牛頓除法(本文將會介紹)。另外還從Picks大爺處偷學來了多項式求逆、多項式除法和取模的演算法,本期待可坐享其成,不料Picks本人也表示也沒想過將那演算法應用到高精度除法去,只好作罷。後來經過@李陶冶 大爺指點,學來了這麼個方法……在國外的一篇paper上看到這個方法叫Newton Division,姑且就譯作牛頓除法吧……下面對此演算法進行簡述。

我們在計算Adiv B時,相當於計算Atimes frac{1}{B} ,我們可以試著求一下frac{1}{B} 的近似值。構造數列left{ a_{n}  right} 其中0<a_{1} <frac{1}{B},且滿足遞推式a_{n+1} =a_{n}left( 2-Ba_{n} right) 。很容易得出此數列收斂於frac{1}{B} 。那麼left{ a_{n} right} 收斂得有多快呢?可以由計算的出結果。下面的方法由@陸葳蕤 提供,這裡只說個大概。

構造數列left{ b_{n} right} ,其中b_{n}=frac{1}{B} -a_{n},則a_{n}=frac{1}{B}-b_{n},帶入left{ a_{n} right} 的遞推式有b_{n+1}=Bb_{n}^{2} ,累乘可得b_{n+1}=b_1left( Bb_1right) ^{2^n-1}。雙指數!收斂速度十分可觀。

注意到我們的遞推式只用到了乘法和減法,乘法使用fft加速,複雜度怎麼也不會高於O(nlog^2n)(經評論區討論,應該只有一個log)。

在實現的時候要注意這樣一個問題:left{ a_{n}right} 的有效數字的位數是呈指數級增長的,因此必須設定一個限度以防爆炸。具體的有效數字的位數要據情況而定,設為與被除數相同應該是足夠的了。

精度問題?設q=lfloor{Atimes frac{1}{B} }rfloor(向下取整),r=A-qB。因為frac{1}{B} 的精確的有效數字與A相同,一般此時的r就是所求的餘數了,最多也只會出現需要再減一次的情況(比如整除),特判即可。

一件大快人心的事情:RSA演算法中只需要預處理模數的倒數即可。

好,應該就這麼多了吧。高考之前都不再更文辣(其實是不知道更什麼=。=)。

(剛得知還有一個更適合RSA的蒙哥馬利演算法……高考之後再更那個吧)

代碼還是貼出來吧。如有紕漏還望指正。

高精度除法代碼

推薦閱讀:

現在密碼學研究還有實際意義嗎?
你好,密碼學(2):密碼的演變(下)
全同態加密釋疑(四):轉折點:LWE上全同態加密的誕生
RSA系列——大質數找尋
用密碼學玩暗軍棋 -- 閑聊多方計算

TAG:计算机科学 | 数学 | 密码学 |