バイナリ法によるべき乗計算のPythonプログラム

バイナリ法

$x=a^k$のとき、$k$回の2乗計算が必要になるが、効率よく計算するためには、$a^{2^i}$を順次求めることで、計算量を$log(k)$回に抑えることができる。これがバイナリ法である。RSA暗号の複合時のべき乗計算などで用いられる。

具体例

$5^{21}$を計算する場合、以下のように展開する。

$5^{21}=5^{2^4}*5^{2^2}*5^{2^0}$

2進数に展開し、左から順に展開することにより計算を実行する。つまり、$21$の2進数表記である$10101$を使って以下のように計算する。

$5^{21} = 5^{(10101)_2} = 5^{(12^4 + 02^3 + 12^2 + 02^1 + 1*2^0)_2} = 5^{16} * 5^{4} * 5^{1}$

これにより、計算回数が大幅に削減される。

プログラム

以下は、Pythonでバイナリ法を用いたべき乗計算を行うプログラムである。

def binary_exponentiation(k: int, g: int, p: int) -> int:
    # 2進数表記に変換
    k_binary = []
    while k != 0:
        k_binary.append(k % 2)
        k = k // 2
        if k == 1:
            k_binary.append(k)
            k = 0
    
    # バイナリ法によるべき乗計算
    y = 1
    for i in reversed(range(len(k_binary))):
        if k_binary[i] == 1:
            y = (y * y % p) * g % p
        else:
            y = (y * y % p)
    
    return y

このプログラムでは、入力としてべき乗の指数$k$、底$g$、法$p$を受け取り、バイナリ法を用いてべき乗計算を行い、計算結果を返す。

Tags: