El desafío es escribir el código más rápido posible para calcular el permanente de una matriz .
El permanente de una matriz n
-by- = ( ) se define comon
A
a
i,j
Aquí S_n
representa el conjunto de todas las permutaciones de [1, n]
.
Como ejemplo (de la wiki):
En esta pregunta, todas las matrices son cuadradas y solo tendrán los valores -1
y 1
en ellas.
Ejemplos
Entrada:
[[ 1 -1 -1 1]
[-1 -1 -1 1]
[-1 1 -1 1]
[ 1 -1 -1 1]]
Permanente:
-4
Entrada:
[[-1 -1 -1 -1]
[-1 1 -1 -1]
[ 1 -1 -1 -1]
[ 1 -1 1 -1]]
Permanente:
0
Entrada:
[[ 1 -1 1 -1 -1 -1 -1 -1]
[-1 -1 1 1 -1 1 1 -1]
[ 1 -1 -1 -1 -1 1 1 1]
[-1 -1 -1 1 -1 1 1 1]
[ 1 -1 -1 1 1 1 1 -1]
[-1 1 -1 1 -1 1 1 -1]
[ 1 -1 1 -1 1 -1 1 -1]
[-1 -1 1 -1 1 1 1 1]]
Permanente:
192
Entrada:
[[1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1],
[1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1],
[-1, -1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, -1],
[-1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1],
[-1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1],
[1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, -1, -1],
[1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1],
[1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1],
[-1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1],
[1, 1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[-1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1],
[1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],
[-1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1],
[1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1],
[-1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1]]
Permanente:
1021509632
La tarea
Debería escribir un código que, dado n
por una n
matriz, produzca su permanente.
Como tendré que probar su código, sería útil si pudiera darme una forma simple de dar una matriz como entrada a su código, por ejemplo, leyendo el estándar en.
Tenga en cuenta que el permanente puede ser grande (la matriz de todo 1 es el caso extremo).
Puntuaciones y lazos
Probaré su código en matrices aleatorias + -1 de tamaño creciente y me detendré la primera vez que su código tarde más de 1 minuto en mi computadora. Las matrices de puntuación serán consistentes para todas las presentaciones a fin de garantizar la equidad.
Si dos personas obtienen el mismo puntaje, entonces el ganador es el que tiene el valor más rápido n
. Si están dentro de 1 segundo el uno del otro, entonces es el publicado primero.
Idiomas y bibliotecas
Puede usar cualquier idioma y bibliotecas disponibles que desee, pero ninguna función preexistente para calcular el permanente. Siempre que sea posible, sería bueno poder ejecutar su código, así que incluya una explicación completa de cómo ejecutar / compilar su código en Linux si es posible.
Implementaciones de referencia
Ya hay una pregunta de codegolf con mucho código en diferentes idiomas para calcular el permanente para matrices pequeñas. Mathematica y Maple también tienen implementaciones permanentes si puedes acceder a ellas.
Mi máquina Los tiempos se ejecutarán en mi máquina de 64 bits. Esta es una instalación estándar de ubuntu con 8 GB de RAM, procesador AMD FX-8350 de ocho núcleos y Radeon HD 4250. Esto también significa que necesito poder ejecutar su código.
Información de bajo nivel sobre mi máquina
cat /proc/cpuinfo/|grep flags
da
. frág.
Haré una pregunta multilingüe de seguimiento estrechamente relacionada que no sufre el gran problema Int para que los amantes de Scala , Nim , Julia , Rust , Bash puedan mostrar sus idiomas también.
Tabla de líderes
- n = 33 (45 segundos. 64 segundos para n = 34). Ton Hospel en C ++ con g ++ 5.4.0.
- n = 32 (32 segundos). Dennis en C con gcc 5.4.0 usando las banderas gcc de Ton Hospel.
- n = 31 (54 segundos). Christian Sievers en Haskell
- n = 31 (60 segundos). primo en rpython
- n = 30 (26 segundos). ezrast en Rust
- n = 28 (49 segundos). xnor con Python + pypy 5.4.1
- n = 22 (25 segundos). Shebang con Python + pypy 5.4.1
Nota . En la práctica, los horarios de Dennis y Ton Hospel varían mucho por razones misteriosas. ¡Por ejemplo, parecen ser más rápidos después de cargar un navegador web! Los tiempos citados son los más rápidos en todas las pruebas que he realizado.