モンゴメリ乗算
Latest Author
モンゴメリ乗算(Montgomery multiplication)は、剰余環での演算を定数倍高速化するテクニックである。
Montgomery reduction
を、となる固定された2つの整数としたとき、整数に対しを計算したいとする。 素直に計算する場合、は事前に計算しておくとしても、にそれを掛け算した後での剰余演算が必要になる。 Montgomery reductionの基本的なアイデアは、を掛ける代わりに「実際にで割る」ことで、での剰余を取らなくてもよいように効果的に"reduce"できる、ということである。
となるを事前に計算しておく。 とし、とすると、かつとなる。 これは中国人剰余定理をしているのと同じであることに注意しておく。 さて、このはの倍数であるので、逆元を使わなくても整数上の割り算ができる。これにより、としてとなる答えが計算できた。
の大きさを考えよう。であるので、である。よって、の場合、となる。
この場合、if(c >= m) c -= m;
のようなコードによりを未満の標準形へ"reduce"できた。
nが2の累乗ならば割り算,剰余算なしでビット演算,シフトだけで計算できることが重要である。
自体はある程度小さければ標準形である必要がないことに注意しておく。
Montgomery multiplication
モンゴメリ乗算は、剰余環の要素を違う方法で保持することで、Montgomery reductionによって掛け算の際の剰余を行わなくてよいようにするテクニックである。
モンゴメリ乗算を用いるには、値に対してと変換して保持する。この変換にはによる剰余が必要であるが、この変換は1度だけなので、剰余環上での計算を連続して行う場合にはコストをならせる。 そのように変換した, に対して、足し算・引き算はとして通常通り計算できる。 問題は掛け算であるが、定義よりとなる。 であるので、となるようにを取ればここでMontgomery reductionが使える。 はでありさえすれば任意に取れるので、が2を約数に含まない場合にはを2の累乗に取れば剰余算なしに高速に剰余環での掛け算が計算できた。
なお、からを得るには、単にに対してMontgomery reductionを適用すればよい。 また、を求める時はを求めたあとをかけてMontgomery reductionをすればよい。
高速化
でさえあればよいので、数個の掛け算の和を求めるような処理の場合、掛け算のたびにMontgomery reductionをしなくても、最後に1回だけreductionをすればよい。
多項式の場合
多項式に対してもMontgomery reductionとモンゴメリ乗算を自然に一般化できる。
多項式の場合、"if(c >= m) c -= m;
"の部分は必要ない。
また、整数でいう2の累乗は変数の累乗に対応する。
多項式の場合も定数倍高速化になりうる。