Para un n fijo, considere las matrices de Toeplitz n por n con entradas que son 0 o 1. El objetivo es encontrar el determinante máximo sobre todas esas matrices de Toeplitz.
Tarea
Para cada uno n
de 1 en adelante, genere el determinante máximo sobre todas las matrices de n por n Toeplitz con entradas que sean 0 o 1. Debe haber una salida por la n
cual debe tener el determinante máximo y también una matriz de ejemplo que lo alcance.
Puntuación
Su puntaje es el más grande n
que alcanza su código en 2 minutos en mi computadora. Para aclarar un poco, su código puede ejecutarse durante 2 minutos en total, esto no es 2 minutos por n
.
Desempate
Si dos entradas obtienen el mismo n
puntaje, la entrada ganadora será la que obtenga la mayor puntuación n
en el menor tiempo posible en mi máquina. Si las dos mejores entradas son iguales en este criterio también, entonces el ganador será la respuesta presentada primero.
Idiomas y bibliotecas
Puede utilizar cualquier idioma y bibliotecas disponibles gratuitamente que desee. Debo poder ejecutar su código, así que incluya una explicación completa sobre cómo ejecutar / compilar su código en Linux si es posible.
Mi máquina Los tiempos se ejecutarán en mi máquina. Esta es una instalación estándar de ubuntu en un procesador AMD FX-8350 de ocho núcleos. Esto también significa que necesito poder ejecutar su código.
Respuestas pequeñas
Para n = 1..10 las salidas deben ser 1,1,2,3,5,9,32,56,125,315
Esta secuencia no está en OEIS, por lo que la entrada ganadora también puede proponer una nueva entrada allí.
Entradas hasta ahora
n=10
n=11
por Vioz en Pythonn=9
por Tyilo en Cn=12
por Legendre en Jn=10
por Tensibai en Rn=14
por SteelRaven en C ++n=14
por RetoKoradi en C ++
n = 1..10
: ghostbin.com/paste/axkpaRespuestas:
C ++ con pthreads
Esto llega a n = 14 en poco menos de 1 minuto en mi máquina. Pero dado que es solo una computadora portátil de 2 núcleos, espero que la máquina de prueba de 8 núcleos pueda terminar n = 15 en menos de 2 minutos. Tarda unos 4:20 minutos en mi máquina.
Realmente esperaba encontrar algo más eficiente. No ha llegado a ser una manera de calcular el determinante de una matriz binaria de manera más eficiente. Quería crear algún tipo de enfoque de programación dinámica que cuente los términos +1 y -1 en el cálculo determinante. Pero simplemente no se ha unido hasta ahora.
Como la recompensa está por expirar, implementé el enfoque estándar de fuerza bruta:
Probé esto en Mac OS, pero usé un código similar en Ubuntu antes, así que espero que esto se compile y se ejecute sin problemas:
.cpp
extensión, por ejemplooptim.cpp
.gcc -Ofast optim.cpp -lpthread -lstdc++
.time ./a.out 14 8
. El primer argumento es el máximon
. 14 debería terminar en menos de 2 minutos, pero sería genial si pudieras probar 15 también. El segundo argumento es el número de hilos. Usar el mismo valor que el número de núcleos de la máquina es normalmente un buen comienzo, pero probar algunas variaciones podría mejorar los tiempos.Avíseme si tiene algún problema para crear o ejecutar el código.
fuente
J
Actualización: código mejorado para buscar más de la mitad de los valores. Ahora calcula
n=12
cómodamente en 120 segundos (de 217 a 60 segundos).Necesitará la última versión de J instalada.
Ejecute esto y mate cuando hayan transcurrido dos minutos. Mis resultados (MBP 2014 - 16 GB de RAM):
Tiempo total de ejecución = 61.83s.
Solo por diversión
Esto tomó aproximadamente 210 segundos por sí solo.
fuente
n = 12
requiere aproximadamente 18 GiB de memoria.n=13
. Puede cambiar el13
en la penúltima línea para que calcule lo que desee.)Python 2
Esta es una solución muy sencilla, y probablemente no ganará el concurso. Pero oye, ¡funciona!
Daré un resumen rápido de lo que está sucediendo exactamente.
n
. Por ejemplo, cuándon=2
, esto generará una longitud de matriz 2 n + 1 , donde cada fila es longitud 2n-1. Se vería así:[[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
.n
veces y corto los primerosn
elementos para generar la matriz adecuada, y lo usoscipy
para calcular el determinante, todo mientras hago un seguimiento del valor máximo. Al final de esto, simplemente imprimo el máximo, incrementen
en 1, y continúo hasta que hayan pasado 10 minutos.Para ejecutar esto, necesitará scipy instalado.
Edición 1: se modificó la forma en que se crearon las filas iniciales mediante el uso de itertools.product, ¡gracias Sp3000!
Edición 2: Se eliminó el almacenamiento de posibles filas iniciales para una mejora mínima en la velocidad.
Edición 3: cambiado para
scipy
tener más control sobre cómodet
funcionó.Aquí hay algunos resultados de muestra en mi máquina doméstica (i7-4510U, 8GB RAM):
fuente
C ++
Fuerza bruta con el uso de OpenMP para paralelización y optimización simple para evitar la evaluación de determinantes para matrices transpuestas.
fuente
C
Compilar con:
Corre con:
Puede generar el determinante máximo
n = 1..10
en ~ 115 segundos en mi computadora.El programa solo está obteniendo el determinante de todas las posibles matrices binarias de tamaño de Toeplitz
n
, sin embargo, cada determinante de matrices de tamaño5x5
o menor se almacenará en caché mediante la memorización.Al principio, supuse erróneamente que cada submatriz de una matriz de Toeplitz también sería una matriz de Toeplitz, por lo que solo necesitaba memorizar
2^(2n-1)
valores en lugar de2^(n^2)
cada unon
. Hice el programa antes de darme cuenta de mi error, por lo que esta presentación es solo una solución de ese programa.fuente
O(n!)
complejidad, por lo que es mejor que uses un algoritmo diferente.O(n^3)
, creo, aunque se puede hacer más rápido con algunos algoritmos interesantes. Creo que la mayoría de los componentes incorporados aquí generalmente usan una variante de descomposición para realizar determinantes.O(n^2)
algoritmo si estoy actualizando mi respuesta.O(n^2)
. Pero creo que el cuello de botella del problema está buscando entre losO(4^n)
muchos 0-1n
porn
matrices.R
Tendrás que instalar R y los paquetes listados con
install.packages("package_name")
No obtuve menos de 2 minutos en mi máquina con esta versión (tengo que probar con una modificación paralela)
Llamada y salida:
Punto de referencia en mi máquina:
Para información, para un rango de 1:11, toma 285 segundos.
fuente
PARI / GP, n = 11
Esta es la fuerza bruta pero que se aprovecha
det(A^T) = det(A)
. Solo lo estoy publicando para demostrar lo fácil que es omitir las transposiciones. El bit más bajob1
contiene la celda superior izquierda, y los otros bits sostienen el resto de la fila superior.b2
sostiene el resto de la columna izquierda. Simplemente hacemos cumplirb2 <= (b1>>1)
.Con respecto al cálculo de los determinantes de Toeplitz a
O(n^2)
tiempo: en mi investigación limitada, me he topado con el requisito de que todos los principales principales menores de edad no sean cero para que los algoritmos funcionen, lo cual es un obstáculo importante para esta tarea. No dudes en darme consejos si sabes más sobre esto que yo.fuente
e_{k+1}
tiene 4 veces el número de componentes quee_k
. Hay muchas omisiones en el documento. Una matriz invertible tiene una descomposición LU si todos los menores principales principales son distintos de cero. (Observe los denominadores, por ejemploa_0
, implícitamente se garantiza que no son cero.) La unicidad proviene de que L es unidad triangular. El autor tampoco mencionó la estabilidad numérica. En caso de que el enlace no esté disponible, el documento es "Sobre el cálculo de los determinantes de las matrices de Toeplitz" por Hsuan-Chu Li (2011).