暗号理論入門 3.12〜3.13
- 作者: 林芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2012/04/20
- メディア: 単行本
- この商品を含むブログを見る
3.12 高速指数計算法
指数の高速計算は多くの暗号アルゴリズムで重要。
とし、 は自然数とする。
は の二進展開とする。係数 は0または1。
このとき、次が成立する。
よって次の手順で指数が計算できる。
1. 順次連続する平方数 を計算する。
2. を に対する の積として決定する。
このとき、 であり、 は を平方することで計算される。
pythonで実装してみた。
(pythonの**演算子では既にこういったアルゴリズムが使われているだろうけど。)
def my_pow(base, exp): result = 1 while exp > 0: if exp & 1: result *= base base *= base exp /= 2 return result
baseには順次計算した平方数が入る。
指数部分expを二進展開したとき、対応しているbitが1のとき、baseの平方数を掛け合わせる。
6の73乗を計算してみる。
>>> my_pow(6, 73) 638324153542299148846280854514738362441007133779155746816L >>> 6**73 638324153542299148846280854514738362441007133779155746816L
3.13 巾乗積高速計算法
は有限アーベル群で は の元、 は負でない整数とする。巾乗積
を計算する。
の二進展開を
とする。少なくとも一つの に対して、 は零でないとする。 と に対して、 は整数で二進展開 をもつとする。
が に対し成立するとする。そのとき が に対して成立する。
最後に
とおく。このとき が求める巾乗の積となる。逐次繰り返して を計算する。
から
となる。すべての に対して、
が決まる。このとき
となる。
すべての 、 の計算には 上で 回の積が必要。
を計算するにはまだ n - 1 回の平方と積が 上で必要。