Wyzwanie polega na napisaniu kodegolfa dla Hafniana matrycy . Hafnian o 2n
-by- 2n
matrycy symetrycznym A
jest zdefiniowany jako:
Tutaj S 2n reprezentuje zestaw wszystkich permutacji liczb całkowitych od 1
do 2n
, to znaczy [1, 2n]
.
Link do wikipedii mówi o macierzach przylegania, ale twój kod powinien działać dla wszystkich symetrycznych macierzy wejściowych o wartościach rzeczywistych.
Dla zainteresowanych aplikacjami Hafnian link do mathoverflow omawia więcej.
Kod może przyjmować dane wejściowe w dowolny sposób i dawać dane wyjściowe w dowolnym rozsądnym formacie, ale w odpowiedzi należy podać pełny sprawdzony przykład, w tym jasne instrukcje dotyczące sposobu wprowadzania danych wejściowych do kodu.
Matryca wejściowa jest zawsze kwadratowa i będzie miała maksymalnie 16 na 16. Nie ma potrzeby obsługi pustej macierzy lub macierzy o nieparzystym wymiarze.
Realizacja referencyjna
Oto przykładowy kod python od pana Xcodera.
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
Strona wiki została teraz (2 marca 2018 r.) Zaktualizowana przez ShreevatsaR, aby zawierała inny sposób obliczania Hafniana. Byłoby bardzo interesujące zobaczyć ten golf.