42

在提出问题 3 年后,我找到了解决方案。我已将其作为答案

我有一个带有模数的表达式,需要用 x 表示。

(a + x) 模 m = b

我不知道如何处理模数。有没有办法自己得到 x,或者我在这个上不走运?

编辑:我意识到我可以得到多个答案,但我正在寻找一个在 m 范围内的答案。

4

6 回答 6

29

我正在重新审视这个问题,并意识到这可能基于@Gorcha 给出的答案。

(a + x) mod m = b  
a + x = nm + b  
x = nm + b - a for some integer n

我不知道为什么我之前没有意识到,但是可以通过将 n 设置为 0 来得出解决方案。

然后我的问题的答案似乎是x = b - a,尽管在示例(26 + x) mod 29 = 3中结果是 -23,它小于 m。用 29 将 -23 恢复到预期范围内,得到 6。虽然问题中没有指定,但它给出了一个介于 0 和 m 之间的值。

那么最终的解决方案就变成了:x = (b - a) mod m

IE

(26 + x) mod 29 = 3
x = (3 - 26) mod 29
x = -23 mod 29
x = 6

这使 x 在 0 到 m 的范围内。检查将显示(26 + 6) mod 29 = 3

于 2015-07-30T22:52:00.623 回答
13

您无法确定 x,但我们可以进一步了解运算符的定义。

x mod y = z if x = ny + z for some integer n, where 0 <= z < y

所以在你的情况下:

(a + x) mod m = b
a + x = nm + b
x = nm + b - a for some integer n
于 2013-03-18T04:48:21.490 回答
6

是的。你完蛋了。

例子:

5 mod 3 = 2
8 mod 3 = 2

那么逆模2是什么?8个还是5个?还是 11?还是无数其他数字?

Inverse mod 是一种关系,如果你试图追求这个,你就会开始接触更棘手的数学。如果你在 haskell 中,你可以很容易地用非确定性建模它(可能答案的无限列表)

此外,这不是一个真正的编程问题。查看数学交流。

于 2012-04-12T23:24:30.713 回答
2

如果我们有,我有这个方程来反转模数

(var1 +var2) mod num=Res

然后得到

var1= num-((Res-var2)*-1)

例如25+5mod26=4

var1=26-((4-5)*-1)
var1=26-1
var1=5
于 2017-03-07T20:24:36.830 回答
1

这个方程的棘手之处在于,即使你知道 a、m 和 b,你也无法最终算出 x。

例如,假设您的方程式是:

(2 + x) % 4 = 3

x 可以是 1、5、9、13 等。

这意味着你运气不好,没有办法自己得到 x。

于 2012-04-12T23:25:16.873 回答
0

使用@Subhi Anyman答案作为参考(稍作修改),如果我们有这个方程来反转模运算

 (var1 + var2) mod num = Res

然后要获得var1,我们使用以下

var1 = num - ((Res - var2) * -1)
if (var1 > num) {
   var1 = var % num;          // making sure var1 is in range of 'num'
}
于 2020-04-26T18:04:48.973 回答