Thách thức là viết codegolf cho Hafnian của một ma trận . Các Hafnian của một 2n
-by- 2n
ma trận đối xứng A
được định nghĩa là:
Ở đây S 2n đại diện cho tập hợp tất cả các hoán vị của các số nguyên từ 1
đến 2n
, nghĩa là [1, 2n]
.
Liên kết wikipedia nói về ma trận kề, nhưng mã của bạn sẽ hoạt động cho bất kỳ ma trận đầu vào đối xứng có giá trị thực nào.
Đối với những người quan tâm đến các ứng dụng của Hafnian, liên kết mathoverflow sẽ thảo luận thêm.
Mã của bạn có thể nhận đầu vào theo ý muốn và cung cấp đầu ra ở bất kỳ định dạng hợp lý nào, nhưng vui lòng bao gồm trong câu trả lời của bạn một ví dụ hoạt động đầy đủ bao gồm các hướng dẫn rõ ràng về cách cung cấp đầu vào cho mã của bạn.
Ma trận đầu vào luôn luôn vuông và sẽ có nhiều nhất là 16 x 16. Không cần phải có khả năng xử lý ma trận trống hoặc ma trận có kích thước lẻ.
Thực hiện tham khảo
Dưới đây là một số ví dụ mã python từ ông Xcoder.
from itertools import permutations
from math import factorial
def hafnian(matrix):
my_sum = 0
n = len(matrix) // 2
for sigma in permutations(range(n*2)):
prod = 1
for j in range(n):
prod *= matrix[sigma[2*j]][sigma[2*j+1]]
my_sum += prod
return my_sum / (factorial(n) * 2 ** n)
print(hafnian([[0, 4.5], [4.5, 0]]))
4.5
print(hafnian([[0, 4.7, 4.6, 4.5], [4.7, 0, 2.1, 0.4], [4.6, 2.1, 0, 1.2], [4.5, 0.4, 1.2, 0]])
16.93
print(hafnian([[1.3, 4.1, 1.2, 0.0, 0.9, 4.4], [4.1, 4.2, 2.7, 1.2, 0.4, 1.7], [1.2, 2.7, 4.9, 4.7, 4.0, 3.7], [0.0, 1.2, 4.7, 2.2, 3.3, 1.8], [0.9, 0.4, 4.0, 3.3, 0.5, 4.4], [4.4, 1.7, 3.7, 1.8, 4.4, 3.2]])
262.458
Trang wiki hiện tại (ngày 2 tháng 3 năm 2018) đã được ShreevatsaR cập nhật để bao gồm một cách tính Hafnian khác. Sẽ rất thú vị khi xem môn đánh gôn này.