C
Einführung
Wie David Carraher bemerkte, schien die einfachste Möglichkeit, die Sechseckkacheln zu analysieren, darin zu bestehen, ihren Isomorphismus mit dem dreidimensionalen jungen Diagramm auszunutzen, das im Wesentlichen ein XY-Quadrat ist, das mit ganzzahligen Höhenbalken gefüllt ist, deren Z-Höhen gleich bleiben oder zunehmen müssen wenn die z-Achse angefahren wird.
Ich habe mit einem Algorithmus zum Ermitteln der Summen begonnen, der sich besser für die Symmetriezählung eignet als der veröffentlichte Algorithmus, der auf einer Abweichung von einer der drei kartesischen Achsen basiert.
Algorithmus
Ich beginne damit, die Zellen der x-, y- und z-Ebene mit Einsen zu füllen, während der Rest des Bereichs Nullen enthält. Sobald dies erledigt ist, baue ich das Muster Schicht für Schicht auf, wobei jede Schicht die Zellen enthält, die einen gemeinsamen 3D-Manhattan-Abstand vom Ursprung haben. Eine Zelle kann nur eine 1 enthalten, wenn die drei darunter liegenden Zellen auch eine 1 enthalten. Wenn eine davon eine 0 enthält, muss die Zelle eine 0 sein.
Der Vorteil des Aufbaus des Musters auf diese Weise besteht darin, dass jede Schicht symmetrisch zur x = y = z-Linie ist. Dies bedeutet, dass jede Schicht unabhängig auf Symmetrie überprüft werden kann.
Symmetrieprüfung
Die Symmetrien des Festkörpers sind wie folgt: Dreifache Drehung um die x = y = z-Linie -> Dreifache Drehung um das Sechseckzentrum; und 3 x Reflexionen über die 3 Ebenen, die die Linie x = y = z enthalten, und jede der Achsen x, y, z -> Reflexion über die Linien durch die Sechseckecken.
Dies ergibt nur eine 6-fache Symmetrie. Um die volle Symmetrie des Sechsecks zu erhalten, muss eine andere Art von Symmetrie berücksichtigt werden. Jeder Körper (aufgebaut aus Einsen) hat einen komplementären Körper (aufgebaut aus Nullen). Wenn N ungerade ist, muss sich der komplementäre Festkörper vom ursprünglichen Festkörper unterscheiden (da nicht die gleiche Anzahl von Würfeln möglich ist). Wenn der komplementäre Volumenkörper jedoch gedreht wird, wird festgestellt, dass seine 2D-Darstellung als Diamantkachel (mit Ausnahme einer zweifachen Symmetrieoperation) mit dem ursprünglichen Volumenkörper identisch ist. Wenn N gerade ist, ist es möglich, dass der Festkörper selbstinvers ist.
Dies geht aus den Beispielen für N = 2 in der Frage hervor. Von links betrachtet sieht das erste Sechseck wie ein fester Würfel mit 8 kleinen Würfeln aus, während das letzte Sechseck wie eine leere Hülle mit 0 kleinen Würfeln aussieht. Von rechts gesehen ist das Gegenteil der Fall. Das 3., 4. und 5. Sechseck sowie das 16., 17. und 18. Sechseck scheinen entweder 2 oder 6 Würfel zu enthalten und ergänzen sich daher in 3 Dimensionen. Sie sind in 2 Dimensionen durch eine 2-fache Symmetrieoperation (2-fache Drehung oder Reflexion um eine Achse durch die Sechskantkanten) miteinander verbunden. Andererseits zeigen das 9., 10., 11. und 12. Sechseck 3D-Muster, die sind ihre eigenen Komplemente und haben daher eine höhere Symmetrie (dies sind daher die einzigen Muster mit ungerader Multiplizität).
Es ist zu beachten, dass (N ^ 3) / 2 Würfel eine notwendige Bedingung sind, um sich selbst zu ergänzen, aber im Allgemeinen ist es keine ausreichende Bedingung, wenn N> 2 ist. All dies hat zur Folge, dass bei ungeraden N die Kacheln immer paarweise auftreten (N ^ 3) / 2 Würfel müssen sorgfältig geprüft werden.
Aktueller Code (generiert die richtige Summe für N = 1,2,3,5. Fehler wie für N = 4 beschrieben.)
int n; //side length
char t[11][11][11]; //grid sized for N up to 10
int q[29][192], r[29]; //tables of coordinates for up to 10*3-2=28 layers
int c[9]; //counts arrangements found by symmetry class. c[8] contains total.
//recursive layer counting function. m= manhattan distance, e= number of cells in previous layers, s=symmetry class.
void f(int m,int e,int s){
int u[64], v[64], w[64]; //shortlists for x,y,z coordinates of cells in this layer
int j=0;
int x,y,z;
for (int i=r[m]*3; i; i-=3){
// get a set of coordinates for a cell in the current layer.
x=q[m][i-3]; y= q[m][i-2]; z= q[m][i-1];
// if the three cells in the previous layer are filled, add it to the shortlist u[],v[],w[]. j indicates the length of the shortlist.
if (t[x][y][z-1] && t[x][y-1][z] && t[x-1][y][z]) u[j]=x, v[j]=y, w[j++]=z ;
}
// there are 1<<j possible arrangements for this layer.
for (int i = 1 << j; i--;) {
int d = 0;
// for each value of i, set the 1's bits of t[] to the 1's bits of i. Count the number of 1's into d as we go.
for (int k = j; k--;) d+=(t[u[k]][v[k]][w[k]]=(i>>k)&1);
// we have no interest in i=0 as it is the empty layer and therefore the same as the previous recursion step.
// Still we loop through it to ensure t[] is properly cleared.
if(i>0){
int s1=s; //local copy of symmetry class. 1's bit for 3 fold rotation, 2's bit for reflection in y axis.
int sc=0; //symmetry of self-complement.
//if previous layers were symmetrical, test if the symmetry has been reduced by the current layer
if (s1) for (int k = j; k--;) s1 &= (t[u[k]][v[k]][w[k]]==t[w[k]][u[k]][v[k]]) | (t[u[k]][v[k]][w[k]]==t[w[k]][v[k]][u[k]])<<1;
//if exactly half the cells are filled, test for self complement
if ((e+d)*2==n*n*n){
sc=1;
for(int A=1; A<=(n>>1); A++)for(int B=1; B<=n; B++)for(int C=1; C<=n; C++) sc&=t[A][B][C]^t[n+1-A][n+1-B][n+1-C];
}
//increment counters for total and for symmetry class.
c[8]++; c[s1+(sc<<2)]++;
//uncomment for graphic display of each block stacking with metadata. not recommended for n>3.
//printf("m=%d j=%d i=%d c1=%d-2*%d=%d c3=%d cy=%d(cs=%d) c3v=%d ctot=%d\n",m,j,i,c[0],c[2],c[0]-2*c[2],c[1],c[2],c[2]*3,c[3],c[8]);
//printf("m=%d j=%d i=%d C1=%d-2*%d=%d C3=%d CY=%d(CS=%d) C3V=%d ctot=%d\n",m,j,i,c[4],c[6],c[4]-2*c[6],c[5],c[6],c[6]*3,c[7],c[8]);
//for (int A = 0; A<4; A++, puts(""))for (int B = 0; B<4; B++, printf(" "))for (int C = 0; C<4; C++) printf("%c",34+t[A][B][C]);
//recurse to next level.
if(m<n*3-2)f(m + 1,e+d,s1);
}
}
}
main()
{
scanf("%d",&n);
int x,y,z;
// Fill x,y and z planes of t[] with 1's
for (int a=0; a<9; a++) for (int b=0; b<9; b++) t[a][b][0]= t[0][a][b]= t[b][0][a]= 1;
// Build table of coordinates for each manhattan layer
for (int m=1; m < n*3-1; m++){
printf("m=%d : ",m);
int j=0;
for (x = 1; x <= n; x++) for (y = 1; y <= n; y++) {
z=m+2-x-y;
if (z>0 && z <= n) q[m][j++] = x, q[m][j++] = y, q[m][j++]=z, printf(" %d%d%d ",x,y,z);
r[m]=j/3;
}
printf(" : r=%d\n",r[m]);
}
// Set count to 1 representing the empty box (symmetry c3v)
c[8]=1; c[3]=1;
// Start searching at f=1, with 0 cells occupied and symmetry 3=c3v
f(1,0,3);
// c[2 and 6] only contain reflections in y axis, therefore must be multiplied by 3.
// Similarly the reflections in x and z axis must be subtracted from c[0] and c[4].
c[0]-=c[2]*2; c[2]*=3;
c[4]-=c[6]*2; c[6]*=3;
int cr[9];cr[8]=0;
printf("non self-complement self-complement\n");
printf("c1 %9d/12=%9d C1 %9d/6=%9d\n", c[0], cr[0]=c[0]/12, c[4], cr[4]=c[4]/6);
if(cr[0]*12!=c[0])puts("c1 division error");if(cr[4]*6!=c[4])puts("C1 division error");
printf("c3 %9d/4 =%9d C3 %9d/2=%9d\n", c[1], cr[1]=c[1]/4, c[5], cr[5]=c[5]/2);
if(cr[1]*4!=c[1])puts("c3 division error");if(cr[5]*2!=c[5])puts("C3 division error");
printf("cs %9d/6 =%9d CS %9d/3=%9d\n", c[2], cr[2]=c[2]/6, c[6], cr[6]=c[6]/3);
if(cr[2]*6!=c[2])puts("cs division error");if(cr[6]*3!=c[6])puts("CS division error");
printf("c3v %9d/2 =%9d C3V %9d/1=%9d\n", c[3], cr[3]=c[3]/2, c[7], cr[7]=c[7]);
if(cr[3]*2!=c[3])puts("c3v division error");
for(int i=8;i--;)cr[8]+=cr[i];
printf("total =%d unique =%d",c[8],cr[8]);
}
Ausgabe
Das Programm generiert eine Ausgabetabelle mit 8 Einträgen entsprechend den 8 Symmetrien des Volumenkörpers. Der Körper kann eine der folgenden 4 Symmetrien haben (Schönflies-Notation)
c1: no symmetry
c3: 3-fold axis of rotation (produces 3-fold axis of rotation in hexagon tiling)
cs: plane of reflection (produces line of reflection in hexagon tiling)
c3v both of the above (produces 3-fold axis of rotation and three lines of reflection through the hexagon corners)
Wenn der Körper genau die Hälfte der Zellen mit Einsen und die Hälfte mit Nullen hat, besteht außerdem die Möglichkeit, alle Einsen und Nullen zu spiegeln und dann die Koordinaten durch die Mitte des Würfelraums zu invertieren. Das nenne ich Selbstkomplement, aber ein mathematischerer Begriff wäre "antisymmetrisch in Bezug auf ein Inversionszentrum".
Diese Symmetrieoperation ergibt eine zweifache Rotationsachse in der Sechskantfliese.
Muster mit dieser Symmetrie werden in einer separaten Spalte aufgelistet. Sie treten nur dort auf, wo N gerade ist.
Meine Zählung scheint für N = 4 leicht abzulaufen. In der Diskussion mit Peter Taylor scheint es, als würde ich keine Fliesen erkennen, die nur eine Symmetrie einer Linie durch die Sechskantkanten haben. Dies liegt vermutlich daran, dass ich nicht auf Selbstkomplement (Antisymmetrie) für andere Operationen als (Inversion) x (Identität) getestet habe ) kann die fehlenden Symmetrien aufdecken. Ich würde dann erwarten, dass die erste Zeile der Daten für N = 4 so aussieht (16 weniger in c1 und 32 mehr in C1):
c1 224064/12=18672 C1 534/6=89
Dies würde die Gesamtsummen mit Peters Antwort und https://oeis.org/A066931/a066931.txt in Einklang bringen
Stromausgang ist wie folgt.
N=1
non self-complement self-complement
c1 0/12= 0 C1 0/6= 0
c3 0/4 = 0 C3 0/2= 0
cs 0/6 = 0 CS 0/3= 0
c3v 2/2 = 1 C3V 0/1= 0
total =2 unique =1
non self-complement self-complement
N=2
c1 0/12= 0 C1 0/6= 0
c3 0/4 = 0 C3 0/2= 0
cs 12/6 = 2 CS 3/3= 1
c3v 4/2 = 2 C3V 1/1= 1
total =20 unique =6
N=3
non self-complement self-complement
c1 672/12=56 C1 0/6= 0
c3 4/4 = 1 C3 0/2= 0
cs 288/6 =48 CS 0/3= 0
c3v 16/2 = 8 C3V 0/1= 0
total =980 unique =113
N=4 (errors as discussed)
non self-complement self-complement
c1 224256/12=18688 C1 342/6=57
c3 64/4 =16 C3 2/2= 1
cs 8064/6 =1344 CS 54/3=18
c3v 64/2 =32 C3V 2/1= 2
total =232848 unique =20158
N=5
non self-complement self-complement
c1 266774112/12=22231176 C1 0/6= 0
c3 1100/4 =275 C3 0/2= 0
cs 451968/6 =75328 CS 0/3= 0
c3v 352/2 =176 C3V 0/1= 0
total =267227532 unique =22306955
Aufgabenliste (aktualisiert)
Aktuellen Code aufräumen.
Fertig, mehr oder weniger
Implementieren Sie die Symmetrieprüfung für die aktuelle Ebene und übergeben Sie einen Parameter für die Symmetrie der vorherigen Ebene (es ist nicht sinnvoll zu prüfen, ob die letzte Ebene asymmetrisch war).
Fertig, Ergebnisse für ungerade N stimmen mit veröffentlichten Daten überein
Hinzufügen einer Option zum Unterdrücken des Zählens asymmetrischer Zahlen (sollte viel schneller laufen)
Dies kann erreicht werden, indem dem Rekursionsaufruf eine weitere Bedingung hinzugefügt wird: if(s1 && m<n*3-2)f(m + 1,e+d,s1)
Die Laufzeit für N = 5 wird von 5 Minuten auf etwa eine Sekunde verringert. Infolgedessen wird die erste Zeile der Ausgabe zu Gesamtmüll (wie auch die Gesamtsummen), aber wenn die Gesamtsumme bereits aus OEIS bekannt ist, kann die Anzahl der asymmetrischen Kacheln zumindest für ungerade N wiederhergestellt werden.
Aber für gerade N würde die Anzahl der asymmetrischen (gemäß c3v-Symmetrien) Festkörper, die sich selbst ergänzen, verloren gehen. In diesem Fall kann ein separates Programm für Volumenkörper mit genau (N ** 3) / 2 Zellen mit einer 1 nützlich sein. Wenn dies verfügbar ist (und korrekt gezählt wird), kann möglicherweise N = 6 ausprobiert werden, die Ausführung dauert jedoch sehr lange.
Implementieren Sie das Zählen von Zellen, um die Suche auf bis zu (N ^ 3) / 2 Würfel zu reduzieren.
Nicht erledigt, Einsparungen werden marginal erwartet
Implementieren Sie die Symmetrieprüfung (komplementärer Körper) für Muster, die genau (N ^ 3) / 2 Würfel enthalten.
Fertig, scheint aber Auslassungen zu haben, siehe N = 4.
Finden Sie einen Weg, die lexikalisch niedrigste Zahl aus einer asymmetrischen Zahl zu wählen.
Es wird nicht erwartet, dass die Einsparungen so groß sind. Das Unterdrücken von asymmetrischen Figuren beseitigt das meiste davon. Die einzige überprüfte Reflexion ist die Ebene durch die y-Achse (x und z werden später durch Multiplikation mit 3 berechnet.) Figuren mit nur Rotationssymmetrie werden in ihren beiden enantiomeren Formen gezählt. Vielleicht würde es fast doppelt so schnell laufen, wenn nur einer gezählt würde.
Um dies zu vereinfachen, verbessern Sie möglicherweise die Art und Weise, wie die Koordinaten in jeder Ebene aufgelistet werden (sie bilden entartete Gruppen von 6 oder 3, wobei sich möglicherweise eine Gruppe von 1 genau in der Mitte der Ebene befindet).
Interessant, aber wahrscheinlich gibt es noch andere Fragen auf der Website zu erkunden.
N = 6
einer Ausgabe von mehr als 10 ^ 12 mit ziemlicher Sicherheit eine nicht konstruktive Lösung erforderlich ist, um dieses Ziel zu erreichen.