小编ARa*_*piK的帖子

如何解决可能的乘法溢出以获得正确的模运算?

我必须执行(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)

integer-overflow int128 modulo rust

3
推荐指数
1
解决办法
563
查看次数

标签 统计

int128 ×1

integer-overflow ×1

modulo ×1

rust ×1