Buradaki zorluk, bir matrisin Hafniyenine kod yazarı yazmaktır . Bir simetrik matrisin 2n
Hafnian'ı şöyle tanımlanır:2n
A
İşte S 2n gelen sayının tüm permütasyon kümesini temsil 1
etmek 2n
olduğunu, [1, 2n]
.
Wikipedia bağlantı bitişik matrisler hakkında konuşuyor, ancak kodunuz gerçek değerli simetrik girdi matrisleri için çalışmalıdır.
Hafnian'ın uygulamalarıyla ilgilenenler için, mathoverflow bağlantısı biraz daha tartışıyor.
Kodunuz istediği şekilde girdi alabilir ve herhangi bir makul formatta çıktı verebilir, ancak lütfen cevabınıza kodunuza nasıl girdi sağlayacağınızla ilgili açık talimatlar içeren eksiksiz bir çalışılmış örnek ekleyin.
Giriş matrisi her zaman kare şeklindedir ve 16 ile 16 arasında olacaktır. Boş matrisi veya tek boyutlu matrisleri kullanmaya gerek yoktur.
Referans uygulaması
İşte Bay Xcoder'dan bir örnek python kodu.
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
Wiki sayfası şimdi (2 Mart 2018), ShreevatsaR tarafından Hafnian'ı hesaplamanın farklı bir yolunu içerecek şekilde güncellendi. Bunu golf oynamak çok ilginç olurdu.