我想测试特定类型的随机矩阵在有限域上是否可逆,特别是F_2。我可以使用以下简单代码测试矩阵在实数上是否可逆。
import random
from scipy.linalg import toeplitz
import numpy as np
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)
if (np.linalg.matrix_rank(matrix) < n):
print "Not invertible!"
有没有办法在F_2上实现相同的目标?
答案 0 :(得分:4)
最好使用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
# swap pivot
piv = i + pivots[0]
row = a[piv,i:].copy()
a[piv,i:] = a[i,i:]
a[i,i:] = row
# eliminate
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)
上面的高斯消除仅使用这些操作,因此它可以工作。
答案 1 :(得分:1)
不幸的是,SymPy还不能处理矩阵中的有限域,但计划提供支持。
正如一些评论者指出的那样,你可以只检查整数的行列式。如果它是1(模2),则矩阵是可逆的。要实际找到逆,你可以在整数上取正态倒数,乘以行列式(这样你就没有分数),并将每个元素修改为2.我无法想象它会过于高效,你可以使用任何矩阵库,甚至是数字矩阵库(舍入到最接近的整数)。 SymPy也可以执行上述每个步骤。
我应该指出,在一般的循环有限域中,“乘以行列式”部分需要通过乘以逆mod p来解除(它是不必要的mod 2,因为唯一的可能性是1)。