विस्तार OEIS: काउंटिंग डायमंड टीलिंग्स


46

मैं वादा करता हूं, यह डायमॉन्ग झुकाव (थोड़ी देर के लिए, वैसे भी) के बारे में मेरी आखिरी चुनौती होगी। चमकदार पक्ष पर, इस चुनौती का ASCII कला से कोई लेना-देना नहीं है, और कोड गोल्फ भी नहीं है, इसलिए यह वास्तव में पूरी तरह से अलग है।

तो बस एक अनुस्मारक के रूप में, हर षट्भुज को तीन अलग-अलग हीरे के साथ शीर्षक दिया जा सकता है:

एक दिलचस्प सवाल यह है कि दिए गए षट्भुज आकार के लिए इनमें से कितने झुकाव मौजूद हैं। ऐसा लगता है कि इन नंबरों का गहन अध्ययन किया गया है और इन्हें OEIS A008793 में पाया जा सकता है ।

हालाँकि, समस्या तब और विकट हो जाती है जब हम पूछते हैं कि घुमाव और परावर्तन के लिए कितने झुकाव मौजूद हैं । उदाहरण के लिए, साइड की लंबाई N = 2 के लिए, निम्नलिखित 20 झुकाव मौजूद हैं:

   ____     ____     ____     ____     ____     ____     ____     ____     ____     ____  
  /\_\_\   /\_\_\   /\_\_\   /\_\_\   /_/\_\   /_/\_\   /\_\_\   /_/\_\   /_/\_\   /_/\_\ 
 /\/\_\_\ /\/_/\_\ /\/_/_/\ /\/_/\_\ /\_\/\_\ /\_\/_/\ /\/_/_/\ /\_\/\_\ /\_\/_/\ /_/\/\_\
 \/\/_/_/ \/\_\/_/ \/\_\_\/ \/_/\/_/ \/\_\/_/ \/\_\_\/ \/_/\_\/ \/_/\/_/ \/_/\_\/ \_\/\/_/
  \/_/_/   \/_/_/   \/_/_/   \_\/_/   \/_/_/   \/_/_/   \_\/_/   \_\/_/   \_\/_/   \_\/_/ 
   ____     ____     ____     ____     ____     ____     ____     ____     ____     ____  
  /_/_/\   /\_\_\   /_/\_\   /_/_/\   /_/\_\   /_/\_\   /_/_/\   /_/_/\   /_/_/\   /_/_/\ 
 /\_\_\/\ /\/_/_/\ /_/\/_/\ /\_\_\/\ /\_\/_/\ /_/\/_/\ /_/\_\/\ /\_\_\/\ /_/\_\/\ /_/_/\/\
 \/\_\_\/ \/_/_/\/ \_\/\_\/ \/_/\_\/ \/_/_/\/ \_\/_/\/ \_\/\_\/ \/_/_/\/ \_\/_/\/ \_\_\/\/
  \/_/_/   \_\_\/   \_\/_/   \_\/_/   \_\_\/   \_\_\/   \_\/_/   \_\_\/   \_\_\/   \_\_\/ 

लेकिन इनमें से कई रोटेशन और प्रतिबिंब के तहत समान हैं। यदि हम इन समरूपताओं को ध्यान में रखते हैं, तो केवल 6 अलग-अलग झुकाव ही रहेंगे:

   ____     ____     ____     ____     ____     ____  
  /\_\_\   /\_\_\   /\_\_\   /_/\_\   /_/\_\   /_/\_\ 
 /\/\_\_\ /\/_/\_\ /\/_/_/\ /\_\/_/\ /\_\/_/\ /_/\/\_\
 \/\/_/_/ \/\_\/_/ \/\_\_\/ \/\_\_\/ \/_/\_\/ \_\/\/_/
  \/_/_/   \/_/_/   \/_/_/   \/_/_/   \_\/_/   \_\/_/ 

   2        2        6        6        1        3

जहाँ संख्याएँ प्रत्येक टाइलिंग की बहुलता को दर्शाती हैं। ध्यान दें कि बड़े हेक्सागोन्स के लिए भी गुणन 4 और 12 के साथ झुकाव हैं।

ऐसा प्रतीत होता है कि समरूपता तक झुकाव की संख्या का कम अध्ययन किया गया है। OEIS प्रविष्टि A066931 केवल पाँच शब्दों को सूचीबद्ध करती है:

1, 1, 6, 113, 20174

जहां पहला शब्द साइड की लंबाई के लिए है N = 0और अंतिम अवधि साइड की लंबाई के लिए है N = 4

मुझे यकीन है कि हम इससे बेहतर कर सकते हैं!

आपका कार्य किसी दिए गए पक्ष की लंबाई के लिए झुकाव की संख्या की गणना करना है।

यह । आपका स्कोर उच्चतम पक्ष-लंबाई होगा Nजिसके लिए आपका कोड मेरी मशीन पर 30 मिनट के भीतर सही परिणाम देता है । एक टाई के मामले में, मैं उस सबमिशन को स्वीकार करूंगा जो उस N सबसे तेज परिणाम का उत्पादन करता है ।

हमेशा की तरह, आपको टाई-ब्रेकर जीतने के लिए पहले से ही ज्ञात परिणामों को हार्डकोड नहीं करना चाहिए। हल करने वाला एल्गोरिदम उसी के N = 3समान होना चाहिए जो हल करता है N = 5

आपके सबमिशन में 4GB से अधिक मेमोरी का उपयोग नहीं करना चाहिए। यदि आप उस सीमा के करीब काम कर रहे हैं, तो मैं इस पर कुछ छूट दूंगा, लेकिन यदि आप लगातार उस सीमा से ऊपर हैं, या यदि आप इसके परे महत्वपूर्ण रूप से स्पाइक करते हैं, तो मैं Nआपके जमा करने के लिए गिनती नहीं करूंगा ।

मैं अपने विंडोज 8 मशीन पर सभी सबमिशन का परीक्षण करूंगा, इसलिए सुनिश्चित करें कि आपकी पसंद की भाषा विंडोज पर स्वतंत्र रूप से उपलब्ध है। इसका एकमात्र अपवाद गणितज्ञ है (क्योंकि मेरे पास इसके लिए लाइसेंस होना है)। कृपया अपना कोड संकलित / चलाने के लिए निर्देश शामिल करें।

बेशक, अपने समय में (विज्ञान के लिए, और दूसरों के खिलाफ अपनी संख्या की जांच करने के लिए) अधिक शब्दों की गणना करने के लिए स्वतंत्र महसूस करें, लेकिन आपके उत्तर का स्कोर उन 30 मिनटों में निर्धारित किया जाएगा।


4
ध्यान दें कि चूंकि N = 610 ^ 12 से अधिक का आउटपुट देता है, इसलिए इसे प्राप्त करने के लिए एक गैर-रचनात्मक समाधान लगभग निश्चित रूप से आवश्यक है।
पीटर टेलर

1
@PeterTaylor मुझे उम्मीद थी कि सुधार के लिए अधिक जगह की अनुमति होगी। हो सकता है कि सरल रचनात्मक जवाबों के एक जोड़े ने पहले समस्या के बारे में अधिक जानकारी हासिल करने के लिए N = 5 किया हो, और फिर संभावित संकर दृष्टिकोण जो सभी झुकावों का निर्माण करने की आवश्यकता नहीं है, लेकिन कुछ निर्मित लोगों से कुल संख्या को एक्सट्रपलेट कर सकते हैं ... और फिर शायद कुछ विश्लेषणात्मक अगर हम वास्तव में भाग्यशाली हैं। :)
मार्टिन एंडर

2
स्पष्ट रूप से बताते हुए, मुझे ऐसा लगता है कि प्रत्येक ऐसी टाइलिंग यूनिट क्यूब्स के एक संयोजन के प्रक्षेपण से मेल खाती है जैसा कि दूर के बिंदु से देखा जाता है, उदाहरण के लिए, (100, -100,100)। मुझे लगता है कि यह झुकाव निर्माण का बोझ हल्का करता है।
डेविड

1
@DavidCarraher वास्तव में। विशेष रूप से, यूनिट क्यूब्स की ऐसी व्यवस्था एक 3D यंग आरेख है । (शायद जो किसी की मदद करता है।)
मार्टिन एंडर

@DavidCarraher यदि आप बड़े षट्भुज पर पर्याप्त कठोर दिखते हैं, तो आप देखेंगे कि इसे एक युवा चित्र के रूप में व्याख्या करने के 2 अलग-अलग तरीके हैं। स्पष्ट तरीका (कम से कम मेरे लिए) शीर्ष पर एक सपाट क्षेत्र देखना है और ऊपरी बाएँ कोने से गायब 2x2x1 क्यूबॉयड के साथ छोड़ दिया गया है। लेकिन इसे देखने का एक और तरीका है: उस क्षेत्र में एक खाली क्षेत्र, जिसमें 2x2x1 क्यूबॉइड है। 60 डिग्री तक झुकना मदद कर सकता है। यह मेरी आँखों को चोट पहुँचाता है लेकिन मुझे लगता है कि दो युवा चित्र एक साथ फिट होते हैं, संभवतः उनमें से एक का प्रतिबिंब। OEIS A008793 अपने शब्द के साथ बहुत सावधान है: " विमान विभाजन की संख्या जिसका युवा चित्र ..."
स्तर नदी सेंट

जवाबों:


80

बीजगणित, ग्राफ सिद्धांत, मोबियस उलटा, अनुसंधान और जावा

षट्भुज का समरूपता समूह क्रम 12 का विकर्ण समूह है, और एक 60 डिग्री रोटेशन और एक व्यास में दर्पण दर्पण द्वारा उत्पन्न होता है। इसके 16 उपसमूह हैं, लेकिन उनमें से कुछ गैर-तुच्छ संयुग्म समूह में हैं (जिनके केवल प्रतिबिंब हैं उनमें अक्ष के 3 विकल्प हैं), इसलिए 10 मौलिक रूप से अलग-अलग समरूपताएं हैं जो षट्भुज की एक टाइलिंग हो सकती हैं:

10 समरूपता की छवियाँ

एक त्रिकोणीय जाली के एक उपसमुच्चय के हीरे के झुकाव की संख्या को एक निर्धारक के रूप में गणना की जा सकती है , इसलिए मेरा प्रारंभिक दृष्टिकोण षट्भुज के प्रत्येक समरूपता के लिए एक निर्धारक को स्थापित करने के लिए था, उन झुकावों की संख्या की गणना करने के लिए जिनके पास कम से कम समरूपताएं हैं। ; और फिर उनके पॉसेट (मूल रूप से समावेशन-बहिष्करण सिद्धांत का एक सामान्यीकरण) की घटना बीजगणित में मोबीस उलटा का उपयोग करें उन झुकावों की संख्या का पता लगाने के लिए जिनके समरूपता समूह 10 मामलों में से प्रत्येक में ठीक है । हालाँकि, कुछ सिमिट्रीज़ में गंदे किनारे की स्थिति होती है, इसलिए मुझे कई निर्धारकों के ऊपर योग करने के लिए मजबूर किया गया। सौभाग्य से, मूल्यों के लिए प्राप्त कियाn < 10मुझे पर्याप्त डेटा दिया जो कि OEIS में प्रासंगिक अनुक्रमों की पहचान करने में सक्षम हो और एक बंद फॉर्म ("बंद" के कुछ मूल्य के लिए जो परिमित उत्पादों की अनुमति देता है)। औपचारिक राइटअप में जो मैंने OEIS पार्ट अपडेट को सही ठहराने के लिए तैयार किया था , उसमें सीक्वेंस और साक्ष्यों के संदर्भों की थोड़ी चर्चा है ।

एक बार जब डबल-काउंटिंग का ध्यान रखा जाता है, तो यह पता चलता है कि दस में से चार मान बड़े करीने से रद्द हो जाते हैं, इसलिए हमें केवल शेष छह की गणना करनी होगी और फिर एक भारित योग करना होगा।

इस कोड N=1000को मेरी मशीन पर 30 सेकंड से कम समय लगता है ।

import java.math.BigInteger;

public class OptimisedCounter {
    private static int[] minp = new int[2];

    public static void main(String[] args) {
        if (args.length > 0) {
            for (String arg : args) System.out.println(count(Integer.parseInt(arg)));
        }
        else {
            for (int n = 0; n < 16; n++) {
                System.out.format("%d\t%s\n", n, count(n));
            }
        }
    }

    private static BigInteger count(int n) {
        if (n == 0) return BigInteger.ONE;

        if (minp.length < 3*n) {
            int[] wider = new int[3*n];
            System.arraycopy(minp, 0, wider, 0, minp.length);
            for (int x = minp.length; x < wider.length; x++) {
                // Find the smallest prime which divides x
                for (wider[x] = 2; x % wider[x] != 0; wider[x]++) { /* Do nothing */ }
            }
            minp = wider;
        }

        BigInteger E = countE(n), R2 = countR2(n), F = countF(n), R3 = countR3(n), R = countR(n), FR = countFR(n);
        BigInteger sum = E.add(R3);
        sum = sum.add(R2.add(R).multiply(BigInteger.valueOf(2)));
        sum = sum.add(F.add(FR).multiply(BigInteger.valueOf(3)));
        return sum.divide(BigInteger.valueOf(12));
    }

    private static BigInteger countE(int n) {
        int[] w = new int[3*n];
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j <= i + n; j++) w[j]--;
            for (int j = i + n + 1; j <= i + 2*n; j++) w[j]++;
        }
        return powerProd(w);
    }

    private static BigInteger countR2(int n) {
        int[] w = new int[3*n];
        for (int i = 0; i < n; i++) {
            w[3*i+2]++;
            for (int j = 3*i + 1; j <= 2*i + n + 1; j++) w[j]--;
            for (int j = 2*i + n + 1; j <= i + n + n; j++) w[j]++;
        }
        return powerProd(w);
    }

    private static BigInteger countF(int n) {
        int[] w = new int[3*n];
        for (int i = 0; i < n; i++) {
            for (int j = 2*i + 1; j <= 2*i + n; j++) w[j]--;
            for (int j = i + n + 1; j <= i + 2*n; j++) w[j]++;
        }
        return powerProd(w);
    }

    private static BigInteger countR3(int n) {
        if ((n & 1) == 1) return BigInteger.ZERO;
        return countE(n / 2).pow(2);
    }

    private static BigInteger countR(int n) {
        if ((n & 1) == 1) return BigInteger.ZERO;
        int m = n / 2;
        int[] w = new int[3*m-1];
        for (int i = 0; i < m; i++) {
            for (int j = 1; j <= 3*i+1; j++) w[j] += 2;
            for (int j = 1; j <= i + m; j++) w[j] -= 2;
        }
        return powerProd(w);
    }

    private static BigInteger countFR(int n) {
        if ((n & 1) == 1) return BigInteger.ZERO;
        int m = n / 2;
        int[] w = new int[3*n-2];
        for (int j = 1; j <= m; j++) w[j]--;
        for (int j = 2*m; j <= 3*m-1; j++) w[j]++;
        for (int i = 0; i <= 2*m-3; i++) {
            for (int j = i + 2*m + 1; j <= i + 4*m; j++) w[j]++;
            for (int j = 2*i + 3; j <= 2*i + 2*m + 2; j++) w[j]--;
        }
        return powerProd(w);
    }

    private static BigInteger powerProd(int[] w) {
        BigInteger result = BigInteger.ONE;
        for (int x = w.length - 1; x > 1; x--) {
            if (w[x] == 0) continue;

            int p = minp[x];
            if (p == x) result = result.multiply(BigInteger.valueOf(p).pow(w[p]));
            else {
                // Redistribute it. This should ensure we avoid negatives.
                w[p] += w[x];
                w[x / p] += w[x];
            }
        }

        return result;
    }
}

24
आप वास्तव में नश्वर के बीच एक भगवान हैं। मैं एक प्रतिष्ठित पत्रिका में प्रकाशित आपके समाधान को देखने की उम्मीद करता हूं।
एलेक्स ए।

यह कमाल का है। BTW मेरा (वर्तमान में पोस्ट नहीं किया गया) कोड N = 5: 22231176 (12) +275 (4) +75328 (6) +352 (2), 1 की विसंगति के लिए 22306956 देता है, जो विषम है। मुझे नहीं पता कि आप यहाँ क्या कर रहे हैं, क्या यह समरूपता द्वारा आ टूटने के लिए उपयुक्त है? N = 4 के लिए मैं आपसे 16 कम और oeis.org/A066931/a066931.txt हूं । इस संदर्भ से ऐसा लगता है कि मेरे पास 16 भी कई गुणा 12 है, जिसे मुझे 32 की गुणा करने की आवश्यकता है 6. नहीं बहुत आश्चर्य हुआ, यहां तक ​​कि एन मेरे लिए अधिक कठिन हैं। लेकिन मुझे विषम N से कोई समस्या नहीं है और मुझे 0 <N <4 के लिए सही उत्तर मिले। स्पष्ट समस्याओं की तलाश करेंगे और कल मेरा कोड पोस्ट करेंगे।
लेवल रिवर सेंट

@steveverrill, यदि मैं नोटेशन को समझता हूं, तो N = 5 के लिए मैं इसे 22231176 (12) + 75328 (6) + 275 (4) + 176 (2) बनाता हूं। मुझे लगता है कि आप सूचकांक 2 को 2 से विभाजित करने में विफल रहे हैं। (विषम संख्या के लिए FWIW वे सभी समरूपता की धुरी दो कोने से गुजरते हैं और क्रम 3 के घूर्णी समरूपता हैं)।
पीटर टेलर

@steveverrill, और N = 4 के लिए आपकी विसंगति उस संख्या के लिए एकदम उपयुक्त प्रतीत होती है, जिसमें दो किनारों के मध्य बिंदु से गुजरने वाली समरूपता का अक्ष होता है।
पीटर टेलर

3
प्रभावशाली है कि आप इसे हल किया। मैं उम्मीद कर रहा हूं कि आप अंत में एक उत्तर देंगे जो गैर-गणितज्ञों का अनुसरण कर सकता है।
डेविड

15

सी

परिचय

जैसा कि डेविड कारहर द्वारा टिप्पणी की गई थी, हेक्सागोन टाइलिंग का विश्लेषण करने का सबसे सरल तरीका 3 आयामी यंग आरेख के साथ इसके समरूपता का लाभ उठाने के लिए प्रतीत होता था, अनिवार्य रूप से एक x, y वर्ग पूर्णांक ऊंचाई सलाखों से भरा होता है जिनकी ऊंचाइयों को एक समान रहना चाहिए या बढ़ाना चाहिए के रूप में z अक्ष संपर्क किया है।

मैंने टोटल खोजने के लिए एक एल्गोरिथ्म के साथ शुरुआत की, जो प्रकाशित एल्गोरिथम की तुलना में समरूपता की गिनती के लिए अनुकूलन के लिए अधिक उत्तरदायी है, जो तीन कार्टेसियन अक्षों में से एक पूर्वाग्रह पर आधारित है।

कलन विधि

मैं 1 के साथ x, y और z विमानों की कोशिकाओं को भरकर शुरू करता हूं, जबकि बाकी क्षेत्र में शून्य हैं। एक बार जो किया जाता है, मैं परत द्वारा पैटर्न परत का निर्माण करता हूं, जिसमें प्रत्येक परत उन कोशिकाओं के साथ होती है जिनमें मूल से 3 डी मैनहट्टन की दूरी होती है। एक सेल में केवल 1 ही हो सकता है यदि इसके नीचे के तीन सेल में भी 1 होता है। यदि उनमें से किसी एक में 0 होता है, तो सेल में 0 होना चाहिए।

इस तरह से पैटर्न के निर्माण का लाभ यह है कि प्रत्येक परत x = y = z लाइन के बारे में सममित है। इसका मतलब है कि प्रत्येक परत को समरूपता के लिए स्वतंत्र रूप से जांचा जा सकता है।

समरूपता की जाँच

ठोस के समरूपता निम्नानुसार हैं: x = y = z लाइन के बारे में 3 गुना रोटेशन -> हेक्सागोनल केंद्र के बारे में 3 गुना रोटेशन; और x = y = z लाइन वाले 3 विमानों के बारे में 3 x प्रतिबिंब और अक्षों में से प्रत्येक x, y, z -> षट्भुज कोनों के माध्यम से लाइनों के बारे में प्रतिबिंब।

यह केवल 6 गुना समरूपता तक जोड़ता है। षट्भुज की पूर्ण समरूपता प्राप्त करने के लिए, दूसरे प्रकार की समरूपता पर विचार किया जाना चाहिए। प्रत्येक ठोस (1 से निर्मित) में एक पूरक ठोस होता है (0 से निर्मित)। जहां एन विषम है, पूरक ठोस मूल ठोस से अलग होना चाहिए (क्योंकि उनके लिए एक ही संख्या में क्यूब्स होना संभव नहीं है)। फिर भी जब पूरक ठोस को गोल किया जाता है, तो यह पाया जाएगा कि हीरे की टाइलिंग के रूप में इसका 2 डी प्रतिनिधित्व मूल ठोस के समान (2 गुना समरूपता ऑपरेशन को छोड़कर) समान है। जहाँ N सम है, वहां ठोस का स्व-विलोम होना संभव है।

यह प्रश्न में N = 2 के उदाहरणों में देखा जा सकता है। यदि बाईं ओर से देखा जाए, तो पहला षट्भुज 8 छोटे घनों के साथ एक ठोस घन जैसा दिखता है, जबकि अंतिम षट्भुज 0 छोटे घनों के साथ एक खाली खोल जैसा दिखता है। अगर दाईं ओर से देखा जाए तो रिवर्स सच है। 3, 4 और 5 वें हेक्सागोन और 16 वें, 17 वें और 18 वें हेक्सागोन ऐसे दिखते हैं जैसे उनमें 2 या 6 क्यूब्स होते हैं, और इस प्रकार वे 3 आयामों में एक दूसरे के पूरक होते हैं। वे 2 आयामों में 2 गुना समरूपता ऑपरेशन (2 गुना रोटेशन, या हेक्सागोन के किनारों के माध्यम से एक अक्ष के बारे में प्रतिबिंब) से संबंधित हैं। दूसरी तरफ 9 वीं, 10 वीं, 11 वीं और 12 वीं हेक्सागोन्स 3 डी पैटर्न हैं। अपने स्वयं के पूरक हैं, और इसलिए एक उच्च समरूपता है (ये विषम विषमता वाले एकमात्र पैटर्न हैं)।

ध्यान दें कि (एन ^ 3) / 2 क्यूब्स आत्म पूरक होने के लिए एक आवश्यक शर्त है, लेकिन सामान्य तौर पर यह एन> 2 होने पर पर्याप्त स्थिति नहीं है। इस सब का नतीजा यह है कि विषम एन के लिए, जोड़े में हमेशा झुकाव होता है (एन ^ 3) / 2 क्यूब्स का सावधानीपूर्वक निरीक्षण किया जाना चाहिए।

वर्तमान कोड (एन = 1,2,3,5 के लिए सही कुल उत्पन्न करता है। एन = 4 के लिए चर्चा के अनुसार त्रुटि।)

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]);    
}

उत्पादन

कार्यक्रम ठोस के 8 समरूपता के अनुसार, 8 प्रविष्टियों का एक आउटपुट तालिका बनाता है। ठोस में निम्न में से कोई भी 4 समरूपताएँ हो सकती हैं (स्कोनफ्लाइज़ नोटेशन)

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)

इसके अतिरिक्त, जब ठोस में 1 के साथ 1 और आधे के साथ बिल्कुल आधा कोशिकाएं होती हैं, तो सभी 1 और 0 के फ़्लिप होने की संभावना होती है, फिर क्यूब स्पेस के केंद्र के माध्यम से निर्देशांक निकालते हैं। इसे मैं आत्म-पूरक कह रहा हूं, लेकिन एक अधिक गणितीय शब्द "विलोम के एक केंद्र के संबंध में एंटीसिममेट्रिक" होगा।

यह समरूपता ऑपरेशन हेक्सागोन टाइलिंग में रोटेशन के 2-गुना अक्ष देता है।

जिन पैटर्न में यह समरूपता है, उन्हें एक अलग कॉलम में सूचीबद्ध किया गया है। वे केवल वहां होते हैं जहां एन भी होता है।

मेरी गिनती एन = 4 के लिए थोड़ी दूर लगती है। पीटर टेलर के साथ चर्चा में यह प्रतीत होता है कि मैं उन झुकावों का पता नहीं लगा रहा हूं जिनमें केवल षट्भुज किनारों के माध्यम से एक पंक्ति की समरूपता है। यह संभवतः इसलिए है क्योंकि मैंने स्वयं के पूरक (एंटीस्माइमेट्री) के संचालन के लिए परीक्षण नहीं किया है (उलटा x) ) लापता समरूपता को उजागर कर सकता है। मैं तब N = 4 के डेटा की पहली पंक्ति को इस तरह देखने की उम्मीद करूँगा (C1 ​​में 16 कम और C1 में 32 अधिक):

c1   224064/12=18672          C1  534/6=89

यह पीटर के उत्तर और https://oeis.org/A066931/a066931.txt के अनुरूप योग लाएगा।

वर्तमान आउटपुट निम्नानुसार है।

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

टू-डू सूची (अद्यतन)

वर्तमान कोड को साफ करें।

हो गया, कम या ज्यादा

वर्तमान परत के लिए समरूपता जाँच को लागू करें, और पिछली परत की समरूपता के लिए एक पैरामीटर पास करें (यदि अंतिम परत विषम थी तो जाँच में कोई मतलब नहीं है।)

हो गया, विषम एन के परिणाम प्रकाशित आंकड़ों से सहमत हैं

विषम आंकड़ों की गिनती को दबाने के लिए एक विकल्प जोड़ें (बहुत तेज दौड़ना चाहिए)

यह रिकर्सन कॉल में एक और शर्त जोड़कर किया जा सकता है: if(s1 && m<n*3-2)f(m + 1,e+d,s1)यह N = 5 के रन टाइम को 5 मिनट से घटाकर लगभग एक सेकंड कर देता है। परिणामस्वरूप आउटपुट की पहली पंक्ति कुल कचरा बन जाती है (जैसा कि समग्र योग करते हैं) लेकिन अगर कुल पहले से ही ओईआईएस से जाना जाता है तो असममित झुकावों की संख्या का पुनर्गठन किया जा सकता है, कम से कम विषम एन के लिए।

लेकिन एन के लिए भी, असममित (c3v समरूपता के अनुसार) ठोस जो आत्म-पूरक हैं, की संख्या खो जाएगी। इस मामले के लिए, 1 (1 **) के साथ वास्तव में (एन ** 3) / 2 कोशिकाओं के साथ समर्पित एक अलग कार्यक्रम उपयोगी हो सकता है। इस उपलब्ध (और सही ढंग से गिनती) के साथ, एन = 6 की कोशिश करना संभव हो सकता है, लेकिन इसे चलाने में लंबा समय लगेगा।

(N ^ 3) / 2 क्यूब्स तक खोज को कम करने के लिए कोशिकाओं की गिनती को लागू करें।

नहीं किया गया, बचत सीमांत होने की उम्मीद है

बिल्कुल (N ^ 3) / 2 क्यूब्स वाले पैटर्न के लिए समरूपता (पूरक ठोस) की जाँच करें।

किया, लेकिन लगता है कि चूक है, एन = 4 देखें।

एक विषम से सबसे कम आंकड़ा लेने का एक तरीका खोजें।

बचत की उम्मीद नहीं की जा सकती है। विषम आंकड़ों का समर्थन यह सबसे को समाप्त करता है। केवल परावर्तित होने वाले एकमात्र प्रतिबिंब को y अक्ष के माध्यम से समतल किया जाता है (x और z को बाद में 3 से गुणा करके गणना की जाती है।) केवल घूर्णी समरूपता वाले आंकड़े उनके दोनों तांत्रिक रूपों में गिने जाते हैं। शायद यह लगभग दो बार तेजी से चलेगा यदि केवल एक की गिनती की गई थी।

इसे सुविधाजनक बनाने के लिए, संभवतः प्रत्येक परत में निर्देशांक को सूचीबद्ध करने के तरीके में सुधार करें (वे 6 या 3 के पतित समूह बनाते हैं, संभवतः परत के सटीक केंद्र में 1 का समूह।)

दिलचस्प है, लेकिन शायद साइट पर अन्य सवाल हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.