【问题标题】:Which algorithm to solve a system of equations where variables are bits and operation is xor?哪种算法可以求解变量为位且运算为异或的方程组?
【发布时间】:2019-04-23 23:11:08
【问题描述】:

我正在尝试求解方程组。每个方程的形式为:

V1 xor V2 xor ... xor Vx = Sx

Vx 和 Sx 是单个位变量。 Sx 是已知的,我需要找到所有 Vx 的值


例如:

V1 xor V2 xor V3 = 1
V1 xor V2 = 0
V2 xor V3 = 1

(解 V1 = 0,V2 = 0,V3 = 1)


实际上,我有数千个变量(每个都是一个位)和数千个方程(只有异或运算)。 我知道至少有一种解决方案,而我只需要一种解决方案。

我知道如何为小型系统手动解决这个问题,但我不知道如何构建一个算法来解决这个问题。

你能帮我解决这个问题吗?我是一名开发人员,我了解如何使用位、异或运算符和数据结构,但我在数学方面的经验较少,我不知道使用哪种方程系统求解方法。我对矩阵运算也不是很直观,所以如果我需要它,请尝试非常缓慢地解释它! :p

谢谢!

【问题讨论】:

  • 您能否进一步详细说明您要解决的问题?您的示例是否意味着您正在尝试确定设置了哪个位(示例中为 V3) 通常,您在另一个方向求解方程组,您知道 3 个由 3 个 Vx 变量组成的方程,并且您正在寻找 Sx 解。给定 Sx 解决方案 - 您是否想要“发现”具有数千行和数千列的矩阵的方程组?
  • Thx,我正在尝试反转一种算法,更准确地说是一种不安全的随机生成器。使用 PRG 的输出,我想找到内部状态(输入)。这就是我得到一个 xor 方程系统的方法,我知道它的结果并且我想知道输入。这也是为什么我知道至少有一个有效的解决方案。所以现在我有了方程组,但我不知道如何解决它,因为我在矩阵计算方面很蹩脚:p
  • 你可以把它扔给约束求解器:developers.google.com/optimization/cp/cp_solver

标签: algorithm equation-solving bitwise-xor


【解决方案1】:

您可以为此使用高斯消元法:https://en.wikipedia.org/wiki/Gaussian_elimination

XOR 是取模 2 的整数的加法(和减法 - 它是一样的),所以很简单:

例如,找到一个包含v1 的方程式,并将其添加到所有其他包含v1 的方程式中以从中删除v1

v1 XOR v2        = 1
      +
v1        XOR v3 = 0
--------------------
       v2 XOR v3 = 1

使用不同的方程从所有其他方程中删除 v2,使用不同的方程删除 v3 等,直到所有方程只有一个变量。

【讨论】:

  • 谢谢。你能多描述一下如何使用高斯消元法来解决我的问题吗?或指向适用于我的情况的代码?我不是偷懒,只是我不明白矩阵计算!
  • 当然。希望有帮助
【解决方案2】:

我差点把这个放在另一个评论中,但它似乎是一个答案,所以就在这里。

恐怕你可能是 SOL。例如,给定一个 111 的 Sx,一个领先的矩阵是

L1 = 100   | Sx(L1) = 1
L2 = 010   | Sx(l2) = 1
L3 = 001   | Sx(L3) = 1

并且还有 2 个等价矩阵适合该解决方案(L3 可以很容易地为 010 或 100)。

此外,假设 Sx 为 001 - 您将不知道 L3 中的哪个 Vx 是“活动”位,即使您知道 L1 和 L2 在每个变量上的系数都为 0。

【讨论】:

    【解决方案3】:

    好的,要做到这一点,您需要了解一些关于 xornot0 = false1 = true 的代数规则。

    首先,xor 同时满足结合律和交换律。如果我们把xor 长长的链条连在一起,我们可以随心所欲地重新排列。

    接下来,x xor x = 0。当我们添加0 xor y = y这一事实时,我们可以删除匹配的变量对。

    接下来,替换。 x1 xor x2 xor ... xor xn = 0 形式的等式意味着 x1 = x2 xor x3 xor ... xor xn。同样x1 xor x2 xor ... xor xn = 1 暗示x1 = 1 xor x2 xor x3 xor ... xor xn。这些事实可以用您的其他方程式代替。这可能会导致重复的变量,然后我们可以删除。

    这意味着每个方程都可以用其他方程来写一个变量,然后可以将其代入其他方程。这现在是一个因变量。最后,我们将拥有三种状态之一。

    1. 1 = 0 表示没有解决方案。
    2. 没有方程和变量。有一种解决方案。只需向后替换即可。
    3. 有几个变量从未被消除,但你已经脱离了方程。这些变量免费。您可以将它们设置为任何值并获得答案。您不妨将它们设置为1

    让我用你的方程式来说明一下。

    (1) 1 = V1 xor V2 xor V3
    (2) 0 = V1 xor V2
    (3) 1 = V2 xor V3
    

    (1)我们知道:

    (4) V1 = 1 xor V2 xor V3
    

    (注意,V1 已消除。)将(4) 代入(2) 和(3)得到:

    (5) 0 = V1 xor V2
          = (1 xor V2 xor V3) xor V2
          = 1 xor V3
    
    (6) 1 = V2 xor V3
    

    (请注意,(6) 是一个微不足道的替换。)

    (5) 我们得到:

    (7) 1 = V3
    

    (注意,V3 已被消除。)将(7) 替换为(6),我们得到:

    (8) 1 = V2 xor V3
          = V2 xor 1
    

    (8) 我们得到:

    (9) V2 = 1 xor 1 = 0
    

    (注意,V2 已被淘汰。)

    规则(9)(7)(4) 消除了V2V3V1,所以只有一种解决方案。它是:

    (9) V2 = 0
    (7) V3 = 1
    (4) V1 = 1 xor V2 xor V3 = 1 xor 0 xor 1 = 0
    

    请注意,这是一个完全机械的过程。在每一步,我都使用我留下的第一个方程,用它来写一个变量,然后将它代入其他变量。少一个方程,少一个变量。它总是有效的。

    您必须为此制定一个良好的表示和代码。但是,了解您正在尝试做的事情有望有所帮助。

    【讨论】:

      【解决方案4】:

      您可以使用MiniSAT 算法。例如,在 Java 中,它可以在 LogicNG 项目中使用。

      您的示例可以像这样发布在the SatisfiabilityInstances() functionSymja project 中。在后台调用了 LogicNG MiniSat.miniSat()

      SatisfiabilityInstances(Xor(v1,v2,v3)&&Not(Xor(v1,v2))&&Xor(v2,v3),{v1,v2,v3})
      

      结果:

      {{False,False,True}}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-14
        • 2012-10-19
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多