2013-04-27 58 views
5

Tôi muốn kiểm tra xem một loại ma trận ngẫu nhiên cụ thể có thể đảo ngược trên trường hữu hạn hay không, cụ thể là F_2. Tôi có thể kiểm tra nếu một ma trận là không thể đảo ngược trên thực tế bằng cách sử dụng mã đơn giản sau đây.Kiểm tra nếu ma trận có thể đảo ngược trên trường hữu hạn

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!" 

Có cách nào để đạt được điều tương tự nhưng trên F_2 không?

+2

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

+1

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. –

+0

@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

Trả lời

4

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 -+. 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.

+0

Cảm ơn bạn. Tôi không nhớ nhập thư viện bên ngoài cho nhiệm vụ cụ thể này nếu đó là điều phải làm. Tôi chưa bao giờ sử dụng cây xô thơm và không có ý tưởng như thế nào nó tương tác với ma trận scipy ví dụ. – marshall

+0

+ và - là điều tương tự trong F_2. – asmeurer

+0

@asmeuer: có, nhưng không phải như vậy đối với booleans. –

1

Thật không may, SymPy chưa thể xử lý các trường hữu hạn trong ma trận, mặc dù hỗ trợ được lên kế hoạch.

Tuy nhiên, như một số người nhận xét, bạn chỉ có thể kiểm tra yếu tố quyết định trên các số nguyên. Nếu đó là 1 (mod 2), ma trận là không thể đảo ngược. Để thực sự tìm thấy nghịch đảo, bạn có thể lấy nghịch đảo bình thường trên các số nguyên, nhân với yếu tố quyết định (để bạn không có phân số), và mod mỗi phần tử bằng 2. Tôi không thể tưởng tượng nó sẽ quá hiệu quả, và bạn có thể sử dụng bất kỳ thư viện ma trận nào, thậm chí là một thư viện số (làm tròn số nguyên gần nhất). SymPy cũng có thể thực hiện từng bước này.

Tôi nên chỉ ra rằng trong các trường hữu hạn cyclic chung, phần "nhân với yếu tố quyết định" sẽ cần được hoàn tác bằng cách nhân với mod nghịch đảo p (không cần thiết mod 2 vì khả năng duy nhất là 1).

+0

Cảm ơn điều đó thật thú vị.Tôi cho rằng một bổ sung tốt đẹp sẽ được scipy có thể tính toán các yếu tố quyết định trên các số nguyên. – marshall

Các vấn đề liên quan