সরাসরি পর্বে যান
পর্ব ৫১ · ৮৩-এর মধ্যে · মডিউল ৮

Symmetry দিয়ে গণনা — Burnside-এর lemma আর Pólya

Counting up to Symmetry — Group Actions, the Orbit–Stabilizer Theorem, Burnside's Lemma, Necklaces and Bracelets, Cube Colourings and Pólya's Enumeration Theorem

Taught in Bangla, this lesson explains why plain counting overcounts objects that match under rotation. It defines group actions, orbits and stabilizers, proves the orbit–stabilizer theorem and Burnside's lemma, derives the necklace formula with Euler's phi, adds reflections for bracelets and uses the 24 cube rotations for face colourings. Cycle indices and Pólya's enumeration theorem count by colour and count graphs up to isomorphism, and in-page Python lists every colouring to check each formula.

এই পর্বে যা শিখবেন

  • “Symmetry পর্যন্ত একই” কথাটির নির্ভুল গাণিতিক অর্থ: group action আর তার orbit
  • Orbit–stabilizer উপপাদ্য আর Burnside-এর lemma-র সম্পূর্ণ প্রমাণ
  • Euler-এর φ দিয়ে necklace-এর সূত্র, dihedral group দিয়ে bracelet, আর কিউবের ২৪টি rotation-এর cycle-গঠন
  • Cycle index আর Pólya-র enumeration উপপাদ্য দিয়ে রঙের সংখ্যা অনুযায়ী গোনা, আর graph-এর isomorphism শ্রেণি গোনা
  • প্রতিটি সূত্র Python-এ সব রং-করা তালিকা করে brute force-এর সঙ্গে মেলানো

১ · ঘোরালে যা একই — কেন সাধারণ গণনা বেশি গোনে

এই মডিউলে এ পর্যন্ত যা গুনেছেন, তার প্রতিটি বস্তু ছিল আলাদা: একটি bit string, একটি tiling, একটি partition. কিন্তু অনেক প্রশ্নে দুটি বস্তু “আসলে একই”, কারণ একটিকে ঘুরিয়ে বা উল্টে অন্যটি পাওয়া যায়। এই পর্বের প্রশ্ন: এমন অবস্থায় আলাদা বস্তু কয়টি?

বাজারঘরের শোরুমে একটি গোল ঘূর্ণায়মান স্ট্যান্ড, তাতে সমান দূরত্বে ৪টি তাক। প্রতিটি তাকে লাল বা নীল মোড়কের একটি পণ্য বসানো হবে। স্ট্যান্ডটি সারাক্ষণ ঘোরে, তাই ক্রেতার কাছে “লাল-লাল-নীল-নীল” আর “নীল-লাল-লাল-নীল” একই সাজ: একটু ঘোরালেই একটি অন্যটি হয়ে যায়। ম্যানেজার জানতে চান, সত্যিই আলাদা কয়টি সাজ আছে, যাতে প্রতিদিন একটি নতুন সাজ দেখানো যায় আর কোনোটি দুবার না আসে।

গণিতে এই স্ট্যান্ডের নাম necklace (মালা): বৃত্তে সাজানো n-টি পুঁতি, প্রতিটি k-টি রঙের একটিতে রং করা, আর ঘোরালে মিলে যায় এমন দুটি মালা একই। পুঁতিগুলোকে 1, 2, 3, 4 নম্বর দিলে একটি রং-করা হলো দৈর্ঘ্য ৪-এর একটি string, যেমন 0011 (0 = লাল, 1 = নীল)। মোট string 24 = 16. এক ধাপ ঘোরানো মানে string-এর প্রথম অক্ষর শেষে পাঠানো: 0011 → 0110 → 1100 → 1001 → 0011.

শ্রেণিএই শ্রেণির stringআকার
সব লাল00001
একটি নীল0001, 0010, 0100, 10004
দুই নীল পাশাপাশি0011, 0110, 1100, 10014
দুই নীল মুখোমুখি0101, 10102
তিন নীল0111, 1110, 1101, 10114
সব নীল11111

মোট ৬টি শ্রেণি, আর তাদের আকার যোগ করলে 1 + 4 + 4 + 2 + 4 + 1 = 16. এখানেই সমস্যার মূল। পর্ব ৩৩ “Permutation আর combination”-এ n জন আলাদা মানুষকে গোল টেবিলে বসানোর উপায় (n − 1)! বের হয়েছিল ভাগের নিয়মে: প্রতিটি গোল বসা ঠিক n-টি সারি থেকে আসে, তাই n!/n. সেখানে সবাই আলাদা, তাই কোনো rotation একটি বসাকে নিজের ওপর ফেরত আনে না, আর প্রতিটি শ্রেণির আকার ঠিক n. রঙের প্রশ্নে তা সত্য নয়: 0000 ঘোরালে বদলায়ই না (শ্রেণির আকার 1), আর 0101 দুই ধাপেই ফিরে আসে (আকার 2), তাই তার শ্রেণি ছোট। তাই 16/4 = 4 একটি ভুল উত্তর, আর সঠিক উত্তর 6.

সাধারণ ভুল: “মোট বস্তু ÷ symmetry-র সংখ্যা” তখনই ঠিক, যখন প্রতিটি শ্রেণির আকার সমান। রঙে পুনরাবৃত্তি থাকলে কিছু বস্তু কোনো কোনো symmetry-তে বদলায় না, তাদের শ্রেণি ছোট, আর সরল ভাগ কম গোনে। ভাগফল পূর্ণসংখ্যা না হলে (যেমন ৫ পুঁতি, ২ রঙে 32/5) ভুলটি চোখেই পড়ে; কিন্তু ৪ পুঁতির মতো ভাগফল পূর্ণসংখ্যা হলেও উত্তর ভুল হতে পারে।

হাতে তালিকা করা ৪ পুঁতিতে চলে, ১০ পুঁতিতে ১০২৪টি string, আর ৩০ পুঁতিতে প্রায় ১০৭ কোটি। দরকার এমন একটি সূত্র, যা শ্রেণির অসমান আকারকে নিজেই সামলায়। সেই সূত্রই Burnside-এর lemma, আর তার জন্য আগে “symmetry” কথাটিকে নির্ভুল করতে হবে।

২ · Symmetry-র group — rotation, reflection, cyclic আর dihedral

একটি বর্গক্ষেত্রের কোণ চারটিকে ঘড়ির কাঁটার দিকে 1, 2, 3, 4 নাম দিন। বর্গটিকে তুলে আবার একই জায়গায় বসানোর উপায় কয়টি, যাতে আকৃতিটি নিজের ওপর পড়ে? ঘোরানো যায় 0°, 90°, 180°, 270°; আর উল্টানো যায় চারটি অক্ষ বরাবর: দুটি কর্ণ আর দুটি মধ্যরেখা। মোট ৮টি symmetry. প্রতিটি symmetry কোণগুলোর একটি permutation (পর্ব ১৬-এর bijection), যেমন 90° ঘোরানো 1 → 2 → 3 → 4 → 1.

বর্গের ৮টি symmetry: ৪টি rotation আর ৪টি reflection অক্ষ

লাল ড্যাশ = কর্ণ বরাবর উল্টানো (দুটি কোণ স্থির থাকে), নীল ড্যাশ = মধ্যরেখা বরাবর উল্টানো (কোনো কোণ স্থির থাকে না), বাঁকা তীর = 90° ঘোরানো।

The 8 symmetries of a square: rotations by 0, 90, 180, 270 degrees and reflections in two diagonals and two midlines 90° 1234 ৪টি rotation + ৪টি reflection = ৮ D₄: |G| = 8

এই ৮টি symmetry-র একটি গুরুত্বপূর্ণ ধর্ম আছে: দুটি পরপর করলে আবার একটি symmetry পাওয়া যায় (90° তারপর 90° = 180°), “কিছু না করা” (0°) একটি symmetry, আর প্রতিটির একটি উল্টো আছে (90°-এর উল্টো 270°, প্রতিটি উল্টানোর উল্টো সে নিজেই)। এই তিনটি ধর্ম (আর composition-এর সংযোজন নিয়ম) মানেই একটি group. Group-এর সাধারণ তত্ত্ব, subgroup আর Lagrange-এর উপপাদ্য পর্ব ৭০ “Group — symmetry, cyclic group আর Lagrange-এর উপপাদ্য”-এ আসবে; এই পর্বে শুধু সংজ্ঞা আর দুটি পরিবার লাগবে।

সংজ্ঞা ২.১ (cyclic আর dihedral group)

n ≥ 3 বাহুর সুষম বহুভুজের (বা বৃত্তে n-টি পুঁতির) symmetry:

  • Cn: শুধু n-টি rotation e, r, r2, …, rn−1, যেখানে r মানে 360°/n ঘোরানো আর e মানে কিছু না করা। এটি একটি cyclic group, |Cn| = n.
  • Dn: n-টি rotation আর n-টি reflection মিলে dihedral group, |Dn| = 2n. বর্গের group D4, আকার ৮।

একটি permutation-কে লেখার সবচেয়ে কাজের উপায় তার cycle decomposition: কোন উপাদান কোথায় যায় তা অনুসরণ করে বৃত্তগুলো লেখা। 90° ঘোরানো (1 2 3 4): 1 যায় 2-এ, 2 যায় 3-এ, …, 4 ফেরে 1-এ, একটি দৈর্ঘ্য-৪ cycle. 180° ঘোরানো (1 3)(2 4): দুটি দৈর্ঘ্য-২ cycle. কর্ণ 1–3 বরাবর উল্টানো (1)(3)(2 4): 1 আর 3 স্থির (দৈর্ঘ্য-১ cycle), 2 আর 4 অদলবদল। কেন cycle এত গুরুত্বপূর্ণ, তা §৪-এ স্পষ্ট হবে: একটি symmetry-তে অপরিবর্তিত রং-করায় প্রতিটি cycle-এর সব পুঁতি একই রঙের।

1e: কিছু না করা2r, r³: 90°, 270°3r²: 180°4কর্ণ বরাবর উল্টানো ×25মধ্যরেখা বরাবর ×26সব মিলিয়ে cycle index7k = 2: (16+16+12+4)/8
কোণ 1, 2, 3, 4-এর ওপর
symmetry
cycle
পদ
মোট
  1. পরিচয় (identity). e কোনো কোণ সরায় না: (1)(2)(3)(4), চারটি দৈর্ঘ্য-১ cycle. দৈর্ঘ্য i-এর একটি cycle-কে xi চিহ্নে লিখলে পদ x14.
  2. Quarter turn. 90° ঘোরানো (1 2 3 4), 270° ঘোরানো (1 4 3 2): দুটিই একটি দৈর্ঘ্য-৪ cycle, তাই দুটি মিলে 2x4.
  3. Half turn. 180° ঘোরানো 1 ↔ 3 আর 2 ↔ 4: (1 3)(2 4), পদ x22.
  4. কর্ণ বরাবর উল্টানো। 1–3 কর্ণের অক্ষে 1 আর 3 স্থির, 2 ↔ 4: (1)(3)(2 4). অন্য কর্ণে (2)(4)(1 3). দুটি মিলে 2x12x2.
  5. মধ্যরেখা বরাবর উল্টানো। খাড়া রেখায় 1 ↔ 2, 3 ↔ 4; আড়াআড়ি রেখায় 1 ↔ 4, 2 ↔ 3. কোনো কোণ স্থির নয়: দুটি মিলে 2x22. মোট ৮টি symmetry গোনা শেষ।
  6. Cycle index. সব পদ যোগ করে |G| = 8 দিয়ে ভাগ: Z(D4) = (x14 + 2x12x2 + 3x22 + 2x4)/8. এখানে x22-এর তিনটি এসেছে 180° ঘোরানো আর দুই মধ্যরেখা থেকে।
  7. প্রথম ব্যবহার। §৪-এ দেখবেন, প্রতিটি xi-এর জায়গায় রঙের সংখ্যা k বসালে আলাদা সাজের সংখ্যা আসে। k = 2-এ (16 + 2·8 + 3·4 + 2·2)/8 = 48/8 = 6; k = 3-এ 168/8 = 21 (scratch-এ brute force দিয়ে মেলানো)।

৩ · Group action, orbit আর stabilizer

Symmetry-গুলো শুধু কোণ নয়, রং-করাকেও সরায়: 90° ঘোরালে 0011 হয় 1001. সাধারণভাবে বলতে আমরা একটি group G আর একটি সেট X (যেমন সব রং-করা) নিই, আর বলি G-এর প্রতিটি উপাদান X-এর উপাদানগুলোকে সরায়।

সংজ্ঞা ৩.১ (group action, orbit, stabilizer)

G একটি group আর X একটি সেট। X-এর ওপর G-এর একটি group action মানে প্রতিটি g ∈ G আর x ∈ X-এর জন্য একটি উপাদান g·x ∈ X, যাতে (ক) e·x = x, আর (খ) g·(h·x) = (gh)·x. তখন

  • x-এর orbit: Orb(x) = {g·x : g ∈ G}, অর্থাৎ x থেকে কোনো symmetry দিয়ে যত বস্তু পাওয়া যায়।
  • x-এর stabilizer: Gx = {g ∈ G : g·x = x}, অর্থাৎ যে symmetry-গুলো x-কে বদলায় না।
  • g-এর স্থির সেট: Fix(g) = {x ∈ X : g·x = x}, অর্থাৎ g যে বস্তুগুলোকে বদলায় না।

উদাহরণ (C4, ৪ পুঁতি): Orb(0011) = {0011, 0110, 1100, 1001}, আর তার stabilizer শুধু {e}. Orb(0101) = {0101, 1010}, stabilizer {e, r2}, কারণ 180° ঘোরালে 0101 বদলায় না। Fix(r2) = {0000, 0101, 1010, 1111}: যে string-এ পুঁতি 1 = পুঁতি 3 আর পুঁতি 2 = পুঁতি 4. খেয়াল করুন, “ঘোরালে মেলে এমন দুটি মালা একই” কথাটির নির্ভুল রূপ: একই orbit-এ থাকা দুটি রং-করা একই মালা। তাই আলাদা মালার সংখ্যা = orbit-এর সংখ্যা।

উপপাদ্য ৩.২ (orbit-গুলো X-কে ভাগ করে)

x ~ y সম্পর্কটি, যার অর্থ “কোনো g ∈ G-এর জন্য g·x = y”, একটি equivalence relation; তার শ্রেণিগুলোই orbit, তাই orbit-গুলো পরস্পর বিচ্ছিন্ন আর মিলে পুরো X.

  1. Reflexive: e·x = x, তাই x ~ x. — action-এর শর্ত (ক)
  2. Symmetric: g·x = y হলে g−1·y = g−1·(g·x) = (g−1g)·x = e·x = x, তাই y ~ x. — শর্ত (খ) আর উল্টোর অস্তিত্ব
  3. Transitive: g·x = y আর h·y = z হলে (hg)·x = h·(g·x) = z, তাই x ~ z. ∎ — শর্ত (খ)

Equivalence relation আর partition-এর সাধারণ সম্পর্ক পর্ব ৫৫ “Equivalence relation আর partition”-এ বিস্তারিত আসবে; এখানে শুধু এটুকু লাগে যে প্রতিটি রং-করা ঠিক একটি orbit-এ পড়ে।

উপপাদ্য ৩.৩ (orbit–stabilizer উপপাদ্য)

G সসীম হলে প্রতিটি x ∈ X-এর জন্য

|Orb(x)| · |Gx| = |G|

  1. প্রতিটি g ∈ G-কে তার ফল g·x অনুযায়ী দলে ভাগ করুন। ফলগুলো ঠিক Orb(x)-এর উপাদান, তাই দল আছে |Orb(x)|-টি, আর দলগুলো মিলে পুরো G. — orbit-এর সংজ্ঞা
  2. y ∈ Orb(x) নিন, আর এমন একটি h বাছুন যাতে h·x = y. দাবি: y-এর দল ঠিক {hs : s ∈ Gx}. — দলের বর্ণনা
  3. s ∈ Gx হলে (hs)·x = h·(s·x) = h·x = y, তাই hs দলটিতে আছে। উল্টো দিকে g·x = y হলে s = h−1g-এর জন্য s·x = h−1·y = x, তাই s ∈ Gx আর g = hs. — শর্ত (খ)
  4. s ↦ hs একটি bijection, কারণ hs = hs′ হলে বাঁ দিকে h−1 গুণ করে s = s′. তাই প্রতিটি দলের আকার |Gx|. — bijection, পর্ব ১৬
  5. |Orb(x)|-টি দল, প্রতিটির আকার |Gx|, তাই |G| = |Orb(x)| · |Gx|. ∎ — গুণের নিয়ম

যাচাই: C4-এ 0101-এর orbit আকার 2, stabilizer আকার 2, গুণফল 4 = |C4|. 0000-এর orbit আকার 1, stabilizer পুরো group, গুণফল 4. এ থেকেই একটি কাজের ফল: orbit-এর আকার সবসময় |G|-এর একটি উৎপাদক। কিউবের ২৪টি rotation-এ একটি তলের orbit হলো ৬টি তল, তাই একটি তলের stabilizer-এ 24/6 = 4টি rotation: ওই তলের কেন্দ্র দিয়ে যাওয়া অক্ষে 0°, 90°, 180°, 270°.

৪ · Burnside-এর lemma — double counting-এ এক লাইনের প্রমাণ

এখন মূল উপপাদ্য। §১-এর সমস্যা ছিল orbit-গুলোর আকার অসমান। Orbit–stabilizer বলে, ছোট orbit মানে বড় stabilizer, অর্থাৎ ছোট শ্রেণির বস্তু বেশি symmetry-তে স্থির থাকে। এই দুটি প্রভাব ঠিক একে অন্যকে কাটে।

উপপাদ্য ৪.১ (Burnside-এর lemma)

সসীম group G একটি সসীম সেট X-এর ওপর কাজ করলে orbit-এর সংখ্যা

|X/G| = (1/|G|) ∑g∈G |Fix(g)|

অর্থাৎ আলাদা শ্রেণির সংখ্যা = প্রতিটি symmetry গড়ে কয়টি বস্তুকে অপরিবর্তিত রাখে।

  1. সেট P = {(g, x) ∈ G × X : g·x = x} দুইভাবে গুনি। — double counting, পর্ব ৩৭
  2. প্রথমে g ধরে: প্রতিটি g-এর সঙ্গে জোড়া x-গুলো ঠিক Fix(g), তাই |P| = ∑g |Fix(g)|. — Fix-এর সংজ্ঞা
  3. এবার x ধরে: প্রতিটি x-এর সঙ্গে জোড়া g-গুলো ঠিক Gx, তাই |P| = ∑x |Gx| = ∑x |G|/|Orb(x)|. — উপপাদ্য ৩.৩
  4. যোগফলটি orbit অনুযায়ী ভাগ করুন। একটি orbit O-এর প্রতিটি x-এ |Orb(x)| = |O|, আর O-তে |O|-টি x, তাই O-এর অবদান |O| · |G|/|O| = |G|. — উপপাদ্য ৩.২
  5. প্রতিটি orbit ঠিক |G| যোগ করে, তাই |P| = |G| · |X/G|. ধাপ ২-এর সঙ্গে মিলিয়ে |G| দিয়ে ভাগ করলে উপপাদ্য। ∎ — দুই গণনা সমান

ধাপ ৪-ই আসল কৌশল: একটি orbit-এর বস্তু যত কম, প্রত্যেকের stabilizer তত বড়, আর গুণফল সবসময় |G|. তাই সরল ভাগে যে অসমতা ভুল ঘটাত, এখানে তা নিজেই শোধ হয়ে যায়। এবার §১-এর ৪ পুঁতির মালায় খাটাই।

1G = C₄ = {e, r, r², r³}2|Fix(e)| = 2⁴ = 163|Fix(r)| = 24|Fix(r²)| = 2² = 45|Fix(r³)| = 26(16+2+4+2)/4 = 6
X = ১৬টি string
g
cycle
Fix(g)
যোগফল
  1. সেট আর group. X = {0, 1}4, ১৬টি string; G = C4, চারটি rotation. Burnside অনুযায়ী উত্তর = চারটি |Fix(g)|-এর গড়।
  2. e. কিছু না করা প্রতিটি string অপরিবর্তিত রাখে: |Fix(e)| = 16. চারটি দৈর্ঘ্য-১ cycle, প্রতিটির রং আলাদাভাবে বাছা যায়।
  3. r (90°). r-এর একটিই cycle (1 2 3 4). r·s = s হলে পুঁতি 1-এর রং 2-এ, 2-এর রং 3-এ গেছে, অথচ string একই, তাই চারটি পুঁতি একই রঙের: শুধু 0000 আর 1111.
  4. r² (180°). দুটি cycle (1 3)(2 4): পুঁতি 1 = পুঁতি 3 আর পুঁতি 2 = পুঁতি 4. প্রতিটি cycle-এর রং আলাদাভাবে বাছা যায়, তাই 22 = 4: 0000, 0101, 1010, 1111.
  5. r³ (270°). r-এর মতোই একটি দৈর্ঘ্য-৪ cycle, তাই আবার 2. যোগফল এখন 16 + 2 + 4 + 2 = 24.
  6. গড়। 24/4 = 6, §১-এর সারণির ছয়টি শ্রেণি: 0000, 0001, 0011, 0101, 0111, 1111. সরল ভাগ 16/4 = 4 ভুল ছিল; Burnside-এর যোগফলে 0101-এর মতো ছোট orbit-এর “ঘাটতি” r2-এর অতিরিক্ত স্থির বিন্দুতে পূরণ হয়েছে।

Stepper-এর ধাপ ৩–৪-এ যে নিয়ম কাজ করেছে, সেটি সাধারণভাবে সত্য, আর এটিই এই পর্বের সব হিসাবের চাবি:

Lemma ৪.২ (স্থির রং-করা = cycle-প্রতি এক রং)

G যদি পুঁতি (বা তল, বা কোণ)-গুলোর permutation হিসেবে কাজ করে, আর g-এর cycle decomposition-এ c(g)-টি cycle থাকে, তাহলে k রঙে |Fix(g)| = kc(g).

  1. g একটি রং-করাকে অপরিবর্তিত রাখে যদি এবং কেবল যদি প্রতিটি পুঁতি i-এর রং = g(i)-এর রং। — g·x = x-এর অর্থ
  2. একটি cycle (i, g(i), g2(i), …) বরাবর এই সমতা পরপর খাটালে cycle-এর সব পুঁতি একই রঙের; উল্টো দিকে প্রতিটি cycle এক রঙের হলে শর্তটি মেটে। — cycle বরাবর induction
  3. Cycle-গুলো পুঁতিগুলোকে ভাগ করে, আর প্রতিটির রং স্বাধীনভাবে k উপায়ে বাছা যায়, তাই kc(g). ∎ — গুণের নিয়ম

৫ · Necklace-এর সূত্র — Euler-এর φ কেন আসে

এখন যেকোনো n আর k-এর জন্য necklace গুনি। Lemma ৪.২ অনুযায়ী শুধু জানতে হবে প্রতিটি rotation-এর কয়টি cycle.

Lemma ৫.১ (rotation-এর cycle)

বৃত্তে n-টি পুঁতিতে s ধাপ ঘোরানো rs (0 ≤ s < n)-এর ঠিক gcd(s, n)-টি cycle, প্রতিটির দৈর্ঘ্য n/gcd(s, n). (এখানে gcd(0, n) = n.)

  1. পুঁতিগুলোকে 0, 1, …, n − 1 ধরুন; rs পুঁতি i-কে পাঠায় i + s (mod n)-এ। i-এর cycle হলো i, i + s, i + 2s, … (mod n). — পর্ব ২২-এর modular arithmetic
  2. cycle-এর দৈর্ঘ্য সবচেয়ে ছোট m ≥ 1, যাতে ms ≡ 0 (mod n), অর্থাৎ n ∣ ms. g = gcd(s, n) হলে এটি (n/g) ∣ m(s/g)-এর সমান, আর gcd(n/g, s/g) = 1 বলে (n/g) ∣ m. তাই m = n/g. — Euclid-এর lemma
  3. প্রতিটি cycle-এর দৈর্ঘ্য n/g, মোট পুঁতি n, তাই cycle-এর সংখ্যা n/(n/g) = g. ∎ — ভাগ
উপপাদ্য ৫.২ (necklace গণনা)

n-টি পুঁতি আর k-টি রঙের আলাদা necklace (শুধু rotation-কে একই ধরে)-এর সংখ্যা

N(n, k) = (1/n) ∑d∣n φ(d) · kn/d

এখানে φ(d) হলো 1 থেকে d-এর মধ্যে d-এর সঙ্গে সহমৌলিক সংখ্যার সংখ্যা (পর্ব ২৪), আর যোগ চলে n-এর সব ধনাত্মক উৎপাদক d-এর ওপর।

  1. Burnside আর lemma ৪.২, ৫.১ মিলিয়ে N(n, k) = (1/n) ∑s=0n−1 kgcd(s, n). — উপপাদ্য ৪.১
  2. s-গুলোকে g = gcd(s, n) অনুযায়ী দলে ভাগ করুন। gcd(s, n) = g মানে s = gt, যেখানে 0 ≤ t < n/g আর gcd(t, n/g) = 1; এমন t ঠিক φ(n/g)-টি। — φ-এর সংজ্ঞা
  3. তাই যোগফল ∑g∣n φ(n/g) kg. d = n/g বসালে d-ও n-এর সব উৎপাদকের ওপর চলে, আর যোগফল ∑d∣n φ(d) kn/d. ∎ — সূচক বদল

উদাহরণ। n = 6, k = 2: উৎপাদক 1, 2, 3, 6; φ = 1, 1, 2, 2. N = (26 + 23 + 2 · 22 + 2 · 21)/6 = (64 + 8 + 8 + 4)/6 = 84/6 = 14. n যদি মৌলিক p হয়, উৎপাদক শুধু 1 আর p: N(p, k) = (kp + (p − 1)k)/p. যেমন ৫ পুঁতি, ৩ রঙে (243 + 12)/5 = 51. এই সূত্র পূর্ণসংখ্যা দিতে বাধ্য, আর তা থেকে একটি পুরোনো বন্ধুর নতুন প্রমাণ বেরোয় (অনুশীলন ১)।

§৬-এর শেষে একটি Python ব্লক necklace আর bracelet দুটিরই সূত্র দিয়ে গোনে, আর প্রতিটি string-এর orbit চিহ্নিত করে brute force-এ গুনে মেলায়।

৬ · Bracelet — উল্টানোও যখন চলে

মালাটি যদি হাতে নিয়ে উল্টানোও যায় (যেমন একটি চুড়ি বা bracelet), তখন group হয় Dn: n-টি rotation আর n-টি reflection. Rotation-এর অবদান উপপাদ্য ৫.২-এর যোগফলই, নতুন শুধু reflection-এর cycle গোনা।

  • n বিজোড়: প্রতিটি reflection-এর অক্ষ একটি পুঁতি আর তার বিপরীত দুই পুঁতির মাঝখান দিয়ে যায়। একটি পুঁতি স্থির, বাকি n − 1টি জোড়ায় অদলবদল: (n + 1)/2টি cycle. n-টি reflection মিলে n · k(n+1)/2.
  • n জোড়: দুই রকম reflection. n/2টির অক্ষ দুটি বিপরীত পুঁতির মধ্য দিয়ে: ২টি স্থির, বাকি (n − 2)/2 জোড়া, মোট n/2 + 1টি cycle. বাকি n/2টির অক্ষ দুই বাহুর মধ্যবিন্দু দিয়ে: কোনো পুঁতি স্থির নয়, n/2টি জোড়া। মিলে (n/2)(kn/2+1 + kn/2).

B(n, k) = [n · N(n, k) + (reflection-এর অবদান)] / (2n)

বর্গে (n = 4) এই দুই রকম reflection-ই §২-এর stepper-এ দেখেছেন: কর্ণ (দুই কোণ স্থির) আর মধ্যরেখা (কোনো কোণ স্থির নয়)। n = 6, k = 2: rotation-এর যোগফল 84, reflection-এর 3 · 24 + 3 · 23 = 48 + 24 = 72, তাই B = 156/12 = 13. Necklace ১৪টি থেকে একটি কমল: 001011 আর তার আয়না-রূপ 001101 rotation-এ আলাদা, কিন্তু উল্টালে একই।

নিচের ব্লক দুটি সূত্রই brute force-এর সঙ্গে মেলায়। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে; পরের ব্লকগুলো দ্রুত চলে।

from itertools import product
from math import gcd
def phi(n):
    return sum(1 for i in range(1, n + 1) if gcd(i, n) == 1)
def necklace(n, k):                    # Burnside over the n rotations
    return sum(phi(d) * k ** (n // d)
               for d in range(1, n + 1) if n % d == 0) // n

def bracelet(n, k):                    # Burnside over the 2n symmetries
    if n % 2:
        refl = n * k ** ((n + 1) // 2)
    else:
        refl = n // 2 * (k ** (n // 2 + 1) + k ** (n // 2))
    return (n * necklace(n, k) + refl) // (2 * n)

def brute(n, k, flip):                 # walk every string, mark its orbit
    seen, orbits = set(), 0
    for s in product(range(k), repeat=n):
        if s not in seen:
            orbits += 1
            for r in range(n):
                t = s[r:] + s[:r]
                seen.add(t)
                if flip:
                    seen.add(t[::-1])
    return orbits

for k, top in ((2, 10), (3, 7)):
    print("k =", k)
    for n in range(1, top + 1):
        a, b = necklace(n, k), brute(n, k, False)
        c, d = bracelet(n, k), brute(n, k, True)
        print(f"  n={n:2}  necklace {a:4} brute {b:4}"
              f"   bracelet {c:4} brute {d:4}  ok={a == b and c == d}")

আসল আউটপুট (ব্রাউজারের Python):

k = 2
  n= 1  necklace    2 brute    2   bracelet    2 brute    2  ok=True
  n= 2  necklace    3 brute    3   bracelet    3 brute    3  ok=True
  n= 3  necklace    4 brute    4   bracelet    4 brute    4  ok=True
  n= 4  necklace    6 brute    6   bracelet    6 brute    6  ok=True
  n= 5  necklace    8 brute    8   bracelet    8 brute    8  ok=True
  n= 6  necklace   14 brute   14   bracelet   13 brute   13  ok=True
  n= 7  necklace   20 brute   20   bracelet   18 brute   18  ok=True
  n= 8  necklace   36 brute   36   bracelet   30 brute   30  ok=True
  n= 9  necklace   60 brute   60   bracelet   46 brute   46  ok=True
  n=10  necklace  108 brute  108   bracelet   78 brute   78  ok=True
k = 3
  n= 1  necklace    3 brute    3   bracelet    3 brute    3  ok=True
  n= 2  necklace    6 brute    6   bracelet    6 brute    6  ok=True
  n= 3  necklace   11 brute   11   bracelet   10 brute   10  ok=True
  n= 4  necklace   24 brute   24   bracelet   21 brute   21  ok=True
  n= 5  necklace   51 brute   51   bracelet   39 brute   39  ok=True
  n= 6  necklace  130 brute  130   bracelet   92 brute   92  ok=True
  n= 7  necklace  315 brute  315   bracelet  198 brute  198  ok=True

প্রতিটি সারিতে সূত্র আর brute force মিলেছে, তাই শেষ ঘরে ok=True লেখা। Brute force প্রতিটি string থেকে শুরু করে তার সব rotation (আর bracelet-এ সেগুলোর উল্টো রূপ) “দেখা হয়েছে” চিহ্ন দেয়; নতুন অদেখা string পেলেই একটি নতুন orbit. ৪ আর ৬ পুঁতির উত্তর (৬, ১৪, ১৩) ওপরের হাতের হিসাবের সঙ্গে মেলে। ৫ পুঁতি পর্যন্ত necklace আর bracelet সমান (k = 2-এ), কারণ এত ছোট মালায় প্রতিটি সাজ তার আয়না-রূপের কোনো rotation; ৬ পুঁতিতে প্রথম পার্থক্য। Brute force knটি string ছোঁয়; n = 30-এ তা প্রায় ১০৭ কোটি, কিন্তু সূত্রটি মুহূর্তে N(30, 2) = 35792568 দেয়।

৭ · কিউবের তল রং করা — ২৪টি rotation

বাজারঘর উপহারের বাক্স বানায় কিউব আকারে, প্রতিটি তল লাল বা নীল কাগজে মোড়া। বাক্সটি হাতে ঘোরানো যায় (কিন্তু আয়নায় উল্টানো যায় না), তাই ঘোরালে মেলে এমন দুটি বাক্স একই। আলাদা বাক্স কয়টি? সেট X = ছয় তলের সব রং-করা (k6টি), আর G = কিউবের rotation group.

প্রথমে |G|: উপরের তলটি ৬টি তলের যেকোনোটিতে যেতে পারে, আর তারপর ওই অক্ষে ৪ রকম ঘোরানো যায়, তাই 6 · 4 = 24. (Orbit–stabilizer-এর ভাষায়: একটি তলের orbit ৬, stabilizer ৪।) ২৪টি rotation-কে অক্ষ অনুযায়ী সাজালে:

Rotation-এর ধরনসংখ্যাছয় তলের ওপর cycleপদk = 2-এ Fix
কিছু না করা1৬টি স্থিরx1664
বিপরীত তলের কেন্দ্র দিয়ে অক্ষ, 90° বা 270° (৩ অক্ষ × ২)6অক্ষের ২ তল স্থির, পাশের ৪টি একটি cyclex12x48
একই অক্ষ, 180° (৩ অক্ষ)3২ তল স্থির, পাশের ৪টি দুই জোড়াx12x2216
বিপরীত দুই কোণ দিয়ে অক্ষ, 120° বা 240° (৪ অক্ষ × ২)8একটি কোণ ঘিরে ৩ তল, বিপরীত কোণ ঘিরে ৩ তলx324
বিপরীত দুই বাহুর মধ্যবিন্দু দিয়ে অক্ষ, 180° (৬ অক্ষ)6তিন জোড়া তল অদলবদলx238

সংখ্যাগুলো যোগ করলে 1 + 6 + 3 + 8 + 6 = 24, তাই কোনো rotation বাদ পড়েনি। Lemma ৪.২ অনুযায়ী প্রতিটি পদে xi-এর জায়গায় k বসালেই |Fix|, আর Burnside দেয়

কিউবের তল k রঙে = (k6 + 3k4 + 12k3 + 8k2) / 24

এখানে 12k3 এসেছে দুই জায়গা থেকে: quarter turn-এর ৬টি (x12x4, তিনটি cycle) আর বাহু-অক্ষের ৬টি (x23, তিনটি cycle) থেকে।

1e: 2⁶ = 642তল-অক্ষ 90°/270°: 6 × 2³3তল-অক্ষ 180°: 3 × 2⁴4কোণ-অক্ষ: 8 × 2²5বাহু-অক্ষ: 6 × 2³6240 / 24 = 107লাল তল অনুযায়ী ভাগ
k = 2 (লাল, নীল)
rotation
cycle
অবদান
যোগফল
  1. Identity. কিছু না করা সব 26 = 64টি রং-করা স্থির রাখে।
  2. Quarter turn. তল-অক্ষে 90° বা 270°: অক্ষের দুই তল স্থির, চারপাশের চার তল একটি cycle. মোট ৩টি cycle, তাই 23 = 8; এমন rotation ৬টি, অবদান 48. যোগফল 112.
  3. Half turn (তল-অক্ষ). দুই তল স্থির, পাশের চারটি দুই জোড়া (সামনে ↔ পেছনে, বাঁ ↔ ডান): ৪টি cycle, 24 = 16; ৩টি rotation, অবদান 48. যোগফল 160.
  4. কোণ-অক্ষ. 120° বা 240°: একটি কোণ ঘিরে থাকা তিন তল ঘুরে যায়, বিপরীত কোণের তিনটিও। ২টি cycle, 22 = 4; ৮টি rotation, অবদান 32. যোগফল 192.
  5. বাহু-অক্ষ. বিপরীত দুই বাহুর মধ্যবিন্দু দিয়ে 180°: কোনো তল স্থির নয়, তিন জোড়া অদলবদল; ৩টি cycle, 23 = 8; ৬টি rotation, অবদান 48. যোগফল 240.
  6. গড়। 240/24 = 10টি আলাদা বাক্স। একই সূত্রে k = 3 দিলে (729 + 243 + 324 + 72)/24 = 1368/24 = 57.
  7. যাচাই। লাল তলের সংখ্যা ০, ১, …, ৬ অনুযায়ী ভাগে 1, 1, 2, 2, 2, 1, 1টি বাক্স। দুটি লাল তল হয় পাশাপাশি নয়তো মুখোমুখি (২টি); তিনটি লাল তল হয় এক কোণ ঘিরে নয়তো একটি “ফিতা” বরাবর (২টি)। যোগফল ১০। ভাগটি কীভাবে সরাসরি গোনা যায়, তা §৮-এ।

টেবিলটি হাতে বানানো, তাই ভুল হতে পারে। নিচের ব্লক টেবিলটিকে নিজেই আবিষ্কার করে: দুটি quarter turn থেকে শুরু করে তাদের সব composition নিয়ে group-টি তৈরি করে (যতক্ষণ নতুন rotation আসে), প্রতিটির cycle গোনে, তারপর Burnside আর brute force মেলায়।

from itertools import product
from collections import Counter
# faces: 0 Up, 1 Down, 2 Front, 3 Back, 4 Left, 5 Right
a = (0, 1, 5, 4, 2, 3)        # quarter turn about the Up-Down axis
b = (5, 4, 2, 3, 0, 1)        # quarter turn about the Front-Back axis
def compose(p, q):
    return tuple(p[q[i]] for i in range(6))
def cycles(p):                 # cycle lengths of a permutation
    seen, out = set(), []
    for i in range(6):
        n, j = 0, i
        while j not in seen:
            seen.add(j); j = p[j]; n += 1
        if n:
            out.append(n)
    return tuple(sorted(out))
G, todo = {tuple(range(6))}, [tuple(range(6))]
while todo:                    # close {a, b} under composition
    g = todo.pop()
    for h in (a, b):
        x = compose(h, g)
        if x not in G:
            G.add(x); todo.append(x)
print("rotations found:", len(G))
for t, m in sorted(Counter(cycles(g) for g in G).items()):
    print("  cycle type", t, "x", m)

for k in (2, 3):
    burnside = sum(k ** len(cycles(g)) for g in G) // len(G)
    seen, orbits = set(), 0
    for s in product(range(k), repeat=6):
        if s not in seen:
            orbits += 1
            seen.update(tuple(s[g[i]] for i in range(6)) for g in G)
    print(f"k={k}: Burnside {burnside}, brute force {orbits}")

আসল আউটপুট (ব্রাউজারের Python):

rotations found: 24
  cycle type (1, 1, 1, 1, 1, 1) x 1
  cycle type (1, 1, 2, 2) x 3
  cycle type (1, 1, 4) x 6
  cycle type (2, 2, 2) x 6
  cycle type (3, 3) x 8
k=2: Burnside 10, brute force 10
k=3: Burnside 57, brute force 57

মাত্র দুটি quarter turn থেকে ঠিক ২৪টি rotation তৈরি হয়েছে, আর তাদের cycle-গঠন টেবিলের পাঁচটি সারির সঙ্গে হুবহু মেলে: (1, 1, 4) মানে দুই স্থির তল আর একটি ৪-cycle, (3, 3) মানে কোণ-অক্ষের দুটি ৩-cycle. দুটি তালিকা স্বাধীনভাবে বানানো (একটি হাতে, একটি কোডে), তাই মিল একটি সত্যিকারের যাচাই। শেষ দুই লাইনে Burnside-এর সূত্র আর সব 26 বা 36 রং-করার orbit গুনে পাওয়া সংখ্যা এক: ১০ আর ৫৭। Group তৈরির loop-টি আসলে একটি graph search (DFS): rotation-গুলো vertex, আর a বা b প্রয়োগ একটি edge.

৮ · Pólya-র enumeration উপপাদ্য — রঙের হিসাবসহ গোনা

Burnside মোট সংখ্যা দেয়। কিন্তু বাজারঘরের গুদামে যদি লাল কাগজ মাত্র ৩টি তলের মতো থাকে? তখন প্রশ্ন: ঠিক ৩টি লাল আর ৩টি নীল তলের আলাদা বাক্স কয়টি? Stepper-এর শেষ ধাপে উত্তর ছিল ২, কিন্তু তা তালিকা করে। Pólya-র উপপাদ্য এমন সব প্রশ্নের উত্তর একসঙ্গে একটি generating function-এ দেয় (পর্ব ৪৮ “Generating function — গণনাকে বীজগণিতে রূপান্তর”)।

সংজ্ঞা ৮.১ (cycle index)

G যদি m-টি অবস্থানের (পুঁতি, তল) permutation group হয়, আর g-এর cycle decomposition-এ দৈর্ঘ্য i-এর ci(g)-টি cycle থাকে, তাহলে

ZG(x1, …, xm) = (1/|G|) ∑g∈G x1c1(g) x2c2(g) ⋯ xmcm(g)

উদাহরণ: Z(C4) = (x14 + x22 + 2x4)/4, Z(D4) §২-এর stepper-এ, আর কিউবের তলে Z = (x16 + 3x12x22 + 6x12x4 + 6x23 + 8x32)/24. সব xi = k বসালে lemma ৪.২ অনুযায়ী Burnside-এর উত্তর। এখন আরও সূক্ষ্ম কিছু বসাব।

উপপাদ্য ৮.২ (Pólya-র enumeration উপপাদ্য, রঙের রূপ)

রং r, b, g, … হলে ZG-এ প্রতিটি xi-এর জায়গায় ri + bi + gi + ⋯ বসান। ফলের polynomial-এ rαbβgγ⋯-এর সহগ = ঠিক α-টি r, β-টি b, γ-টি g, … রঙের আলাদা (orbit) রং-করার সংখ্যা। এই polynomial-কে বলে pattern inventory.

  1. রঙের সংখ্যা (α, β, …) নির্দিষ্ট এমন রং-করার সেট Xα,β,… নিন। কোনো symmetry রং বদলায় না, শুধু অবস্থান সরায়, তাই G এই সেটের ওপরই কাজ করে, আর Burnside খাটে: উত্তর = (1/|G|)∑g |Fix(g) ∩ Xα,β,…|. — উপপাদ্য ৪.১
  2. Lemma ৪.২ অনুযায়ী g-স্থির রং-করা মানে প্রতিটি cycle এক রঙের। দৈর্ঘ্য i-এর একটি cycle পুরো r হলে তা i-টি r দেয়, যা ri দিয়ে চিহ্নিত; তাই একটি cycle-এর সব পছন্দের generating function ri + bi + ⋯. — generating function-এ ঘাত = সংখ্যা
  3. Cycle-গুলোর রং স্বাধীন, তাই g-স্থির সব রং-করার generating function ∏i(ri + bi + ⋯)ci(g), আর তার rαbβ⋯-এর সহগ = |Fix(g) ∩ Xα,β,…|. — পর্ব ৪৮-এর গুণফলের নিয়ম
  4. সব g-এর ওপর যোগ করে |G| দিয়ে ভাগ করলে ঠিক xi → ri + bi + ⋯ বসানো ZG, আর ধাপ ১ অনুযায়ী তার প্রতিটি সহগ উত্তর। ∎ — যোগফল অদলবদল

উদাহরণ ১ (৪ পুঁতি, ২ রং)। Z(C4)-এ বসাই: (r + b)4 = r4 + 4r3b + 6r2b2 + 4rb3 + b4; (r2 + b2)2 = r4 + 2r2b2 + b4; 2(r4 + b4). যোগ করে 4 দিয়ে ভাগ:

r4 + r3b + 2r2b2 + rb3 + b4

দুই লাল আর দুই নীলের সহগ 2: §১-এর “পাশাপাশি” আর “মুখোমুখি”। সহগের যোগফল 6, মোট মালার সংখ্যা।

উদাহরণ ২ (কিউব, ৩ লাল ৩ নীল)। r3b3-এর সহগ চাই। x16 → (r + b)6 থেকে C(6, 3) = 20. 3x12x22 → (r + b)2(r2 + b2)2-এ r3b3 আসে শুধু (rb-এর সহগ 2) × (r2b2-এর সহগ 2) = 4 থেকে, তিনগুণে 12. 6x12x4 আর 6x23 থেকে 0 (৩টি r-কে ১ বা ২, আর ৪ বা ২-এর অংশে ভাঙা যায় না: x12x4-এ r-এর ঘাত 0, 1, 2, 4, 5, 6 হতে পারে, 3 নয়; x23-এ শুধু জোড়)। 8x32 → (r3 + b3)2-এ r3b3-এর সহগ 2, আটগুণে 16. মোট (20 + 12 + 16)/24 = 2, stepper-এর তালিকার সঙ্গে মেলে।

উদাহরণ ৩ (৬ পুঁতি, ৩ রং)। বাজারঘরের ৬ তাকের ঘূর্ণায়মান স্ট্যান্ডে ২টি লাল, ২টি নীল আর ২টি সবুজ পণ্য। Rotation rs-এর gcd(s, 6)-টি cycle (lemma ৫.১), তাই Z(C6) = (x16 + x23 + 2x32 + 2x6)/6. r2b2g2-এর সহগ: x16 থেকে multinomial 6!/(2!2!2!) = 90 (পর্ব ৩৫); x23 = (r2 + b2 + g2)3 থেকে তিন রং তিন গুণনীয়কে, 3! = 6; x32 আর x6 থেকে 0 (প্রতিটি রং ৩ বা ৬-এর গুণিতক বার আসত)। উত্তর (90 + 6)/6 = 16.

নিচের ব্লক polynomial-গুলোকে Python dictionary হিসেবে রাখে (key = ঘাতের tuple, value = সহগ), Z(C6)-এ বসিয়ে পুরো pattern inventory বানায়, আর ৩6 = ৭২৯টি রং-করা থেকে orbit গুনে রঙের সংখ্যা অনুযায়ী মেলায়।

from itertools import product
from collections import Counter
from math import gcd
def pmul(p, q):                # polynomials as {(r, b, g) exponents: coeff}
    out = Counter()
    for e1, c1 in p.items():
        for e2, c2 in q.items():
            out[tuple(x + y for x, y in zip(e1, e2))] += c1 * c2
    return out
def power_sum(i, colours=3):   # x_i -> r^i + b^i + g^i
    return Counter({tuple(i if c == j else 0 for c in range(colours)): 1
                    for j in range(colours)})

n = 6                          # rotation r^s has gcd(s, n) cycles of length n/gcd
total = Counter()
for s in range(n):
    c = gcd(s, n)
    term = Counter({(0, 0, 0): 1})
    for _ in range(c):
        term = pmul(term, power_sum(n // c))
    total.update(term)
inventory = {e: v // n for e, v in total.items()}

seen, brute = set(), Counter()  # brute force: orbits sorted by colour counts
for s in product("rbg", repeat=n):
    if s not in seen:
        brute[(s.count("r"), s.count("b"), s.count("g"))] += 1
        seen.update(s[r:] + s[:r] for r in range(n))

print("Polya == brute force:", inventory == dict(brute))
for e in [(6, 0, 0), (5, 1, 0), (4, 2, 0), (3, 3, 0), (4, 1, 1),
          (3, 2, 1), (2, 2, 2)]:
    print("  r^%d b^%d g^%d :" % e, inventory[e])
print("all 6-bead necklaces:", sum(inventory.values()))

আসল আউটপুট (ব্রাউজারের Python):

Polya == brute force: True
  r^6 b^0 g^0 : 1
  r^5 b^1 g^0 : 1
  r^4 b^2 g^0 : 3
  r^3 b^3 g^0 : 4
  r^4 b^1 g^1 : 5
  r^3 b^2 g^1 : 10
  r^2 b^2 g^2 : 16
all 6-bead necklaces: 130

প্রথম লাইন বলে, pattern inventory-র প্রতিটি সহগ (রঙের প্রতিটি সংখ্যা-সমন্বয়ে) brute force-এর সঙ্গে মিলেছে। r2b2g2-এর সহগ 16, হাতের হিসাবের উত্তর। r4b1g1-এর 5 সহজে যাচাই করা যায়: নীল আর সবুজের মাঝে দূরত্ব ১ থেকে ৫ (ঘড়ির কাঁটার দিকে), পাঁচটি সম্ভাবনা। সব সহগের যোগফল 130 = N(6, 3), প্রথম ব্লকের সারণির মান। Pólya-র ফল Burnside-কে ছাপিয়ে যায় না, বরং তাকে রঙ অনুযায়ী ভেঙে দেখায়: সব রং সমান ধরলে (r = b = g = 1) আবার মোট সংখ্যায় ফিরে আসি।

৯ · প্রয়োগ, পরীক্ষার অঙ্ক আর একটি ভুল যুক্তি

প্রয়োগ ১: isomorphism পর্যন্ত graph গোনা

৪টি vertex-এ সম্ভাব্য edge C(4, 2) = 6টি, তাই লেবেলযুক্ত graph 26 = 64টি। কিন্তু vertex-এর নাম বদলালে যে graph মেলে, তারা একই আকৃতি: এটিই graph isomorphism (পর্ব ৫৮ “গ্রাফের representation আর isomorphism”-এ বিস্তারিত)। এখানে X = ৬টি edge-এর রং-করা (আছে / নেই), আর G = ৪টি vertex-এর ২৪টি permutation, যা edge-গুলোকে সরায়। Edge-এর ওপর cycle গুনলে: identity x16; ৬টি transposition আর ৩টি double transposition, প্রতিটি x12x22; ৮টি 3-cycle, x32; ৬টি 4-cycle, x2x4. তাই আলাদা graph (64 + 9 · 16 + 8 · 4 + 6 · 4)/24 = 264/24 = 11.

from itertools import permutations, combinations, product
from collections import Counter

V = 4
E = list(combinations(range(V), 2))          # the 6 possible edges
perms = list(permutations(range(V)))         # the 24 relabellings

def relabel(graph, p):                       # graph = frozenset of edges
    return frozenset(tuple(sorted((p[u], p[v]))) for u, v in graph)

seen, classes = set(), Counter()
for bits in product((0, 1), repeat=len(E)):
    g = frozenset(e for e, x in zip(E, bits) if x)
    if g not in seen:
        classes[len(g)] += 1                 # one new class, by edge count
        seen.update(relabel(g, p) for p in perms)
print("brute force classes by edge count:", sorted(classes.items()))
print("total:", sum(classes.values()))

def n_cycles(p):                             # cycles of p acting on edges
    pe = {e: tuple(sorted((p[e[0]], p[e[1]]))) for e in E}
    seen, c = set(), 0
    for e in E:
        if e not in seen:
            c += 1
            while e not in seen:
                seen.add(e); e = pe[e]
    return c

fix = [2 ** n_cycles(p) for p in perms]
print("Burnside:", sum(fix), "/", len(perms), "=", sum(fix) // len(perms))

আসল আউটপুট (ব্রাউজারের Python):

brute force classes by edge count: [(0, 1), (1, 1), (2, 2), (3, 3), (4, 2), (5, 1), (6, 1)]
total: 11
Burnside: 264 / 24 = 11

৬৪টি লেবেলযুক্ত graph ১১টি শ্রেণিতে পড়ে, আর Burnside-এর যোগফল 264, ঠিক হাতের হিসাব। Edge সংখ্যা অনুযায়ী ভাগ 1, 1, 2, 3, 2, 1, 1 (যেমন ২টি edge: পাশাপাশি বা আলাদা; ৩টি edge: ত্রিভুজ, তারা বা পথ), যা Pólya-তে xi → 1 + yi বসালে আসে। ভাগটি প্রতিসম, কারণ একটি graph-এর complement (যে edge ছিল না সেগুলো) আরেকটি শ্রেণিতে নেয়। Scratch-এ একই পদ্ধতিতে ৫ আর ৬ vertex-এ ৩৪ আর ১৫৬টি শ্রেণি পাওয়া গেছে।

প্রয়োগ ২: রসায়নের isomer (সরলীকৃত)

Benzene বলয়ের ছয়টি কার্বনকে একটি সুষম ষড়ভুজ ধরলে, দুটি হাইড্রোজেনের জায়গায় দুটি ক্লোরিন বসানোর আলাদা উপায় D6-এর orbit গুনে পাওয়া যায়: C(6, 2) = 15টি অবস্থান-জোড়া ৩টি orbit-এ পড়ে (পাশাপাশি, একটি ফাঁক, মুখোমুখি), যা রসায়নে পরিচিত dichlorobenzene-এর তিনটি গঠন-isomer (ortho, meta, para) বলে মেলে। এটি একটি সরলীকৃত মডেল: বাস্তব রসায়নে বন্ধনের ধরন আর ত্রিমাত্রিক গঠন (stereoisomer) হিসাবে আসে, যা শুধু ছবির symmetry গুনে ধরা যায় না। Pólya তাঁর ১৯৩৭ সালের প্রবন্ধে রাসায়নিক যৌগ গোনার উদাহরণ ব্যবহার করেছিলেন বলে জানা যায়।

অঙ্ক ১: Necklace আর bracelet

৫টি পুঁতি, ৩ রঙে কয়টি necklace আর কয়টি bracelet?

  1. ৫ মৌলিক: N(5, 3) = (35 + 4 · 3)/5 = (243 + 12)/5 = 51.
  2. ৫ বিজোড়, প্রতিটি reflection-এ (5 + 1)/2 = 3টি cycle: ৫টি reflection মিলে 5 · 27 = 135.
  3. B(5, 3) = (5 · 51 + 135)/10 = (255 + 135)/10 = 39. উত্তর: ৫১টি necklace, ৩৯টি bracelet (প্রথম Python ব্লকে মেলানো)।

অঙ্ক ২: বর্গের কোণ তিন রঙে

একটি বর্গাকার টেবিলের চার কোণে চারটি চেয়ার, প্রতিটি তিন রঙের একটিতে রং করা হবে; টেবিল ঘোরানো আর উল্টানো দুটিই চলে। আলাদা সাজ কয়টি? Z(D4)-এ xi = 3: (81 + 2 · 9 · 3 + 3 · 9 + 2 · 3)/8 = (81 + 54 + 27 + 6)/8 = 168/8 = 21. শুধু ঘোরানো চললে N(4, 3) = (81 + 9 + 2 · 3)/4 = 96/4 = 24.

অঙ্ক ৩: কিউব, তিন রং

তিন রঙে কিউবের তল (শুধু rotation): (36 + 3 · 34 + 12 · 33 + 8 · 32)/24 = (729 + 243 + 324 + 72)/24 = 1368/24 = 57. ভাগফল পূর্ণসংখ্যা না এলে নিশ্চিতভাবে কোথাও ভুল হয়েছে: এটি Burnside-এর হিসাবের সবচেয়ে সস্তা পরীক্ষা।

যুক্তির ভুল ধরুন: “orbit সমান আকারের”

একজন লিখলেন: “৬ পুঁতি, ২ রঙের necklace: মোট 26 = 64টি string, আর প্রতিটি necklace ৬টি rotation থেকে আসে। তাই উত্তর 64/6 ≈ 10.67, অর্থাৎ প্রায় ১১টি।”

ভুল কোথায়: “প্রতিটি necklace ঠিক ৬টি string থেকে আসে” দাবিটি মিথ্যা। 000000-এর orbit-এ ১টি string, 010101-এর orbit-এ ২টি, 001001-এর orbit-এ ৩টি। Orbit–stabilizer অনুযায়ী orbit-এর আকার 6-এর যেকোনো উৎপাদক হতে পারে। ভাগফল পূর্ণসংখ্যা না হওয়াই সতর্কসংকেত, আর “কাছের পূর্ণসংখ্যায় গোল করা” কোনো গাণিতিক যুক্তি নয়। সঠিক উত্তর Burnside দিয়ে 84/6 = 14; ভুল ধারণাটি পর্ব ৩৩-এর গোল টেবিলের ভাগের নিয়ম থেকে এসেছে, যেখানে সব মানুষ আলাদা বলে সব orbit-এর আকার সত্যিই n.

আরও গভীরে: Pólya-র উপপাদ্যের একটি পূর্বসূরি J. H. Redfield ১৯২৭ সালেই প্রকাশ করেছিলেন বলে জানা যায়, যা বহু বছর প্রায় অজানা ছিল। N. G. de Bruijn ১৯৫০-এর দশকের শেষে উপপাদ্যটিকে এমনভাবে বাড়ান, যাতে রঙগুলোরও একটি symmetry থাকে (যেমন লাল আর নীল অদলবদল করলেও একই ধরা)। আরও উঁচু স্তরে আছে combinatorial species-এর তত্ত্ব (André Joyal, ১৯৮০-এর দশকের শুরু), যেখানে cycle index একটি সাধারণ হাতিয়ার; আর কম্পিউটারে বড় group-এর orbit গোনা computational group theory-র একটি বড় বিষয়, যার জন্য GAP-এর মতো মুক্ত সফটওয়্যার আছে।

পরীক্ষা ও ইন্টারভিউতে: বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই ধরনের প্রশ্ন প্রায়ই আসে:

  • ৪ পুঁতি, ২ রঙের necklace কয়টি? ৬টি: (16 + 2 + 4 + 2)/4.
  • Burnside-এর lemma-র বক্তব্য? Orbit-এর সংখ্যা = (1/|G|)∑|Fix(g)|, অর্থাৎ স্থির বিন্দুর গড়।
  • কিউবের rotation group-এর আকার আর দুই রঙে তল রং করার উপায়? ২৪; ১০টি।
  • ৬ পুঁতি, ২ রঙে necklace আর bracelet? ১৪ আর ১৩।
  • n-টি পুঁতিতে s ধাপ ঘোরানোর কয়টি cycle? gcd(s, n)টি, প্রতিটি দৈর্ঘ্য n/gcd(s, n).

১০ · AI-এর যুগে — symmetry গণনার উত্তর যাচাই

Symmetry-র গণনায় AI সহকারী প্রায়ই সূত্রটি ঠিক লেখে, কিন্তু প্রয়োগে ভুল করে, আর সেই ভুল আত্মবিশ্বাসী ভাষায় আসে। কয়েকটি নিয়মিত ভুল:

AI-এর ভুলকীভাবে ধরবেন
মোট বস্তুকে symmetry-র সংখ্যা দিয়ে সরাসরি ভাগছোট orbit আছে কি না দেখুন (সব এক রঙের বস্তু); ভাগফল পূর্ণসংখ্যা কি না দেখুন
Group-এর কিছু উপাদান বাদ দেওয়া (যেমন কিউবের ২৪টির জায়গায় ২০টি গোনা)ধরনগুলোর সংখ্যা যোগ করে |G| মেলান
প্রশ্নে উল্টানো চলে কি না না দেখে rotation আর reflection মিশিয়ে ফেলাপ্রশ্নটি আবার পড়ুন: necklace না bracelet, কিউব হাতে না আয়নায়
জোড় n-এ সব reflection-কে একই ধরনের ধরাঅক্ষ পুঁতি দিয়ে না বাহুর মধ্যবিন্দু দিয়ে, আলাদা করে গুনুন
উপপাদ্যের নাম আর ইতিহাস নিশ্চিত সুরে বলা, বা অস্তিত্বহীন উৎস দেখানোবিশ্বস্ত পাঠ্যবই বা মূল প্রবন্ধে মেলান

AI-এর কাছে symmetry গণনার সমাধান চাইলে এমন কাঠামো দিন, যাতে প্রতিটি ধাপ আলাদা করে যাচাই করা যায়:

নিচের গণনাটি Burnside-এর lemma দিয়ে ধাপে ধাপে করো: প্রশ্ন: [যেমন ৬টি পুঁতির মালা, ৩টি রং, ঘোরানো আর উল্টানো দুটিই চলে] ১. সেট X কী আর group G কী, |G| কত, স্পষ্ট লেখো। ২. G-এর উপাদানগুলোকে ধরন অনুযায়ী একটি সারণিতে দাও: প্রতিটি ধরনের সংখ্যা, cycle-গঠন আর |Fix|। ৩. ধরনগুলোর সংখ্যা যোগ করে |G| মিলেছে কি না দেখাও। ৪. যোগফল আর |G| দিয়ে ভাগ দেখাও; ভাগফল পূর্ণসংখ্যা না হলে থেমে ভুল খোঁজো। ৫. সব রং-করা তালিকা করে orbit গোনার একটি ছোট Python কোড দাও (শুধু itertools), যাতে আমি উত্তর মেলাতে পারি। ৬. কোনো সাল, নাম বা উৎস নিয়ে নিশ্চিত না হলে তা স্পষ্ট বলো।

AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট

Burnside-এর হিসাবের সৌন্দর্য হলো এর প্রতিটি ধাপ ছোট আর যাচাইযোগ্য: একটি সারণি, কয়েকটি ঘাত, একটি যোগ আর একটি ভাগ। AI-এর উত্তরকে সেই সারণিতে ভেঙে নিন, আর একটি দশ লাইনের brute force চালিয়ে মিলিয়ে নিন। দুটি স্বাধীন পথ একই সংখ্যা দিলে তবেই উত্তরে ভরসা করুন।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।

প্র ০১উপপাদ্যটির নাম Burnside-এর lemma, অথচ অনেক বইয়ে একে “যে lemma Burnside-এর নয়” বলা হয়। ইতিহাসটি কী?

William Burnside ছিলেন উনিশ শতকের শেষ আর বিশ শতকের শুরুর একজন ব্রিটিশ গণিতবিদ, যিনি সসীম group-এর তত্ত্বে বড় অবদান রাখেন। তাঁর ১৮৯৭ সালের বই Theory of Groups of Finite Order ইংরেজিতে এই বিষয়ের প্রথম দিকের প্রভাবশালী বইগুলোর একটি, আর orbit-এর সংখ্যা = স্থির বিন্দুর গড়, এই ফলটি সেখানে আছে। সেখান থেকেই পরের লেখকেরা ফলটিকে তাঁর নামে ডাকতে শুরু করেন।

কিন্তু ইতিহাসবিদেরা দেখিয়েছেন যে ফলটি তাঁর আগেই জানা ছিল। Ferdinand Georg Frobenius ১৮৮৭ সালের একটি প্রবন্ধে এটি ব্যবহার করেন বলে সাধারণত বলা হয়, আর কারও কারও মতে এর মূল ধারণা Augustin-Louis Cauchy-র ১৮৪৫ সালের কাজেও আছে। Peter M. Neumann ১৯৭৯ সালে এই ইতিহাস নিয়ে একটি প্রবন্ধ লেখেন, যার শিরোনাম মোটামুটি “যে lemma Burnside-এর নয়”; সেই থেকে কিছু বইয়ে “Cauchy–Frobenius lemma” নামটিও ব্যবহৃত হয়। মজার কথা, Burnside নিজে ফলটির কৃতিত্ব দাবি করেননি বলেই মনে করা হয়; নামটি পরের প্রজন্মের দেওয়া।

গণিতে এমন ঘটনা বিরল নয়। Stigler-এর “নামকরণের সূত্র” নামে একটি রসিক পর্যবেক্ষণ আছে: কোনো বৈজ্ঞানিক আবিষ্কারের নাম প্রায় কখনো তার আসল আবিষ্কারকের নামে হয় না। এই কোর্সেই Binet-এর সূত্র de Moivre-এর আগের কাজের সঙ্গে যুক্ত (পর্ব ৪৮-এর আলোচনা), আর Pólya-র উপপাদ্যের একটি পূর্বসূরি Redfield-এর ১৯২৭ সালের প্রবন্ধ। এখানে শিক্ষাটি হলো নাম মুখস্থের চেয়ে বক্তব্য আর প্রমাণ বেশি জরুরি; আর ইতিহাস উদ্ধৃত করার সময় “বলে জানা যায়” ধরনের সতর্কতা রাখা উচিত, বিশেষ করে AI-এর দেওয়া সাল যাচাই না করে লেখা উচিত নয়।

গাণিতিকভাবে নামটি যারই হোক, প্রমাণের মূল কৌশল একটিই: জোড়া (g, x) দুইভাবে গোনা। এই double counting পর্ব ৩৭-এর হ্যান্ডশেক-ধরনের যুক্তির আত্মীয়, আর orbit–stabilizer উপপাদ্যটি না থাকলে ধাপ ৪-এর “প্রতিটি orbit ঠিক |G| দেয়” কথাটি আসত না। তাই ফলটিকে দুই সরল ধারণার যৌথ ফসল হিসেবে দেখাই ভালো।

মূল উপলব্ধি: “Burnside-এর lemma” নামটি ইতিহাসের দিক থেকে সম্ভবত ভুল কৃতিত্ব দেয় (Cauchy আর Frobenius আগে জানতেন বলে মনে করা হয়); গণিতে নামের চেয়ে বক্তব্য আর প্রমাণ বোঝা জরুরি।

প্র ০২মৌলিক p-এর জন্য necklace-এর সূত্র থেকে Fermat-এর ছোট উপপাদ্য কীভাবে আসে? এই প্রমাণ আর পর্ব ২৪-এর প্রমাণে পার্থক্য কী?

পর্ব ২৪-এ Fermat-এর ছোট উপপাদ্য ap ≡ a (mod p) প্রমাণ হয়েছে সংখ্যাতত্ত্বের পথে। Necklace দেয় একটি সম্পূর্ণ গণনামূলক প্রমাণ। p পুঁতি আর k রঙের সব string নিন (kpটি)। এদের মধ্যে ঠিক k-টি এক রঙের (সব পুঁতি একই), আর এদের orbit আকার ১। বাকি kp − k-টির কোনোটি এক রঙের নয়। Orbit–stabilizer অনুযায়ী orbit-এর আকার p-এর উৎপাদক, অর্থাৎ ১ বা p. আকার ১ মানে প্রতিটি rotation-এ অপরিবর্তিত, অর্থাৎ এক ধাপ ঘোরালেও একই, যা শুধু এক রঙের string-এ হয়। তাই বাকি সব orbit-এর আকার ঠিক p, আর kp − k সংখ্যাটি p-এর গুণিতক। এটিই p ∣ kp − k, ধনাত্মক পূর্ণসংখ্যা k-এর জন্য Fermat-এর উপপাদ্য।

লক্ষ করুন, এখানে মৌলিকতা ঠিক এক জায়গায় লাগে: p-এর উৎপাদক শুধু ১ আর p. Composite n-এ (যেমন n = 4) orbit-এর আকার ২-ও হতে পারে (0101), আর k4 − k সাধারণভাবে ৪-এর গুণিতক নয়; যেমন k = 2-এ ফল ১৪। উপপাদ্য ৫.২-এর ভাষায় একই কথা: N(p, k) = (kp + (p − 1)k)/p পূর্ণসংখ্যা, তাই p ∣ kp − k. এই প্রমাণটি S. W. Golomb ১৯৫৬ সালে American Mathematical Monthly-তে প্রকাশ করেন বলে জানা যায়, যদিও ধারণাটি আরও পুরোনো হতে পারে।

দুই প্রমাণের পার্থক্য দৃষ্টিভঙ্গিতে। সংখ্যাতত্ত্বের প্রমাণ (a, 2a, …, (p − 1)a-এর গুণফল mod p) একটি বীজগাণিতিক কৌশল, যা ঋণাত্মক a বা modular inverse-এর জগতে সরাসরি খাটে। Necklace প্রমাণ বলে কেন kp − k বিভাজ্য: বস্তুগুলো p-জনের দলে ভাগ হয়ে যায়। এই “একটি group action-এর orbit-গুলো সমান আকারের, তাই মোট বিভাজ্য” ধাঁচটি সংখ্যাতত্ত্ব আর combinatorics-এ বারবার আসে; যেমন Lucas-এর উপপাদ্য বা Wilson-এর উপপাদ্যেরও এমন গণনামূলক প্রমাণ আছে বলে জানা যায়।

আর সাধারণ n-এর জন্য উপপাদ্য ৫.২ থেকে একটি অভেদ পাওয়া যায়: ∑d∣n φ(d) kn/d সবসময় n দিয়ে বিভাজ্য। k = 1 বসালে ∑d∣n φ(d) = n, পর্ব ২৪-এর আরেকটি পরিচিত সূত্র। গণনার একটি ফল এভাবে সংখ্যাতত্ত্বের একটি পুরো পরিবার দেয়।

মূল উপলব্ধি: মৌলিক p-এ এক রঙের নয় এমন প্রতিটি necklace-এর orbit-এ ঠিক p-টি string, তাই p ∣ kp − k; গণনা দিয়ে সংখ্যাতত্ত্বের উপপাদ্য প্রমাণ।

প্র ০৩“পর্যায়হীন” necklace, Lyndon word আর সসীম field-এ irreducible polynomial-এর মধ্যে কী সম্পর্ক? de Bruijn sequence কোথায় আসে?

কিছু necklace একটি ছোট খণ্ডের পুনরাবৃত্তি, যেমন 010101 = (01)3; বাকিগুলো aperiodic (পর্যায়হীন), যাদের orbit-এ পুরো n-টি আলাদা string. Orbit–stabilizer অনুযায়ী aperiodic necklace মানে stabilizer শুধু {e}. প্রতিটি orbit থেকে অভিধান-ক্রমে সবচেয়ে ছোট string বাছলে aperiodic necklace-গুলোর প্রতিনিধিকে বলে Lyndon word; যেমন দৈর্ঘ্য ৪-এ দুই রঙে 0001, 0011, 0111, তিনটি। এদের সংখ্যা Möbius ফাংশন μ দিয়ে L(n, k) = (1/n)∑d∣n μ(d)kn/d, যা inclusion–exclusion-এর একটি রূপ (পর্ব ৪৯ “Inclusion–exclusion আর derangement”-এর ধারণা): মোট kn থেকে পর্যায়যুক্ত string বাদ। n = 4, k = 2-এ (16 − 4)/4 = 3, তালিকার সঙ্গে মেলে।

আশ্চর্যের বিষয়, একই সূত্র আরেকটি জিনিস গোনে: q-উপাদানের সসীম field-এ degree n-এর monic irreducible polynomial-এর সংখ্যা, যেখানে q = k ধরা হয়। এর কারণ হলো GF(qn)-এর উপাদানগুলো Frobenius মানচিত্র x ↦ xq-এর অধীনে orbit-এ ভাগ হয়, ঠিক যেমন string-গুলো rotation-এ; আর পূর্ণ দৈর্ঘ্যের orbit-গুলো degree n-এর irreducible polynomial-এর মূলের সেট। এই সংযোগটি Gauss-এর সময় থেকে polynomial-এর দিক থেকে জানা, আর necklace-এর সঙ্গে এর মিল উনিশ শতকে Moreau-র কাজে দেখা যায় বলে উল্লেখ করা হয় (তাই একে কখনো Moreau-র necklace-counting function বলে)। Field আর polynomial পর্ব ৭১ “Ring আর field — modular ring, polynomial আর GF(2ⁿ)”-এ আসবে, যেখানে এই গণনার অর্থ আরও স্পষ্ট হবে। Error-correcting code আর pseudo-random bit তৈরির LFSR-এ প্রায়ই irreducible বা primitive polynomial বাছতে হয় (পর্ব ৭২ “Error-correcting code — parity, Hamming code আর Hamming distance”-এর পটভূমি), তাই এই সংখ্যার ব্যবহারিক গুরুত্বও আছে।

de Bruijn sequence হলো k রঙের একটি চক্রাকার string, যাতে দৈর্ঘ্য n-এর প্রতিটি সম্ভাব্য খণ্ড ঠিক একবার আসে; যেমন n = 3, k = 2-এ 00010111. একটি সুন্দর উপপাদ্য (Fredricksen, Maiorana প্রমুখের নামে যুক্ত) বলে: n-এর উৎপাদক দৈর্ঘ্যের সব Lyndon word অভিধান-ক্রমে জোড়া দিলে একটি de Bruijn sequence পাওয়া যায়। পিন-কোডের তালার সব সংমিশ্রণ সবচেয়ে কম চাপে পরীক্ষা করা, বা একটি ঘূর্ণায়মান চাকার অবস্থান অল্প কয়েকটি সেন্সরে চেনা, এমন কাজে এই ধারা ব্যবহৃত হয়।

মূল উপলব্ধি: Necklace গোনা শুধু পুঁতির খেলা নয়; একই orbit-গণনা Lyndon word, সসীম field-এর irreducible polynomial আর de Bruijn sequence-কে একসূত্রে বাঁধে।

প্র ০৪Burnside দিয়ে isomorphism পর্যন্ত graph গোনা যায়; তাহলে দুটি নির্দিষ্ট graph isomorphic কি না, তা নির্ণয় করা কঠিন কেন? n বড় হলে graph-এর শ্রেণির সংখ্যা কেমন বাড়ে?

দুটি প্রশ্ন আলাদা। Burnside একটি গণনা দেয়: কয়টি শ্রেণি আছে, কোনো শ্রেণির তালিকা না করেই। Graph isomorphism একটি সিদ্ধান্ত: এই দুটি নির্দিষ্ট graph কি একই শ্রেণিতে? সংজ্ঞা অনুযায়ী n! টি relabelling পরীক্ষা করা যায়, কিন্তু n = 30-এ তা প্রায় 2.65 × 1032. Burnside-এর যোগফলেও সব g ∈ G-এর ওপর যোগ লাগে, কিন্তু সেখানে একই cycle-গঠনের permutation-গুলো একসঙ্গে গোনা যায় (Sn-এ cycle-গঠন মানে n-এর একটি partition, পর্ব ৫০ “বিশেষ সংখ্যা — Catalan, Stirling আর partition”), তাই গণনা সহজ; সিদ্ধান্তে এমন কোনো সরল সংক্ষেপ নেই।

Graph isomorphism সমস্যাটি জটিলতা-তত্ত্বে একটি বিশেষ জায়গায়: এটি NP-তে আছে (একটি relabelling দেখালেই যাচাই), কিন্তু NP-complete বলে প্রমাণিত নয়, আর polynomial সময়ের algorithm-ও জানা নেই (DSA কোর্সের পর্ব ৬৪-এ P আর NP-এর পটভূমি)। László Babai ২০১৫ সালে একটি quasi-polynomial সময়ের algorithm ঘোষণা করেন, যা এই সমস্যার সবচেয়ে বড় অগ্রগতি হিসেবে ধরা হয়; প্রমাণে একটি ত্রুটি পাওয়া গেলে তিনি ২০১৭ সালে তা সংশোধন করেন বলে জানা যায়। বাস্তবে nauty-র মতো সফটওয়্যার (Brendan McKay) “canonical form” বানিয়ে বেশিরভাগ graph দ্রুত সামলায়: প্রতিটি শ্রেণি থেকে একটি নির্দিষ্ট প্রতিনিধি, ঠিক যেমন Lyndon word প্রতিটি necklace-এর প্রতিনিধি।

শ্রেণির সংখ্যা: n = 1, 2, 3, 4, 5, 6-এ 1, 2, 4, 11, 34, 156 (scratch-এ Burnside দিয়ে মেলানো)। লেবেলযুক্ত graph 2C(n,2), আর প্রতিটি শ্রেণিতে বড়জোর n! টি, তাই শ্রেণি অন্তত 2C(n,2)/n!. একটি ধ্রুপদি ফল (Pólya আর পরে Erdős–Rényi-র কাজের সঙ্গে যুক্ত বলে উল্লেখ করা হয়) বলে, n বড় হলে প্রায় সব graph-এর একমাত্র automorphism হলো identity, তাই প্রায় সব orbit-এর আকার পুরো n!, আর শ্রেণির সংখ্যা 2C(n,2)/n!-এর অনুপাতে ১-এর দিকে যায়। ছোট n-এ এই অনুমান খারাপ (n = 4-এ 64/24 ≈ 2.7, আসল ১১), কারণ ছোট graph-এ symmetry প্রচুর; এটিই §১-এর “সরল ভাগ কম গোনে”-র আরেকটি রূপ।

মূল উপলব্ধি: শ্রেণি গোনা (Burnside) সহজ, কিন্তু দুটি বস্তু একই শ্রেণির কি না নির্ণয় করা আলাদা আর কঠিনতর প্রশ্ন; বড় n-এ প্রায় সব graph-এর symmetry নেই, তাই সরল ভাগ প্রায় ঠিক হয়।

প্র ০৫Software আর algorithm-এ symmetry গোনা বা বাদ দেওয়া কোথায় কাজে লাগে? N-queens বা ধাঁধার সমাধানে এর ভূমিকা কী?

Search algorithm-এ symmetry মানে একই কাজ বারবার। DSA কোর্সের পর্ব ৫৬-এ N-queens backtracking দিয়ে সমাধান হয়। ৮×৮ বোর্ডে ৯২টি সমাধান, কিন্তু বোর্ডের ৮টি symmetry (D4: ঘোরানো আর উল্টানো) দিয়ে একটি থেকে অন্যটি পাওয়া যায় এমনগুলো একই ধরলে মাত্র ১২টি “মৌলিক” সমাধান। ১১টি orbit-এর আকার ৮ আর একটির আকার ৪ (সেটি 180° ঘোরালে নিজের ওপর পড়ে): 11 · 8 + 4 = 92 (scratch-এ সব সমাধান তালিকা করে মেলানো)। এখানেও orbit–stabilizer: stabilizer-এর আকার ২ হলে orbit ৪। Search-এর সময় এই symmetry ব্যবহার করে প্রথম রানির অবস্থান বোর্ডের অর্ধেকে সীমিত রাখলে কাজ প্রায় অর্ধেক হয়।

একই নীতি অনেক জায়গায়। Rubik's cube-এর মতো ধাঁধার অবস্থান-গণনায় কিউবের symmetry দিয়ে অবস্থানগুলোকে শ্রেণিতে ভাগ করে হিসাব বহুগুণ ছোট করা হয়। দাবার শেষ অবস্থার তালিকা (endgame tablebase) বানাতে বোর্ডের প্রতিফলন ব্যবহার করে সংরক্ষণের জায়গা কমানো হয়। SAT আর constraint solver-এ “symmetry breaking” একটি প্রতিষ্ঠিত কৌশল: সমতুল্য সমাধানগুলোর মধ্যে শুধু একটি “canonical” রূপ রাখার বাড়তি শর্ত যোগ করা হয়, যাতে solver একই খোঁজ বারবার না করে (পর্ব ৭৭ “SAT আর SMT solver — discrete math দিয়ে software যাচাই”-এ এ নিয়ে আরও)।

এখানে Burnside একটি পরিকল্পনার হাতিয়ার: symmetry বাদ দিলে কতগুলো আলাদা অবস্থা থাকবে, তা আগেই বলে দেয়, তাই মেমরি আর সময়ের হিসাব করা যায়। তবে একটি সতর্কতা আছে: “প্রতিটি শ্রেণি থেকে একটি” রাখতে হলে প্রতিটি অবস্থার একটি canonical form (যেমন orbit-এর অভিধান-ক্রমে সবচেয়ে ছোট সদস্য) হিসাব করতে হয়, আর তা প্রতিবার |G| টি রূপান্তর পরীক্ষা চায়। বড় group-এ তাই চতুর কৌশল লাগে। বাজারঘরের ঘূর্ণায়মান স্ট্যান্ডের সাজের তালিকা বানাতে হলেও একই প্রশ্ন: প্রতিটি সাজের সব rotation-এর মধ্যে সবচেয়ে ছোট string-টিকে প্রতিনিধি ধরলে ডুপ্লিকেট আপনিই বাদ পড়ে।

মূল উপলব্ধি: Symmetry চিনলে search-এ একই কাজ বারবার করা এড়ানো যায়; Burnside আগেই আলাদা অবস্থার সংখ্যা বলে, আর canonical form প্রতিটি শ্রেণি থেকে একটি প্রতিনিধি বাছে।

অনুশীলন

আগে খাতায় করুন, তারপর উত্তর খুলে মেলান।

  1. প্রমাণ: উপপাদ্য ৫.২ ব্যবহার করে প্রমাণ করুন, p মৌলিক আর k ধনাত্মক পূর্ণসংখ্যা হলে p ∣ kp − k.
    1. p-এর ধনাত্মক উৎপাদক শুধু 1 আর p; φ(1) = 1, φ(p) = p − 1. — মৌলিকের সংজ্ঞা, পর্ব ২৪
    2. উপপাদ্য ৫.২: N(p, k) = (kp + (p − 1)k)/p. — d = 1-এ kp, d = p-এ (p − 1)k1
    3. N(p, k) orbit-এর সংখ্যা, তাই একটি পূর্ণসংখ্যা; অর্থাৎ p ∣ kp + (p − 1)k = (kp − k) + pk. — গণনার ফল পূর্ণসংখ্যা
    4. p ∣ pk, তাই p ∣ kp − k. ∎ — বিভাজ্যতার নিয়ম

    যাচাই p = 5, k = 2: 32 − 2 = 30 = 5 · 6, আর N(5, 2) = (32 + 8)/5 = 8, প্রথম Python ব্লকের সারণির মান।

  2. হিসাব: (ক) ৮টি পুঁতি আর ২টি রঙে কয়টি necklace আর কয়টি bracelet? (খ) একটি সুষম ত্রিভুজের তিন কোণে তিন রঙের যেকোনোটি বসানো হবে, ঘোরানো আর উল্টানো দুটিই চলে। আলাদা সাজ কয়টি? দুটিই Burnside দিয়ে দেখান।

    (ক) ৮-এর উৎপাদক 1, 2, 4, 8; φ = 1, 1, 2, 4. N = (28 + 24 + 2 · 22 + 4 · 2)/8 = (256 + 16 + 8 + 8)/8 = 288/8 = 36. Bracelet: ৪টি reflection দুই পুঁতি দিয়ে (৫টি cycle, 25 = 32), ৪টি বাহুর মধ্যবিন্দু দিয়ে (৪টি cycle, 16): 4 · 32 + 4 · 16 = 192. B = (288 + 192)/16 = 480/16 = 30.

    (খ) D3-এর ৬টি symmetry: identity (৩টি cycle, 27), দুটি rotation (একটি ৩-cycle, প্রতিটিতে 3), তিনটি reflection (একটি কোণ স্থির আর একটি জোড়া, ২টি cycle, প্রতিটিতে 9). (27 + 2 · 3 + 3 · 9)/6 = 60/6 = 10. যাচাই: সব এক রং ৩টি, দুই রং (২+১) 3 · 2 = 6টি, তিনটি আলাদা রং ১টি (উল্টানো চলে বলে দুই দিকের ক্রম একই), মোট ১০। (দুটিই প্রথম Python ব্লকের সারণিতে আছে: n = 8, k = 2-এ 36 আর 30; n = 3, k = 3-এ bracelet 10.)

  3. আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে, আর দ্বিতীয় সংখ্যাটি কী গোনে। তারপর যেকোনো Python-এ চালিয়ে মেলান।
    from math import gcd
    n = 6
    print([gcd(s, n) for s in range(n)])
    print(sum(2 ** gcd(s, n) for s in range(n)) // n)
    [6, 1, 2, 3, 2, 1]
    14

    প্রথম তালিকা প্রতিটি rotation rs-এর cycle-সংখ্যা (lemma ৫.১): s = 0-এ gcd(0, 6) = 6, কারণ কিছু না ঘোরালে ৬টি পুঁতিই আলাদা cycle. দ্বিতীয় লাইন Burnside: (64 + 2 + 4 + 8 + 4 + 2)/6 = 84/6 = 14, অর্থাৎ ৬ পুঁতি, ২ রঙের necklace-এর সংখ্যা। আউটপুট CPython-এ চালিয়ে মেলানো।

  4. প্রমাণের ভুল ধরুন: একজন ৬ পুঁতি, ২ রঙের bracelet এভাবে গুনলেন: “D6-এ ১২টি symmetry. Rotation-গুলোর যোগফল 84. প্রতিটি reflection দুটি পুঁতি স্থির রাখে আর বাকি চারটিকে দুই জোড়ায় অদলবদল করে, তাই ৪টি cycle, 24 = 16. ৬টি reflection মিলে 96. উত্তর (84 + 96)/12 = 15.” ভুল কোথায়, আর সঠিক উত্তর কী?
    • লক্ষণ: ভাগফল পূর্ণসংখ্যা এসেছে, তাই সেই পরীক্ষায় ধরা পড়ে না; কিন্তু উত্তর necklace-এর সংখ্যা ১৪-এর চেয়েও বেশি। Bracelet-এ বেশি symmetry মানে শ্রেণি একই বা বড়, তাই সংখ্যা কখনো necklace-এর চেয়ে বেশি হতে পারে না।
    • ভুল ধাপ: জোড় n-এ সব reflection একই ধরনের নয়। ৩টির অক্ষ দুটি বিপরীত পুঁতি দিয়ে যায় (২টি স্থির + ২ জোড়া = ৪টি cycle), কিন্তু বাকি ৩টির অক্ষ দুই বিপরীত বাহুর মধ্যবিন্দু দিয়ে, যেখানে কোনো পুঁতি স্থির নয়, শুধু ৩টি জোড়া, অর্থাৎ ৩টি cycle থাকে।
    • সংশোধন: reflection-এর অবদান 3 · 16 + 3 · 8 = 72, আর B(6, 2) = (84 + 72)/12 = 156/12 = 13 (প্রথম Python ব্লকে brute force দিয়ে মেলানো)।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমBurnside-এর lemma দিয়ে symmetry পর্যন্ত আলাদা বস্তু গোনার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. গোনার বস্তুর সেট X আর অনুমোদিত symmetry-র group G ঠিক করা
  2. G-এর উপাদানগুলোকে ধরন অনুযায়ী সাজিয়ে মোট সংখ্যা |G|-এর সঙ্গে মেলানো
  3. প্রতিটি ধরনের cycle গুনে |Fix(g)| = kcycle-এর সংখ্যা বের করা
  4. সব |Fix(g)| যোগ করা
  5. যোগফলকে |G| দিয়ে ভাগ করে ফল পূর্ণসংখ্যা কি না দেখা

বৃত্তে সাজানো ৪টি পুঁতি, প্রতিটি লাল বা নীল। ঘোরালে মিলে যায় এমন দুটি সাজকে একই ধরলে আলাদা সাজ কয়টি?

  • 4
  • 6
  • 16
  • 8

কিউবের ২৪টি rotation-এর group একটি নির্দিষ্ট তলের ওপর কাজ করে, আর সেই তলের orbit হলো কিউবের ৬টি তল। ওই তলের stabilizer-এ কয়টি rotation?

  • 6
  • 1
  • 4
  • 3

একটি সসীম group G একটি সসীম সেট X-এর ওপর কাজ করলে orbit-এর সংখ্যা কোনটি? (Fix(g) = g যেসব উপাদান অপরিবর্তিত রাখে)

  • (1/|G|) ∑g∈G |Fix(g)|
  • |X| / |G|
  • ∑g∈G |Fix(g)|
  • (1/|X|) ∑x∈X |Gx|

বৃত্তে সাজানো ১২টি পুঁতিকে ৮ ধাপ ঘোরানো হলো। এই rotation-এর cycle decomposition-এ কয়টি cycle?

  • 8
  • 3
  • 12
  • 4

একটি কিউবের ছয় তলের প্রতিটি লাল বা নীল রং করা হবে। ঘোরালে মিলে যায় এমন দুটি কিউবকে একই ধরলে আলাদা কিউব কয়টি?

  • 64
  • 10
  • 7
  • 12

৪ পুঁতির মালায় (শুধু rotation) cycle index Z = (x14 + x22 + 2x4)/4. দুই লাল আর দুই নীল পুঁতির আলাদা মালা কয়টি?

  • 6
  • 1
  • 2
  • 3

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Orbit = একই বস্তু: symmetry-র group G সেট X-এর ওপর কাজ করে; ঘোরালে বা উল্টালে মেলে এমন বস্তুগুলো একটি orbit, আর orbit-গুলো X-কে ভাগ করে।
  2. Orbit–stabilizer: |Orb(x)| · |Gx| = |G|; তাই orbit-এর আকার |G|-এর উৎপাদক, আর সরল ভাগ |X|/|G| সাধারণভাবে ভুল।
  3. Burnside: orbit-এর সংখ্যা = (1/|G|)∑|Fix(g)|, আর permutation-এ |Fix(g)| = kcycle-এর সংখ্যা.
  4. তৈরি সূত্র: necklace (1/n)∑d∣nφ(d)kn/d; bracelet-এ জোড় n-এ দুই রকম reflection; কিউব (k6 + 3k4 + 12k3 + 8k2)/24.
  5. Pólya: cycle index-এ xi → ri + bi + ⋯ বসালে রঙের সংখ্যা অনুযায়ী orbit গোনার generating function; isomorphism পর্যন্ত ৪-vertex graph ১১টি।

পরের পর্বে: পর্ব ৫২ “Relation আর তার ধর্ম — reflexive, symmetric, transitive”: নতুন মডিউলের শুরু, যেখানে দুটি বস্তুর “সম্পর্ক”-কে একটি সেট হিসেবে দেখা হবে, আর এই পর্বের orbit-এর মতো equivalence-এর ধারণা নিজের পূর্ণ রূপ পাবে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান