c - 如何避免模乘法溢出?

标签 c math overflow modular-arithmetic

我知道,

(a*b)%m = ((a%m)*(b%m))%m

但是有溢出的可能。 为简单起见,假设整数的大小为 2 位。 如果 a = 2(即 102)且 b = 2(即 102),m = 3(即 112),则 a%m 和 b%m 结果为 2,乘法后答案为 4(即 100),不适合整数大小。如果从 4 开始考虑 2-lsb,则最终答案将为 0。 但实际答案是 1。

我应该怎么做才能避免这种情况?

最佳答案

如果 m-1 平方不适合您的整数类型,您需要执行长乘法。对于您的两位示例,这意味着将您的两位数分成一对一位数(高位和低位)并将所有四对相乘(高乘以高,高乘以低,低乘以高,低低)单独。然后,您可以获得每对的结果 mod m(注意它们代表的实际位置,即四、二或一)并添加结果 mod m

关于c - 如何避免模乘法溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28259832/

相关文章:

javascript - CSS/JS 滚动一个较低的 z-index div

c - 在C中实现由上/下箭头键触发的命令历史记录

math - 有 F# 的数学库吗?

algorithm - 如何从线角度获取点 X、Y 坐标?

jquery - CSS 菜单列表项需要显示在 div 容器内

CSS 文本溢出错误?在谷歌浏览器中

c - C 中的哈希算法将 16 个字节值映射到 2 个字节值

php - ajax 调用从 php libevent 客户端获取连续/流数据

c - 将 uintmax_t 或 size_t 传递给自定义 printf 转换说明符

将点连接到平面/绘制多边形