Obiecuję, że będzie to moje ostatnie wyzwanie dotyczące diamong tilings (przynajmniej przez jakiś czas). Z drugiej strony to wyzwanie nie ma nic wspólnego ze sztuką ASCII i nie jest też golfem kodowym, więc w rzeczywistości jest zupełnie inaczej.
Przypominamy, że każdy sześciokąt można nazwać trzema różnymi diamentami:
Ciekawym pytaniem jest, ile z tych nachyleń istnieje dla danego rozmiaru sześciokąta. Wygląda na to, że liczby te zostały dokładnie zbadane i można je znaleźć w OEIS A008793 .
Problem staje się jednak trudniejszy, jeśli zapytamy, ile istnieje przechyleń do momentu obrotu i odbicia . Na przykład dla długości boku N = 2 istnieje 20 następujących nachyleń:
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/\_\_\ /\_\_\ /\_\_\ /\_\_\ /_/\_\ /_/\_\ /\_\_\ /_/\_\ /_/\_\ /_/\_\
/\/\_\_\ /\/_/\_\ /\/_/_/\ /\/_/\_\ /\_\/\_\ /\_\/_/\ /\/_/_/\ /\_\/\_\ /\_\/_/\ /_/\/\_\
\/\/_/_/ \/\_\/_/ \/\_\_\/ \/_/\/_/ \/\_\/_/ \/\_\_\/ \/_/\_\/ \/_/\/_/ \/_/\_\/ \_\/\/_/
\/_/_/ \/_/_/ \/_/_/ \_\/_/ \/_/_/ \/_/_/ \_\/_/ \_\/_/ \_\/_/ \_\/_/
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/_/_/\ /\_\_\ /_/\_\ /_/_/\ /_/\_\ /_/\_\ /_/_/\ /_/_/\ /_/_/\ /_/_/\
/\_\_\/\ /\/_/_/\ /_/\/_/\ /\_\_\/\ /\_\/_/\ /_/\/_/\ /_/\_\/\ /\_\_\/\ /_/\_\/\ /_/_/\/\
\/\_\_\/ \/_/_/\/ \_\/\_\/ \/_/\_\/ \/_/_/\/ \_\/_/\/ \_\/\_\/ \/_/_/\/ \_\/_/\/ \_\_\/\/
\/_/_/ \_\_\/ \_\/_/ \_\/_/ \_\_\/ \_\_\/ \_\/_/ \_\_\/ \_\_\/ \_\_\/
Ale wiele z nich jest identycznych podczas rotacji i refleksji. Jeśli weźmiemy pod uwagę te symetrie, pozostanie tylko 6 różnych nachyleń:
____ ____ ____ ____ ____ ____
/\_\_\ /\_\_\ /\_\_\ /_/\_\ /_/\_\ /_/\_\
/\/\_\_\ /\/_/\_\ /\/_/_/\ /\_\/_/\ /\_\/_/\ /_/\/\_\
\/\/_/_/ \/\_\/_/ \/\_\_\/ \/\_\_\/ \/_/\_\/ \_\/\/_/
\/_/_/ \/_/_/ \/_/_/ \/_/_/ \_\/_/ \_\/_/
2 2 6 6 1 3
gdzie liczby wskazują krotność każdego kafelka. Zauważ, że w przypadku większych sześciokątów istnieją również tile z krotnością 4 i 12.
Wygląda na to, że liczba przechyleń do symetrii została zbadana mniej dokładnie. Wpis AIS66931 OEIS wymienia tylko pięć terminów:
1, 1, 6, 113, 20174
gdzie pierwszy termin dotyczy długości boku, N = 0
a ostatni termin długości boku N = 4
.
Jestem pewien, że możemy to zrobić lepiej!
Twoim zadaniem jest obliczenie liczby przechyleń dla danej długości boku.
To jest najszybszy kod . Twój wynik będzie najwyższą długością boku, N
dla której Twój kod wygeneruje poprawny wynik w ciągu 30 minut na mojej maszynie. W przypadku remisu, będę zaakceptować przedstawienie która produkuje wynik na które N
najszybciej.
Jak zwykle nie możesz zakodować wyników, które już znasz, aby wygrać remis. Algorytm, który rozwiązuje, N = 3
powinien być identyczny z tym, który rozwiązuje N = 5
.
Twoje zgłoszenie nie może zajmować więcej niż 4 GB pamięci. Dam trochę swobody, jeśli działasz blisko tego limitu, ale jeśli konsekwentnie przekraczasz ten limit lub jeśli znacznie przekroczysz ten limit, nie liczę tego N
za twoje poddanie się.
Przetestuję wszystkie zgłoszenia na moim komputerze z systemem Windows 8, więc upewnij się, że wybrany język jest swobodnie dostępny w systemie Windows. Jedynym wyjątkiem jest Mathematica (ponieważ akurat mam licencję). Dołącz instrukcje dotyczące sposobu kompilowania / uruchamiania kodu.
Oczywiście możesz swobodnie obliczyć więcej terminów w swoim czasie (dla nauki i dla innych, aby porównać ich liczby), ale wynik Twojej odpowiedzi zostanie określony w ciągu tych 30 minut.
źródło
N = 6
daje wynik większy niż 10 ^ 12, niekonstruktywne rozwiązanie jest prawie na pewno konieczne, aby dojść tak daleko.Odpowiedzi:
Algebra, teoria grafów, inwersja Möbiusa, badania i Java
Grupa symetrii sześciokąta jest dwuścienną grupą rzędu 12 i jest generowana przez obrót o 60 stopni i odbicie lustrzane na średnicy. Ma 16 podgrup, ale niektóre z nich są nietrywialnymi grupami koniugacji (te, które mają tylko odbicia, mają 3 możliwości wyboru osi), więc istnieje 10 zasadniczo różnych symetrii, które może mieć kafelek sześciokąta:
Liczbę diamentowych pochyłości podzbioru trójkątnej sieci można obliczyć jako wyznacznik , więc moim początkowym podejściem było ustalenie jednego wyznacznika dla każdej z symetrii sześciokąta, aby obliczyć liczbę nachyleń, które mają co najmniej te symetrie ; a następnie użyj inwersji Möbiusa w algebrze padania ich zbioru (w zasadzie uogólnienie zasady włączenia-wykluczenia), aby obliczyć liczbę przechyleń, których grupą symetrii jest dokładnie każdy z 10 przypadków. Jednak niektóre symetrie mają nieprzyjemne warunki brzegowe, więc musiałem zsumować wykładniczo wiele wyznaczników. Na szczęście wartości uzyskane dla
n < 10
dało mi wystarczającą ilość danych, aby móc zidentyfikować odpowiednie sekwencje w OEIS i złożyć razem zamkniętą formę (dla pewnej wartości „zamkniętej”, która dopuszcza skończone produkty). Trochę dyskusji na temat sekwencji i odniesień do dowodów, w formalnym piśmie, które przygotowałem, aby uzasadnić aktualizacje sekwencji OEIS.Po załatwieniu podwójnego liczenia okazuje się, że cztery z dziesięciu wartości starannie się anulują, więc musimy tylko obliczyć pozostałe sześć, a następnie wykonać ważoną sumę.
Kod ten trwa mniej niż 30 sekund
N=1000
na moim komputerze.źródło
do
Wprowadzenie
Jak skomentował David Carraher, najprostszym sposobem analizy płytki sześciokątnej wydaje się być wykorzystanie jej izomorfizmu z trójwymiarowym diagramem Younga, zasadniczo kwadratem x, y wypełnionym całkowitymi słupkami wysokości, których wysokości muszą pozostać takie same lub wzrosnąć w miarę zbliżania się do osi Z.
Zacząłem od algorytmu znajdowania sum, który jest bardziej podatny na dostosowanie do zliczania symetrii niż opublikowany algorytm, który opiera się na odchyleniu do jednej z trzech osi kartezjańskich.
Algorytm
Zaczynam od wypełnienia komórek płaszczyzn x, y i z 1, podczas gdy reszta obszaru zawiera zera. Gdy to zrobisz, buduję wzór warstwa po warstwie, przy czym każda warstwa zawiera komórki, które mają wspólną odległość 3D manhattan od początku. Komórka może zawierać tylko 1, jeśli trzy komórki poniżej również zawierają 1. jeśli którakolwiek z nich zawiera 0, wówczas komórka musi być 0.
Zaletą budowania wzoru w ten sposób jest to, że każda warstwa jest symetryczna względem linii x = y = z. Oznacza to, że każdą warstwę można sprawdzić niezależnie pod kątem symetrii.
Sprawdzanie symetrii
Symetrie bryły są następujące: 3-krotny obrót wokół linii x = y = z -> 3-krotny obrót wokół środka sześciokąta; oraz 3 x odbicia o 3 płaszczyznach zawierających linię x = y = z i każdą z osi x, y, z -> odbicie o liniach przechodzących przez narożniki sześciokąta.
Daje to tylko 6-krotną symetrię. Aby uzyskać pełną symetrię sześciokąta, należy rozważyć inny rodzaj symetrii. Każda bryła (zbudowana z 1) ma komplementarną bryłę (zbudowana z 0). Gdy N jest nieparzyste, bryła uzupełniająca musi różnić się od oryginalnej bryły (ponieważ nie jest możliwe, aby miały taką samą liczbę kostek). Jednak gdy komplementarna bryła zostanie obrócona, okaże się, że jej reprezentacja 2D jako płytki diamentowej jest identyczna (z wyjątkiem 2-krotnej operacji symetrii) z oryginalną bryłą. Tam, gdzie N jest parzyste, możliwe jest, że ciało stałe jest samo-odwrotne.
Można to zobaczyć w przykładach dla N = 2 w pytaniu. Patrząc od lewej strony, pierwszy sześciokąt wygląda jak solidny sześcian z 8 małymi kostkami, podczas gdy ostatni sześciokąt wygląda jak pusta skorupa z 0 małymi kostkami. Patrząc z prawej strony, sytuacja jest odwrotna. Sześciokąty 3, 4 i 5 oraz 16, 17 i 18 sześciokąty wyglądają tak, jakby zawierały 2 lub 6 kostek, a zatem uzupełniają się w 3 wymiarach. Są one powiązane ze sobą w 2 wymiarach za pomocą 2-krotnej operacji symetrii (2-krotny obrót lub odbicie wokół osi przez krawędzie sześciokąta). Z drugiej strony, 9, 10, 11 i 12 sześciokąty pokazują wzory 3D, które są ich własnymi uzupełnieniami, a zatem mają wyższą symetrię (dlatego są to jedyne wzorce o nieparzystej krotności).
Zauważ, że posiadanie (N ^ 3) / 2 kostek jest warunkiem koniecznym do samouzupełniania się, ale ogólnie nie jest warunkiem wystarczającym, jeśli N> 2. Wynikiem tego wszystkiego jest to, że w przypadku nieparzystego N przechylenie zawsze występuje w parach (N ^ 3) / 2 kostki należy dokładnie sprawdzić.
Bieżący kod (generuje właściwą sumę dla N = 1,2,3,5. Błąd, jak omówiono dla N = 4).
Wynik
Program generuje tabelę wyników 8 wpisów, zgodnie z 8 symetriami bryły. Bryła może mieć dowolną z 4 następujących symetrii (notacja Schoenfliesa)
Dodatkowo, gdy bryła ma dokładnie połowę komórek z jedynkami i połowę z zerami, istnieje możliwość odwrócenia wszystkich jedynek i zer, a następnie odwrócenia współrzędnych przez środek przestrzeni sześcianu. To właśnie nazywam samouzupełnianiem, ale bardziej matematyczny termin byłby „antysymetryczny w stosunku do centrum inwersji”.
Ta operacja symetrii daje 2-krotną oś obrotu w kafelku sześciokąta.
Wzory o tej symetrii są wymienione w osobnej kolumnie. Występują tylko tam, gdzie N jest parzyste.
Moje obliczenie wydaje się być nieco wyłączone dla N = 4. W dyskusji z Peterem Taylorem wydaje się, że nie wykrywam przechyłek, które mają jedynie symetrię linii przechodzącej przez krawędzie sześciokąta. Jest tak prawdopodobnie dlatego, że nie testowałem samokompletu (antysymetrii) dla operacji innych niż (inwersja) x (tożsamość). Testowanie samokompletu dla operacji (inwersja) x (odbicie) i (inwersja) x (3-krotny obrót ) może odkryć brakujące symetrie. Spodziewałbym się wtedy, że pierwsza linia danych dla N = 4 będzie wyglądać tak (16 mniej w C1 i 32 więcej w C1):
Dzięki temu sumy będą zgodne z odpowiedzią Petera i https://oeis.org/A066931/a066931.txt
prąd wyjściowy jest następujący.
Lista spraw (zaktualizowana)
Zrobione mniej więcej
Gotowe, wyniki dla nieparzystego N zgadzają się z opublikowanymi danymi
Można to zrobić, dodając kolejny warunek do wywołania rekurencji:
if(s1 && m<n*3-2)f(m + 1,e+d,s1)
Skraca czas działania dla N = 5 z 5 minut do około sekundy. W rezultacie pierwszy wiersz wyniku staje się całkowitym śmieciem (podobnie jak sumy całkowite), ale jeśli suma jest już znana z OEIS, liczbę asymetrycznych przechyleń można odtworzyć, przynajmniej dla nieparzystej N.Ale nawet dla N liczba asymetrycznych (zgodnie z symetriami c3v) ciał stałych, które są samouzupełnianiem, zostałaby utracona. W tym przypadku przydatny może być osobny program dedykowany ciałom stałym z dokładnie (N ** 3) / 2 komórkami z 1. Przy tym dostępnym (i liczącym poprawnie) wypróbowanie N = 6 może być możliwe, ale uruchomienie zajmie dużo czasu.
Nie zrobione, oczekiwane oszczędności będą marginalne
Zrobione, ale wydaje się, że występują pominięcia, patrz N = 4.
Oczekuje się, że oszczędności nie będą tak duże. Tłumienie asymetrycznych liczb eliminuje większość tego. Jedynym sprawdzanym odbiciem jest płaszczyzna przechodząca przez oś y (xiz obliczane są później przez pomnożenie przez 3). Liczby z tylko symetrią obrotową są liczone w obu postaciach enancjomerycznych. Być może działałby prawie dwa razy szybciej, gdyby tylko jeden został policzony.
Ciekawe, ale prawdopodobnie na stronie są inne pytania do zbadania.
źródło