快速指數算法

出問題了,程序好像錯了,這兩天考試,考完試改

問題簡介

在RSA中,加、解密過程都是要求某個整數的整數次冪後再取模。大多時候,這兩個整數都會比較大,這時候直接按含義來進行計算時獲得的中間結果會超出計算機所容許的整數取值範圍(例如計算\(66^{77}\),這仍是比較小的);另外一方面,咱們也要考慮計算的效率,如\(66^{77}\)直接按照定義計算的話須要作76次乘法,開銷是至關大的。針對這兩個問題,咱們就須要有一個好的算法來高效且準確地計算大整數的冪運算。python

初步思路

針對第一個問題,即數值過大問題,能夠考慮利用模運算的性質:算法

\[(a*b)(mod n) = [(a (mod n))*(b (mod n))](mod n) \]

就能有效減少中間值。
針對第二個問題,能夠利用指數的性質,對每一個部分的結果重複作平方運算,最低能夠將運算次數減爲\(log_2n\),如計算\(x^{16}\)時,能夠按照以下方式進行:spa

\[x^2,x^4,x^8,x^{16} \]

只須要計算4次,比按照定義計算減小了3/4。code

快速指數算法

快速指數算法整合了上面兩種思想,算法描述以下:it

一般,在咱們計算\(a^mmodn\)時,先將m表示爲二進制形式\(b_k,b_{k-1},...,b_0\),即class

\[m = \sum\limits_{b_i=1}2^i \]

所以,效率

\[a^m = a^{\sum\limits_{b_i=1}2^i} = \prod\limits_{b_i=1}a^{2^i} \]

\[a^mmodn = [\prod\limits_{b_i=1}a^{2^i}]modn = \prod\limits_{b_i=1}[a^{2^i}modn] \]

代碼簡略實現:二進制

d = 1
for i in range(k+1):
    d = d*d%n
    if b[i] == '1':
        d = d*a%n

忽然想起來,今天林老師課上說咱們講義上錯誤真的不少,但我相信以大家的能力都能糾正過來,嗚嗚嗚,我哭辣,一下午就記住這一句話程序

相關文章
相關標籤/搜索