O desafio é escrever codegolf para o Hafnian de uma matriz . O Hafnian de um 2n
-by- 2n
matriz simétrica A
é definida como:
Aqui S 2n representa o conjunto de todas as permutações dos números inteiros de 1
a 2n
, isto é[1, 2n]
.
O link da wikipedia fala sobre matrizes de adjacência, mas seu código deve funcionar para qualquer matriz de entrada simétrica com valor real.
Para os interessados nas aplicações do Hafnian, o link mathoverflow discute um pouco mais.
Seu código pode receber entrada da maneira que desejar e fornecer saída em qualquer formato razoável, mas inclua na sua resposta um exemplo completo, incluindo instruções claras de como fornecer entrada para o seu código.
A matriz de entrada é sempre quadrada e terá no máximo 16 por 16. Não há necessidade de lidar com a matriz vazia ou matrizes de dimensão ímpar.
Implementação de referência
Aqui está um exemplo de código python do 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
A página wiki agora (2 de março de 2018) foi atualizada por ShreevatsaR para incluir uma maneira diferente de calcular o Hafniano. Seria muito interessante ver isso jogar golfe.