OEIS প্রসারিত: ডায়মন্ড টিলিংস গণনা করা


46

আমি প্রতিশ্রুতি দিচ্ছি, হীরা ডিলিং সম্পর্কে এটি আমার শেষ চ্যালেঞ্জ হবে (কিছু সময়ের জন্য, যাইহোক)। উজ্জ্বল দিক থেকে, এই চ্যালেঞ্জটির ASCII শিল্পের সাথে কোনও সম্পর্ক নেই এবং এটি কোনও কোড গল্ফও নয়, তাই এটি আসলে সম্পূর্ণ আলাদা।

তাই কেবল একটি অনুস্মারক হিসাবে, প্রতিটি ষড়ভুজকে তিনটি ভিন্ন ভিন্ন হীরা দিয়ে শিরোনাম করা যেতে পারে:

একটি আকর্ষণীয় প্রশ্ন জিজ্ঞাসা করা হল যে প্রদত্ত ষড়ভুজ আকারের জন্য এই সিলিংগুলির কতটি বিদ্যমান। দেখে মনে হচ্ছে এই সংখ্যাগুলি মোটামুটি ভালভাবে অধ্যয়ন করা হয়েছে এবং OEIS A008793 এ পাওয়া যাবে ।

যাইহোক, সমস্যা, trickier যদি আমরা জিজ্ঞাসা কত tilings অস্তিত্ব পায় ঘূর্ণন এবং প্রতিফলন পর্যন্ত । উদাহরণস্বরূপ, পাশের দৈর্ঘ্য N = 2 এর জন্য, নিম্নলিখিত 20 টি টিলিং উপস্থিত রয়েছে:

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

তবে এগুলির মধ্যে অনেকগুলি আবর্তন এবং প্রতিবিম্বের অধীনে অভিন্ন। যদি আমরা এই প্রতিসাম্যগুলি বিবেচনায় নিই তবে কেবল 6 টি পৃথক টিলিং রয়ে যায়:

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

   2        2        6        6        1        3

যেখানে সংখ্যাগুলি প্রতিটি টাইলিংয়ের বহুগুণ নির্দেশ করে। নোট করুন যে বৃহত্তর হেক্সাগনগুলির জন্য 4 এবং 12 এর বহুগুণ সহ tilingsও রয়েছে।

এটি প্রদর্শিত হয় যে প্রতিসাম্য পর্যন্ত tilings সংখ্যা কম পুঙ্খানুপুঙ্খভাবে অধ্যয়ন করা হয়েছে। OEIS এন্ট্রি A066931 শুধুমাত্র পাঁচটি শর্তাবলী তালিকাভুক্ত করেছে:

1, 1, 6, 113, 20174

যেখানে প্রথম শব্দটি পাশের দৈর্ঘ্যের জন্য N = 0এবং পাশের দৈর্ঘ্যের জন্য শেষ শব্দ N = 4

আমি নিশ্চিত যে আমরা এর চেয়ে আরও ভাল করতে পারি!

আপনার কাজটি প্রদত্ত পাশের দৈর্ঘ্যের জন্য টিলিংয়ের সংখ্যা গণনা করা।

এটি । আপনার স্কোর সর্বোচ্চ পার্শ্ব-দৈর্ঘ্যের হবে Nযার জন্য আপনার কোডটি আমার মেশিনে 30 মিনিটের মধ্যে সঠিক ফলাফল তৈরি করবে । টাই করার ক্ষেত্রে, আমি সেই জমাটি গ্রহণ করব যা সেই N দ্রুততার জন্য ফলাফল তৈরি করে ।

যথারীতি, টাই-ব্রেকারটি জিততে আপনাকে ইতিমধ্যে ফলাফল হার্ডকোড করা উচিত নয়। যে অ্যালগরিদম সমাধান করে N = 3তা সমাধানকারীগুলির সাথে সমান হওয়া উচিত N = 5

আপনার জমা দিতে অবশ্যই 4 গিগাবাইটের বেশি মেমরি ব্যবহার করা উচিত নয়। আপনি যদি এই সীমাটির নিকটবর্তী হয়ে কাজ করছেন তবে আমি এটিকে কিছুটা অবলম্বন করব, তবে আপনি যদি নিয়মিতভাবে এই সীমাটির aboveর্ধ্বে থাকেন, বা আপনি যদি এর বাইরেও উল্লেখযোগ্যভাবে স্পাইক করেন তবে আমি Nআপনার জমা দেওয়ার জন্য এটি গণনা করব না ।

আমি আমার উইন্ডোজ 8 মেশিনে সমস্ত জমা পরীক্ষা করব, সুতরাং আপনার পছন্দের ভাষাটি উইন্ডোজে অবাধে উপলব্ধ is এটির একমাত্র ব্যতিক্রম ম্যাথমেটিকা ​​(কারণ এটির জন্য আমার লাইসেন্স আছে)। আপনার কোডটি কীভাবে সংকলন / পরিচালনা করবেন তার জন্য নির্দেশাবলী অন্তর্ভুক্ত করুন।

অবশ্যই, আপনার নিজের সময়ে আরও শর্তাদি গণনা করতে দ্বিধা বোধ করুন (বিজ্ঞানের জন্য, এবং অন্যরা তাদের সংখ্যাগুলি পরীক্ষা করার জন্য) তবে আপনার উত্তরটির স্কোর এই 30 মিনিটের মধ্যে নির্ধারিত হবে।


4
নোট করুন যেহেতু N = 610 ^ 12 এরও বেশি আউটপুট দেয়, তাই অ-গঠনমূলক সমাধানটি প্রায় অবশ্যই পাওয়া দরকার।
পিটার টেলর

1
@ পিটারটেলর আমি প্রত্যাশা করছিলাম যে উন্নতির আরও জায়গা পাবে। সমস্যাটির আরও অন্তর্দৃষ্টি পাওয়ার জন্য প্রথমে কয়েকটি সাধারণ গঠনমূলক উত্তর যা প্রথমে এন = 5 করতে পারে এবং তারপরে সম্ভাব্য সংকর পদ্ধতির যেগুলি সমস্ত টিলিংগুলি নির্মাণের প্রয়োজন হয় না তবে কয়েকটি সংখ্যক নির্মাণকৃত সংখ্যার থেকে মোট সংখ্যাটি বহির্ভূত করতে পারে ... এবং তারপরে সম্ভবত কিছু বিশ্লেষক যদি আমরা সত্যিই ভাগ্যবান হন। :)
মার্টিন ইন্ডার

2
সুস্পষ্টভাবে উল্লেখ করার ঝুঁকিতে, আমার কাছে মনে হয় যে এই জাতীয় প্রতিটি টাইলিং দূরবর্তী দৃষ্টিকোণ থেকে দেখা হিসাবে ইউনিট কিউবগুলির একটি সমাবেশের প্রজেক্টের সাথে মিলে যায়, যেমন, (100, -100,100) থেকে) আমি দেখতে পাচ্ছি যে এটি টিলিংস নির্মাণের বোঝা হালকা করে।
ডেভিডসি

1
পছন্দ করুন আরও সুনির্দিষ্টভাবে, ইউনিট কিউবগুলির এই জাতীয় ব্যবস্থা হ'ল 3 ডি ইয়ং ডায়াগ্রাম । (সম্ভবত এটি কাউকে সহায়তা করে))
মার্টিন এন্ডার

@ ডেভিডকারারহর যদি আপনি বড় ষড়ভুজকে যথেষ্ট শক্ত করে দেখেন তবে আপনি দেখতে পাবেন যে এটি একটি তরুণ চিত্র হিসাবে ব্যাখ্যা করার জন্য দুটি ভিন্ন উপায় রয়েছে। সুস্পষ্ট উপায় (আমার পক্ষে কমপক্ষে) শীর্ষ এবং বাম কোণে 2x2x1 কিউবিড হারিয়ে একটি শীর্ষ সমতল অঞ্চল দেখতে হবে। তবে এটি দেখার আরও একটি উপায় আছে: সেই অঞ্চলে একটি ফাঁকা অঞ্চল, এটিতে 2x2x1 কিউবয়েড রয়েছে। 60 ডিগ্রি টিল্টিং সাহায্য করতে পারে। এটি আমার চোখকে ব্যথা দেয় তবে আমি মনে করি দুটি অল্প চিত্রই এক সাথে ফিট করে, সম্ভবত তাদের কোনওটির প্রতিচ্ছবি দ্বারা। OEIS A008793 এর শব্দটির সাথে খুব সতর্কতা অবলম্বন করছে: " প্লেন পার্টিশনের সংখ্যা যাদের তরুণ চিত্রগুলি ..."
স্তর নদী সেন্ট

উত্তর:


80

বীজগণিত, গ্রাফ তত্ত্ব, মাবিয়াস বিপরীকরণ, গবেষণা এবং জাভা

ষড়ভুজের প্রতিসাম্য গ্রুপটি হ'ল 12 ক্রমের ডিহাইড্রাল গ্রুপ এবং এটি একটি 60 ডিগ্রি ঘূর্ণন এবং ব্যাস জুড়ে একটি আয়না উল্টানো দ্বারা উত্পন্ন হয়। এটিতে ১ sub টি উপগোষ্ঠী রয়েছে, তবে তাদের মধ্যে কিছুগুলি অ-তুচ্ছ সংশ্লেষমূলক গোষ্ঠীতে রয়েছে (কেবলমাত্র প্রতিচ্ছবিগুলির মধ্যে অক্ষগুলির 3 টি পছন্দ রয়েছে), সুতরাং 10 টি মৌলিকভাবে পৃথক প্রতিসাম্য রয়েছে যা হেক্সাগনটির একটি টাইলিং থাকতে পারে:

10 টি প্রতিসাম্যের চিত্র

ত্রিভুজাকার জালির একটি উপসেটের হীরা সংক্রমণের সংখ্যাটি একটি নির্ধারক হিসাবে গণনা করা যায় , সুতরাং আমার প্রাথমিক পদ্ধতির ছিল ষড়্ভুজের প্রতিটি প্রতিসাম্যের জন্য একটি নির্ধারক স্থাপন করা, কমপক্ষে sy প্রতিসাম্যগুলি রয়েছে এমন টিলিংয়ের সংখ্যা গণনা করার জন্য ; এবং তারপর Möbius বিপর্যয় ব্যবহার ঘটনা বীজগণিত তাদের poset (মূলত অন্তর্ভুক্তি-বর্জন নীতি একটি সাধারণীকরণ) এর tilings সংখ্যা যার প্রতিসাম্য গ্রুপ কাজ ঠিক 10 ক্ষেত্রে প্রতিটি। যাইহোক, কিছু প্রতিসাম্যগুলির বাজে প্রান্তের শর্ত রয়েছে, তাই আমি বহু সংখ্যক নির্ধারককে যোগ করতে বাধ্য হয়েছিল। ভাগ্যক্রমে, প্রাপ্ত মানগুলিn < 10আমাকে 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
আপনি সত্যই একজন মানুষের মধ্যে aশ্বর are আমি আশা করি আপনার সমাধানটি একটি নামী জার্নালে প্রকাশিত হবে।
অ্যালেক্স এ।

এটা সত্যিই দারুন. বিটিডাব্লু আমার (বর্তমানে পোস্ট নেই) কোড এন = 5: 22231176 (12) +275 (4) +75328 (6) +352 (2) এর 1 টির তাত্পর্য, যা বিজোড়। আমার ধারণা নেই আপনি এখানে করছেন তা কি প্রতিসমগুলি দ্বারা এটি ভাঙ্গার জন্য উপযুক্ত? এন = 4 এর জন্য আমি আপনার চেয়ে 16 কম এবং oeis.org/A066931/a066931.txt সেই রেফারেন্স থেকে মনে হয় আমার বহু সংখ্যা 12 আছে 16, যা আমার সংখ্যা 6 এর 32 এ রূপান্তর করা দরকার I'm আমি নই খুব অবাক, এমনকি এনও আমার পক্ষে আরও কঠিন। তবে বিজোড় এন নিয়ে আমার কোনও সমস্যা নেই এবং আমি 0 <এন <4 এর সঠিক উত্তর পেয়েছি। সুস্পষ্ট সমস্যাগুলি সন্ধান করবে এবং আগামীকাল আমার কোড পোস্ট করবে।
লেভেল নদী সেন্ট

@ স্টেভেভারিল, যদি আমি স্বীকৃতিটি বুঝতে পারি তবে এন = 5 এর জন্য আমি এটি 22231176 (12) + 75328 (6) + 275 (4) + 176 (2) করি। আমি মনে করি আপনি সূচক 2 টি 2 দিয়ে বিভক্ত করতে ব্যর্থ হচ্ছেন (বিজোড় সংখ্যার জন্য এফডাব্লুআইডাব্লু তাদের সকলেরই দুটি ভার্টিক্স এবং ক্রম 3 এর ক্রমগত প্রতিসাম্য পেরিয়ে প্রতিসাম্যের অক্ষ রয়েছে)।
পিটার টেলর

@ স্টেভেভারিল, এবং এন = 4 এর জন্য আপনার তাত্পর্যটি এমন সংখ্যার জন্য একটি উপযুক্ত ফিট বলে মনে হচ্ছে যার দুটি প্রান্তের মাঝের বিন্দুগুলির মধ্য দিয়ে প্রতিসামের অক্ষ রয়েছে।
পিটার টেলর

3
চিত্তাকর্ষক যে আপনি এটি সমাধান করেছেন। আমি আশা করছি আপনি অবশেষে এমন একটি উত্তর পোস্ট করবেন যা অ-গণিতবিদরা অনুসরণ করতে পারেন।
ডেভিডসি

15

সি

ভূমিকা

ডেভিড ক্যারাহারের মন্তব্য অনুসারে, ষড়ভুজ টাইলিং বিশ্লেষণের সহজতম উপায়টি 3 টি মাত্রিক ইয়ং ডায়াগ্রামের সাথে আইসোমর্ফিজমের সুবিধা গ্রহণ করা বলে মনে হয়েছে, মূলত একটি x, y বর্গ যার পূর্ণসংখ্যার উচ্চতার বারগুলিতে ভরা হবে অবশ্যই z উচ্চতা একই থাকবে বা বৃদ্ধি হবে z অক্ষটি যেমন পৌঁছেছে

আমি প্রকাশিত অ্যালগরিদমের চেয়ে প্রতিসাম্য গণনার জন্য অভিযোজনে আরও বেশি উপযুক্ত, মোটগুলি সন্ধানের জন্য একটি অ্যালগরিদম দিয়ে শুরু করেছি, যা তিনটি কার্তেসিয়ান অক্ষের একটি পক্ষপাতিত্বের ভিত্তিতে রয়েছে।

অ্যালগরিদম

আমি এক্স, ওয়াই এবং জেড প্লেনের কোষগুলিকে 1 এর সাথে পূরণ করে শুরু করব, অন্যদিকে অঞ্চলে শূন্য রয়েছে। এটি হয়ে গেলে, আমি স্তর দ্বারা প্যাটার্ন স্তরটি তৈরি করি, প্রতিটি স্তর দিয়ে কোষগুলি থাকে যা থেকে সাধারণ 3 ডি ম্যানহাটনের দূরত্ব থাকে containing একটি কক্ষে কেবলমাত্র 1 থাকতে পারে যদি নীচের তিনটি কোষেও 1 থাকে them যদি তাদের কোনওটিতে 0 থাকে তবে তার পরে অবশ্যই সেলটি 0 হবে।

এই পদ্ধতিতে প্যাটার্নটি বাড়ানোর সুবিধাটি হ'ল প্রতিটি স্তরটি x = y = z লাইন সম্পর্কে প্রতিসম হয়। এর অর্থ প্রতিটি স্তরের প্রতিসাম্যের জন্য স্বাধীনভাবে চেক করা যায়।

প্রতিসম পরীক্ষা করা

শক্তির প্রতিসাম্যগুলি নিম্নরূপ: x = y = z লাইন সম্পর্কে 3 ভাঁজ ঘূর্ণন -> ষড়্ভুজ কেন্দ্রের প্রায় 3 ভাঁজ ঘোরানো; এবং x = y = z লাইন এবং প্রতিটি অক্ষের প্রতিটি x, y, z -> ষড়ভুজ কোণে লাইনগুলি সম্পর্কে প্রতিচ্ছবি যুক্ত 3 টি প্লেন সম্পর্কে 3 এক্স প্রতিচ্ছবি।

এটি কেবল 6 টি ভাগে প্রতিসাম্য যুক্ত করে। ষড়ভুজের সম্পূর্ণ প্রতিসাম্য পেতে, অন্য ধরণের প্রতিসাম্য বিবেচনা করতে হবে। প্রতিটি কঠিন (1 এর থেকে নির্মিত) এর পরিপূরক কঠিন (0 এর থেকে নির্মিত) থাকে। যেখানে এন বিজোড়, পরিপূরক কঠিনটি অবশ্যই মূল কঠিন থেকে আলাদা হতে হবে (কারণ তাদের পক্ষে একই সংখ্যক কিউব থাকা সম্ভব নয়)। তবুও যখন পরিপূরক শক্তটি গোলাকার হয়ে যায়, তখন দেখা যাবে যে হীরা টাইলিং হিসাবে এটির 2D প্রতিনিধিত্ব মূল শক্তির সাথে অভিন্ন (2-ভাঁজ প্রতিসাম্য অপারেশন বাদে) is যেখানে এন সমান, শক্তির পক্ষে স্ব-বিপরীত হওয়া সম্ভব।

এটি প্রশ্নের মধ্যে এন = 2 এর উদাহরণগুলিতে দেখা যাবে। বাম দিক থেকে যদি দেখা যায় তবে প্রথম ষড়জাগুলি 8 টি কিউবযুক্ত শক্ত ঘনক্ষেত্রের মতো দেখায়, শেষ ষড়জাগুলি 0 টি ছোট কিউবযুক্ত খালি শেলের মতো দেখায়। যদি ডান থেকে দেখা যায় তবে বিপরীতটি সত্য। 3 য়, চতুর্থ এবং 5 র্থ হেক্সাগন এবং 16 তম, 17 এবং 18 তম হেক্সাগনগুলি দেখতে 2 বা 6 কিউব রয়েছে বলে মনে হয় এবং তারা একে অপরের পরিপূরককে 3 টি মাত্রায় পরিপূরক করে। তারা 2-ভাগে প্রতিসাম্য ক্রিয়াকলাপের মাধ্যমে 2 টি মাত্রায় একে অপরের সাথে সম্পর্কিত (2 ভাঁজ ঘূর্ণন, বা ষড়্ভুজগুলির প্রান্তগুলির মধ্য দিয়ে একটি অক্ষ সম্পর্কে প্রতিচ্ছবি।) অন্যদিকে 9 ম, 10 তম, 11 তম এবং 12 তম ষড়ভুজগুলি 3 ডি প্যাটার্ন দেখায় যা তাদের নিজস্ব পরিপূরক, এবং সেইজন্য উচ্চতর প্রতিসাম্য রয়েছে (এ কারণেই বিজোড় সংখ্যাবৃদ্ধির একমাত্র নিদর্শন)।

মনে রাখবেন (এন ^ 3) / 2 কিউব থাকা স্ব পরিপূরক হওয়ার জন্য প্রয়োজনীয় শর্ত, তবে সাধারণভাবে এন> 2 হলে এটি পর্যাপ্ত শর্ত নয়। এই সমস্তটির ফলস্বরূপ যে বিজোড় এন এর জন্য, ঝুঁকি সর্বদা জোড়া হয় (এন ^ 3) / 2 কিউবগুলি অবশ্যই সাবধানে পরীক্ষা করা উচিত।

বর্তমান কোড (এন = 1,2,3,5 এর জন্য সঠিক মোট উত্পন্ন করে N এন = 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 এর অর্ধেক এবং 0 এর সাথে অর্ধেক কোষ থাকে, তখন 1 এবং 0 এর সমস্তগুলি উল্টিয়ে যাওয়ার সম্ভাবনা থাকে, তারপরে ঘনক্ষেত্রের কেন্দ্রের মধ্যবর্তী স্থানাঙ্কগুলিকে উল্টো করে দেয়। এটাকে আমি স্ব-পরিপূরক বলছি, তবে আরও গাণিতিক শব্দটি হবে "বিপর্যয়ের কেন্দ্রের প্রতি সম্মান সহকারে অ্যান্টিসিমমেট্রিক"।

এই প্রতিসাম্য ক্রিয়াকলাপটি ষড়ভুজ টাইলিংয়ে ঘূর্ণনের 2-গুণ অক্ষ দেয়।

যে প্যাটার্নগুলির এই প্রতিসাম্যতা রয়েছে সেগুলি একটি পৃথক কলামে তালিকাভুক্ত করা হয়েছে। এগুলি কেবল যেখানে এন সমান হয় occur

আমার গণনা N = 4 এর জন্য কিছুটা বন্ধ বলে মনে হচ্ছে। পিটার টেইলরের সাথে আলোচনায় এটি প্রদর্শিত হয় যে আমি এমন টিলিংসগুলি সনাক্ত করতে পারছি না যেগুলি কেবল ষড়ভুজ প্রান্তের মধ্য দিয়ে একটি লাইনের প্রতিসাম্য রয়েছে। এটি সম্ভবত এটি কারণ আমি (বিপর্যয়) এক্স (পরিচয়।) অপারেটনগুলির জন্য স্ব পরিপূরক (বিপরীত) এক্স (প্রতিবিম্ব) এবং (বিপরীত) এক্স (3-ভাঁজ ঘূর্ণন) ছাড়া অন্য ক্রিয়াকলাপগুলির জন্য স্ব পরিপূরক (অ্যান্টিসিমমেট্রি) পরীক্ষা করিনি because ) অনুপস্থিত প্রতিসাম্যগুলি উদঘাটন করতে পারে। আমি তখন এন = 4 এর জন্য ডেটার প্রথম লাইনটি দেখতে (সি 1 তে 16 কম এবং সি 1 তে 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)এটি এন = 5 এর জন্য রান সময়কে 5 মিনিট থেকে প্রায় এক সেকেন্ডে হ্রাস করে। ফলস্বরূপ আউটপুট প্রথম লাইন মোট আবর্জনা হয়ে ওঠে (সামগ্রিক মোট হিসাবে) কিন্তু মোট ইতিমধ্যে OEIS থেকে জানা থাকলে কমপক্ষে বিজোড় এন এর জন্য অসমিত পরিমাণের সংখ্যার পুনর্গঠন করা যেতে পারে least

তবে এমনকি এন এর জন্য, অসম্পূর্ণ সংখ্যার (সি 3 ভি প্রতিসাম্য অনুসারে) স্ব-পরিপূরকযুক্ত সলিডগুলি হারিয়ে যাবে। এই ক্ষেত্রে, ঠিক 1 (ন ** 3) / 2 কোষ সহ সলিডকে উত্সর্গ করা একটি পৃথক প্রোগ্রাম কার্যকর হতে পারে। এটি উপলব্ধ (এবং সঠিকভাবে গণনা করা) এর সাথে এন = 6 চেষ্টা করা সম্ভব হতে পারে তবে এটি চালাতে অনেক সময় লাগবে।

(N ^ 3) / 2 কিউব্যাক্স পর্যন্ত অনুসন্ধান কমাতে ঘর গণনা কার্যকর করুন।

সম্পন্ন হয়নি, সঞ্চয় প্রান্তিক হবে বলে আশা করা হচ্ছে

হুবহু (এন ^ 3) / 2 কিউবযুক্ত নিদর্শনগুলির জন্য প্রতিসম (পরিপূরক কঠিন) চেকিং প্রয়োগ করুন।

সম্পন্ন হয়েছে তবে মনে হচ্ছে বাদ পড়েছে, দেখুন এন = 4।

অ্যাসিমেট্রিকাল একটি থেকে রক্ষিতভাবে সর্বনিম্ন চিত্র বেছে নেওয়ার একটি উপায় সন্ধান করুন।

সঞ্চয়গুলি দুর্দান্ত হওয়ার আশা করা যায় না। অসমসংখ্যার পরিসংখ্যানকে দমন করা এগুলির বেশিরভাগ সরিয়ে দেয়। একমাত্র প্রতিবিম্ব যা যাচাই করা হয় তা হল y অক্ষের মাধ্যমে বিমান (x এবং z পরে 3 দ্বারা গুণ করে গণনা করা হয়)) কেবলমাত্র ঘূর্ণমান প্রতিসাম্যযুক্ত চিত্রগুলি তাদের উভয় এন্যানটিওমেরিক ফর্মে গণনা করা হয়। কেবলমাত্র একজনকে গণনা করা হলে এটি প্রায় দ্বিগুণ দ্রুত চলবে।

এটির সুবিধার্থে, প্রতিটি স্তরের স্থানাঙ্কগুলি তালিকাভুক্ত করার পদ্ধতিটি সম্ভবত উন্নত করুন (তারা স্তরটির সঠিক কেন্দ্রে সম্ভবত 1 এর একটি গ্রুপ সহ 6 বা 3 এর অধঃপতন গ্রুপ গঠন করেন))

আকর্ষণীয় তবে সম্ভবত অন্বেষণ করার জন্য সাইটে অন্যান্য প্রশ্ন রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.