我正在用 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 位机器上运行良好。此外,我现有的函数被简单地转换为适用于其他大小的无符号整数,这是一个很好保留的属性。