最好使用Sage或其他适当的工具来处理这个问题。
以下只是一个不够专业的尝试,但是基于枢轴高斯消元法应该能够得到确切的可逆结果:
import random
from scipy.linalg import toeplitz
import numpy as np
def is_invertible_F2(a):
"""
Determine invertibility by Gaussian elimination
"""
a = np.array(a, dtype=np.bool_)
n = a.shape[0]
for i in range(n):
pivots = np.where(a[i:,i])[0]
if len(pivots) == 0:
return False
piv = i + pivots[0]
row = a[piv,i:].copy()
a[piv,i:] = a[i,i:]
a[i,i:] = row
a[i+1:,i:] -= a[i+1:,i,None]*row[None,:]
return True
n = 10
column = [random.choice([0,1]) for x in xrange(n)]
row = [column[0]]+[random.choice([0,1]) for x in xrange(n-1)]
matrix = toeplitz(column, row)
print(is_invertible_F2(matrix))
print(int(np.round(np.linalg.det(matrix))) % 2)
请注意,
np.bool_
与F_2的类比仅在有限的意义上成立 --- F_2中的二元操作
+
对于bool来说是
-
,一元操作
-
是
+
。乘法是相同的,尽管如此。
>>> x = np.array([0, 1], dtype=np.bool_)
>>> x[:,None] - x[None,:]
array([[False, True],
[ True, False]], dtype=bool)
>>> x[:,None] * x[None,:]
array([[False, False],
[False, True]], dtype=bool)
上述高斯消元只使用了这些操作,因此可以正常工作。
sympy
标签。它可以完成完整的整数行列式,但速度会非常慢。 - DSM