Завдання полягає в тому, щоб написати кодогольф для Хафніана матриці . Хафніан 2n
-бісиметричної 2n
матриці A
визначається як:
Тут S 2n являє собою сукупність усіх перестановок цілих чисел від 1
до 2n
, тобто [1, 2n]
.
Посилання на вікіпедію розповідає про матриці суміжності, але ваш код повинен працювати для будь-яких справжніх симетричних матриць введення.
Для тих, хто цікавиться програмами Хафніана, посилання mathoverflow обговорює ще декілька.
Ваш код може брати вхід, як би він хотів, і давати вихід у будь-якому розумному форматі, але, будь ласка, включіть у свою відповідь повний відпрацьований приклад, включаючи чіткі інструкції щодо того, як подати вхід до вашого коду.
Вхідна матриця завжди квадратна і буде максимум 16 на 16. Немає необхідності обробляти порожню матрицю або матриці непарних розмірів.
Довідкова реалізація
Ось приклад коду python від містера 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
Сторінку вікі зараз (2 березня 2018 року) оновив ShreevatsaR, щоб включити інший спосіб обчислення Хафніана. Було б дуже цікаво побачити цього гольфа.