RSA系列——高精度除法
為什麼要寫這個呢……
RSA演算法中涉及到大質數的找尋以及大整數的運算,高精度的除法和取模難以避免,那本文就當是對之前的RSA系列的一個補充吧。
筆者苦苦求教很久,卻發覺國內有關高精度除法的相關文獻甚少,目前大概只知道三種演算法:課本除法(也就是模擬列豎式)、分治除法(具體尚不明確)以及牛頓除法(本文將會介紹)。另外還從Picks大爺處偷學來了多項式求逆、多項式除法和取模的演算法,本期待可坐享其成,不料Picks本人也表示也沒想過將那演算法應用到高精度除法去,只好作罷。後來經過@李陶冶 大爺指點,學來了這麼個方法……在國外的一篇paper上看到這個方法叫Newton Division,姑且就譯作牛頓除法吧……下面對此演算法進行簡述。
我們在計算時,相當於計算,我們可以試著求一下的近似值。構造數列其中,且滿足遞推式。很容易得出此數列收斂於。那麼收斂得有多快呢?可以由計算的出結果。下面的方法由@陸葳蕤 提供,這裡只說個大概。
構造數列,其中,則,帶入的遞推式有,累乘可得。雙指數!收斂速度十分可觀。
注意到我們的遞推式只用到了乘法和減法,乘法使用fft加速,複雜度怎麼也不會高於(經評論區討論,應該只有一個log)。
在實現的時候要注意這樣一個問題:的有效數字的位數是呈指數級增長的,因此必須設定一個限度以防爆炸。具體的有效數字的位數要據情況而定,設為與被除數相同應該是足夠的了。
精度問題?設(向下取整),。因為的精確的有效數字與相同,一般此時的就是所求的餘數了,最多也只會出現需要再減一次的情況(比如整除),特判即可。
一件大快人心的事情:RSA演算法中只需要預處理模數的倒數即可。
好,應該就這麼多了吧。高考之前都不再更文辣(其實是不知道更什麼=。=)。
(剛得知還有一個更適合RSA的蒙哥馬利演算法……高考之後再更那個吧)
代碼還是貼出來吧。如有紕漏還望指正。
高精度除法代碼
推薦閱讀:
※現在密碼學研究還有實際意義嗎?
※你好,密碼學(2):密碼的演變(下)
※全同態加密釋疑(四):轉折點:LWE上全同態加密的誕生
※RSA系列——大質數找尋
※用密碼學玩暗軍棋 -- 閑聊多方計算