এই পর্বে যা শিখবেন
- Binomial coefficient-এর সংজ্ঞা, প্রথা আর সমমিতি, আর combinatorial proof লেখার ছাঁচ
- Pascal-এর identity-র প্রমাণ, Pascal-এর ত্রিভুজ বানানো, আর তার ইতিহাস
- Binomial theorem-এর combinatorial আর induction প্রমাণ, আর যেকোনো পদের coefficient বের করা
- 2n, একান্তর যোগফল, ∑k·C(n, k), Vandermonde আর hockey-stick identity, প্রতিটি প্রমাণসহ
- Pascal-এর ত্রিভুজ mod 2, Sierpinski নকশা আর Lucas-এর উপপাদ্য, Python-এ যাচাই করে
১ · Binomial coefficient — “n টি থেকে k টি বাছাই” আবার
বাজারঘরের মিরপুর হাবে আজ পাঁচজন ডেলিভারি রাইডার আছেন। দুপুরের ভিড়ে দুজনকে একসঙ্গে উত্তরা পাঠাতে হবে। কতভাবে দুজন বাছা যায়? এখানে ক্রম গুরুত্বহীন: “আসিফ আর বাবলু” আর “বাবলু আর আসিফ” একই দল। উত্তর 10, আর এই সংখ্যাটির নাম C(5, 2). পর্ব ৩৩ “Permutation আর combination”-এ এই সংখ্যার সূত্র এসেছে; এই পর্বে আমরা সংখ্যাগুলোর ভেতরের গঠন দেখব। দেখা যাবে, একটি সাধারণ সংখ্যার টেবিলে অসংখ্য সুন্দর সম্পর্ক লুকিয়ে আছে, আর সেগুলো প্রমাণ করার সবচেয়ে পরিষ্কার উপায় হলো “গল্প বলে গোনা”।
n আর k অঋণাত্মক পূর্ণসংখ্যা হলে binomial coefficient C(n, k) (পড়া হয় “n choose k”, অনেক বইয়ে nCk লেখা) হলো n উপাদানের একটি সেটের k উপাদানবিশিষ্ট subset-এর সংখ্যা। k > n হলে এমন subset নেই, তাই C(n, k) = 0; আর প্রথা অনুযায়ী k < 0 হলেও C(n, k) = 0.
এখানে “সেট” শব্দটি জরুরি: subset-এ ক্রম নেই, আর একই উপাদান দুইবার নেই (পর্ব ১৪)। একই সংখ্যা আরও কয়েকভাবে দেখা যায়, আর এই বিকল্প চেহারাগুলোই পরে প্রমাণে কাজে লাগবে:
- Bit string: দৈর্ঘ্য n-এর যে bit string-এ ঠিক k টি 1 আছে, তাদের সংখ্যা C(n, k). কারণ 1-গুলোর অবস্থানের সেটটিই একটি k-subset, আর উল্টোটাও। যেমন দৈর্ঘ্য 8-এ তিনটি 1-ওয়ালা string 56টি।
- শব্দ: x আর y দিয়ে n অক্ষরের যে শব্দে ঠিক k টি y, তাদের সংখ্যা C(n, k). এটিই binomial theorem-এর চাবি।
- পথ: একটি গ্রিডে n ধাপের যে পথে ঠিক k ধাপ ওপরে আর বাকি ডানে, তাদের সংখ্যা C(n, k). এই lattice path-এর গল্প পর্ব ৩৭ “গণনার কৌশল — lattice path, bijection আর double counting”-এ বিস্তারিত।
0 ≤ k ≤ n হলে (ক) C(n, k) = n!/(k!(n − k)!), আর (খ) C(n, k) = C(n, n − k).
(ক)-এর প্রমাণ পর্ব ৩৩-এ: n টি থেকে k টি ক্রমসহ সাজানোর উপায় n!/(n − k)!, আর প্রতিটি k-subset ঠিক k! রকম ক্রমে আসে, তাই ভাগ করতে হয়। এখানে factorial n! = 1 · 2 · … · n, আর 0! = 1. (খ)-এর জন্য সূত্রে n − k বসালেই চলে, কিন্তু একটি গোনার প্রমাণ আরও শিক্ষণীয়:
প্রমাণ (খ, bijection দিয়ে):
- S একটি n-উপাদানের সেট। প্রতিটি k-subset A-কে তার পরিপূরক S − A-তে পাঠাই; S − A-তে n − k টি উপাদান।
- এই নিয়ম one-to-one: S − A = S − B হলে A = B, কারণ দুটিই “S থেকে একই জিনিস বাদ দিলে যা থাকে”।
- এটি onto: যেকোনো (n − k)-subset B-এর পরিপূরক S − B একটি k-subset, যার পরিপূরক B.
- তাই k-subset আর (n − k)-subset-এর মধ্যে একটি bijection আছে (পর্ব ১৬), আর দুই সেটের আকার সমান। ∎
দৈনন্দিন ভাষায়: পাঁচজন থেকে দুজনকে উত্তরা পাঠানো মানে একই সঙ্গে তিনজনকে মিরপুরে রেখে দেওয়া। একটি বাছাই আরেকটিকে পুরোপুরি ঠিক করে দেয়। তাই C(5, 2) = C(5, 3) = 10, আর C(100, 98) হিসাব করতে C(100, 2) = 4950 নিলেই চলে।
ক্রিকেট দল বাছাইয়ে নির্বাচকেরা ১৫ জনের স্কোয়াড থেকে একাদশ ঘোষণা করেন। ১১ জন বাছা আর ৪ জনকে বাইরে রাখা একই সিদ্ধান্ত, তাই C(15, 11) = C(15, 4) = 1365. হিসাবের সময় ছোট সংখ্যাটি বেছে নিন: চারটি সংখ্যা গুণ করে 4! দিয়ে ভাগ করা এগারোটির চেয়ে অনেক সহজ।
হিসাবের কৌশল: factorial পুরোটা লাগে না
C(n, k) = n(n − 1)…(n − k + 1)/k!, অর্থাৎ ওপরে k টি ক্রমহ্রাসমান উৎপাদক, নিচে k! যেমন C(10, 4) = (10 · 9 · 8 · 7)/(4 · 3 · 2 · 1) = 5040/24 = 210. বাজারঘর ১০টি পণ্য থেকে ৪টি নিয়ে “কম্বো প্যাক” বানাতে চাইলে 210 রকম প্যাক সম্ভব। প্রোগ্রামে বড় n-এ পুরো n! হিসাব না করে এই গুণফল ধাপে ধাপে করা নিরাপদ; Python-এ math.comb(n, k) নির্ভুল int দেয়, আর C/Java-র মতো ভাষায় overflow এড়াতে প্রতি ধাপে ভাগ করার কৌশল লাগে।
২ · Combinatorial proof — একই জিনিস দুইভাবে গোনা
একটি সমতা প্রমাণের দুই রকম পথ আছে। বীজগণিতের পথে সূত্র বসিয়ে দুই পাশ সরল করে মেলাতে হয়। গোনার পথে একটি প্রশ্ন বানাতে হয় (“এই সেটে কয়টি জিনিস?”), তারপর দেখাতে হয় যে বাঁ পাশ আর ডান পাশ দুটিই সেই প্রশ্নের সঠিক উত্তর। দুটি সঠিক উত্তর সমান হতে বাধ্য।
একটি সমতার combinatorial proof দুই রকম হয়। (১) Double counting: একটি সসীম সেট X বেছে দুই ভিন্ন উপায়ে |X| গোনা, যার একটি দেয় বাঁ পাশ আর অন্যটি ডান পাশ। (২) Bijective proof: দুই পাশ যে দুটি সেটের আকার, তাদের মধ্যে একটি bijection দেখানো।
উপপাদ্য ১.১(খ)-এর প্রমাণ ছিল দ্বিতীয় ধরনের। প্রথম ধরনের একটি ছোট উদাহরণ:
1 ≤ k ≤ n হলে k · C(n, k) = n · C(n − 1, k − 1).
প্রমাণ (double counting):
- প্রশ্ন: n জন রাইডার থেকে k জনের একটি দল বানিয়ে দলের ভেতর থেকে একজন দলনেতা ঠিক করার উপায় কয়টি? X হলো সব (দল, দলনেতা) জোড়ার সেট।
- প্রথম উপায়: আগে দল (C(n, k) রকম), তারপর দলের k জনের একজন নেতা (k রকম)। গুণের নিয়মে |X| = k · C(n, k).
- দ্বিতীয় উপায়: আগে নেতা (n রকম), তারপর বাকি n − 1 জন থেকে দলের বাকি k − 1 জন (C(n − 1, k − 1) রকম)। তাই |X| = n · C(n − 1, k − 1).
- দুই উপায় একই সেট X গোনে, প্রতিটি জোড়া ঠিক একবার; তাই দুই রাশি সমান। ∎
যাচাই n = 5, k = 2: বাঁ পাশ 2 · 10 = 20, ডান পাশ 5 · C(4, 1) = 20. গুণ আর যোগের নিয়ম পর্ব ৩১ “গণনার মূল নিয়ম — যোগ, গুণ, বিয়োগ আর ভাগ”-এ আসে; এখানে আমরা সেগুলো ব্যবহার করছি।
Combinatorial proof-এ তিনটি জিনিস লিখতে হয়, নইলে তা গল্প, প্রমাণ নয়: (ক) ঠিক কোন সেট গোনা হচ্ছে, (খ) প্রথম উপায়ে প্রতিটি উপাদান ঠিক একবার গোনা হলো কেন, (গ) দ্বিতীয় উপায়েও তাই কেন। সবচেয়ে চেনা ভুল হলো কোনো উপাদান দুইবার গোনা (overcounting) বা কোনো ক্ষেত্র বাদ পড়া (undercounting). অনুশীলন ৪-এ এমন একটি ভুল ধরতে হবে।
৩ · Pascal-এর identity আর Pascal-এর ত্রিভুজ
C(n, k)-এর মানগুলো একটি ত্রিভুজে সাজানো যায়: সারি n-এ বাঁ থেকে ডানে C(n, 0), C(n, 1), …, C(n, n). সারি 0 শুধু 1. প্রতিটি সারির দুই প্রান্তে 1, আর ভেতরের প্রতিটি সংখ্যা তার ঠিক ওপরের দুটি সংখ্যার যোগফল। এই নিয়মের পেছনের উপপাদ্যটি এরকম:
n ≥ 1 আর 1 ≤ k ≤ n হলে C(n, k) = C(n − 1, k − 1) + C(n − 1, k).
প্রমাণ (combinatorial):
- S একটি n-উপাদানের সেট, আর a ∈ S একটি নির্দিষ্ট উপাদান। প্রশ্ন: S-এর k-subset কয়টি? উত্তর সংজ্ঞায় C(n, k).
- প্রতিটি k-subset হয় a ধারণ করে, নয় করে না; দুটি একসঙ্গে হয় না। তাই k-subset-গুলো দুটি পৃথক দলে ভাগ হয়, আর যোগের নিয়ম খাটে।
- a ধারণ করে এমন subset: a আগেই আছে, বাকি k − 1 টি আসে S − {a}-এর n − 1 টি উপাদান থেকে, C(n − 1, k − 1) রকম।
- a ধারণ করে না এমন subset: k টি উপাদানই S − {a} থেকে, C(n − 1, k) রকম।
- যোগ করে C(n, k) = C(n − 1, k − 1) + C(n − 1, k). ∎
বীজগণিতের প্রমাণও আছে: দুটি ভগ্নাংশের হর (k − 1)!(n − k)! … মিলিয়ে যোগ করলে n!/(k!(n − k)!) আসে। সেটি সঠিক, কিন্তু কেন সত্য তা বলে না। নিচের stepper-এ পাঁচজন রাইডার A, B, C, D, E নিয়ে গোনার প্রমাণটি দেখুন; A হলো আসিফ, আমাদের “নির্দিষ্ট উপাদান”। “পরে” চাপুন:
1S = {A, B, C, D, E}, k = 22A আছে: AB AC AD AE3A নেই: BC BD BE CD CE DE410 = 4 + 65C(n,k)=C(n−1,k−1)+C(n−1,k)
| কী গুনছি | |
| সংখ্যা | |
| কেন |
- প্রশ্ন। পাঁচজন রাইডার থেকে দুজনের দল কয়টি? সংজ্ঞায় C(5, 2), আর তালিকা করলে AB, AC, AD, AE, BC, BD, BE, CD, CE, DE: মোট ১০টি।
- একজনকে আলাদা করি। A-কে (আসিফ) নির্দিষ্ট উপাদান ধরি। প্রতিটি দলের জন্য প্রশ্ন একটাই: A আছে, না নেই? উত্তর হ্যাঁ বা না, দুটি একসঙ্গে নয়।
- A আছে। A-এর সঙ্গী বাকি চারজন B, C, D, E থেকে একজন: AB, AC, AD, AE, মোট C(4, 1) = 4.
- A নেই। দুজনই B, C, D, E থেকে: BC, BD, BE, CD, CE, DE, মোট C(4, 2) = 6.
- মিলিয়ে। দুই দলে কোনো দল দুইবার নেই, কোনোটি বাদও নেই। তাই 10 = 4 + 6, অর্থাৎ C(5, 2) = C(4, 1) + C(4, 2).
- সাধারণ রূপ। একই যুক্তিতে C(n, k) = C(n − 1, k − 1) + C(n − 1, k). ত্রিভুজে এর মানে: সারি n-এর একটি ঘর = ওপরের সারির বাঁ-ওপরের ঘর + ডান-ওপরের ঘর।
ত্রিভুজ বানানো — একটি সারি থেকে পরের সারি
Pascal-এর identity আর দুই প্রান্তের 1 মিলে একটি recurrence: আগের সারি জানলে পরের সারি বের হয়, কোনো factorial ছাড়াই। এটি পর্ব ১২-এর recursive সংজ্ঞার মতো। সারি 0 থেকে 6 পর্যন্ত ধাপে ধাপে দেখুন:
1r = [1]2for n in range(1, 7):3 new = [1]4 for k in range(1, n):5 new.append(r[k-1]+r[k])6 r = new + [1]
| n | |
| ভেতরের যোগ | |
| সারির যোগফল |
- সারি 0. শূন্য উপাদানের সেটের একটিই subset, ফাঁকা সেট ∅. তাই C(0, 0) = 1.
- সারি 1. ভেতরে কোনো ঘর নেই (k = 1..0 ফাঁকা), শুধু দুই প্রান্তের 1: সারি 1 1. যোগফল 2.
- সারি 2. একটি ভেতরের ঘর: ওপরের 1 + 1 = 2. সারি 1 2 1, যোগফল 4. C(2, 1) = 2: দুই উপাদান থেকে একটি বাছার দুই উপায়।
- সারি 3. 1 + 2 = 3 আর 2 + 1 = 3. সারি 1 3 3 1, যোগফল 8.
- সারি 4. 1 + 3 = 4, 3 + 3 = 6, 3 + 1 = 4. সারি 1 4 6 4 1, যোগফল 16. লক্ষ করুন, প্রতিটি সারি বাঁ-ডানে প্রতিসম, উপপাদ্য ১.১(খ).
- সারি 5. 1 + 4 = 5, 4 + 6 = 10, 6 + 4 = 10, 4 + 1 = 5. সারি 1 5 10 10 5 1, যোগফল 32. শুরুর C(5, 2) = 10 এখানে।
- সারি 6. 1 + 5 = 6, 5 + 10 = 15, 10 + 10 = 20, 10 + 5 = 15, 5 + 1 = 6. সারি 1 6 15 20 15 6 1, যোগফল 64 = 26. প্রতি সারিতে যোগফল দ্বিগুণ হয়; কেন, তা অংশ ৬-এ।
Pascal-এর ত্রিভুজের দুটি নকশা
Rows 0–6. Blue: Pascal's identity 5 + 10 = 15. Orange: hockey stick 1 + 3 + 6 + 10 = 20
এই সংখ্যার টেবিলকে বলে Pascal-এর ত্রিভুজ। এখনই কয়েকটি নকশা চোখে পড়ে: সারির যোগফল 2n; বাঁ দিকের দ্বিতীয় তির্যক 1, 2, 3, 4, …; তৃতীয় তির্যক 1, 3, 6, 10, 15, যা পর্ব ১৭-এর ত্রিভুজ সংখ্যা, কারণ C(n, 2) = n(n − 1)/2; আর সারি 0 থেকে 4 পড়লে 1, 11, 121, 1331, 14641, অর্থাৎ 11-এর ঘাত (সারি 5-এ হাতে-রাখা অঙ্কের কারণে নকশাটি ভাঙে: 115 = 161051).
ত্রিভুজটির নাম Pascal-এর, কিন্তু ইতিহাস অনেক পুরোনো আর বহু দেশের। প্রাচীন ভারতের ছন্দশাস্ত্রবিদ Pingala-র Chandaḥśāstra-য় (রচনার সময় নিয়ে মতভেদ আছে, প্রায়ই খ্রিস্টপূর্ব কয়েক শতক বলা হয়) লঘু-গুরু মাত্রার ছন্দ গোনার একটি সংক্ষিপ্ত নিয়ম আছে, যাকে meru-prastara বলা হয়; দশম শতকের ভাষ্যকার Halayudha সেই নিয়মকে ত্রিভুজ আকারে ব্যাখ্যা করেছেন বলে ইতিহাসবিদরা উল্লেখ করেন, যদিও মূল সূত্রের ঠিক কতটা ত্রিভুজ বোঝায় তা নিয়ে ব্যাখ্যার পার্থক্য আছে। পারস্যে আনুমানিক ১০০০ সালের দিকে al-Karaji আর পরে Omar Khayyam-এর সঙ্গে binomial সহগের কাজ যুক্ত করা হয়; চীনে একাদশ শতকের Jia Xian-এর পদ্ধতি Yang Hui-র ১২৬১ সালের বইয়ে সংরক্ষিত বলে জানা যায়, তাই চীনে এটি “Yang Hui-র ত্রিভুজ”। Blaise Pascal ১৬৫৪ সালে Traité du triangle arithmétique লেখেন (প্রকাশ ১৬৬৫ সালে, তাঁর মৃত্যুর পরে), যেখানে তিনি ত্রিভুজের ধর্মগুলো নিয়মিতভাবে প্রমাণ করেন আর সম্ভাবনার হিসাবে কাজে লাগান।
এবার ত্রিভুজটি সারি 30 পর্যন্ত Pascal-এর identity দিয়েই বানিয়ে math.comb-এর সঙ্গে মেলাই, আর এই পর্বের সব বড় identity একসঙ্গে পরীক্ষা করি। একটি মিথ্যা দাবিও রাখা হয়েছে: “n বিজোড় হলে সারি n-এর সব সংখ্যা বিজোড়”, যা n = 1 আর 3-এ সত্য দেখায়। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।
from math import comb
rows = [[1]] # row 0
for n in range(1, 31): # Pascal's identity builds row n
prev = rows[-1]
rows.append([1] + [prev[k - 1] + prev[k] for k in range(1, n)] + [1])
for n in range(7):
print(" ".join(map(str, rows[n])).center(24))
ok = dict.fromkeys(["=comb", "sum=2^n", "alt=0", "k*C=n*2^(n-1)",
"squares=C(2n,n)", "hockey", "vandermonde"], True)
for n, row in enumerate(rows):
ok["=comb"] &= row == [comb(n, k) for k in range(n + 1)]
ok["sum=2^n"] &= sum(row) == 2 ** n
if n > 0:
ok["alt=0"] &= sum((-1) ** k * c for k, c in enumerate(row)) == 0
ok["k*C=n*2^(n-1)"] &= sum(k * c for k, c in enumerate(row)) == n * 2 ** (n - 1)
ok["squares=C(2n,n)"] &= sum(c * c for c in row) == comb(2 * n, n)
for r in range(n):
ok["hockey"] &= sum(comb(i, r) for i in range(r, n + 1)) == comb(n + 1, r + 1)
for m in range(16):
for n in range(16):
for r in range(m + n + 1):
v = sum(comb(m, k) * comb(n, r - k) for k in range(r + 1))
ok["vandermonde"] &= v == comb(m + n, r)
for name, good in ok.items():
print(f"{name:16} {'holds' if good else 'FAILS'} for n = 0..30")
bad = [n for n in range(1, 31, 2) if any(c % 2 == 0 for c in rows[n])]
print("odd n with an even entry, first:", bad[0])
print("C(30,15) =", rows[30][15])আসল আউটপুট (ব্রাউজারের Python):
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
=comb holds for n = 0..30
sum=2^n holds for n = 0..30
alt=0 holds for n = 0..30
k*C=n*2^(n-1) holds for n = 0..30
squares=C(2n,n) holds for n = 0..30
hockey holds for n = 0..30
vandermonde holds for n = 0..30
odd n with an even entry, first: 5
C(30,15) = 155117520
Pascal-এর identity দিয়ে বানানো প্রতিটি সারি math.comb-এর সঙ্গে হুবহু মিলেছে, অর্থাৎ recurrence আর সূত্র একই সংখ্যা দেয়। সাতটি identity n = 0..30-এ টিকে গেছে (Vandermonde-এর ক্ষেত্রে m, n ≤ 15, তাই m + n ≤ 30). মিথ্যা দাবিটি n = 5-এ ভেঙেছে: সারি 5-এ 10 আছে। অংশ ৮-এ দেখবেন, সব সংখ্যা বিজোড় শুধু n = 2m − 1 সারিতে (1, 3, 7, 15, …)। আর C(30, 15) = 155117520: সংখ্যাগুলো দ্রুত বড় হয়, তবু Python-এর int নির্ভুল থাকে। মনে রাখবেন, ৩১টি সারিতে মিল প্রমাণ নয়; প্রমাণ দেয় পরের অংশগুলোর যুক্তি।
৪ · Binomial theorem — দুটি প্রমাণ
স্কুলে শিখেছেন (x + y)² = x² + 2xy + y². ঘাত বাড়ালে (x + y)³ = x³ + 3x²y + 3xy² + y³, (x + y)4 = x4 + 4x³y + 6x²y² + 4xy³ + y4. সহগগুলো চেনা লাগছে? 1 2 1, 1 3 3 1, 1 4 6 4 1: Pascal-এর ত্রিভুজের সারি। এটি কাকতালীয় নয়।
x আর y যেকোনো দুটি সংখ্যা (বা যেকোনো দুটি পরস্পর বিনিময়যোগ্য রাশি, অর্থাৎ xy = yx) আর n ≥ 0 পূর্ণসংখ্যা হলে
(x + y)n = ∑k=0n C(n, k) xn−k yk = xn + C(n, 1)xn−1y + … + C(n, n − 1)xyn−1 + yn.
“Binomial” মানে দুই পদের রাশি, x + y. ∑ চিহ্নের নিয়ম পর্ব ১৭-এ। শর্ত xy = yx কেন লাগে, তা প্রমাণের পরে দেখব।
প্রমাণ ১ (combinatorial):
- (x + y)n = (x + y)(x + y)…(x + y), n টি বন্ধনী। বিতরণ নিয়মে (distributive law) গুণফল খুললে প্রতিটি বন্ধনী থেকে x বা y একটি করে বেছে গুণ করে পাওয়া সব পদের যোগফল আসে।
- প্রতিটি বাছাইকে x আর y-এর n অক্ষরের একটি শব্দ হিসেবে লেখা যায়, যেমন n = 4-এ xyyx মানে প্রথম আর চতুর্থ বন্ধনী থেকে x, মাঝের দুটি থেকে y. মোট 2nটি শব্দ, প্রতিটি একবার।
- যে শব্দে ঠিক k টি y, তার গুণফল xn−kyk (এখানে xy = yx লাগছে, যাতে অক্ষরগুলো সাজিয়ে একত্র করা যায়)।
- ঠিক k টি y-ওয়ালা শব্দ কয়টি? n টি অবস্থান থেকে y-এর k টি অবস্থান বাছার উপায়, অর্থাৎ C(n, k).
- তাই xn−kyk পদটি ঠিক C(n, k) বার আসে, আর k = 0..n যোগ করলে উপপাদ্য। ∎
প্রমাণ ২ (n-এর ওপর mathematical induction): P(n): (x + y)n = ∑k=0n C(n, k)xn−kyk.
- Basis n = 0: বাঁ পাশ (x + y)0 = 1, ডান পাশ C(0, 0)x0y0 = 1.
- ধরি কোনো n ≥ 0-এর জন্য P(n) সত্য (inductive hypothesis).
- (x + y)n+1 = (x + y)(x + y)n = ∑k=0n C(n, k)xn+1−kyk + ∑k=0n C(n, k)xn−kyk+1, hypothesis আর বিতরণ নিয়মে।
- দ্বিতীয় যোগফলে j = k + 1 বসাই (index shift): ∑j=1n+1 C(n, j − 1)xn+1−jyj. প্রথম যোগফলেও সূচকের নাম j.
- j = 1..n-এর পদগুলো একত্র করলে সহগ C(n, j) + C(n, j − 1) = C(n + 1, j), Pascal-এর identity (উপপাদ্য ৩.১)।
- বাকি থাকে প্রথম যোগফলের j = 0 পদ xn+1 = C(n + 1, 0)xn+1 আর দ্বিতীয়টির j = n + 1 পদ yn+1 = C(n + 1, n + 1)yn+1.
- সব মিলিয়ে (x + y)n+1 = ∑j=0n+1 C(n + 1, j)xn+1−jyj, অর্থাৎ P(n + 1). ∎
দুই প্রমাণের তুলনা শিক্ষণীয়। Induction-এর প্রমাণে Pascal-এর identity হলো ইঞ্জিন: (x + y)-এর সঙ্গে গুণ করলে প্রতিটি সহগ ওপরের দুই প্রতিবেশীর যোগফল হয়, ঠিক ত্রিভুজের নিয়ম। Combinatorial প্রমাণ সরাসরি বলে কেন সহগটি C(n, k). Induction-এর ছাঁচ পর্ব ১০-এ।
xy = yx শর্ত বাদ দিলে কী হয়? Matrix-এ সাধারণত AB ≠ BA (পর্ব ১৯)। তখন (A + B)² = A² + AB + BA + B², যা A² + 2AB + B² নয়। Combinatorial প্রমাণের ধাপ ৩ এখানেই ভাঙে: শব্দ AB আর BA আলাদা গুণফল দেয়। আরেকটি পরিচিত ভুল, যাকে মজা করে “freshman's dream” বলা হয়: (x + y)n = xn + yn. সাধারণ সংখ্যায় এটি ভুল ((1 + 1)² = 4, অথচ 1² + 1² = 2), কিন্তু মৌলিক p-এর জন্য (x + y)p ≡ xp + yp (mod p) সত্য, কারণ 0 < k < p হলে p ∣ C(p, k). এই তথ্য পর্ব ২৪-এ Fermat-এর ছোট উপপাদ্যের একটি প্রমাণে ব্যবহার হয়েছে।
এখন যন্ত্রে মিলিয়ে নিই। নিচের ব্লক (ax + by)n-কে একটি একটি বন্ধনী করে গুণ করে খোলে, ঠিক প্রমাণ ১-এর মতো: প্রতিটি বন্ধনী থেকে “ax নাও” অথবা “by নাও”। তারপর সব 16টি শব্দ তালিকা করে y-এর সংখ্যা অনুযায়ী ভাগ করে। অভিধান {k: সহগ}-এ k হলো y-এর ঘাত।
from collections import Counter
from itertools import product
from math import comb
def expand(a, b, n):
"""(a*x + b*y)^n as {power of y: coefficient}, one bracket at a time"""
poly = {0: 1}
for _ in range(n):
new = Counter()
for k, c in poly.items():
new[k] += c * a # take a*x from this bracket
new[k + 1] += c * b # take b*y from this bracket
poly = new
return dict(sorted(poly.items()))
print("(x+y)^4 :", expand(1, 1, 4))
p = expand(2, -3, 8)
print("(2x-3y)^8, x^5 y^3:", p[3], "| formula:", comb(8, 3) * 2**5 * (-3)**3)
q = expand(1, 2, 6) # (x + 2/x)^6: y = 1/x, power of x = 6-2k
print("(x+2/x)^6, constant term:", q[3], "| formula:", comb(6, 3) * 2**3)
print("sum of coefficients of (2x-3y)^8:", sum(p.values()), "= (2-3)^8")
words = ["".join(w) for w in product("xy", repeat=4)]
by_y = Counter(w.count("y") for w in words)
print(len(words), "words from 4 brackets, by number of y:", dict(sorted(by_y.items())))
print("words with two y:", [w for w in words if w.count("y") == 2])
print("11^n:", [11 ** n for n in range(6)])আসল আউটপুট (ব্রাউজারের Python):
(x+y)^4 : {0: 1, 1: 4, 2: 6, 3: 4, 4: 1}
(2x-3y)^8, x^5 y^3: -48384 | formula: -48384
(x+2/x)^6, constant term: 160 | formula: 160
sum of coefficients of (2x-3y)^8: 1 = (2-3)^8
16 words from 4 brackets, by number of y: {0: 1, 1: 4, 2: 6, 3: 4, 4: 1}
words with two y: ['xxyy', 'xyxy', 'xyyx', 'yxxy', 'yxyx', 'yyxx']
11^n: [1, 11, 121, 1331, 14641, 161051]
প্রথম লাইন (x + y)4-এর সহগ 1, 4, 6, 4, 1. চার বন্ধনী থেকে ১৬টি শব্দ, আর y-এর সংখ্যা অনুযায়ী ভাগ করলে ঠিক একই 1, 4, 6, 4, 1; দুটি y-ওয়ালা ছয়টি শব্দ (xxyy, xyxy, …) সবই x²y² দেয়, তাই C(4, 2) = 6. (2x − 3y)8-এ x5y3-এর সহগ −48384 সরাসরি গুণফল আর সূত্র, দুই দিক থেকেই এসেছে; পরের অংশে এই হিসাবটি হাতে করব। (x + 2/x)6-এ y-এর জায়গায় 1/x ভাবলে k-তম পদে x-এর ঘাত 6 − 2k, তাই ধ্রুবক পদ k = 3-এ: C(6, 3) · 23 = 160. সব সহগের যোগফল 1, কারণ x = y = 1 বসালে (2 − 3)8 = 1. শেষ লাইনে 11-এর ঘাত: 11n = (10 + 1)n, তাই সারির সংখ্যাগুলোই দশমিক অঙ্ক, যতক্ষণ কোনো সহগ 10 না ছাড়ায়।
৫ · General term আর coefficient বের করা — পরীক্ষার হিসাব
বিশ্ববিদ্যালয় আর চাকরির লিখিত পরীক্ষায় binomial theorem সবচেয়ে বেশি আসে একটি নির্দিষ্ট পদ খোঁজার প্রশ্নে। পুরো রাশি খোলার দরকার নেই; একটি সাধারণ পদ লিখে শর্ত বসালেই চলে।
(a + b)n-এর বিস্তারে (k + 1)-তম পদ Tk+1 = C(n, k) an−k bk, k = 0, 1, …, n. a আর b-এর ভেতরে ধ্রুবক বা চিহ্ন থাকলে সেগুলো ঘাতসহ পদের ভেতরে থাকে।
হিসাব ১: (2x − 3y)8-এ x5y3-এর সহগ কত? a = 2x, b = −3y, n = 8. y3 চাই, তাই k = 3, আর তখন x-এর ঘাত 8 − 3 = 5, মিলে গেছে। পদ C(8, 3)(2x)5(−3y)3 = 56 · 32 · (−27) x5y3. সহগ 56 · 32 = 1792, তারপর 1792 · (−27) = −48384. চিহ্নের ভুল খুব সাধারণ: (−3)3 ঋণাত্মক, কারণ ঘাত বিজোড়।
হিসাব ২ (ধ্রুবক পদ): (x² − 1/x)6-এর যে পদে x নেই, সেটি কত? সাধারণ পদ C(6, k)(x²)6−k(−1/x)k = C(6, k)(−1)k x12−2k−k = C(6, k)(−1)k x12−3k. x-এর ঘাত শূন্য চাই: 12 − 3k = 0, তাই k = 4. ধ্রুবক পদ C(6, 4)(−1)4 = 15. কোনো পূর্ণসংখ্যা k না মিললে (যেমন 12 − 3k = 1) এমন পদ নেই, উত্তর 0.
হিসাব ৩ (মাঝের পদ): (a + b)10-এ পদ ১১টি, মাঝের পদ ৬ষ্ঠ, k = 5: C(10, 5)a5b5 = 252a5b5. n জোড় হলে মাঝের পদ একটি, k = n/2; n বিজোড় হলে দুটি। সারি n-এর সবচেয়ে বড় সংখ্যাও মাঝখানে: C(n, k) k = ⌊n/2⌋ পর্যন্ত বাড়ে, তারপর কমে, কারণ C(n, k + 1)/C(n, k) = (n − k)/(k + 1), যা k < (n − 1)/2 হলে 1-এর বেশি। এই মাঝের সংখ্যা C(2m, m)-কে বলে central binomial coefficient: 2, 6, 20, 70, 252, 924, …
হিসাব ৪ (আসন্ন মান): (1.01)10 কত, ক্যালকুলেটর ছাড়া? (1 + 0.01)10 = 1 + 10(0.01) + 45(0.0001) + 120(0.000001) + … = 1 + 0.1 + 0.0045 + 0.00012 + … ≈ 1.10462. আসল মান 1.104622…; প্রথম চারটি পদেই পাঁচ দশমিক ঘর পর্যন্ত ঠিক। বাজারঘরের কোনো সূচক মাসে ১% করে দশ মাস বাড়লে মোট বৃদ্ধি প্রায় ১০.৫%, শুধু ১০% নয়; বাড়তিটুকু আসে C(10, 2) আর পরের পদ থেকে।
একটি দ্রুত যাচাই: সব সহগের যোগফল চাইলে সব variable-এ 1 বসান। (2x − 3y)8-এর সহগের যোগফল (2 − 3)8 = 1, আর (1 + 2x)7-এর 37 = 2187. পরীক্ষায় নিজের উত্তর মেলাতে এটি খুব কাজের।
৬ · সারির যোগফল: 2n, একান্তর যোগফল আর ∑k·C(n, k)
Binomial theorem একটি সূত্র নয়, সূত্র বানানোর একটি যন্ত্র: x আর y-তে নানা মান বসিয়ে নতুন identity পাওয়া যায়। প্রতিটির একটি combinatorial গল্পও আছে।
প্রতিটি n ≥ 0-এর জন্য ∑k=0n C(n, k) = 2n.
প্রমাণ ক (বীজগণিত): binomial theorem-এ x = y = 1 বসালে (1 + 1)n = ∑C(n, k) · 1 · 1. ∎
প্রমাণ খ (double counting):
- X = n-উপাদানের সেট S-এর সব subset-এর সেট, অর্থাৎ power set.
- আকার অনুযায়ী ভাগ করি: আকার k-এর subset C(n, k)টি, k = 0..n, প্রতিটি subset ঠিক একটি আকারে। তাই |X| = ∑C(n, k).
- অন্যভাবে: প্রতিটি উপাদানের জন্য দুটি সিদ্ধান্ত, “নেব” বা “নেব না”; n টি স্বাধীন সিদ্ধান্ত, গুণের নিয়মে 2n. এটি পর্ব ১৪-এর |P(S)| = 2n.
- দুটি সমান। ∎
প্রতিটি n ≥ 1-এর জন্য ∑k=0n (−1)k C(n, k) = 0. সমতুল্যভাবে, জোড় আকারের subset আর বিজোড় আকারের subset সমান সংখ্যক, প্রতিটি 2n−1.
প্রমাণ (বীজগণিত): x = 1, y = −1 বসালে (1 − 1)n = 0, যা n ≥ 1-এ শূন্য। (n = 0-এ 00 = 1, তাই শর্তটি লাগে।) ∎
প্রমাণ (bijection): S-এ একটি নির্দিষ্ট উপাদান a নিন (n ≥ 1 বলে a আছে)। প্রতিটি subset A-কে পাঠান A △ {a}-তে: a থাকলে সরিয়ে দিন, না থাকলে যোগ করুন। একই কাজ দুইবার করলে A ফিরে আসে, তাই এটি নিজেই নিজের inverse, একটি bijection; আর এটি সবসময় আকার এক বাড়ায় বা কমায়, তাই জোড় আকারকে বিজোড়ে আর বিজোড়কে জোড়ে পাঠায়। দুই দল সমান। ∎ n = 5-এ জোড় আকারের subset 1 + 10 + 5 = 16 = 24.
প্রতিটি n ≥ 1-এর জন্য ∑k=0n k · C(n, k) = n · 2n−1.
প্রমাণ (double counting):
- X = সব (দল, দলনেতা) জোড়া, যেখানে দল n জনের যেকোনো subset আর নেতা সেই দলের একজন (ফাঁকা দলের কোনো নেতা নেই)।
- দল আগে: আকার k-এর দল C(n, k)টি, প্রতিটিতে k রকম নেতা; যোগ করে |X| = ∑k·C(n, k).
- নেতা আগে: n রকম; তারপর বাকি n − 1 জনের প্রত্যেকে দলে থাকবেন কি না, 2n−1 রকম। তাই |X| = n · 2n−1. ∎
অন্য পথ: উপপাদ্য ২.১ থেকে k·C(n, k) = n·C(n − 1, k − 1); k = 1..n যোগ করলে n·∑C(n − 1, j) = n·2n−1. Calculus জানলে (1 + x)n-কে x-এ অন্তরীকরণ করে x = 1 বসালেও আসে। অর্থ: n টি পণ্যের তালিকা থেকে এলোমেলো একটি subset নিলে তাতে গড়ে n·2n−1/2n = n/2টি পণ্য থাকে; সম্ভাবনার এই ভাষা পর্ব ৪০ “Random variable আর প্রত্যাশা — linearity-র জাদু”-তে।
আরেকটি কৌশল: x = 1, y = 2 বসালে ∑C(n, k)2k = 3n. গল্প: n জন রাইডারের প্রত্যেককে তিনটি কাজের একটি দিন, “ছুটি”, “ঢাকা” বা “চট্টগ্রাম”। মোট 3n রকম। আবার, যাঁরা ছুটিতে নেই তাঁদের সেট আগে বাছুন (আকার k, C(n, k) রকম), তারপর তাঁদের প্রত্যেককে দুই শহরের একটি (2k রকম)। n = 10-এ দুই পাশ 59049.
৭ · Vandermonde আর hockey-stick identity
বাজারঘরের একটি বিশেষ অভিযানে দুই শহরের রাইডার মিলিয়ে দল বানাতে হবে। ঢাকায় m জন, চট্টগ্রামে n জন রাইডার; মোট r জনের দল কতভাবে? সরাসরি উত্তর C(m + n, r). কিন্তু দলে ঢাকার কতজন, তা দিয়ে ভাগ করেও গোনা যায়।
m, n, r অঋণাত্মক পূর্ণসংখ্যা হলে C(m + n, r) = ∑k=0r C(m, k) · C(n, r − k).
প্রমাণ (double counting):
- X = ঢাকার m জন আর চট্টগ্রামের n জন মিলিয়ে (দুই দল পৃথক) m + n জন থেকে r জনের সব দল। সংজ্ঞায় |X| = C(m + n, r).
- প্রতিটি দলে ঢাকার রাইডারের সংখ্যা k, যেখানে 0 ≤ k ≤ r; প্রতিটি দলের k একটিই, তাই দলগুলো k অনুযায়ী পৃথক ভাগে পড়ে।
- ঠিক k জন ঢাকার দল: ঢাকা থেকে k জন (C(m, k) রকম) আর চট্টগ্রাম থেকে বাকি r − k জন (C(n, r − k) রকম); গুণের নিয়মে C(m, k)·C(n, r − k).
- k = 0..r যোগ করলে আবার |X|. k > m বা r − k > n হলে পদটি 0, প্রথা অনুযায়ী, তাই অসম্ভব ক্ষেত্রগুলো আপনা থেকে বাদ পড়ে। ∎
ছোট সংখ্যায় দেখুন: m = 3 (D1, D2, D3), n = 2 (C1, C2), r = 2.
1ঢাকা: D1 D2 D3 m = 32চট্টগ্রাম: C1 C2 n = 23k=0: C(3,0)·C(2,2) = 14k=1: C(3,1)·C(2,1) = 65k=2: C(3,2)·C(2,0) = 36মোট 10 = C(5,2)
| ঢাকার কতজন | |
| দলগুলো | |
| চলতি যোগফল |
- প্রস্তুতি। ঢাকায় তিনজন (D1, D2, D3), চট্টগ্রামে দুজন (C1, C2). পাঁচজন থেকে দুজনের দল চাই। প্রতিটি দলকে ভাগ করব “দলে ঢাকার কতজন” দিয়ে, k = 0, 1 বা 2.
- k = 0. ঢাকার কেউ নেই: C(3, 0) = 1 রকমে ঢাকা থেকে কেউ না, আর চট্টগ্রামের দুজনই, C(2, 2) = 1. একটি দল: C1+C2. চলতি যোগফল 1.
- k = 1. ঢাকা থেকে একজন (3 রকম), চট্টগ্রাম থেকে একজন (2 রকম): 3 · 2 = 6টি দল। চলতি যোগফল 7.
- k = 2. ঢাকা থেকে দুজন, C(3, 2) = 3; চট্টগ্রাম থেকে কেউ না, C(2, 0) = 1: ৩টি দল। চলতি যোগফল 10.
- মিলিয়ে। প্রতিটি দলের k একটিই, তাই কোনো দল দুইবার গোনা হয়নি, আর k = 0, 1, 2-এর বাইরে কিছু নেই। 1 + 6 + 3 = 10 = C(5, 2).
- সাধারণ রূপ। একই যুক্তিতে C(m + n, r) = ∑ C(m, k)·C(n, r − k). m = n = r হলে আর C(n, r − k) = C(n, k) ব্যবহার করলে পাওয়া যায় ∑C(n, k)² = C(2n, n); অনুশীলন ১ দেখুন।
নামটি ফরাসি গণিতবিদ Alexandre-Théophile Vandermonde-এর (১৭৭২ সালের দিকের কাজ); তবে চীনা গণিতবিদ Zhu Shijie-র ১৩০৩ সালের বইয়ে এই সম্পর্ক আগেই ছিল বলে ইতিহাসবিদরা উল্লেখ করেন।
0 ≤ r ≤ n হলে ∑i=rn C(i, r) = C(r, r) + C(r + 1, r) + … + C(n, r) = C(n + 1, r + 1).
প্রমাণ (double counting):
- X = {1, 2, …, n + 1} থেকে r + 1 টি সংখ্যার সব subset; |X| = C(n + 1, r + 1).
- প্রতিটি এমন subset-এর একটি সবচেয়ে বড় উপাদান আছে; তাকে i + 1 বলি। যেহেতু subset-এ r + 1 টি সংখ্যা, i + 1 ≥ r + 1, তাই r ≤ i ≤ n. প্রতিটি subset-এর i একটিই।
- সবচেয়ে বড় উপাদান i + 1 নির্দিষ্ট হলে বাকি r টি সংখ্যা আসে {1, …, i} থেকে, C(i, r) রকম।
- i = r..n যোগ করলে |X| = ∑C(i, r). ∎
ছবি ৩.১-এর কমলা রেখা এর আয়না-রূপ: C(i, r) = C(i, i − r) বলে 1 + 3 + 6 + 10 = C(2, 2) + C(3, 2) + C(4, 2) + C(5, 2) = C(6, 3) = 20. r = 1 নিলে পরিচিত ফল: 1 + 2 + … + n = C(n + 1, 2) = n(n + 1)/2, পর্ব ১৭-এর Gauss-এর যোগফল। r = 2 নিলে ত্রিভুজ সংখ্যার যোগফল C(n + 1, 3), যা বাজারঘরের তিন স্তরের লুপের পুনরাবৃত্তি গোনে। Induction দিয়েও প্রমাণ সহজ: ধাপে C(n + 1, r + 1) + C(n + 1, r) = C(n + 2, r + 1), আবার Pascal-এর identity.
একটি পুরোনো ঋণ শোধ: বৃত্ত কয়টি অংশে ভাগ হয়
পর্ব ১৭-এ দেখেছিলেন, বৃত্তের ওপর n টি বিন্দুর প্রতি জোড়া সরলরেখায় যুক্ত করলে (কোনো তিনটি রেখা ভেতরের একই বিন্দুতে না মিললে) অংশের সংখ্যা 1, 2, 4, 8, 16, তারপর 31. সূত্র 1 + C(n, 2) + C(n, 4). যুক্তির রূপরেখা: শুরুতে একটি অংশ। রেখাগুলো একটি একটি করে আঁকুন; যে রেখা আগের c টি রেখাকে ভেতরে কাটে, সেটি c + 1 টুকরোয় ভাগ হয়, আর প্রতিটি টুকরো একটি অংশকে দুই ভাগ করে, তাই অংশ বাড়ে c + 1. সব রেখা শেষে মোট বৃদ্ধি = (রেখার সংখ্যা) + (ভেতরের ছেদবিন্দুর সংখ্যা)। রেখা C(n, 2)টি; আর প্রতিটি ছেদবিন্দু ঠিক চারটি বিন্দু থেকে আসে (দুটি রেখার চার প্রান্ত), আর প্রতিটি চার বিন্দুর সেট ঠিক একটি ভেতরের ছেদবিন্দু দেয়, তাই ছেদবিন্দু C(n, 4)টি, একটি bijection. n = 6-এ 1 + 15 + 15 = 31.
এবার এই অংশের তিনটি গোনার প্রমাণ যন্ত্রে তালিকা করে দেখি: Pascal-এর ভাগ, Vandermonde-এর ভাগ, আর (দল, দলনেতা) জোড়া, প্রতিটি itertools.combinations দিয়ে সত্যিকারের দল বানিয়ে।
from itertools import combinations
from math import comb
riders = "ABCDE" # rider A is the special one
pairs = list(combinations(riders, 2))
with_a = ["".join(p) for p in pairs if "A" in p]
without_a = ["".join(p) for p in pairs if "A" not in p]
print("Pascal:", len(pairs), "=", len(with_a), "+", len(without_a))
print(" with A :", with_a)
print(" without A:", without_a)
dhaka, ctg = ["D1", "D2", "D3"], ["C1", "C2"]
by_k = {}
for team in combinations(dhaka + ctg, 2):
k = sum(r in dhaka for r in team) # how many from Dhaka
by_k.setdefault(k, []).append("+".join(team))
for k in sorted(by_k):
print(f"k={k}: {len(by_k[k])} = C(3,{k})*C(2,{2-k})", by_k[k])
n = 5 # committee with a chair, two ways
count = sum(1 for k in range(n + 1)
for team in combinations(range(n), k) for chair in team)
print("committee+chair:", count, "| sum k*C(5,k):",
sum(k * comb(n, k) for k in range(n + 1)), "| n*2^(n-1):", n * 2 ** (n - 1))আসল আউটপুট (ব্রাউজারের Python):
Pascal: 10 = 4 + 6
with A : ['AB', 'AC', 'AD', 'AE']
without A: ['BC', 'BD', 'BE', 'CD', 'CE', 'DE']
k=0: 1 = C(3,0)*C(2,2) ['C1+C2']
k=1: 6 = C(3,1)*C(2,1) ['D1+C1', 'D1+C2', 'D2+C1', 'D2+C2', 'D3+C1', 'D3+C2']
k=2: 3 = C(3,2)*C(2,0) ['D1+D2', 'D1+D3', 'D2+D3']
committee+chair: 80 | sum k*C(5,k): 80 | n*2^(n-1): 80
প্রথম তিন লাইন stepper-এর হুবহু তালিকা: ১০টি দল, A-সহ ৪টি, A-ছাড়া ৬টি। Vandermonde-এর তিন ভাগে 1, 6, 3টি দল, মোট 10. শেষ লাইনে সব 32টি subset থেকে প্রতিটি (দল, নেতা) জোড়া একটি একটি করে গোনা হয়েছে: 80, আর উপপাদ্য ৬.৩-এর দুই রাশিও 80 = 5 · 16. এখানে যন্ত্র প্রমাণের প্রতিটি “ভাগ” সত্যিই পৃথক কি না দেখিয়ে দেয়; বড় n-এ কাজ করে যুক্তি, তালিকা নয়।
৮ · Pascal mod 2, Sierpinski আর Lucas — আর সামনে কী আছে
Pascal-এর ত্রিভুজের প্রতিটি সংখ্যার জায়গায় শুধু লিখুন সেটি জোড় না বিজোড়। Pascal-এর identity mod 2-তেও খাটে (পর্ব ২২): বিজোড় + বিজোড় = জোড়, বিজোড় + জোড় = বিজোড়, অর্থাৎ নিচের ঘরের parity ওপরের দুই ঘরের XOR. ফল একটি বিস্ময়কর নকশা: ত্রিভুজের ভেতরে ত্রিভুজ, তার ভেতরে আরও ছোট ত্রিভুজ। এটি Sierpinski ত্রিভুজ, পোলিশ গণিতবিদ Wacław Sierpiński-র নামে (১৯১৫ সালের দিকে তিনি এটি নিয়ে লেখেন)।
p মৌলিক, আর n = nt…n1n0 ও k = kt…k1k0 তাদের base-p অঙ্ক হলে C(n, k) ≡ ∏i C(ni, ki) (mod p), যেখানে ki > ni হলে C(ni, ki) = 0.
p = 2-এর ফল: C(n, k) বিজোড় ⟺ binary-তে k-এর প্রতিটি 1-এর জায়গায় n-এও 1, অর্থাৎ Python-এ k & n == k. তাই সারি n-এ বিজোড় সংখ্যা ঠিক 2(n-এর binary-তে 1-এর সংখ্যা)টি।
উপপাদ্যটি ফরাসি গণিতবিদ Édouard Lucas ১৮৭৮ সালে প্রকাশ করেন। প্রমাণ (1 + x)p ≡ 1 + xp (mod p) থেকে আসে, অংশ ৪-এর freshman's dream; আমরা এখানে তা বাদ রাখছি। উদাহরণ: C(10, 3) mod 3. 10 = 1013, 3 = 0103; মাঝের অঙ্কে C(0, 1) = 0, তাই C(10, 3) ≡ 0 (mod 3). সত্যিই C(10, 3) = 120 = 3 · 40. আর C(12, 5) জোড় না বিজোড়? 12 = 11002, 5 = 01012; 5-এর শেষ অঙ্কের 1-এর জায়গায় 12-তে 0, তাই জোড় (C(12, 5) = 792). প্রোগ্রামিং কনটেস্টে বড় n-এ C(n, k) mod p বের করার কৌশল DSA কোর্সের পর্ব ৬২-এ।
from math import comb
for n in range(16): # '#' = odd entry, '.' = even entry
row = " ".join("#" if comb(n, k) % 2 else "." for k in range(n + 1))
print(f"{n:2} " + " " * (15 - n) + row)
def lucas(n, k, p): # C(n,k) mod p from base-p digits
r = 1
while n or k:
r = r * comb(n % p, k % p) % p # comb(a, b) = 0 when b > a
n, k = n // p, k // p
return r
print("C(n,k) odd <=> k & n == k :",
all((comb(n, k) % 2 == 1) == (k & n == k)
for n in range(128) for k in range(n + 1)))
print("odd entries in row n = 2^(ones in n):",
all(sum(comb(n, k) % 2 for k in range(n + 1)) == 2 ** bin(n).count("1")
for n in range(128)))
for m in (3, 5, 7):
odd = sum(comb(n, k) % 2 for n in range(2 ** m) for k in range(n + 1))
print(f"rows 0..{2**m - 1}: {odd} odd of {2**m * (2**m + 1) // 2}, 3^{m} = {3**m}")
print("Lucas holds for p = 3, 5, 7, n < 200:",
all(lucas(n, k, p) == comb(n, k) % p
for p in (3, 5, 7) for n in range(200) for k in range(n + 1)))
print("C(10,3) =", comb(10, 3), "| mod 3 by Lucas:", lucas(10, 3, 3))আসল আউটপুট (ব্রাউজারের Python):
0 #
1 # #
2 # . #
3 # # # #
4 # . . . #
5 # # . . # #
6 # . # . # . #
7 # # # # # # # #
8 # . . . . . . . #
9 # # . . . . . . # #
10 # . # . . . . . # . #
11 # # # # . . . . # # # #
12 # . . . # . . . # . . . #
13 # # . . # # . . # # . . # #
14 # . # . # . # . # . # . # . #
15 # # # # # # # # # # # # # # # #
C(n,k) odd <=> k & n == k : True
odd entries in row n = 2^(ones in n): True
rows 0..7: 27 odd of 36, 3^3 = 27
rows 0..31: 243 odd of 528, 3^5 = 243
rows 0..127: 2187 odd of 8256, 3^7 = 2187
Lucas holds for p = 3, 5, 7, n < 200: True
C(10,3) = 120 | mod 3 by Lucas: 0
# চিহ্নগুলো Sierpinski ত্রিভুজ আঁকছে: সারি 0–3-এর ছোট ত্রিভুজটি সারি 4–7-এ দুইবার পাশাপাশি ফিরে এসেছে, মাঝখানে উল্টো ফাঁকা ত্রিভুজ; সারি 8–15-এ গোটা 0–7-এর নকশা আবার দুইবার। সারি 7 আর 15 পুরো বিজোড়, কারণ 7 = 1112 আর 15 = 11112. 128টি সারিতে k & n == k নিয়ম আর 2(1-এর সংখ্যা) নিয়ম দুটিই টিকেছে। প্রথম 2m সারিতে বিজোড় ঘর ঠিক 3mটি: প্রতিবার সারি দ্বিগুণ করলে নকশার তিনটি কপি আসে। মোট ঘর প্রায় 4m/2 হারে বাড়ে, তাই বিজোড় ঘরের অনুপাত (3/4)m-এর মতো কমে শূন্যের দিকে যায়: m = 7-এ 2187/8256, প্রায় ২৬%. বড় ত্রিভুজের প্রায় সব সংখ্যাই জোড়।
সামনে: তিন বা বেশি পদ, আর সম্ভাবনা
(x + y + z)n খুললে কী হয়? একই যুক্তিতে n টি বন্ধনী থেকে x, y বা z বাছাই; xaybzc (a + b + c = n) পদটি আসে n!/(a! b! c!) বার। যেমন (x + y + z)4-এ x²yz-এর সহগ 4!/(2! 1! 1!) = 12. এটিই multinomial theorem, যার পূর্ণ প্রমাণ আর stars and bars-এর সঙ্গে সম্পর্ক পর্ব ৩৫ “পুনরাবৃত্তিসহ বাছাই — stars and bars আর multinomial”-এ।
সম্ভাবনায়: একটি ন্যায্য মুদ্রা n বার ছুড়লে ঠিক k বার হেড আসার সম্ভাবনা C(n, k)/2n, কারণ 2nটি ফল সমান সম্ভাব্য আর তাদের C(n, k)টিতে ঠিক k টি হেড। সাফল্যের সম্ভাবনা p হলে C(n, k)pk(1 − p)n−k, আর binomial theorem বলে সব k-এর যোগফল (p + (1 − p))n = 1. এই হিসাব পর্ব ৩৮ “বিচ্ছিন্ন সম্ভাবনা — sample space, event আর Laplace-এর সংজ্ঞা”-য় শুরু হবে; binomial distribution আর simulation AI ফাউন্ডেশনস কোর্সের পর্ব ৩৬-এ।
আরও গভীরে: Isaac Newton ১৬৬০-এর দশকে binomial theorem-কে যেকোনো বাস্তব ঘাতে বাড়ান: |x| < 1 হলে (1 + x)α = ∑k≥0 C(α, k)xk, যেখানে C(α, k) = α(α − 1)…(α − k + 1)/k!; এটি অসীম ধারা, আর পর্ব ৪৮ “Generating function — গণনাকে বীজগণিতে রূপান্তর”-এ কাজে লাগবে। Kummer-এর উপপাদ্য (১৮৫২) বলে, C(n, k)-কে p-এর সর্বোচ্চ কোন ঘাত ভাগ করে, তা base p-তে k আর n − k যোগ করলে কয়টি “হাতে রাখা” (carry) হয় তার সমান। আর Wilf ও Zeilberger-এর ১৯৯০-এর দশকের পদ্ধতি দিয়ে এ ধরনের বহু identity কম্পিউটার স্বয়ংক্রিয়ভাবে প্রমাণ করতে পারে।
পরীক্ষা ও ইন্টারভিউতে: বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই ধরনের প্রশ্ন প্রায়ই আসে:
- (1 + 2x)7-এ x4-এর সহগ? C(7, 4) · 24 = 35 · 16 = 560.
- C(n, 0) + C(n, 1) + … + C(n, n) কত, আর কেন? 2n; প্রতিটি উপাদান নেওয়া-না-নেওয়ার দুই সিদ্ধান্ত।
- Pascal-এর identity combinatorially প্রমাণ করুন। একটি উপাদান a ঠিক করে subset-গুলো “a আছে / নেই” দিয়ে ভাগ।
- C(1, 1) + C(2, 1) + … + C(n, 1)? Hockey stick: C(n + 1, 2) = n(n + 1)/2.
- কোড ছাড়া বলুন C(20, 7) জোড় না বিজোড়? 7 & 20 = 4 ≠ 7, তাই জোড় (77520).
৯ · AI-এর যুগে — AI-এর দেওয়া identity আর coefficient যাচাই
“(x + y)n-এর সূত্র কী?” এমন প্রশ্নে AI সহকারী সাধারণত ঠিক উত্তর দেয়। কিন্তু নির্দিষ্ট coefficient, নতুন identity বা combinatorial proof চাইলে ভুলের ঝুঁকি বাড়ে, আর ভুলগুলো আত্মবিশ্বাসী ভাষায় আসে। এই বিষয়ে চেনা ছাঁচগুলো:
| AI-এর ভুল | কীভাবে ধরবেন |
|---|---|
| Coefficient-এ ধ্রুবকের ঘাত বা চিহ্ন বাদ: (2x − 3y)8-এ শুধু C(8, 3) লেখা | সব variable-এ 1 বসিয়ে যোগফল মেলান; ছোট n-এ পুরো রাশি খুলে দেখুন |
| k-তম পদ আর (k + 1)-তম পদ গুলিয়ে off-by-one | Tk+1 = C(n, k)an−kbk লিখে k = 0-এ প্রথম পদ মেলান |
| Combinatorial proof-এ দুই ভাগ পৃথক নয়, বা কোনো ক্ষেত্র বাদ (overcounting/undercounting) | ছোট n-এ itertools দিয়ে আসল সেট তালিকা করে দুই গোনা মেলান |
| Hypothesis বাদ: একান্তর যোগফল n = 0-এও 0 বলা, বা matrix-এ binomial theorem চালানো | প্রতিটি উপপাদ্যের শর্ত জিজ্ঞেস করুন (n ≥ 1, xy = yx, p মৌলিক) |
| কয়েকটি n-এ মেলে এমন ভুল identity-কে “প্রমাণিত” বলা | n = 0..30-এ যন্ত্রে পরীক্ষা করুন; তারপরও প্রমাণ চান |
| ইতিহাস বা “বিখ্যাত বইয়ের” উদ্ধৃতি বানিয়ে বলা | বিশ্বস্ত পাঠ্যবই বা ইতিহাসের প্রাথমিক উৎসে নিজে খুঁজুন |
AI-কে একটি identity প্রমাণ করতে দিলে কাঠামো বেঁধে দিন, যাতে প্রতিটি দাবি যাচাই করা যায়:
AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১ত্রিভুজটি বহু শতাব্দী আগে ভারত, পারস্য আর চীনে জানা ছিল; তাহলে নাম Pascal-এর কেন?
গণিতের ইতিহাসে নাম প্রায়ই প্রথম আবিষ্কারকের নয়, বরং যিনি বিষয়টিকে একটি নির্দিষ্ট গোষ্ঠীর কাছে সবচেয়ে প্রভাবশালীভাবে তুলে ধরেছেন, তাঁর। পরিসংখ্যানবিদ Stephen Stigler ১৯৮০ সালে মজা করে একটি “নিয়ম” বলেছিলেন: কোনো বৈজ্ঞানিক আবিষ্কারের নাম তার আসল আবিষ্কারকের নামে হয় না। Pascal-এর ত্রিভুজ এর পরিচিত উদাহরণ।
উপমহাদেশে Pingala-র ছন্দশাস্ত্রে লঘু আর গুরু মাত্রা দিয়ে কত রকম ছন্দ বানানো যায়, সেই গোনার একটি সূত্র আছে, যাকে পরে ত্রিভুজ আকারে ব্যাখ্যা করা হয়েছে; দশম শতকের Halayudha-র ভাষ্যকে এর স্পষ্ট বর্ণনা বলে ধরা হয়। ছন্দের প্রশ্নটি আসলে এই পর্বের প্রশ্ন: n মাত্রার একটি সারিতে কয়টি গুরু মাত্রা, এমন সাজানো কয়টি? উত্তর C(n, k). পারস্যে al-Karaji-র কাজ পরের লেখক al-Samaw'al-এর বইয়ের মাধ্যমে জানা যায়, আর সেখানে ছোট n থেকে পরের n-এ যাওয়ার যুক্তিকে কেউ কেউ induction-এর প্রাথমিক রূপ বলেন। চীনে Yang Hui ১২৬১ সালে আর Zhu Shijie ১৩০৩ সালে ত্রিভুজ ছাপেন; ইউরোপে Apianus, Stifel, Tartaglia প্রমুখের বইয়েও Pascal-এর আগে এটি এসেছে বলে উল্লেখ আছে। এই প্রতিটি তারিখ আর ব্যাখ্যা নিয়ে ইতিহাসবিদদের মধ্যে আলোচনা চলে, তাই “প্রথম কে” প্রশ্নের নিশ্চিত উত্তর নেই।
তবু Pascal-এর অবদান আলাদা। ১৬৫৪ সালের লেখায় তিনি ত্রিভুজের অনেক ধর্ম একটি একটি করে প্রমাণ করেন, এমন যুক্তিতে যা আজকের induction-এর খুব কাছে, আর সেগুলো জুয়ার ভাগাভাগির সমস্যায় (Fermat-এর সঙ্গে চিঠিপত্রে) প্রয়োগ করেন, যা সম্ভাবনা তত্ত্বের শুরুর একটি অধ্যায়। পরে Montmort আর de Moivre-এর মতো লেখকেরা “Pascal-এর ত্রিভুজ” নামটি ছড়িয়ে দেন বলে জানা যায়।
মূল উপলব্ধি: গাণিতিক সত্য কোনো এক দেশের নয়; নাম একটি ঐতিহাসিক দুর্ঘটনা, আর বহু সভ্যতা স্বাধীনভাবে একই গোনার প্রশ্ন থেকে একই ত্রিভুজে পৌঁছেছে।
প্র ০২বীজগণিতের প্রমাণ থাকলে combinatorial proof কেন দরকার? কম্পিউটার কি identity প্রমাণ করতে পারে?
Pascal-এর identity-র বীজগণিতের প্রমাণ কয়েক লাইনের: হর মিলিয়ে যোগ করলেই হয়। তাহলে গল্প বলার দরকার কী? প্রথম কারণ বোঝা। বীজগণিত বলে “সত্য”, গল্প বলে “কেন সত্য”। k·C(n, k) = n·C(n − 1, k − 1) দেখে মুখস্থ রাখা কঠিন, কিন্তু “দল আগে, নেতা পরে” বনাম “নেতা আগে, দল পরে” একবার বুঝলে ভোলা যায় না। দ্বিতীয় কারণ আবিষ্কার: একটি গোনার গল্প প্রায়ই নতুন identity-র জন্ম দেয়। ভাগ করার মাপকাঠি বদলালেই (সবচেয়ে বড় উপাদান, ঢাকার সদস্য সংখ্যা, প্রথম উপাদান আছে কি না) ভিন্ন সূত্র বের হয়।
তৃতীয় কারণ সাধারণীকরণ। Combinatorial যুক্তি প্রায়ই এমন জায়গায় চলে যেখানে সূত্র জটিল। গণিতবিদ Arthur Benjamin আর Jennifer Quinn ২০০৩ সালে Proofs That Really Count নামে একটি বই প্রকাশ করেন, যেখানে Fibonacci আর binomial সংখ্যার বহু identity শুধু গোনার গল্পে প্রমাণ করা হয়েছে। পর্ব ৩৭ “গণনার কৌশল — lattice path, bijection আর double counting”-এ এই ধারা চলবে।
অন্যদিকে কিছু identity-র সহজ গল্প আজও অজানা, বা খুঁজে পাওয়া কঠিন। এখানে কম্পিউটারের ভূমিকা চমকপ্রদ। ১৯৯০-এর দশকে Herbert Wilf আর Doron Zeilberger এমন একটি পদ্ধতি দেন (WZ পদ্ধতি নামে পরিচিত), যা binomial coefficient-ওয়ালা একটি বড় শ্রেণির যোগফলের identity-র জন্য একটি “সার্টিফিকেট” খুঁজে বের করে, যা মানুষ হাতে যাচাই করতে পারে। Petkovšek, Wilf আর Zeilberger-এর ১৯৯৬ সালের বই A = B-এর নামই এর দাবি বলে দেয়: এমন সমতা যন্ত্রে প্রমাণ করা যায়। SymPy-র মতো computer algebra system-ও অনেক যোগফল সরল করতে পারে।
তবে যন্ত্রের প্রমাণ বোঝার বিকল্প নয়। এই পর্বের Python ব্লকগুলো যা করে, তা প্রমাণ নয়, যাচাই: ৩১টি সারিতে মিল দেখায়। আর AI সহকারী যে “combinatorial proof” লেখে, তাতে ভাগগুলো সত্যিই পৃথক কি না, তা যাচাই করার দায় আপনার।
মূল উপলব্ধি: বীজগণিত সত্যতা দেখায়, গল্প কারণ দেখায়, যন্ত্র ছোট ক্ষেত্রে ভুল ধরে আর কিছু শ্রেণিতে প্রমাণের সার্টিফিকেট দেয়; ভালো গণিতবিদ তিনটিই ব্যবহার করেন।
প্র ০৩Pascal-এর ত্রিভুজ mod 2-তে একটি fractal কেন আসে? কম্পিউটার বিজ্ঞানে এর দেখা কোথায় মেলে?
কারণটি Pascal-এর identity আর একটি সরল পর্যবেক্ষণ। mod 2-তে (x + y)² ≡ x² + y², তাই (1 + x)2m ≡ 1 + x2m (mod 2). অর্থাৎ সারি 2m mod 2-তে শুধু দুই প্রান্তে 1, মাঝে সব 0. সেখান থেকে পরের 2mটি সারি দুই প্রান্ত থেকে আলাদা আলাদাভাবে আগের পুরো নকশার কপি তৈরি করে, কারণ মাঝের শূন্যগুলো কিছু যোগ করে না। ফলে প্রথম 2m+1 সারি = প্রথম 2m সারির তিনটি কপি, ওপরে একটি আর নিচে দুটি পাশাপাশি। এই “নিজের ছোট কপি দিয়ে তৈরি” গঠনই self-similarity, fractal-এর মূল লক্ষণ। তাই বিজোড় ঘর 3mটি।
একই নকশা আশ্চর্য জায়গায় ফিরে আসে। একটি সরল cellular automaton কল্পনা করুন: একটি সারির প্রতিটি ঘর 0 বা 1, আর পরের সারির ঘর = ওপরের দুই প্রতিবেশীর XOR. Stephen Wolfram-এর নামকরণে এটি “Rule 90”; একটি মাত্র 1 থেকে শুরু করলে এটি হুবহু Pascal mod 2 আঁকে। আবার Lucas-এর ফল k & n == k বলে, C(n, k) বিজোড় মানে k-এর bit-গুলো n-এর bit-এর subset. প্রোগ্রামিংয়ে একটি bitmask n-এর সব sub-mask ঘুরে দেখার কৌশল (s = (s - 1) & n) ঠিক সেই k-গুলোই দেয়, যাদের জন্য C(n, k) বিজোড়।
ব্যবহারিক দিকও আছে। Kummer আর Lucas-এর ফল দিয়ে কোনো মৌলিক p-এর জন্য বিশাল n-এ C(n, k) mod p হিসাব করা যায়, পুরো সংখ্যা না বানিয়েই; প্রোগ্রামিং কনটেস্টে এটি নিয়মিত লাগে (DSA কোর্সের পর্ব ৬২)। Error-correcting code-এর তত্ত্বেও (যেমন Reed–Muller code) binomial coefficient-এর parity আর এই ধরনের নকশা আসে বলে জানা যায়।
একটি দার্শনিক দিক: বড় সারিতে প্রায় সব সংখ্যাই জোড় (বিজোড়ের অনুপাত (3/4)m হারে কমে), অথচ প্রতিটি সারির দুই প্রান্তে 1 বিজোড়। “প্রায় সব” আর “সব” এক নয়।
মূল উপলব্ধি: একটি স্থানীয় নিয়ম (ওপরের দুই ঘরের যোগফল) mod 2-তে XOR হয়ে যায়, আর সেই সরল নিয়মই সব স্কেলে একই নকশা তৈরি করে।
প্র ০৪C(n, k) কত দ্রুত বড় হয়? প্রোগ্রামে হিসাব করতে গিয়ে কী সমস্যা হয়?
সারির যোগফল 2n, আর সারিতে n + 1টি সংখ্যা, তাই সবচেয়ে বড়টি অন্তত 2n/(n + 1). সূক্ষ্ম হিসাব (Stirling-এর সূত্র থেকে) বলে C(2m, m) প্রায় 4m/√(πm). যেমন C(100, 50) = 100891344545564193334812497256, প্রায় 1.009 × 1029, আর সূত্রের আসন্ন মান প্রায় 1.011 × 1029; ভুল মাত্র প্রায় ০.২৫%. অর্থাৎ মাঝের সংখ্যা সারির মোট যোগফলের মোটামুটি 1/√(πm) অংশ, যা ধীরে কমে।
প্রোগ্রামে এর ফল সরাসরি। 64-bit অঋণাত্মক পূর্ণসংখ্যায় সর্বোচ্চ প্রায় 1.8 × 1019 ধরে; C(68, 34) ইতিমধ্যে এর চেয়ে বড়। আরও বিপজ্জনক হলো মাঝপথের overflow: n!/(k!(n − k)!) সূত্রে n! নিজেই 20!-এর পরে 64 bit ছাড়ায়, যদিও চূড়ান্ত উত্তর ছোট হতে পারে। তাই ভালো কোড গুণফল আর ভাগ পালাক্রমে করে: c = 1; প্রতি ধাপে c = c · (n − i)/(i + 1), যেখানে প্রতিটি ভাগ নির্ভুল, কারণ ধাপ i-এর পরে c নিজেই C(n, i + 1). অথবা Pascal-এর identity দিয়ে টেবিল বানায়, যেখানে শুধু যোগ লাগে; ছোট n-এর জন্য এটি সবচেয়ে নিরাপদ, আর DSA কোর্সের পর্ব ৫২-এ গ্রিডের পথ গোনায় এই টেবিলই ফিরে আসে।
Python-এর int সীমাহীন, তাই math.comb(1000, 500) একটি ৩০০ অঙ্কের নির্ভুল সংখ্যা দেয়। কিন্তু float-এ রূপান্তর করলে নির্ভুলতা হারায়, আর খুব বড় হলে overflow-ও হয়। প্রতিযোগিতামূলক প্রোগ্রামিংয়ে তাই উত্তর প্রায়ই একটি মৌলিক সংখ্যা mod (যেমন 109 + 7) চাওয়া হয়, আর factorial-এর টেবিল ও modular inverse ব্যবহার করা হয় (পর্ব ২২, পর্ব ২৪)।
এই দ্রুত বৃদ্ধি algorithm-এর জন্য সতর্কবার্তাও: “সব k-subset পরীক্ষা করো” ধরনের brute force n = 50, k = 25-এ ইতিমধ্যে প্রায় 1.26 × 1014টি subset দেখে, যা ব্রাউজারে অসম্ভব। এই কারণেই এই পর্বের ব্লকগুলো ছোট n-এ তালিকা করে, বড় n-এ সূত্রে ভরসা করে।
মূল উপলব্ধি: C(n, k) সূচকীয় হারে বাড়ে; হিসাবের ক্রম (মাঝপথের overflow এড়ানো) আর সংখ্যার ধরন (int, mod p, float) ঠিক না করলে সঠিক সূত্রও ভুল উত্তর দেয়।
প্র ০৫Binomial coefficient গণিতের বাইরে কোথায় কাজ করে? Bezier curve, error-correcting code আর পরিসংখ্যানে এর ভূমিকা কী?
কম্পিউটার গ্রাফিক্সে মসৃণ বক্ররেখা আঁকার একটি প্রধান উপায় Bézier curve. কয়েকটি নিয়ন্ত্রণ বিন্দু P0, …, Pn দিলে বক্ররেখার বিন্দু হলো ∑C(n, k)tk(1 − t)n−kPk, t = 0 থেকে 1. ওজনগুলো Bernstein polynomial, আর binomial theorem বলে সব ওজনের যোগফল (t + (1 − t))n = 1, তাই বিন্দুটি নিয়ন্ত্রণ বিন্দুগুলোর একটি ওজনযুক্ত গড়। ১৯৫০-এর দশকের শেষ থেকে ১৯৬০-এর দশকে ফরাসি গাড়ি শিল্পে Paul de Casteljau আর Pierre Bézier স্বাধীনভাবে এই বক্ররেখা নিয়ে কাজ করেন বলে জানা যায়; আজ font-এর অক্ষরের রূপরেখা আর ভেক্টর গ্রাফিক্সে এর ব্যবহার ব্যাপক। de Casteljau-র algorithm বক্ররেখার বিন্দু বের করে বারবার দুই বিন্দুর মাঝামাঝি নিয়ে, যা আসলে Pascal-এর identity-র জ্যামিতিক রূপ।
Error-correcting code-এ দৈর্ঘ্য n-এর একটি codeword-এর সর্বোচ্চ r টি bit উল্টে গেলে সম্ভাব্য ভুল শব্দের সংখ্যা C(n, 0) + C(n, 1) + … + C(n, r). এই “Hamming ball”-এর আয়তন দিয়ে একটি সীমা পাওয়া যায়: কতগুলো codeword রাখলে ভুল শুধরানো সম্ভব। Richard Hamming ১৯৫০ সালে প্রকাশিত কাজে এই ধরনের code নিয়ে লেখেন; n = 7, r = 1-এ বল-এর আয়তন 8, আর 27/8 = 16, ঠিক Hamming(7,4) code-এর codeword সংখ্যা।
পরিসংখ্যানে n টি স্বাধীন হ্যাঁ/না পরীক্ষার ফল binomial distribution মানে; বাজারঘর যদি জানতে চায় ১০০টি অর্ডারের মধ্যে কয়টি দেরিতে পৌঁছাতে পারে, প্রাথমিক মডেলটি এটিই। Machine learning কোর্সের পর্ব ২০-এ GLM-এর ভেতরে এর ব্যবহার আছে, আর AI ফাউন্ডেশনস কোর্সের পর্ব ৩৬-এ simulation-সহ। Algorithm বিশ্লেষণেও C(n, 2) জোড়ার তুলনা আর C(n, 3) ত্রয়ীর লুপ বারবার আসে।
মূল উপলব্ধি: “n টি থেকে k টি বাছাই” এত মৌলিক প্রশ্ন যে গ্রাফিক্স, যোগাযোগ, পরিসংখ্যান আর algorithm, সবখানে একই সংখ্যাগুলো ফিরে আসে, আর binomial theorem-এর “যোগফল 1” প্রায়ই ওজন বা সম্ভাবনার রূপে দেখা দেয়।
অনুশীলন
আগে খাতায় করুন, তারপর উত্তর খুলে মেলান।
-
প্রমাণ: প্রতিটি n ≥ 0-এর জন্য combinatorial যুক্তিতে দেখান যে C(n, 0)² + C(n, 1)² + … + C(n, n)² = C(2n, n).
- X = n জন ঢাকার আর n জন চট্টগ্রামের রাইডার থেকে n জনের সব দল; |X| = C(2n, n).
- দলে ঢাকার ঠিক k জন থাকলে চট্টগ্রামের n − k জন: C(n, k)·C(n, n − k) রকম। প্রতিটি দলের k একটিই, 0 ≤ k ≤ n.
- সমমিতি (উপপাদ্য ১.১খ) C(n, n − k) = C(n, k), তাই পদটি C(n, k)².
- k = 0..n যোগ করলে ∑C(n, k)² = C(2n, n). ∎ (এটি Vandermonde-এ m = n = r.)
যাচাই n = 4: 1 + 16 + 36 + 16 + 1 = 70 = C(8, 4); scratch আর পাতার প্রথম ব্লকে n ≤ 30 পর্যন্ত মিলেছে।
-
হিসাব: (ক) (1 + 2x)7-এ x4-এর সহগ। (খ) (x² − 1/x)9-এর ধ্রুবক পদ। (গ) ∑k=010 C(10, k)·2k. (ঘ) ঢাকার ৪ জন আর চট্টগ্রামের ৬ জন রাইডার থেকে ৩ জনের দল, যাতে ঢাকার ঠিক একজন।
(ক) C(7, 4) · 24 = 35 · 16 = 560.
(খ) সাধারণ পদ C(9, k)(x²)9−k(−1/x)k = C(9, k)(−1)kx18−3k. 18 − 3k = 0 হলে k = 6: C(9, 6)(−1)6 = 84.
(গ) Binomial theorem-এ x = 1, y = 2: (1 + 2)10 = 310 = 59049.
(ঘ) C(4, 1) · C(6, 2) = 4 · 15 = 60. বাকি ক্ষেত্রগুলো মেলালে Vandermonde যাচাই হয়: ঢাকার ০ জন C(6, 3) = 20, ২ জন C(4, 2)·C(6, 1) = 36, ৩ জন C(4, 3) = 4; মোট 20 + 60 + 36 + 4 = 120 = C(10, 3). সব মান scratch script-এ মিলিয়েছি।
-
আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে। তারপর যেকোনো Python-এ চালিয়ে মেলান।
from math import comb row = [comb(6, k) for k in range(7)] print(row[2] + row[3], comb(7, 3)) print(sum(row[::2]), sum(row[1::2])) print(sum(k * c for k, c in enumerate(row)))35 35 32 32 192সারি 6 হলো 1 6 15 20 15 6 1. প্রথম লাইন Pascal-এর identity: C(6, 2) + C(6, 3) = 15 + 20 = 35 = C(7, 3). দ্বিতীয় লাইনে জোড় অবস্থান (1 + 15 + 15 + 1) আর বিজোড় অবস্থান (6 + 20 + 6) সমান, প্রতিটি 25 = 32, উপপাদ্য ৬.২. তৃতীয় লাইন ∑k·C(6, k) = 6 · 25 = 192, উপপাদ্য ৬.৩.
-
গোনার ভুল ধরুন: “৪ জন নারী আর ৫ জন পুরুষ রাইডার থেকে ৩ জনের দল চাই, যাতে অন্তত একজন নারী। সমাধান: আগে একজন নারী বাছি (৪ রকম), তারপর বাকি ৮ জন থেকে যেকোনো ২ জন (C(8, 2) = 28 রকম)। উত্তর 4 · 28 = 112.” ভুল কোথায়, আর সঠিক উত্তর কত?
ভুলটি overcounting. যে দলে দুজন নারী আছেন, যেমন {N1, N2, P1}, সেটি দুইবার গোনা হয়েছে: একবার “প্রথমে N1, পরে N2 আর P1”, আবার “প্রথমে N2, পরে N1 আর P1”. তিনজন নারীর দল তিনবার গোনা হয়েছে। প্রথম ধাপের “নির্দিষ্ট নারী” দলের ভেতরে আলাদা কোনো ভূমিকা রাখেন না, তাই একই দল বিভিন্ন পথে আসে।
সঠিক পথ: পরিপূরক গোনা। সব দল C(9, 3) = 84, কোনো নারী নেই এমন দল C(5, 3) = 10, তাই উত্তর 84 − 10 = 74. যাচাই, ক্ষেত্র ভাগ করে: ঠিক ১ নারী C(4, 1)C(5, 2) = 40, ঠিক ২ জন C(4, 2)C(5, 1) = 30, ঠিক ৩ জন C(4, 3) = 4; মোট 74. আর ভুল উত্তরের হিসাব মেলে: 40 · 1 + 30 · 2 + 4 · 3 = 112, অর্থাৎ প্রতিটি দল তার নারী-সংখ্যার সমান বার গোনা হয়েছে। Scratch-এ itertools দিয়ে মিলিয়েছি।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমএকটি identity-র double counting প্রমাণ লেখার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- ছোট n-এ দুই পাশ সংখ্যায় হিসাব করে দেখা যে identity-টি সত্য মনে হয়
- একটি সসীম সেট X ঠিক করা, যার আকার দুই পাশই গুনতে পারে
- প্রথম উপায়ে |X| গোনা আর দেখানো যে প্রতিটি উপাদান ঠিক একবার গোনা হলো
- দ্বিতীয় উপায়ে |X| গোনা, একই সতর্কতায়
- দুই রাশি একই সংখ্যা |X|, তাই সমান বলে সিদ্ধান্ত টানা
(1 + x)10-এর বিস্তারে x3-এর সহগ কত?
- 120
- 720
- 30
- 1000
(x − 2y)5-এর বিস্তারে x2y3-এর সহগ কত?
- 10
- 80
- −80
- −40
C(3, 3) + C(4, 3) + C(5, 3) + C(6, 3) + C(7, 3)-এর মান কত?
- 35
- 70
- 56
- 128
n ≥ 1 হলে C(n, 0) − C(n, 1) + C(n, 2) − … + (−1)nC(n, n)-এর মান কত?
- 2n
- 1
- (−1)n
- 0
Pascal-এর ত্রিভুজের সারি 20-এ (C(20, 0) থেকে C(20, 20)) কয়টি সংখ্যা বিজোড়?
- 4
- 21
- 2
- 10
Combinatorial যুক্তিতে k · C(n, k) কোনটির সমান (1 ≤ k ≤ n)?
- k · C(n − 1, k)
- n · C(n − 1, k − 1)
- C(n, k + 1)
- n · C(n, k − 1)
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- C(n, k): n উপাদানের সেটের k-subset-এর সংখ্যা = n!/(k!(n − k)!) = C(n, n − k); k > n বা k < 0 হলে 0.
- Combinatorial proof: একটি সেট দুইভাবে গোনা (double counting) বা দুই সেটের মধ্যে bijection; প্রতিটি ভাগ পৃথক আর সম্পূর্ণ কি না দেখাতেই হবে।
- Pascal আর binomial theorem: C(n, k) = C(n − 1, k − 1) + C(n − 1, k); (x + y)n = ∑C(n, k)xn−kyk, শর্ত xy = yx; general term Tk+1 = C(n, k)an−kbk.
- Identity: ∑C(n, k) = 2n; একান্তর যোগফল 0 (n ≥ 1); ∑k·C(n, k) = n·2n−1; Vandermonde C(m + n, r) = ∑C(m, k)C(n, r − k); hockey stick ∑i=rnC(i, r) = C(n + 1, r + 1).
- Mod 2: C(n, k) বিজোড় ⟺ k & n == k (Lucas, p = 2); সারি n-এ বিজোড় সংখ্যা 2(n-এর 1-bit)টি, নকশাটি Sierpinski ত্রিভুজ।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৩৫ · পুনরাবৃত্তিসহ বাছাই — stars and bars আর multinomialপরবর্তী পর্বপুনরাবৃত্তিসহ বাছাই, stars and bars আর multinomial-এর হিসাব।
- ডিসক্রিট ম্যাথমেটিক্স · কোর্স হোম৮৩টি পর্বপরের পর্ব ৩৫ “পুনরাবৃত্তিসহ বাছাই — stars and bars আর multinomial”, গণনার মডিউলের বাকি পর্ব আর পুরো কোর্সের মানচিত্র।
- পর্ব ১৪ · সেট — সংজ্ঞা, subset, power set আর Cartesian productপুনরালোচনা|P(S)| = 2n, যা সারির যোগফলের আরেক রূপ।
- পর্ব ১০ · Mathematical induction — এক ধাপ থেকে অসীম পর্যন্তপুনরালোচনাBinomial theorem-এর দ্বিতীয় প্রমাণের ছাঁচ।
- পর্ব ১৭ · Sequence আর summation — closed form আর বিখ্যাত যোগফলপুনরালোচনা∑ চিহ্নের নিয়ম, index shift আর ত্রিভুজ সংখ্যা।
- DSA · পর্ব ৬২ · Number theory — GCD, sieve আর modular arithmeticnCr mod pকোডে বড় n-এর binomial coefficient mod p.
- DSA · পর্ব ৫২ · Dynamic programming-এর ভিত্তি — memoization আর tabulationPascal টেবিল কোডেগ্রিডের পথ গোনায় Pascal-এর ত্রিভুজ।
- AI ফাউন্ডেশনস · পর্ব ৩৬ · Distribution আর sampling — normal, binomial আর simulationসম্ভাবনায়Binomial distribution আর simulation.