Je promets que ce sera mon dernier défi concernant les diamants (pour un temps, en tout cas). Le bon côté des choses, ce défi n’a rien à voir avec l’art ASCII, et n’est pas non plus un code de golf, c’est donc complètement différent.
Pour rappel, chaque hexagone peut porter trois diamants différents:
Une question intéressante à poser est de savoir combien de ces pavages existent pour une taille d’hexagone donnée. Il semble que ces chiffres ont été assez étudiés et figurent dans le document OEIS A008793 .
Cependant, le problème devient plus compliqué si nous demandons combien de niveaux existent jusqu’à rotation et réflexion . Par exemple, pour une longueur de côté N = 2, il existe les 20 pavages suivants:
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/\_\_\ /\_\_\ /\_\_\ /\_\_\ /_/\_\ /_/\_\ /\_\_\ /_/\_\ /_/\_\ /_/\_\
/\/\_\_\ /\/_/\_\ /\/_/_/\ /\/_/\_\ /\_\/\_\ /\_\/_/\ /\/_/_/\ /\_\/\_\ /\_\/_/\ /_/\/\_\
\/\/_/_/ \/\_\/_/ \/\_\_\/ \/_/\/_/ \/\_\/_/ \/\_\_\/ \/_/\_\/ \/_/\/_/ \/_/\_\/ \_\/\/_/
\/_/_/ \/_/_/ \/_/_/ \_\/_/ \/_/_/ \/_/_/ \_\/_/ \_\/_/ \_\/_/ \_\/_/
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/_/_/\ /\_\_\ /_/\_\ /_/_/\ /_/\_\ /_/\_\ /_/_/\ /_/_/\ /_/_/\ /_/_/\
/\_\_\/\ /\/_/_/\ /_/\/_/\ /\_\_\/\ /\_\/_/\ /_/\/_/\ /_/\_\/\ /\_\_\/\ /_/\_\/\ /_/_/\/\
\/\_\_\/ \/_/_/\/ \_\/\_\/ \/_/\_\/ \/_/_/\/ \_\/_/\/ \_\/\_\/ \/_/_/\/ \_\/_/\/ \_\_\/\/
\/_/_/ \_\_\/ \_\/_/ \_\/_/ \_\_\/ \_\_\/ \_\/_/ \_\_\/ \_\_\/ \_\_\/
Mais beaucoup d'entre eux sont identiques en rotation et en réflexion. Si l'on prend en compte ces symétries, il ne reste que 6 pavages distincts:
____ ____ ____ ____ ____ ____
/\_\_\ /\_\_\ /\_\_\ /_/\_\ /_/\_\ /_/\_\
/\/\_\_\ /\/_/\_\ /\/_/_/\ /\_\/_/\ /\_\/_/\ /_/\/\_\
\/\/_/_/ \/\_\/_/ \/\_\_\/ \/\_\_\/ \/_/\_\/ \_\/\/_/
\/_/_/ \/_/_/ \/_/_/ \/_/_/ \_\/_/ \_\/_/
2 2 6 6 1 3
où les chiffres indiquent la multiplicité de chaque mosaïque. Notez que pour les grands hexagones, il y a aussi des pavages avec les multiplicités 4 et 12.
Il semble que le nombre de pavages jusqu’à la symétrie ait été étudié de manière moins approfondie. L’entrée A066931 d’ OEIS ne contient que les cinq termes:
1, 1, 6, 113, 20174
où le premier terme est pour la longueur du côté N = 0
et le dernier terme pour la longueur du côté N = 4
.
Je suis sûr que nous pouvons faire mieux que ça!
Votre tâche consiste à calculer le nombre de pavages pour une longueur de côté donnée.
C'est le code le plus rapide . Votre score sera la plus grande longueur N
de côté pour laquelle votre code produira le résultat correct dans les 30 minutes qui suivent sur ma machine. En cas d'égalité, je vais accepter la soumission qui produit le résultat pour que N
le plus rapide.
Comme d'habitude, vous ne devez pas coder en dur les résultats que vous connaissez déjà pour gagner le match décisif. L'algorithme à résoudre N = 3
doit être identique à celui qui le résout N = 5
.
Votre soumission ne doit pas utiliser plus de 4 Go de mémoire. Je vais laisser une marge de manœuvre à ce sujet si vous exploitez près de cette limite, mais si vous dépassez constamment cette limite ou si vous dépassez considérablement cette limite, je ne compterai pas cela N
dans votre déclaration.
Je vais tester toutes les soumissions sur mon ordinateur Windows 8, alors assurez-vous que la langue de votre choix est librement disponible sur Windows. Mathematica est la seule exception à cette règle (car j’en ai une licence). S'il vous plaît inclure des instructions sur la façon de compiler / exécuter votre code.
Bien sûr, sentez-vous libre de calculer plus de termes à votre rythme (pour la science, et pour que les autres vérifient leur nombre), mais le score de votre réponse sera déterminé par ces 30 minutes.
la source
N = 6
sortie de plus de 10 ^ 12, une solution non constructive est presque certainement nécessaire pour aller aussi loin.Réponses:
Algèbre, théorie des graphes, inversion de Möbius, recherche et Java
Le groupe de symétrie de l'hexagone est le groupe dièdre d'ordre 12 et est généré par une rotation de 60 degrés et un retournement de miroir sur un diamètre. Il comporte 16 sous-groupes, mais certains d'entre eux appartiennent à des groupes de conjugaison non triviaux (ceux qui n'ont que des réflexions ont 3 choix d'axe). Il y a donc 10 symétries fondamentalement différentes qu'un pavage de l'hexagone peut avoir:
Le nombre de pavages de diamant d’un sous-ensemble d’un réseau triangulaire peut être calculé comme déterminant ; mon approche initiale consistait donc à définir un déterminant pour chacune des symétries de l’hexagone, afin de calculer le nombre de pavages présentant au moins ces symétries. ; et ensuite utiliser l'inversion de Möbius dans l' algèbre d'incidence de leur poset (essentiellement une généralisation du principe d'inclusion-exclusion) pour calculer le nombre de pavages dont le groupe de symétrie correspond exactement à chacun des 10 cas. Cependant, certaines symétries ont des conditions de bord désagréables, ce qui m'a obligé à additionner de manière déterminante de nombreux déterminants. Heureusement, les valeurs obtenues pour
n < 10
m'a donné suffisamment de données pour pouvoir identifier les séquences pertinentes dans OEIS et reconstituer une forme fermée (pour une valeur de "fermé" qui permet des produits finis). Il y a un peu de discussion sur les séquences, et de références aux preuves, dans le résumé formel que j'ai préparé pour justifier les mises à jour de séquence OEIS.Une fois le double comptage pris en charge, il s'avère que quatre des dix valeurs s'annulent proprement. Il ne reste donc qu'à calculer les six autres valeurs, puis à effectuer une somme pondérée.
Ce code prend moins de 30 secondes
N=1000
sur ma machine.la source
C
introduction
Comme l'a commenté David Carraher, le moyen le plus simple d'analyser le pavage hexagonal semblait être de tirer parti de son isomorphisme avec le diagramme de Young tridimensionnel, essentiellement un carré x, y rempli de barres de hauteur entière dont la hauteur z doit rester la même ou augmenter. lorsque l’axe z est approché.
J'ai commencé avec un algorithme permettant de trouver les totaux, plus facile à adapter pour le comptage de symétrie que l'algorithme publié, basé sur un biais par rapport à l'un des trois axes cartésiens.
Algorithme
Je commence par remplir les cellules des plans x, y et z avec des 1, tandis que le reste de la zone contient des zéros. Une fois cela fait, je construis le motif couche par couche, chaque couche contenant les cellules qui ont une distance de manhattan 3D commune à l'origine. Une cellule ne peut contenir un 1 que si les trois cellules en dessous contiennent également un 1. Si l'une d'entre elles contient un 0, la cellule doit être un 0.
L'avantage de construire le motif de cette manière est que chaque couche est symétrique autour de la ligne x = y = z. Cela signifie que chaque couche peut être vérifiée indépendamment pour sa symétrie.
Vérification de la symétrie
Les symétries du solide sont les suivantes: Rotation 3 fois autour de la ligne x = y = z -> Rotation 3 fois autour du centre de l'hexagone; et 3 réflexions x autour des 3 plans contenant la ligne x = y = z et chacun des axes x, y, z -> réflexion autour des lignes passant par les angles hexagonaux.
Cela ne fait qu'ajouter une symétrie 6 fois. Pour obtenir la symétrie complète de l'hexagone, un autre type de symétrie doit être envisagé. Chaque solide (construit à partir de 1) a un solide complémentaire (construit à partir de 0). Lorsque N est impair, le solide complémentaire doit être différent du solide d'origine (car il ne leur est pas possible d'avoir le même nombre de cubes). Pourtant, lorsque le solide complémentaire est retourné, on constate que sa représentation 2D sous forme de mosaïque de diamant est identique (à l’exception d’une opération à symétrie double) au solide initial. Lorsque N est pair, il est possible que le solide soit auto-inverse.
Cela se voit dans les exemples pour N = 2 dans la question. Vu de gauche, le premier hexagone ressemble à un cube solide avec 8 petits cubes, tandis que le dernier hexagone ressemble à une coque vide avec 0 petit cube. Si vu de la droite, l'inverse est vrai. Les 3ème, 4ème et 5ème hexagones et les 16ème, 17ème et 18ème hexagones semblent contenir 2 ou 6 cubes et se complètent donc en 3 dimensions. Ils sont reliés les uns aux autres en 2 dimensions par une opération de symétrie 2 (rotation 2 fois, ou réflexion autour d'un axe passant par les arêtes de l'hexagone). D'autre part, les 9ème, 10ème, 11ème et 12ème hexagones montrent des motifs 3D qui sont leurs propres compléments et ont donc une symétrie plus élevée (ce sont donc les seuls modèles avec une multiplicité impaire).
Notez qu'avoir (N ^ 3) / 2 cubes est une condition nécessaire pour être auto-complémentaire, mais en général, il ne suffit pas si N> 2. Le résultat de tout cela est que pour les N impairs, les pavages apparaissent toujours par paires (N ^ 3) / 2 cubes doivent être soigneusement inspectés.
Code actuel (génère le total correct pour N = 1,2,3,5. Erreur comme indiqué pour N = 4.)
Sortie
Le programme génère une table de sortie de 8 entrées, conformément aux 8 symétries du solide. Le solide peut avoir l’une des 4 symétries suivantes (notation Schoenflies)
De plus, lorsque le solide a exactement la moitié des cellules avec 1 et l'autre avec 0, il est possible d'inverser tous les 1 et les 0, puis d'inverser les coordonnées par le centre de l'espace du cube. C'est ce que j'appelle l'auto-complément, mais un terme plus mathématique serait "antisymétrique par rapport à un centre d'inversion".
Cette opération de symétrie donne un axe de rotation de 2 fois dans le pavage hexagonal.
Les motifs qui ont cette symétrie sont listés dans une colonne séparée. Ils ne se produisent que lorsque N est pair.
Mon compte semble être légèrement en retrait pour N = 4. En discutant avec Peter Taylor, il apparaît que je ne détecte pas de pavages présentant uniquement une symétrie d'une ligne sur les arêtes de l'hexagone. Ceci est probablement dû au fait que je n'ai pas testé l'auto-complément (antisymétrie) pour des opérations autres que (inversion) x (identité.). ) peut découvrir les symétries manquantes. Je m'attendrais alors à ce que la première ligne des données pour N = 4 ressemble à ceci (16 de moins en c1 et 32 de plus en C1):
Cela alignerait les totaux sur la réponse de Peter et sur https://oeis.org/A066931/a066931.txt.
la sortie actuelle est la suivante.
Liste de tâches (mise à jour)
Fait plus ou moins
Fait, les résultats pour N impair correspondent aux données publiées.
Cela peut être fait en ajoutant une autre condition à l'appel récursif:
if(s1 && m<n*3-2)f(m + 1,e+d,s1)
Cela réduit le temps d'exécution pour N = 5 de 5 minutes à environ une seconde. En conséquence, la première ligne de la sortie devient le total des déchets (tout comme les totaux globaux), mais si le total est déjà connu d’OEIS, le nombre de pavages asymétriques peut être reconstitué, au moins pour les N. impairs.Mais même pour N, le nombre de solides asymétriques (selon les symétries c3v) qui s'auto-complétaient serait perdu. Dans ce cas, un programme séparé dédié aux solides avec exactement (N ** 3) / 2 cellules avec un 1 peut être utile. Avec cette option disponible (et en comptant correctement), il peut être possible d’essayer N = 6, mais l’exécution prendra beaucoup de temps.
Non fait, les économies devraient être marginales
Fait, mais semble avoir des omissions, voir N = 4.
Les économies ne devraient pas être aussi bonnes. Supprimer les figures asymétriques élimine la plupart de cela. La seule réflexion vérifiée est le plan passant par l’axe des y (x et z sont calculés ultérieurement en les multipliant par 3.). Peut-être que cela courrait presque deux fois plus vite si on n'en comptait qu'un.
Intéressant, mais il y a probablement d'autres questions sur le site à explorer.
la source