La sfida è scrivere codegolf per gli hafniani di una matrice . L'hafniano di una matrice 2n
-by- 2n
simmetrica A
è definito come:
Qui S 2n rappresenta l'insieme di tutte le permutazioni degli interi da 1
a 2n
, cioè [1, 2n]
.
Il link di Wikipedia parla delle matrici di adiacenza, ma il codice dovrebbe funzionare per qualsiasi matrice di input simmetrica stimata.
Per coloro che sono interessati alle applicazioni di Hafnian, il link mathoverflow ne discute ancora.
Il tuo codice può ricevere input nel modo desiderato e fornire output in qualsiasi formato ragionevole, ma includi nella tua risposta un esempio completo che includa chiare istruzioni su come fornire input al tuo codice.
La matrice di input è sempre quadrata e sarà al massimo di 16 per 16. Non è necessario essere in grado di gestire la matrice vuota o le matrici di dimensione dispari.
Implementazione di riferimento
Ecco alcuni esempi di codice Python di 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
La pagina wiki è stata ora (2 marzo 2018) aggiornata da ShreevatsaR per includere un modo diverso di calcolare l'Hafnian. Sarebbe molto interessante vederlo giocare a golf.