Lo prometo, este será mi último desafío sobre las diamantaciones (por un tiempo, de todos modos). En el lado positivo, este desafío no tiene nada que ver con el arte ASCII, y tampoco es un código de golf, por lo que esto es realmente completamente diferente.
Así que solo como recordatorio, cada hexágono se puede titular con tres diamantes diferentes:
Una pregunta interesante es cuántas de estas inclinaciones existen para un tamaño de hexágono dado. Parece que estos números se han estudiado bastante a fondo y se pueden encontrar en OEIS A008793 .
Sin embargo, el problema se vuelve más complicado si preguntamos cuántas inclinaciones existen hasta la rotación y la reflexión . Por ejemplo, para la longitud del lado N = 2, existen las siguientes 20 inclinaciones:
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/\_\_\ /\_\_\ /\_\_\ /\_\_\ /_/\_\ /_/\_\ /\_\_\ /_/\_\ /_/\_\ /_/\_\
/\/\_\_\ /\/_/\_\ /\/_/_/\ /\/_/\_\ /\_\/\_\ /\_\/_/\ /\/_/_/\ /\_\/\_\ /\_\/_/\ /_/\/\_\
\/\/_/_/ \/\_\/_/ \/\_\_\/ \/_/\/_/ \/\_\/_/ \/\_\_\/ \/_/\_\/ \/_/\/_/ \/_/\_\/ \_\/\/_/
\/_/_/ \/_/_/ \/_/_/ \_\/_/ \/_/_/ \/_/_/ \_\/_/ \_\/_/ \_\/_/ \_\/_/
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/_/_/\ /\_\_\ /_/\_\ /_/_/\ /_/\_\ /_/\_\ /_/_/\ /_/_/\ /_/_/\ /_/_/\
/\_\_\/\ /\/_/_/\ /_/\/_/\ /\_\_\/\ /\_\/_/\ /_/\/_/\ /_/\_\/\ /\_\_\/\ /_/\_\/\ /_/_/\/\
\/\_\_\/ \/_/_/\/ \_\/\_\/ \/_/\_\/ \/_/_/\/ \_\/_/\/ \_\/\_\/ \/_/_/\/ \_\/_/\/ \_\_\/\/
\/_/_/ \_\_\/ \_\/_/ \_\/_/ \_\_\/ \_\_\/ \_\/_/ \_\_\/ \_\_\/ \_\_\/
Pero muchos de estos son idénticos bajo rotación y reflexión. Si tomamos en cuenta estas simetrías, solo quedan 6 inclinaciones distintas:
____ ____ ____ ____ ____ ____
/\_\_\ /\_\_\ /\_\_\ /_/\_\ /_/\_\ /_/\_\
/\/\_\_\ /\/_/\_\ /\/_/_/\ /\_\/_/\ /\_\/_/\ /_/\/\_\
\/\/_/_/ \/\_\/_/ \/\_\_\/ \/\_\_\/ \/_/\_\/ \_\/\/_/
\/_/_/ \/_/_/ \/_/_/ \/_/_/ \_\/_/ \_\/_/
2 2 6 6 1 3
donde los números indican la multiplicidad de cada mosaico. Tenga en cuenta que para hexágonos más grandes también hay inclinaciones con multiplicidades 4 y 12.
Parece que el número de inclinaciones hasta la simetría se ha estudiado menos a fondo. La entrada OEIS A066931 solo enumera los cinco términos:
1, 1, 6, 113, 20174
donde el primer término es para la longitud del lado N = 0
y el último término para la longitud del lado N = 4
.
¡Estoy seguro de que podemos hacerlo mejor que eso!
Su tarea es calcular el número de inclinaciones para una longitud lateral dada.
Este es el código más rápido . Su puntaje será la longitud lateral más alta N
para la cual su código produce el resultado correcto en 30 minutos en mi máquina. En caso de empate, voy a aceptar la presentación que produce el resultado de que N
más rápido.
Como de costumbre, no debe codificar los resultados que ya sabe para ganar el desempate. El algoritmo que resuelve N = 3
debe ser idéntico al que resuelve N = 5
.
Su envío no debe usar más de 4 GB de memoria. Le daré un margen de maniobra a esto si está operando cerca de ese límite, pero si está constantemente por encima de ese límite, o si aumenta significativamente más allá, no lo tendré en cuenta N
para su presentación.
Probaré todos los envíos en mi máquina con Windows 8, así que asegúrese de que su idioma de elección esté disponible gratuitamente en Windows. La única excepción a esto es Mathematica (porque tengo una licencia para ello). Incluya instrucciones sobre cómo compilar / ejecutar su código.
Por supuesto, siéntase libre de calcular más términos en su propio tiempo (para la ciencia y para que otros verifiquen sus números), pero el puntaje de su respuesta se determinará en esos 30 minutos.
fuente
N = 6
da una salida de más de 10 ^ 12, es casi seguro que es necesaria una solución no constructiva para llegar tan lejos.Respuestas:
Álgebra, teoría de grafos, inversión de Möbius, investigación y Java
El grupo de simetría del hexágono es el grupo diédrico de orden 12, y se genera mediante una rotación de 60 grados y un giro de espejo a través de un diámetro. Tiene 16 subgrupos, pero algunos de ellos están en grupos conjugados no triviales (los que solo tienen reflejos tienen 3 opciones de eje), por lo que hay 10 simetrías fundamentalmente diferentes que puede tener un mosaico del hexágono:
El número de inclinaciones de diamante de un subconjunto de una red triangular se puede calcular como determinante , por lo que mi enfoque inicial fue establecer un determinante para cada una de las simetrías del hexágono, para calcular el número de inclinaciones que tienen al menos esas simetrías ; y luego use la inversión de Möbius en el álgebra de incidencia de su poset (básicamente una generalización del principio de inclusión-exclusión) para calcular el número de inclinaciones cuyo grupo de simetría es exactamente cada uno de los 10 casos. Sin embargo, algunas de las simetrías tienen condiciones de borde desagradables, por lo que me vi obligado a sumar exponencialmente muchos determinantes. Afortunadamente, los valores obtenidos para
n < 10
me dio suficientes datos para poder identificar secuencias relevantes en OEIS y armar una forma cerrada (por algún valor de "cerrado" que permite productos finitos). Hay un poco de discusión sobre las secuencias, y referencias a las pruebas, en el escrito formal que preparé para justificar las actualizaciones de la secuencia OEIS.Una vez que se realiza el conteo doble, resulta que cuatro de los diez valores se cancelan de manera ordenada, por lo que solo tenemos que calcular los seis restantes y luego hacer una suma ponderada.
Este código tarda menos de 30 segundos
N=1000
en mi máquina.fuente
C
Introducción
Como comentó David Carraher, la forma más simple de analizar el mosaico hexagonal parecía ser aprovechar su isomorfismo con el Diagrama joven tridimensional, esencialmente un cuadrado x, y lleno de barras de altura enteras cuyas alturas z deben permanecer iguales o aumentar a medida que se acerca el eje z.
Comencé con un algoritmo para encontrar los totales que es más susceptible de adaptación para el conteo de simetría que el algoritmo publicado, que se basa en un sesgo en uno de los tres ejes cartesianos.
Algoritmo
Comienzo rellenando las celdas de los planos x, y y z con 1, mientras que el resto del área contiene ceros. Una vez hecho esto, construyo el patrón capa por capa, con cada capa que contiene las celdas que tienen una distancia manhattan 3D común desde el origen. Una celda solo puede contener un 1 si las tres celdas debajo también contienen un 1. si alguna de ellas contiene un 0, entonces la celda debe ser un 0.
La ventaja de construir el patrón de esta manera es que cada capa es simétrica respecto a la línea x = y = z. Esto significa que cada capa se puede verificar independientemente para la simetría.
Comprobación de simetría
Las simetrías del sólido son las siguientes: rotación 3 veces alrededor de la línea x = y = z -> rotación 3 veces alrededor del centro del hexágono; y 3 x reflexiones sobre los 3 planos que contienen la línea x = y = z y cada uno de los ejes x, y, z -> reflexión sobre las líneas a través de las esquinas del hexágono.
Esto suma solo 6 simetrías. Para obtener la simetría completa del hexágono, se debe considerar otro tipo de simetría. Cada sólido (construido a partir de 1) tiene un sólido complementario (construido a partir de 0). Donde N es impar, el sólido complementario debe ser diferente del sólido original (porque no es posible que tengan el mismo número de cubos). Sin embargo, cuando el sólido complementario se da vuelta, se encontrará que su representación 2D como un mosaico de diamantes es idéntica (a excepción de una operación de simetría de 2 veces) al sólido original. Donde N es par, es posible que el sólido sea autoinverso.
Esto se puede ver en los ejemplos para N = 2 en la pregunta. Si se ve desde la izquierda, el primer hexágono se ve como un cubo sólido con 8 cubos pequeños, mientras que el último hexágono se ve como una cáscara vacía con 0 cubos pequeños. Si se ve desde la derecha, lo contrario es cierto. Los hexágonos 3º, 4º y 5º y los hexágonos 16º, 17º y 18º parecen contener 2 o 6 cubos y, por lo tanto, se complementan entre sí en 3 dimensiones. Se relacionan entre sí en 2 dimensiones mediante una operación de simetría de 2 veces (rotación de 2 veces o reflexión sobre un eje a través de los bordes del hexágono). Por otro lado, los 9º, 10º, 11º y 12º hexágonos muestran patrones 3D que son sus propios complementos y, por lo tanto, tienen una simetría más alta (por lo tanto, estos son los únicos patrones con multiplicidad extraña).
Tenga en cuenta que tener (N ^ 3) / 2 cubos es una condición necesaria para autocompletarse, pero en general no es una condición suficiente si N> 2. El resultado de todo esto es que para N impar, las inclinaciones siempre ocurren en pares (N ^ 3) / 2 cubos deben ser cuidadosamente inspeccionados.
Código actual (genera el total correcto para N = 1,2,3,5. Error como se discutió para N = 4.)
Salida
El programa genera una tabla de salida de 8 entradas, de acuerdo con las 8 simetrías del sólido. El sólido puede tener cualquiera de las 4 simetrías siguientes (notación de Schoenflies)
Además, cuando el sólido tiene exactamente la mitad de las celdas con 1 y la otra mitad con 0, existe la posibilidad de voltear todos los 1 y 0, y luego invertir las coordenadas a través del centro del espacio del cubo. Esto es lo que yo llamo autocomplemento, pero un término más matemático sería "antisimétrico con respecto a un centro de inversión".
Esta operación de simetría proporciona un eje de rotación de 2 veces en el mosaico hexagonal.
Los patrones que tienen esta simetría se enumeran en una columna separada. Solo ocurren donde N es par.
Mi recuento parece estar ligeramente apagado para N = 4. En discusión con Peter Taylor, parece que no estoy detectando inclinaciones que solo tienen una simetría de una línea a través de los bordes del hexágono. Esto se debe presumiblemente a que no he realizado pruebas de autocomplemento (antisimetría) para operaciones que no sean (inversión) x (identidad). Prueba de autocomplemento para las operaciones (inversión) x (reflexión) y (inversión) x (rotación de 3 veces ) puede descubrir las simetrías faltantes. Entonces esperaría que la primera línea de datos para N = 4 se vea así (16 menos en c1 y 32 más en C1):
Esto pondría los totales en línea con la respuesta de Peter y https://oeis.org/A066931/a066931.txt
La salida actual es la siguiente.
Lista de tareas (actualizada)
Listo, más o menos
Hecho, los resultados para N impar coinciden con los datos publicados
Esto se puede hacer agregando otra condición a la llamada de recursión:
if(s1 && m<n*3-2)f(m + 1,e+d,s1)
reduce el tiempo de ejecución para N = 5 de 5 minutos a aproximadamente un segundo. Como resultado, la primera línea de salida se convierte en basura total (al igual que los totales generales), pero si el OEIS ya conoce el total, el número de inclinaciones asimétricas se puede reconstituir, al menos para N.Pero incluso para N, se perdería el número de sólidos asimétricos (según las simetrías c3v) que se autocomplementan. Para este caso, un programa separado dedicado a sólidos con exactamente (N ** 3) / 2 celdas con un 1 puede ser útil. Con esto disponible (y contando correctamente) puede ser posible probar N = 6, pero tomará mucho tiempo ejecutarlo.
No hecho, se espera que los ahorros sean marginales
Hecho, pero parece tener omisiones, ver N = 4.
No se espera que los ahorros sean tan buenos. Suprimir figuras asimétricas elimina la mayor parte de esto. El único reflejo que se verifica es el plano a través del eje y (x y z se calculan luego multiplicando por 3.) Las figuras con simetría rotacional solo se cuentan en sus dos formas enantioméricas. Quizás correría casi el doble de rápido si solo se contara uno.
Interesante pero probablemente hay otras preguntas en el sitio para explorar.
fuente