ইনক্লুশন-এক্সক্লুশন প্রিন্সিপল
এই পাঠে যা শিখবেন
- কেন সরল যোগ ওভারল্যাপিং সেটের জন্য ভুল উত্তর দেয়
- ২-সেট ও ৩-সেট ইনক্লুশন-এক্সক্লুশন সূত্র এবং তাদের পেছনের যুক্তি
- বাস্তব সংখ্যা দিয়ে দুটো ভিন্ন উদাহরণ হাতে সমাধান করা
- Python দিয়ে সূত্র দুটো ব্রুট-ফোর্স গণনার সাথে যাচাই করা
১ · কেন সরল যোগ ভুল হতে পারে
L12-এ আমরা শিখেছি যোগের নিয়ম — যদি দুটো বিকল্প পরস্পর-বিচ্ছিন্ন (mutually exclusive) হয়, তাহলে $|A|+|B|$ সঠিক উত্তর দেয়। কিন্তু যদি $A$ ও $B$ ওভারল্যাপ করে (কিছু বস্তু উভয় সেটেই থাকে), তাহলে সরল যোগ ওভারল্যাপ করা অংশটিকে দুইবার গুনে ফেলে। এই ভুল ঠিক করার সূত্রই ইনক্লুশন-এক্সক্লুশন প্রিন্সিপলInclusion-Exclusion Principleএকাধিক ওভারল্যাপিং সেটের ইউনিয়নের আকার সঠিকভাবে গোনার সূত্র — প্রথমে সব একক সেট যোগ করো, তারপর সব জোড়া-ওভারল্যাপ বাদ দাও (দ্বিগুণ গণনা ঠিক করতে), তারপর ত্রয়ী-ওভারল্যাপ আবার যোগ করো (অতিরিক্ত বাদ দেওয়া ঠিক করতে) — এভাবে চলতে থাকে।।
$$|A \cup B| = |A| + |B| - |A \cap B|$$
যুক্তি: $|A|+|B|$ যোগ করলে $A \cap B$-এর প্রতিটি বস্তু দুইবার গোনা হয় (একবার $A$-এর অংশ হিসেবে, একবার $B$-এর অংশ হিসেবে) — তাই একবার $|A \cap B|$ বাদ দিলে প্রতিটি বস্তু ঠিক একবার গোনা হয়।
২ · উদাহরণ — ১০০ শিক্ষার্থী
১০০ জন শিক্ষার্থীর মধ্যে ৬০ জন গণিত কোর্সে, ৪৫ জন সিএস কোর্সে, এবং ২৫ জন উভয় কোর্সেই ভর্তি হয়েছে। কতজন অন্তত একটি কোর্সে ভর্তি হয়েছে?
$$|A \cup B| = 60 + 45 - 25 = 80$$
অর্থাৎ ১০০ জনের মধ্যে ৮০ জন অন্তত একটি কোর্সে ভর্তি হয়েছে, এবং বাকি ২০ জন কোনো কোর্সেই ভর্তি হয়নি।
# ২-সেট ইনক্লুশন-এক্সক্লুশন যাচাই — ১০০ শিক্ষার্থী উদাহরণ
A = set(range(1, 61)) # ৬০ জন গণিত কোর্সে (আইডি ১-৬০)
B = set(range(36, 81)) # ৪৫ জন সিএস কোর্সে (আইডি ৩৬-৮০), ওভারল্যাপ ৩৬-৬০ = ২৫ জন
formula = len(A) + len(B) - len(A & B)
brute = len(A | B)
print("|A| =", len(A), " |B| =", len(B), " |A∩B| =", len(A & B))
print("সূত্র দিয়ে |A∪B|:", formula)
print("ব্রুট-ফোর্স |A∪B|:", brute)
print("দুটো মিলে গেছে:", formula == brute)
৩ · ৩-সেট সূত্র
তিনটি সেটের ক্ষেত্রে প্যাটার্নটি চলতে থাকে — একক সেট যোগ করো, জোড়া-ওভারল্যাপ বাদ দাও, তারপর ত্রয়ী-ওভারল্যাপ আবার যোগ করো (কারণ এটি তিনটি জোড়া-বিয়োগেই তিনবার বাদ হয়ে গেছে, একবার ফেরত দিতে হবে):
$$|A \cup B \cup C| = |A|+|B|+|C| - |A\cap B|-|A\cap C|-|B\cap C| + |A\cap B\cap C|$$
উদাহরণ: ১ থেকে ৩০ পর্যন্ত সংখ্যার মধ্যে যেগুলো ২, ৩, অথবা ৫ দ্বারা বিভাজ্য, তাদের সংখ্যা বের করুন। এখানে $A$=২-এর গুণিতক, $B$=৩-এর গুণিতক, $C$=৫-এর গুণিতক।
$|A|=15$, $|B|=10$, $|C|=6$ (২, ৩, ৫-এর গুণিতক সংখ্যা)।
$|A\cap B|=5$ (৬-এর গুণিতক), $|A\cap C|=3$ (১০-এর গুণিতক), $|B\cap C|=2$ (১৫-এর গুণিতক)।
$|A\cap B\cap C|=1$ (৩০-এর গুণিতক)।
$$|A\cup B\cup C| = 15+10+6-5-3-2+1 = 22$$
অর্থাৎ ১ থেকে ৩০ পর্যন্ত মোট ২২টি সংখ্যা ২, ৩, অথবা ৫ দ্বারা বিভাজ্য।
# ৩-সেট ইনক্লুশন-এক্সক্লুশন যাচাই — ১-৩০ এর মধ্যে ২, ৩, ৫-এর গুণিতক
nums = set(range(1, 31))
A = {n for n in nums if n % 2 == 0}
B = {n for n in nums if n % 3 == 0}
C = {n for n in nums if n % 5 == 0}
formula = (len(A) + len(B) + len(C)
- len(A & B) - len(A & C) - len(B & C)
+ len(A & B & C))
brute = len(A | B | C)
print("|A|, |B|, |C| =", len(A), len(B), len(C))
print("|A∩B|, |A∩C|, |B∩C| =", len(A & B), len(A & C), len(B & C))
print("|A∩B∩C| =", len(A & B & C))
print("সূত্র দিয়ে |A∪B∪C|:", formula)
print("ব্রুট-ফোর্স |A∪B∪C|:", brute)
print("দুটো মিলে গেছে:", formula == brute)
A & B Python-এর সেট ইন্টারসেকশন অপারেটর ($A \cap B$) এবং A | B | C
ইউনিয়ন অপারেটর ($A \cup B \cup C$) — L07-এ শেখা সেট থিওরির অপারেশনগুলোই এখানে সরাসরি ব্যবহৃত হচ্ছে।
ইনক্লুশন-এক্সক্লুশন প্রিন্সিপল "যোগ, বাদ, যোগ, বাদ..." — এই বিকল্প ধারা অনুসরণ করে, যতগুলো সেট ওভারল্যাপ করুক না কেন। পরের পাঠে (L17) আমরা দেখব এই একই "$|A \cup B|$" ধারণা প্রোবাবিলিটির অ্যাডিশন রুলেও (addition rule) হুবহু কীভাবে পুনরাবৃত্তি হয়।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ যদি $A$ ও $B$ সম্পূর্ণ পরস্পর-বিচ্ছিন্ন (disjoint, কোনো ওভারল্যাপ নেই) হয়, তাহলে ইনক্লুশন-এক্সক্লুশন সূত্র $|A \cup B| = |A|+|B|-|A\cap B|$ কীভাবে সাধারণ যোগের নিয়মে (L12) রূপান্তরিত হয়?
যদি $A$ ও $B$ ডিসজয়েন্ট হয়, তাহলে $A \cap B = \emptyset$, অর্থাৎ $|A \cap B|=0$। তখন সূত্রটি হয়ে যায় $|A\cup B| = |A|+|B|-0 = |A|+|B|$ — যা ঠিক L12-এর যোগের নিয়ম। এভাবেই দেখা যায় যোগের নিয়ম আসলে ইনক্লুশন-এক্সক্লুশন প্রিন্সিপলের একটি বিশেষ কেস (যখন ওভারল্যাপ শূন্য)।
প্র ০২ ৩-সেট সূত্রে ত্রয়ী-ওভারল্যাপ $|A\cap B\cap C|$ কেন "যোগ" করতে হয় (বিয়োগ নয়), এমনকি এটিও একটি ওভারল্যাপ হওয়া সত্ত্বেও?
$A\cap B\cap C$-এর প্রতিটি বস্তু প্রথমে তিনবার গোনা হয় ($|A|+|B|+|C|$-এ, কারণ এটি তিনটি সেটেই আছে), তারপর তিনটি জোড়া-বিয়োগেই ($|A\cap B|$, $|A\cap C|$, $|B\cap C|$ — তিনটিতেই এই বস্তু আছে) আবার তিনবার বাদ হয়ে যায়। নেট ফলাফল: $3 - 3 = 0$ বার গোনা হয়েছে — কিন্তু এই বস্তুটি $A\cup B\cup C$-এর অংশ, তাই একবার গোনা হওয়া উচিত ছিল। তাই একবার $|A\cap B\cap C|$ যোগ করে ঠিক করা হয়, যাতে চূড়ান্ত গণনা $3-3+1=1$ হয় — সঠিক।
প্র ০৩ একটি কোম্পানিতে ৮০ জন কর্মী ইংরেজি, ৫০ জন স্প্যানিশ এবং ৩০ জন উভয় ভাষায় কথা বলতে পারেন। যদি মোট কর্মী সংখ্যা ১২০ হয়, কতজন কর্মী কোনো ভাষাতেই পারদর্শী নন?
প্রথমে ইনক্লুশন-এক্সক্লুশন দিয়ে অন্তত একটি ভাষায় পারদর্শী কর্মী সংখ্যা বের করি: $|A\cup B| = 80+50-30=100$। মোট কর্মী ১২০ জন হলে, বাকি $120-100=20$ জন কর্মী কোনো ভাষাতেই পারদর্শী নন। এখানে L07-এর কমপ্লিমেন্ট (complement) ধারণাটি ইনক্লুশন-এক্সক্লুশনের সাথে একসাথে ব্যবহৃত হলো।
অনুশীলন
-
গণনা করুন: একটি ক্লাসে ৫০ জন শিক্ষার্থী আছে। ৩০ জন ফুটবল খেলে, ২০ জন ক্রিকেট খেলে, এবং ১০ জন উভয়ই খেলে। কতজন শিক্ষার্থী অন্তত একটি খেলা খেলে?
$|A\cup B| = 30+20-10=40$ জন অন্তত একটি খেলা খেলে। বাকি $50-40=10$ জন কোনো খেলাই খেলে না।
-
যাচাই করুন: উপরের প্রথম কোড সেলে
AওB-এর রেঞ্জ পরিবর্তন করে ওভারল্যাপ ২৫-এর বদলে ১৫ করুন (যেমনB = set(range(46, 91))), তারপর হাতে-হিসাব করা নতুন union-এর সাথে কোড আউটপুট মিলিয়ে দেখুন।range(46, 91)দিলে $|B|=45$ ঠিকই থাকে কিন্তু ওভারল্যাপ ($46$-$60$) হয় $15$টি সংখ্যা। সূত্র দেবে $60+45-15=90$, এবংlen(A | B)-ও একই মান দেওয়া উচিত।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৪৪টি পাঠ পরবর্তী পাঠ — ডিসক্রিট প্রোবাবিলিটি বেসিকস — এই মডিউলের শেষ পাঠ, কাউন্টিং থেকে সম্ভাব্যতায় সেতুবন্ধন।
- Data Structures & Algorithms কোর্স সঙ্গী কোর্স সেট-ভিত্তিক অ্যালগরিদম ও ডেটা স্ট্রাকচার অপ্টিমাইজেশনে এই নীতি প্রয়োগ হয়।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, HTML & CSS ও Discrete Mathematics — সব এক জায়গায়।