我必须执行(a * b) % m
, 但是a
,b
和是 128 位无符号类型,并且乘法期间溢出的可能性很大。 m
我怎样才能得到正确的答案(可能使用%
更多)?
我正在尝试在 Rust 中实现模指数函数,其中最大的内置类型是u128
(这是我可以使用的最大值)。这三个变量都很大,所以(a * b) > 2^128
很容易。我可以用它a.overflowing_mul(b)
来检测是否发生了溢出,但是我不知道如何从溢出的结果(可以认为是(a * b) % 2^128
)返回来得到(a * b) % m
.
我的模指数代码如下所示(目前没有添加溢出支持):
fn mod_exp(b: u128, e: u128, m: u128) {
(0..e).fold(1, |x, _| (x * b) % m)
// ^^^^^^^^^^^
}
从数学的角度来看:
(a * b) % m IS ACTUALLY (a * b) % B % m
| B = current base (2^128)
例子:
// Mathematical
(9 * 13) % 11 = 7
// Real (base 20):
(9 * 13) % (B = 20) % 11 = 6
^^^^^^^^^^ ^ should be 7
(8 * 4) % 14 = 4
(8 * 4) % (B = 16) % 14 = 0
^^^^^^^^^^ ^ should be 4