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