在提问后的三年多时间里,我找到了解决方案。 我已将其作为答案包含在内。
我有一个带有模数的表达式,需要用 x 表示出来。
(a + x) mod m = b
我不知道该如何处理模数。 有没有办法让 x 单独出现,或者说这个问题无法解决?
编辑: 我意识到我可能会得到多个答案,但我正在寻找一个在 m 范围内的答案。
我重新看了这个问题,并意识到根据@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。为了将-23调整到期望的范围内,对29取模得到6。虽然问题中未指定,但这给出了一个介于0和m之间的值。
最终的解决方案为:x = (b - a) mod m
即:
(26 + x) mod 29 = 3
x = (3 - 26) mod 29
x = -23 mod 29
x = 6
这将使x的范围在0到m之间。检查会显示(26 + 6) mod 29 = 3
。
x = 29 * n + 6
,其中 n in Z
。 - KaZyKa你无法确定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
5 mod 3 = 2
8 mod 3 = 2
那么2的逆模是什么?8还是5?或者11?或者无限多个数字?
逆模是一种关系,如果你试图追求它,你会开始接触更棘手的数学问题。如果你在Haskell中,你可以使用非确定性(可能的答案的无限列表)来轻松地建模。
此外,这不是一个真正的编程问题。请查看数学交换。
我有一个反向模数方程
如果我们有
(var1 +var2) mod num=Res
然后获取
var1= num-((Res-var2)*-1)
25+5mod26=4
var1=26-((4-5)*-1)
var1=26-1
var1=5
使用@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'
}
这个方程的棘手之处在于,即使你知道a、m和b,也不能确定x。
例如,假设你的方程是:
(2 + x) % 4 = 3
x 可以是 1、5、9、13 等。
这意味着你很不幸,没有办法让 x 单独存在。