暗号の数学

計算法 (演算の高速化)

Karatsuba乗算

$2n$ 桁の数 $u$,$v$ の乗算を行うことを考える.$u$,$v$ を基数 $b$ の冪 $x = b^n$ を用いて

\[ u=u_1x+u_0,\quad v=v_1x+v_0 \]

のように上半分と下半分に分ければ,$x$ を基数とした乗算と考えることができる.

このとき単純に $w = u v$ を求めると,

\[ w = u_1v_1x^2+(u_0v_1+u_1v_0)x+u_0v_0 \]

のように $n$ 桁 $\times$ $n$ 桁の乗算が 4回必要である.しかし

\[ u_0v_1+u_1v_0=(u_1+u_0)(v_1+v_0)- (u_1v_1+u_0v_0) \]

または

\[ u_0v_1+u_1v_0=u_1v_1+u_0v_0-(u_1-u_0)(v_1-v_0) \]

という関係を使えば $n$ 桁 $\times$ $n$ 桁の乗算は 3回で済むことが分かる.ここで,さらに $u_1,u_0,v_1,v_0$ の上位の桁を $0$ で埋めて桁数を偶数にするか,あるいは始めから $u$,$v$ の桁数を2の冪にしておけば,3回の乗算に同じアルゴリズムを再帰的に適用することができる.この乗算アルゴリズムを Karatsuba乗算(Karatsuba Multiplication)という. すなわち,$b$ 進法で表現したとき 2桁になる整数同士の乗算は,$b$ 進法で1桁の整数同士の乗算を3回と,それよりもコストの十分に小さい加減算を用いて行うことができる.

$n = 2^k$と仮定したとき,$b$ 進法で $n$ 桁の整数同士の乗算をKaratsuba乗算で行うと,$b$ 進法で1桁の整数同士の乗算が $3^k$ 回必要となる.$k = \log_{2}n$ より,この方法での $b$ 進法で $n$ 桁の整数同士の乗算のコストは,$3^k = 3^{\log_{2}n} = n^{\log_{2}3} \cong n^{1.585}$ 程度で済むことになる. 実際には $n$ が $2^k$ で表現できるとは限らないので,$2^k$ で表現できないときは $n^{1.585}$ よりも少し余計にかかる.

多項式の積 (Karatsuba - Offman乗算)

多項式の変数 $x$ の係数を計算するときに,$x^0$ や $x^2$ の係数を再利用することにより,加減算より遅い乗算の回数を削減でき高速化が図れる($a_i$ や $b_i$ が多項式である場合には効果がある).

\begin{align} &(a_0 + a_1x)(b_0 + b_1x) = a_0b_0 + (a_0b_1 + a_1b_0)x + a_1b_1x^2\\ &= a_0b_0 + \{(a_0 + a_1)(b_0 + b_1) - a_0b_0 - a_1b_1\}x + a_1b_1x^2 \end{align} \begin{align} &(a_0 + a_1x + a_2x^2)(b_0 + b_1x + b_2x^2)\\ &= a_0b_0 + [\{(a_0 + a_1)(b_0 + b_1) - a_1b_1\} - a_0b_0]x + [(a_0 + a_1 + a_2)(b_0 + b_1 + b_2)\\ &\quad - \{(a_0 + a_1)(b_0 + b_1) - a_1b_1\} - \{(a_1 + a_2)(b_1 + b_2) - a_1b_1\}]x^2\\ &\quad + [\{(a_1 + a_2)(b_1 + b_2) - a_1b_1\} - a_2b_2]x^3 + a_2b_2x^4\\ \end{align}

中国人の剰余定理

剰余演算

逆元

Montgomery 算法


inserted by FC2 system