モンゴメリ乗算

Latest Author anta /Date 2015-06-06 17:55:50 / Views 10257
12 (Favした一覧ページはユーザーページから)

モンゴメリ乗算(Montgomery multiplication)は、剰余環での演算を定数倍高速化するテクニックである。

Montgomery reduction

0<m,n0 < m, nを、gcd(m,n)=1\gcd(m, n) = 1となる固定された2つの整数としたとき、整数aaに対しa×n1modma \times n^{-1} \bmod mを計算したいとする。 素直に計算する場合、n1(modm)n^{-1} \pmod mは事前に計算しておくとしても、aaにそれを掛け算した後mmでの剰余演算が必要になる。 Montgomery reductionの基本的なアイデアは、n1n^{-1}を掛ける代わりに「実際にnnで割る」ことで、mmでの剰余を取らなくてもよいように効果的に"reduce"できる、ということである。

r(m)1(modn)r \equiv (-m)^{-1} \pmod nとなる0r<n0 \le r < nを事前に計算しておく。 b=a×rmodnb = a \times r \bmod nとし、t=a+b×mt = a + b \times mとすると、ta(modm)t \equiv a \pmod mかつt0(modn)t \equiv 0 \pmod nとなる。 これは中国人剰余定理をしているのと同じであることに注意しておく。 さて、このttnnの倍数であるので、逆元を使わなくても整数上の割り算ができる。これにより、c=t/nc = t / nとしてcan1(modm)c \equiv a n^{-1} \pmod mとなる答えが計算できた。

ccの大きさを考えよう。b<nb < nであるので、t<a+mnt < a + m nである。よって、0a<mn0 \le a < m nの場合、0c<2m0 \le c < 2mとなる。 この場合、if(c >= m) c -= m;のようなコードによりccmm未満の標準形へ"reduce"できた。 nが2の累乗ならば割り算,剰余算なしでビット演算,シフトだけで計算できることが重要である。 aa自体はある程度小さければ標準形である必要がないことに注意しておく。

Montgomery multiplication

モンゴメリ乗算は、剰余環の要素を違う方法で保持することで、Montgomery reductionによって掛け算の際の剰余を行わなくてよいようにするテクニックである。

モンゴメリ乗算を用いるには、値xxに対してx=x×nmodm\overline x = x \times n \bmod mと変換して保持する。この変換にはmmによる剰余が必要であるが、この変換は1度だけなので、剰余環上での計算を連続して行う場合にはコストをならせる。 そのように変換したx\overline x, y\overline yに対して、足し算・引き算はx+yx+y\overline {x + y} \equiv \overline x + \overline yとして通常通り計算できる。 問題は掛け算であるが、定義よりx×yx×y×n1\overline {x \times y} \equiv \overline x \times \overline y \times n^{-1}となる。 x×y<m2\overline x \times \overline y < m^2であるので、mnm \le nとなるようにnnを取ればここでMontgomery reductionが使える。 nnmn,gcd(m,n)=1m \le n, \gcd(m, n) = 1でありさえすれば任意に取れるので、mmが2を約数に含まない場合にはnnを2の累乗に取れば剰余算なしに高速に剰余環での掛け算が計算できた。

なお、x\overline xからxxを得るには、単にx\overline xに対してMontgomery reductionを適用すればよい。 また、x1\overline {x^{-1}}を求める時はx1{\overline x}^{-1}を求めたあとn2modmn^2 \bmod mをかけてMontgomery reductionをすればよい。

高速化

a<nma < n mでさえあればよいので、数個の掛け算の和を求めるような処理の場合、掛け算のたびにMontgomery reductionをしなくても、最後に1回だけreductionをすればよい。

多項式の場合

多項式に対してもMontgomery reductionとモンゴメリ乗算を自然に一般化できる。 多項式の場合、"if(c >= m) c -= m;"の部分は必要ない。 また、整数でいう2の累乗は変数の累乗に対応する。 多項式の場合も定数倍高速化になりうる。