Sẽ tốt hơn nếu sử dụng Sage hoặc một số công cụ thích hợp khác cho việc này.
Sau đây chỉ là không phức tạp nỗ lực phi chuyên gia làm một cái gì đó, nhưng xoay khử Gauss nên cho kết quả chính xác cho invertibility:
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)
Lưu ý rằng np.bool_
là tương tự như F_2 chỉ trong một cảm giác giới hạn - - hoạt động nhị phân +
trong F_2 là -
cho bool và op unary -
là +
. Phép nhân cũng giống nhau.
>>> 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)
Loại bỏ gaussian ở trên chỉ sử dụng các hoạt động này, vì vậy nó hoạt động.
Bạn có thể làm điều đó với Sage dễ dàng đủ ([ví dụ] (http://aleph.sagemath.org/?z=eJzzDVawVfBNLCnKrAguSExO1XB30zDS1FEwBiJNXq7yjMycVIWQotJUK14uBSDwBSkP1itKzEvJz41PzUnNTc0r0dCESGamKfjqZRbHZ-aVpRaVZCblpGpoQvWBQFJRamI2gsvLVVCUmVeioO5rpQ5j-yIEgYYgieuBzSxOBVkFU6GFpkZBC1UdABH6PRM=&lang=sage)). Tôi sẽ được quan tâm để xem nếu có một giải pháp slick trên stack khoa học (numpy/scipy/sympy/mpmath/gấu trúc vv), mặc dù. – DSM
Tôi nghĩ rằng nếu bạn coi ma trận trên F_2 là ma trận trên Z chỉ sử dụng 0 và 1 thì yếu tố quyết định trên F_2 phải là yếu tố quyết định trên Z modulo 2 (nghĩa là kiểm tra trở thành nếu định thức trên Z là chẵn hoặc lẻ) . Điều này có thể không tối ưu về mặt thuật toán. –
@ArminRigo Thật không may tôi không thể có được ý tưởng này để làm việc. Đặt n = 100 trong mã trên và in linalg.det (ma trận), linalg.det (ma trận)% 2. Tôi luôn nhận được 0 cho linalg.det (ma trận)% 2 có lẽ là do các vấn đề về dấu phẩy động. Có một hàm số nguyên tố chính xác không? – marshall