有效地检验三个二进制向量在有限域上是否线性无关
Checking efficiently if three binary vectors are linearly independent over finite field
在我的程序中,我得到了三个由无符号int表示的二进制矢量v1、v2、v3和一个有限域F,它也是一组二进制矢量。我需要检查向量是否线性独立,也就是说,在F中不存在f1、f2,使得f1*v1 +f2*v2 = v3
。
直接的暴力解决方案是在字段上迭代并检查所有可能的线性组合。
是否存在更有效的算法?
我想强调两点:
- 字段元素是矢量,而不是标量。因此,场元素f1和给定向量vi的乘积e是点积。所以高斯消去法不起作用(如果我没有遗漏什么的话)
- 域是有限的,所以如果我发现
f1*v1 +f2*v2 = v3
对于某些f1,f2
,并不意味着f1,f2
属于F
如果向量在r^2中,那么它们是自动相关的,因为当我们将它们组成矩阵并将其简化为梯形时,至少会有一个自由变量(在这种情况下只有一个)。
如果向量在R^3中,那么你可以用它们做一个矩阵,即一个二维数组,然后你可以得到这个矩阵的行列式。如果行列式等于0,则向量是线性相关的,否则不是。
如果向量在R^4、R^5等中,则适当的方法是将矩阵简化为梯形。
对于在维数为N的空间中定义的任何有限的M个向量集,它们是线性独立的,当通过逐行堆叠这些向量构建的MxN矩阵的秩等于M时。
关于涉及线性代数的数值稳定计算,奇异值分解通常是可行的,并且有很多可用的实现。本文的重点是实现矩阵的秩等于其非零奇异值的个数。然而,必须注意的是,由于浮点近似,必须选择有限的精度来决定一个值是否有效为零。
你的问题提到,你的向量定义在一组整数中,这当然可以用来克服浮点计算的有限精度,但我不知道如何做到。也许有人能帮我们?
如果在有限域内进行高斯消去,则它确实有效。对于二进制,它应该非常简单,因为逆元素是平凡的。对于较大的有限域,您将需要以某种方式找到逆元素,这可能会变成一个单独的问题。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 是否可以显示需要线性搜索的时间才能找到您在程序中找到的密钥
- 检查三个点是否线性
- 是否有机会更快地使双线性插值
- 是否可以执行范围添加更新,将线性函数添加到最大分段树中
- 有效地检验三个二进制向量在有限域上是否线性无关
- 如何检查两个 n 大小的向量是否线性依赖于C++
- 是否有一个具有良好C++接口的快速线性SVM库