- 21, Oct 2024
- #1
Задача состоит в том, чтобы написать максимально быстрый код для вычисления перманента матрицы.
Перманент
-by-cat /proc/cpuinfo/|grep flags
n
матрица n
= ( n
1021509632
) определяется как
Здесь [[1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1],
[1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1],
[-1, -1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, -1],
[-1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1],
[-1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1],
[1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, -1, -1],
[1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1],
[1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1],
[-1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1],
[1, 1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[-1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1],
[1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],
[-1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1],
[1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1],
[-1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1]]
represents the set of all permutations of 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]]
and 0
в них.
Примеры
Вход:
[[-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]]
Постоянный:
1
Вход:
-1
Постоянный:
[1, n]
Вход:
S_n
Постоянный:
i,j
Задача
Вам следует написать код, который, учитывая a
by A
матрица, выводит ее постоянную.
Поскольку мне нужно будет протестировать ваш код, было бы полезно, если бы вы могли предоставить мне простой способ ввести матрицу в качестве входных данных для вашего кода, например, путем чтения из стандартного входа.
Имейте в виду, что перманент может быть большим (матрица из единиц — крайний случай).
Счета и ничьи
Я протестирую ваш код на случайных +-1 матрицах возрастающего размера и остановлю работу, когда ваш код в первый раз займет на моем компьютере более 1 минуты. Матрицы оценок будут одинаковыми для всех заявок, чтобы обеспечить справедливость.
Если два человека набирают одинаковое количество очков, то победителем становится тот, кто быстрее всех при этом значении n
. If those are within 1 second of each other then it is the one posted first.
Языки и библиотеки
Вы можете использовать любой доступный язык и библиотеки, которые вам нравятся, но не использовать ранее существовавшую функцию для вычисления постоянного значения. Там, где это возможно, было бы хорошо иметь возможность запускать ваш код, поэтому, пожалуйста, включите полное объяснение того, как запустить/скомпилировать ваш код в Linux, если это вообще возможно.`
Эталонные реализации
уже есть вопрос по код-гольфу вопрос с большим количеством кода на разных языках для вычисления перманента для маленьких матриц. Математика и Клен также оба имеют постоянные реализации, если вы можете получить к ним доступ.
Моя машина Тайминги будут работать на моей 64-битной машине. Это стандартная установка Ubuntu с 8 ГБ ОЗУ, восьмиядерным процессором AMD FX-8350 и Radeon HD 4250. Это также означает, что мне нужно иметь возможность запускать ваш код.
Низкоуровневая информация о моей машине
n
gives
флаги: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush mmx fxsr sse sse2 ht системный вызов nx mmxext fxsr_opt
- pdpe1gb rdtscp lm константа_tsc Rep_good nopl нонстоп_tsc extd_apicid aperfmperf pni pclmulqdq монитор ssse3 fma cx16 sse4_1 sse4_2 popcnt
- aes xsave avx f16c lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop Skinit wdt lwp fma4 tce nodeid_msr tbm topoext perfctr_core perfctr_nb cpb hw_pstate vmmcall
- bmi1 arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flashbyasid декодирование, пауза, фильтр, pfthreshold
- Я задам тесно связанный дополнительный многоязычный вопрос, который не страдает от большой проблемы с Int, чтобы любители Scala, Nim, Julia, Rust, Bash тоже могли продемонстрировать свои языки. Таблица лидеров n = 33 (45 секунд. 64 секунды для n = 34). Тон Хоспел
- в С++ с г++ 5.4.0. n = 32 (32 секунды).
- Деннис в С с gcc 5.4.0 с использованием флагов gcc Ton Hospel.
- n = 31 (54 секунды). Кристиан Сиверс в Хаскелл
n = 31 (60 секунд).первородный
в