এই পর্বে যা শিখবেন
- Binary relation আর একটি সেটের ওপর relation-এর নির্ভুল সংজ্ঞা, আর ফাংশন কেন একটি বিশেষ relation
- জোড়ার তালিকা, digraph আর 0-1 matrix: তিন রূপে relation পড়া আর লেখা
- ছয়টি ধর্মের সংজ্ঞা, matrix আর ছবিতে তাদের চেহারা, উদাহরণ আর counterexample
- ধর্ম অনুযায়ী relation গোনার সূত্র আর তাদের প্রমাণ, আর brute force দিয়ে মেলানো
- Union, intersection, inverse, composition আর power; associativity আর “transitive ⇔ Rn ⊆ R” উপপাদ্যের প্রমাণ
১ · Relation কী — জোড়ার একটি সেট
দৈনন্দিন ভাষায় “সম্পর্ক” অনেক রকম: রহিম করিমের ভাই, ঢাকা খুলনার চেয়ে বড়, ১২ সংখ্যাটি ৩ দিয়ে বিভাজ্য, একটি অর্ডার একজন ক্রেতার। প্রতিটি ক্ষেত্রে দুটি বস্তু, আর তাদের মধ্যে কিছু একটা সত্য বা মিথ্যা। গণিত এই সব সম্পর্কের একটিই সাধারণ রূপ দেয়: কোন কোন জোড়া সম্পর্কে যুক্ত, তার তালিকা।
বাজারঘরের হিসাবরক্ষক একটি খাতায় লেখেন কোন ক্রেতা কোন পণ্য কিনেছেন: “রিনা — চাল”, “রিনা — ডাল”, “সজীব — চা”। খাতায় “কেনা” শব্দটির কোনো আলাদা সংজ্ঞা নেই; খাতার লাইনগুলোই সম্পর্কটি। কেউ জিজ্ঞেস করলেন “সজীব কি চাল কিনেছেন?” হিসাবরক্ষক শুধু দেখেন জোড়াটি খাতায় আছে কি না। গণিতের relation ঠিক এই খাতা।
পর্ব ১৪ “সেট — সংজ্ঞা, subset, power set আর Cartesian product”-এ সংজ্ঞাটি সংক্ষেপে এসেছে। এখানে তাকে পূর্ণ রূপে লিখি।
A আর B দুটি সেট। A থেকে B-তে একটি binary relation হলো Cartesian product A × B-এর যেকোনো subset R. (a, b) ∈ R হলে লেখা হয় a R b, পড়া হয় “a, b-এর সঙ্গে R সম্পর্কে যুক্ত”; (a, b) ∉ R হলে a R̸ b. A = B হলে, অর্থাৎ R ⊆ A × A হলে, R-কে বলা হয় A-এর ওপর একটি relation.
এখানে A × B = {(a, b) : a ∈ A, b ∈ B}, সব ordered pair-এর সেট। “Binary” শব্দটির অর্থ জোড়ায় জোড়ায় দুটি করে বস্তু; তিন বা ততোধিক বস্তুর সম্পর্ক (n-ary relation) পর্ব ৫৩ “n-ary relation আর relational database-এর গণিত”-এর বিষয়। এই পর্বে “relation” মানেই binary relation.
বাজারঘরের উদাহরণ। ক্রেতা C = {রিনা, সজীব, তানিয়া} আর পণ্য P = {চাল, ডাল, চা, তেল}. “কিনেছেন” relation K = {(রিনা, চাল), (রিনা, ডাল), (সজীব, চা), (তানিয়া, চাল), (তানিয়া, তেল)}. C × P-এ 3 · 4 = 12টি জোড়া, তার মধ্যে ৫টি K-তে। প্রতিটি সম্ভাব্য খাতা C × P-এর একটি subset, তাই এমন খাতা মোট 212 = 4096টি সম্ভব।
একটি সেটের ওপর relation. অনেক গুরুত্বপূর্ণ relation একই সেটের দুটি উপাদানের মধ্যে: পূর্ণসংখ্যায় ≤, <, “a ∣ b” (a, b-কে নিঃশেষে ভাগ করে), “a ≡ b (mod 5)” (পর্ব ২২), বাজারঘরের পণ্যে “x-এর দাম y-এর চেয়ে কম”, অর্ডার-প্রক্রিয়ার কাজে “x শেষ না হলে y শুরু হয় না”। এই পর্বের ধর্মগুলো (reflexive, symmetric, transitive …) শুধু এই ধরনের relation-এর জন্যই অর্থবহ, কারণ সেখানে (a, b) আর (b, a) দুটিই একই সেটের জোড়া।
উদাহরণ: A = {1, 2, 3, 4}-এর ওপর “a ∣ b” relation হলো {(1,1), (1,2), (1,3), (1,4), (2,2), (2,4), (3,3), (4,4)}, আটটি জোড়া। আর A-এর ওপর সম্ভাব্য relation |A × A| = 16টি জোড়ার যেকোনো subset, তাই 216 = 65536টি। সাধারণভাবে n উপাদানের সেটে 2n²টি relation; §৫-এ এদের মধ্যে কয়টির কোন ধর্ম আছে, তা গুনব।
ফাংশন একটি বিশেষ relation
পর্ব ১৬ “ফাংশন — one-to-one, onto, inverse আর composition”-এ f: A → B-কে নিয়ম হিসেবে দেখেছেন। জোড়ার ভাষায় একটি function হলো এমন একটি relation f ⊆ A × B, যাতে প্রতিটি a ∈ A-এর জন্য ঠিক একটি b ∈ B থাকে, যেখানে (a, b) ∈ f. তখনই আমরা লিখি f(a) = b. এই সেটটিকেই পর্ব ১৬-এ “ফাংশনের graph” বলা হয়েছিল। তাই প্রতিটি ফাংশন একটি relation, কিন্তু উল্টোটি সত্য নয়: “কিনেছেন” relation K-তে রিনার দুটি পণ্য আছে, তাই K কোনো ফাংশন নয়। দুটি শর্তের যেকোনোটি ভাঙলে ফাংশন থাকে না: কোনো a-এর কোনো জোড়া না থাকলে (তখন তা partial function), বা একাধিক জোড়া থাকলে।
সাধারণ ভুল: “relation” আর “relationship” এক জিনিস নয়, আর গণিতের relation-এ কোনো “কারণ” বা “নিয়ম” লাগে না। {(1, 3), (2, 2)} একটি সম্পূর্ণ বৈধ relation, যদিও এর পেছনে কোনো সুন্দর নিয়ম নেই। দুটি relation সমান মানে তাদের জোড়ার সেট সমান, নিয়ম দেখতে যতই আলাদা হোক: ℤ-এ “a − b জোড়” আর “a + b জোড়” একই relation.
২ · তিন রূপে relation — তালিকা, digraph আর 0-1 matrix
একটি সসীম relation তিনভাবে লেখা যায়, আর প্রতিটি রূপ ভিন্ন প্রশ্নের জন্য সুবিধাজনক। চলুন পুরো পর্বে একটি উদাহরণ ধরে রাখি: A = {1, 2, 3, 4}-এর ওপর
R = {(1,1), (2,2), (3,3), (1,2), (2,3), (1,3), (3,2)}
ধরুন 1, 2, 3, 4 হলো বাজারঘরের চারটি ডেলিভারি জোন, আর a R b মানে “জোন a-এর রাইডার জোন b-তে ডেলিভারি দিতে পারেন”। জোন ৪ নতুন, এখনো কোনো রাইডার নেই।
- জোড়ার তালিকা (set of pairs): ওপরের মতো। কোডে সবচেয়ে সহজ: Python-এ
setoftuple; “(a, b) আছে কি?” প্রশ্নের উত্তর এক ধাপে। - Directed graph (digraph) বা তীরচিত্র: প্রতিটি উপাদান একটি বিন্দু (vertex), আর প্রতিটি (a, b)-এর জন্য a থেকে b-তে একটি তীর। (a, a) মানে বিন্দু থেকে নিজের কাছে ফেরা একটি ছোট ফাঁস, যার নাম self-loop. A থেকে B-তে relation হলে দুই সারিতে দুটি সেট এঁকে বাঁ থেকে ডানে তীর দেওয়া হয় (arrow diagram), যেমনটি পর্ব ১৬-এ ফাংশনের জন্য দেখেছেন।
- 0-1 matrix: A = {a1, …, am}, B = {b1, …, bn} হলে MR একটি m × n matrix, যার ঘর mij = 1 যদি (ai, bj) ∈ R, নইলে 0. পর্ব ১৯ “Discrete math-এ matrix — 0-1 matrix আর Boolean product”-এ এই matrix-এর অপারেশন শিখেছেন।
একই relation R, দুই রূপে: digraph আর 0-1 matrix
বিন্দুর ওপরের ছোট বৃত্ত = self-loop (a, a); 2 আর 3-এর মাঝে দুটি বাঁকা তীর = (2, 3) আর (3, 2) দুটিই আছে; জোন ৪ একা।
তিন রূপের মধ্যে অনুবাদ যান্ত্রিক: matrix-এর প্রতিটি 1 একটি জোড়া আর একটি তীর; matrix-এর কর্ণ (main diagonal, m11, m22, …) মানে self-loop-গুলো। কোন রূপ কখন ভালো? ছোট হাতের হিসাবে আর ধর্ম “দেখে” বুঝতে digraph; কম্পিউটারে দ্রুত গুণ আর তুলনায় matrix; আর বিরল (sparse) relation-এ, যেখানে সম্ভাব্য জোড়ার খুব কম অংশ আছে, জোড়ার তালিকা বা adjacency list জায়গা বাঁচায়। গ্রাফের representation-এর ব্যবহারিক দিক DSA কোর্সের পর্ব ৩৯ “গ্রাফ — উপস্থাপন আর পরিভাষা”-এ, আর গণিতের দিক এই কোর্সের পর্ব ৫৮ “গ্রাফের representation আর isomorphism”-এ।
৩ · ছয়টি ধর্ম — সংজ্ঞা, matrix আর digraph-এ চেহারা
এখন থেকে R হলো একটি সেট A-এর ওপর relation. প্রতিটি ধর্ম একটি quantifier-যুক্ত বাক্য (পর্ব ৪-এর predicate logic), আর তাদের ঠিকভাবে পড়তে পারাই এই পর্বের অর্ধেক কাজ।
- Reflexive: ∀a ∈ A, (a, a) ∈ R. প্রতিটি উপাদান নিজের সঙ্গে যুক্ত।
- Irreflexive: ∀a ∈ A, (a, a) ∉ R. কোনো উপাদান নিজের সঙ্গে যুক্ত নয়।
- Symmetric: ∀a, b ∈ A, (a, b) ∈ R → (b, a) ∈ R.
- Antisymmetric: ∀a, b ∈ A, ((a, b) ∈ R ∧ (b, a) ∈ R) → a = b. দুটি আলাদা উপাদান দুই দিকেই যুক্ত হতে পারে না।
- Asymmetric: ∀a, b ∈ A, (a, b) ∈ R → (b, a) ∉ R. কোনো জোড়ার উল্টোটি নেই, a = b হলেও।
- Transitive: ∀a, b, c ∈ A, ((a, b) ∈ R ∧ (b, c) ∈ R) → (a, c) ∈ R. দুই ধাপে যাওয়া গেলে সরাসরিও যাওয়া যায়।
সংজ্ঞাগুলোর quantifier-এ মনোযোগ দিন। Reflexive একটি “সব a-এর জন্য (a, a) আছে” দাবি, তাই একটিমাত্র অনুপস্থিত (a, a) দাবিটি ভাঙে। Symmetric, antisymmetric, asymmetric আর transitive হলো “যদি … তবে …” আকারের দাবি; শর্তটি কখনো সত্য না হলে দাবিটি শূন্যভাবে (vacuously) সত্য। তাই খালি relation ∅ symmetric, antisymmetric, asymmetric আর transitive, কিন্তু A ≠ ∅ হলে reflexive নয়।
| ধর্ম | 0-1 matrix M-এ | digraph-এ | উদাহরণ |
|---|---|---|---|
| Reflexive | কর্ণের সব ঘর 1 | প্রতিটি বিন্দুতে self-loop | ℤ-এ ≤, =, ∣ (ধনাত্মকে) |
| Irreflexive | কর্ণের সব ঘর 0 | কোনো self-loop নেই | <, ≠ |
| Symmetric | M = MT (transpose) | প্রতিটি তীরের উল্টো তীর আছে | =, ≠, “একই জেলায় থাকেন” |
| Antisymmetric | i ≠ j-এ mij আর mji দুটিই 1 নয় | দুই আলাদা বিন্দুর মধ্যে দুই দিকে তীর নেই | ≤, ∣ (ধনাত্মকে), ⊆ |
| Asymmetric | কর্ণ 0, আর mij = 1 হলে mji = 0 | self-loop নেই, দুই দিকে তীর নেই | <, “x-এর দাম y-এর চেয়ে কম” |
| Transitive | M ⊙ M ≤ M (ঘরে ঘরে) | প্রতিটি দুই-ধাপ পথের একটি সরাসরি তীর আছে | ≤, <, ∣, =, ≡ (mod m) |
Transitive-এর matrix-শর্তে M ⊙ M হলো Boolean product (পর্ব ১৯): ঘর (i, j)-এ 1 ঠিক তখন, যখন কোনো k-এর জন্য mik = mkj = 1, অর্থাৎ i থেকে j-তে দুই ধাপের পথ আছে। “M ⊙ M ≤ M” মানে প্রতিটি দুই-ধাপ পথের জন্য সরাসরি জোড়াটিও আছে। এর প্রমাণ §৭-এর উপপাদ্য ৭.৪ থেকে আসবে।
এবার উদাহরণ R-কে ধর্ম ধরে পরীক্ষা করি, প্রতিটি ধর্মে কোন জোড়া দোষী তা খুঁজে।
1R-এ ৭টি জোড়া2reflexive: সব (a,a)?3irreflexive: কোনো (a,a) নয়?4symmetric: (a,b) → (b,a)?5antisymmetric: a≠b দুই দিকে?6asymmetric: কোনো উল্টো নেই?7transitive: ১৫টি দুই-ধাপ পথ8ফলাফল
| ধর্ম | |
| দেখি | |
| দোষী জোড়া | |
| ফল |
- শুরু। A = {1, 2, 3, 4}, আর R-এ ৭টি জোড়া; matrix-এ ১৬টি ঘরের ৭টিতে 1. প্রতিটি ধর্মের জন্য আমরা একটি “দোষী” জোড়া খুঁজব; পাওয়া গেলে ধর্মটি নেই, না পাওয়া গেলে আছে।
- Reflexive. কর্ণ পড়ি: m11 = m22 = m33 = 1, কিন্তু m44 = 0. জোন ৪-এর (4, 4) নেই, তাই R reflexive নয়। “প্রায় সব” যথেষ্ট নয়; ∀ মানে সব।
- Irreflexive. উল্টো দাবি: কোনো (a, a) থাকবে না। কিন্তু (1, 1) আছে, তাই এটিও নয়। খেয়াল করুন, R reflexive-ও নয়, irreflexive-ও নয়; একটি অন্যটির negation নয়।
- Symmetric. (1, 2) ∈ R, কিন্তু (2, 1) ∉ R. matrix-এ m12 = 1 অথচ m21 = 0, তাই M ≠ MT. Symmetric নয়। (1, 3)-ও একই কারণে দোষী।
- Antisymmetric. (2, 3) আর (3, 2) দুটিই আছে, অথচ 2 ≠ 3. digraph-এ 2 আর 3-এর মধ্যে দুই দিকে তীর। তাই antisymmetric-ও নয়: symmetric নয় বলেই antisymmetric হয়ে যায় না।
- Asymmetric. (1, 1) ∈ R, আর a = b = 1 নিলে তার “উল্টো” (1, 1)-ও R-এ। তাই একটি self-loop থাকলেই asymmetric নয়। (2, 3) আর (3, 2) আরেকটি কারণ।
- Transitive. (a, b), (b, c) দুটিই R-এ, এমন ১৫টি দুই-ধাপ পথ আছে (scratch-এ তালিকা করে গোনা), যেমন 1 → 2 → 3, 1 → 3 → 2, 2 → 3 → 2. প্রতিটির জন্য (a, c) R-এ আছে: (1, 3), (1, 2), (2, 2) ইত্যাদি। কোনো দোষী নেই, তাই R transitive.
- ফলাফল। ছয়টির মধ্যে R-এর শুধু একটি ধর্ম: transitive. নিচের প্রথম Python ব্লক ঠিক এই পরীক্ষাটি করে, আর প্রতিটি “না”-এর পাশে দোষী জোড়া ছাপে।
৪ · ধর্মের মিশ্রণ — কোনটি কোনটিকে বোঝায়, কোনটি বোঝায় না
ছয়টি ধর্ম স্বাধীন নয়। কিছু সম্পর্ক প্রমাণ করা যায়, আর কিছু “স্বাভাবিক মনে হওয়া” সম্পর্ক আসলে মিথ্যা। দুটি উপপাদ্য দিয়ে শুরু করি।
A-এর ওপর একটি relation R asymmetric যদি এবং কেবল যদি R irreflexive আর antisymmetric.
- (⇒) R asymmetric ধরুন। কোনো a-এর জন্য (a, a) ∈ R হলে asymmetry-তে b = a বসিয়ে (a, a) ∉ R, বিরোধ। তাই R irreflexive. — সংজ্ঞায় b = a বসানো
- (⇒) Antisymmetric-এর শর্ত “(a, b) ∈ R ∧ (b, a) ∈ R” asymmetric R-এ কখনো সত্য হয় না, তাই implication-টি শূন্যভাবে সত্য। — vacuous truth, পর্ব ২
- (⇐) R irreflexive আর antisymmetric ধরুন, আর ধরুন কোনো (a, b) ∈ R আর (b, a) ∈ R. Antisymmetry থেকে a = b, তাহলে (a, a) ∈ R, যা irreflexivity-র বিরোধী। — proof by contradiction, পর্ব ৮
- তাই এমন জোড়া নেই: (a, b) ∈ R হলে (b, a) ∉ R, অর্থাৎ R asymmetric. ∎
R symmetric আর antisymmetric দুটিই যদি এবং কেবল যদি R ⊆ ΔA, যেখানে ΔA = {(a, a) : a ∈ A} হলো diagonal বা identity relation.
- (⇒) (a, b) ∈ R নিন। Symmetry থেকে (b, a) ∈ R; তখন antisymmetry থেকে a = b. তাই প্রতিটি জোড়া (a, a) আকারের, অর্থাৎ R ⊆ ΔA. — দুই সংজ্ঞা পরপর
- (⇐) R ⊆ ΔA হলে প্রতিটি জোড়া (a, a), যার উল্টো সে নিজেই, তাই symmetric; আর (a, b), (b, a) দুটিই থাকলে দুটিই diagonal-এ, তাই a = b. ∎ — সংজ্ঞা যাচাই
তাই “symmetric” আর “antisymmetric” পরস্পরের উল্টো নয়: ΔA আর ∅ দুটি ধর্মই রাখে, আর §৩-এর R কোনোটিই রাখে না। n উপাদানের সেটে দুটি ধর্মই আছে এমন relation ঠিক 2nটি, ΔA-এর subset-গুলো।
নিচের সারণিতে পরিচিত কিছু relation, প্রতিটি ধর্মসহ। “✓” = আছে, “✗” = নেই। সেটটি বলা না থাকলে ধনাত্মক পূর্ণসংখ্যা ℤ+.
| Relation | Refl | Irrefl | Sym | Antisym | Asym | Trans |
|---|---|---|---|---|---|---|
| a = b | ✓ | ✗ | ✓ | ✓ | ✗ | ✓ |
| a ≤ b | ✓ | ✗ | ✗ | ✓ | ✗ | ✓ |
| a < b | ✗ | ✓ | ✗ | ✓ | ✓ | ✓ |
| a ∣ b | ✓ | ✗ | ✗ | ✓ | ✗ | ✓ |
| a ≠ b | ✗ | ✓ | ✓ | ✗ | ✗ | ✗ |
| a ≡ b (mod 3) | ✓ | ✗ | ✓ | ✗ | ✗ | ✓ |
| |a − b| ≤ 1 | ✓ | ✗ | ✓ | ✗ | ✗ | ✗ |
| b = a + 1 | ✗ | ✓ | ✗ | ✓ | ✓ | ✗ |
| ∅ (A ≠ ∅) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ |
কয়েকটি সারি নিয়ে ভাবুন। ℤ-এ ∣ antisymmetric নয়, কারণ 2 ∣ −2 আর −2 ∣ 2, অথচ 2 ≠ −2; তাই সারণিতে ℤ+ নেওয়া হয়েছে। |a − b| ≤ 1 (“দাম প্রায় সমান”) transitive নয়: 1 আর 2 কাছাকাছি, 2 আর 3 কাছাকাছি, কিন্তু 1 আর 3 নয়। বাস্তবে “প্রায় সমান” ধরনের সম্পর্ক প্রায়ই এই ফাঁদে পড়ে: দুই টাকা করে সরতে সরতে দশ টাকার পার্থক্য। ≡ (mod 3) reflexive, symmetric আর transitive তিনটিই; এই তিনটি একসঙ্গে থাকলে relation-টিকে বলে equivalence relation, যা পর্ব ৫৫ “Equivalence relation আর partition”-এর বিষয়। আর reflexive, antisymmetric আর transitive একসঙ্গে (≤, ∣, ⊆) হলো partial order, পর্ব ৫৬ “Partial order, Hasse diagram, topological sort আর lattice”-এর বিষয়। তাই এই পর্বের ছয়টি ধর্ম পুরো মডিউলের ইট।
নিচের ব্লক §৩-এর পরীক্ষাটি কোডে করে, আর প্রতিটি “না”-এর পাশে প্রথম দুটি দোষী জোড়া (বা দুই-ধাপ পথ) ছাপে। সঙ্গে বাজারঘরের চারটি পণ্যের দাম ধরে “সস্তা” আর “একই দাম” relation-ও পরীক্ষা করে। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে; পরের ব্লকগুলো দ্রুত চলে।
def check(R, A):
"""Return {property: None if it holds, else the pairs that break it}."""
bad = {}
bad["reflexive"] = [(a, a) for a in A if (a, a) not in R] or None
bad["irreflexive"] = [(a, a) for a in A if (a, a) in R] or None
bad["symmetric"] = [(a, b) for (a, b) in sorted(R)
if (b, a) not in R] or None
bad["antisymmetric"] = [(a, b) for (a, b) in sorted(R)
if a < b and (b, a) in R] or None
bad["asymmetric"] = [(a, b) for (a, b) in sorted(R)
if (b, a) in R and a <= b] or None
bad["transitive"] = [((a, b), (b, d)) for (a, b) in sorted(R)
for (c, d) in sorted(R)
if b == c and (a, d) not in R] or None
return bad
def report(name, R, A):
print(name)
for prop, why in check(R, A).items():
print(f" {prop:13}", "yes" if why is None else f"no {why[:2]}")
A = [1, 2, 3, 4]
R = {(1, 1), (2, 2), (3, 3), (1, 2), (2, 3), (1, 3), (3, 2)}
report("R on {1,2,3,4}", R, A)
# bazarghor: "costs less than" on four product prices (taka)
price = {1: 120, 2: 450, 3: 450, 4: 900}
L = {(a, b) for a in A for b in A if price[a] < price[b]}
report("cheaper-than", L, A)
E = {(a, b) for a in A for b in A if price[a] == price[b]}
report("same-price", E, A)আসল আউটপুট (ব্রাউজারের Python):
R on {1,2,3,4}
reflexive no [(4, 4)]
irreflexive no [(1, 1), (2, 2)]
symmetric no [(1, 2), (1, 3)]
antisymmetric no [(2, 3)]
asymmetric no [(1, 1), (2, 2)]
transitive yes
cheaper-than
reflexive no [(1, 1), (2, 2)]
irreflexive yes
symmetric no [(1, 2), (1, 3)]
antisymmetric yes
asymmetric yes
transitive yes
same-price
reflexive yes
irreflexive no [(1, 1), (2, 2)]
symmetric yes
antisymmetric no [(2, 3)]
asymmetric no [(1, 1), (2, 2)]
transitive yes
প্রথম অংশ stepper-এর প্রতিটি সিদ্ধান্ত আর দোষী জোড়া হুবহু মেলায়। “cheaper-than” (দামে কম) irreflexive, antisymmetric, asymmetric আর transitive: উপপাদ্য ৪.১-এর মতোই asymmetric হলে irreflexive আর antisymmetric দুটিই আছে। দুটি পণ্যের (2 আর 3) দাম একই ৪৫০ টাকা, তাই তাদের মধ্যে “সস্তা” কোনো দিকেই নেই। “same-price” reflexive, symmetric আর transitive, অর্থাৎ একটি equivalence relation, কিন্তু antisymmetric নয়, কারণ 2 আর 3 আলাদা পণ্য হয়েও দুই দিকে যুক্ত। দোষী তালিকায় antisymmetric-এর জন্য শুধু a < b দিকটি ছাপা হয়, যাতে একই জোড়া দুবার না আসে।
৫ · Relation গোনা — সূত্র, প্রমাণ আর যেখানে সূত্র নেই
|A| = n হলে A × A-এর n² ঘরকে দুই দলে ভাগ করা যায়: n-টি কর্ণের ঘর (a, a), আর বাকি n² − n ঘর, যারা আবার C(n, 2) = n(n − 1)/2টি অক্রমিক জোড়া {a, b}-এ সাজানো, প্রতিটিতে দুটি ঘর: (a, b) আর (b, a) ঘর দুটি। প্রতিটি ধর্ম এই ঘরগুলোর ওপর একটি শর্ত, আর পর্ব ৩১-এর গুণের নিয়ম বাকি কাজ করে।
|A| = n হলে A-এর ওপর
- মোট relation: 2n²
- reflexive (আর একইভাবে irreflexive): 2n(n−1)
- symmetric: 2n(n+1)/2
- antisymmetric: 2n · 3n(n−1)/2
- asymmetric: 3n(n−1)/2
- reflexive আর symmetric দুটিই: 2n(n−1)/2
- মোট: প্রতিটি relation n² ঘরের প্রতিটিতে 0 বা 1 বাছাই, তাই 2n². — গুণের নিয়ম
- Reflexive: n-টি কর্ণের ঘর বাধ্যতামূলক 1, বাকি n² − n = n(n − 1) ঘর স্বাধীন, তাই 2n(n−1). Irreflexive-এ কর্ণ বাধ্যতামূলক 0, বাকি একই। — গুণের নিয়ম
- Symmetric: কর্ণের n ঘর স্বাধীন, তাই 2n উপায়। প্রতিটি অক্রমিক জোড়া {a, b}-তে (a, b) আর (b, a) একসঙ্গে থাকবে বা একসঙ্গে থাকবে না: ২টি পছন্দ, এমন জোড়া n(n − 1)/2টি। মোট 2n · 2n(n−1)/2 = 2n(n+1)/2. — সূচকের যোগ
- Antisymmetric: কর্ণ স্বাধীন, তাই 2n উপায়। প্রতিটি {a, b}-তে “দুটিই” নিষিদ্ধ, তাই তিনটি পছন্দ: কোনোটি নয়, শুধু (a, b), শুধু (b, a). মোট 2n · 3n(n−1)/2. — গুণের নিয়ম
- Asymmetric: উপপাদ্য ৪.১ অনুযায়ী = irreflexive + antisymmetric: কর্ণ বাধ্যতামূলক 0, বাকি একই তিন পছন্দ, তাই 3n(n−1)/2. — উপপাদ্য ৪.১
- Reflexive আর symmetric: কর্ণ বাধ্যতামূলক 1, প্রতিটি {a, b}-তে ২টি পছন্দ: 2n(n−1)/2. ∎ — ধাপ ২ আর ৩ মিলিয়ে
1৯টি ঘর = ৩ কর্ণ + ৩ জোড়া2কর্ণ (1,1),(2,2),(3,3): 2³3{1,2}: ৩ পছন্দ4{1,3}: ৩ পছন্দ5{2,3}: ৩ পছন্দ6মিলিয়ে দেখা
| এই ধাপে | |
| পছন্দ | |
| গুণফল | |
| তুলনা |
- ঘর ভাগ। A × A-এ ৯টি ঘর: কর্ণের ৩টি (1,1), (2,2), (3,3), আর C(3, 2) = 3টি অক্রমিক জোড়া {1,2}, {1,3}, {2,3}, প্রতিটিতে দুটি ঘর। 3 + 3 · 2 = 9, কোনো ঘর বাদ পড়েনি।
- কর্ণ। Antisymmetry শুধু a ≠ b-এর কথা বলে, তাই (a, a) থাকা বা না থাকা মুক্ত: 23 = 8 উপায়।
- জোড়া {1, 2}. চারটি সম্ভাবনার মধ্যে “(1,2) আর (2,1) দুটিই” নিষিদ্ধ; থাকে কোনোটি নয়, শুধু (1, 2), শুধু (2, 1): ৩টি। এখন পর্যন্ত 8 × 3 = 24.
- জোড়া {1, 3}. একই যুক্তি, আগের পছন্দের ওপর নির্ভর করে না, কারণ antisymmetry প্রতিটি জোড়াকে আলাদাভাবে দেখে। 24 × 3 = 72.
- জোড়া {2, 3}. শেষ জোড়া: 72 × 3 = 216.
- মিলিয়ে দেখা। সূত্র 2n · 3n(n−1)/2 = 8 · 27 = 216, আর নিচের brute force-ও 216 দেয়। ৫১২টি relation-এর মধ্যে symmetric 64টি, আর দুটি ধর্মই আছে মাত্র 8টিতে: Δ-এর subset-গুলো (উপপাদ্য ৪.২)।
Transitive-এর সূত্র কেন নেই
ওপরের সব ধর্ম স্থানীয়: প্রতিটি শর্ত একটি ঘর বা একটি জোড়া {a, b}-এর কথা বলে, তাই ঘরগুলোর পছন্দ স্বাধীন আর গুণের নিয়ম খাটে। Transitivity তিনটি উপাদান a, b, c একসঙ্গে জড়ায়, আর একটি ঘরের পছন্দ অন্য অনেক ঘরকে বাধ্য করে: (1, 2) আর (2, 3) রাখলে (1, 3) রাখতেই হবে। পছন্দগুলো আর স্বাধীন নয়, আর n উপাদানের সেটে transitive relation-এর সংখ্যার কোনো সরল বদ্ধ সূত্র (closed form) জানা নেই। ছোট n-এ শুধু গুনে বের করা যায়: n = 1, 2, 3, 4-এ 2, 13, 171, 3994. Scratch-এ সারি ধরে backtracking দিয়ে n = 5-এ 154303 পাওয়া গেছে, যা OEIS-এর A006905 ক্রমের মানের সঙ্গে মেলে।
নিচের ব্লক n = 1, 2, 3-এ সব 2n²টি relation তালিকা করে প্রতিটি ধর্ম গোনে আর সূত্রের সঙ্গে মেলায়। n = 4-এ ৬৫৫৩৬টি relation-এর transitive-গুলো গোনে bitmask দিয়ে: প্রতিটি সারি একটি ৪-bit সংখ্যা, আর “(i, j) ∈ R হলে সারি j-এর সব 1 সারি i-তেও আছে” শর্তটিই transitivity: (i, j) আর (j, k) থাকলে (i, k)-ও থাকতে হবে। n = 5-এ 225, অর্থাৎ তিন কোটিরও বেশি relation; এই সরল brute force সেখানে ব্রাউজারে অনেক সময় নেবে, তাই এখানে থামি।
from itertools import product
def count(n): # relation = n x n 0-1 matrix M
c = dict(refl=0, sym=0, anti=0, asym=0, trans=0)
cells = [(i, j) for i in range(n) for j in range(n)]
for bits in product((0, 1), repeat=n * n):
M = dict(zip(cells, bits))
c["refl"] += all(M[i, i] for i in range(n))
c["sym"] += all(M[i, j] == M[j, i] for i, j in cells)
c["anti"] += all(not (M[i, j] and M[j, i]) for i, j in cells if i != j)
c["asym"] += all(not (M[i, j] and M[j, i]) for i, j in cells)
c["trans"] += all(M[i, k] for i, j in cells for k in range(n)
if M[i, j] and M[j, k])
return c
def formula(n):
return dict(refl=2 ** (n * (n - 1)), sym=2 ** (n * (n + 1) // 2),
anti=2 ** n * 3 ** (n * (n - 1) // 2),
asym=3 ** (n * (n - 1) // 2), trans="?")
for n in (1, 2, 3):
print(f"n={n} all={2 ** (n * n)}")
print(" brute ", count(n))
print(" formula", formula(n))
def transitive_rows(rows): # rows[i] = bitmask of j with (i, j) in R
return all(rows[j] & ~rows[i] == 0
for i in range(4) for j in range(4) if rows[i] >> j & 1)
t4 = sum(transitive_rows([(m >> 4 * i) & 15 for i in range(4)])
for m in range(1 << 16))
print("transitive relations on 4 elements:", t4, "of", 1 << 16)আসল আউটপুট (ব্রাউজারের Python):
n=1 all=2
brute {'refl': 1, 'sym': 2, 'anti': 2, 'asym': 1, 'trans': 2}
formula {'refl': 1, 'sym': 2, 'anti': 2, 'asym': 1, 'trans': '?'}
n=2 all=16
brute {'refl': 4, 'sym': 8, 'anti': 12, 'asym': 3, 'trans': 13}
formula {'refl': 4, 'sym': 8, 'anti': 12, 'asym': 3, 'trans': '?'}
n=3 all=512
brute {'refl': 64, 'sym': 64, 'anti': 216, 'asym': 27, 'trans': 171}
formula {'refl': 64, 'sym': 64, 'anti': 216, 'asym': 27, 'trans': '?'}
transitive relations on 4 elements: 3994 of 65536
প্রতিটি n-এ brute force আর সূত্র মিলেছে; শুধু transitive-এর ঘরে সূত্রের জায়গায় “?”। n = 3-এ antisymmetric 216, stepper-এর উত্তর। একটি মজার মিল: n = 3-এ reflexive আর symmetric দুটিরই সংখ্যা 64, কারণ n(n − 1) = 6 = n(n + 1)/2 শুধু n = 3-এ সত্য। কাকতালীয় মিল দেখে দুটি ধারণাকে এক ভাববেন না; n = 4-এ সংখ্যা দুটি 4096 আর 1024. Transitive relation n = 4-এ ৬৫৫৩৬টির মধ্যে মাত্র ৩৯৯৪টি, প্রায় ৬%; n বাড়লে এই অনুপাত দ্রুত কমে।
৬ · Relation জোড়া দেওয়া — union, intersection, difference আর inverse
Relation যেহেতু সেট, পর্ব ১৫ “সেটের অপারেশন — union, intersection, Venn diagram আর identity”-এর সব অপারেশন সরাসরি খাটে। R আর S দুটিই A থেকে B-তে হলে R ∪ S, R ∩ S, R − S, R ⊕ S সবই A থেকে B-তে relation. Matrix-এ union হলো ঘরে ঘরে ∨ (join, MR ∨ MS), আর intersection হলো ঘরে ঘরে ∧, যার নাম meet.
বাজারঘরের উদাহরণ। জানুয়ারির “কিনেছেন” relation K1 আর ফেব্রুয়ারির K2 হলে K1 ∪ K2 = “দুই মাসের যেকোনোটিতে কিনেছেন”, K1 ∩ K2 = “দুই মাসেই কিনেছেন” (নিয়মিত ক্রেতা-পণ্য জোড়া), আর K1 − K2 = “জানুয়ারিতে কিনেছেন কিন্তু ফেব্রুয়ারিতে আর কেনেননি”, যা মার্কেটিং দলের জন্য একটি কাজের তালিকা।
R ⊆ A × B হলে তার inverse R−1 = {(b, a) : (a, b) ∈ R} ⊆ B × A. অর্থাৎ প্রতিটি জোড়া উল্টে দেওয়া; matrix-এ MR−1 = MRT, আর digraph-এ প্রতিটি তীরের দিক উল্টো।
“কিনেছেন”-এর inverse হলো “কেনা হয়েছে … দ্বারা”, আর ℤ-এ <-এর inverse হলো >. ফাংশনের ক্ষেত্রে inverse relation f−1 সবসময় আছে, কিন্তু সেটি নিজে একটি ফাংশন হয় ঠিক তখন, যখন f bijection (পর্ব ১৬)। Inverse দিয়ে ধর্মগুলোর ছোট রূপ পাওয়া যায়: R symmetric ⇔ R = R−1; R antisymmetric ⇔ R ∩ R−1 ⊆ ΔA; R asymmetric ⇔ R ∩ R−1 = ∅. প্রতিটি সংজ্ঞা থেকে সরাসরি আসে।
কোন ধর্ম অপারেশনে টিকে থাকে
একটি স্বাভাবিক প্রশ্ন: R আর S দুটিরই একটি ধর্ম থাকলে R ∪ S বা R ∩ S-এর কি সেটি থাকে? Reflexive আর symmetric union আর intersection দুটিতেই টেকে (সংজ্ঞা থেকে সরাসরি)। কিন্তু transitive-এর গল্প আলাদা।
R আর S দুটিই A-এর ওপর transitive হলে R ∩ S transitive. কিন্তু R ∪ S transitive না-ও হতে পারে।
- (a, b) ∈ R ∩ S আর (b, c) ∈ R ∩ S নিন। তাহলে (a, b), (b, c) ∈ R. — intersection-এর সংজ্ঞা
- R transitive, তাই (a, c) ∈ R; একইভাবে (a, b), (b, c) ∈ S থেকে (a, c) ∈ S. — transitivity দুবার
- তাই (a, c) ∈ R ∩ S, অর্থাৎ R ∩ S transitive. — intersection-এর সংজ্ঞা
- Union-এর counterexample: A = {1, 2}-এ R = {(1, 2)} আর S = {(2, 1)}. প্রতিটি একটিমাত্র জোড়ার relation, তাই কোনো দুই-ধাপ পথ নেই আর দুটিই transitive. কিন্তু R ∪ S = {(1, 2), (2, 1)}-এ 1 → 2 → 1 পথ আছে, অথচ (1, 1) নেই। ∎
এই অসমতার একটি গভীর পরিণাম আছে: যেকোনো R-কে ধারণ করে এমন সব transitive relation-এর intersection আবার transitive, আর সেটিই R-কে ধারণকারী সবচেয়ে ছোট transitive relation, যার নাম transitive closure. পরের পর্ব ৫৪ “Relation-এর closure আর Warshall-এর algorithm”-এ এটিই মূল বিষয়।
৭ · Composition, power আর একটি মূল উপপাদ্য
বাজারঘরের তিনটি গুদাম W = {G1, G2, G3}, তিনটি বিতরণ hub H = {h1, h2, h3}, আর তিনটি জেলা D = {ঢাকা, খুলনা, সিলেট}. R ⊆ W × H বলে কোন গুদাম কোন hub-এ মাল পাঠায়, আর S ⊆ H × D বলে কোন hub কোন জেলায় দেয়। প্রশ্ন: কোন গুদামের মাল কোন জেলায় পৌঁছাতে পারে? উত্তর একটি নতুন relation, যা দুটি relation “জোড়া দিয়ে” পাওয়া।
R ⊆ A × B আর S ⊆ B × C হলে R আর S-এর composite
S∘R = {(a, c) ∈ A × C : কোনো b ∈ B-এর জন্য (a, b) ∈ R আর (b, c) ∈ S}
অর্থাৎ আগে R ধরে a থেকে কোনো b-তে, তারপর S ধরে b থেকে c-তে।
লেখার ক্রমটি খেয়াল করুন: S∘R-এ R আগে প্রয়োগ হয়, যদিও ডানে লেখা। কারণ এটি ফাংশনের composition-এর সঙ্গে মিলিয়ে রাখা হয়েছে: f আর g ফাংশন হলে, relation হিসেবে g∘f ঠিক পর্ব ১৬-এর composition (g∘f)(a) = g(f(a)), যেখানে f আগে। কিছু বই (আর relational algebra) উল্টো ক্রমে R;S লেখে; বই পড়ার সময় কোন রীতি তা আগে দেখে নিন।
সসীম সেটে MS∘R = MR ⊙ MS, যেখানে ⊙ হলো Boolean product.
- (MR ⊙ MS)ij = ⋁k (rik ∧ skj), অর্থাৎ 1 ঠিক তখন, যখন কোনো k-এর জন্য rik = 1 আর skj = 1. — Boolean product-এর সংজ্ঞা, পর্ব ১৯
- rik = 1 মানে (ai, bk) ∈ R, আর skj = 1 মানে (bk, cj) ∈ S. — 0-1 matrix-এর সংজ্ঞা
- তাই ঘরটি 1 ঠিক তখন, যখন কোনো bk মধ্যবর্তী হিসেবে আছে, যা (ai, cj) ∈ S∘R-এর সংজ্ঞা। ∎ — সংজ্ঞা ৭.১
এখানেও ক্রম: matrix-এ R বাঁয়ে, composition-এর চিহ্নে R ডানে। এই অদলবদলটি পরীক্ষায় একটি প্রিয় ফাঁদ।
1R: গুদাম → hub2S: hub → জেলা3G1-এর সব পথ4G2-এর সব পথ5G3-এর সব পথ6M_R ⊙ M_S দিয়ে মেলানো
| এখন | |
| পথ | |
| যোগ হলো | |
| S∘R-এ মোট |
- প্রথম relation R. গুদাম থেকে hub: (G1, h1), (G1, h2), (G2, h3), (G3, h2). MR-এর সারি G1, G2, G3: [1 1 0], [0 0 1], [0 1 0].
- দ্বিতীয় relation S. hub থেকে জেলা: (h1, ঢাকা), (h2, খুলনা), (h2, সিলেট), (h3, ঢাকা). MS-এর সারি h1, h2, h3: [1 0 0], [0 1 1], [1 0 0].
- G1. R-এ G1 যায় h1 আর h2-তে। S-এ h1 থেকে ঢাকা, h2 থেকে খুলনা আর সিলেট। তাই (G1, ঢাকা), (G1, খুলনা), (G1, সিলেট) তিনটিই S∘R-এ।
- G2. G2 শুধু h3-তে, আর h3 শুধু ঢাকায়: (G2, ঢাকা). মোট এখন ৪টি জোড়া।
- G3. G3 শুধু h2-তে, আর h2 থেকে খুলনা আর সিলেট: (G3, খুলনা), (G3, সিলেট). মোট ৬টি জোড়া।
- Matrix দিয়ে মেলানো। MR ⊙ MS-এর সারি G1 = সারি h1 ∨ সারি h2 = [1 1 1]; সারি G2 = সারি h3 = [1 0 0]; সারি G3 = সারি h2 = [0 1 1]. হাতের ৬টি জোড়ার সঙ্গে হুবহু মেলে। এখানে R∘S সংজ্ঞায়িতই নয়, কারণ S-এর শেষ সেট (জেলা) R-এর শুরুর সেট (গুদাম) নয়।
R ⊆ A × B, S ⊆ B × C, T ⊆ C × D হলে T∘(S∘R) = (T∘S)∘R.
- (a, d) ∈ T∘(S∘R) ⇔ কোনো c-এর জন্য (a, c) ∈ S∘R আর (c, d) ∈ T. — সংজ্ঞা ৭.১
- ⇔ কোনো c আর কোনো b-এর জন্য (a, b) ∈ R, (b, c) ∈ S আর (c, d) ∈ T. — S∘R-এর সংজ্ঞা খুলে, ∃-গুলো সামনে আনা (পর্ব ৫)
- ⇔ কোনো b-এর জন্য (a, b) ∈ R আর [কোনো c-এর জন্য (b, c) ∈ S, (c, d) ∈ T]. — একই ধরনের দুটি ∃-এর ক্রম বদলানো যায়
- ⇔ কোনো b-এর জন্য (a, b) ∈ R আর (b, d) ∈ T∘S ⇔ (a, d) ∈ (T∘S)∘R. ∎ — সংজ্ঞা ৭.১ দুবার
দুই পাশই বলে একই কথা: “a থেকে R, S, T ধরে তিন ধাপে d-তে যাওয়া যায়”। কিন্তু composition commutative নয়: A = {1, 2, 3}-এ R = {(1, 2), (2, 3)} আর S = {(2, 1), (3, 3)} হলে S∘R = {(1, 1), (2, 3)}, অথচ R∘S = {(2, 2)}. ফাংশনের মতোই, আগে মোজা পরে জুতা আর আগে জুতা পরে মোজা এক নয়।
Power আর transitivity
A-এর ওপর R-এর জন্য R1 = R, আর n ≥ 1-এ Rn+1 = Rn∘R. ফলে (a, b) ∈ Rn ঠিক তখন, যখন digraph-এ a থেকে b-তে ঠিক n দৈর্ঘ্যের একটি পথ (walk) আছে; matrix-এ MRn = MR[n], Boolean power.
উদাহরণ: {1, 2, 3}-এ R = {(1, 2), (2, 3), (3, 1)}, একটি তিন-জোনের চক্রাকার রুট। R2 = {(1, 3), (2, 1), (3, 2)} (দুই ধাপ সামনে), আর R3 = {(1, 1), (2, 2), (3, 3)} = Δ: তিন ধাপে সবাই নিজের জায়গায় ফেরে। R2 ⊄ R, আর এটিই বলে দেয় R transitive নয়, নিচের উপপাদ্য অনুযায়ী।
A-এর ওপর R transitive যদি এবং কেবল যদি সব n ≥ 1-এর জন্য Rn ⊆ R.
- (⇐) n = 2 নিন: R2 ⊆ R. এখন (a, b), (b, c) ∈ R হলে সংজ্ঞা অনুযায়ী (a, c) ∈ R∘R = R2 ⊆ R. তাই R transitive. — সংজ্ঞা ৭.১ আর ৭.৪
- (⇒) R transitive ধরুন। n-এর ওপর induction করি। ভিত্তি n = 1: R1 = R ⊆ R. — পর্ব ১০
- Inductive hypothesis: কোনো n ≥ 1-এর জন্য Rn ⊆ R. — ধরে নেওয়া
- (a, c) ∈ Rn+1 = Rn∘R নিন। সংজ্ঞা অনুযায়ী কোনো b আছে, যাতে (a, b) ∈ R আর (b, c) ∈ Rn. — সংজ্ঞা ৭.১
- Hypothesis থেকে (b, c) ∈ R; তাই (a, b), (b, c) ∈ R, আর transitivity থেকে (a, c) ∈ R. অর্থাৎ Rn+1 ⊆ R. ∎ — transitivity
উপপাদ্যটির অর্থ সহজ: transitive relation-এ “যতো ধাপেই যাওয়া যাক, সরাসরি তীর আছে”। আর §৩-এর matrix-শর্ত “M ⊙ M ≤ M” হলো ধাপ ১-এর R2 ⊆ R, উপপাদ্য ৭.২ দিয়ে matrix-এ লেখা। উপপাদ্যটি একটি algorithm-এর দিকেও ইঙ্গিত দেয়: R ∪ R2 ∪ R3 ∪ ⋯ নিলে একটি transitive relation পাওয়া যায়, আর n উপাদানের সেটে Rn-এর পর নতুন কিছু আসে না। এর প্রমাণ আর দ্রুত Warshall algorithm পর্ব ৫৪-এ।
নিচের প্রথম ব্লক stepper-এর composition জোড়ার সেট আর Boolean product দুই পথে বের করে মেলায়, তারপর নির্দিষ্ট seed-এ ১০০০টি এলোমেলো relation-ত্রয়ীতে উপপাদ্য ৭.২ আর ৭.৩ পরীক্ষা করে, আর গোনে কয়বার S∘R = R∘S হয়। দ্বিতীয় ব্লক {0, 1, 2}-এর সব ৫১২টি relation-এ উপপাদ্য ৭.৫ আর ৬.২ যাচাই করে।
import random
random.seed(52)
def compose(S, R): # S o R: first R, then S
return {(a, c) for (a, b) in R for (b2, c) in S if b == b2}
def matrix(R, X, Y):
return [[int((x, y) in R) for y in Y] for x in X]
def bool_product(P, Q): # (P . Q)[i][j] = OR_k (P[i][k] AND Q[k][j])
return [[int(any(P[i][k] and Q[k][j] for k in range(len(Q))))
for j in range(len(Q[0]))] for i in range(len(P))]
W, H, D = ["G1", "G2", "G3"], ["h1", "h2", "h3"], ["Dhaka", "Khulna", "Sylhet"]
R = {("G1", "h1"), ("G1", "h2"), ("G2", "h3"), ("G3", "h2")}
S = {("h1", "Dhaka"), ("h2", "Khulna"), ("h2", "Sylhet"), ("h3", "Dhaka")}
SR = compose(S, R)
print("S o R =", sorted(SR))
print("M_R . M_S =", bool_product(matrix(R, W, H), matrix(S, H, D)))
print("M_(S o R) =", matrix(SR, W, D))
A = range(5) # random relations on a 5-element set
def rand_rel(p=0.3):
return {(a, b) for a in A for b in A if random.random() < p}
same_matrix = assoc = commute = 0
for _ in range(1000):
R1, R2, R3 = rand_rel(), rand_rel(), rand_rel()
M = bool_product(matrix(R1, A, A), matrix(R2, A, A))
same_matrix += M == matrix(compose(R2, R1), A, A)
assoc += compose(R3, compose(R2, R1)) == compose(compose(R3, R2), R1)
commute += compose(R2, R1) == compose(R1, R2)
print("matrix rule held:", same_matrix, "/ 1000")
print("associativity held:", assoc, "/ 1000")
print("S o R == R o S in:", commute, "/ 1000")আসল আউটপুট (ব্রাউজারের Python):
S o R = [('G1', 'Dhaka'), ('G1', 'Khulna'), ('G1', 'Sylhet'), ('G2', 'Dhaka'), ('G3', 'Khulna'), ('G3', 'Sylhet')]
M_R . M_S = [[1, 1, 1], [1, 0, 0], [0, 1, 1]]
M_(S o R) = [[1, 1, 1], [1, 0, 0], [0, 1, 1]]
matrix rule held: 1000 / 1000
associativity held: 1000 / 1000
S o R == R o S in: 1 / 1000
প্রথম তিন লাইন stepper-এর ৬টি জোড়া আর matrix হুবহু দেয়। তারপর ১০০০টি এলোমেলো উদাহরণের প্রতিটিতে matrix-এর নিয়ম আর associativity মিলেছে, যেমনটি প্রমাণ বলে। কিন্তু S∘R = R∘S হয়েছে ১০০০-এ মাত্র ১বার: composition-এর ক্রম প্রায় সবসময় গুরুত্বপূর্ণ। মনে রাখবেন, ১০০০টি সফল পরীক্ষা কোনো প্রমাণ নয়; প্রমাণ দিয়েছে উপপাদ্য ৭.২ আর ৭.৩, পরীক্ষা শুধু আস্থা বাড়ায় আর টাইপের ভুল ধরে।
from itertools import product
A = range(3)
pairs = [(a, b) for a in A for b in A]
rels = [frozenset(p for p, x in zip(pairs, bits) if x)
for bits in product((0, 1), repeat=9)]
def compose(S, R):
return frozenset((a, c) for (a, b) in R for (b2, c) in S if b == b2)
def transitive(R):
return compose(R, R) <= R
def powers_inside(R, upto=4): # is R^n a subset of R for n = 1..upto?
P = R
for _ in range(upto - 1):
P = compose(R, P) # R^(n+1) = R o R^n
if not P <= R:
return False
return True
agree = sum(transitive(R) == powers_inside(R) for R in rels)
print("transitive <=> R^n in R (n<=4):", agree, "of", len(rels))
T = [R for R in rels if transitive(R)]
print("transitive relations on 3 elements:", len(T))
inter = all(transitive(R & S) for R in T for S in T)
print("intersection of two transitive is transitive:", inter)
for R in T: # look for a union that breaks it
S = next((S for S in T if not transitive(R | S)), None)
if S and len(R) == len(S) == 1:
print("union counterexample:", sorted(R), "+", sorted(S),
"->", sorted(R | S))
break
inv = all(frozenset((b, a) for a, b in R) in set(T) for R in T)
print("inverse of transitive is transitive:", inv)আসল আউটপুট (ব্রাউজারের Python):
transitive <=> R^n in R (n<=4): 512 of 512
transitive relations on 3 elements: 171
intersection of two transitive is transitive: True
union counterexample: [(2, 1)] + [(1, 2)] -> [(1, 2), (2, 1)]
inverse of transitive is transitive: True
৫১২টি relation-এর প্রত্যেকটিতে “transitive” আর “R, R2, R3, R4 সব R-এর ভেতরে” একই উত্তর দিয়েছে, উপপাদ্য ৭.৫-এর একটি সসীম যাচাই (n ≤ 4 পর্যন্ত)। ১৭১টি transitive relation-এর সব জোড়ার (১৭১ × ১৭১) intersection transitive, উপপাদ্য ৬.২-এর প্রথম অংশ। Union-এর জন্য কোডটি একটি-জোড়ার relation-এর মধ্যে প্রথম counterexample খুঁজে পেয়েছে: {(2, 1)} আর {(1, 2)}, ঠিক প্রমাণের ধাপ ৪-এর উদাহরণ (নাম 1 আর 2 অদলবদল)। শেষ লাইন একটি সহজ সত্য দেখায়: transitive relation-এর inverse-ও transitive, কারণ সব তীর উল্টালে দুই-ধাপ পথ আর তার শর্টকাট দুটিই একসঙ্গে উল্টে যায়।
৮ · পরীক্ষার অঙ্ক, প্রয়োগ আর একটি ভুল প্রমাণ
অঙ্ক ১: ধর্ম মিলিয়ে গোনা
A = {1, 2, 3}-এর ওপর (ক) কয়টি relation reflexive আর symmetric দুটিই? (খ) কয়টি reflexive-ও নয়, irreflexive-ও নয়?
- (ক) উপপাদ্য ৫.১: 2n(n−1)/2 = 23 = 8. কর্ণ বাধ্যতামূলক 1, আর তিনটি অক্রমিক জোড়ার প্রতিটি থাকবে বা থাকবে না।
- (খ) মোট 512 থেকে reflexive 64 আর irreflexive 64 বাদ দিন। n ≥ 1-এ কোনো relation একসঙ্গে দুটিই হতে পারে না (কর্ণের একটি ঘর একসঙ্গে 0 আর 1 নয়), তাই পর্ব ৪৯-এর inclusion–exclusion-এ ছেদ 0. উত্তর 512 − 64 − 64 = 384 (scratch-এ brute force দিয়ে মেলানো)।
অঙ্ক ২: Power দিয়ে transitivity
{1, 2, 3}-এ R = {(1, 2), (2, 3), (3, 1)}. R2 আর R3 বের করে বলুন R transitive কি না।
- R2: 1 → 2 → 3 দেয় (1, 3); 2 → 3 → 1 দেয় (2, 1); 3 → 1 → 2 দেয় (3, 2). R2 = {(1, 3), (2, 1), (3, 2)}.
- R3 = R2∘R: 1 → 2, তারপর R2-এ 2 → 1, তাই (1, 1); একইভাবে (2, 2), (3, 3). R3 = Δ.
- (1, 3) ∈ R2 কিন্তু (1, 3) ∉ R, তাই R2 ⊄ R, আর উপপাদ্য ৭.৫ অনুযায়ী R transitive নয়। সরাসরি দোষী: (1, 2), (2, 3) আছে কিন্তু (1, 3) নেই।
অঙ্ক ৩: বিভাজ্যতা relation
A = {1, 2, 3, 4, 6, 12}-এর ওপর “a ∣ b” relation-এ কয়টি জোড়া, আর কোন ধর্মগুলো আছে?
- প্রতিটি a-এর জন্য A-তে তার গুণিতক গুনি: 1 → ৬টি; 2 → 2, 4, 6, 12 (৪টি); 3 → 3, 6, 12 (৩টি); 4 → 4, 12 (২টি); 6 → 6, 12 (২টি); 12 → ১টি। মোট 18টি জোড়া (scratch-এ গুনে মেলানো)।
- Reflexive (a ∣ a), antisymmetric (ধনাত্মকে a ∣ b আর b ∣ a হলে a = b), transitive (a ∣ b, b ∣ c হলে c = b·k = a·j·k, তাই a ∣ c হয়)। Symmetric নয় (2 ∣ 4, 4 ∤ 2), irreflexive নয়, asymmetric নয়। তিনটি ধর্ম মিলে একটি partial order, যার ছবি (Hasse diagram) পর্ব ৫৬-এ আঁকা হবে।
প্রয়োগ: কোথায় এই ধর্মগুলো কাজে লাগে
ডেটাবেসে প্রতিটি টেবিল একটি relation; ধর্ম আর composition-এর ধারণা থেকেই join আর query-র বীজগণিত আসে (ডেটাবেস ও SQL কোর্সের পর্ব ০৫ “Relational model — relation, tuple, attribute আর domain”, আর গণিতের দিক পর্ব ৫৩-এ)। কোনো build system বা বাজারঘরের অর্ডার-প্রক্রিয়ায় “x-এর আগে y” relation-কে asymmetric রাখতে হয়, নইলে চক্র তৈরি হয় আর কাজ শুরুই হয় না; তার transitive রূপ দিয়ে সব পরোক্ষ নির্ভরতা পাওয়া যায় (DSA কোর্সের পর্ব ৪২ “Topological sort আর DAG” দেখুন)। আর হিসাবের সফটওয়্যারে একটি “সমান” তুলনা reflexive, symmetric আর transitive না হলে sorting আর hashing ভুল ফল দেয়; floating-point-এ “প্রায় সমান” তুলনা transitive নয়, ঠিক §৪-এর |a − b| ≤ 1-এর মতো।
যুক্তির ভুল ধরুন: “symmetric আর transitive হলে reflexive”
একজন লিখলেন: “দাবি: R symmetric আর transitive হলে R reflexive. প্রমাণ: যেকোনো a ∈ A নিন। ধরুন (a, b) ∈ R. Symmetry থেকে (b, a) ∈ R. তাহলে (a, b) আর (b, a) থেকে transitivity অনুযায়ী (a, a) ∈ R. তাই R reflexive. ∎”
ভুল কোথায়: “ধরুন (a, b) ∈ R” ধাপটি ধরে নেয় যে a-এর অন্তত একটি সঙ্গী b আছে। a যদি কারও সঙ্গেই যুক্ত না থাকে, তাহলে যুক্তিটি শুরুই হয় না। Counterexample: A = {1, 2}-এ R = {(1, 1)}. R symmetric (একমাত্র জোড়ার উল্টো সে নিজেই), transitive (একমাত্র দুই-ধাপ পথ 1 → 1 → 1, আর (1, 1) আছে), কিন্তু (2, 2) নেই, তাই reflexive নয়। খালি relation ∅ আরও সরল counterexample. সঠিক বক্তব্য যা প্রমাণটি আসলে দেখায়: symmetric আর transitive R-এ যে a কারও সঙ্গে যুক্ত, তার জন্য (a, a) ∈ R থাকে। এই ভুলটি পর্ব ৫৫-এ equivalence relation-এর আলোচনায় আবার কাজে লাগবে: তিনটি শর্তের কোনোটিই বাড়তি নয়।
আরও গভীরে: Relation-কে নিজস্ব বীজগণিত হিসেবে দেখার ধারা উনিশ শতকে De Morgan আর Charles S. Peirce-এর কাজ থেকে শুরু হয় বলে ধরা হয়, আর Alfred Tarski ১৯৪১ সালে তাকে “relation algebra” নামে একটি স্বতঃসিদ্ধ কাঠামো দেন বলে জানা যায়: union, intersection, complement, composition আর inverse নিয়ে একটি বীজগণিত। Composition-এর ⊙ গুণ আরও সাধারণ “semiring”-এর একটি দৃষ্টান্ত; ∨/∧-এর জায়গায় min/+ বসালে একই ছকে সবচেয়ে ছোট পথের হিসাব আসে, যা Floyd–Warshall আর আধুনিক graph algorithm-এর ভিত। আর transitive relation-এর সংখ্যা n বড় হলে প্রায় 2n²/4-এর ক্রমে বাড়ে বলে জানা যায় (ভাবনার প্রশ্ন ২-এ নিচের সীমার প্রমাণ)।
পরীক্ষা ও ইন্টারভিউতে: বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই ধরনের প্রশ্ন প্রায়ই আসে:
- n উপাদানের সেটে কয়টি symmetric relation? 2n(n+1)/2; n = 4-এ 1024.
- Antisymmetric আর “symmetric নয়” কি এক? না; Δ দুটিই রাখে, আর {(1,2), (2,1), (2,3)} কোনোটিই রাখে না।
- খালি relation কোন ধর্মগুলো রাখে? irreflexive, symmetric, antisymmetric, asymmetric, transitive; A ≠ ∅ হলে reflexive নয়।
- MS∘R কত? MR ⊙ MS; ক্রম উল্টে যায়।
- Matrix দেখে transitive কীভাবে চিনবেন? M ⊙ M ≤ M, অর্থাৎ M[2]-এর প্রতিটি 1-এর জায়গায় M-এও 1.
৯ · AI-এর যুগে — relation-এর প্রশ্নে AI-এর উত্তর যাচাই
Relation-এর প্রশ্ন ছোট আর নিয়মমাফিক দেখায়, তাই AI সহকারীরা আত্মবিশ্বাসী উত্তর দেয়। কিন্তু ঠিক এই ধরনের প্রশ্নে কয়েকটি নিয়মিত ভুল দেখা যায়, যা একটি ছোট brute force দিয়েই ধরা পড়ে।
| AI-এর ভুল | কীভাবে ধরবেন |
|---|---|
| “symmetric নয়, তাই antisymmetric” বা উল্টোটা | সংজ্ঞা আবার লিখুন; Δ আর {(1,2),(2,1),(2,3)} দিয়ে পরীক্ষা করুন |
| খালি relation বা self-loop-এর ক্ষেত্রে vacuous truth ভুলে যাওয়া | ∅ আর {(1,1)}-এর মতো প্রান্তিক উদাহরণ আলাদা করে দেখুন |
| গোনায় off-by-one: কর্ণ বা অক্রমিক জোড়া দুবার গোনা, n(n − 1) আর n(n − 1)/2 গুলিয়ে ফেলা | n = 2, 3-এ সব relation তালিকা করে সংখ্যা মেলান |
| Transitive relation-এর একটি “সূত্র” বানিয়ে দেওয়া | n = 3-এ 171, n = 4-এ 3994-এর সঙ্গে মেলান; না মিললে সূত্রটি ভুল |
| S∘R-এর ক্রম উল্টে ফেলা, বা matrix-এ MS ⊙ MR লেখা | ছোট উদাহরণে জোড়া ধরে composition আর matrix দুটিই হিসাব করুন |
| “symmetric + transitive ⇒ reflexive” ধরনের প্রমাণ, যা একটি অস্তিত্ব ধরে নেয় | প্রতিটি “ধরুন … আছে” ধাপে জিজ্ঞেস করুন: সত্যিই আছে কি? |
AI-এর কাছে relation-এর প্রশ্নের সমাধান চাইলে এমনভাবে চান, যাতে প্রতিটি দাবি যাচাই করা যায়:
AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট
Relation-এর সৌন্দর্য হলো, ছোট সেটে সবকিছু সম্পূর্ণ তালিকা করা যায়: তিন উপাদানে মাত্র ৫১২টি relation, যা Python এক সেকেন্ডের কম সময়ে দেখে ফেলে। তাই AI যা-ই দাবি করুক, ছোট n-এ পূর্ণ গণনা একটি নিরপেক্ষ বিচারক। প্রমাণ বলে কেন সত্য, আর brute force বলে অন্তত ছোট ক্ষেত্রে মিথ্যা নয়; দুটি একসঙ্গে থাকলে তবেই ভরসা করুন।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১“Relation মানে জোড়ার সেট” সংজ্ঞাটি কবে আর কীভাবে এল? Ordered pair-কেও কেন সেট দিয়ে সংজ্ঞায়িত করতে হলো?
Aristotle থেকে শুরু করে দুই হাজার বছরের প্রথাগত যুক্তিবিদ্যা প্রায় পুরোটাই “সব মানুষ মরণশীল” ধরনের এক-স্থানের বিধেয় (predicate) নিয়ে কাজ করত। “ক, খ-এর চেয়ে বড়” বা “ক, খ-কে ভালোবাসে” ধরনের দুই-স্থানের কথা সেই কাঠামোয় ঠিকমতো ধরা যেত না; ফলে “ঘোড়া একটি প্রাণী, তাই ঘোড়ার মাথা একটি প্রাণীর মাথা” ধরনের সরল যুক্তিও প্রথাগত syllogism দিয়ে প্রমাণ করা কঠিন ছিল। উনিশ শতকের মাঝামাঝি Augustus De Morgan এই অভাবটি স্পষ্ট করে relation-এর যুক্তি নিয়ে লেখেন বলে জানা যায় (সাধারণত ১৮৬০-এর দিকের একটি প্রবন্ধের কথা বলা হয়), আর Charles S. Peirce ১৮৭০ সালের দিকে “logic of relatives” নামে relation-এর composition আর inverse-এর একটি বীজগণিত গড়েন বলে উল্লেখ করা হয়। Ernst Schröder পরে এই কাজকে বড় আকারে গুছিয়ে লেখেন।
কিন্তু “relation = জোড়ার সেট” সংজ্ঞাটি পুরোপুরি সেট-তাত্ত্বিক হতে আরেকটি সমস্যা সমাধান করতে হয়েছিল: ordered pair (a, b) নিজে কী? সেট {a, b}-এ ক্রম নেই: {a, b} = {b, a}. বিশ শতকের শুরুতে Norbert Wiener (১৯১৪ সালে বলে জানা যায়) একটি সেট-তাত্ত্বিক সংজ্ঞা দেন, আর Kazimierz Kuratowski ১৯২১ সালে আজকের প্রচলিত সংজ্ঞা দেন বলে উল্লেখ করা হয়: (a, b) = {{a}, {a, b}}. এই সংজ্ঞায় একটি মাত্র ধর্মই জরুরি, যা পর্ব ১৪-এ দেখেছেন: (a, b) = (c, d) ঠিক তখন, যখন a = c আর b = d. প্রমাণ সহজ case analysis: a = b হলে সেটটি {{a}}, নইলে দুটি আলাদা সদস্য, আর একক-সদস্যের সেটটি প্রথম উপাদান বলে দেয়।
এর ফলে গণিতের প্রায় সবকিছু একটি ভাষায় চলে আসে: ordered pair একটি সেট, relation জোড়ার সেট, ফাংশন একটি বিশেষ relation, আর পূর্ণসংখ্যা থেকে বাস্তব সংখ্যা পর্যন্ত সবকিছু সেট দিয়ে গড়া যায়। ব্যবহারিক দিকে এই দৃষ্টিভঙ্গির গুরুত্ব হলো: “সম্পর্ক” নিয়ে প্রশ্নকে সেটের প্রশ্নে বদলানো যায়, আর তাই গোনা, তুলনা আর কম্পিউটারে রাখা সহজ হয়। একটি relational database-এর টেবিল ঠিক এই ধারণার প্রকৌশল রূপ (পর্ব ৫৩)।
তবে একটি সতর্কতা: সেট দিয়ে সংজ্ঞায়িত করা মানে এই নয় যে আমরা ordered pair-কে প্রতিদিন {{a}, {a, b}} হিসেবে ভাবি। সংজ্ঞার কাজ শুধু নিশ্চিত করা যে ধারণাটি সুসংগত, আর দরকারি ধর্মটি প্রমাণযোগ্য। কোডে একটি tuple ঠিক একই কাজ করে, ভিন্ন উপায়ে।
মূল উপলব্ধি: প্রথাগত যুক্তিবিদ্যার দুই-স্থানের সম্পর্ক ধরতে না পারার অভাব থেকে De Morgan আর Peirce relation-এর বীজগণিত শুরু করেন বলে জানা যায়; আর Kuratowski-র ordered pair-এর সংজ্ঞা relation-কে পুরোপুরি সেটের ভাষায় আনে।
প্র ০২Transitive relation-এর কোনো সরল সূত্র নেই, তবু কি তাদের সংখ্যার আকার সম্পর্কে কিছু প্রমাণ করা যায়? একটি নিচের সীমা দিন।
হ্যাঁ, আর একটি সুন্দর নিচের সীমা এক অনুচ্ছেদেই প্রমাণ করা যায়। A-কে দুই ভাগে ভাগ করুন: L (“নিচের” অর্ধেক) আর U (“ওপরের” অর্ধেক), |L| = ⌊n/2⌋, |U| = ⌈n/2⌉. এখন L × U-এর যেকোনো subset R নিন: প্রতিটি তীর L থেকে U-তে যায়। এমন R-এ কোনো দুই-ধাপ পথ নেই, কারণ একটি তীর U-তে শেষ হয় আর U থেকে কোনো তীর শুরু হয় না। দুই-ধাপ পথ না থাকলে transitivity-র শর্ত কখনো সক্রিয় হয় না, তাই এমন প্রতিটি R শূন্যভাবে transitive. এদের সংখ্যা 2|L|·|U| = 2⌊n²/4⌋. সুতরাং transitive relation অন্তত 2⌊n²/4⌋টি। n = 4-এ এই সীমা 24 = 16, আসল সংখ্যা 3994; n = 10-এ সীমা 225, তিন কোটির বেশি।
আশ্চর্যের বিষয়, এই সরল নির্মাণটি মূল সূচকটি ঠিকই ধরে। Partial order-এর ক্ষেত্রে Daniel Kleitman আর Bruce Rothschild ১৯৭০-এর দশকে দেখান যে n উপাদানে partial order-এর সংখ্যার log2 প্রায় n²/4, আর প্রায় সব partial order মাত্র তিন “স্তরের” (প্রায় ওপরের মতো গঠন) বলে জানা যায়। Transitive relation-এর ক্ষেত্রেও সংখ্যাটি 2n²/4 + o(n²) ক্রমের বলে উল্লেখ করা হয়। অর্থাৎ “সব relation” 2n²-এর তুলনায় transitive relation অতি নগণ্য অংশ: সূচক n² থেকে নেমে প্রায় n²/4. এটিই ব্যাখ্যা করে কেন brute force-এ n = 4-এ মাত্র ৬% transitive, আর n বাড়লে অনুপাতটি দ্রুত শূন্যের দিকে যায়।
সঠিক মান কীভাবে পাওয়া যায়? এই পর্বের scratch-কাজে সারি ধরে backtracking (একটি সারি বসিয়ে তখনই শর্ত পরীক্ষা) n = 5-এ 154303 দিয়েছে, যা OEIS-এর A006905 ক্রমের সঙ্গে মেলে। বড় n-এর জন্য গবেষকেরা আরও চতুর পদ্ধতি ব্যবহার করেন: প্রতিটি transitive relation-কে একটি “preorder” আর অতিরিক্ত তথ্যে ভাঙা, বা symmetry কাজে লাগিয়ে শুধু isomorphism শ্রেণি গোনা (পর্ব ৫১-এর Burnside-এর ধারণা)। তবু সঠিক মান এখন মাত্র কিছু ছোট n পর্যন্ত জানা বলে মনে করা হয়; সংখ্যাটির কোনো বদ্ধ সূত্র জানা নেই।
এখান থেকে একটি সাধারণ শিক্ষা: যখন সঠিক গণনা অসম্ভব, তখন একটি পরিষ্কার নির্মাণ দিয়ে নিচের সীমা আর একটি গণনা-যুক্তি দিয়ে ওপরের সীমা দেওয়া combinatorics-এর নিয়মিত পদ্ধতি। ওপরের সীমা 2n² তুচ্ছ; সেটিকে 2n²/4 + o(n²)-এ নামানোই কঠিন কাজ।
মূল উপলব্ধি: L থেকে U-তে যাওয়া সব relation শূন্যভাবে transitive, তাই অন্তত 2⌊n²/4⌋টি transitive relation আছে; আর এই সূচক n²/4-ই আসল বৃদ্ধির হার বলে জানা যায়।
প্র ০৩বাস্তব জীবনের “পছন্দ” কি সবসময় transitive? ভোটে আর পাশায় transitivity ভাঙার বিখ্যাত উদাহরণগুলো কী শেখায়?
অর্থনীতি আর সিদ্ধান্ত-তত্ত্বে “যুক্তিসঙ্গত পছন্দ” মানে প্রায়ই একটি transitive relation: আমি চা-কে কফির চেয়ে আর কফিকে জুসের চেয়ে বেশি পছন্দ করলে চা-কে জুসের চেয়েও বেশি পছন্দ করা উচিত। কিন্তু দলের পছন্দ এই ধর্ম হারাতে পারে। Marquis de Condorcet ১৭৮৫ সালে দেখান বলে জানা যায়: তিনজন ভোটার আর তিনজন প্রার্থী ক, খ, গ; প্রথমজনের ক্রম ক > খ > গ, দ্বিতীয়জনের খ > গ > ক, তৃতীয়জনের গ > ক > খ. সংখ্যাগরিষ্ঠ ভোটে ক খ-কে হারায় (২–১), খ গ-কে হারায় (২–১), আর গ ক-কে হারায় (২–১)। প্রত্যেক ভোটারের পছন্দ transitive, কিন্তু “সংখ্যাগরিষ্ঠ পছন্দ করে” relation-টি একটি চক্র, অর্থাৎ transitive নয়। একে Condorcet paradox বলে, আর বিশ শতকে Kenneth Arrow-এর অসম্ভাব্যতা উপপাদ্য এই ধরনের সমস্যাকে অনেক সাধারণ রূপ দেয় বলে জানা যায়।
পাশাতেও একই ঘটনা। “Non-transitive dice” হলো এমন কয়েকটি পাশা, যেখানে পাশা A পাশা B-কে বেশিরভাগ সময় হারায়, B হারায় C-কে, কিন্তু C আবার A-কে। Bradley Efron-এর নামে পরিচিত চারটি পাশার একটি সেট এর বিখ্যাত উদাহরণ, যা Martin Gardner ১৯৭০ সালের দিকে Scientific American-এর একটি কলামে জনপ্রিয় করেন বলে জানা যায়। “x পাশা y-কে অর্ধেকের বেশি বার হারায়” relation-টি asymmetric, কিন্তু transitive নয়; তাই “সবচেয়ে ভালো পাশা” বলে কিছু নেই, আর যে প্রতিপক্ষ পরে বাছাই করে, সে-ই সুবিধা পায়। রক-পেপার-সিজর্সও একই কাঠামোর সবচেয়ে সরল খেলা।
প্রকৌশলে এর শিক্ষা সরাসরি। একটি sorting algorithm-কে যে তুলনা দেওয়া হয়, তা transitive (আর ঠিকভাবে asymmetric) না হলে ফলাফলের কোনো নিশ্চয়তা থাকে না; কিছু লাইব্রেরি এমন অবস্থায় ত্রুটি দেখায়, আর কিছু চুপচাপ এলোমেলো ক্রম দেয়। বাজারঘরে যদি পণ্যের “সেরা” তালিকা বানানো হয় ক্রেতাদের জোড়ায় জোড়ায় তুলনার সংখ্যাগরিষ্ঠ মত দিয়ে, তাহলে Condorcet-এর চক্র তৈরি হতেই পারে, আর তখন কোনো রৈখিক ক্রম সব তুলনাকে সম্মান করে না। এমন ক্ষেত্রে র্যাংকিং-এর পদ্ধতি (যেমন জয়ের মোট সংখ্যা) একটি অতিরিক্ত সিদ্ধান্ত, গণিতের বাধ্যতামূলক উত্তর নয়।
একটি relation-এর transitivity তাই কোনো “স্বাভাবিক” ব্যাপার নয়; প্রতিবার তা প্রমাণ বা পরীক্ষা করতে হয়। §৫-এর হিসাবও একই কথা বলে: এলোমেলো relation-এর মধ্যে transitive খুবই বিরল।
মূল উপলব্ধি: প্রত্যেকের পছন্দ transitive হলেও দলের সংখ্যাগরিষ্ঠ পছন্দ চক্র তৈরি করতে পারে (Condorcet, ১৭৮৫), আর non-transitive dice দেখায় “হারায়” relation transitive না-ও হতে পারে; তাই transitivity সবসময় যাচাই করতে হয়।
প্র ০৪Composition আর Boolean product একই জিনিস হলে, কেন একই ছকে সবচেয়ে ছোট পথ, পথের সংখ্যা আর reachability সব হিসাব করা যায়?
উপপাদ্য ৭.২-এর প্রমাণ খেয়াল করুন: (MR ⊙ MS)ij = ⋁k(rik ∧ skj). এখানে দুটি অপারেশন: “মধ্যবর্তী k-গুলোর ওপর জোড়া দেওয়া” (∨) আর “একটি নির্দিষ্ট k দিয়ে দুই ধাপ জোড়া” (∧)। প্রশ্ন “পথ আছে কি?” হলে এই দুটি ∨ আর ∧. কিন্তু প্রশ্ন বদলালে অপারেশন বদলায়, ছক একই থাকে। “কয়টি পথ?” জানতে চাইলে সাধারণ + আর ×: সাধারণ matrix গুণ An-এর (i, j) ঘর i থেকে j-তে n দৈর্ঘ্যের walk-এর সংখ্যা দেয় (পর্ব ১৯)। “সবচেয়ে কম খরচের পথ?” জানতে চাইলে min আর +: ঘর (i, j) = mink(dik + dkj) হয়। এই প্রতিটি জোড়া (∨, ∧), (+, ×), (min, +) একটি semiring: যোগের মতো একটি অপারেশন, গুণের মতো আরেকটি, আর গুণ যোগের ওপর বণ্টিত।
Associativity-র প্রমাণ (উপপাদ্য ৭.৩) শুধু এই ধর্মগুলো ব্যবহার করে: ∃-এর ক্রম বদলানো, অর্থাৎ ∨ বণ্টনের সাহায্যে সাজানো। তাই একই প্রমাণ সব semiring-এ খাটে, আর matrix “গুণ” associative থাকে। এর ব্যবহারিক মূল্য বিশাল: দ্রুত ঘাত (binary exponentiation, পর্ব ২২-এর modular exponentiation-এর মতো) দিয়ে M[n] log n সংখ্যক গুণে বের করা যায়, যেকোনো semiring-এ।
এই চিন্তা থেকেই Floyd–Warshall algorithm আসে (DSA কোর্সের পর্ব ৪৪ “Bellman-Ford আর Floyd-Warshall”), আর তার Boolean রূপ Warshall-এর transitive closure algorithm (এই কোর্সের পর্ব ৫৪)। Stephen Warshall ১৯৬২ সালে Boolean রূপ প্রকাশ করেন বলে জানা যায়, আর Robert Floyd একই বছর সবচেয়ে ছোট পথের রূপ দেন বলে উল্লেখ করা হয়; একই ছক Bernard Roy-এর আগের কাজেও ছিল বলে কিছু সূত্র বলে। বিভিন্ন semiring-এ একই algorithm চলে, এই পর্যবেক্ষণ পরে “algebraic path problem” নামে একটি সাধারণ তত্ত্বে রূপ নেয়।
আধুনিক প্রেক্ষাপটে GraphBLAS-এর মতো মানদণ্ড graph algorithm-কে সরাসরি “semiring-এর ওপর sparse matrix গুণ” হিসেবে লেখে, যাতে একই উচ্চ-দক্ষ গুণের কোড BFS, reachability বা সবচেয়ে ছোট পথ সবকিছুতে কাজে লাগে। বাজারঘরের ডেলিভারি নেটওয়ার্কে “কোন গুদাম থেকে কোন জেলায় পৌঁছানো যায়”, “কত ভিন্ন পথে” আর “সবচেয়ে কম কত ঘণ্টায়” তিনটি প্রশ্নই তাই এক ছকের তিনটি সংস্করণ।
মূল উপলব্ধি: Relation-এর composition হলো (∨, ∧) semiring-এ matrix গুণ; অপারেশন বদলালে একই ছক পথ গোনা বা সবচেয়ে ছোট পথ দেয়, আর associativity সব semiring-এ টিকে থাকে বলে দ্রুত ঘাত আর Warshall-ধরনের algorithm সম্ভব।
প্র ০৫Programming-এ ফাংশনকে “নিয়ম” ভাবা হয়, গণিতে “জোড়ার সেট”। Relation-কে সরাসরি প্রোগ্রামের মূল উপাদান বানালে কী লাভ, আর কোথায় তা ব্যবহার হয়?
সাধারণ প্রোগ্রামিং ভাষায় একটি ফাংশন একটি দিকে চলে: ইনপুট দিলে আউটপুট। কিন্তু relation-এ কোনো “দিক” নেই: (ক্রেতা, পণ্য) relation থেকে “রিনা কী কিনেছেন?” আর “চাল কে কিনেছেন?” দুটি প্রশ্নই সমান সহজ, কারণ inverse relation সবসময় আছে। একাধিক উত্তরও স্বাভাবিক, যা ফাংশনে নেই। এই দৃষ্টিভঙ্গিকে কেন্দ্রে রেখে কয়েকটি গুরুত্বপূর্ণ ধারা গড়ে উঠেছে।
প্রথম, logic programming. Prolog (১৯৭০-এর দশকের শুরুতে Alain Colmerauer আর সহকর্মীদের কাজ বলে জানা যায়) আর তার সরল রূপ Datalog-এ প্রোগ্রাম মানেই relation আর নিয়ম। যেমন “parent(x, y)” তথ্য থেকে দুটি নিয়ম দিয়ে “ancestor” relation সংজ্ঞায়িত হয়: parent হলে ancestor, আর parent-এর ancestor-ও ancestor. এই ancestor relation ঠিক parent-এর transitive closure, পর্ব ৫৪-এর বিষয়। Datalog আজ program analysis, নিরাপত্তা-নীতি আর কিছু ডেটাবেস সিস্টেমে ব্যবহার হয় বলে জানা যায়।
দ্বিতীয়, ডেটাবেস। Edgar F. Codd ১৯৭০ সালের প্রবন্ধে ডেটাকে গাণিতিক relation হিসেবে রাখার প্রস্তাব দেন বলে সাধারণত বলা হয়, আর query মানে relation-এর ওপর অপারেশন। এই মডেল গণিতের সংজ্ঞা থেকে কোথায় সরে যায় (SQL টেবিলে একই সারি একাধিকবার থাকতে পারে, NULL আছে), তা পর্ব ৫৩-এ আসবে। তৃতীয়, knowledge graph আর semantic web: সেখানে তথ্য রাখা হয় (বিষয়, সম্পর্ক, বস্তু) ত্রয়ী হিসেবে, যা প্রতিটি সম্পর্কের জন্য একটি binary relation; আর “subClassOf” ধরনের সম্পর্ককে transitive ঘোষণা করে নতুন তথ্য অনুমান করা হয়।
এই সব ক্ষেত্রে এই পর্বের ধর্মগুলো সরাসরি নকশার সিদ্ধান্ত। “বন্ধু” relation symmetric হিসেবে রাখলে প্রতিটি জোড়া একবার রাখলেই চলে; “অনুসরণ করেন” symmetric নয়, তাই দুই দিক আলাদা। “আগে করতে হবে” asymmetric না হলে চক্র আর অচলাবস্থা। আর “একই গ্রাহক” ধরনের সম্পর্ক reflexive, symmetric, transitive হলে (equivalence) তাকে দলে ভাগ করা যায়, যেমন বাজারঘরের একই মানুষের একাধিক অ্যাকাউন্ট একত্র করা (পর্ব ৫৫)। ফাংশন বনাম relation তাই দুই ভিন্ন দর্শন নয়; ফাংশন একটি সীমিত, দিকযুক্ত relation, আর সমস্যাটি দুই দিকে প্রশ্ন বা একাধিক উত্তর চাইলে relation-ই স্বাভাবিক হাতিয়ার।
মূল উপলব্ধি: Relation দিকহীন আর একাধিক উত্তর ধরতে পারে, তাই Prolog/Datalog, relational database আর knowledge graph relation-কেই মূল উপাদান বানায়; reflexive, symmetric, transitive ধর্মগুলো সেখানে সরাসরি নকশার সিদ্ধান্ত।
অনুশীলন
আগে খাতায় করুন, তারপর উত্তর খুলে মেলান।
-
প্রমাণ: R ⊆ A × B আর S ⊆ B × C হলে প্রমাণ করুন (S∘R)−1 = R−1∘S−1.
- (c, a) ∈ (S∘R)−1 ⇔ (a, c) ∈ S∘R. — inverse-এর সংজ্ঞা
- ⇔ কোনো b-এর জন্য (a, b) ∈ R আর (b, c) ∈ S. — composition-এর সংজ্ঞা
- ⇔ কোনো b-এর জন্য (c, b) ∈ S−1 আর (b, a) ∈ R−1. — inverse দুবার
- ⇔ (c, a) ∈ R−1∘S−1, কারণ এখানে আগে S−1 (c থেকে b), তারপর R−1 (b থেকে a). ∎ — composition-এর সংজ্ঞা
ক্রম উল্টে যাওয়াটা স্বাভাবিক: মোজা আর জুতা পরার উল্টো কাজ হলো আগে জুতা খোলা, তারপর মোজা। Matrix-এ এটি (MR ⊙ MS)T = MST ⊙ MRT.
-
হিসাব: A = {1, 2, 3, 4}-এর ওপর কয়টি relation (ক) reflexive, (খ) symmetric, (গ) antisymmetric, (ঘ) reflexive আর antisymmetric দুটিই? প্রতিটির কারণ দিন।
n = 4, কর্ণে ৪টি ঘর, অক্রমিক জোড়া C(4, 2) = 6টি।
- (ক) কর্ণ বাধ্যতামূলক, বাকি 12টি ঘর স্বাধীন: 212 = 4096.
- (খ) কর্ণ স্বাধীন (24), প্রতিটি জোড়ায় ২ পছন্দ (26): 210 = 1024.
- (গ) কর্ণ 24 = 16, প্রতিটি জোড়ায় ৩ পছন্দ, 36 = 729: 16 · 729 = 11664.
- (ঘ) কর্ণ বাধ্যতামূলক 1 (একটিমাত্র উপায়), জোড়ায় ৩ পছন্দ: 36 = 729.
চারটি সংখ্যাই scratch-এ ৬৫৫৩৬টি relation তালিকা করে মেলানো হয়েছে।
-
আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে, আর দ্বিতীয় লাইন R সম্পর্কে কী বলে। তারপর যেকোনো Python-এ চালিয়ে মেলান।
R = {(1, 2), (2, 3), (3, 3)} R2 = {(a, c) for (a, b) in R for (b2, c) in R if b == b2} print(sorted(R2)) print(R2 <= R)[(1, 3), (2, 3), (3, 3)] FalseR2 হলো R2 = R∘R: দুই-ধাপ পথ 1 → 2 → 3 দেয় (1, 3), 2 → 3 → 3 দেয় (2, 3), 3 → 3 → 3 দেয় (3, 3). দ্বিতীয় লাইন R2 ⊆ R পরীক্ষা করে; (1, 3) ∉ R, তাই False, আর উপপাদ্য ৭.৫ অনুযায়ী R transitive নয়। আউটপুট CPython-এ চালিয়ে মেলানো।
-
যুক্তির ভুল ধরুন: একজন লিখলেন: “A = {1, 2, 3}-এ R = {(1, 2), (2, 1), (2, 3)}. (2, 3) আছে কিন্তু (3, 2) নেই, তাই R symmetric নয়। Antisymmetric হলো symmetric-এর বিপরীত, সুতরাং R antisymmetric.” ভুল কোথায়, আর R-এর আসলে কোন কোন ধর্ম আছে?
- ভুল ধাপ: “antisymmetric = symmetric-এর বিপরীত” মিথ্যা। Symmetric-এর negation হলো “কোনো (a, b) আছে যার (b, a) নেই”; antisymmetric হলো “a ≠ b-তে দুই দিকে কখনো নয়”। দুটি আলাদা দাবি, আর উপপাদ্য ৪.২ অনুযায়ী Δ-এর subset দুটিই রাখে।
- এই R-এ: (1, 2) আর (2, 1) দুটিই আছে, অথচ 1 ≠ 2, তাই R antisymmetric নয়। Symmetric-ও নয় ((2, 3) আছে, (3, 2) নেই)।
- বাকি ধর্ম: কোনো (a, a) নেই, তাই irreflexive, reflexive নয়। Asymmetric নয়, কারণ (1, 2) আর (2, 1) দুটিই আছে। Transitive নয়: 1 → 2 → 1 থেকে (1, 1) দরকার, তা নেই। ধর্ম শুধু একটি: irreflexive (scratch-এ যাচাই)।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমএকটি সসীম relation-এর ধর্ম matrix দিয়ে পরীক্ষার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- জোড়ার তালিকা থেকে 0-1 matrix M লেখা
- কর্ণ পড়ে reflexive আর irreflexive ঠিক করা
- M-কে তার transpose-এর সঙ্গে তুলনা করে symmetric আর antisymmetric ঠিক করা
- Boolean product M ⊙ M হিসাব করা
- M ⊙ M-এর প্রতিটি 1 M-এও আছে কি না দেখে transitive ঠিক করা
A = {1, 2, 3}-এর ওপর R = {(1,1), (2,2), (3,3), (1,2)}. R-এর ধর্মগুলো কোনটি?
- reflexive, symmetric, transitive
- শুধু reflexive
- reflexive, antisymmetric, transitive
- irreflexive, asymmetric, transitive
৪টি উপাদানের একটি সেটের ওপর কয়টি symmetric relation আছে?
- 4096
- 1024
- 65536
- 64
A = {1, 2, 3}-এর ওপর খালি relation ∅-এর কোন ধর্মটি নেই?
- symmetric
- transitive
- antisymmetric
- reflexive
A = {1, 2, 3}-এ R = {(1,2), (2,3)} আর S = {(2,1), (3,3)}. S∘R (আগে R, তারপর S) কোনটি?
- {(1,1), (2,3)}
- {(2,2)}
- {(1,2), (2,3), (2,1), (3,3)}
- {(1,3)}
একটি সেটের ওপর relation R-এর জন্য কোন বক্তব্যটি সবসময় সত্য?
- R symmetric না হলে R antisymmetric
- R asymmetric ⇔ R irreflexive আর antisymmetric
- R symmetric আর transitive হলে R reflexive
- R আর S transitive হলে R ∪ S transitive
R ⊆ A × B আর S ⊆ B × C-এর 0-1 matrix MR আর MS. Composite S∘R-এর matrix কোনটি? (⊙ = Boolean product)
- MS ⊙ MR
- MR ∧ MS
- MR ⊙ MS
- MR ∨ MS
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- Relation = জোড়ার সেট: R ⊆ A × B; একই relation জোড়ার তালিকা, digraph আর 0-1 matrix তিন রূপে লেখা যায়, আর ফাংশন হলো প্রতিটি a-এর ঠিক একটি জোড়া থাকা relation.
- ছয়টি ধর্ম: reflexive (কর্ণ সব 1), irreflexive (কর্ণ সব 0), symmetric (M = MT), antisymmetric (আলাদা দুটির মধ্যে দুই দিকে নয়), asymmetric (= irreflexive + antisymmetric), transitive (M ⊙ M ≤ M শর্ত মেনে চলা)।
- গোনা: 2n² মোট; reflexive 2n(n−1); symmetric 2n(n+1)/2; antisymmetric 2n·3n(n−1)/2; transitive-এর সূত্র নেই, শুধু গোনা মান 2, 13, 171, 3994 জানা।
- Composition: S∘R = আগে R, তারপর S; MS∘R = MR ⊙ MS; associative, কিন্তু commutative নয়; (S∘R)−1 = R−1∘S−1.
- Power: R transitive ⇔ সব n ≥ 1-এ Rn ⊆ R; transitive-এর intersection transitive, union নয়; আর “symmetric + transitive ⇒ reflexive” একটি ভুল যুক্তি।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৫৩ · n-ary relation আর relational database-এর গণিতপরবর্তী পর্বটেবিল হিসেবে relation আর relational algebra-র গণিত।
- পর্ব ১৯ · Discrete math-এ matrix — 0-1 matrix আর Boolean productপুনরালোচনাComposition-এর matrix যে Boolean product-এ দাঁড়িয়ে।
- পর্ব ১৬ · ফাংশন — one-to-one, onto, inverse আর compositionপুনরালোচনাফাংশন একটি বিশেষ relation; composition-এর ক্রমের উৎস।
- পর্ব ১৪ · সেট — সংজ্ঞা, subset, power set আর Cartesian productপুনরালোচনাOrdered pair আর Cartesian product, relation-এর ভিত।
- ডিসক্রিট ম্যাথমেটিক্স · কোর্স হোম৮৩টি পর্বপুরো কোর্সের মানচিত্র আর ১৪টি মডিউল।
- ডেটাবেস ও SQL · পর্ব ০৫ · Relational model — relation, tuple, attribute আর domainকাজে প্রয়োগটেবিল হিসেবে relation, বাস্তব ডেটাবেসে।