モンゴメリ乗算のソースを表示
←
モンゴメリ乗算
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
'''モンゴメリ乗算'''(モンゴメリじょうざん、{{lang-en-short|Montgomery multiplication}})とは、特に時間のかかる[[除法|除算]]を実質的に行うことなく、[[乗算]]・[[加算]]・[[減算]]・[[シフト演算]]のみで、効率的に[[整数]]の積の[[剰余]]を求めることのできる[[アルゴリズム]]である。 応用において、特に[[暗号理論]]の分野では、数百[[ビット]]を超える法による[[冪剰余]]演算が重要な役割を果たし、このような冪剰余の演算にモンゴメリ乗算が用いられている。 モンゴメリ乗算の名称は提案者の {{en|Peter Montgomery}} に由来する。 モンゴメリ乗算はまた、'''モンゴメリ法''' ({{Lang-en-short|Montgomery method}}) 、'''モンゴメリ剰余乗算''' ({{Lang-en-short|Montgomery modular multiplication}}) とも呼ばれる。 ==概要== モンゴメリ乗算のアイデアは、<math>N>0</math> を法とした合同算術に関して、演算したい値を、ある定数 <math>R</math> を掛けた表現(ここではモンゴメリ表現と呼んでおく)に変換し、この表現によってすべての計算を行った後、最後に元の領域での表現に逆変換することである。 モンゴメリ表現での加減算はそのまま実行した後、負または <math>N</math> 以上のときのみ <math>N</math> の加減をするだけでよい。 しかし乗算では <math>R</math> が余分に残るので、<math>R^{-1}</math> を掛けて <math>N</math> による剰余を求める処理を行う必要がある。 この処理をモンゴメリリダクションといい、<math>R</math> をうまく選ぶことにより効率的に計算することができる。 ==アルゴリズム== ===モンゴメリリダクション=== 上述したように、モンゴメリリダクションは、モンゴメリ乗算の基本となる演算である。 <math>N</math> を法とする <math>R</math> に関する <math>T</math> ( <math>0\le T < NR</math> )のモンゴメリリダクションは : <math>\mbox{MR}(T) = TR^{-1} \bmod N</math> と定義される。 ここで、<math>R</math> は <math>R>N</math> および <math>\gcd(N,R)=1</math> (つまり <math>N</math> と[[互いに素 (整数論)|互いに素]])なる任意の整数であり、<math>R^{-1}</math> は <math>RR^{-1}\equiv 1 \pmod{N}</math> なる[[モジュラ逆数]]である。 モンゴメリリダクションは次の手続きで計算できるが、<math>R</math> として、<math>\bmod R</math> と <math>/ R</math> の計算が簡単になるような値(例えば2進数であれば2の冪)を選ぶことにより、除算を実質的に行う必要がなくなり効率的に計算できる。 ここで、<math>N'</math> は <math>NN'\equiv-1 \pmod{R}</math> なる値であり、<math>xR-yN=1</math> を満たす <math>0<y<R</math> として、[[ユークリッドの互除法#拡張された互除法|拡張されたユークリッドの互除法]]や[[#Rが2の冪の時のN'の効率的な求め方]]などであらかじめ求めておく。 同時に得られる <math>0<x<N</math> は上述の <math>R^{-1}</math> である。 : <math>t \leftarrow (T+(TN' \bmod R)N) / R</math> : '''if''' <math>t \ge N</math> '''then''' '''return''' <math>t-N</math> '''else''' '''return''' <math>t</math> ====モンゴメリリダクション計算手続きの正当性==== この手続きの正当性は次のように示される。 まず、 : <math>T+(TN' \bmod R)N \equiv T+TN'N \equiv T-T \equiv 0 \pmod{R}</math> より、<math>/ R</math> が割り切れて <math>t</math> が整数であることがわかる。 次に、 : <math>tR \equiv T+(TN' \bmod R)N \equiv T \pmod{N}</math> より、<math>t \equiv TR^{-1} \pmod{N}</math> である。 最後に、 : <math>T < RN</math>, <math>(TN' \bmod R)N < RN</math> より、<math>0 \le t = (T+(TN' \bmod R)N) / R < 2N</math> であるため、手続きが返す値は <math>N</math> より小さい。 ===モンゴメリ表現への変換と逆変換=== 整数 <math>0\le a<N</math> をモンゴメリ表現 <math>A</math> に変換するためには、<math>R</math> を掛けて <math>N</math> による剰余を求めればよいので、あらかじめ <math>R_2 = R^2 \bmod N</math> を用意して、<math>A \leftarrow \mbox{MR}(aR_2)</math> を求めればよい。 逆変換はモンゴメリリダクションそのものであり、<math>a \leftarrow \mbox{MR}(A)</math> である。 ===乗算剰余演算=== 被乗数 <math>0\le a<N</math> と乗数 <math>0\le b<N</math> の乗算剰余 <math>c = ab \bmod N</math> は、上述の変換と逆変換を用いて、 : <math>A \leftarrow \mbox{MR}(aR_2)</math>, <math>B \leftarrow \mbox{MR}(bR_2)</math> : <math>C \leftarrow \mbox{MR}(AB)</math> : <math>c \leftarrow \mbox{MR}(C)</math> により求められる。 しかし、単純に乗算剰余を1回だけ求めたい場合には、 : <math>c \leftarrow \mbox{MR}(\mbox{MR}(ab)R_2)</math> とする方が効率的である。 ===冪剰余演算=== 冪剰余 <math>a^k \bmod N</math> を求めたい場合、まず <math>a</math> をモンゴメリ表現に変換しておき、<math>A^k</math> の計算に出現する乗算のたびに積にモンゴメリリダクションを行っていけば、最後の結果に対して逆変換することによって結果を得ることができる。 通常の冪の計算では[[冪乗#効率的な演算法|バイナリ法]]などが効率的であるが、冪剰余の計算においても、同様の効率化がそのまま利用できる。 ==Rが2の冪の時のN'の効率的な求め方== Rが2の冪である場合には、計算機向けの効率的な求め方が存在する。 <math>NN'\equiv-1 \pmod{R}</math> は <math>NN'\equiv R-1 \pmod{R}</math> であり、Rが2の冪であるためR-1は二進数表記で全てのビットが1になる。また2の冪での剰余を求めることは即ち二進数表記での下位ビットを取り出すことである。なのでこれは実質的に、NN'の二進数表記の下位ビット全てが1になるN'を求めることに相当する。 <syntaxhighlight lang="c"> int result = 0; int t = 0; int r = R; int i = 1; while( r > 1 ) /* Rのトップビットを除いたビット数分繰り返す */ { if( !( t % 2 ) ) /* ゼロになっているビットがあったら、N'のその部分を1にする(NはRと互いに素なので必ず奇数) */ { t += N; /* 掛け算だが、二進数一桁の掛け算なので実質は足し算 */ result += i; /* N'のその部分を1にする */ } t /= 2; /* 必ず端数が出るが切り捨てる */ r /= 2; /* Rは2の冪なので、絶対端数は出ない */ i *= 2; } /* return result; この時点で N' == result */ </syntaxhighlight> ==参考文献== * Peter Montgomery, "[http://www.jstor.org/stable/2007970 Modular Multiplication Without Trial Division]," Math. Computation, vol. 44, pp. 519–521, 1985. {{DEFAULTSORT:もんこめりしようさん}} [[Category:コンピュータの算術]] [[Category:暗号]] [[Category:合同算術]] [[Category:数学に関する記事]] [[Category:数学のエポニム]]
このページで使用されているテンプレート:
テンプレート:En
(
ソースを閲覧
)
テンプレート:Lang-en-short
(
ソースを閲覧
)
モンゴメリ乗算
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報