我必须执行(a * b) % m, 但是a, b,和 m是 128 位无符号类型,乘法期间溢出的可能性很大。我怎样才能得到正确的答案(可能使用%更多)?
我正在尝试在 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)
// ^^^^^^^^^^^
}
Run Code Online (Sandbox Code Playgroud)
从数学角度来说:
fn mod_exp(b: u128, e: u128, m: u128) {
(0..e).fold(1, |x, _| (x * b) % …Run Code Online (Sandbox Code Playgroud)