문제는 매트릭스의 Hafnian에 대한 codegolf 를 작성하는 것입니다 . 의 Hafnian 2n
-by- 2n
대칭 행렬 A
로 정의된다 :
여기서 S 2N가 에서 모든 정수 순열의 집합을 나타냄 1
에 2n
즉, [1, 2n]
.
Wikipedia 링크는 인접 행렬에 대해 설명하지만 실제 대칭 입력 행렬에 대해서는 코드가 작동해야합니다.
Hafnian의 응용에 관심이있는 사람들을 위해 mathoverflow 링크가 더 자세히 설명합니다.
코드는 원하는대로 입력을 할 수 있고 합리적인 형식으로 출력 할 수 있지만 코드에 입력을 제공하는 방법에 대한 명확한 지침을 포함한 완전한 예제를 답에 포함하십시오.
입력 행렬은 항상 정사각형이며 최대 16 x 16입니다. 빈 행렬 또는 홀수 차원의 행렬을 처리 할 필요가 없습니다.
참조 구현
다음은 Mr. Xcoder의 Python 코드 예입니다.
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
Wiree 페이지는 ShreevatsaR에 의해 업데이트되어 Hafnian을 계산하는 다른 방법을 포함합니다. 이 골프를 보는 것은 매우 흥미로울 것입니다.