符号なし整数に対して剰余加算と減算をすばやく行う必要があり、オーバーフロー条件を正しく処理できるアルゴリズムを C で実装しています。これが私が今持っているものです(これは機能します):
/* a and/or b may be greater than m */
uint32_t modadd_32(uint32_t a, uint32_t b, uint32_t m) {
uint32_t tmp;
if (b <= UINT32_MAX - a)
return (a + b) % m;
if (m <= (UINT32_MAX>>1))
return ((a % m) + (b % m)) % m;
tmp = a + b;
if (tmp > (uint32_t)(m * 2)) // m*2 must be truncated before compare
tmp -= m;
tmp -= m;
return tmp % m;
}
/* a and/or b may be greater than m */
uint32_t modsub_32(uint32_t a, uint32_t b, uint32_t m) {
uint32_t tmp;
if (a >= b)
return (a - b) % m;
tmp = (m - ((b - a) % m)); /* results in m when 0 is needed */
if (tmp == m)
return 0;
return tmp;
}
より良いアルゴリズムを知っている人はいますか? 私が見つけたモジュラー演算を行うライブラリはすべて、やり過ぎである大きな任意精度の数値用のようです。
編集: これを 32 ビット マシンでうまく実行したい。また、私の既存の関数は、他のサイズの符号なし整数で動作するように簡単に変換されます。これは保持すると便利なプロパティです。