El desafío es escribir codegolf para el hafniano de una matriz . El Hafnian de un 2n
-by- 2n
matriz simétrica A
se define como:
Aquí S 2n representa el conjunto de todas las permutaciones de los enteros de 1
a 2n
, es decir [1, 2n]
.
El enlace de wikipedia habla sobre las matrices de adyacencia, pero su código debería funcionar para cualquier matriz de entrada simétrica de valor real.
Para aquellos interesados en las aplicaciones de Hafnian, el enlace mathoverflow discute un poco más.
Su código puede recibir información de la forma que desee y proporcionar resultados en cualquier formato razonable, pero incluya en su respuesta un ejemplo completo que incluya instrucciones claras sobre cómo suministrar información a su código.
La matriz de entrada siempre es cuadrada y tendrá como máximo 16 por 16. No hay necesidad de poder manejar la matriz vacía o las matrices de dimensión impar.
Implementación de referencia
Aquí hay un ejemplo de código python del Sr. 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 página wiki ahora (2 de marzo de 2018) ha sido actualizada por ShreevatsaR para incluir una forma diferente de calcular el Hafnian. Sería muy interesante ver esto golfizado.