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

বিশেষ সংখ্যা — Catalan, Stirling আর partition

Special Numbers — Catalan Numbers, Stirling Numbers of Both Kinds, Bell Numbers, Integer Partitions, Ferrers Diagrams and the Pentagonal Number Theorem

Taught in Bangla, this lesson fills the balls-and-boxes cells that have no closed form. It proves the recurrences for Stirling numbers of both kinds, proves the Bell number recurrence and reaches harmonic numbers from permutation cycles. It draws Ferrers diagrams, proves conjugation by bijection, states Euler's pentagonal number theorem for fast p(n) up to p(100) = 190569292, revisits Catalan numbers, and completes the twelvefold way table, with in-page Python checking each number by brute force.

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

  • দুই ধরনের Stirling সংখ্যার সংজ্ঞা, recurrence-এর combinatorial প্রমাণ, সারণি আর polynomial-এর সঙ্গে তাদের সম্পর্ক
  • Bell সংখ্যার recurrence-এর প্রমাণ, আর permutation-এর cycle থেকে harmonic number-এ পৌঁছানো
  • Ferrers diagram, conjugation-এর bijection প্রমাণ, আর ঠিক k অংশের partition-এর recurrence
  • Euler-এর pentagonal উপপাদ্যের বক্তব্য আর তা থেকে p(n) দ্রুত হিসাবের recurrence
  • Twelvefold way-এর বাকি ঘরগুলো পূরণ করে “কোন সংখ্যা কী গোনে” সারণি, আর প্রতিটি সংখ্যা Python-এ brute force দিয়ে যাচাই

১ · বল-বাক্সের অসমাপ্ত ঘর — কেন “বিশেষ” সংখ্যা

পর্ব ৩৫ “পুনরাবৃত্তিসহ বাছাই — stars and bars আর multinomial”-এ n-টি বল k-টি বাক্সে রাখার ১২ রকম প্রশ্নের একটি সারণি দেখেছেন, যার নাম twelvefold way. ওপরের দুই সারিতে (বাক্সগুলো আলাদা) প্রতিটি ঘরে একটি পরিষ্কার সূত্র ছিল: kn, C(n + k − 1, n), C(k, n) ইত্যাদি। নিচের দুই সারিতে (বাক্সগুলো একই রকম) লেখা ছিল শুধু “পর্ব ৫০”. এই পর্বে সেই ঘরগুলো পূরণ হবে।

বাজারঘরের গুদামে ঈদের আগে চারজন প্যাকার: আলম, বীথি, চয়ন আর দীপা। ম্যানেজার বললেন, “দুটি দল বানান, প্রতিটি দলে অন্তত একজন।” দলের কোনো নাম নেই, কোনো আলাদা টেবিল নেই; শুধু কে কার সঙ্গে। {আলম, বীথি} আর {চয়ন, দীপা} একটি ভাগ; দলের নাম “দল ১”, “দল ২” অদলবদল করলে নতুন কোনো ভাগ হয় না। এমন ভাগ কয়টি? আবার যদি বলা হয়, “চারজন দুটি গোল টেবিলে বসবেন”, তাহলে শুধু দল নয়, টেবিলে কে কার ডানে বসলেন তা-ও গুরুত্বপূর্ণ। আর যদি প্যাকারদের বদলে ৪ কেজি চাল অভিন্ন ১ কেজির প্যাকেটে থাকে, তাহলে শুধু দলের আকারগুলো (৩ + ১, না ২ + ২) গুরুত্বপূর্ণ।

তিনটি প্রশ্ন, তিনটি সংখ্যা-পরিবার। প্রথমটির উত্তর 7, দ্বিতীয় ধরনের Stirling সংখ্যা S(4, 2) (§৩)। দ্বিতীয়টির উত্তর 11, প্রথম ধরনের Stirling সংখ্যা c(4, 2) (§৫)। তৃতীয়টির উত্তর 2, ৪-এর ঠিক দুই অংশের partition (§৬)। তিনটির কোনোটিরই C(n, k)-এর মতো একটি সরল গুণফল-সূত্র নেই, কারণ “নামহীন দল” মানে ভাগ (division rule, পর্ব ৩১) দিয়ে সরল করা যায় না: সব দলের আকার সমান না হলে একটি ভাগ কতবার গোনা হলো, তা ভাগভেদে আলাদা।

তাহলে পথ কী? প্রতিটি পরিবারের জন্য একটি recurrence, যা একটি নির্দিষ্ট উপাদানকে (“শেষ গ্রাহক”, “সবচেয়ে ছোট অংশ”) আলাদা করে ধরে ছোট প্রশ্নে নামায়, আর তার একটি combinatorial proof. পর্ব ৪৪ থেকে ৪৮ পর্যন্ত recurrence মডেল করা আর সমাধানের যে কৌশল শিখেছেন, এখানে উল্টো ছবি: অনেক সময় closed form নেই, তাই recurrence-ই সংখ্যাটির সবচেয়ে কাজের সংজ্ঞা। সারণি বানাতে হয় dynamic programming-এর মতো ঘর ধরে ধরে।

এই পর্বের পথ। প্রথমে পুরোনো বন্ধু Catalan (§২), তারপর দলে ভাগ: S(n, k) আর Bell সংখ্যা (§৩–৪), তারপর cycle আর গোল টেবিল (§৫), তারপর partition, Ferrers diagram আর pentagonal উপপাদ্য (§৬–৭)। শেষে সব মিলিয়ে twelvefold way-এর পূর্ণ সারণি (§৮) আর পরীক্ষার অঙ্ক (§৯)।

২ · Catalan ফিরে দেখা — একই সংখ্যা, নতুন চেহারা

Catalan সংখ্যা Cn এর আগে দুইবার এসেছে। পর্ব ৩৭ “গণনার কৌশল — lattice path, bijection আর double counting”-এ reflection principle দিয়ে কর্ণ না পেরোনো পথ গুনে প্রমাণ হয়েছে Cn = C(2n, n) − C(2n, n + 1) = C(2n, n)/(n + 1), আর মেলানো বন্ধনী, binary tree আর বহুভুজের triangulation একই সংখ্যায় গোনা যায় দেখানো হয়েছে। পর্ব ৪৮ “Generating function — গণনাকে বীজগণিতে রূপান্তর”-এ C(x) = 1 + xC(x)2 সমীকরণ থেকে একই সূত্র বীজগণিতে এসেছে। সেই প্রমাণগুলো এখানে আবার করা হবে না। এই অংশে তিনটি নতুন জিনিস: একটি ধারাবাহিক গুণের সূত্র, দুটি নতুন চেহারা, আর একটি চেনার কৌশল।

সারকথা ২.১ (Catalan, যা জানা)

C0 = 1, Cn+1 = ∑i=0n CiCn−i, Cn = C(2n, n)/(n + 1)

প্রথম মানগুলো: 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796.

উপপাদ্য ২.২ (ক্রমিক অনুপাত)

প্রতিটি n ≥ 0-এর জন্য Cn+1 = 2(2n + 1)Cn/(n + 2).

  1. Cn+1 = (2n + 2)!/((n + 1)!(n + 1)!(n + 2)) আর Cn = (2n)!/(n! n! (n + 1)). — closed form
  2. ভাগ করলে Cn+1/Cn = (2n + 2)(2n + 1)(n + 1)/((n + 1)(n + 1)(n + 2)). — factorial কাটাকাটি
  3. 2n + 2 = 2(n + 1), তাই অনুপাত = 2(2n + 1)/(n + 2). ∎ — সরল করা

এই সূত্রে Cn বের করতে শুধু n-টি গুণ-ভাগ লাগে, convolution-এর n2 নয়: C5 = 2 · 9 · 14/6 = 42. অনুপাত 2(2n + 1)/(n + 2) বড় n-এ 4-এর দিকে যায়, তাই Cn মোটামুটি 4n-এর মতো বাড়ে (পর্ব ৪৮-এর “আরও গভীরে” অংশে এর নিখুঁত রূপ আছে)। প্রতিটি ধাপে ভাগফল পূর্ণসংখ্যা হবেই, কারণ বাঁ পাশ একটি গণনা।

নতুন চেহারা ১: না-কাটা করমর্দন। বাজারঘরের বার্ষিক সভায় একটি গোল টেবিলে 2n জন বসেছেন। সবাই একসঙ্গে ঠিক একজনের সঙ্গে হাত মেলাবেন, আর টেবিলের ওপর দিয়ে কোনো দুটি হাত একে অন্যকে কাটবে না। কয় উপায়ে? n = 3-এ (৬ জন) উত্তর ৫।

  1. ১ নম্বর আসন যাঁর সঙ্গে হাত মেলান, তিনি আসন m. ১ আর m-এর হাত টেবিলকে দুই ভাগ করে; একদিকের কেউ অন্যদিকের কারও সঙ্গে হাত মেলালে হাত কাটবে। — জ্যামিতি
  2. তাই দুই পাশের প্রতিটিতে জোড় সংখ্যক মানুষ থাকতে হবে: m = 2j, একপাশে 2(j − 1) জন, অন্যপাশে 2(n − j) জন। — প্রত্যেকের একজন সঙ্গী
  3. দুই পাশ স্বাধীনভাবে একই প্রশ্নের ছোট রূপ, তাই উপায় hj−1hn−j. j = 1…n যোগ করলে hn = ∑ hj−1hn−j, h0 = 1. — যোগ ও গুণের নিয়ম
  4. এটি হুবহু Catalan-এর recurrence, আর শুরুর মান একই, তাই strong induction অনুযায়ী (পর্ব ১১) hn = Cn. ∎ — একই recurrence, একই শুরু

নতুন চেহারা ২: matrix গুণের বন্ধনী। A1A2⋯An+1 গুণফলে বন্ধনী বসানোর উপায় Cn: শেষ গুণটি কোথায় হয়, তা ধরে ভাঙলে বাঁ অংশে i + 1টি আর ডান অংশে n − iটি matrix, আবার একই recurrence. ৪টি matrix-এ C3 = 5 রকম বন্ধনী, যার প্রতিটির খরচ আলাদা হতে পারে; সবচেয়ে সস্তাটি খোঁজার DP পাবেন DSA কোর্সের পর্ব ৫৪-এ। সব বন্ধনী একে একে পরীক্ষা করা অচল, কারণ Cn প্রায় 4n-এর হারে বাড়ে।

চেনার কৌশল। একটি নতুন গণনার প্রশ্নে প্রথম কয়েকটি মান 1, 1, 2, 5, 14 এলে Catalan সন্দেহ করুন, তারপর প্রমাণ খুঁজুন: “প্রথম বস্তুটি কার সঙ্গে জোড়া” ধরে ভাঙলে কি দুটি স্বাধীন, একই ধরনের ছোট অংশ থাকে? থাকলে recurrence মিলবে। শুধু প্রথম চারটি মান মেলা প্রমাণ নয়: 1, 1, 2, 5-এর পরে 14 না এসে 15 আসে Bell সংখ্যায় (§৪)। এই ফাঁদটি §৯-এ আবার আসবে।

৩ · দ্বিতীয় ধরনের Stirling সংখ্যা — নামহীন দলে ভাগ

সংজ্ঞা ৩.১

n-উপাদানের একটি সেটকে ঠিক k-টি অশূন্য, পরস্পর বিচ্ছিন্ন অংশে (block) ভাগ করার উপায়ের সংখ্যা দ্বিতীয় ধরনের Stirling সংখ্যা S(n, k). অংশগুলোর কোনো ক্রম বা নাম নেই; এমন একটি ভাগকে বলে সেটের একটি partition. প্রথা অনুযায়ী S(0, 0) = 1, আর n ≥ 1-এ S(n, 0) = 0; k > n হলে S(n, k) = 0.

ছোট মানগুলো হাতে বের হয়। S(n, 1) = 1 (সবাই এক দলে), S(n, n) = 1 (প্রত্যেকে একা)। S(n, n − 1)-এ ঠিক একটি দলে দুজন, বাকিরা একা, তাই S(n, n − 1) = C(n, 2). আর S(n, 2): প্রতিটি উপাদানকে “দল A” বা “দল B”-তে দেওয়ার 2n উপায় থেকে দুটি একতরফা বাদ দিয়ে, নাম মুছতে 2 দিয়ে ভাগ: (2n − 2)/2 = 2n−1 − 1. এখানে ভাগ বৈধ, কারণ দুটি দলই অশূন্য আর ভিন্ন, তাই প্রতিটি ভাগ ঠিক দুবার গোনা হয়। চার প্যাকারের প্রশ্নে S(4, 2) = 23 − 1 = 7.

উপপাদ্য ৩.২ (Stirling-এর recurrence)

n ≥ 1 আর k ≥ 1-এর জন্য

S(n, k) = k · S(n − 1, k) + S(n − 1, k − 1)

  1. {1, …, n}-এর k-অংশের সব partition নিন, আর শেষ উপাদান n কোথায় আছে দেখুন। দুটি পরস্পর বিচ্ছিন্ন ক্ষেত্র: n একা একটি অংশে, অথবা n অন্তত আরেকজনের সঙ্গে। — যোগের নিয়ম
  2. n একা থাকলে তাকে সরিয়ে দিলে বাকি {1, …, n − 1}-এর একটি (k − 1)-অংশের partition থাকে, আর উল্টো দিকে যেকোনো এমন partition-এ {n} যোগ করে ফেরত আসা যায়। এটি একটি bijection, তাই এই ক্ষেত্রে S(n − 1, k − 1) উপায়। — bijection
  3. n অন্যদের সঙ্গে থাকলে n-কে সরালে {1, …, n − 1}-এর একটি k-অংশের partition থাকে (n-এর অংশটি খালি হয় না)। উল্টো দিকে এমন যেকোনো partition-এর k-টি অংশের যেকোনো একটিতে n ঢোকানো যায়, আর ভিন্ন অংশে ঢোকালে ভিন্ন ফল। — ফেরত পথ
  4. অংশগুলোর নাম না থাকলেও (n − 1)-এর partition-টি স্থির হলে তার k-টি অংশ আলাদা সেট, তাই “কোন অংশে n” প্রশ্নের ঠিক k-টি উত্তর। এই ক্ষেত্রে k · S(n − 1, k) উপায়। — গুণের নিয়ম
  5. দুই ক্ষেত্র যোগ করলে সূত্রটি পাওয়া যায়। ∎ — যোগের নিয়ম

ধাপ ৪-এর যুক্তিটি সূক্ষ্ম, আর §৯-এর ভুল প্রমাণটি ঠিক এখানেই হোঁচট খায়: “নামহীন দল” মানে সব দল মিলে একটি সেট, কিন্তু একবার partition ঠিক হয়ে গেলে প্রতিটি দলকে তার সদস্য দিয়ে চেনা যায়। নিচের stepper সারণিটি সারি ধরে বানায়।

1S(n,1) = 1, S(n,n) = 12সারি 2: S(2,1)=1, S(2,2)=13S(3,2) = 2·S(2,2) + S(2,1)4S(4,2) = 2·S(3,2) + S(3,1)5অর্থ: 4 একা, বা দলে ঢোকে6তালিকা: ৭টি ভাগ ✓
S(n, k)-এর সারণি
হিসাব
S(3, 2)
S(4, 2)
সারি 4
  1. সীমানা। n ≥ 1-এ S(n, 1) = 1 (সবাই এক দলে) আর S(n, n) = 1 (প্রত্যেকে একা)। সারণির প্রতিটি সারির দুই প্রান্ত তাই 1.
  2. সারি ২। দুজনকে এক দলে একভাবে, দুই দলে একভাবে: S(2, 1) = S(2, 2) = 1.
  3. S(3, 2). k = 2, তাই S(3, 2) = 2 · S(2, 2) + S(2, 1) = 2 · 1 + 1 = 3: {1}{23}, {2}{13}, {3}{12}.
  4. S(4, 2). S(4, 2) = 2 · S(3, 2) + S(3, 1) = 2 · 3 + 1 = 7. একইভাবে S(4, 3) = 3 · S(3, 3) + S(3, 2) = 3 + 3 = 6, তাই সারি ৪: 1, 7, 6, 1.
  5. অর্থ। 4 যদি অন্যদের সঙ্গে থাকে: {1, 2, 3}-এর তিনটি ২-অংশের ভাগের প্রতিটিতে 4 দুই দলের যেকোনোটিতে, 3 × 2 = 6টি। 4 যদি একা: বাকি {1, 2, 3} এক দলে, ১টি।
  6. তালিকা মেলানো। {1}{234}, {2}{134}, {3}{124}, {4}{123}, {12}{34}, {13}{24}, {14}{23}: সাতটি, আর 24−1 − 1 = 7-এর সঙ্গেও মেলে।

Onto ফাংশনের সঙ্গে সম্পর্ক। n-টি আলাদা অর্ডার k জন নামসহ রাইডারের মধ্যে ভাগ, প্রত্যেকে অন্তত একটি: আগে নামহীন k দলে ভাগ (S(n, k)), তারপর দলগুলো k জনকে k! উপায়ে দেওয়া। তাই onto ফাংশনের সংখ্যা k! · S(n, k). পর্ব ১৬-এ এই গণনা পরে করার কথা ছিল; পর্ব ৪৯ “Inclusion–exclusion আর derangement”-এ এর ∑(−1)jC(k, j)(k − j)n সূত্র প্রমাণ হচ্ছে, তাই S(n, k)-এর একটি স্পষ্ট সূত্রও আছে, শুধু তাতে বিকল্প চিহ্নের যোগফল।

উপপাদ্য ৩.৩ (ঘাত থেকে falling factorial)

প্রতিটি n ≥ 0-এর জন্য, polynomial-এর অভেদ হিসেবে, xn = ∑k=0n S(n, k) · x(x − 1)⋯(x − k + 1).

  1. x একটি ধনাত্মক পূর্ণসংখ্যা হলে বাঁ পাশ {1, …, n} থেকে {1, …, x}-এ সব ফাংশনের সংখ্যা। — গুণের নিয়ম (পর্ব ১৬)
  2. প্রতিটি ফাংশনের “একই মানে যাওয়া উপাদানগুলো” মিলে {1, …, n}-এর একটি partition, ধরুন k অংশের; ফাংশনটি জানা মানে এই partition আর k-টি অংশকে k-টি ভিন্ন মান দেওয়া। — ফাংশনকে ভাঙা
  3. k-টি অংশকে ভিন্ন মান দেওয়ার উপায় falling factorial x(x − 1)⋯(x − k + 1), তাই k অনুযায়ী যোগ করে দুই পাশ সমান। — যোগ ও গুণের নিয়ম
  4. দুই পাশই degree n-এর polynomial, আর অসীম সংখ্যক x-এ সমান, তাই তাদের পার্থক্যের অসীম মূল; শূন্য ছাড়া কোনো polynomial-এর তা থাকে না। ∎ — polynomial-এর মূলের সংখ্যা

উদাহরণ x = 5, n = 4: 1 · 5 + 7 · 20 + 6 · 60 + 1 · 120 = 625 = 54. এই অভেদ কাজে লাগে ∑km ধরনের যোগফলে: falling factorial-এর যোগফল সহজ (hockey-stick ধাঁচে), তাই আগে xm-কে falling factorial-এ ভাঙা হয়।

৪ · Bell সংখ্যা — সব রকম দলভাগ

দলের সংখ্যা নির্দিষ্ট না থাকলে? বাজারঘর পাঁচজন নতুন গ্রাহককে “পছন্দ মিলে এমন” দলে ভাগ করবে, কয়টি দল তা আগে থেকে ঠিক নেই। সব k-এর জন্য যোগ করলে পাওয়া যায় Bell সংখ্যা:

B(n) = ∑k=0n S(n, k): 1, 1, 2, 5, 15, 52, 203, 877, 4140, …

B(4) = 1 + 7 + 6 + 1 = 15, আর B(5) = 1 + 15 + 25 + 10 + 1 = 52. সারণি না বানিয়েও B(n) বের করার একটি নিজস্ব recurrence আছে।

উপপাদ্য ৪.১ (Bell-এর recurrence)

B(0) = 1, আর প্রতিটি n ≥ 0-এর জন্য

B(n + 1) = ∑k=0n C(n, k) · B(k)

  1. {1, …, n + 1}-এর একটি partition নিন, আর n + 1 যে অংশে আছে, তাকে বলুন “বিশেষ অংশ”. — একটি উপাদান আলাদা করে ধরা
  2. বিশেষ অংশের বাইরে থাকা উপাদানের সংখ্যা k ধরুন (0 ≤ k ≤ n). কোন k-টি উপাদান বাইরে, তা {1, …, n} থেকে C(n, k) উপায়ে বাছা যায়; বাকি n − k-টি n + 1-এর সঙ্গে বিশেষ অংশে। — বাছাই
  3. বাইরের k-টি উপাদান নিজেরা যেকোনোভাবে ভাগ হতে পারে: B(k) উপায় (k = 0 হলে B(0) = 1, “কিছু ভাগ না করা”)। — সংজ্ঞা
  4. বাছাই আর ভাগ মিলে partition-টি অনন্যভাবে ফেরত আসে, তাই k অনুযায়ী যোগ করে সূত্রটি পাওয়া যায়। ∎ — যোগ ও গুণের নিয়ম

যাচাই: B(4) = C(3, 0)B(0) + C(3, 1)B(1) + C(3, 2)B(2) + C(3, 3)B(3) = 1 + 3 + 6 + 5 = 15. খেয়াল করুন, Catalan-এর recurrence-এ দুটি ছোট অংশ “গুণ” হয়, এখানে একটি বাছাই আর একটি ছোট অংশ; তাই Bell সংখ্যা Catalan-এর চেয়ে অনেক দ্রুত বাড়ে (C10 = 16796, কিন্তু B(10) = 115975).

এখন দুটি সারণিই brute force দিয়ে যাচাই করা যাক। একটি partition হাতে বানানোর বদলে নিচের কোড {0, …, n − 1} থেকে নিজের মধ্যে সব ফাংশন নেয়, আর প্রতিটির “একই মানে যাওয়া উপাদানগুলো” দিয়ে partition বানায় (উপপাদ্য ৩.৩-এর প্রমাণের ধাপ ২)। একই partition অনেক ফাংশন থেকে আসে, তাই একটি সেটে জমিয়ে আলাদাগুলো গোনা হয়। n = 6-এ 66 = 46656টি ফাংশন; এর বেশি নিলে ব্রাউজারে ধীর হবে, brute force-এর সীমা এখানেই। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।

from itertools import product
from math import comb

N = 10
S = [[0] * (N + 1) for _ in range(N + 1)]
S[0][0] = 1
for n in range(1, N + 1):
    for k in range(1, n + 1):
        S[n][k] = k * S[n - 1][k] + S[n - 1][k - 1]
for n in range(1, 7):
    print(f"n={n}:", S[n][1:n + 1])

def brute(n):                # every map {0..n-1} -> {0..n-1}
    seen = set()             # its fibres form a set partition
    for f in product(range(n), repeat=n):
        blocks = {}
        for i, v in enumerate(f):
            blocks.setdefault(v, []).append(i)
        seen.add(frozenset(tuple(b) for b in blocks.values()))
    count = [0] * (n + 1)
    for p in seen:
        count[len(p)] += 1
    return count

bf = {n: brute(n) for n in range(1, 7)}
print("brute == table for n <= 6:",
      all(bf[n] == S[n][:n + 1] for n in range(1, 7)))

B = [1]
for n in range(N):           # B(n+1) = sum C(n,k) B(k)
    B.append(sum(comb(n, k) * B[k] for k in range(n + 1)))
print("Bell by recurrence:", B)
print("Bell = row sums   :", [sum(S[n]) for n in range(N + 1)])
print("brute force Bell  :", [sum(bf[n]) for n in range(1, 7)])

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

n=1: [1]
n=2: [1, 1]
n=3: [1, 3, 1]
n=4: [1, 7, 6, 1]
n=5: [1, 15, 25, 10, 1]
n=6: [1, 31, 90, 65, 15, 1]
brute == table for n <= 6: True
Bell by recurrence: [1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975]
Bell = row sums   : [1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975]
brute force Bell  : [1, 2, 5, 15, 52, 203]

প্রথম ছয় লাইন Stirling-এর ত্রিভুজ; চতুর্থ সারি 1, 7, 6, 1, stepper-এর সারি। প্রতিটি সারির দ্বিতীয় ঘর 2n−1 − 1 (1, 3, 7, 15, 31) আর শেষের আগের ঘর C(n, 2) (1, 3, 6, 10, 15), ওপরের দুই হিসাব অনুযায়ী। Brute force আর recurrence n ≤ 6-এ প্রতিটি ঘরে মিলেছে। Bell-এর দুটি হিসাব, উপপাদ্য ৪.১-এর recurrence আর সারির যোগফল, ১১টি মানেই হুবহু এক, আর brute force-এর গণনাও তাদের সঙ্গে মেলে: পাঁচজন গ্রাহকের ৫২ রকম দলভাগ। খেয়াল করুন, brute force 46656টি ফাংশন ঘেঁটে 203টি partition পায়, আর recurrence তিনটি গুণ-যোগে।

৫ · প্রথম ধরনের Stirling সংখ্যা — cycle আর গোল টেবিল

একটি permutation σ-কে তীর হিসেবে আঁকুন: i থেকে σ(i)-তে তীর। প্রতিটি উপাদান থেকে ঠিক একটি তীর বের হয় আর একটি ঢোকে, তাই তীর ধরে হাঁটলে একসময় শুরুর জায়গায় ফেরত আসতেই হয়। এভাবে উপাদানগুলো কয়েকটি বৃত্তে ভাগ হয়, প্রতিটিকে বলে একটি cycle. যেমন {1, …, 6}-এ σ = (1 3 5)(2 6)(4) মানে 1 → 3 → 5 → 1, 2 → 6 → 2, আর 4 নিজের জায়গায় (একটি fixed point, পর্ব ৪০)। একটি cycle হলো একটি গোল টেবিল: (1 3 5) আর (3 5 1) একই বসার ব্যবস্থা, কারণ প্রত্যেকের ডানের মানুষ একই।

সংজ্ঞা ৫.১

{1, …, n}-এর যে permutation-গুলোর ঠিক k-টি cycle, তাদের সংখ্যা প্রথম ধরনের (unsigned) Stirling সংখ্যা c(n, k). সমতুল্যভাবে: n জনকে ঠিক k-টি অভিন্ন গোল টেবিলে বসানোর উপায়, প্রতিটি টেবিলে অন্তত একজন। প্রথা: c(0, 0) = 1, n ≥ 1-এ c(n, 0) = 0.

ছোট মান: c(n, n) = 1 (প্রত্যেকে একা, identity permutation). c(n, 1) = (n − 1)!: একটি গোল টেবিলে n জন, ১ নম্বরকে স্থির ধরে বাকিদের (n − 1)! বিন্যাস (পর্ব ৩১-এর circular permutation). আর ∑k c(n, k) = n!, কারণ প্রতিটি permutation-এর কোনো একটি cycle-সংখ্যা আছে। চার প্যাকারের দুই গোল টেবিল: c(4, 2) = 11 (তিনজন এক টেবিলে: 4 × 2 = 8 রকম, দুজন-দুজন: 3 রকম)।

উপপাদ্য ৫.২ (প্রথম ধরনের recurrence)

n ≥ 1 আর k ≥ 1-এর জন্য

c(n, k) = (n − 1) · c(n − 1, k) + c(n − 1, k − 1)

  1. শেষ অতিথি n-কে দেখুন: হয় তিনি একা একটি টেবিলে (n একটি fixed point), নয়তো অন্যদের সঙ্গে। — যোগের নিয়ম
  2. একা হলে তাঁকে সরালে বাকি n − 1 জনের k − 1 টেবিলের একটি ব্যবস্থা; এটি bijection, তাই c(n − 1, k − 1) উপায়। — bijection
  3. অন্যদের সঙ্গে থাকলে n-কে উঠিয়ে দিন (তাঁর বাঁয়ের মানুষ এখন সরাসরি তাঁর ডানের মানুষের পাশে); বাকি n − 1 জনের k টেবিলের একটি ব্যবস্থা থাকে। — cycle থেকে উপাদান মোছা
  4. উল্টো দিকে n-কে বসানো যায় বাকি n − 1 জনের যেকোনো একজনের ঠিক ডানে, আর প্রতিটি পছন্দ ভিন্ন ব্যবস্থা দেয়: n − 1 উপায়। তাই এই ক্ষেত্রে (n − 1) · c(n − 1, k). — গুণের নিয়ম
  5. দুই ক্ষেত্র যোগ করলে সূত্রটি আসে। ∎ — যোগের নিয়ম

S(n, k)-এর recurrence-এর সঙ্গে তুলনা করুন: সেখানে গুণক k (কোন দলে ঢুকবে), এখানে n − 1 (কোন মানুষের পাশে বসবে)। দল শুধু সদস্য দিয়ে চেনা যায়, টেবিলে বসার ক্রমও গোনে।

উপপাদ্য ৫.৩ (rising factorial)

প্রতিটি n ≥ 0-এর জন্য rising factorial x(x + 1)(x + 2)⋯(x + n − 1) = ∑k=0n c(n, k)xk.

  1. বাঁ পাশকে Rn(x) বলুন; R0 = 1 আর Rn(x) = Rn−1(x) · (x + n − 1). — সংজ্ঞা
  2. Rn−1-এর xk-এর সহগ c(n − 1, k) ধরে (induction hypothesis), Rn-এর xk-এর সহগ = c(n − 1, k − 1) (x দিয়ে গুণ থেকে) + (n − 1)c(n − 1, k) (n − 1 দিয়ে গুণ থেকে)। — polynomial গুণ
  3. উপপাদ্য ৫.২ অনুযায়ী এটি c(n, k), আর ভিত্তি n = 0 সত্য। ∎ — induction (পর্ব ১০)

উদাহরণ: x(x + 1)(x + 2)(x + 3) = x4 + 6x3 + 11x2 + 6x, সহগগুলো c(4, ·) = 6, 11, 6, 1. x-এর জায়গায় −x বসালে চিহ্নসহ (signed) Stirling সংখ্যা আসে, যা উপপাদ্য ৩.৩-এর উল্টো দিক: falling factorial-কে ঘাতে ভাঙে। Knuth-এর বইয়ে c(n, k)-কে বন্ধনীর ভেতরে n-এর নিচে k লিখে প্রকাশ করা হয়; বই ভেদে প্রতীক বদলায়, তাই কোন বই unsigned আর কোন বই signed অর্থে লিখছে, তা দেখে নিন।

Harmonic number ফিরে আসে। পর্ব ৪০ “Random variable আর প্রত্যাশা — linearity-র জাদু”-এ harmonic number Hn = 1 + 1/2 + ⋯ + 1/n এসেছিল record-এর প্রত্যাশিত সংখ্যা আর coupon collector-এ। এখানে দুটি নতুন রূপ:

  1. c(n + 1, 2) = n! · Hn. Rn+1(x) = x · (x + 1)⋯(x + n)-এ x2-এর সহগ = (x + 1)⋯(x + n)-এ x-এর সহগ, অর্থাৎ প্রতিটি গুণনীয়ক থেকে একবার x নিয়ে বাকিদের ধ্রুবক গুণ: ∑j=1n n!/j = n! Hn. যেমন c(4, 2) = 6 · 11/6 = 11.
  2. এলোমেলো permutation-এ গড় cycle-সংখ্যা Hn. গড় = ∑ k c(n, k)/n! = Rn′(1)/Rn(1). Rn(1) = n!, আর গুণফলের derivative-এর নিয়মে Rn′(1)/Rn(1) = ∑j=0n−1 1/(1 + j) = Hn. ১০০০ জনের permutation-এ গড়ে মাত্র ৭.৫টির মতো cycle.

পর্ব ৪০-এর record আর এখানকার cycle-এর গড় একই Hn হওয়া কাকতালীয় নয়: k-টি record আছে এমন permutation-এর সংখ্যাও c(n, k), যা একটি সুন্দর bijection (Foata-র নামে পরিচিত) দেখায়। প্রমাণটি এখানে বাদ রাখা হলো।

from itertools import permutations
from fractions import Fraction
from math import factorial

N = 8
c = [[0] * (N + 1) for _ in range(N + 1)]
c[0][0] = 1
for n in range(1, N + 1):
    for k in range(1, n + 1):
        c[n][k] = (n - 1) * c[n - 1][k] + c[n - 1][k - 1]
def cycles(p):                       # number of cycles of a permutation
    seen, count = set(), 0
    for start in range(len(p)):
        count += start not in seen   # a new cycle starts here
        j = start
        while j not in seen:
            seen.add(j)
            j = p[j]
    return count
for n in range(1, 7):
    cnt = [0] * (n + 1)
    for p in permutations(range(n)):
        cnt[cycles(p)] += 1
    print(f"n={n} brute {cnt[1:]}  recurrence {c[n][1:n + 1]}")

poly = [1]                           # x(x+1)...(x+5), lowest power first
for j in range(6):                   # multiply by (x + j)
    poly = [(poly[i - 1] if i else 0) + j * (poly[i] if i < len(poly) else 0)
            for i in range(len(poly) + 1)]
print("coefficients of x(x+1)...(x+5):", poly[1:])

for n in (4, 6, 8):
    H = sum(Fraction(1, j) for j in range(1, n + 1))
    mean = Fraction(sum(k * c[n][k] for k in range(n + 1)), factorial(n))
    print(f"n={n}: mean number of cycles {mean}, H_n = {H}")

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

n=1 brute [1]  recurrence [1]
n=2 brute [1, 1]  recurrence [1, 1]
n=3 brute [2, 3, 1]  recurrence [2, 3, 1]
n=4 brute [6, 11, 6, 1]  recurrence [6, 11, 6, 1]
n=5 brute [24, 50, 35, 10, 1]  recurrence [24, 50, 35, 10, 1]
n=6 brute [120, 274, 225, 85, 15, 1]  recurrence [120, 274, 225, 85, 15, 1]
coefficients of x(x+1)...(x+5): [120, 274, 225, 85, 15, 1]
n=4: mean number of cycles 25/12, H_n = 25/12
n=6: mean number of cycles 49/20, H_n = 49/20
n=8: mean number of cycles 761/280, H_n = 761/280

৬ পর্যন্ত সব permutation-এর (৭২০টি পর্যন্ত) cycle গুনে পাওয়া সংখ্যা recurrence-এর সারণির সঙ্গে প্রতিটি ঘরে মিলেছে; চতুর্থ সারির 11 হলো চার প্যাকারের দুই গোল টেবিল। cycles function একটি নতুন, এখনো না-দেখা উপাদান থেকে শুরু করে তীর ধরে হাঁটে আর ফেরত এলে থামে। পরের লাইনে x(x + 1)⋯(x + 5)-এর সহগ (x1 থেকে x6) হুবহু ষষ্ঠ সারি, উপপাদ্য ৫.৩ অনুযায়ী; প্রথম ঘর 120 = 5! = c(6, 1), দ্বিতীয় 274 = 5! · H5 = 120 · 137/60. শেষ তিন লাইনে Fraction দিয়ে নিখুঁত গড়: প্রতিবার গড় cycle-সংখ্যা ঠিক Hn, কোনো দশমিক rounding ছাড়াই।

৬ · Integer partition আর Ferrers diagram

এবার বলগুলোও অভিন্ন। বাজারঘরের গুদামে n কেজি চাল যেকোনো মাপের প্যাকেটে ভরা হবে, আর প্যাকেটগুলো একই রকম দেখতে; শুধু কোন কোন মাপের প্যাকেট, সেটিই তথ্য। এটি n-এর একটি partition: n-কে ধনাত্মক পূর্ণসংখ্যার যোগফলে লেখা, যেখানে ক্রম গুরুত্বহীন। প্রথা হিসেবে অংশগুলো বড় থেকে ছোট ক্রমে লেখা হয়, যেমন 5 + 3 + 1. সব partition-এর সংখ্যা p(n): p(4) = 5, p(7) = 15. পর্ব ৪৮-এ দেখেছেন ∑p(n)xn = ∏1/(1 − xk), আর Euler-এর “আলাদা অংশ = বিজোড় অংশ” উপপাদ্যের generating function প্রমাণ; সেগুলো এখানে আবার হবে না। এই অংশের হাতিয়ার একটি ছবি।

সংজ্ঞা ৬.১ (Ferrers diagram আর conjugate)

λ = λ1 + λ2 + ⋯ + λm (λ1 ≥ λ2 ≥ ⋯ ≥ λm ≥ 1)-এর Ferrers diagram হলো বাঁ দিকে সমান করে সাজানো m-টি সারির বিন্দু, i-তম সারিতে λi-টি। Diagram-টিকে প্রধান কর্ণ বরাবর উল্টে দিলে (সারি হয় কলাম) যে partition পাওয়া যায়, তা λ-এর conjugate λ′: λ′-এর j-তম অংশ = λ-এর যে কয়টি অংশ ≥ j.

5 + 3 + 1 আর তার conjugate 3 + 2 + 2 + 1 + 1

বাঁয়ে সারি পড়লে 5, 3, 1. একই বিন্দুগুলো কলাম ধরে পড়লে 3, 2, 2, 1, 1; ডানে সেই কলামগুলোই সারি হিসেবে আঁকা। প্রথম কলাম (সবুজ) হয়ে যায় প্রথম সারি।

Ferrers diagram of 5+3+1 and its conjugate 3+2+2+1+1 λ = 5 + 3 + 1 531 কলাম: 3, 2, 2, 1, 1 উল্টানো λ′ = 3+2+2+1+1 32211 অংশের সংখ্যা 3 ↔ সবচেয়ে বড় অংশ 3 সবচেয়ে বড় অংশ 5 ↔ অংশের সংখ্যা 5
1λ = 5+3+1, সারি আঁকা2কলাম 1: কয়টি অংশ ≥ 1?3কলাম 2, 3: অংশ ≥ 2, ≥ 34কলাম 4, 5: অংশ ≥ 4, ≥ 55λ′ = 3+2+2+1+1, λ″ = λ
Ferrers diagram
ছবি
পড়া কলাম
যোগফল
  1. ছবি আঁকা। λ = 5 + 3 + 1: প্রথম সারিতে ৫টি, দ্বিতীয়তে ৩টি, তৃতীয়তে ১টি বিন্দু, সব বাঁ দিকে সমান করে (ফাঁপা ○ শুধু ফাঁকা জায়গা দেখায়)। মোট ৯টি বিন্দু।
  2. কলাম ১। প্রথম কলামে প্রতিটি সারির একটি বিন্দু, অর্থাৎ যে কয়টি অংশ ≥ 1: তিনটি। তাই λ′-এর প্রথম অংশ 3 = λ-এর অংশের সংখ্যা।
  3. কলাম ২ আর ৩। দ্বিতীয় কলামে বিন্দু শুধু সেসব সারিতে যাদের দৈর্ঘ্য ≥ 2 (5 আর 3): দুটি। তৃতীয় কলামে দৈর্ঘ্য ≥ 3: আবার 5 আর 3, দুটি।
  4. কলাম ৪ আর ৫। দৈর্ঘ্য ≥ 4 আর ≥ 5 শুধু প্রথম সারি, তাই একটি করে। কলাম মোট ৫টি = λ-এর সবচেয়ে বড় অংশ। বিন্দু হারায়নি: 3 + 2 + 2 + 1 + 1 = 9.
  5. ফল। λ′ = 3 + 2 + 2 + 1 + 1. ছবিটি আবার উল্টালে মূল 5 + 3 + 1 ফেরত আসে (λ″ = λ), তাই conjugation নিজেই নিজের inverse: একটি bijection.
উপপাদ্য ৬.২ (conjugation)

প্রতিটি n ≥ 1 আর k ≥ 1-এর জন্য, n-এর যে partition-গুলোতে বড়জোর k-টি অংশ, তাদের সংখ্যা = n-এর যে partition-গুলোর প্রতিটি অংশ ≤ k, তাদের সংখ্যা। একইভাবে, ঠিক k-টি অংশ = সবচেয়ে বড় অংশ ঠিক k.

  1. Conjugation একটি partition-কে n-এরই আরেকটি partition-এ নেয়, কারণ ছবি উল্টালে বিন্দুর সংখ্যা বদলায় না। — বিন্দু গোনা
  2. λ-এর অংশের সংখ্যা = ছবির সারির সংখ্যা = প্রথম কলামের দৈর্ঘ্য = λ′-এর সবচেয়ে বড় অংশ। — সংজ্ঞা ৬.১
  3. দুবার উল্টালে মূল ছবি, তাই conjugation নিজের inverse, অর্থাৎ bijection. — involution
  4. তাই “বড়জোর k অংশ”-এর সেটকে conjugation এক-এক ও সম্পূর্ণভাবে “সবচেয়ে বড় অংশ ≤ k”-এর সেটে নেয়; দুই সেটের আকার সমান। ∎ — bijective proof

উদাহরণ n = 8, k = 3: বড়জোর ৩ অংশের partition ১০টি, আর ১, ২, ৩ দিয়ে তৈরি partition-ও ১০টি (§৯-এ তালিকা)। Generating function-এর ভাষায় এর অর্থ: অংশ ≤ k-এর partition গোনে ∏j=1k 1/(1 − xj), অর্থাৎ শুধু ১, ২, …, k টাকার কয়েনে খুচরো (পর্ব ৪৮)। তাই “বড়জোর k অংশ”-এর প্রশ্নও একই কয়েন-গণনা।

ঠিক k অংশের recurrence. pk(n) = n-এর ঠিক k অংশের partition-এর সংখ্যা ধরুন। তাহলে n ≥ k ≥ 1-এ

pk(n) = pk−1(n − 1) + pk(n − k)

প্রমাণ দুই ক্ষেত্রে: সবচেয়ে ছোট অংশ যদি 1 হয়, সেটি মুছলে n − 1-এর ঠিক k − 1 অংশের partition (bijection). নইলে সব অংশ ≥ 2, তখন প্রতিটি অংশ থেকে 1 করে বাদ দিলে (ছবির প্রথম কলাম মুছলে) n − k-এর ঠিক k অংশের partition, আর উল্টো দিকে প্রতিটি অংশে 1 যোগ করে ফেরত। শুরুর মান p0(0) = 1, আর n < k হলে pk(n) = 0. উদাহরণ: p3(7) = p2(6) + p3(4) = 3 + 1 = 4 (5+1+1, 4+2+1, 3+3+1, 3+2+2). ∎

৭ · Pentagonal উপপাদ্য আর p(n)-এর দ্রুত হিসাব

p(n)-এর কোনো সরল closed form নেই, আর brute force-এ তালিকা বানানো দ্রুত অচল হয়: p(100) প্রায় ১৯ কোটি। পর্ব ৪৮-এর গুণফল ∏1/(1 − xk) দিয়ে xN পর্যন্ত হিসাবে মোটামুটি N2 কাজ লাগে। Euler এর চেয়েও দ্রুত একটি পথ দেন, যা আসে গুণফলের উল্টো থেকে।

উপপাদ্য ৭.১ (Euler-এর pentagonal number theorem, বক্তব্য)

∏k≥1(1 − xk) = 1 − x − x2 + x5 + x7 − x12 − x15 + x22 + x26 − ⋯

অর্থাৎ ডান পাশে শুধু g = j(3j − 1)/2 ঘাতগুলো আসে, j = 0, ±1, ±2, …, আর সহগ (−1)j. এই g-গুলোকে বলে generalized pentagonal number: 0, 1, 2, 5, 7, 12, 15, 22, 26, 35, 40, …

নামটি এসেছে এখান থেকে: j = 1, 2, 3-এ j(3j − 1)/2 = 1, 5, 12, যা পঞ্চভুজ আকারে সাজানো বিন্দুর সংখ্যা। ঋণাত্মক j থেকে আসে 2, 7, 15. প্রমাণটি এখানে বাদ রাখা হলো; বাম পাশ খুললে xn-এর সহগ = (জোড় সংখ্যক আলাদা অংশে n-এর partition) − (বিজোড় সংখ্যক আলাদা অংশে n-এর partition), আর F. Franklin-এর ১৮৮১ সালের একটি bijection দেখায় যে এই দুই দল প্রায় সবসময় সমান আকারের, শুধু pentagonal n-এ একটি বাড়তি থাকে। বক্তব্যটি আমরা n ≤ 40-এ যাচাই করব। এখন উপপাদ্য থেকে recurrence:

উপপাদ্য ৭.২ (p(n)-এর pentagonal recurrence)

p(0) = 1, আর n ≥ 1-এ (ঋণাত্মক সূচকের p ধরা হয় 0)

p(n) = p(n − 1) + p(n − 2) − p(n − 5) − p(n − 7) + p(n − 12) + p(n − 15) − ⋯

  1. P(x) = ∑p(n)xn = ∏1/(1 − xk), তাই P(x) · ∏(1 − xk) = 1. — পর্ব ৪৮-এর partition generating function
  2. উপপাদ্য ৭.১ বসালে P(x) · (1 − x − x2 + x5 + x7 − ⋯) = 1. — pentagonal উপপাদ্য
  3. n ≥ 1-এ ডান পাশের xn-এর সহগ 0, আর বাঁ পাশে convolution: p(n) − p(n − 1) − p(n − 2) + p(n − 5) + p(n − 7) − ⋯ = 0. — সহগ মেলানো
  4. p(n) বাদে বাকি পদ ডানে নিলে সূত্রটি আসে। ∎ — পক্ষান্তর

চিহ্নের ধাঁচ মনে রাখুন: দুটি যোগ, দুটি বিয়োগ, আবার দুটি যোগ (+ + − − + + − −)। প্রতি জোড়ায় j আর −j-এর দুটি pentagonal সংখ্যা। n-এর নিচে generalized pentagonal সংখ্যা মোটামুটি √n-এর মতো, তাই প্রতিটি p(n)-এ প্রায় √n-টি পদ, আর p(0…N) মিলে প্রায় N1.5 কাজ।

1p(n) = ∑ ± p(n − g)2g ≤ 7: 1, 2, 5, 73+p(6) + p(5) = 11 + 74−p(2) − p(0) = −2 − 15p(7) = 18 − 3 = 156১৫টি partition তালিকা ✓
p(0…6) জানা: 1 1 2 3 5 7 11
g
চিহ্ন
পদ
p(7)
  1. সূত্র। p(n) = p(n − 1) + p(n − 2) − p(n − 5) − p(n − 7) + p(n − 12) + ⋯; চিহ্ন + + − − ধাঁচে। আগের মানগুলো জানা: p(0…6) = 1, 1, 2, 3, 5, 7, 11.
  2. কোন পদ লাগবে। n = 7-এর জন্য 7-এর বেশি নয় এমন generalized pentagonal সংখ্যা 1, 2, 5, 7; পরেরটি 12 > 7, তাই বাকি সব পদ শূন্য।
  3. প্রথম জোড়া (যোগ)। p(7 − 1) + p(7 − 2) = p(6) + p(5) = 11 + 7 = 18.
  4. দ্বিতীয় জোড়া (বিয়োগ)। p(7 − 5) + p(7 − 7) = p(2) + p(0) = 2 + 1 = 3, চিহ্ন বিয়োগ।
  5. ফল। p(7) = 18 − 3 = 15. ছয়টি পূর্ববর্তী মান থাকলেও কাজে লাগল মাত্র চারটি।
  6. তালিকা মেলানো। 7; 6+1; 5+2; 5+1+1; 4+3; 4+2+1; 4+1+1+1; 3+3+1; 3+2+2; 3+2+1+1; 3+1+1+1+1; 2+2+2+1; 2+2+1+1+1; 2+1+1+1+1+1; 1+1+1+1+1+1+1: পনেরোটি।

নিচের ব্লক recurrence দিয়ে p(0…200) বের করে, n ≤ 40-এ প্রতিটি partition তালিকা করে মেলায় (p(40) = 37338টি তালিকা, brute force-এর সীমা প্রায় এখানেই), উপপাদ্য ৬.২ n ≤ 15-এ সব k-তে যাচাই করে, আর Hardy–Ramanujan-এর আনুমানিক সূত্রের সঙ্গে তুলনা করে।

from math import exp, pi, sqrt

def p_pentagonal(N):
    p = [1] + [0] * N
    for n in range(1, N + 1):
        k, total = 1, 0
        while k * (3 * k - 1) // 2 <= n:
            sign = 1 if k % 2 else -1          # + + - - + + - - ...
            for g in (k * (3 * k - 1) // 2, k * (3 * k + 1) // 2):
                if g <= n:
                    total += sign * p[n - g]
            k += 1
        p[n] = total
    return p

def brute(n, largest):                       # list every partition
    if n == 0:
        return [[]]
    return [[k] + rest for k in range(min(n, largest), 0, -1)
            for rest in brute(n - k, k)]

p = p_pentagonal(200)
print("p(0..15):", p[:16])
print("pentagonal == brute for n <= 40:",
      all(p[n] == len(brute(n, n)) for n in range(41)))
ok = all(sum(len(q) <= k for q in brute(n, n)) == len(brute(n, k))
         for n in range(1, 16) for k in range(1, n + 1))
print("<= k parts == parts <= k (n <= 15):", ok)
print("p(100) =", p[100], "  p(200) =", p[200])
for n in (10, 100, 200):
    hr = exp(pi * sqrt(2 * n / 3)) / (4 * n * sqrt(3))
    print(f"n={n}: Hardy-Ramanujan {hr:.4g}, ratio {hr / p[n]:.4f}")
print("p(5k+4) % 5 == 0 for 5k+4 <= 200:",
      all(p[n] % 5 == 0 for n in range(4, 201, 5)))

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

p(0..15): [1, 1, 2, 3, 5, 7, 11, 15, 22, 30, 42, 56, 77, 101, 135, 176]
pentagonal == brute for n <= 40: True
<= k parts == parts <= k (n <= 15): True
p(100) = 190569292   p(200) = 3972999029388
n=10: Hardy-Ramanujan 48.1, ratio 1.1453
n=100: Hardy-Ramanujan 1.993e+08, ratio 1.0457
n=200: Hardy-Ramanujan 4.1e+12, ratio 1.0320
p(5k+4) % 5 == 0 for 5k+4 <= 200: True

প্রথম লাইনে p(7) = 15, stepper-এর উত্তর। দ্বিতীয় লাইন বলে, recurrence আর পূর্ণ তালিকা ৪১টি n-এর প্রতিটিতে মিলেছে, অর্থাৎ উপপাদ্য ৭.১-এর বক্তব্য অন্তত x40 পর্যন্ত সঠিক। তৃতীয় লাইন conjugation উপপাদ্য ১২০টি (n, k) জোড়ায় যাচাই করে: brute(n, k) ঠিক “সবচেয়ে বড় অংশ ≤ k”-এর তালিকা দেয়। p(100) = 190569292, আর p(200) প্রায় চার লক্ষ কোটি, তবু হিসাবটি এক নিমেষে, কারণ Python-এর int নিখুঁত বড় সংখ্যা রাখে। Hardy–Ramanujan-এর সূত্র eπ√(2n/3)/(4n√3) n = 10-এ ১৪% বেশি, n = 200-এ ৩% বেশি: আপেক্ষিক ভুল ধীরে কমে, যেমন একটি asymptotic সূত্রে আশা করা হয়। শেষ লাইন Ramanujan-এর একটি congruence-এর সংখ্যাগত পরীক্ষা: p(4), p(9), …, p(199) সবই ৫ দিয়ে বিভাজ্য।

ইতিহাস: Euler pentagonal উপপাদ্যটি ১৭৪০-এর দশকে অনুমান করেন আর ১৭৫০ সালের দিকে একটি প্রমাণ দেন বলে জানা যায়। Srinivasa Ramanujan (১৮৮৭–১৯২০), তামিলনাড়ুর একজন প্রায় স্বশিক্ষিত গণিতবিদ, ১৯১৪ সালে কেমব্রিজে G. H. Hardy-র সঙ্গে কাজ করতে যান। ১৯১৮ সালে তাঁরা p(n)-এর asymptotic সূত্র প্রকাশ করেন, যার প্রধান পদ ওপরের eπ√(2n/3)/(4n√3); তাঁদের পূর্ণ পদ্ধতিতে আরও সংশোধনী পদ যোগ করে p(200)-এর নিখুঁত মান পাওয়া যায় বলে বর্ণিত। সেই মান যাচাই করতে P. A. MacMahon pentagonal recurrence দিয়ে হাতে p(n)-এর সারণি ২০০ পর্যন্ত বানান বলে উল্লেখ আছে, ঠিক ওপরের কোড যা করে। পরে Hans Rademacher (১৯৩৭) এমন একটি অসীম ধারা দেন যা p(n)-এর নিখুঁত মানে পৌঁছায়। Ramanujan ১৯১৯ সালের দিকে p(5k + 4) ≡ 0 (mod 5), p(7k + 5) ≡ 0 (mod 7) আর p(11k + 6) ≡ 0 (mod 11) প্রমাণ বা ঘোষণা করেন।

৮ · কোন সংখ্যা কী গোনে — twelvefold way সম্পূর্ণ

এখন পর্ব ৩৫-এর সারণির ফাঁকা ঘরগুলো পূরণ করা যায়। প্রতিটি ঘরের পাশে n = 5 বল আর k = 3 বাক্সের মান দেওয়া হলো (scratch-এ brute force দিয়ে প্রতিটি মেলানো)।

n বল → k বাক্সযেকোনোভাবেপ্রতি বাক্সে ≤ ১টিপ্রতি বাক্সে ≥ ১টি
আলাদা বল, আলাদা বাক্সkn = 243k(k − 1)⋯(k − n + 1) = 0k! S(n, k) = 150
একই বল, আলাদা বাক্সC(n + k − 1, n) = 21C(k, n) = 0C(n − 1, k − 1) = 6
আলাদা বল, একই বাক্স∑j≤k S(n, j) = 41n ≤ k হলে 1, নইলে 0 → 0S(n, k) = 25
একই বল, একই বাক্স∑j≤k pj(n) = 5n ≤ k হলে 1, নইলে 0 → 0pk(n) = 2

গাঢ় চারটি ঘর এই পর্বের। নিচের-বাঁ ঘর 5 = 5, 4+1, 3+2, 3+1+1, 2+2+1 (বড়জোর ৩ অংশ), আর নিচের-ডান 2 = 3+1+1, 2+2+1. আরেকটি জিনিস লক্ষ করুন: একই বাক্সের ঘর থেকে আলাদা বাক্সের ঘরে যেতে k! দিয়ে গুণ কাজ করে শুধু “≥ ১টি” কলামে, কারণ সেখানে সব বাক্স অশূন্য বলে আলাদা; “যেকোনোভাবে” কলামে খালি বাক্সগুলো অদলবদলে নতুন কিছু হয় না, তাই সেখানে এই গুণ ভুল (41 × 6 ≠ 243).

পুরো মডিউলের “বিশেষ সংখ্যা” এক জায়গায়:

সংখ্যাকী গোনেrecurrenceপ্রথম মান
Cn (Catalan)মেলানো বন্ধনী, binary tree, না-কাটা করমর্দন∑CiCn−i1, 1, 2, 5, 14, 42
S(n, k)নামহীন k দলে ভাগkS(n−1, k) + S(n−1, k−1)S(5, ·): 1, 15, 25, 10, 1
B(n) (Bell)সব রকম দলভাগ∑C(n, k)B(k)1, 1, 2, 5, 15, 52
c(n, k)k-টি cycle, k গোল টেবিল(n−1)c(n−1, k) + c(n−1, k−1)c(5, ·): 24, 50, 35, 10, 1
p(n), pk(n)অভিন্ন বস্তুর আকার-ভাগpentagonal; pk−1(n−1) + pk(n−k)1, 1, 2, 3, 5, 7, 11
Dn (derangement)কোনো fixed point নেই(n−1)(Dn−1 + Dn−2)1, 0, 1, 2, 9, 44
Hnগড় cycle বা recordHn−1 + 1/n1, 3/2, 11/6, 25/12

Derangement-এর recurrence আর তার প্রমাণ পর্ব ৪৯-এর বিষয়; এখানে শুধু সারণি সম্পূর্ণ করতে রাখা হলো। একটি নতুন প্রশ্ন এলে প্রথমে জিজ্ঞেস করুন: বস্তুগুলো আলাদা কি না, দল বা বাক্সের নাম আছে কি না, আর দলের ভেতরে ক্রম (গোল টেবিল) গোনে কি না। এই তিন উত্তর প্রায় সবসময় সারণির একটি সারি দেখিয়ে দেয়।

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

অঙ্ক ১: দল আর রাইডার

বাজারঘরের ৬টি আলাদা অর্ডারকে (ক) তিনটি নামহীন অশূন্য ব্যাচে ভাগ করার উপায়, আর (খ) তিনজন নামসহ রাইডারের মধ্যে ভাগের উপায় (প্রত্যেকে অন্তত একটি) কত?

  1. (ক) S(6, 3). সারি ৫ থেকে: S(6, 3) = 3 · S(5, 3) + S(5, 2) = 3 · 25 + 15 = 90.
  2. (খ) ব্যাচগুলো তিনজনকে 3! উপায়ে: 6 · 90 = 540.
  3. যাচাই (inclusion–exclusion, পর্ব ৪৯): 36 − 3 · 26 + 3 · 16 = 729 − 192 + 3 = 540. দুই পথ মিলেছে।

অঙ্ক ২: দুটি গোল টেবিল

৬ জন অতিথিকে দুটি একই রকম গোল টেবিলে বসাতে হবে, কোনো টেবিল খালি নয়; শুধু কে কার ডানে বসলেন তা গুরুত্বপূর্ণ। কয় উপায়ে?

  1. এটি c(6, 2). Recurrence: c(6, 2) = 5 · c(5, 2) + c(5, 1) = 5 · 50 + 24 = 274.
  2. যাচাই harmonic রূপে: c(6, 2) = 5! · H5 = 120 · 137/60 = 274.
  3. আরেক যাচাই, টেবিলের আকার ধরে: (5, 1)-এ 6 · 4! = 144, (4, 2)-এ C(6, 2) · 3! · 1! = 90, (3, 3)-এ C(6, 3) · 2! · 2!/2 = 40; মোট 274. (3, 3)-এ 2 দিয়ে ভাগ, কারণ সমান আকারের দুই টেবিল অদলবদলে নতুন ব্যবস্থা হয় না।

অঙ্ক ৩: বড়জোর তিন অংশ

৮ কেজি চাল বড়জোর ৩টি অভিন্ন বস্তায় (পূর্ণসংখ্যা কেজিতে, কোনো বস্তা খালি নয়) কয় রকমে ভরা যায়?

  1. এটি ৮-এর বড়জোর ৩ অংশের partition; উপপাদ্য ৬.২ অনুযায়ী = ৮-এর যে partition-এর সব অংশ ≤ 3.
  2. অংশ ≤ 3-এর তালিকা: 3+3+2, 3+3+1+1, 3+2+2+1, 3+2+1+1+1, 3+1×5, 2+2+2+2, 2+2+2+1+1, 2+2+1×4, 2+1×6, 1×8: ১০টি।
  3. সরাসরি যাচাই: 1 অংশ (8): ১টি; 2 অংশ (7+1, 6+2, 5+3, 4+4): ৪টি; 3 অংশ: ৫টি (6+1+1, 5+2+1, 4+3+1, 4+2+2, 3+3+2). 1 + 4 + 5 = 10.

অঙ্ক ৪: Bell সংখ্যা recurrence-এ

B(0…4) = 1, 1, 2, 5, 15 জানা থাকলে B(5) বের করুন। উত্তর: B(5) = C(4, 0) · 1 + C(4, 1) · 1 + C(4, 2) · 2 + C(4, 3) · 5 + C(4, 4) · 15 = 1 + 4 + 12 + 20 + 15 = 52, আর সারি ৫-এর যোগ 1 + 15 + 25 + 10 + 1-ও 52.

যুক্তির ভুল ধরুন: “S(n, k)-এর recurrence”

একজন লিখলেন: “উপাদান n হয় একা থাকে, তখন S(n − 1, k − 1) উপায়; নয়তো আগের k দলের সঙ্গে যোগ দেয়, তখন S(n − 1, k) উপায়। দলগুলোর নাম নেই, তাই কোন দলে যোগ দিল তা গোনার দরকার নেই। অতএব S(n, k) = S(n − 1, k) + S(n − 1, k − 1).”

ভুল কোথায়: “নাম নেই” মানে partition-গুলোর মধ্যে দলের ক্রম নেই, কিন্তু (n − 1)-এর একটি নির্দিষ্ট partition-এ k-টি দল সদস্য দিয়েই আলাদা চেনা যায়, আর n কোন দলে গেল তার প্রতিটি পছন্দ ভিন্ন partition দেয়। তাই গুণক k লাগবে। ছোট মানে ধরা পড়ে: ভুল সূত্রে S(3, 2) = S(2, 2) + S(2, 1) = 2, অথচ তালিকায় তিনটি ({1}{23}, {2}{13}, {3}{12})। এই ভুল সূত্রটি আসলে Pascal-এর সূত্র, যা C(n, k) দেয়, Stirling সংখ্যা নয়। শিক্ষা: প্রতিটি recurrence-এর ফল n = 3 বা 4-এ পূর্ণ তালিকার সঙ্গে মেলান।

আরও গভীরে: Ferrers diagram-এর বিন্দুর জায়গায় বাক্স বসিয়ে সংখ্যা লিখলে পাওয়া যায় Young tableau, আর একটি নির্দিষ্ট আকারের “standard” tableau-র সংখ্যা hook length formula দিয়ে গোনা যায় (Frame, Robinson আর Thrall, ১৯৫৪); 2 × n আকারে উত্তর আবার Cn. এই বস্তুগুলো symmetric group-এর representation theory-র কেন্দ্রে। Bell সংখ্যার EGF হলো eex − 1 (পর্ব ৪৮-এর (ex − 1)k/k!-কে সব k-এ যোগ), আর Ramanujan-এর congruence-গুলোর গভীর কারণ খুঁজতে আধুনিক গবেষণা modular form পর্যন্ত গেছে।

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

  • S(4, 2) কত, আর কেন? 7; 24−1 − 1, অথবা recurrence 2 · 3 + 1.
  • ৫ জনকে যেকোনো সংখ্যক নামহীন দলে ভাগ? Bell সংখ্যা B(5) = 52.
  • ৪ জনকে দুটি অভিন্ন গোল টেবিলে? c(4, 2) = 11.
  • p(7) কত? 15; pentagonal recurrence-এ 11 + 7 − 2 − 1.
  • ৬টি matrix গুণের বন্ধনী কয় রকম? C5 = 42.

১০ · AI-এর যুগে — বিশেষ সংখ্যার দাবি যাচাই

এই সংখ্যাগুলোর নাম আর প্রতীক বই ভেদে বদলায়, প্রথম কয়েকটি মান অনেক পরিবারে মিলে যায়, আর একটি চিহ্ন বা গুণকের ভুল সহজে চোখ এড়ায়। AI সহকারী এসব হিসাব আত্মবিশ্বাসের সঙ্গে লেখে, কিন্তু কয়েকটি ভুল নিয়মিত দেখা যায়:

AI-এর ভুলকীভাবে ধরবেন
দুই ধরনের Stirling সংখ্যা গুলিয়ে ফেলা, বা recurrence-এ k আর n − 1 গুণক অদলবদলn = 4-এ সারি হাতে বানান: 1, 7, 6, 1 বনাম 6, 11, 6, 1
“নামহীন দল” মানে k! দিয়ে ভাগ, খালি বাক্স থাকলেওছোট n-এ সব ভাগ তালিকা করে গুনুন
প্রথম চারটি মান মিলিয়ে “এটি Catalan” ঘোষণাপঞ্চম আর ষষ্ঠ মান দেখুন (14 না 15), আর recurrence প্রমাণ চান
Pentagonal recurrence-এ চিহ্নের ধাঁচ + − + − লেখাp(5) বা p(7) হাতে বের করে মেলান
signed আর unsigned Stirling, বা বইয়ের প্রতীক মিশিয়ে ফেলাকোন সংজ্ঞা, তা স্পষ্ট লিখতে বলুন
Hardy–Ramanujan বা Euler-এর সাল ও উদ্ধৃতি বানিয়ে বলাবিশ্বস্ত পাঠ্যবই বা মূল উৎসে মেলান

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

নিচের গণনার প্রশ্নটি সমাধান করো: প্রশ্ন: [যেমন ৭ জনকে ৩টি অভিন্ন গোল টেবিলে বসানো, কোনো টেবিল খালি নয়] ১. বস্তুগুলো আলাদা না অভিন্ন, দল বা বাক্সের নাম আছে কি না, আর দলের ভেতরে ক্রম গোনে কি না, প্রথমে লেখো। ২. কোন সংখ্যা-পরিবার (Catalan, S(n, k), c(n, k), Bell, partition) কেন, তার যুক্তি দাও। ৩. যে recurrence ব্যবহার করবে, তার combinatorial প্রমাণ সংক্ষেপে দাও আর শুরুর মান স্পষ্ট লেখো। ৪. সারণির প্রতিটি সারি দেখাও, শুধু শেষ উত্তর নয়। ৫. ছোট n-এ সব বিন্যাস তালিকা করে গোনার Python কোড দাও (শুধু itertools আর int), যাতে আমি recurrence-এর সঙ্গে মেলাতে পারি। ৬. কোনো নাম, সাল বা বইয়ের প্রতীক নিয়ে নিশ্চিত না হলে তা স্পষ্ট বলো।

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

এই পর্বের প্রতিটি সংখ্যার পেছনে একই কৌশল: একটি বিশেষ উপাদান বা অংশ আলাদা করে ধরা, ক্ষেত্রগুলো ভাগ করা, আর প্রতিটি ক্ষেত্রকে একটি bijection দিয়ে ছোট প্রশ্নে নামানো। AI-এর দেওয়া recurrence পড়ার সময় জিজ্ঞেস করুন, কোন উপাদান আলাদা হলো আর প্রতিটি ক্ষেত্রে ফেরত পথ (inverse) আছে কি না। তারপর দশ লাইনের brute force দিয়ে ছোট n-এ মিলিয়ে নিন।

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

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

প্র ০১Ramanujan আর Hardy-র partition সূত্রের গল্প কী? একটি asymptotic সূত্র দিয়ে নিখুঁত পূর্ণসংখ্যা পাওয়া কীভাবে সম্ভব হলো?

Srinivasa Ramanujan ১৮৮৭ সালে দক্ষিণ ভারতের তামিলনাড়ুতে জন্মান। আনুষ্ঠানিক উচ্চশিক্ষা প্রায় ছিল না; একটি পুরোনো সূত্রের সংকলন বই থেকে তিনি নিজে নিজে গণিত শেখেন আর হাজার হাজার সূত্র খাতায় লেখেন। ১৯১৩ সালে কেমব্রিজের G. H. Hardy-কে চিঠি লেখার পর ১৯১৪ সালে সেখানে যান। পরের কয়েক বছরের কাজ গণিতের ইতিহাসে বিখ্যাত; অসুস্থ হয়ে দেশে ফিরে ১৯২০ সালে মাত্র ৩২ বছর বয়সে তিনি মারা যান। তাঁর জীবন উপমহাদেশের গণিতচর্চার একটি অনুপ্রেরণা, আর একই সঙ্গে মনে করিয়ে দেয় প্রতিভা খুঁজে পাওয়ার সুযোগ কত অসম ছিল।

Partition-এর প্রশ্নে তাঁদের ১৯১৮ সালের প্রবন্ধ একটি নতুন পদ্ধতি আনে, যা পরে “circle method” নামে পরিচিত হয়। পর্ব ৪৮-এর generating function ∏1/(1 − xk) একক বৃত্তের ভেতরে সংজ্ঞায়িত একটি ফাংশন, আর বৃত্তের ধারে ১-এর প্রতিটি মূলের (roots of unity) কাছে তা প্রচণ্ড বড় হয়। Cauchy-র সূত্রে p(n) একটি বৃত্তের ওপর integral; প্রতিটি “সমস্যার বিন্দু” থেকে একটি করে পদ আসে, x = 1-এর কাছ থেকে আসে সবচেয়ে বড়টি, যা এই পর্বের ব্লকে দেখা eπ√(2n/3)/(4n√3). Hardy আর Ramanujan আরও পদ যোগ করে দেখান যে যথেষ্ট পদ নিলে ভুল 1/2-এর কম হয়, আর তখন সবচেয়ে কাছের পূর্ণসংখ্যাটিই p(n).

সূত্রটি পরীক্ষা করতে নিখুঁত মান দরকার ছিল। P. A. MacMahon হাতে, pentagonal recurrence দিয়ে, p(1) থেকে p(200) পর্যন্ত হিসাব করেন বলে বর্ণিত, আর p(200) = 3972999029388-এর সঙ্গে সূত্রের মিল ছিল নাটকীয়। এই সারণি দেখেই Ramanujan p(5k + 4)-এর মতো বিভাজ্যতা লক্ষ করেন বলে প্রচলিত, যা এই পর্বের ব্লকের শেষ লাইনে আপনিও দেখেছেন। ১৯৩৭ সালে Hans Rademacher পদ্ধতিটি উন্নত করে একটি converge করা অসীম ধারা দেন, যার যোগফল ঠিক p(n).

এখানে একটি শিক্ষা আছে: asymptotic সূত্র সাধারণত শুধু অনুপাত 1-এর দিকে যাওয়ার কথা বলে (ব্লকের 1.1453, 1.0457, 1.0320). নিখুঁত মানে পৌঁছাতে ভুলের একটি স্পষ্ট সীমা লাগে, আর পূর্ণসংখ্যা হওয়ার তথ্যটি কাজে লাগাতে হয়।

মূল উপলব্ধি: একটি গণনার প্রশ্ন (p(n)) সমাধানে জটিল বিশ্লেষণ লেগেছিল, আর সেই বিশ্লেষণ যাচাই করেছিল একটি সরল discrete recurrence; দুই জগৎ একে অন্যকে দাঁড় করায়।

প্র ০২Stirling সংখ্যার নাম James Stirling-এর নামে কেন? “প্রথম” আর “দ্বিতীয়” ধরন কেন, আর polynomial-এর ভিত্তি বদলের সঙ্গে এদের সম্পর্ক কী?

স্কটিশ গণিতবিদ James Stirling ১৭৩০ সালের Methodus Differentialis বইয়ে এই সংখ্যাগুলোর সারণি দেন বলে জানা যায়। তাঁর উদ্দেশ্য গণনা ছিল না; তিনি অসীম ধারার যোগফল দ্রুত বের করার কৌশল খুঁজছিলেন, আর সেজন্য xn-এর মতো সাধারণ ঘাত আর x(x − 1)⋯(x − k + 1) ধরনের “factorial ঘাত”-এর মধ্যে রূপান্তর লাগছিল। বিখ্যাত n! ≈ √(2πn)(n/e)n আসন্ন মান-ও তাঁর নামে, যদিও তার একটি রূপ de Moivre-ও প্রায় একই সময়ে পান।

“প্রথম” আর “দ্বিতীয়” নাম আসে এই রূপান্তরের দুই দিক থেকে। উপপাদ্য ৩.৩ বলে xn = ∑S(n, k) x(x − 1)⋯(x − k + 1): সাধারণ ঘাতকে falling factorial-এ লিখতে দ্বিতীয় ধরন। উল্টো দিকে falling factorial-কে সাধারণ ঘাতে লিখতে লাগে চিহ্নসহ প্রথম ধরন: x(x − 1)⋯(x − n + 1) = ∑(−1)n−kc(n, k)xk, যা উপপাদ্য ৫.৩-এ x-এর জায়গায় −x বসিয়ে পাওয়া যায়। Linear algebra-র ভাষায় degree ≤ n polynomial-এর vector space-এ দুটি ভিত্তি (basis), আর দুই ধরনের Stirling সংখ্যার নিচের-ত্রিভুজ matrix দুটি একে অন্যের inverse (পর্ব ১৯-এর matrix গুণের ধারণা)। n = 3-এ যাচাই সহজ: S-এর সারি (1), (1, 1), (1, 3, 1) আর চিহ্নসহ s-এর সারি (1), (−1, 1), (2, −3, 1) গুণ করলে identity.

এই রূপান্তর কাজে লাগে “discrete calculus”-এ: Δf(x) = f(x + 1) − f(x) নিলে falling factorial-এর আচরণ ঠিক সাধারণ ঘাতের derivative-এর মতো, আর তাই falling factorial-এর যোগফল সহজ। ∑k3-এর মতো যোগফল বের করতে আগে k3-কে S(3, ·) দিয়ে falling factorial-এ ভাঙুন, তারপর প্রতিটি পদের যোগফল একটি binomial coefficient, যেমন পর্ব ১৭-এর বিখ্যাত যোগফলগুলো। Graham, Knuth আর Patashnik-এর Concrete Mathematics বই (প্রথম সংস্করণ ১৯৮৯) এই দৃষ্টিভঙ্গি জনপ্রিয় করে, আর বন্ধনী-আকারের প্রতীকও সেখান থেকে প্রচলিত।

মূল উপলব্ধি: দুই ধরনের Stirling সংখ্যা polynomial-এর দুই ভিত্তির মধ্যে রূপান্তরের দুই matrix, পরস্পরের inverse; গণনার অর্থ (দল আর cycle) পরে পাওয়া একটি সুন্দর বোনাস।

প্র ০৩Bell সংখ্যা কত দ্রুত বাড়ে, আর বাস্তবে সব দলভাগ ঘেঁটে দেখা কেন অচল? ক্লাস্টারিং বা ডেটাবেসে এর প্রভাব কী?

B(n)-এর মান: 1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975 (n = 10). n = 15-এ প্রায় ১৩৮ কোটি, আর n = 20-এ প্রায় ৫২ লক্ষ কোটি (scratch-এ recurrence দিয়ে হিসাব করা)। বৃদ্ধি exponential-এর চেয়েও দ্রুত: 2n বা 4n নয়, মোটামুটি (n/ln n)n-এর মতো, যদিও n!-এর চেয়ে ধীর। কারণ সহজ: প্রতিটি নতুন উপাদান হয় একা, নয়তো বিদ্যমান যেকোনো দলে, আর দলের সংখ্যা নিজেই n-এর সঙ্গে বাড়ে।

বাস্তবে এর অর্থ: ধরুন বাজারঘর ২০ জন গ্রাহককে “সবচেয়ে ভালো” দলে ভাগ করতে চায়, আর একটি মাপকাঠি দিয়ে প্রতিটি ভাগের মান বের করা যায়। সব ভাগ পরীক্ষা করলে B(20)-টি হিসাব, যা অসম্ভব। তাই মেশিন লার্নিংয়ের clustering algorithm (যেমন k-means) সব ভাগ দেখে না; একটি ভালো শুরু থেকে স্থানীয়ভাবে উন্নতি করে, আর তাই সবসময় সেরা উত্তরের নিশ্চয়তা দেয় না। k নির্দিষ্ট হলেও S(n, k) প্রায় kn/k!, যা আবার exponential. এই হিসাব “কেন এই সমস্যাটি কঠিন” প্রশ্নের প্রথম উত্তর দেয়, যদিও আসল কঠিনতার প্রমাণে (NP-hardness) আরও যুক্তি লাগে, যা DSA কোর্সে আছে।

ডেটাবেসের দিকেও Bell সংখ্যা আসে। একটি প্রশ্নে একাধিক কলামের মান “সমান কি না” ধরনের সব সম্ভাব্য সম্পর্ক, বা একটি সেটের ওপর সব equivalence relation (পর্ব ৫৫ “Equivalence relation আর partition”-এ দেখবেন প্রতিটি equivalence relation ঠিক একটি set partition), গুনতে B(n) লাগে। Rhyme scheme-এর গণনাও একই: চার লাইনের কবিতায় কোন লাইনের সঙ্গে কোনটির অন্ত্যমিল, তার ধাঁচ (AABB, ABAB, ABBA, …) B(4) = 15 রকম। একটি পুরোনো জাপানি সুগন্ধি খেলায় ৫টি ধূপের কোনগুলো একই, তার ৫২টি ধাঁচের প্রতীক ব্যবহার হতো বলে বর্ণিত, যা B(5).

মূল উপলব্ধি: সব দলভাগের সংখ্যা exponential-এর চেয়েও দ্রুত বাড়ে; তাই clustering-এর মতো সমস্যায় পূর্ণ অনুসন্ধান নয়, heuristic বা বিশেষ গঠন কাজে লাগাতে হয়।

প্র ০৪এলোমেলো permutation-এর cycle গঠন কম্পিউটার বিজ্ঞানে কোথায় লাগে? গড় cycle Hn জানা কেন কাজের?

প্রথম প্রয়োগ in-place permutation: একটি array-কে অতিরিক্ত array ছাড়াই একটি নির্দিষ্ট permutation অনুযায়ী সাজাতে হলে cycle ধরে ধরে উপাদান ঘোরানো হয়। প্রতিটি cycle-এ একটি উপাদান অস্থায়ীভাবে রাখতে হয়, তাই অতিরিক্ত move-এর সংখ্যা cycle-এর সংখ্যার সমান। এলোমেলো permutation-এ তা গড়ে Hn ≈ ln n, অর্থাৎ খুব কম: দশ লক্ষ উপাদানেও গড়ে মাত্র ১৪–১৫টি cycle. একইভাবে n-টি উপাদান সঠিক জায়গায় আনতে ন্যূনতম swap-এর সংখ্যা n − (cycle-এর সংখ্যা), কারণ একটি swap একটি cycle-কে বড়জোর দুই ভাগ করে; প্রতিযোগিতামূলক প্রোগ্রামিংয়ে এটি একটি পরিচিত প্রশ্ন।

দ্বিতীয়, সবচেয়ে বড় cycle. একটি বিখ্যাত ধাঁধায় ১০০ জন বন্দি একটি কৌশলে নিজের নম্বর খোঁজেন, আর সফলতা নির্ভর করে এলোমেলো permutation-এ ৫০-এর চেয়ে লম্বা cycle আছে কি না তার ওপর। এমন cycle থাকার সম্ভাবনা H100 − H50 ≈ ln 2 ≈ 0.69, কারণ লম্বা cycle বড়জোর একটি থাকতে পারে আর দৈর্ঘ্য ℓ-এর cycle থাকার সম্ভাবনা ঠিক 1/ℓ (ℓ > n/2). তাই সাফল্যের সম্ভাবনা প্রায় ৩১%, যা অবাক করার মতো বেশি। এখানে harmonic number আবার আসে, পর্ব ৪০-এর মতোই।

তৃতীয়, shuffle পরীক্ষা। Fisher–Yates shuffle (পর্ব ৩৬) সঠিকভাবে লেখা হলে প্রতিটি permutation সমান সম্ভাব্য, তাই cycle-সংখ্যার বণ্টন c(n, k)/n! হওয়া উচিত। একটি ভুল shuffle (যেমন প্রতিবার পুরো array থেকে swap) এই বণ্টন থেকে সরে যায়; ছোট n-এ cycle-সংখ্যার পরিসংখ্যান মিলিয়ে ভুল ধরা যায়। Sattolo-র algorithm নামের একটি পরিবর্তিত রূপ ইচ্ছা করে শুধু একটি cycle-ওয়ালা permutation দেয়, অর্থাৎ (n − 1)!-টির একটি; এটি “কেউ নিজের নাম পাবেন না, আর সবাই এক বৃত্তে” ধরনের উপহার-বিনিময় বানাতে কাজে লাগে।

মূল উপলব্ধি: cycle-সংখ্যা permutation-এর একটি মৌলিক পরিমাপ: ন্যূনতম swap, in-place সাজানো আর shuffle-এর সঠিকতা, সবকিছুতে c(n, k) আর Hn সরাসরি আসে।

প্র ০৫Ferrers diagram-এর মতো একটি সরল ছবি প্রমাণে এত শক্তিশালী কেন? Partition তত্ত্বে bijective প্রমাণের আর কী উদাহরণ আছে?

Ferrers diagram একটি partition-কে বিন্দুর ছকে বদলে দেয়, আর ছকের ওপর জ্যামিতিক কাজ (উল্টানো, একটি কলাম মোছা, কর্ণ বরাবর কাটা) partition-এর ওপর bijection হয়ে যায়। উপপাদ্য ৬.২-এর প্রমাণে কোনো হিসাব নেই, শুধু “ছবিটি উল্টান”. সংখ্যাতত্ত্বে দেখলে একই ফল প্রমাণ করা কঠিন; generating function দিয়ে করা যায় (∏j≤k1/(1 − xj) আর বড়জোর k অংশের GF সমান দেখানো), কিন্তু সেটি দীর্ঘ। নামটি N. M. Ferrers-এর, আর J. J. Sylvester ১৮৫০-এর দশকে এই ধরনের ছবি দিয়ে প্রমাণ জনপ্রিয় করেন বলে জানা যায়; ইংল্যান্ডের গণিতে তখন partition-এর “ছবির প্রমাণ” একটি স্বতন্ত্র ধারা হয়ে ওঠে।

আরও উদাহরণ। (১) self-conjugate partition (λ′ = λ, ছবি কর্ণ বরাবর প্রতিসম)-এর সংখ্যা = আলাদা বিজোড় অংশের partition-এর সংখ্যা: প্রতিসম ছবিকে কোণ থেকে “L” আকারের hook-এ কাটলে প্রতিটি hook-এ বিজোড় সংখ্যক বিন্দু, আর hook-গুলো ক্রমশ ছোট। (২) পর্ব ৪৮-এর Glaisher-এর bijection, যা Euler-এর “আলাদা = বিজোড়” উপপাদ্য প্রমাণ করে। (৩) Franklin-এর ১৮৮১ সালের bijection, যা pentagonal উপপাদ্য প্রমাণ করে: আলাদা অংশের একটি ছবিতে সবচেয়ে ছোট সারি আর ডান দিকের ৪৫° কর্ণ তুলনা করে একটিকে অন্যটিতে সরানো হয়, যা অংশের সংখ্যা এক বাড়ায় বা কমায়, ফলে জোড় আর বিজোড় দল জোড়া হয়ে যায়; শুধু pentagonal আকারের ছবিতে এটি কাজ করে না, আর সেখান থেকেই ±1 পদ।

কম্পিউটার বিজ্ঞানেও Ferrers বা Young diagram আসে: যেমন একটি সারির longest increasing subsequence-এর দৈর্ঘ্য (পর্ব ৩২-এ Erdős–Szekeres দেখেছেন) Robinson–Schensted নামের একটি bijection-এ একটি Young diagram-এর প্রথম সারির দৈর্ঘ্য হয়ে যায়। এটি দেখায় যে partition-এর ছবি শুধু সংখ্যাতত্ত্বের খেলনা নয়, algorithm বিশ্লেষণেরও হাতিয়ার।

মূল উপলব্ধি: একটি ভালো ছবি সমতাকে দৃশ্যমান করে; bijective প্রমাণ শুধু “সত্য” নয়, “কেন সত্য” দেখায়, আর প্রায়ই নতুন algorithm-এর জন্ম দেয়।

অনুশীলন

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

  1. প্রমাণ: প্রতিটি n ≥ 2-এর জন্য combinatorial যুক্তিতে প্রমাণ করুন, c(n, n − 1) = S(n, n − 1) = C(n, 2).
    1. S(n, n − 1): n-টি উপাদান n − 1-টি অশূন্য দলে। দলের আকারের যোগ n, আর প্রতিটি আকার ≥ 1, তাই ঠিক একটি দলের আকার 2, বাকি সব 1. — pigeonhole-এর মতো গোনা
    2. এমন partition ঠিক হয় শুধু কোন দুজন একসঙ্গে তা দিয়ে: C(n, 2) উপায়। — বাছাই
    3. c(n, n − 1): একইভাবে ঠিক একটি cycle-এর দৈর্ঘ্য 2, বাকিরা fixed point. দুজনের একটি cycle (a b) একভাবেই বসানো যায় ((a b) আর (b a) একই), তাই এখানেও C(n, 2). ∎ — দৈর্ঘ্য ২-এর cycle-এ ক্রমের পার্থক্য নেই

    যাচাই: n = 5-এ সারণিতে S(5, 4) = 10 আর c(5, 4) = 10 = C(5, 2). দৈর্ঘ্য ৩ থেকে পার্থক্য শুরু: তিনজনের এক দল একভাবে, কিন্তু এক গোল টেবিলে দুভাবে, তাই S(n, n − 2) ≠ c(n, n − 2) (যেমন n = 4-এ 7 বনাম 11).

  2. হিসাব: (ক) recurrence দিয়ে S(7, 3) বের করুন (সারি ৬: 1, 31, 90, 65, 15, 1). (খ) ১০ কেজি চালের ঠিক ৩ অংশের partition কয়টি? pk(n)-এর recurrence ব্যবহার করুন।

    (ক) S(7, 3) = 3 · S(6, 3) + S(6, 2) = 3 · 90 + 31 = 301. (প্রথম Python ব্লকের N বাড়িয়ে বা scratch-এ মেলানো।)

    (খ) p3(10) = p2(9) + p3(7). p2(9) = ⌊9/2⌋ = 4 (8+1, 7+2, 6+3, 5+4), আর §৬-এ p3(7) = 4. তাই 8: 8+1+1, 7+2+1, 6+3+1, 6+2+2, 5+4+1, 5+3+2, 4+4+2, 4+3+3. (Scratch-এ তালিকা করে মেলানো।)

  3. আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে, আর শেষ লাইনের সংখ্যাগুলো কোন পরিবার। তারপর যেকোনো Python-এ চালিয়ে মেলান।
    row = [1]
    firsts = [1]
    for _ in range(5):
        new = [row[-1]]
        for x in row:
            new.append(new[-1] + x)
        row = new
        firsts.append(row[0])
    print(row)
    print(firsts)
    [52, 67, 87, 114, 151, 203]
    [1, 1, 2, 5, 15, 52]

    এটি Bell ত্রিভুজ (Aitken-এর array নামেও পরিচিত): প্রতিটি নতুন সারি আগের সারির শেষ সংখ্যা দিয়ে শুরু হয়, আর প্রতিটি পরের ঘর = বাঁয়ের ঘর + ওপরের সারির একই অবস্থানের ঘর। সারিগুলো: [1], [1, 2], [2, 3, 5], [5, 7, 10, 15], [15, 20, 27, 37, 52], [52, 67, 87, 114, 151, 203]. প্রতিটি সারির প্রথম সংখ্যা Bell সংখ্যা 1, 1, 2, 5, 15, 52, আর শেষ সংখ্যা পরের Bell সংখ্যা (203 = B(6)). উপপাদ্য ৪.১-এর মতো এখানে binomial coefficient লাগে না, শুধু যোগ। আউটপুট CPython-এ চালিয়ে মেলানো।

  4. প্রমাণের ভুল ধরুন: একজন লিখলেন: “n-এর ঠিক k অংশের একটি partition থেকে প্রতিটি অংশ থেকে 1 বাদ দিলে n − k-এর একটি partition পাওয়া যায়। এটি উল্টানো যায়, তাই pk(n) = p(n − k). উদাহরণ: ৮-এর ঠিক ২ অংশের partition p(6) = 11টি।” ভুল কোথায়, আর সঠিক উত্তর কী?
    • লক্ষণ: ৮-এর ঠিক দুই অংশের partition গুনলে মাত্র ৪টি: 7+1, 6+2, 5+3, 4+4. 11 অনেক বেশি।
    • ভুল ধাপ: প্রতিটি অংশ থেকে 1 বাদ দিলে কিছু অংশ 0 হয়ে মুছে যায়, তাই ফল n − k-এর একটি partition ঠিকই, কিন্তু তাতে বড়জোর k অংশ। আর “উল্টানো যায়” দাবিটি সব partition-এ খাটে না: 6-এর 1+1+1+1+1+1 থেকে দুটি অংশে ফেরত যাওয়ার কোনো পথ নেই। অর্থাৎ ফাংশনটি onto নয়, তাই bijection নয়।
    • সংশোধন: pk(n) = (n − k-এর বড়জোর k অংশের partition-এর সংখ্যা) = (n − k-এর সব অংশ ≤ k এমন partition, উপপাদ্য ৬.২)। n = 8, k = 2: 6-এর বড়জোর ২ অংশের partition 6, 5+1, 4+2, 3+3, অর্থাৎ 4. এটি §৬-এর recurrence-এর সঙ্গেও মেলে: সব অংশ ≥ 2-এর ক্ষেত্রটি এর একটি অংশমাত্র।

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

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

ক্রমPentagonal recurrence দিয়ে p(n) বের করার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. p(0) = 1 থেকে শুরু করে p(1), …, p(n − 1) আগে বের করা
  2. n-এর বেশি নয় এমন generalized pentagonal সংখ্যা 1, 2, 5, 7, 12, … তালিকা করা
  3. প্রতিটি g-এর জন্য p(n − g) পদটি নেওয়া
  4. চিহ্ন + + − − + + … ধাঁচে বসিয়ে পদগুলো যোগ করা
  5. ছোট n-এ সব partition তালিকা করে ফলটি মিলিয়ে দেখা

৪ জন প্যাকারকে ঠিক ২টি নামহীন, অশূন্য দলে ভাগ করার উপায় কয়টি?

  • 6
  • 14
  • 7
  • 11

{1, 2, 3, 4, 5}-এর সব set partition (যেকোনো সংখ্যক অশূন্য অংশে) কয়টি?

  • 42
  • 52
  • 32
  • 7

{1, 2, 3, 4}-এর যে permutation-গুলোতে ঠিক ২টি cycle, তাদের সংখ্যা কত?

  • 7
  • 6
  • 24
  • 11

p(0…5) = 1, 1, 2, 3, 5, 7 জানা থাকলে pentagonal recurrence p(n) = p(n − 1) + p(n − 2) − p(n − 5) − p(n − 7) + ⋯ অনুযায়ী p(6) কত?

  • 11
  • 12
  • 13
  • 10

Partition 4 + 2 + 1-এর conjugate (Ferrers diagram-এর সারি আর কলাম অদলবদল করে পাওয়া partition) কোনটি?

  • 1 + 2 + 4
  • 3 + 3 + 1
  • 3 + 2 + 1 + 1
  • 4 + 2 + 1

২n জন একটি গোল টেবিলে বসে একসঙ্গে জোড়ায় জোড়ায় হাত মেলাবেন, কোনো দুটি হাত কাটবে না। n = 4 (৮ জন) হলে উপায় কয়টি?

  • 105
  • 14
  • 15
  • 8

শব্দকোষ

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

মনে রাখুন

  1. Catalan: Cn = C(2n, n)/(n + 1), Cn+1 = 2(2n + 1)Cn/(n + 2); “প্রথম বস্তু কার সঙ্গে জোড়া” ধরে দুটি স্বাধীন অংশ হলেই Catalan.
  2. দলে ভাগ: S(n, k) = kS(n − 1, k) + S(n − 1, k − 1); onto ফাংশন = k! S(n, k); সব দলভাগ B(n), আর B(n + 1) = ∑C(n, k)B(k).
  3. Cycle: c(n, k) = (n − 1)c(n − 1, k) + c(n − 1, k − 1); x(x + 1)⋯(x + n − 1) = ∑c(n, k)xk; গড় cycle-সংখ্যা Hn.
  4. Partition: Ferrers diagram উল্টালে বড়জোর k অংশ ↔ সব অংশ ≤ k; pk(n) = pk−1(n − 1) + pk(n − k).
  5. Pentagonal: p(n) = p(n − 1) + p(n − 2) − p(n − 5) − p(n − 7) + ⋯ (চিহ্ন + + − −); p(7) = 15, p(100) = 190569292.

পরের পর্বে: পর্ব ৫১ “Symmetry দিয়ে গণনা — Burnside-এর lemma আর Pólya”: ঘোরালে বা উল্টালে একই দেখায় এমন বিন্যাসকে একবার গোনা, যেমন গোল স্ট্যান্ডে রঙিন পণ্যের সাজ আর রঙিন পুঁতির মালা।

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

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