【问题标题】:Solve a linear matrix equation with modulo 2求解模 2 的线性矩阵方程
【发布时间】:2021-06-17 12:50:07
【问题描述】:

我有一个这样的矩阵:

import numpy as np

A = np.array([
    [1,1,1,0],
    [1,1,0,1],
    [1,0,1,1],
    [0,1,1,1]
])

还有一个向量:

b = np.array([0,1,1,1])

我想解方程:A * x = b。但我想以模 2 解决它。这意味着 1 + 1 = 0。所以这种情况下的解决方案是:

x = np.array([0,0,0,1])

我找到了Solving systems of equations modulo a certain number, with or without numpy,但由于某种原因,该解决方案对我不起作用。我得到了错误:

ValueError: pow() 指定第三个参数时,第二个参数不能为负数

为什么它不起作用?还有其他解决方案吗?

【问题讨论】:

  • 您是否尝试过避免向pow 提供第三个参数,或者在提供第三个参数的情况下避免使用负的第二个参数?
  • 你会如何用笔和纸解决这个问题?

标签: python numpy matrix linear-algebra modulo


【解决方案1】:

由于模的原因,您不能使用经典的线性代数方法来解决这个组合问题。希望模数 2 的使用可以使问题变得更简单。实际上,加法模 2 的行为类似于 XOR 二进制函数,而乘法类似于 AND 二进制函数。因此问题可以改写如下:

x1 ^ x2 ^ x3 ^  0 = 0
x1 ^ x2 ^  0 ^ x4 = 1
x1 ^  0 ^ x3 ^ x4 = 1
 0 ^ x2 ^ x3 ^ x4 = 1

因此:

x1 ^ x2 ^ x3 = 0
x1 ^ x2 ^ x4 = 1
x1 ^ x3 ^ x4 = 1
x2 ^ x3 ^ x4 = 1

这个例子可以轻松解决,因为x1 ^ x2 ^ x3 = 0 表示要么 x1、x2 和 x3 为零,要么将树变量中的两个设置为 1,这与以下 3 条规则相冲突。

但是,在任意A 矩阵上,该问题似乎很难解决,并且非常接近于解决boolean satisfiability problem,后者被证明是NP-complete

此外,请注意,对于Ab,该解决方案可能不存在或可能不是唯一的。

使用 CSP 求解器 肯定有助于轻松解决此问题,但如果问题不是 NP 完全的(这尚未得到证明),它可能不是最佳方法。有很多 Python 库可以解决这个问题(例如 OR-tools 应该能够做到这一点)。

【讨论】:

  • 感谢您的回复。程序的设置方式我将始终致力于解决可解决的问题。我不知道它是否是 NP 完全的(从来没有完全理解这一点)。我想在 9x9 / 25x25 矩阵上使用它。您是否有机会给我一个快速示例,如何针对此类问题实施 CSP 求解器?我以前从未使用过这个。如果你不能,没问题。再次感谢您的帮助。
  • 顺便说一句。 9x9 矩阵总是: A = np.array([ [1,1,0,1,0,0,0,0,0], [1,1,1,0,1,0,0,0, 0], [0,1,1,0,0,1,0,0,0], [1,0,0,1,1,0,1,0,0], [0,1,0, 1,1,1,0,1,0], [0,0,1,0,1,1,0,0,1], [0,0,0,1,0,0,1,1, 0], [0,0,0,0,1,0,1,1,1], [0,0,0,0,0,1,0,1,1] ]) (对不起格式。我还不习惯stackoverflow)
  • 我已经好几年没有使用 CSP 求解器了,所以我对他们的 API 不是很熟悉。上次我使用 OR-tools 做这样的事情时感觉很棒。我认为它可以轻松解决您的 9x9 问题。我不喜欢 25x25,但 OR 工具的启发式方法非常好,所以可能没问题。您可以先阅读documentation example。请注意,您可以对约束进行硬编码,因为矩阵是静态已知的(不包括零,使用 xor 运算符和布尔变量)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多