Barrett Reduction について考えたこと
Barrett Reduction とは
えびちゃんさんの記事 がわかりやすかったです. アイデアは固定された除数 に対して 適当な 冪である定数 を使って を前計算しておくことで, を で近似すれば除算を乗算とビット演算で置き換えられるという感じです. また, の時近似の誤差が高々 であることが知られています.(ACLの実装も (実質) を要求しています)
考えたことその1 : とは限らない場合
とします.この時 です. で,求めたい値が であることに留意すると,誤差が高々 になる十分条件は より であればよさそうということがわかります. よりも扱いやすい制約になった気がします.
考えたことその2 : 誤差を にする方法
前の章と同じようなことをすると, であればよさそうなので,こうなる条件を考えることにします.これの十分条件として があるので, の最大値を として となるように をとることとします. この時オーバーフローが若干心配になりますが, なので途中で出てくる数はそこまで大きくないことも確認できました.
実際この方法のほうが ACL の実装より幾分か高速な様です.( としたとき を で切り下げ除算した結果が常に なことを利用した高速化もしています.)
https://wandbox.org/permlink/2lTdpwYkMnUw3MkG
追記 とした方がやや楽です.
https://wandbox.org/permlink/ozHZS9fb8BleVpt2