Le défi est d'écrire du codegolf pour le Hafnian d'une matrice . Le Hafnien d'une matrice 2n
-par- 2n
symétrique A
est défini comme:
Ici, S 2n représente l'ensemble de toutes les permutations des entiers de 1
à 2n
, c'est-à-dire [1, 2n]
.
Le lien wikipedia parle des matrices d'adjacence mais votre code devrait fonctionner pour toutes les matrices d'entrée symétriques à valeur réelle.
Pour ceux qui s'intéressent aux applications du Hafnian, le lien mathoverflow en discute plus.
Votre code peut prendre une entrée comme il le souhaite et donner une sortie dans n'importe quel format raisonnable, mais veuillez inclure dans votre réponse un exemple complet comprenant des instructions claires sur la façon de fournir une entrée à votre code.
La matrice d'entrée est toujours carrée et sera au maximum de 16 sur 16. Il n'est pas nécessaire de pouvoir gérer la ou les matrices vides de dimension impaire.
Implémentation de référence
Voici un exemple de code python de M. 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
La page wiki a maintenant (2 mars 2018) été mise à jour par ShreevatsaR pour inclure une manière différente de calculer le Hafnian. Il serait très intéressant de voir ce golf.