Die Herausforderung besteht darin, Codegolf für den Hafnianer einer Matrix zu schreiben . Der Hafnian einer 2n
-by- 2n
symmetrischen Matrix A
ist definiert als:
Hier repräsentiert S 2n die Menge aller Permutationen der ganzen Zahlen von 1
bis 2n
, das heißt [1, 2n]
.
Der Wikipedia-Link behandelt Adjazenzmatrizen, aber Ihr Code sollte für alle wirklich bewerteten symmetrischen Eingabematrizen funktionieren.
Für diejenigen, die an Anwendungen des Hafnian interessiert sind, werden im Mathoverflow- Link einige weitere Themen behandelt.
Ihr Code kann Eingaben annehmen, wie er möchte, und Ausgaben in jedem vernünftigen Format geben. Bitte fügen Sie Ihrer Antwort ein vollständiges Beispiel bei, das klare Anweisungen zur Eingabe Ihres Codes enthält.
Die Eingabematrix ist immer quadratisch und wird höchstens 16 mal 16 sein. Es ist nicht erforderlich, die leere Matrix oder Matrizen mit ungerader Dimension zu verarbeiten.
Referenzimplementierung
Hier ist ein Beispiel für Python-Code von Mr. 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
Die Wiki-Seite wurde jetzt (2. März 2018) von ShreevatsaR aktualisiert und enthält nun eine andere Methode zur Berechnung des Hafnian. Es wäre sehr interessant, dieses Golfspiel zu sehen.