モジュラ計算を効率よく行うアルゴリズムの一つに Barrett modular reduction がある。
これを解説してみる。
xとmが与えられたとき、
を計算したい。
であるbを選び、mをb進数で以下のように表現するとkが定まる。
ここで
と仮定する。このアルゴリズムではこの場合にしか適用できない。
xは以下のように表現できる。
を事前に計算しておく。
floor(a)はaの小数部を切り捨てて整数にする関数である。
アルゴリズム手順
STEP1:
STEP2:
STEP3:
もし の場合、
STEP4:
である限り、を実行する。
STEP5:
rを返す。
STEP1
となるQ,mが存在する。
このとき、が満たされる。
まずを確かめる。
以下が成り立つ。
つなげると、
で、とQは整数なので、が成り立つ。
次にを確かめる。
以下が成り立つ。
つなげると、
右辺の4つの式を評価する。
である。変形して、
が成り立つので変形して、
右辺の4つの式を評価すると
最後の2項は1に満たずはともに整数なので、が成り立つ。
STEP2, 3
は0以上未満なので、
加えて、
(式A)
(式B)
より
なので
より
したがって、
(式C)
(式A),(式B)より
であれば、
となる。
であれば、
となる。
STEP4, 5
求めたいのはRであるからは正なのでmを引いていけばRが求められる。
(式C)より、mを引く回数は最大で2回で済むことが分かる。
どこが効率的になっているのか
bは3より大きければよいので、通常は2の冪乗に取る。
STEP1のbの冪乗の整数の割り算は右へのビットシフト演算と同一なので、計算効率がよい。
STEP2のbの冪乗でのモジュラ計算はビットマスク演算と同一 なので、計算効率がよい。
STEP1のの計算はの計算を全て行う必要はなく、の右ビットシフトで消える項は計算を省略できる。(計算量1)
STEP2のの計算も同様に全て行う必要はなく、モジュラ計算で消える項は計算を省略できる。(計算量2)
マルチ精度乗算
マルチ精度乗算の繰り上がりについての評価をまずしておく。
の範囲にあるyについてと表現できる。
zも同じ範囲にあるとする。 (式A)を計算する。
(式A) =
= (式B)
k<bであるとき、(式B)はより小さくなるつまり、で割り算したとき、0になることを示す。
これを示せば最初の項から(式B)の項までは計算を省略できるということになる。
であることとを使って(式B)を評価する。
=
これで示せた。
計算量1
xは未満なので は と表現できる。
mは未満なので は と表現できる。
したがっては(式A)のようになる。
で割り算したときに0になる(式A)とそれ以前のすべての項は計算する必要がない。
単精度乗算の項数はとなる。
計算すべき和は
である。
計算量2
はともに未満なので、
である。
したがって、
と表現できる。
mはと表現される。
(式C)
(式C)以降の部分は、モジュラ計算で消えてしまうので、計算を省略できる。
計算する項の数はとなる。
おまけ
mのMSBの値の桁の値が小さく2mがよりも小さい場合は、の桁のr1-r2の引き算は省略できる。