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

Inclusion–exclusion আর derangement

The Principle of Inclusion–Exclusion — Onto Functions, Stirling Numbers, Derangements, Euler's Totient and Counting Primes

Taught in Bangla, this lesson proves the inclusion–exclusion formula for any n finite sets and its complement form for objects with no bad property. It derives the number of onto functions and Stirling numbers of the second kind, proves the derangement formula and its two recurrences, and explains the limit 1/e. The same sieve gives Euler's totient, Legendre's prime count and bounded integer solutions, and in-page Python checks every formula by brute force, exact integers and seeded simulation.

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

  • যেকোনো n-টি সসীম সেটের inclusion–exclusion সূত্র, তার পূর্ণ প্রমাণ আর complement রূপ
  • Onto ফাংশনের সংখ্যার সূত্রের প্রমাণ, আর সেখান থেকে দ্বিতীয় ধরনের Stirling সংখ্যা
  • Derangement-এর সূত্র, তার দুই recurrence-এর combinatorial প্রমাণ আর 1/e-এর সঙ্গে সম্পর্ক
  • Euler-এর φ, Legendre-এর মৌলিক-গণনা আর ঊর্ধ্বসীমাসহ পূর্ণসংখ্যার সমাধান একই নীতিতে
  • প্রতিটি সূত্র brute force, exact integer আর seeded simulation দিয়ে Python-এ মেলানো

১ · দুই সেট থেকে তিন সেট — যোগ, বিয়োগ, আবার যোগ

পর্ব ১৫ “সেটের অপারেশন — union, intersection, Venn diagram আর identity”-এ আপনি প্রমাণ করেছেন |A ∪ B| = |A| + |B| − |A ∩ B|, আর তিন সেটের সূত্রটি দেখেছেন। সেখানে সাধারণ n সেটের রূপ আর তার প্রমাণ এই পর্বের জন্য রাখা ছিল। এই নীতির নাম inclusion–exclusion: “অন্তর্ভুক্ত করা আর বাদ দেওয়া”। আগে তিন সেটে হাত পাকাই, তারপর সাধারণ প্রমাণে যাই।

পাড়ার একটি কোচিং সেন্টারে হাজিরা খাতা ভাবুন। গণিতের ক্লাসে ৪০ জন, ইংরেজিতে ৩৫ জন। মোট ছাত্র কত? ৭৫ বললে ভুল, কারণ যারা দুই ক্লাসেই আসে, তাদের নাম দুই খাতাতেই আছে, অর্থাৎ দুবার গোনা হয়েছে। দুই খাতার মিল ১৫ জন হলে উত্তর ৭৫ − ১৫ = ৬০. তৃতীয় একটি ক্লাস যোগ হলে গোলমাল বাড়ে: তিন ক্লাসেই আসা ছাত্রকে একক খাতায় তিনবার যোগ, জোড়ায় জোড়ায় মিলে তিনবার বিয়োগ, ফলে শূন্যবার গোনা হয়। তাই তাকে আরেকবার যোগ করতে হয়। চিহ্ন পালাক্রমে বদলায়, এটিই পুরো নীতির ছবি।

বাজারঘরের উদাহরণ। বাজারঘর ১ থেকে ১০০ পর্যন্ত অর্ডার নম্বরে একটি অফার দেয়: অর্ডার নম্বর 2, 3 বা 5-এর যেকোনোটি দিয়ে বিভাজ্য হলে ছাড়। কতগুলো অর্ডার ছাড় পাবে? ধরুন A, B, C হলো যথাক্রমে 2, 3, 5-এর গুণিতকের সেট। m ≤ 100-এর গুণিতক ⌊100/m⌋টি (floor, অর্থাৎ নিচের দিকে পূর্ণসংখ্যা), আর দুটি ভিন্ন মৌলিক সংখ্যা দিয়ে একসঙ্গে বিভাজ্য মানে তাদের গুণফল দিয়ে বিভাজ্য। নিচের ছবিতে Venn diagram-এর আটটি অঞ্চলের প্রতিটিতে কয়টি সংখ্যা পড়ে, তা দেখানো আছে (scratch-এ গুনে মেলানো)।

১ থেকে ১০০: 2, 3 আর 5-এর গুণিতকের Venn diagram

প্রতিটি অঞ্চলের সংখ্যা সেই অঞ্চলে “ঠিক” কয়টি অর্ডার নম্বর পড়ে। তিন বৃত্তের ভেতরে মোট 74, বাইরে 26.

Venn diagram of multiples of 2, 3 and 5 up to 100 with region counts A: 2-এর গুণিতক (50) B: 3-এর (33) C: 5-এর (20) বাইরে 26 27 14 7 13 7 3 3
1A, B, C সংজ্ঞা2+ একক সেট3− জোড়ায় ছেদ4+ তিনটির ছেদ5অঞ্চল ধরে যাচাই6complement: 26
১ থেকে ১০০; A = 2∣x, B = 3∣x, C = 5∣x
এই ধাপে
মান
চলতি যোগফল
  1. সেট বানানো। A = 2-এর গুণিতক, B = 3-এর, C = 5-এর, সব ১ থেকে ১০০-এর মধ্যে। m-এর গুণিতক ⌊100/m⌋টি। 2 আর 3 দুটিতে বিভাজ্য মানে 6-এ বিভাজ্য, তাই |A ∩ B| = ⌊100/6⌋.
  2. একক সেট যোগ। |A| + |B| + |C| = 50 + 33 + 20 = 103. ১০০টি সংখ্যা থেকে ১০৩টি “ছাড়” হতে পারে না; 6, 10, 15-এর মতো সংখ্যা একাধিকবার গোনা হয়েছে।
  3. জোড়ায় ছেদ বিয়োগ। |A ∩ B| = ⌊100/6⌋ = 16, |A ∩ C| = ⌊100/10⌋ = 10, |B ∩ C| = ⌊100/15⌋ = 6, যোগফল 32. চলতি মান 103 − 32 = 71. কিন্তু 30, 60, 90 তিন সেটেই আছে: তিনবার যোগ, তিনবার বিয়োগ, এখন শূন্যবার গোনা।
  4. তিনটির ছেদ যোগ। |A ∩ B ∩ C| = ⌊100/30⌋ = 3. ফিরিয়ে যোগ করলে 71 + 3 = 74. তাই ৭৪টি অর্ডার ছাড় পায়।
  5. অঞ্চল ধরে যাচাই। Venn diagram-এর সাতটি ভেতরের অঞ্চল: 27 + 14 + 7 + 13 + 7 + 3 + 3 = 74. প্রতিটি সংখ্যা ঠিক একটি অঞ্চলে পড়ে, তাই এই যোগফলে কেউ দুবার গোনা হয়নি; দুই পথের উত্তর এক।
  6. Complement. কোনোটিতেই বিভাজ্য নয় এমন সংখ্যা 100 − 74 = 26; এরা ঠিক সেই সংখ্যা, যারা 30-এর সঙ্গে সহমৌলিক। যেমন ৯১ থেকে ১০০-এ শুধু 91 আর 97.

লক্ষ করুন, ধাপ ৩-এর পরে উত্তর 71, যা আসল উত্তরের চেয়ে কম, আর ধাপ ২-এর পরে 103, যা বেশি। আংশিক যোগফল সত্যিকারের উত্তরের দুই পাশে দোলে। এই পর্যবেক্ষণটি সেকশন ৭-এ Bonferroni অসমতা হিসেবে প্রমাণ হবে।

২ · সাধারণ নীতি আর তার প্রমাণ

n-টি সেটের জন্য লেখা সহজ করতে একটি সংকেত নিই। প্রতিটি k-এর জন্য Sk হলো k-টি করে সেট বেছে তাদের ছেদের আকারের যোগফল:

Sk = ∑1 ≤ i1 < i2 < … < ik ≤ n |Ai1 ∩ Ai2 ∩ … ∩ Aik|

এই যোগফলে C(n, k)টি পদ আছে, কারণ n-টি সেট থেকে k-টি বাছাইয়ের উপায় C(n, k) (পর্ব ৩৩)। সেকশন ১-এ S1 = 103, S2 = 32, S3 = 3.

উপপাদ্য ২.১ (Inclusion–exclusion নীতি)

A1, …, An যেকোনো সসীম সেট হলে

|A1 ∪ A2 ∪ … ∪ An| = S1 − S2 + S3 − … + (−1)n+1Sn = ∑k=1n (−1)k+1 Sk

প্রমাণের কৌশলটি double counting-এর মতো: সূত্রের দুই পাশে প্রতিটি উপাদান কতবার গোনা হয়, তা আলাদা করে হিসাব করি।

  1. বাইরের উপাদান: x যদি কোনো Ai-তে না থাকে, তাহলে বাঁ পাশে সে নেই, আর ডান পাশের কোনো ছেদেও নেই। দুই পাশেই অবদান 0. — সংজ্ঞা
  2. ভেতরের উপাদান: ধরুন x ঠিক r-টি সেটে আছে, r ≥ 1. বাঁ পাশে সে ঠিক 1 বার গোনা হয়। — union-এর সংজ্ঞা
  3. Sk-তে অবদান: k-টি সেটের একটি ছেদে x থাকে ঠিক যখন বাছাই করা k-টি সেটের সবগুলো x-এর সেই r-টি সেটের মধ্যে পড়ে। এমন বাছাই C(r, k)টি, আর k > r হলে একটিও নেই। তাই Sk-তে x গোনা হয় C(r, k) বার। — বাছাই গোনা
  4. ডান পাশে মোট অবদান: ∑k=1r (−1)k+1 C(r, k) = 1 − ∑k=0r (−1)k C(r, k). — k = 0 পদটি (C(r, 0) = 1) আলাদা করা
  5. Binomial theorem: ∑k=0r (−1)k C(r, k) = (1 − 1)r = 0, কারণ r ≥ 1. তাই অবদান 1 − 0 = 1. — পর্ব ৩৪-এর একান্তর যোগফল
  6. প্রতিটি উপাদান দুই পাশে সমান বার গোনা হয় (0 বা 1), তাই দুই পাশ সমান। ∎ — যোগের নিয়ম

ধাপ ৫-ই নীতির প্রাণ: r = 3 হলে 3 − 3 + 1 = 1, r = 4 হলে 4 − 6 + 4 − 1 = 1. পালাক্রমের চিহ্ন কোনো কৌশলের জন্য বসানো নয়; এটি binomial theorem থেকে বাধ্যতামূলকভাবে আসে।

Complement রূপ — “কোনো খারাপ ধর্ম নেই”

বাস্তবে প্রায়ই প্রশ্নটি উল্টো: একটি সার্বিক সেট U-তে N-টি বস্তু, আর কয়েকটি “খারাপ” ধর্ম P1, …, Pn; Ai হলো Pi আছে এমন বস্তুর সেট। কতগুলো বস্তুর কোনো খারাপ ধর্ম নেই? এর উত্তর union-এর complement-এর আকার।

উপপাদ্য ২.২ (চালনি রূপ, sieve form)

সার্বিক সেট U-তে |U| = N হলে, আর S0 = N ধরলে

|Ā1 ∩ Ā2 ∩ … ∩ Ān| = N − S1 + S2 − … + (−1)nSn = ∑k=0n (−1)k Sk

প্রতিসম রূপ: যদি যেকোনো k-টি সেটের ছেদের আকার শুধু k-এর ওপর নির্ভর করে, ধরুন Nk, তাহলে Sk = C(n, k)Nk, আর উত্তর ∑k=0n (−1)k C(n, k) Nk.

প্রমাণ এক লাইনের: De Morgan-এর নিয়মে Ā1 ∩ … ∩ Ān হলো A1 ∪ … ∪ An-এর complement, তাই আকার N − |A1 ∪ … ∪ An|, আর উপপাদ্য ২.১ বসালেই হয়। ∎ এই পর্বের বাকি সব প্রয়োগ, onto ফাংশন, derangement, φ(n), মৌলিক-গণনা, আসলে এই প্রতিসম রূপের ভিন্ন ভিন্ন সাজ। প্রতিটিতে একই চার প্রশ্ন: U কী, N কত, খারাপ ধর্মগুলো কী, আর k-টি ধর্মের ছেদের আকার কত?

সাধারণ ভুল: “জোড়ায় জোড়ায় ছেদ বিয়োগ করলেই দুবার গোনা ঠিক হয়ে যায়” ভেবে তিন সেটে শেষ পদ +|A ∩ B ∩ C| ভুলে যাওয়া। আরেকটি ভুল: প্রতিসম রূপ লাগানো যেখানে ছেদের আকার সমান নয়, যেমন 2, 3, 5-এর গুণিতকে |A| = 50 কিন্তু |C| = 20; সেখানে প্রতিটি ছেদ আলাদা করে গুনতে হয়।

৩ · Onto ফাংশন গোনা আর Stirling সংখ্যা

পর্ব ১৬ “ফাংশন — one-to-one, onto, inverse আর composition”-এ m উপাদানের সেট থেকে n উপাদানের সেটে onto ফাংশনের সংখ্যার সূত্রটি দেওয়া হয়েছিল, প্রমাণ এই পর্বের জন্য রেখে। বাজারঘরের ভাষায়: সকালে m-টি আলাদা অর্ডার n জন রাইডারের মধ্যে ভাগ করতে হবে, আর প্রত্যেক রাইডার অন্তত একটি অর্ডার পাবেন। প্রতিটি বণ্টন একটি ফাংশন f: {অর্ডার} → {রাইডার}, আর “সবাই অন্তত একটি” মানে f onto.

উপপাদ্য ৩.১ (Onto ফাংশনের সংখ্যা)

|X| = m আর |Y| = n হলে (m, n ≥ 1), X থেকে Y-তে onto ফাংশনের সংখ্যা

onto(m, n) = ∑k=0n (−1)k C(n, k) (n − k)m

  1. সার্বিক সেট: U = X থেকে Y-তে সব ফাংশন। প্রতিটি উপাদানের n-টি পছন্দ, স্বাধীনভাবে, তাই N = nm. — গুণের নিয়ম, পর্ব ৩১
  2. খারাপ ধর্ম: Y = {y1, …, yn}. Aj = যেসব ফাংশন yj-কে কখনো মান হিসেবে নেয় না। f onto ঠিক তখন, যখন f কোনো Aj-তে নেই। — onto-র সংজ্ঞা
  3. k-টির ছেদ: নির্দিষ্ট k-টি yj বাদ দিলে প্রতিটি উপাদানের হাতে n − k-টি মান থাকে, তাই ছেদের আকার (n − k)m, কোন k-টি বাদ তার ওপর নির্ভর করে না। — গুণের নিয়ম
  4. প্রতিসম রূপ: উপপাদ্য ২.২-এ Nk = (n − k)m বসালে onto(m, n) = ∑ (−1)k C(n, k)(n − k)m. ∎ — উপপাদ্য ২.২

শেষ পদ k = n-এ (n − n)m = 0m = 0 (m ≥ 1), তাই সেটি সবসময় শূন্য; তবু সাধারণ সূত্রে রাখা সুবিধাজনক। নিচের stepper পাঁচটি অর্ডার আর তিনজন রাইডারে হিসাবটি চালায়।

1N = 3⁵2k = 1: একজন বাদ3k = 2: দুজন বাদ4k = 3: তিনজন বাদ5যোগফল আর S(5, 3)
m = 5 অর্ডার, n = 3 রাইডার
পদ
মান
চলতি যোগফল
  1. সব বণ্টন। প্রতিটি অর্ডার তিন রাইডারের যেকোনো একজনের কাছে যেতে পারে: N = 35 = 243.
  2. একজন বাদ। নির্দিষ্ট একজন রাইডার কোনো অর্ডার পান না, এমন বণ্টন 25 = 32; কোন রাইডার, তা C(3, 1) = 3 উপায়ে। বিয়োগ: 243 − 96 = 147.
  3. দুজন বাদ। নির্দিষ্ট দুজন খালি হাতে, তাহলে সব অর্ডার বাকি একজনের: 15 = 1, আর C(3, 2) = 3 জোড়া। ধাপ ২-এ এরা দুবার বাদ পড়েছিল, তাই ফেরত যোগ: 147 + 3 = 150.
  4. তিনজন বাদ। কোনো রাইডারই নেই, কিন্তু অর্ডার আছে: 05 = 0টি ফাংশন। এই পদ শূন্য, উত্তর বদলায় না।
  5. ফল। onto(5, 3) = 150. রাইডারদের নাম মুছে দিলে প্রতিটি “দলভাগ” 3! = 6 বার গোনা হয়েছিল, তাই পাঁচটি অর্ডারকে তিনটি অশূন্য নামহীন দলে ভাগের উপায় S(5, 3) = 150/6 = 25.
ফলাফল ৩.২ (দ্বিতীয় ধরনের Stirling সংখ্যা)

S(m, n) = m-টি আলাদা বস্তুকে n-টি অশূন্য, নামহীন দলে ভাগ করার উপায়; এমন প্রতিটি ভাগ একটি set partition. তাহলে onto(m, n) = n! · S(m, n), অর্থাৎ

S(m, n) = (1/n!) ∑k=0n (−1)k C(n, k)(n − k)m

প্রমাণ। প্রতিটি onto ফাংশন f একটি partition দেয়: একই রাইডারের অর্ডারগুলো এক দল, অর্থাৎ দলগুলো f−1(y1), …, f−1(yn), সবগুলো অশূন্য কারণ f onto. উল্টো দিকে একটি partition আর তার n-টি দলের সঙ্গে n রাইডারের একটি one-to-one মিল (n!টি উপায়) মিলে ঠিক একটি onto ফাংশন দেয়। তাই onto ফাংশনগুলো (partition, মিল) জোড়ার সঙ্গে bijection-এ, আর গুণের নিয়মে onto(m, n) = S(m, n) · n!. ∎

এই Stirling সংখ্যা পর্ব ৩৫ “পুনরাবৃত্তিসহ বাছাই — stars and bars আর multinomial”-এর twelvefold way সারণির “আলাদা বল, একই রকম বাক্স, প্রতিটিতে অন্তত একটি” ঘর। তার recurrence S(m, n) = nS(m − 1, n) + S(m − 1, n − 1), সারণি আর Bell সংখ্যা পর্ব ৫০ “বিশেষ সংখ্যা — Catalan, Stirling আর partition”-এর বিষয়। নিচের ব্লক সূত্রটি সব ফাংশন একটি একটি করে গুনে মেলায়। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।

from itertools import product
from math import comb, factorial

def onto(m, n):                      # inclusion-exclusion formula
    return sum((-1) ** k * comb(n, k) * (n - k) ** m for k in range(n + 1))

def onto_brute(m, n):                # try every function {1..m} -> {1..n}
    return sum(1 for f in product(range(n), repeat=m) if len(set(f)) == n)

terms = [(-1) ** k * comb(3, k) * (3 - k) ** 5 for k in range(4)]
print("m=5, n=3 terms:", terms, "sum =", sum(terms))

print(" m n   onto  brute  S(m,n)")
for m, n in [(3, 2), (4, 2), (4, 3), (5, 3), (6, 3), (7, 4), (8, 5)]:
    a, b = onto(m, n), onto_brute(m, n)
    assert a == b and a % factorial(n) == 0
    print(f"{m:2}{n:2} {a:6} {b:6} {a // factorial(n):6}")

print("m < n gives 0:", [onto(m, 5) for m in range(5)])
print("onto(n, n) = n!:", all(onto(n, n) == factorial(n) for n in range(10)))
print("onto(20, 6) =", onto(20, 6), "S(20,6) =", onto(20, 6) // 720)

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

m=5, n=3 terms: [243, -96, 3, 0] sum = 150
 m n   onto  brute  S(m,n)
 3 2      6      6      3
 4 2     14     14      7
 4 3     36     36      6
 5 3    150    150     25
 6 3    540    540     90
 7 4   8400   8400    350
 8 5 126000 126000   1050
m < n gives 0: [0, 0, 0, 0, 0]
onto(n, n) = n!: True
onto(20, 6) = 3100376804676480 S(20,6) = 4306078895384

প্রথম লাইন stepper-এর চারটি পদ হুবহু দেয়। টেবিলে সূত্র আর brute force প্রতিটি সারিতে মেলে, আর প্রতিটি onto সংখ্যা n! দিয়ে নিঃশেষে বিভাজ্য (assert ব্যর্থ হয়নি), যা ফলাফল ৩.২-এর একটি পরোক্ষ যাচাই। দুটি সীমার ক্ষেত্রও মেলে: m < n হলে কোনো onto ফাংশন নেই (pigeonhole-এর উল্টো দিক), আর m = n হলে onto মানে bijection, সংখ্যা n!. শেষ লাইনে brute force-এর পক্ষে 620 ≈ 3.66 × 1015টি ফাংশন দেখা অসম্ভব, অথচ সূত্রে সাতটি পদ যোগ করলেই হয়; Python-এর int নির্ভুল থাকে।

৪ · Derangement — কেউ নিজের উপহার ফেরত পান না

বাজারঘরের অফিসে বছর শেষে একটি গোপন উপহার বিনিময় হয়: n জন কর্মী নিজের নাম লেখা চিরকুট একটি বাক্সে ফেলেন, তারপর প্রত্যেকে এলোমেলোভাবে একটি চিরকুট তোলেন আর সেই মানুষের জন্য উপহার কেনেন। মুশকিল হয় যদি কেউ নিজের নামই তোলেন। কতগুলো বিন্যাসে কেউই নিজের নাম পান না? পুরোনো সংস্করণে গল্পটি ছিল রেস্তোরাঁর টুপি-ঘরের: কর্মচারী টুপিগুলো এলোমেলো ফেরত দিলে কেউ নিজের টুপি পান না, তার সম্ভাবনা কত? এজন্য একে hat-check সমস্যাও বলে।

সংজ্ঞা ৪.১ (Derangement)

{1, …, n}-এর একটি permutation σ-এর i একটি fixed point যদি σ(i) = i. কোনো fixed point নেই এমন permutation হলো একটি derangement; তাদের সংখ্যা Dn. প্রথা অনুযায়ী D0 = 1 (খালি permutation-এ কোনো fixed point নেই)।

পর্ব ৪০ “Random variable আর প্রত্যাশা — linearity-র জাদু”-এ আপনি দেখেছেন, এলোমেলো permutation-এ fixed point-এর গড় সংখ্যা যেকোনো n-এ ঠিক 1, indicator আর linearity দিয়ে। কিন্তু “একটিও নেই”-এর সম্ভাবনা গড় দিয়ে বের হয় না; সেখানে প্রমাণ এই পর্বে রাখা ছিল।

উপপাদ্য ৪.২ (Derangement-এর সূত্র)

প্রতিটি n ≥ 0-এ

Dn = ∑k=0n (−1)k C(n, k)(n − k)! = n! ∑k=0n (−1)k/k! = n!(1 − 1/1! + 1/2! − … + (−1)n/n!)

  1. সার্বিক সেট: U = {1, …, n}-এর সব permutation, N = n!. — পর্ব ৩৩
  2. খারাপ ধর্ম: Ai = যেসব permutation-এ σ(i) = i. Derangement মানে কোনো Ai-তে না থাকা। — সংজ্ঞা ৪.১
  3. k-টির ছেদ: নির্দিষ্ট k-টি i নিজের জায়গায় স্থির হলে বাকি n − k-টি উপাদান বাকি n − k-টি জায়গায় যেকোনোভাবে বসতে পারে: (n − k)!টি, কোন k-টি তার ওপর নির্ভর করে না। — গুণের নিয়ম
  4. প্রতিসম রূপ: Dn = ∑ (−1)k C(n, k)(n − k)!. — উপপাদ্য ২.২
  5. সরল করা: C(n, k)(n − k)! = n!/(k!(n − k)!) · (n − k)! = n!/k!. ∎ — বীজগণিত
1N = 4! = 242k = 1: একজন নিজেরটা3k = 2: দুজন নিজেরটা4k = 3: তিনজন5k = 4: সবাই6D₄ = 9, তালিকা
n = 4; পদ = (−1)ᵏ · C(4, k) · (4 − k)!
পদ
মান
চলতি যোগফল
  1. সব বিন্যাস। চারজন কর্মী 1, 2, 3, 4; চিরকুট তোলার মোট বিন্যাস 4! = 24.
  2. একজন নিজের নাম। নির্দিষ্ট একজন নিজের নাম তুললে বাকি তিনজন 3! = 6 উপায়ে; কে, তা C(4, 1) = 4 উপায়ে। বিয়োগ 24, চলতি মান 0. এটি ভুল উত্তর নয়, মাঝপথের মান: যেখানে দুজন নিজেরটা তোলেন, সেই বিন্যাস দুবার বাদ গেছে।
  3. দুজন নিজের নাম। নির্দিষ্ট দুজন স্থির, বাকি দুজন 2! = 2 উপায়ে; জোড়া C(4, 2) = 6টি। যোগ 12, চলতি মান 12.
  4. তিনজন। তিনজন স্থির হলে চতুর্থ জনের জন্য 1! = 1টি উপায় (আসলে তিনি নিজেরটাই পান); C(4, 3) = 4. বিয়োগ 4, চলতি মান 8.
  5. চারজনই। সবাই নিজের নাম: শুধু 1234 বিন্যাস, 0! = 1. যোগ 1, চলতি মান 9.
  6. ফল। D4 = 24 − 24 + 12 − 4 + 1 = 9. তালিকা (i-তম অঙ্ক = i নম্বর কর্মী কার নাম তুললেন) আউটপুটের ঘরে, ঠিক নয়টি; scratch-এ itertools দিয়ে গুনে মেলানো।

1/e কোথা থেকে আসে

উপপাদ্য ৪.২-কে n! দিয়ে ভাগ করলে এলোমেলো চিরকুট তোলায় কেউ নিজের নাম না পাওয়ার সম্ভাবনা পাওয়া যায় (পর্ব ৩৮-এর Laplace-এর সংজ্ঞা, সব n! বিন্যাস সমান সম্ভাব্য ধরে):

pn = Dn/n! = 1 − 1/1! + 1/2! − 1/3! + … + (−1)n/n!

Calculus থেকে জানা আছে (এখানে প্রমাণ ছাড়া ব্যবহার করছি) ex = ∑k≥0 xk/k!, তাই x = −1-এ e−1 = ∑k≥0 (−1)k/k!. pn এই অসীম ধারার প্রথম n + 1টি পদ। তাই n → ∞-এ pn → 1/e ≈ 0.367879. বিস্ময়কর অংশটি গতি: n = 5-এ 11/30 ≈ 0.3667, n = 7-এ 0.367857, আর তারপর পরিবর্তন চার দশমিক ঘরেও চোখে পড়ে না। অফিসে ৬ জন হোক বা ৬০০ জন, কারও নিজের নাম না ওঠার সম্ভাবনা প্রায় ৩৭%; অর্থাৎ প্রায় ৬৩% ক্ষেত্রে অন্তত একজন নিজের নাম তুলবেন, তখন আবার তোলা লাগবে।

উপপাদ্য ৪.৩ (Dn হলো n!/e-এর নিকটতম পূর্ণসংখ্যা)

প্রতিটি n ≥ 1-এ |Dn − n!/e| < 1/2, তাই Dn = round(n!/e).

  1. n!/e − Dn = n! ∑k>n (−1)k/k!. — ধারার বাকি অংশ
  2. এই বাকি অংশটি একটি একান্তর ধারা, যার পদের মান ক্রমশ কমে আর শূন্যে যায়; এমন ধারার যোগফলের মান তার প্রথম পদের মানের চেয়ে কম (একান্তর ধারার পরিচিত সীমা, প্রমাণ ছাড়া)। প্রথম পদ (−1)n+1/(n + 1)!. — calculus
  3. তাই |n!/e − Dn| < n!/(n + 1)! = 1/(n + 1) ≤ 1/2, কারণ n ≥ 1. ∎ — বীজগণিত

যেমন 4!/e ≈ 8.829, যার নিকটতম পূর্ণসংখ্যা 9 = D4. কিন্তু সাবধান: উপপাদ্যটি সত্যিকারের বাস্তব সংখ্যার জন্য; কম্পিউটারের float-এ n!/e হিসাব করলে বড় n-এ এটি ভেঙে পড়ে, নিচের ব্লক তা দেখাবে।

৫ · Derangement-এর recurrence আর simulation

সূত্রের পাশাপাশি Dn-এর একটি সুন্দর recurrence আছে, যার প্রমাণ গণনা দিয়ে, বীজগণিত দিয়ে নয়। এ ধরনের প্রমাণকে combinatorial proof বলে।

উপপাদ্য ৫.১ (Euler-এর recurrence)

D0 = 1, D1 = 0, আর প্রতিটি n ≥ 2-এ Dn = (n − 1)(Dn−1 + Dn−2).

  1. σ(j) মানে কর্মী j যার নাম তুলেছেন। একটি derangement-এ কর্মী n যার নাম তুলেছেন, ধরুন i = σ(n); i ≠ n, তাই i-এর n − 1টি সম্ভাব্য মান। নিচে দেখাব, প্রতিটি i-এর জন্য σ(n) = i এমন derangement ঠিক Dn−1 + Dn−2টি। — ক্ষেত্রভাগ
  2. ক্ষেত্র ক, অদলবদল: σ(i) = n, অর্থাৎ i আর n পরস্পরের নাম তুলেছেন। এই দুজনকে সরিয়ে দিলে বাকি n − 2 জন নিজেদের নামগুলোই নিজেদের মধ্যে তুলেছেন, কেউ নিজেরটা নয়: ঠিক Dn−2টি। — বাকি অংশ স্বাধীন
  3. ক্ষেত্র খ: σ(i) ≠ n. তাহলে n-এর নাম তুলেছেন i ছাড়া অন্য কেউ, ধরুন j. কর্মী n-কে বাদ দিয়ে j-এর হাতে n-এর চিরকুটের বদলে i-এর চিরকুটটি দিন (যেটি এতক্ষণ n-এর হাতে ছিল)। এতে 1, …, n − 1-এর একটি permutation τ পাওয়া যায়, আর j ≠ i বলে τ(j) = i ≠ j; অন্য সবার চিরকুট বদলায়নি। তাই τ একটি derangement. — চিরকুট বদল
  4. উল্টো দিক: n − 1 জনের যেকোনো derangement τ নিন; i-এর চিরকুট যিনি তুলেছেন, তাকে j বলুন। j-কে n-এর চিরকুট দিন আর n-কে i-এর; এতে σ(n) = i আর σ(i) = τ(i) ≠ n, অর্থাৎ ক্ষেত্র খ-এর একটি σ. দুই কাজ পরস্পরের উল্টো, তাই ক্ষেত্র খ-তে ঠিক Dn−1টি বিন্যাস। — bijection
  5. দুই ক্ষেত্র পরস্পর বিচ্ছিন্ন আর মিলে সব ঢাকে, তাই প্রতিটি i-এ Dn−1 + Dn−2, আর n − 1টি i মিলে Dn = (n − 1)(Dn−1 + Dn−2). ∎ — যোগ আর গুণের নিয়ম

যাচাই: D2 = 1 · (0 + 1) = 1 (শুধু অদলবদল 21), D3 = 2 · (1 + 0) = 2 (231 আর 312), D4 = 3 · (2 + 1) = 9, stepper-এর সঙ্গে মেলে। Cycle-এর ভাষায় ক্ষেত্র ক মানে n একটি দৈর্ঘ্য-২ cycle-এ আছে, আর ক্ষেত্র খ মানে দৈর্ঘ্য ৩ বা বেশির cycle-এ; ধাপ ৩-এর কাজটি আসলে সেই cycle থেকে n-কে তুলে নেওয়া।

উপপাদ্য ৪.২-এর সূত্র থেকে আরেকটি সহজ recurrence সরাসরি আসে: Dn = nDn−1 + (−1)n (অনুশীলন ১)। এগুলো exponential generating function দিয়েও পাওয়া যায়, যেখানে derangement-এর EGF e−x/(1 − x); সেই পথ পর্ব ৪৮ “Generating function — গণনাকে বীজগণিতে রূপান্তর”-এ। নিচের ব্লক চারটি পথ মেলায়: brute force, সূত্র, recurrence আর round(n!/e), তারপর একটি seeded simulation.

from fractions import Fraction
from itertools import permutations
from math import factorial, comb, e
import random

def D_formula(n):                    # n! * sum (-1)^k / k!, exact
    return sum((-1) ** k * comb(n, k) * factorial(n - k) for k in range(n + 1))

D = [1, 0]                           # D(0) = 1, D(1) = 0
for n in range(2, 21):
    D.append((n - 1) * (D[n - 1] + D[n - 2]))

print(" n  brute formula round(n!/e)   D(n)/n!")
for n in range(1, 9):
    brute = sum(1 for p in permutations(range(n))
                if all(p[i] != i for i in range(n)))
    r = round(factorial(n) / e)
    assert brute == D_formula(n) == D[n] == r
    print(f"{n:2} {brute:6} {D[n]:7} {r:8}   {float(Fraction(D[n], factorial(n))):.6f}")

print("D(20) =", D[20], "| float round(20!/e) =", round(factorial(20) / e))
print("1/e   =", f"{1 / e:.6f}")

random.seed(49)                      # secret gift draw, 10 people
trials, hits = 20000, 0
for _ in range(trials):
    names = list(range(10))
    random.shuffle(names)
    hits += all(names[i] != i for i in range(10))
print("simulated P(no one draws own name), n=10:", hits / trials)
print("exact:", Fraction(D[10], factorial(10)), "=", f"{D[10] / factorial(10):.6f}")

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

 n  brute formula round(n!/e)   D(n)/n!
 1      0       0        0   0.000000
 2      1       1        1   0.500000
 3      2       2        2   0.333333
 4      9       9        9   0.375000
 5     44      44       44   0.366667
 6    265     265      265   0.368056
 7   1854    1854     1854   0.367857
 8  14833   14833    14833   0.367882
D(20) = 895014631192902121 | float round(20!/e) = 895014631192902144
1/e   = 0.367879
simulated P(no one draws own name), n=10: 0.37015
exact: 16481/44800 = 0.367879

n ≤ 8-এ চারটি পথ, সব permutation গোনা, উপপাদ্য ৪.২-এর সূত্র, Euler-এর recurrence আর round(n!/e), প্রতিটি সারিতে এক (assert একবারও ব্যর্থ হয়নি)। শেষ কলামে Dn/n! একবার ওপরে, একবার নিচে দুলে 1/e ≈ 0.367879-এর দিকে যায়, ঠিক একান্তর ধারার মতো। পরের লাইনটি সতর্কবার্তা: exact recurrence-এ D20 = 895014631192902121, কিন্তু float-এ round(20!/e) দেয় …144. উপপাদ্য ৪.৩ ভুল নয়; float-এ মাত্র প্রায় ১৬টি গুরুত্বপূর্ণ অঙ্ক থাকে, আর এই সংখ্যাটির ১৮টি অঙ্ক। তাই বড় n-এ exact integer recurrence-ই নির্ভরযোগ্য। শেষে ২০,০০০ বার seeded এলোমেলো চিরকুট তোলায় কেউ নিজের নাম না পাওয়ার অনুপাত 0.37015, আর নির্ভুল মান 16481/44800 ≈ 0.367879; পার্থক্য simulation-এর স্বাভাবিক দোলার মধ্যে (এই আকারে মোটামুটি ±0.007, পর্ব ৪১-এর মাপে)। Simulation সূত্রকে সমর্থন করে, প্রমাণ করে না।

৬ · সংখ্যাতত্ত্বে চালনি — Euler-এর φ আর Legendre-এর সূত্র

সেকশন ১-এর complement প্রশ্নটি, “1 থেকে x-এর মধ্যে কয়টি সংখ্যা কয়েকটি মৌলিক সংখ্যার কোনোটি দিয়েই বিভাজ্য নয়”, সংখ্যাতত্ত্বের একটি মৌলিক হাতিয়ার। এর নামই চালনি (sieve): খারাপ সংখ্যাগুলো ছেঁকে ফেলে বাকিগুলো গোনা।

লেমা ৬.১ (চালনির গণনা)

p1, …, pr আলাদা মৌলিক সংখ্যা আর x ধনাত্মক পূর্ণসংখ্যা হলে 1, …, x-এর মধ্যে কোনো pi দিয়ে বিভাজ্য নয় এমন সংখ্যা

∑T ⊆ {1, …, r} (−1)|T| ⌊x / ∏i∈T pi⌋

(T = ∅-এ গুণফল 1, পদটি x.)

প্রমাণ। Ai = pi-এর গুণিতক। আলাদা মৌলিক সংখ্যার একটি দল দিয়ে একসঙ্গে বিভাজ্য হওয়া মানে তাদের গুণফল দিয়ে বিভাজ্য হওয়া (unique factorization, পর্ব ২০), তাই T-তে থাকা সেটগুলোর ছেদের আকার ⌊x/∏pi⌋. উপপাদ্য ২.২ বসালেই হয়। ∎

Euler-এর φ, দ্বিতীয় প্রমাণ

পর্ব ২৪ “Fermat-এর ছোট উপপাদ্য আর Euler-এর totient”-এ φ(n) = n ∏(1 − 1/p) প্রমাণ হয়েছে multiplicative ধর্ম আর CRT দিয়ে। Inclusion–exclusion একটি সরাসরি দ্বিতীয় প্রমাণ দেয়।

উপপাদ্য ৬.২

n ≥ 2-এর আলাদা মৌলিক উৎপাদক p1, …, pr হলে φ(n) = n(1 − 1/p1)(1 − 1/p2) ⋯ (1 − 1/pr).

  1. k ∈ {1, …, n} n-এর সঙ্গে সহমৌলিক ঠিক তখন, যখন কোনো pi k-কে ভাগ করে না। — gcd আর মৌলিক উৎপাদক
  2. প্রতিটি pi n-কে ভাগ করে, তাই প্রতিটি গুণফল d = ∏i∈T pi-ও n-কে ভাগ করে, আর ⌊n/d⌋ = n/d নির্ভুলভাবে, কোনো floor-এর ক্ষতি নেই। — বিভাজ্যতা
  3. লেমা ৬.১-এ φ(n) = ∑T (−1)|T| n/∏i∈T pi. — লেমা ৬.১
  4. গুণফল (1 − 1/p1) ⋯ (1 − 1/pr) খুললে প্রতিটি T ⊆ {1, …, r}-এর জন্য ঠিক একটি পদ (−1)|T|/∏i∈T pi আসে; n দিয়ে গুণ করলে ধাপ ৩-এর যোগফল। ∎ — distributive নিয়ম

যেমন 60 = 22 · 3 · 5: φ(60) = 60 − (30 + 20 + 12) + (10 + 6 + 4) − 2 = 16, আর 60 · (1/2)(2/3)(4/5) = 16. ধাপ ২-টি গুরুত্বপূর্ণ: x যখন গুণফলগুলোর গুণিতক নয় (যেমন সেকশন ১-এ x = 100, d = 3), তখন floor থেকে যায়, আর গুণফলের সুন্দর রূপ আর মেলে না; 100 · (1/2)(2/3)(4/5) = 26.67, অথচ আসল উত্তর 26.

Legendre-এর সূত্র — মৌলিক সংখ্যা গোনা

পর্ব ২০-এর Eratosthenes-এর চালনি-র মূল তথ্য: x-এর সমান বা ছোট একটি যৌগিক সংখ্যার অন্তত একটি মৌলিক উৎপাদক √x-এর সমান বা ছোট। তাই √x পর্যন্ত মৌলিক সংখ্যাগুলোর গুণিতক ছেঁকে ফেললে 1 থেকে x-এ বাকি থাকে শুধু 1 আর √x-এর চেয়ে বড় মৌলিক সংখ্যাগুলো। π(x) = x পর্যন্ত মৌলিক সংখ্যার সংখ্যা ধরলে লেমা ৬.১ থেকে আসে Legendre-এর সূত্র:

π(x) − π(√x) + 1 = ∑T ⊆ {p ≤ √x} (−1)|T| ⌊x / ∏p∈T p⌋

বাঁ পাশের +1 হলো সংখ্যা 1, যা কোনো মৌলিক দিয়ে বিভাজ্য নয় অথচ মৌলিকও নয়; আর −π(√x) কারণ ছোট মৌলিকগুলো নিজেরাই ছাঁকা পড়েছে। x = 100-এ √x = 10, মৌলিক 2, 3, 5, 7: ডান পাশ 100 − (50 + 33 + 20 + 14) + (16 + 10 + 7 + 6 + 4 + 2) − (3 + 2 + 1 + 0) + 0 = 22, তাই π(100) = 22 − 1 + 4 = 25, যা পর্ব ২০-এর সারণির সঙ্গে মেলে। নিচের ব্লক φ আর π(x) দুটিই যাচাই করে, আর দেখায় সূত্রটি কোথায় অকেজো হয়।

from itertools import combinations
from math import gcd, isqrt, prod

def primes_upto(x):
    return [p for p in range(2, x + 1) if all(p % q for q in range(2, isqrt(p) + 1))]

def avoid_count(x, ps):              # how many of 1..x are divisible by no p in ps
    total = 0
    for k in range(len(ps) + 1):
        for S in combinations(ps, k):
            total += (-1) ** k * (x // prod(S))
    return total

def phi_ie(n):
    ps = [p for p in primes_upto(n) if n % p == 0]
    return avoid_count(n, ps), ps

for n in (60, 360, 1001, 2026):
    v, ps = phi_ie(n)
    by_gcd = sum(1 for k in range(1, n + 1) if gcd(k, n) == 1)
    print(f"phi({n}) primes {ps}: by I-E {v}, by gcd {by_gcd}")

for x in (100, 1000, 10000):         # Legendre: count survivors of the sieve
    small = primes_upto(isqrt(x))
    print(f"x={x}: {len(small)} small primes, {2 ** len(small)} terms", end="")
    if len(small) > 12:
        print(" -> too many terms, stop")
        continue
    left = avoid_count(x, small)     # 1 and the primes in (sqrt x, x]
    pi_x = left - 1 + len(small)
    print(f", survivors {left}, pi(x) = {pi_x} (direct {len(primes_upto(x))})")

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

phi(60) primes [2, 3, 5]: by I-E 16, by gcd 16
phi(360) primes [2, 3, 5]: by I-E 96, by gcd 96
phi(1001) primes [7, 11, 13]: by I-E 720, by gcd 720
phi(2026) primes [2, 1013]: by I-E 1012, by gcd 1012
x=100: 4 small primes, 16 terms, survivors 22, pi(x) = 25 (direct 25)
x=1000: 11 small primes, 2048 terms, survivors 158, pi(x) = 168 (direct 168)
x=10000: 25 small primes, 33554432 terms -> too many terms, stop

প্রথম চার লাইনে inclusion–exclusion আর সরাসরি gcd গোনা একই φ দেয়; φ(360) = 96 পর্ব ২৪-এর মানের সঙ্গে মেলে, আর 2026 = 2 · 1013-এ φ = 1 · 1012. পরের লাইনগুলোয় Legendre-এর সূত্র x = 100-এ ২২টি “বেঁচে যাওয়া” সংখ্যা দেয় (1 আর ১০-এর বড় ২১টি মৌলিক), তাই π(100) = 25; x = 1000-এ π = 168. কিন্তু পদের সংখ্যা 2r, যেখানে r = π(√x): x = 10000-এ ২৫টি ছোট মৌলিক, ৩ কোটির বেশি পদ, তাই ব্লক থেমে যায়। মজার ব্যাপার, এর প্রায় সব পদ শূন্য, কারণ গুণফল x ছাড়িয়ে যায়। এই অপচয় কমানোই পরের দুশো বছরের মৌলিক-গণনা পদ্ধতির গল্প (ভাবনার প্রশ্ন ৩)।

৭ · ঊর্ধ্বসীমাসহ সমাধান, Bonferroni অসমতা আর পরীক্ষার অঙ্ক

ঊর্ধ্বসীমাসহ পূর্ণসংখ্যার সমাধান। পর্ব ৩৫-এ stars and bars দিয়ে দেখেছেন, x1 + … + xn = r-এর অঋণাত্মক পূর্ণসংখ্যা সমাধান C(r + n − 1, n − 1)টি, আর ঊর্ধ্বসীমা থাকলে একটি যোগ-বিয়োগের সূত্র দেখেছেন, প্রমাণ ছাড়া। এখন প্রমাণটি সহজ।

উপপাদ্য ৭.১ (ঊর্ধ্বসীমাসহ সমাধান)

x1 + … + xn = r, 0 ≤ xi ≤ u-এর পূর্ণসংখ্যা সমাধানের সংখ্যা ∑j≥0 (−1)j C(n, j) C(r − j(u + 1) + n − 1, n − 1), যেখানে r − j(u + 1) < 0 হলে পদটি 0.

প্রমাণ। U = সীমা ছাড়া সব অঋণাত্মক সমাধান। খারাপ ধর্ম Ai: xi ≥ u + 1. নির্দিষ্ট j-টি চলকে আগেই u + 1 করে বসিয়ে দিলে (yi = xi − (u + 1)) বাকি যোগফল r − j(u + 1), যার সমাধান stars and bars-এ C(r − j(u + 1) + n − 1, n − 1), কোন j-টি তার ওপর নির্ভর না করে। প্রতিসম রূপ বসালেই হয়। ∎

উদাহরণ: বাজারঘর ১২টি একই রকম উপহার-বাক্স ৪টি জেলার গুদামে রাখবে, কোনো গুদামে ৫টির বেশি জায়গা নেই। উত্তর C(15, 3) − 4 · C(9, 3) + 6 · C(3, 3) = 455 − 336 + 6 = 125; j = 3-এ 12 − 18 < 0, পদ নেই।

Bonferroni অসমতা — মাঝপথে থামলে কী হয়

সেকশন ১-এ দেখেছেন, চলতি যোগফল 103, 71, 74: একবার বেশি, একবার কম। এটি সবসময় ঘটে।

উপপাদ্য ৭.২ (Bonferroni অসমতা)

প্রতিটি t-এর জন্য, যোগফলটি বিজোড় t-তে থামালে উত্তরের চেয়ে বড় বা সমান, জোড় t-তে থামালে ছোট বা সমান:

S1 − S2 ≤ |A1 ∪ … ∪ An| ≤ S1,   S1 − S2 + S3 − S4 ≤ |∪| ≤ S1 − S2 + S3, …

প্রমাণের রূপরেখা উপপাদ্য ২.১-এর মতোই: r-টি সেটে থাকা উপাদানের অবদান ∑k=1t (−1)k+1C(r, k), আর Pascal-এর নিয়ম দিয়ে t-এর ওপর induction-এ দেখানো যায় এটি 1 − (−1)tC(r − 1, t), তাই t বিজোড় হলে ≥ 1, জোড় হলে ≤ 1. প্রথম অসমতা |∪| ≤ S1-ই সম্ভাবনায় union bound, যা মডিউল ৭-এ বারবার কাজে লেগেছে। বড় সমস্যায় সব 2nটি পদ হিসাব করা অসম্ভব হলে প্রথম দুই-তিনটি পদ দিয়ে উত্তরকে দুই দিক থেকে আটকানো যায়। নিচের ব্লক উপহার-বাক্সের হিসাব আর তিনটি N-এ Bonferroni সীমা যাচাই করে।

from itertools import product
from math import comb

def bounded(r, n, u):                # x1+...+xn = r, 0 <= xi <= u
    total = 0
    for j in range(n + 1):
        rest = r - j * (u + 1)       # j boxes forced to hold u+1 or more
        if rest >= 0:
            total += (-1) ** j * comb(n, j) * comb(rest + n - 1, n - 1)
    return total

def brute(r, n, u):
    return sum(1 for t in product(range(u + 1), repeat=n) if sum(t) == r)

print("12 boxes, 4 depots, at most 5 each:")
for j in range(3):
    print(f"  j={j}: {(-1) ** j} * C(4,{j}) * C({12 - 6 * j + 3},3) ="
          f" {(-1) ** j * comb(4, j) * comb(12 - 6 * j + 3, 3)}")
print("  formula", bounded(12, 4, 5), "brute", brute(12, 4, 5))

print("Bonferroni, multiples of 2, 3, 5 up to N:")
for N in (30, 100, 1000):
    S1 = N // 2 + N // 3 + N // 5
    S2 = N // 6 + N // 10 + N // 15
    S3 = N // 30
    union = sum(1 for x in range(1, N + 1) if x % 2 == 0 or x % 3 == 0 or x % 5 == 0)
    print(f"  N={N}: S1={S1} >= {union} >= S1-S2={S1 - S2};"
          f" S1-S2+S3={S1 - S2 + S3}")

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

12 boxes, 4 depots, at most 5 each:
  j=0: 1 * C(4,0) * C(15,3) = 455
  j=1: -1 * C(4,1) * C(9,3) = -336
  j=2: 1 * C(4,2) * C(3,3) = 6
  formula 125 brute 125
Bonferroni, multiples of 2, 3, 5 up to N:
  N=30: S1=31 >= 22 >= S1-S2=21; S1-S2+S3=22
  N=100: S1=103 >= 74 >= S1-S2=71; S1-S2+S3=74
  N=1000: S1=1033 >= 734 >= S1-S2=701; S1-S2+S3=734

উপহার-বাক্সের তিনটি পদ হাতের হিসাবের সঙ্গে হুবহু মেলে, আর brute force 64 = 1296টি সম্ভাব্য বিন্যাস দেখে একই 125 পায়। Bonferroni অংশে প্রতিটি N-এ S1 ওপরের সীমা, S1 − S2 নিচের সীমা, আর তিন পদ মিলে নির্ভুল উত্তর। N = 30-এ নিচের সীমা মাত্র ১ কম, কারণ তিনটিরই ছেদে শুধু 30 নিজে। তিন সেটে নিচের সীমা থেকে আসল উত্তরের দূরত্ব ঠিক S3; বেশি সেটে এই দূরত্ব পরের সব পদের ওপর নির্ভর করে।

অঙ্ক ১: তিন শর্তের গণনা

১ থেকে ১০০০-এর মধ্যে কয়টি সংখ্যা 2, 3, 5 বা 7-এর কোনোটি দিয়েই বিভাজ্য নয়?

  1. S1 = 500 + 333 + 200 + 142 = 1175.
  2. S2 = ⌊1000/6⌋ + ⌊1000/10⌋ + ⌊1000/14⌋ + ⌊1000/15⌋ + ⌊1000/21⌋ + ⌊1000/35⌋ = 166 + 100 + 71 + 66 + 47 + 28 = 478.
  3. S3 = ⌊1000/30⌋ + ⌊1000/42⌋ + ⌊1000/70⌋ + ⌊1000/105⌋ = 33 + 23 + 14 + 9 = 79; S4 = ⌊1000/210⌋ = 4.
  4. উত্তর 1000 − 1175 + 478 − 79 + 4 = 228 (scratch-এ brute force-এ মেলানো)।

অঙ্ক ২: onto আর derangement

(ক) ৬টি আলাদা অর্ডার ৩ জন রাইডারে, প্রত্যেকে অন্তত একটি: কয় উপায়ে? (খ) ৬ জনের উপহার বিনিময়ে কারও নিজের নাম না ওঠার সম্ভাবনা?

  1. (ক) 36 − 3 · 26 + 3 · 16 − 0 = 729 − 192 + 3 = 540; S(6, 3) = 540/6 = 90.
  2. (খ) D6 = 6 · D5 + 1 = 6 · 44 + 1 = 265, তাই 265/720 = 53/144 ≈ 0.3681, 1/e-এর খুব কাছে।

যুক্তির ভুল ধরুন: “চিহ্নের গোলমাল”

একজন লিখলেন: “৫টি অর্ডার ৩ জন রাইডারে, সবাই অন্তত একটি। মোট 35 = 243. একজন বাদ পড়ার বণ্টন 3 · 25 = 96 বাদ দিই, দুজন বাদ পড়ার বণ্টন 3 · 15 = 3-ও বাদ দিই, কারণ সেগুলোও খারাপ। উত্তর 243 − 96 − 3 = 144.”

ভুল কোথায়: “দুজন বাদ” এমন বণ্টন, যেমন সব অর্ডার রাইডার ১-এর কাছে, “২ বাদ” আর “৩ বাদ” দুই সেটেই আছে, তাই 96-এর ভেতরে সেটি ইতিমধ্যে দুবার বাদ গেছে। আবার বাদ দিলে তিনবার বাদ পড়ে। সঠিক কাজ হলো ফেরত যোগ করা: 243 − 96 + 3 = 150. প্রতিকার: চিহ্ন মুখস্থ না করে একটি উপাদান বেছে দেখুন সে মোট কতবার গোনা হলো; শেষ ফল 1 (ভালো হলে 0) না হলে সূত্রে ভুল আছে। ছোট ক্ষেত্রে brute force-এ মিলিয়ে নিলেও ভুলটি সঙ্গে সঙ্গে ধরা পড়ে।

আরও গভীরে: Inclusion–exclusion একটি বড় কাঠামোর বিশেষ রূপ: Gian-Carlo Rota-র ১৯৬৪ সালের প্রবন্ধে partially ordered set-এর ওপর Möbius function আর Möbius inversion-এর সাধারণ তত্ত্ব আসে বলে জানা যায়, যেখানে সেটের subset-এর ক্রমে এটিই inclusion–exclusion, আর ভাজকের ক্রমে সংখ্যাতত্ত্বের Möbius inversion. সংখ্যাতত্ত্বে Viggo Brun বিশ শতকের শুরুতে চালনির একটি ছাঁটা রূপ (Bonferroni-ধাঁচের সীমা) দিয়ে দেখান যে twin prime-দের বিপরীত সংখ্যার যোগফল সসীম; twin prime অসীম কি না, প্রশ্নটি আজও খোলা। আর permutation-এ নিষিদ্ধ অবস্থান (যেমন দাবার বোর্ডে নৌকা বসানো) গোনার rook polynomial-ও একই নীতির প্রয়োগ।

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

  • ১ থেকে ১০০-এ 2, 3 বা 5 দিয়ে বিভাজ্য কয়টি? 103 − 32 + 3 = 74.
  • D5 কত? 120 − 120 + 60 − 20 + 5 − 1 = 44.
  • ৪ উপাদান থেকে ৩ উপাদানে onto ফাংশন? 81 − 48 + 3 = 36.
  • φ(1001)? 1001 = 7 · 11 · 13, তাই 1001 · (6/7)(10/11)(12/13) = 720.
  • অনেক মানুষের টুপি এলোমেলো ফেরত দিলে কেউ নিজেরটা না পাওয়ার সম্ভাবনা? প্রায় 1/e ≈ 0.368, মানুষের সংখ্যা যা-ই হোক।

৮ · AI-এর যুগে — inclusion–exclusion-এর হিসাব যাচাই

Inclusion–exclusion-এর প্রশ্নে AI সহকারী সাধারণত ঠিক সূত্রটির নাম বলে, কিন্তু চিহ্ন, শেষ পদ বা ছেদের আকারে ভুল করে। ভুল চিহ্নে উত্তর প্রায়ই “বিশ্বাসযোগ্য” আকারের থাকে, তাই চোখে পড়ে না। যে ভুলগুলো নিয়মিত দেখা যায়:

AI-এর ভুলকীভাবে ধরবেন
চিহ্ন উল্টো বা সব জোড়া-ছেদ বিয়োগের পরে তিনটির ছেদ ভুলে যাওয়াএকটি উপাদান বেছে তার মোট গণনা 1 কি না দেখুন; ছোট ক্ষেত্রে brute force
ছেদের আকার সমান নয় অথচ প্রতিসম রূপ C(n, k)Nk লাগানো“যেকোনো k-টির ছেদ সমান কেন?” প্রশ্নটি করুন; একটি করে ছেদ গুনুন
Onto আর Stirling গুলিয়ে ফেলা (n! দিয়ে ভাগ ভুলে যাওয়া বা বাড়তি ভাগ)রাইডার বা বাক্সের নাম আছে কি না দেখুন; m = n-এ উত্তর n! আর 1 কি না মেলান
Dn = n!/e বলা, গোলাকরণ ছাড়া, বা বড় n-এ float দিয়ে হিসাবExact integer recurrence দিয়ে আবার হিসাব করুন
Legendre-এর সূত্রকে সরাসরি π(x) বলা (−π(√x) + 1 সংশোধন বাদ)x = 100-এ π(100) = 25-এর সঙ্গে মেলান
x গুণফলের গুণিতক না হলেও φ-এর গুণফল-সূত্র বসানোfloor-যুক্ত যোগফল আর গুণফল দুটো হিসাব করে তুলনা করুন
ইতিহাস বানানো: ভুল সাল বা নাম (Montmort, de Moivre, Legendre)বিশ্বস্ত পাঠ্যবই বা গণিত-ইতিহাসের উৎসে মেলান

AI-কে inclusion–exclusion-এর অঙ্ক করতে বললে এমন কাঠামো দিন, যাতে প্রতিটি অংশ আলাদা করে যাচাই করা যায়:

নিচের গণনার প্রশ্নটি inclusion–exclusion দিয়ে সমাধান করো: প্রশ্ন: [যেমন ৭টি আলাদা অর্ডার ৪ জন রাইডারে, প্রত্যেকে অন্তত একটি] ১. সার্বিক সেট U আর তার আকার N স্পষ্ট লেখো। ২. "খারাপ" ধর্ম A_1, ..., A_n কী, এক বাক্যে প্রতিটি লেখো। ৩. যেকোনো k-টি ধর্মের ছেদের আকার কত, আর তা কেন শুধু k-এর ওপর নির্ভর করে (বা করে না), ব্যাখ্যা করো। ৪. চিহ্নসহ পুরো যোগফল লেখো, প্রতিটি পদের মান আলাদা করে দেখাও। ৫. একটি উপাদান যদি ঠিক r-টি ধর্মে থাকে, সে মোট কতবার গোনা হয়, দেখাও। ৬. itertools দিয়ে brute force আর সূত্র মেলানোর Python কোড দাও, ছোট মানে। ৭. কোনো ইতিহাস বা সাল নিয়ে নিশ্চিত না হলে তা স্পষ্ট বলো।

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

এই বিষয়ে যাচাই সস্তা: কয়েক লাইনের itertools ছোট ক্ষেত্রে সব বস্তু গুনে ফেলে। কিন্তু মনে রাখুন, ছোট ক্ষেত্রে মিল একটি জাল, প্রমাণ নয়; প্রমাণ আসে “প্রতিটি উপাদান ঠিক একবার” যুক্তি থেকে।

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

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

প্র ০১Derangement সমস্যা কোথা থেকে এল, আর মানুষের সংখ্যা যত বাড়ুক, কেউ নিজের জিনিস না পাওয়ার সম্ভাবনা প্রায় একই (1/e) থাকে কেন?

সমস্যাটির পরিচিত শুরু ফরাসি গণিতবিদ Pierre Rémond de Montmort-এর ১৭০৮ সালের জুয়ার গণিতের বইয়ে, যেখানে “Treize” নামের একটি তাসের খেলা বিশ্লেষণ করা হয়: তেরোটি তাস একে একে খোলা হয় আর খেলোয়াড় একই সঙ্গে 1, 2, …, 13 গোনেন; গোনা সংখ্যা আর তাসের মান কখনো মিলে গেলে একপক্ষ জেতে। ফরাসিতে এর নাম হয় problème des rencontres, “মিলনের সমস্যা”। Montmort আর Nicolaus Bernoulli-র চিঠিপত্রে সমাধানটি আসে, আর ১৭১৩ সালের দ্বিতীয় সংস্করণে তা ছাপা হয় বলে জানা যায়; পরে Euler-ও এ নিয়ে লেখেন। সঠিক কে কোন অংশ আগে পেয়েছিলেন, তা নিয়ে ইতিহাসের সূত্রে কিছু ভিন্নতা আছে।

n বাড়লেও সম্ভাবনা প্রায় স্থির থাকার কারণ দুটি বিপরীত প্রভাবের ভারসাম্য। n বাড়লে কারও নিজের জিনিস পাওয়ার “সুযোগ” বাড়ে, কারণ মানুষ বেশি; কিন্তু প্রত্যেকের নিজেরটা পাওয়ার সম্ভাবনা 1/n কমে। পর্ব ৪০-এ আপনি দেখেছেন, fixed point-এর গড় সংখ্যা ঠিক 1, n যা-ই হোক। আরও সূক্ষ্মভাবে, ঠিক k-টি fixed point থাকার বিন্যাস C(n, k)Dn−kটি, আর এর সম্ভাবনা n বড় হলে e−1/k!-এর দিকে যায়: n = 10-এ k = 0, 1, 2, 3-এর জন্য প্রায় 0.3679, 0.3679, 0.1839, 0.0613 (scratch-এ হিসাব করা)। এটি গড় 1-এর Poisson বণ্টন। অর্থাৎ বড় n-এ fixed point-গুলো প্রায় “দুর্বলভাবে নির্ভরশীল বিরল ঘটনা”, আর বিরল ঘটনার সংখ্যা প্রায়ই Poisson বণ্টন মানে।

উপপাদ্য ৪.৩-এর দ্রুত অভিসরণও এখানে গুরুত্বপূর্ণ: ভুলের মাপ 1/(n + 1)!-এর কাছাকাছি, তাই ১০ জনের অফিসেই উত্তর সাত দশমিক ঘর পর্যন্ত 1/e. বাস্তব প্রয়োগে এর মানে: গোপন উপহার বিনিময়ে প্রায় ৬৩% বার অন্তত একজন নিজের নাম তুলবেন, তাই আয়োজকেরা প্রায়ই আবার তোলেন বা নিয়ম বদলান। আবার তোলা সমস্যাটি নতুন একটি প্রশ্ন তোলে: “আবার তোলা” করে করে যে বিন্যাস পাওয়া যায়, তা কি সব derangement-এর মধ্যে সমান সম্ভাব্য? প্রতিবার পুরো বাক্স নতুন করে ঝাঁকালে হ্যাঁ, এটি rejection sampling-এর সাধারণ যুক্তি।

মূল উপলব্ধি: Inclusion–exclusion-এর একান্তর যোগফল এখানে e−1-এর ধারার প্রথম অংশ, তাই উত্তর n-এর ওপর প্রায় নির্ভর করে না; গড় 1 আর বিরল ঘটনার Poisson আচরণ একই ছবির দুই দিক।

প্র ০২Inclusion–exclusion-এর চিহ্ন পালাক্রমে বদলায় কেন? অন্য কোনো প্রমাণ আছে কি, আর algorithm-এ এর প্রয়োগ কোথায়?

উপপাদ্য ২.১-এর প্রমাণে চিহ্ন এসেছে (1 − 1)r = 0 থেকে। আরেকটি সুন্দর প্রমাণ indicator ফাংশন দিয়ে, যা চিহ্নের উৎস আরও স্পষ্ট করে। একটি উপাদান x-এর জন্য 1A(x) = 1 যদি x ∈ A, নইলে 0. x কোনো Ai-তে নেই ঠিক তখন, যখন প্রতিটি (1 − 1Ai(x)) = 1, তাই complement-এর indicator হলো গুণফল ∏(1 − 1Ai). গুণফলটি খুললে প্রতিটি সেট-বাছাই T-এর জন্য একটি পদ (−1)|T| ∏i∈T 1Ai, আর ∏i∈T 1Ai হলো ছেদের indicator. সব x-এর ওপর যোগ করলে উপপাদ্য ২.২. চিহ্ন আসে প্রতিটি “1 −” থেকে, যেমন (1 − a)(1 − b) = 1 − a − b + ab. সম্ভাবনায় একই যুক্তি প্রত্যাশা নিয়ে চলে, আর তখন সূত্রটি P(A1 ∪ … ∪ An)-এর জন্য খাটে, যা কখনো Poincaré-র নামে উল্লেখ করা হয়।

নীতিটির পূর্বসূরি হিসেবে সাধারণত Abraham de Moivre (আঠারো শতকের শুরু), Daniel da Silva (১৮৫৪) আর J. J. Sylvester (১৮৮৩)-এর নাম আসে; আধুনিক “Möbius inversion” রূপ Rota-র ১৯৬৪ সালের কাজে। ইতিহাসের সূত্রগুলোয় কৃতিত্বের ভাগ নিয়ে মতভেদ আছে।

Algorithm-এ এর একটি চমকপ্রদ প্রয়োগ আছে। একটি গ্রাফে Hamiltonian path আছে কি না, তা NP-complete সমস্যা (পর্ব ৬০ “Euler আর Hamilton path — Königsberg থেকে NP-কঠিনতা”-এ আসবে)। সরাসরি সব permutation দেখতে n!-এর মতো সময় লাগে। কিন্তু “সব শীর্ষ ছুঁয়ে যাওয়া n দৈর্ঘ্যের walk” গোনা যায় inclusion–exclusion-এ: প্রতিটি শীর্ষ-সেট বাদ দিয়ে walk গুনে চিহ্নসহ যোগ। Walk গোনা matrix গুণে সহজ, তাই মোট সময় মোটামুটি 2n গুণ একটি polynomial, আর memory খুব কম; ১৯৮২ সালের দিকে Karp-সহ কয়েকজনের কাজে এই কৌশল আসে বলে জানা যায়। পরে একই ধাঁচে graph coloring-এর মতো সমস্যাও প্রায় 2n সময়ে সমাধান হয়েছে। 2n বড়, কিন্তু n!-এর তুলনায় অনেক ছোট।

মূল উপলব্ধি: পালাক্রমের চিহ্ন হলো ∏(1 − 1Ai) খোলার স্বাভাবিক ফল; এই একই খোলা গণনা, সম্ভাবনা আর exponential algorithm, তিন জায়গায় কাজ করে।

প্র ০৩Legendre-এর সূত্রে π(x) গোনা বড় x-এ অকেজো কেন, আর গণিতবিদরা কীভাবে সেখান থেকে এগিয়েছেন?

Adrien-Marie Legendre তাঁর সংখ্যাতত্ত্বের বইয়ে (প্রথম সংস্করণ ১৭৯৮, পরে ১৮০৮-এর সংস্করণ বলে জানা যায়) চালনির এই inclusion–exclusion রূপ লেখেন। সূত্রটি নির্ভুল, কিন্তু পদের সংখ্যা 2π(√x), যা x বাড়লে বিস্ফোরিত হয়: x = 10000-এ ২৫টি ছোট মৌলিক, তিন কোটির বেশি পদ, ব্লকে দেখেছেন। অথচ এর প্রায় সব পদ শূন্য, কারণ অনেক মৌলিকের গুণফল দ্রুত x ছাড়িয়ে যায়। অর্থাৎ সমস্যা হিসাবের নয়, সাজানোর।

উনিশ শতকে জার্মান গণিতবিদ Ernst Meissel এই অপচয় কমানোর একটি চতুর পদ্ধতি বের করেন: শুধু ছোট মৌলিক দিয়ে আংশিক ছাঁকা, আর বাকিটা অন্য একটি গণনা দিয়ে সংশোধন। হাতে হিসাব করে তিনি ১০০ কোটি পর্যন্ত মৌলিকের সংখ্যা বের করেন বলে জানা যায় (পরে দেখা যায় উত্তরে সামান্য ভুল ছিল)। ১৯৫৯ সালে D. H. Lehmer পদ্ধতিটি কম্পিউটারে চালানোর উপযোগী করেন, আর ১৯৮৫ সালে Lagarias, Miller আর Odlyzko এটিকে আরও দ্রুত করেন; পরের উন্নতিগুলোয় π(x) এখন খুব বড় x-এর জন্য জানা, প্রতিটি মৌলিক একটি একটি করে না গুনেই। অন্য পথে Lagarias আর Odlyzko analytic পদ্ধতিও দেন।

অন্যদিকে Viggo Brun বিশ শতকের শুরুতে বুঝলেন, সব পদ না নিয়ে মাঝপথে থামলে Bonferroni অসমতা একটি নিশ্চিত সীমা দেয়, আর সেটি অনেক সময় যথেষ্ট। এই “Brun-এর চালনি” থেকে sieve theory নামে একটি পুরো শাখা গড়ে ওঠে, যা আজও twin prime বা Goldbach ধরনের প্রশ্নের প্রধান হাতিয়ারের একটি। পর্ব ২০-এর prime number theorem π(x) ~ x/ln x প্রথমে (১৮৯৬ সালে) সম্পূর্ণ ভিন্ন পথে, complex analysis দিয়ে প্রমাণ হয় (পরে ১৯৪৯ সালে Erdős আর Selberg একটি “elementary” প্রমাণও দেন), কারণ চালনির সীমা একা সেখানে পৌঁছাতে পারে না বলে জানা যায়।

মূল উপলব্ধি: নির্ভুল সূত্র মানেই কাজের algorithm নয়; inclusion–exclusion-এর 2nটি পদ থেকে শূন্য পদ বাদ দেওয়া বা মাঝপথে থেমে সীমা নেওয়াই সংখ্যাতত্ত্বে এর আসল শক্তি।

প্র ০৪Onto ফাংশনের সূত্র কম্পিউটার বিজ্ঞান আর সম্ভাবনায় কোথায় লাগে? একটি ছক্কা কতবার ছুড়লে ছয়টি মুখই দেখার সম্ভাবনা অর্ধেক ছাড়ায়?

m বার একটি ন্যায্য ছক্কা ছোড়া মানে {1, …, m} থেকে {1, …, 6}-এ একটি এলোমেলো ফাংশন, সব 6mটি সমান সম্ভাব্য। “ছয়টি মুখই এসেছে” মানে ফাংশনটি onto. তাই সম্ভাবনা onto(m, 6)/6m. m = 6-এ এটি 720/46656 ≈ 0.0154, অর্থাৎ ছয়বারে ছয়টি ভিন্ন মুখ খুব বিরল। m = 12-এ প্রায় 0.438, m = 13-এ প্রায় 0.514; তাই ১৩ বারেই প্রথম অর্ধেক ছাড়ায়। m = 20-এ প্রায় 0.848 (সব scratch-এ নির্ভুল ভগ্নাংশে হিসাব করা)। এটিই coupon collector সমস্যা: পর্ব ৪০-এ আপনি দেখেছেন সব ছয়টি পেতে গড়ে 6H6 = 14.7 বার লাগে; inclusion–exclusion পুরো বণ্টনটাই দেয়, শুধু গড় নয়।

কম্পিউটার বিজ্ঞানে একই প্রশ্ন hashing-এ আসে: m-টি key n-টি bucket-এ এলোমেলো ছড়ালে কোনো bucket খালি থাকবে না, তার সম্ভাবনা onto(m, n)/nm. পর্ব ৪২-এর balls-into-bins-এর ভাষায়, খালি bucket-এর সংখ্যার গড় n(1 − 1/n)m সহজে আসে linearity থেকে, কিন্তু “একটিও খালি নয়”-এর নির্ভুল উত্তর লাগে inclusion–exclusion. Load balancing, distributed system-এ প্রতিটি server-এ অন্তত একটি কাজ পৌঁছানো, বা পরীক্ষায় প্রতিটি test case অন্তত একবার চালানো, সবই এই ছাঁচে পড়ে।

গণনার দিক থেকে onto(m, n) = n! S(m, n), আর twelvefold way-এর কয়েকটি ঘর এই S(m, n) দিয়েই পূর্ণ হয়; যেমন n-টি একই রকম বাক্সে, খালি থাকতে পারে এমন বণ্টন S(m, 1) + … + S(m, n). পর্ব ৫০-এ S(m, n)-এর recurrence আর Bell সংখ্যা এই ছবি সম্পূর্ণ করবে।

একটি ব্যবহারিক সতর্কতাও আছে। সূত্রের পদগুলো চিহ্নে বদলায় আর আকারে বিশাল, অথচ উত্তর তুলনায় ছোট হতে পারে; float-এ হিসাব করলে বড় পদগুলোর গোলাকরণের ভুল একে অপরকে বাতিল করতে গিয়ে উত্তরটাই নষ্ট করে দিতে পারে। এই কারণে ব্লকে আমরা সব হিসাব Python-এর নির্ভুল int দিয়ে করেছি, আর সম্ভাবনা লাগলে Fraction দিয়ে ভাগ করেছি।

মূল উপলব্ধি: “প্রতিটি লক্ষ্য অন্তত একবার” ধরনের যেকোনো প্রশ্ন আসলে onto ফাংশন গোনা; inclusion–exclusion তার নির্ভুল সম্ভাবনা দেয়, linearity শুধু গড়।

প্র ০৫Bonferroni অসমতার বাস্তব ব্যবহার কী? পরিসংখ্যানে “Bonferroni correction” আর algorithm-এর union bound-এর সঙ্গে এর সম্পর্ক কী?

ইতালীয় গণিতবিদ Carlo Emilio Bonferroni ১৯৩০-এর দশকে সম্ভাবনার এই অসমতাগুলো নিয়ে লেখেন বলে জানা যায়, যদিও প্রথম অসমতা P(∪Ai) ≤ ∑P(Ai) তার অনেক আগে থেকেই পরিচিত, আর Boole-এর নামেও ডাকা হয়। এর ব্যবহার এত বিস্তৃত কারণ ডান পাশ হিসাব করতে কোনো স্বাধীনতা বা ছেদের তথ্য লাগে না।

পরিসংখ্যানে ধরুন একজন গবেষক একসঙ্গে ২০টি পরীক্ষা (hypothesis test) চালান, প্রতিটিতে ভুলবশত “ফল পাওয়া গেছে” বলার সম্ভাবনা 0.05. অন্তত একটি ভুল ঘোষণার সম্ভাবনা কত? Union bound বলে বড়জোর 20 × 0.05 = 1, যা কোনো কাজের নয়; বাস্তবে স্বাধীন পরীক্ষায় তা প্রায় 1 − 0.9520 ≈ 0.64, অর্থাৎ বেশ বড়। প্রতিকার হিসেবে প্রতিটি পরীক্ষার সীমা 0.05/20 = 0.0025 করা হয়; তখন union bound নিশ্চিত করে অন্তত একটি ভুলের সম্ভাবনা বড়জোর 0.05, পরীক্ষাগুলো নির্ভরশীল হলেও। এই পদ্ধতিই “Bonferroni correction” নামে পরিচিত, যা বিশ শতকের মাঝামাঝি Olive Jean Dunn-এর কাজে জনপ্রিয় হয় বলে উল্লেখ করা হয়। এটি সহজ আর নিরাপদ, কিন্তু অনেক পরীক্ষায় অতি সতর্ক, তাই পরে Holm-এর পদ্ধতি বা false discovery rate-এর মতো বিকল্প আসে।

Algorithm-এ union bound মডিউল ৭-এ বারবার এসেছে: hash collision-এর সীমা, randomized algorithm-এর ব্যর্থতার সম্ভাবনা, আর probabilistic method-এ “খারাপ ঘটনার যোগফল 1-এর কম হলে ভালো বস্তু আছে” যুক্তি (পর্ব ৪৩)। দ্বিতীয় Bonferroni অসমতা S1 − S2 ≤ P(∪) একটি নিচের সীমা দেয়, যা দেখাতে কাজে লাগে যে কোনো ঘটনা “অন্তত এত” সম্ভাব্য। ছেদগুলো ছোট হলে দুই সীমা কাছাকাছি, তখন প্রথম দুই পদই প্রায় নির্ভুল উত্তর।

মূল উপলব্ধি: Inclusion–exclusion-এর মাঝপথে থামা কোনো অবহেলা নয়, একটি নিয়ন্ত্রিত অনুমান; কোন দিকে ভুল হচ্ছে তা জানা থাকলে সীমাটি নিরাপদে ব্যবহার করা যায়।

অনুশীলন

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

  1. প্রমাণ: উপপাদ্য ৪.২-এর সূত্র থেকে প্রমাণ করুন, প্রতিটি n ≥ 1-এ Dn = nDn−1 + (−1)n. তারপর এটি দিয়ে D5 থেকে D8 হিসাব করুন।
    1. Dn = n! ∑k=0n (−1)k/k!. শেষ পদ k = n আলাদা করুন: Dn = n! ∑k=0n−1 (−1)k/k! + n! (−1)n/n!. — যোগফল ভাঙা
    2. দ্বিতীয় অংশ (−1)n. প্রথম অংশে n! = n · (n − 1)!, তাই সেটি n · [(n − 1)! ∑k=0n−1 (−1)k/k!] = nDn−1. — উপপাদ্য ৪.২, n − 1-এ
    3. মিলিয়ে Dn = nDn−1 + (−1)n. ∎ — বীজগণিত

    মান: D4 = 9 থেকে D5 = 5 · 9 − 1 = 44, D6 = 6 · 44 + 1 = 265, D7 = 7 · 265 − 1 = 1854, D8 = 8 · 1854 + 1 = 14833, যা ব্লকের brute force সারণির সঙ্গে মেলে। এই recurrence Euler-এর দুই-পদের recurrence-এর চেয়ে সহজ, কিন্তু এর combinatorial অর্থ কম স্বচ্ছ।

  2. হিসাব: (ক) a, b, c, d অক্ষর দিয়ে দৈর্ঘ্য 6-এর কতগুলো string-এ a, b, c তিনটি অক্ষরই অন্তত একবার আছে? (খ) 1, 2, 3, 4, 5, 6-এর কতগুলো permutation-এ 1, 2, 3 কেউই নিজের জায়গায় নেই (4, 5, 6-এর ওপর কোনো শর্ত নেই)?

    (ক) U = সব string, N = 46 = 4096. Aa = a নেই, ইত্যাদি তিনটি খারাপ ধর্ম। k-টি অক্ষর বাদ দিলে (4 − k)6. উত্তর 4096 − 3 · 729 + 3 · 64 − 1 · 1 = 4096 − 2187 + 192 − 1 = 2100. লক্ষ করুন, d-এর ওপর কোনো ধর্ম নেই, তাই এটি পুরো onto(6, 4) নয়।

    (খ) খারাপ ধর্ম শুধু তিনটি: Ai = σ(i) = i, i = 1, 2, 3. k-টি স্থির হলে (6 − k)!. উত্তর 6! − 3 · 5! + 3 · 4! − 3! = 720 − 360 + 72 − 6 = 426. দুটি উত্তরই scratch-এ itertools দিয়ে গুনে মেলানো।

  3. আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে। তারপর যেকোনো Python-এ চালিয়ে মেলান।
    from math import comb
    print([sum((-1)**k * comb(n, k) * (n - k)**4
               for k in range(n + 1)) for n in range(1, 6)])
    D = [1, 0]
    for n in range(2, 7):
        D.append((n - 1) * (D[-1] + D[-2]))
    print(D)
    [1, 14, 36, 24, 0]
    [1, 0, 1, 2, 9, 44, 265]

    প্রথম লাইন onto(4, n), n = 1 থেকে 5: চারটি উপাদান একটি লক্ষ্যে 1 উপায়; দুটিতে 16 − 2 = 14; তিনটিতে 36; চারটিতে onto মানে bijection, 4! = 24; পাঁচটিতে অসম্ভব, 0. দ্বিতীয় লাইন D0 থেকে D6; লুপ n = 2 থেকে 6, পাঁচটি নতুন পদ। আউটপুট CPython-এ চালিয়ে মেলানো।

  4. প্রমাণের ভুল ধরুন: একজন লিখলেন: “দাবি: n ≥ 1-এ কোনো derangement নেই। প্রমাণ: মোট n! permutation. প্রতিটি i-এর জন্য σ(i) = i এমন permutation (n − 1)!টি, আর i-এর n-টি পছন্দ, তাই খারাপ permutation n · (n − 1)! = n!টি। বাকি থাকে n! − n! = 0. ∎” ভুলটি কোথায়, আর n = 3-এ সঠিক হিসাব দিন।
    • ভুল ধাপ: “খারাপ permutation n · (n − 1)!টি”. এটি |A1| + … + |An| = S1, |A1 ∪ … ∪ An| নয়। একাধিক fixed point আছে এমন permutation একাধিকবার গোনা হয়েছে; যেমন identity permutation n বার।
    • n = 3-এ: S1 = 3 · 2 = 6, কিন্তু খারাপ permutation আসলে 6 − 3 + 1 = 4টি (123, 132, 213, 321). তাই D3 = 6 − 4 = 2: শুধু 231 আর 312 বিন্যাস।
    • শিক্ষা: S1 শুধু ওপরের সীমা, Bonferroni অসমতা অনুযায়ী। ছেদগুলো শূন্য না হলে union-এর আকার পেতে পুরো inclusion–exclusion লাগে।

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

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

ক্রমএকটি গণনার প্রশ্নে inclusion–exclusion প্রয়োগের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. সার্বিক সেট U আর তার আকার N ঠিক করা
  2. এড়াতে চাওয়া “খারাপ” ধর্ম A1, …, An লেখা
  3. প্রতিটি k-এর জন্য k-টি ধর্মের ছেদের আকার আর Sk হিসাব
  4. N − S1 + S2 − … পালাক্রমের চিহ্নে যোগ
  5. ছোট ক্ষেত্রে brute force দিয়ে উত্তর মেলানো

1 থেকে 60-এর মধ্যে কয়টি সংখ্যা 2, 3 বা 5-এর অন্তত একটি দিয়ে বিভাজ্য?

  • 44
  • 42
  • 62
  • 16

৫ জন কর্মী চিরকুট তোলেন; কতগুলো বিন্যাসে কেউই নিজের নাম পান না (D5)?

  • 9
  • 44.15
  • 44
  • 76

৪ উপাদানের একটি সেট থেকে ৩ উপাদানের একটি সেটে কতগুলো onto ফাংশন আছে?

  • 81
  • 36
  • 33
  • 6

দ্বিতীয় ধরনের Stirling সংখ্যা S(5, 2), অর্থাৎ ৫টি আলাদা অর্ডারকে দুটি অশূন্য নামহীন দলে ভাগের উপায়, কত?

  • 15
  • 30
  • 16
  • 10

inclusion–exclusion দিয়ে φ(60) হিসাব করলে (60 = 22 · 3 · 5) উত্তর কত?

  • 18
  • 44
  • 24
  • 16

x1 + x2 + x3 = 10-এর কতগুলো পূর্ণসংখ্যা সমাধানে প্রতিটি 0 ≤ xi ≤ 4?

  • 66
  • 6
  • 3
  • 15

শব্দকোষ

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

মনে রাখুন

  1. নীতি আর প্রমাণ: |∪Ai| = S1 − S2 + S3 − …; r-টি সেটে থাকা উপাদান 1 − (1 − 1)r = 1 বার গোনা হয়। Complement রূপে উত্তর ∑ (−1)kSk, S0 = N.
  2. চার প্রশ্ন: U কী, N কত, খারাপ ধর্ম কী, k-টির ছেদ কত। ছেদ শুধু k-এর ওপর নির্ভর করলে প্রতিসম রূপ ∑ (−1)kC(n, k)Nk.
  3. Onto আর Stirling: onto(m, n) = ∑ (−1)kC(n, k)(n − k)m = n! S(m, n); 5 → 3-এ 150 আর S(5, 3) = 25.
  4. Derangement: Dn = n! ∑ (−1)k/k! = (n − 1)(Dn−1 + Dn−2) = nDn−1 + (−1)n; 1, 0, 1, 2, 9, 44, 265; Dn/n! → 1/e, আর n ≥ 1-এ Dn = round(n!/e), তবে বড় n-এ float নয়।
  5. চালনি আর সীমা: φ(n) = n∏(1 − 1/p), Legendre-এ π(x) − π(√x) + 1, ঊর্ধ্বসীমাসহ সমাধান, সবই একই নীতি; বিজোড় সংখ্যক পদে থামলে ওপরের সীমা, জোড়ে নিচের সীমা, Bonferroni অসমতা অনুযায়ী।

পরের পর্বে: পর্ব ৫০ “বিশেষ সংখ্যা — Catalan, Stirling আর partition”: Stirling সংখ্যার recurrence আর সারণি, প্রথম ধরনের Stirling সংখ্যা, Bell সংখ্যা আর পূর্ণসংখ্যার partition, প্রমাণসহ।

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

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