有效地检查三个二元向量是否在有限域上线性独立

时间:2013-12-17 11:34:08

标签: c++ vector binary linear

我在程序中给出了三个由unsigned int表示的二进制向量v1,v2,v3和一个有限字段F,它也是一组二进制向量。我需要检查向量是否是线性无关的,即F中没有f1,f2,使得f1 * v1 + f2 * v2 = v3。

直接蛮力解决方案是迭代场并检查所有可能的线性组合。

是否存在更有效的算法?

谢谢。

UPD:我想强调两点:1)字段元素是向量,而不是标量。因此,场元素f1和给定矢量vi的乘积是点积。所以高斯消除不起作用(如果我没有遗漏某些东西); 2)该字段是有限的,所以如果我发现某些f1的f1 * v1 + f2 * v2 = v3,则f2并不意味着f1,f2属于F。

3 个答案:

答案 0 :(得分:1)

如果向量在r ^ 2中,那么它们是自动相关的,因为当我们创建它们的矩阵并将其缩小为梯形时,将至少有一个自由变量(在这种情况下只有一个)。

如果向量在R ^ 3中,那么你可以从它们制作一个矩阵。一个2d数组然后你可以采取该矩阵的决定因素。如果行列式等于0,那么矢量是线性相关的,否则不是。

如果向量在R ^ 4,R ^ 5等中,则适当的方法是将矩阵减少为梯形。

答案 1 :(得分:0)

对于在维N的空间中定义的任何有限M个向量集,如果通过逐行堆叠这些向量而构造的MxN矩阵的秩具有等于M的等级,则它们是线性无关的。

关于涉及线性代数的数值稳定计算,singular value decomposition通常是要走的路,并且有很多可用的实现。该上下文中的关键点是实现矩阵的秩等于其非零奇异值的数量。但必须注意,由于浮点近似,必须选择有限精度来确定某个值是否实际为零。

你的问题提到你的向量是在整数集中定义的,当然可以利用它来克服浮点计算的有限精度,但我不知道如何。也许有人可以帮助我们?

答案 2 :(得分:0)

如果你在有限域内进行高斯消除,它确实有效。 对于二进制文件,它应该非常简单,因为反向元素是微不足道的。 对于较大的有限域,您将需要以某种方式找到逆元素,这可能会变成一个单独的问题。