Задача состоит в том, чтобы написать максимально быстрый код для вычисления перманента матрицы .
Перманент n
-by- n
matrix A
= ( a
i,j
) определяется как
Здесь S_n
представляет множество всех перестановок [1, n]
.
Как пример (из вики):
В этом вопросе матрицы все квадратные и будут иметь только значения -1
и 1
в них.
Примеры
Входные данные:
[[ 1 -1 -1 1]
[-1 -1 -1 1]
[-1 1 -1 1]
[ 1 -1 -1 1]]
Постоянный:
-4
Входные данные:
[[-1 -1 -1 -1]
[-1 1 -1 -1]
[ 1 -1 -1 -1]
[ 1 -1 1 -1]]
Постоянный:
0
Входные данные:
[[ 1 -1 1 -1 -1 -1 -1 -1]
[-1 -1 1 1 -1 1 1 -1]
[ 1 -1 -1 -1 -1 1 1 1]
[-1 -1 -1 1 -1 1 1 1]
[ 1 -1 -1 1 1 1 1 -1]
[-1 1 -1 1 -1 1 1 -1]
[ 1 -1 1 -1 1 -1 1 -1]
[-1 -1 1 -1 1 1 1 1]]
Постоянный:
192
Входные данные:
[[1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1],
[1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1],
[-1, -1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, -1],
[-1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1],
[-1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1],
[1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, -1, -1],
[1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1],
[1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1],
[-1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1],
[1, 1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[-1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1],
[1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],
[-1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1],
[1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1],
[-1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1]]
Постоянный:
1021509632
Задание
Вы должны написать код, который с n
помощью n
матрицы выводит его постоянный.
Поскольку мне нужно будет протестировать ваш код, было бы полезно, если бы вы могли дать мне простой способ дать матрицу в качестве входных данных для вашего кода, например, путем чтения из стандартного в.
Имейте в виду, что перманент может быть большим (матрица all 1s - крайний случай).
Счета и связи
Я протестирую ваш код на случайных + 1 матрицах увеличивающегося размера и остановлюсь, когда ваш код займет больше 1 минуты на моем компьютере. Матрицы оценки будут согласованы для всех представленных документов, чтобы обеспечить справедливость.
Если два человека получают одинаковый результат, то победителем считается тот, кто быстрее всех получит это значение n
. Если они находятся в пределах 1 секунды друг от друга, то это тот, который размещен первым.
Языки и библиотеки
Вы можете использовать любой доступный язык и библиотеки, которые вам нравятся, но не можете использовать предварительно существующую функцию для вычисления перманента. Там, где это возможно, было бы хорошо иметь возможность запускать ваш код, поэтому, пожалуйста, включите полное объяснение того, как запускать / компилировать ваш код в Linux, если это возможно.
Реализованные реализации
Уже есть вопрос о Codegolf с большим количеством кода на разных языках для вычисления перманента для маленьких матриц. Mathematica и Maple также имеют постоянные реализации, если вы можете получить к ним доступ.
Моя машина Время будет работать на моей 64-битной машине. Это стандартная установка Ubuntu с 8 ГБ ОЗУ, восьмиъядерным процессором AMD FX-8350 и Radeon HD 4250. Это также означает, что мне нужно иметь возможность запускать ваш код.
Низкоуровневая информация о моей машине
cat /proc/cpuinfo/|grep flags
дает
флаги: FPU VME-де-псевдоэфедрин TSC MSR пае MCE CX8 APIC Сентябрь MTRR PGE MCA CMOV погладить pse36 clflush MMX fxsr сс sse2 ХТЫ системного вызов ого mmxext fxsr_opt pdpe1gb rdtscp ого constant_tsc rep_good nopl nonstop_tsc extd_apicid aperfmperf ПНИ PCLMULQDQ монитор SSSE3 FMA CX16 sse4_1 sse4_2 POPCNT АЕС XSAVE AVX f16c lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a неправильное выравнивание
Я задам тесно связанный вопрос о мультиязычности, который не страдает от большой проблемы с Int, поэтому любители Scala , Nim , Julia , Rust , Bash также могут похвастаться своими языками.
Таблица лидеров
- n = 33 (45 секунд. 64 секунды для n = 34). Тон Хоспел в C ++ с g ++ 5.4.0.
- n = 32 (32 секунды). Деннис в C с gcc 5.4.0 использует флаги gcc Тон Хоспел.
- n = 31 (54 секунды). Кристиан Сиверс в Хаскеле
- n = 31 (60 секунд). примы в rpython
- n = 30 (26 секунд). Езраст в Русте
- n = 28 (49 секунд). xnor с Python + pypy 5.4.1
- n = 22 (25 секунд). Шебанг с Python + pypy 5.4.1
Примечание . На практике время для Денниса и Тона Хоспела сильно различается по таинственным причинам. Например, они кажутся быстрее после того, как я загрузил веб-браузер! Указанные сроки являются самыми быстрыми во всех тестах, которые я проводил.