Sage中通过修改子空间基定义向量子空间出现异常结果的问题
问题:GF(2)上矩阵作用子空间后判断不变性不符合预期
我在写代码判断有限域GF(2)上的向量子空间在矩阵作用下是否不变,步骤是定义子空间、用矩阵作用子空间、检查新子空间是否与原空间相等,但结果和预期不符。
以下是我的Sage代码:
F = GF(2) V = VectorSpace(F,2) u = matrix(F, [[1, 1], [0, 1]]) v1 = vector(F, [0,1]) V1 = V.subspace([v1]) uV1 = V.subspace([u*v for v in V1.basis()]) print(uV1.basis(), uV1 == V1)
我预期输出是[(1,1)] False——因为矩阵u作用在V1的基向量(0,1)上应该得到(1,1),所以uV1的基应该是[(1,1)],且和V1不相等。
实际测试时,单独打印[u*v for v in V1.basis()]确实输出[(1,1)],但执行原代码时,Sage输出[(0,1)] True。手动定义uV1 = V.subspace([(1,1)])时,结果符合预期:uV1.basis()为[(1,1)]且uV1 == V1为False。
为什么uV1没有被正确定义?该怎么修改代码解决这个问题?
原因分析与解决方案
问题根源
Sage中默认是行向量右乘矩阵,但你的矩阵u是按列向量左乘的逻辑构建的,这导致计算错配:
- 你预期的是列向量左乘矩阵:
u * [0;1] = [1;1] - 但实际Sage执行的是行向量右乘:
[0,1] * u = [0*1 + 1*0, 0*1 + 1*1] = [0,1],得到的还是原向量,所以uV1和V1是同一个子空间。
解决方法
有两种方式修正这个问题:
转置矩阵,适配行向量右乘逻辑
修改矩阵u的定义,转置原矩阵后用行向量右乘:F = GF(2) V = VectorSpace(F,2) # 转置原矩阵,适配行向量右乘 u = matrix(F, [[1, 0], [1, 1]]) v1 = vector(F, [0,1]) V1 = V.subspace([v1]) uV1 = V.subspace([v*u for v in V1.basis()]) print(uV1.basis(), uV1 == V1)输出:
[(1,1)] False,符合预期。明确使用列向量左乘矩阵
将向量转换为列矩阵,左乘原矩阵后再转回行向量:F = GF(2) V = VectorSpace(F,2) u = matrix(F, [[1, 1], [0, 1]]) v1 = vector(F, [0,1]) V1 = V.subspace([v1]) # 向量转列矩阵→左乘原矩阵→转回行向量 uV1 = V.subspace([(u * v.column()).row(0) for v in V1.basis()]) print(uV1.basis(), uV1 == V1)输出同样是
[(1,1)] False。
验证说明
两种方法都能正确计算矩阵对向量的作用,确保uV1是原空间V1在矩阵u作用下的像空间,从而正确判断子空间是否在矩阵作用下不变。
内容的提问来源于stack exchange,提问作者Kenanski Bowspleefi
相关产品推荐
相关产品推荐

