Math 如何找到与另一个位字段异或的位字段子集?

Math 如何找到与另一个位字段异或的位字段子集?,math,Math,我有一道数学题。我有一堆位字段,我想计算它们的哪些子集要异或在一起以获得某个其他位字段,或者如果没有办法,则发现不存在这样的子集 我希望使用一个免费的库而不是原始代码来实现这一点,并且我非常喜欢使用Python绑定(使用Python的内置数学库也是可以接受的,但我希望最终将其移植到多种语言)。另外,最好不要因为必须将每一位扩展到自己的字节而受到内存的冲击 进一步澄清:我只需要一个解决方案。我的矩阵与稀疏矩阵相反。我对将运行时间保持在绝对最小非常感兴趣,因此强烈建议使用算法上奇特的方法来反转矩阵。

我有一道数学题。我有一堆位字段,我想计算它们的哪些子集要异或在一起以获得某个其他位字段,或者如果没有办法,则发现不存在这样的子集

我希望使用一个免费的库而不是原始代码来实现这一点,并且我非常喜欢使用Python绑定(使用Python的内置数学库也是可以接受的,但我希望最终将其移植到多种语言)。另外,最好不要因为必须将每一位扩展到自己的字节而受到内存的冲击

进一步澄清:我只需要一个解决方案。我的矩阵与稀疏矩阵相反。我对将运行时间保持在绝对最小非常感兴趣,因此强烈建议使用算法上奇特的方法来反转矩阵。另外,非常重要的一点是,特定的给定位字段必须是输出的位字段,因此,一种只查找xor为0的子集的技术并不能完全消除它

我通常知道高斯消去法。我尽量避免从头开始做这件事


交叉发布到mathoverflow,因为不清楚这个问题的正确位置是-

从数学上讲,两位的异或可以被视为F_2字段中的加法

你需要解F_2场中的一组方程。对于具有位(a_0,a_1,…a_n),(b_0,b_1,…,b_n),(c_0,c_1,…,c_n),(r_0,r_1,…,r_n)的四个位域,可以得到以下等式:

x * a_0 + y * b_0 + z * c_0 = r_0
x * a_1 + y * b_1 + z * c_1 = r_1
...
x * a_n + y * b_n + z * c_n = r_n
(在这里查找x,y,z)

你可以用
glpk
将其编程为一个简单的整数线性问题,可能是
lp_solve
(但我不记得它是否合适)。不过,这些方法可能工作得很慢,因为它们试图解决更普遍的问题

在谷歌搜索了一段时间后,这似乎是寻找代码的一个良好开端。从描述来看,
Dixon
LinBox
似乎很适合

不管怎样,我想问mathoverflow可能会给你更准确的答案。如果有,请在此处链接您的问题


更新:用于解决此问题。(对我来说)这是一个非常好的建议。

对于容易放入内存的小实例,这只是求解F_2上的线性系统,所以尝试mod-2高斯消去法。对于非常大的稀疏实例,如在因子分解(筛)算法中出现的实例,请查阅Wiedemann算法。

可以将多个子集xor设置为相同的值;您是否关心查找所有子集

一种可能很严厉的方法是过滤位字段的powerset。在哈斯克尔:

import Data.Bits

xorsTo :: Int -> [Int] -> [[Int]]
xorsTo target fields = filter xorsToTarget (powerset fields)
  where xorsToTarget f = (foldl xor 0 f) == target

powerset [] = [[]]
powerset (x:xs) = powerset xs ++ map (x:) (powerset xs)

不确定是否有方法在不生成电源集的情况下执行此操作。(在最坏的情况下,解决方案实际上可能是整个功率集)。

根据上面liori的答案展开,我们有一个线性方程组(模2):

高斯消去法可用于求解该系统。在模2中,addrow操作变成了XOR操作。在计算上比使用一般线性系统解算器要简单得多

所以,如果a0为零,我们交换一行,在a位置有一个1。然后对“a”位为1的任何其他行执行XOR(使用第0行)。然后使用第1行和第b列、第2行和第c列等重复上述操作


如果在r列中得到一行非零的零,那么子集DNE。

该方法在指数时间内产生一个解。我想要一个多项式时间的解,重要的是我得到一个特定的位域,而不是所有的零(修改我的问题来澄清这一点),这正是这样做的。r0rn是特定的位字段(因此,如果r0rn为全零,则仅为全零),其中(a、b、c…)是字段集(子集的可能元素)。在高斯消去之后,最右边的列成为子集中包含的有序集合(如果包含,则为1,如果不包含,则为0),我不认为这会花费您太长的时间从头开始编写代码(尽管我不知道python是什么样子);这是一个非常迭代的算法。它得到的答案是O(n^3)。倒矩阵可能更好,但可能只有当它们是正方形的时候。哦,我明白你现在说的了。是的,这很有效,可能就是我所需要的,尽管看起来我可能不得不从头开始实现。m4ri看起来很有希望,但天啊,通用库不应该是GPL!
a0, b0, c0 ...| r0
a1, b1, c1 ...| r1
...           |
an, bn, cn ...| rn