反模数算子

时间:2012-04-12 23:20:01

标签: reverse modulus

在提出问题后3年多我找到了解决方案。我已将其列为answer

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

(a + x)mod m = b

我无法弄清楚如何处理模数。有没有办法自己获得x,或者我在这个上运气不好?

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

6 个答案:

答案 0 :(得分:20)

我正在重新审视这个问题,并意识到这可能是基于@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

答案 1 :(得分:11)

你无法明确地找出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

答案 2 :(得分:4)

是的。你搞砸了。

示例:

5 mod 3 = 2
8 mod 3 = 2

所以逆mod 2是什么? 8或5?还是11?还是其他数字的无限?

逆变换是一种关系,如果你试图追求这个,你就会开始变得更加棘手。如果您使用haskell,您可以轻松地使用非确定性(无限可能的答案列表)对其进行建模。

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

答案 3 :(得分:1)

关于这个等式的棘手部分是,即使你知道a,m和b,你也无法确定x。

例如,假设你的等式是:

(2 + x) % 4 = 3

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

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

答案 4 :(得分:1)

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

(var1 +var2) mod num=Res

然后得到

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

e.g。 25+5mod26=4

var1=26-((4-5)*-1)
var1=26-1
var1=5

答案 5 :(得分: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'
}