Sage 为我提供了线性拟阵错误等级的基础,或者,我做错了什么?

Sage giving me a basis of the wrong rank for a linear matroid, or, what am I doing wrong?

这是一个最小的工作示例:

import numpy as np
import sage

D = np.array([[-1., -1., -1.,  0.,  0.,  0.,  1.],
       [ 1.,  0.,  0., -1.,  1.,  0.,  0.],
       [ 0.,  1.,  0.,  0., -1.,  1.,  0.],
       [ 0.,  0.,  1.,  0.,  0., -1.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0., -1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.]])

I = Matrix(D)
M = Matroid(I)

for base in M.bases():
    A = I[:, list(base) ]
    print(np.linalg.matrix_rank(A))
    if np.linalg.matrix_rank(A) == 4:
        print(base)

当我在我的电脑上 运行 时,它告诉我其中一个基的秩为 4,而不是 5。M.rank() 验证 5 是拟阵的秩,事实上,大多数基础都属于那个等级。然而,在一个拟阵中,所有的基础都是同一等级的,所以我对出了什么问题感到困惑。

该基础是 {0, 1, 3, 4, 6},它给出矩阵:

array([[-1., -1.,  0.,  0.,  1.],
       [ 1.,  0., -1.,  1.,  0.],
       [ 0.,  1.,  0., -1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0., -1.],
       [ 1.,  1.,  1.,  1.,  1.]])

可以单独检查哪个有等级4。(例如,wolframalpha。)也可以验证我是否正确切入I。

我调查的另一种可能性是列顺序在传递给拟阵时是否混淆了 class。但是,调用 M.representation() returns 矩阵 D,所以我认为情况并非如此。

这是一个浮点数问题。相反,如果您使用

D = np.array([
        [-1, -1, -1,  0,  0,  0,  1],
        [ 1,  0,  0, -1,  1,  0,  0],
        [ 0,  1,  0,  0, -1,  1,  0],
        [ 0,  0,  1,  0,  0, -1,  0],
        [ 0,  0,  0,  1,  0,  0, -1],
        [ 1,  1,  1,  1,  1,  1,  1]])

则不会出现该问题