楕円曲線暗号のための数学8(マルチスカラー倍算のパラメータ最適化)
初めに
前回、楕円曲線の複数の点のスカラー倍算の和を求める方法を紹介しました。
今回は、その手法が効率よくなるパラメータを探します。今まで紹介した技法の総まとめのようなものですので、過去の記事も復習してください。
記号の準備
楕円曲線
マルチスカラー倍算適用前の準備
まず、有限体の複数の元の逆数を一度に求める高速な方法を用いて、入力された全ての楕円曲線の点
こうすることで、以降の楕円曲線の加算についてヤコビ座標とアフィン座標の併用するテクニックが使えます。
BLS12-381の楕円曲線の自己準同型写像
この準備により、
アルゴリズムの疑似コード
前回紹介したアルゴリズムを疑似コードに書き下ろします。
# Σ (x[i]のposビットからwビット) * P[i]
def mulVecUpdateTable(x, pos, w, P):
tblN = 2**w - 1
tbl = [0] * tblN
for i in range(n):
v = (x[i] >> pos) & tblN # x[i]のposビットからwビット取り出す
if v:
tbl[v-1] += P[i]
sum = tbl[tblN - 1]
win = sum
for i in range(1, tblN+1):
sum += tbl[tblN - 1 - i]
win += sum
return win
def msm(x, P):
# 自己準同型写像適用後
# x : 128ビット整数
# P : アフィン座標化済
w = ???
tblN = 2**w - 1
maxBitSize = 128
winN = (maxBitSize + w-1) // w
z = mulVecUpdateTable(x, w * (winN-1), w, P)
for w in range(1, winN):
for i in range(w):
z = dbl(z)
z += mulVecUpdateTable(x, w * (winN-1-w), w, P)
return z
簡単に疑似コードの説明をします。
-
msm(x, P)
がΣ x[i] P[i]
を計算します。アフィン座標化や自己準同型写像適用済とします。x[i]
の最大ビット長maxBitSize
は128です。 -
w
ビットずつx[i]
を切り出す回数はwinN
です。w
はこれから決めます。 -
mulVecUpdateTable
(名前がよくないですが思いつかない) はx[i]
のpos
ビットからw
ビット取り出してP[i]
との積の和を求めます。
演算コストの見積もり
前節の疑似コードにしたがって演算コストを見積もりましょう。
dbl
の回数は w * winN
でほぼ maxBitSize
で一定なので加算回数のみをカウントします。
mulVecUpdateTable
ではおよそ n
回の add
をした後、2 * tblN
回の add
をして、それを winN
回呼び出して add
するので、全体で
です(定数項は多少いいかげんです)。tbl=2**w-1
で winN=128/w
なので、関数の形にすると、
したがって、n
が与えられたときに w
を使うのがよいです。
演算コストが最小となるパラメータ
w
を求めるのですが、解析的には解けません。LambertのW関数(関数
簡単な近似式が無いかと試行錯誤して、
def ilog2(n):
return n.bit_length()
def argmin_of_f(n):
if n <= 16:
return 2
log2n = ilog2(n)
return log2n - ilog2(log2n)
というのを見つけました。残念ながら、どうやって導出したのかは覚えていません。思い出せたらまた紹介します。
ilog2(x)
は bsr
命令で簡単に求められます。
ざっと調べた感じでは1から1億までの範囲で厳密解との差は
そのため、argmin_of_f
で近似解 w
を求めてからその前後の f_n(w-1)
, f_n(w+1)
を計算して一番小さいのを見つければ厳密解に一致します。
msmの演算コスト評価
前節のargminを用いてコストを評価しましょう。
1回のスカラー倍算を
argmin_of_f(n)
は w=9
なので、
1回だけのスカラー倍算の加算のコストはウィンドウサイズ
逆に
Discussion