2012-12-30 65 views
5

Khi làm việc về vấn đề liên quan đến Giả thuyết Weisstein (https://cs.uwaterloo.ca/journals/JIS/VOL7/Sloane/sloane15.pdf), tôi cần tạo tất cả n x n (0,1) ma trận cho n = 2, 3, 4, ... Không quá khó nếu bạn suy nghĩ về trình tự nhị phân phù hợp và phân vùng chúng tương ứng. Ví dụ, đây là tất cả các ma trận 3 x 3:Tạo tất cả (0,1) ma trận nxn

With[{n = 3}, 
lis = PadLeft[IntegerDigits[#, 2], n^2]& /@ Range[0, 2^n^2 - 1]; 
mats = (Partition[#, n] &) /@ lis 
]; 

Conjecture Weisstein của liên quan đến, đối với mỗi n = 2, 3, ..., đếm số lượng ma trận mà giá trị riêng là tất cả thực và tích cực. Đối với n = 2, có 3; cho n = 3, có 25; cho n = 4, có 543; và vân vân. Các tính toán eigenvalue tốn thời gian nhưng đơn giản.

Điều tôi quan tâm là tìm các cách khác để liệt kê các ma trận n x n. Để có được tất cả chúng tôi đã sử dụng các đại diện cơ số 2 của các số nguyên lên đến 2^(n^2) và được phân đoạn để tạo các ma trận. Phải có cách khác (hiệu quả hơn?).

+0

Có thể phù hợp hơn với [cstheory] (http://cstheory.stackexchange.com), mặc dù chúng có thể đánh hơi mũi của chúng ở đó vì quá cơ bản .. =^_^= –

Trả lời

8

Chúng tôi có thể sử dụng chức năng Mathematica được xây dựng Tuples. Ví dụ 3x3 của bạn chỉ đơn giản là trở thành

ms = Tuples[{1, 0}, {3, 3}]; 

Các đếm orderings có thể được thực hiện bằng số nhị phân

FromDigits[#, 2] & /@ Flatten /@ ms 

enter image description here

Để hình dung orderings:

ArrayPlot[#, ImageSize -> 20, Mesh -> All] & /@ ms 

enter image description here

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