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

Numerical সমস্যার অনুশীলন — discrete math-এর হিসাব, পূর্ণ সমাধানসহ

Discrete Mathematics Numericals — Logic, Number Theory, Cryptography, Counting, Probability, Recurrences, Relations, Graphs, Trees, Algebra and Automata with Full Solutions

Taught in Bangla, this practice page collects 50 fully solved numerical problems from all thirteen modules: logic, sets and matrices, number theory up to Miller–Rabin, the mathematics of cryptography with toy RSA and Diffie–Hellman numbers, counting and probability, recurrences, relations and graphs, trees, Boolean algebra, groups and codes, and automata and DPLL. Each has a difficulty tag and a lesson to revise; ten in-page Python checkers confirm the answers, and a timed mini-set closes it.

এই পর্বে যা পাবেন

  • Truth table, equivalence-এর শিকল, quantifier-এর negation, induction-এ যোগফল, function গোনা, Cantor pairing আর matrix-এর ঘাত
  • Extended Euclid, modular inverse, CRT, square-and-multiply, Fermat/Euler আর Miller–Rabin-এর এক রাউন্ড
  • হাতে RSA আর Diffie–Hellman, affine আর Vigenère cipher
  • শর্তসহ গণনা, pigeonhole, binomial coefficient, stars and bars, Bayes, expectation আর birthday সমস্যা
  • Recurrence-এর characteristic root আর particular solution, master theorem, generating function, inclusion–exclusion, derangement, Stirling, Catalan, partition আর Burnside
  • Relation-এর ধর্ম, Warshall, Hasse diagram, degree sequence, Dijkstra, planarity, coloring, matching, Prüfer, MST, Huffman, K-map, group, GF(2), Hamming code, DFA, Turing machine আর DPLL

১ · পাতার নিয়ম, ভাগের মানচিত্র আর খাতার কৌশল

মডিউল ১৪-এ স্বাগতম। বাজারের হিসাবের খাতায় শুধু “লাভ হয়েছে” লিখলে চলে না; কোন জিনিস কত দামে কেনা, কত দামে বেচা, সব লাইন ধরে লিখতে হয়। Discrete math-এর পরীক্ষাতেও তাই: “gcd বের করুন” প্রশ্নে শুধু উত্তর নয়, Euclid-এর প্রতিটি ভাগ দেখাতে হয়। বিশ্ববিদ্যালয়ের Discrete Mathematics বা Discrete Structures কোর্সে, প্রোগ্রামার পদের লিখিত পরীক্ষায় আর contest-এর প্রস্তুতিতে এ ধরনের ছোট হিসাব বারবার আসে। মডিউলের অন্য পর্বগুলো অন্য দিক দেখবে: পর্ব ৮০ “MCQ প্রশ্নব্যাংক — Discrete Mathematics”, পর্ব ৮১ “লিখিত ও মৌখিক (ভাইভা) প্রশ্ন — Discrete Mathematics”, পর্ব ৮২ “প্রমাণ লেখার অনুশীলন — ধাপে ধাপে আদর্শ উত্তর” আর পর্ব ৮৩ “ইন্টারভিউ আর contest-এর গণিত — puzzle, counting আর graph”. সব মডিউল একসঙ্গে একটি প্রজেক্টে দেখতে চাইলে পর্ব ৭৮ “ক্যাপস্টোন — বাজারঘরের সমস্যায় discrete math”. এই পাতায় পূর্ণ প্রমাণ কম; প্রমাণ লেখার অনুশীলন পর্ব ৮২-এর কাজ।

কোন ভাগে কী, কোন পর্ব ঝালাবেন

ভাগমডিউল ও কী আছেমূল পর্ব
২১–৩: truth table, quantifier, induction, function, cardinality, matrix০২–০৫, ১০, ১৬, ১৮, ১৯
৩৪: Euclid, inverse, CRT, দ্রুত ঘাত, Fermat/Euler, Miller–Rabin২১–২৫
৪৫: RSA, Diffie–Hellman, affine, Vigenère২৭–২৯
৫৬–৭: গণনা, pigeonhole, binomial, stars and bars, Bayes, expectation, birthday৩১–৩৫, ৩৭, ৩৯, ৪০, ৪২
৬৮: recurrence, master theorem, generating function, IE, derangement, বিশেষ সংখ্যা, Burnside৪৫–৫১
৭৯–১০: relation, Warshall, equivalence, Hasse, degree, Dijkstra, planar, coloring, matching৫২, ৫৪–৫৭, ৬০–৬৪
৮১১–১২: tree, Prüfer, MST, Huffman, K-map, group, GF(2), Hamming৬৫, ৬৭–৭২
৯১৩: DFA, subset construction, Turing machine, DPLL৭৪, ৭৫, ৭৭

এই পাতার নিয়ম — প্রশ্নে অন্য কিছু না বললে

বিষয়নিয়ম
ℕ০ থেকে শুরু: ℕ = {0, 1, 2, …}
moda mod n মানে 0 থেকে n − 1-এর মধ্যে ভাগশেষ
অক্ষরA = 0, B = 1, …, Z = 25, সব হিসাব mod 26
BinomialC(n, k) লেখা, অর্থাৎ n থেকে k বাছাই
Hamming(7,4)অবস্থান 1, 2, 4-এ parity, 3, 5, 6, 7-এ data (পর্ব ৭২-এর বিন্যাস)
Huffmanসবচেয়ে কম ওজনের tree বাঁয়ে (0), পরেরটি ডানে (1)
Prüferপ্রতি ধাপে সবচেয়ে ছোট নম্বরের leaf মুছে তার প্রতিবেশী লেখা
পরীক্ষার কৌশল — খাতায় উত্তর সাজানোর পাঁচ নিয়ম

১. দেওয়া তথ্য এক লাইনে। “n = 247, e = 5, m = 42” আগে লিখে নিলে পরের ধাপে ভুল সংখ্যা বসে না।

২. সংজ্ঞা ঘোষণা করুন। ℕ-এ 0 আছে কি না, Huffman-এ tie কীভাবে ভাঙলেন, Hamming-এর কোন বিন্যাস। সংজ্ঞা বদলালে উত্তরও বদলায়।

৩. উপপাদ্যের শর্ত লিখুন। Fermat-এ p মৌলিক আর p ∤ a, CRT-এ modulus-গুলো জোড়ায় জোড়ায় coprime, Euler-এর সূত্রে graph-কে connected আর planar হতে হবে।

৪. এক লাইনের যাচাই। Bézout-এ ax + by আবার গুণ করে দেখা, RSA-তে ed mod φ(n) = 1, degree-এর যোগফল জোড়, recurrence-এর সূত্রে a2 বসিয়ে মেলানো।

৫. ছোট ক্ষেত্রে brute force চালান। গণনার সূত্র পেলে n = 3 বা 4-এ হাতে তালিকা করে মেলান; এই পাতার চেকারগুলো ঠিক এই কাজটিই করে।

২ · মডিউল ১–৩ — যুক্তি, প্রমাণ, সেট, ফাংশন আর matrix

সূত্রের কার্ড

p → q ≡ ¬p ∨ q; De Morgan: ¬(p ∨ q) ≡ ¬p ∧ ¬q. Negation: ¬∀x P(x) ≡ ∃x ¬P(x). |A| = m, |B| = n হলে A → B ফাংশন nmটি, one-to-one n(n − 1)⋯(n − m + 1)টি, onto ঠিক n! · S(m, n)টি। Cantor pairing π(x, y) = (x + y)(x + y + 1)/2 + y. Adjacency matrix-এর সাধারণ ঘাত Ak-এর (i, j) ঘর = i থেকে j-এ k দৈর্ঘ্যের walk-এর সংখ্যা।

২.১(সহজ) (ক) সূত্রের শিকল দিয়ে দেখান: ¬(p ∨ (¬p ∧ q)) ≡ ¬p ∧ ¬q. (খ) Truth table দিয়ে বলুন ((p → q) ∧ (q → r)) → (p → r) tautology কি না। (গ) p ⊕ q ⊕ r-এর DNF-এ কয়টি minterm? (ঝালিয়ে নিন: পর্ব ০২, ০৩)
(a) ¬(p ∨ (¬p ∧ q)) ≡ ¬p ∧ ¬(¬p ∧ q)      De Morgan
                    ≡ ¬p ∧ (p ∨ ¬q)       De Morgan + double negation
                    ≡ (¬p ∧ p) ∨ (¬p ∧ ¬q) distributive
                    ≡ F ∨ (¬p ∧ ¬q) ≡ ¬p ∧ ¬q
(b) the only way to make "X → Y" false: X true, Y false.
    Y = p → r false needs p = T, r = F. Then X needs p → q (so q = T)
    and q → r (so q = F): impossible. All 8 rows T -> tautology.
(c) true when an odd number of p, q, r are T: 100, 010, 001, 111 -> 4 minterms

(খ)-তে ৮টি সারি না লিখে “কখন মিথ্যা হতে পারে” খোঁজাই দ্রুত পথ; একে hypothetical syllogism বলে। পরীক্ষায় table চাইলে ৮টি সারিই লিখুন, তবে এই যুক্তি দিয়ে উত্তর মিলিয়ে নিন।

২.২(সহজ) Domain D = {1, 2, 3, 4, 5, 6}. প্রতিটির সত্যমান বলুন: (ক) ∀x ∃y (x + y = 7); (খ) ∃y ∀x (x + y = 7); (গ) ∀x ∃y (x < y). (ঘ) (গ)-র negation এমনভাবে লিখুন যাতে ¬ চিহ্নটি শুধু ভেতরের predicate-এর গায়ে থাকে, আর একটি witness দিন। (ঝালিয়ে নিন: পর্ব ০৪, ০৫)
(a) TRUE : for each x choose y = 7 - x, which is in D
(b) FALSE: one fixed y must work for all x; x = 1 needs y = 6, x = 2 needs y = 5
(c) FALSE: x = 6 has no larger y in D
(d) ¬∀x ∃y (x < y) ≡ ∃x ∀y ¬(x < y) ≡ ∃x ∀y (x ≥ y) ; witness x = 6

(ক) আর (খ)-তে শুধু quantifier-এর ক্রম আলাদা, অথচ সত্যমান উল্টো। ∀x ∃y-তে y নির্ভর করতে পারে x-এর ওপর; ∃y ∀x-এ একটিই y সবার জন্য। আর (গ) ℕ-এ সত্য হতো; domain বদলালেই উত্তর বদলায়, তাই domain সবসময় লিখে নিন।

২.৩(মাঝারি) Induction দিয়ে প্রমাণ করুন: সব n ≥ 1-এ ∑i=1n i(i + 1) = n(n + 1)(n + 2)/3. তারপর n = 10-এ যোগফল বের করুন। (ঝালিয়ে নিন: পর্ব ১০)
Basis n = 1 : LHS = 1·2 = 2 ; RHS = 1·2·3/3 = 2
Hypothesis  : sum up to k = k(k+1)(k+2)/3
Step        : sum up to k+1 = k(k+1)(k+2)/3 + (k+1)(k+2)
                            = (k+1)(k+2)(k/3 + 1)
                            = (k+1)(k+2)(k+3)/3      -> the claim for k+1  ∎
n = 10      : 10·11·12/3 = 440

Inductive step-এ মূল চাল হলো সাধারণ উৎপাদক (k + 1)(k + 2) বের করা। n = 10-এর উত্তর ২ + ৬ + ১২ + … + ১১০ সরাসরি যোগ করেও ৪৪০ আসে; চেকার n = 1 থেকে 50 পর্যন্ত সূত্রটি মিলিয়েছে, তবে মনে রাখবেন, ৫০টি ক্ষেত্র মেলানো প্রমাণ নয়, প্রমাণ হলো ওপরের induction.

২.৪(মাঝারি) A = {1, 2, 3}, B = {a, b, c, d}. (ক) A → B কয়টি ফাংশন? (খ) কয়টি one-to-one? (গ) কয়টি A → B onto? (ঘ) B → A কয়টি onto? (ঙ) A-এর ওপর কয়টি relation? (ঝালিয়ে নিন: পর্ব ১৬, ৩১)
(a) 4^3 = 64
(b) 4 · 3 · 2 = 24
(c) 0 : 3 inputs cannot cover 4 outputs (pigeonhole in reverse)
(d) 3! · S(4, 3) = 6 · 6 = 36
    or inclusion-exclusion: 3^4 - 3·2^4 + 3·1^4 = 81 - 48 + 3 = 36
(e) subsets of A × A : 2^(3·3) = 2^9 = 512

(ঘ)-র দুটি পথ একে অপরের যাচাই। S(4, 3) = 6 মানে চারটি জিনিসকে তিনটি অশূন্য দলে ভাগের উপায় (দুটি একসঙ্গে, বাকি দুটি একা: C(4, 2) = 6); তারপর তিন দলকে A-এর তিন সদস্যে বসানো 3!.

২.৫(মাঝারি) (ক) π(2, 3) কত? (খ) π(x, y) = 25 হলে (x, y) কত? (গ) সব finite bit string-কে আগে দৈর্ঘ্য, তারপর অভিধানের ক্রমে সাজালে (ε-এর স্থান 0) “101”-এর স্থান কত? (ঘ) চারটি অসীম bit sequence-এর শুরু: s0 = 0110…, s1 = 1011…, s2 = 0001…, s3 = 1100…. Diagonal নিয়মে তালিকার বাইরের sequence-এর প্রথম চার বিট কী? (ঝালিয়ে নিন: পর্ব ১৮)
(a) (2+3)(2+3+1)/2 + 3 = 15 + 3 = 18
(b) find the diagonal d = x + y with T(d) = d(d+1)/2 <= 25 < T(d+1):
    T(6) = 21, T(7) = 28 -> d = 6 ; y = 25 - 21 = 4 ; x = 6 - 4 = 2 -> (2, 4)
(c) length 0: 1 string, length 1: 2, length 2: 4 -> 7 strings before length 3
    among length 3, "101" is binary 5 -> position 7 + 5 = 12
(d) diagonal bits: s0[0]=0, s1[1]=0, s2[2]=0, s3[3]=0 -> flip -> 1111…

(গ) এই তালিকা দেখায় যে finite string-এর সেট countable: প্রতিটি string একটি নির্দিষ্ট স্থানে আসে। (ঘ)-র sequence প্রতিটি si-এর সঙ্গে অন্তত i-তম বিটে আলাদা, তাই তালিকায় নেই; অসীম sequence-এর সেট uncountable হওয়ার যুক্তি এটিই।

২.৬(কঠিন) চারটি হাবের একমুখী রাস্তা: 1 → 2, 2 → 3, 3 → 1, 3 → 4, 4 → 1. (ক) Adjacency matrix A লিখুন। (খ) A2 আর A3 সাধারণ গুণে বের করুন; 1 থেকে 1-এ ঠিক ৩ ধাপের কয়টি walk? (গ) Transitive closure-এর matrix কী? (ঝালিয়ে নিন: পর্ব ১৯)
(a) rows: 1: 0100 ; 2: 0010 ; 3: 1001 ; 4: 1000
(b) A^2 rows: 0010 ; 1001 ; 1100 ; 0100
    A^3 rows: 1001 ; 1100 ; 0110 ; 0010
    (A^3)[1][1] = 1 : the walk 1 -> 2 -> 3 -> 1
(c) A ∨ A^[2] ∨ A^[3] ∨ A^[4] = all ones (every hub reaches every hub)

সব ঘর ১, কারণ 1 → 2 → 3 → 1 একটি cycle আর 4 থেকে 1-এ ফেরা যায়: graph-টি strongly connected. n = 4 vertex-এ closure-এর জন্য A[4] পর্যন্ত Boolean ঘাত যথেষ্ট, কারণ cycle ছাড়া কোনো path-এ ৪টির বেশি edge থাকে না।

from itertools import product
imp = lambda a, b: (not a) or b
rows = list(product([0, 1], repeat=3))
print("2.1 tautology:", all(imp(imp(p, q) and imp(q, r), imp(p, r)) for p, q, r in rows),
      "| law chain:", all((not (p or (not p and q))) == (not p and not q) for p, q, r in rows),
      "| p xor q xor r minterms:", sum(p ^ q ^ r for p, q, r in rows))
D = range(1, 7)                                        # 2.2: domain {1,...,6}
print("2.2 AxEy x+y=7:", all(any(x + y == 7 for y in D) for x in D),
      "| EyAx x+y=7:", any(all(x + y == 7 for x in D) for y in D),
      "| AxEy x<y:", all(any(x < y for y in D) for x in D),
      "| witness of negation:", [x for x in D if all(x >= y for y in D)])
print("2.3 formula holds n=1..50:",
      all(sum(i * (i + 1) for i in range(1, n + 1)) == n * (n + 1) * (n + 2) // 3 for n in range(1, 51)),
      "| n=10:", sum(i * (i + 1) for i in range(1, 11)))
fAB = list(product(range(4), repeat=3)); fBA = list(product(range(3), repeat=4))
print("2.4 A->B:", len(fAB), "one-to-one:", sum(len(set(f)) == 3 for f in fAB),
      "| B->A onto:", sum(len(set(f)) == 3 for f in fBA), "| relations on A:", 2 ** 9)
pi = lambda x, y: (x + y) * (x + y + 1) // 2 + y
strs = [""] + ["".join(s) for L in range(1, 4) for s in product("01", repeat=L)]
print("2.5 pi(2,3) =", pi(2, 3), "| pi^-1(25) =", [(x, y) for x in range(8) for y in range(8) if pi(x, y) == 25],
      "| index of '101':", strs.index("101"))
A = [[0, 1, 0, 0], [0, 0, 1, 0], [1, 0, 0, 1], [1, 0, 0, 0]]
mul = lambda X, Y: [[sum(X[i][k] * Y[k][j] for k in range(4)) for j in range(4)] for i in range(4)]
A2 = mul(A, A); A3 = mul(A2, A)
print("2.6 A^2 rows:", A2, "\n    A^3 rows:", A3)
R = [row[:] for row in A]
for _ in range(3):
    R = [[int(R[i][j] or any(R[i][k] and A[k][j] for k in range(4))) for j in range(4)] for i in range(4)]
print("    reachability (A or A^2 or A^3 or A^4):", R)

প্রথম লাইনে তিনটি True/সংখ্যা: tautology True, সূত্রের শিকল True, minterm 4. দ্বিতীয় লাইন quantifier-এর ক্রমের ফল দেখায়: AxEy x+y=7: True কিন্তু EyAx x+y=7: False, আর negation-এর witness [6]. Induction-এর সূত্র n = 1 থেকে 50-এ True, n = 10-এ 440. গণনা 64, 24, 36, 512; pairing 18 আর [(2, 4)], string-এর স্থান 12. শেষে A3-এর প্রথম সারি [1, 0, 0, 1] আর reachability-র সব ঘর 1.

৩ · মডিউল ৪ — সংখ্যাতত্ত্ব: Euclid থেকে Miller–Rabin

সূত্রের কার্ড

gcd(a, b) = gcd(b, a mod b). Bézout: gcd(a, b) = ax + by. a−1 mod m আছে ⇔ gcd(a, m) = 1. ax ≡ b (mod m)-এর সমাধান আছে ⇔ g = gcd(a, m) ∣ b, তখন mod m-এ ঠিক gটি সমাধান। Fermat: p মৌলিক, p ∤ a ⇒ ap−1 ≡ 1 (mod p). Euler: gcd(a, n) = 1 ⇒ aφ(n) ≡ 1 (mod n); φ(n) = n∏(1 − 1/p).

৩.১(সহজ) Extended Euclid দিয়ে gcd(1147, 851) আর এমন x, y বের করুন যাতে 1147x + 851y = gcd. lcm কত? (ঝালিয়ে নিন: পর্ব ২১)
1147 = 1·851 + 296
 851 = 2·296 + 259
 296 = 1·259 + 37
 259 = 7·37  + 0          -> gcd = 37
37 = 296 - 259
   = 296 - (851 - 2·296) = 3·296 - 851
   = 3·(1147 - 851) - 851 = 3·1147 - 4·851   -> x = 3, y = -4
check: 3441 - 3404 = 37 ; lcm = 1147·851/37 = 26381

নিচের stepper একই হিসাব ধাপে ধাপে দেখায়। Back-substitution-এ প্রতিবার শুধু ভাগশেষকে আগের লাইনের রূপে বদলান; চিহ্নের ভুল এড়াতে শেষে গুণ করে যাচাই বাধ্যতামূলক ভাবুন।

ধাপ ১প্রথম ভাগ
1147 = 1·851 + 296
ধাপ ২দ্বিতীয় ভাগ
1147 = 1·851 + 296
 851 = 2·296 + 259
ধাপ ৩শূন্য ভাগশেষ
 296 = 1·259 + 37
 259 = 7·37  + 0
gcd = 37
ধাপ ৪পেছনে ফেরা
37 = 296 - 259
   = 296 - (851 - 2·296)
   = 3·296 - 851
ধাপ ৫Bézout
37 = 3(1147 - 851) - 851
   = 3·1147 - 4·851
check 3441 - 3404 = 37
  1. প্রথম ভাগ। 1147-কে 851 দিয়ে ভাগ: ভাগফল 1, ভাগশেষ 296.
  2. পরের জোড়া। এবার (851, 296): ভাগফল 2, ভাগশেষ 259.
  3. থামা। 296 = 259 + 37, তারপর 259 = 7 · 37, ভাগশেষ শূন্য। শেষ অশূন্য ভাগশেষ 37-ই gcd.
  4. পেছনে ফেরা। 37 = 296 − 259; দ্বিতীয় লাইন থেকে 259 = 851 − 2 · 296 বসালে 37 = 3 · 296 − 851.
  5. Bézout-এর সহগ। প্রথম লাইন থেকে 296 = 1147 − 851 বসিয়ে 37 = 3 · 1147 − 4 · 851, অর্থাৎ x = 3, y = −4.
৩.২(মাঝারি) (ক) 17−1 mod 43 বের করুন। (খ) 17x ≡ 5 (mod 43) সমাধান করুন। (গ) 6x ≡ 9 (mod 15)-এর mod 15-এ সব সমাধান লিখুন। (ঝালিয়ে নিন: পর্ব ২১, ২৩)
(a) 43 = 2·17 + 9 ; 17 = 1·9 + 8 ; 9 = 1·8 + 1
    1 = 9 - 8 = 9 - (17 - 9) = 2·9 - 17 = 2·(43 - 2·17) - 17 = 2·43 - 5·17
    -> 17^-1 ≡ -5 ≡ 38 (mod 43) ; check 17·38 = 646 = 15·43 + 1
(b) x ≡ 38·5 = 190 ≡ 190 - 4·43 = 18 (mod 43)
(c) g = gcd(6, 15) = 3, and 3 | 9 -> exactly 3 solutions mod 15
    divide by 3: 2x ≡ 3 (mod 5) ; 2^-1 = 3 -> x ≡ 9 ≡ 4 (mod 5)
    solutions mod 15: 4, 9, 14

(গ)-তে ৩ দিয়ে ভাগ না করে সরাসরি 6−1 mod 15 খোঁজা ভুল: gcd(6, 15) = 3 ≠ 1, তাই সেই inverse নেই। যাচাই: 6 · 4 = 24 ≡ 9, 6 · 9 = 54 ≡ 9, 6 · 14 = 84 ≡ 9 (mod 15).

৩.৩(মাঝারি) বাজারঘরের গুদামে ডিমের বাক্স: ৪টি করে সাজালে ১টি বাড়তি, ৫টি করে সাজালে ২টি, ৭টি করে সাজালে ৩টি। ১৪০-এর কম সবচেয়ে ছোট সংখ্যাটি কত? CRT দিয়ে করুন। (ঝালিয়ে নিন: পর্ব ২৩)
x ≡ 1 (mod 4), x ≡ 2 (mod 5), x ≡ 3 (mod 7) ; 4, 5, 7 pairwise coprime ; M = 140
M1 = 35, 35 ≡ 3 (mod 4), inverse y1 = 3   (3·3 = 9 ≡ 1)
M2 = 28, 28 ≡ 3 (mod 5), inverse y2 = 2   (3·2 = 6 ≡ 1)
M3 = 20, 20 ≡ 6 (mod 7), inverse y3 = 6   (6·6 = 36 ≡ 1)
x = 1·35·3 + 2·28·2 + 3·20·6 = 105 + 112 + 360 = 577 ≡ 577 - 4·140 = 17 (mod 140)
check: 17 = 4·4 + 1 = 3·5 + 2 = 2·7 + 3

CRT বলে mod 140-এ উত্তর অনন্য, তাই ১৪০-এর কম একটিই সংখ্যা: ১৭টি বাক্স। Modulus-গুলো জোড়ায় জোড়ায় coprime না হলে (যেমন 4 আর 6) এই সূত্র সরাসরি খাটে না।

৩.৪(মাঝারি) (ক) Square-and-multiply দিয়ে 5117 mod 19 বের করুন। (খ) Fermat দিয়ে উত্তরটি যাচাই করুন। (গ) mod 19-এ 5-এর order কত? (ঝালিয়ে নিন: পর্ব ২২, ২৪)
(a) 117 = 64 + 32 + 16 + 4 + 1 = 1110101 (binary)
    5^1 = 5, 5^2 = 6, 5^4 = 17, 5^8 = 4, 5^16 = 16, 5^32 = 9, 5^64 = 5   (mod 19)
    5^117 = 5^64 · 5^32 · 5^16 · 5^4 · 5^1 = 5·9·16·17·5
          : 5·9 = 45 ≡ 7 ; 7·16 = 112 ≡ 17 ; 17·17 = 289 ≡ 4 ; 4·5 = 20 ≡ 1
(b) 19 prime, 19 ∤ 5 -> 5^18 ≡ 1 ; 117 = 6·18 + 9 -> 5^117 ≡ 5^9 = 5^8·5 = 4·5 = 20 ≡ 1
(c) order divides 18 ; 5^1, 5^2 = 6, 5^3 = 11, 5^6 = 7 are not 1 ; 5^9 ≡ 1 -> order 9

৬টি বর্গ (564 পর্যন্ত) আর ৪টি গুণ, মোট ১০টি গুণে কাজ শেষ; সরাসরি ১১৬টি গুণ লাগত। (গ)-তে Lagrange-এর ফল কাজে লাগে: order অবশ্যই 18-এর ভাজক, তাই 1, 2, 3, 6, 9, 18 ছাড়া কিছু দেখার দরকার নেই।

৩.৫(মাঝারি) (ক) φ(360) কত? (খ) 7962 mod 360. (গ) 32026-এর শেষ দুই অঙ্ক। (ঘ) 2340 mod 341 = 1, অথচ 341 = 11 · 31. এতে Fermat-এর উপপাদ্য ভুল প্রমাণ হয় কি? (ঝালিয়ে নিন: পর্ব ২৪)
(a) 360 = 2^3·3^2·5 -> φ = 360·(1/2)(2/3)(4/5) = 96
(b) gcd(7, 360) = 1 ; 962 = 10·96 + 2 -> 7^962 ≡ 7^2 = 49 (mod 360)
(c) φ(100) = 40 ; 2026 = 50·40 + 26 -> 3^26 mod 100
    3^5 = 243 ≡ 43 ; 3^10 ≡ 43^2 = 1849 ≡ 49 ; 3^20 ≡ 49^2 = 2401 ≡ 1
    3^26 = 3^20·3^5·3 ≡ 1·43·3 = 129 ≡ 29 -> last two digits 29
(d) No. Fermat: p prime => a^(p-1) ≡ 1. The converse is false.
    341 is a Fermat pseudoprime to base 2.

(গ)-তে মজার ব্যাপার: 320 ≡ 1 (mod 100), অর্থাৎ 3-এর order এখানে 20, φ(100) = 40-এর চেয়ে ছোট। Euler-এর উপপাদ্য একটি ঘাত দেয় যা কাজ করে; সবচেয়ে ছোটটি নয়।

৩.৬(কঠিন) n = 341, base a = 2 নিয়ে Miller–Rabin-এর এক রাউন্ড চালান: n − 1 = 2s · d লিখুন, ধারাটি বের করুন, সিদ্ধান্ত দিন। একটি উৎপাদকও পাওয়া যায় কি? (ঝালিয়ে নিন: পর্ব ২৫)
340 = 2^2 · 85 -> s = 2, d = 85
2^85 mod 341 = 32           (not 1, not 340 = -1)
2^170 = 32^2 = 1024 = 3·341 + 1 ≡ 1
-> 32 is a square root of 1 other than ±1 -> 341 is COMPOSITE, 2 is a witness
bonus: 32^2 ≡ 1 -> 341 | (32-1)(32+1) -> gcd(31, 341) = 31, and 341 = 31 · 11

৩.৫-এর Fermat পরীক্ষা base 2-এ 341-কে ধরতে পারেনি, Miller–Rabin একই base-এ ধরল, কারণ সে শুধু শেষ ঘাত নয়, ১-এ পৌঁছানোর পথটিও দেখে। মৌলিক modulus-এ ১-এর বর্গমূল শুধু ±1; অন্য বর্গমূল মানেই witness.

from math import gcd
def egcd(a, b):                                   # returns (g, x, y) with a*x + b*y = g
    if b == 0:
        return a, 1, 0
    g, x, y = egcd(b, a % b)
    return g, y, x - (a // b) * y
g, x, y = egcd(1147, 851)
print("3.1 gcd:", g, "| x, y:", x, y, "| check:", 1147 * x + 851 * y, "| lcm:", 1147 * 851 // g)
inv = pow(17, -1, 43)                             # Python 3.8+: modular inverse
print("3.2 17^-1 mod 43:", inv, "| x for 17x=5:", inv * 5 % 43,
      "| 6x=9 (mod 15):", [x for x in range(15) if 6 * x % 15 == 9])
print("3.3 CRT:", [x for x in range(140) if x % 4 == 1 and x % 5 == 2 and x % 7 == 3])
sq, v = [], 5
for i in range(7):
    sq.append(v); v = v * v % 19
print("3.4 117 =", bin(117), "| 5^(2^i) mod 19:", sq, "| pow(5,117,19):", pow(5, 117, 19),
      "| order of 5:", min(k for k in range(1, 19) if pow(5, k, 19) == 1))
phi = lambda n: sum(1 for k in range(1, n + 1) if gcd(k, n) == 1)
print("3.5 phi(360):", phi(360), "| 7^962 mod 360:", pow(7, 962, 360),
      "| phi(100):", phi(100), "| 3^2026 mod 100:", pow(3, 2026, 100), "| 3^26 mod 100:", pow(3, 26, 100))
n, a = 341, 2                                     # 3.6: n - 1 = 2^s * d
s, d = 0, n - 1
while d % 2 == 0:
    s, d = s + 1, d // 2
seq = [pow(a, d * 2 ** r, n) for r in range(s + 1)]
print("3.6 s, d:", s, d, "| a^d, a^2d, a^4d:", seq, "| gcd(32-1, 341):", gcd(31, 341),
      "| Fermat 2^340 mod 341:", pow(2, 340, 341))

3.1 gcd: 37 | x, y: 3 -4, যাচাই 37, lcm 26381. Inverse 38, সমাধান 18, আর 6x ≡ 9-এর তিন সমাধান [4, 9, 14]. CRT [17]: ১৪০-এর নিচে একটিই সংখ্যা। বর্গের ধারা [5, 6, 17, 4, 16, 9, 5], ফল 1, order 9. Euler-এর লাইনে 96, 49, 40 আর দুই পথেই 29. শেষ লাইনে Miller–Rabin-এর ধারা [32, 1, 1]: 32-এর পরে 1, অথচ 32 ≠ ±1, তাই 341 যৌগিক; gcd(32-1, 341): 31 একটি উৎপাদক দেয়, আর Fermat-এর পরীক্ষা 1 দিয়ে ঠকে যায়।

৪ · মডিউল ৫ — Cryptography-র হিসাব: RSA, Diffie–Hellman আর cipher

ঝালিয়ে নিন: পর্ব ২৭ · Classical cipher, পর্ব ২৮ · RSA-এর গণিত, পর্ব ২৯ · Discrete logarithm আর Diffie–Hellman. সতর্কতা: এই ভাগের ছোট সংখ্যার textbook RSA আর DH শুধু গণিত বোঝার জন্য; বাস্তবে padding, বড় key আর যাচাই করা library লাগে। দেখুন সাইবার নিরাপত্তা কোর্সের পর্ব ১০ আর পর্ব ১৪.

সূত্রের কার্ড

RSA: n = pq, φ(n) = (p − 1)(q − 1), gcd(e, φ(n)) = 1, d = e−1 mod φ(n); c = me mod n, m = cd mod n. Diffie–Hellman: A = ga, B = gb, দুজনের key Ba = Ab = gab (mod p). Affine: E(x) = ax + b, D(y) = a−1(y − b) (mod 26), শর্ত gcd(a, 26) = 1. Vigenère: i-তম অক্ষরে key-এর (i mod k)-তম অক্ষর যোগ।

৪.১(মাঝারি) p = 13, q = 19, e = 5. (ক) n, φ(n) আর d বের করুন। (খ) বার্তা m = 42 encrypt করুন। (গ) Decrypt করে মিলিয়ে দেখান। (ঝালিয়ে নিন: পর্ব ২৮)
(a) n = 247 ; φ = 12·18 = 216 ; gcd(5, 216) = 1
    216 = 43·5 + 1 -> 1 = 216 - 43·5 -> d ≡ -43 ≡ 173 ; check 5·173 = 865 = 4·216 + 1
(b) 42^2 = 1764 ≡ 1764 - 7·247 = 35
    42^4 ≡ 35^2 = 1225 ≡ 1225 - 4·247 = 237 ≡ -10
    42^5 ≡ -10·42 = -420 ≡ -420 + 2·247 = 74     -> c = 74
(c) 74^173 mod 247 = 42 (square-and-multiply; 173 = 10101101 in binary)

(খ)-তে −10 লেখার কৌশল লক্ষ করুন: 237 ≡ −10 (mod 247) ধরলে পরের গুণ ছোট থাকে। (গ)-র হাতের হিসাব লম্বা; পরীক্ষায় CRT দিয়ে mod 13 আর mod 19-এ আলাদা করলে দ্রুত হয়: 74 ≡ 9 (mod 13), 9173 mod 12 = 95 ≡ 3, আর 42 ≡ 3 (mod 13) মেলে।

৪.২(মাঝারি) Diffie–Hellman: p = 29, g = 2. রাফির গোপন a = 6, তানিয়ার গোপন b = 11. (ক) 2 কি mod 29-এর primitive root? (খ) A, B আর shared key কত? (গ) কেউ A = 21 দেখলে a কত, brute force-এ? (ঝালিয়ে নিন: পর্ব ২৯)
(a) order divides 28 = 2^2·7 ; test 28/2 = 14 and 28/7 = 4:
    2^4 = 16 ≠ 1 ; 2^7 = 128 ≡ 12 ; 2^14 ≡ 144 ≡ 28 ≡ -1 ≠ 1 -> order 28: primitive root
(b) A = 2^6 = 64 ≡ 6 ; B = 2^11 = 2048 ≡ 2048 - 70·29 = 18
    Rafi: 18^6 mod 29 = 9 ; Tania: 6^11 mod 29 = 9 -> key 9
(c) try x = 0, 1, 2, … : 2^17 ≡ 21 (mod 29) -> a = 17

(গ) ছোট p-তে discrete log সহজ, কারণ মাত্র ২৮টি ঘাত দেখতে হয়। বাস্তবের p হাজার bit লম্বা হলে সাধারণ brute force অসম্ভব; আর DH নিজে প্রমাণীকরণ দেয় না, তাই man-in-the-middle ঠেকাতে আলাদা ব্যবস্থা লাগে।

৪.৩(সহজ) Affine cipher E(x) = 7x + 3 (mod 26). (ক) “BAZAR” encrypt করুন। (খ) 7−1 mod 26 আর decryption-এর সূত্র লিখুন। (গ) মোট কয়টি বৈধ key (a, b)? (ঝালিয়ে নিন: পর্ব ২৭)
(a) B=1 -> 10=K ; A=0 -> 3=D ; Z=25 -> 178 ≡ 22=W ; A -> D ; R=17 -> 122 ≡ 18=S
    BAZAR -> KDWDS
(b) 7·15 = 105 = 4·26 + 1 -> 7^-1 = 15 ; D(y) = 15(y - 3) mod 26
    K=10: 15·7 = 105 ≡ 1 = B  (one check)
(c) a with gcd(a, 26) = 1: 12 choices (odd, not 13) ; b: 26 -> 12·26 = 312

দুটি A একই D হয়ে যাওয়াই affine cipher-এর দুর্বলতা: অক্ষরের ঘনত্ব (frequency) অপরিবর্তিত থাকে, আর মাত্র ৩১২টি key-তে brute force এক মুহূর্তের কাজ।

৪.৪(সহজ) Vigenère key “DHAKA”. “BAZARGHAR” encrypt করুন, আর দেখান কেন একই অক্ষর A ভিন্ন ভিন্ন অক্ষরে বদলায়। (ঝালিয়ে নিন: পর্ব ২৭)
key shifts  D=3 H=7 A=0 K=10 A=0 | D=3 H=7 A=0 K=10
plaintext   B   A   Z   A    R   | G   H   A   R
            1   0   25  0    17  | 6   7   0   17
+ shift     4   7   25  10   17  | 9   14  0   27≡1
ciphertext  E   H   Z   K    R   | J   O   A   B      -> EHZKRJOAB

প্লেইনটেক্সটের তিনটি A হয়েছে H, K আর A, কারণ তারা key-এর ভিন্ন অবস্থানে পড়েছে। তাই সরল frequency analysis কাজ করে না; তবে key-এর দৈর্ঘ্য (এখানে ৫) জানা গেলে প্রতিটি ৫ম অক্ষর একটি shift cipher, আর আক্রমণ আবার সহজ।

# Toy numbers for learning only: textbook RSA/DH like this is NOT secure.
from math import gcd
p, q, e, m = 13, 19, 5, 42
n, phi = p * q, (p - 1) * (q - 1)
d = pow(e, -1, phi)
c = pow(m, e, n)
print("4.1 n:", n, "| phi:", phi, "| d:", d, "| e*d mod phi:", e * d % phi,
      "| c:", c, "| decrypt:", pow(c, d, n))
P, g, a, b = 29, 2, 6, 11
A, B = pow(g, a, P), pow(g, b, P)
print("4.2 order of 2 mod 29:", min(k for k in range(1, P) if pow(g, k, P) == 1),
      "| A:", A, "| B:", B, "| keys:", pow(B, a, P), pow(A, b, P),
      "| log_2 21:", [x for x in range(P - 1) if pow(g, x, P) == 21])
num = lambda s: [ord(ch) - 65 for ch in s]
txt = lambda xs: "".join(chr(x % 26 + 65) for x in xs)
ct = txt(7 * x + 3 for x in num("BAZAR"))
ainv = pow(7, -1, 26)
print("4.3 affine:", ct, "| 7^-1 mod 26:", ainv, "| decrypt:", txt(ainv * (y - 3) for y in num(ct)),
      "| valid keys:", sum(gcd(k, 26) == 1 for k in range(26)) * 26)
key = num("DHAKA")
vc = txt(x + key[i % 5] for i, x in enumerate(num("BAZARGHAR")))
print("4.4 Vigenere:", vc, "| back:", txt(y - key[i % 5] for i, y in enumerate(num(vc))))

RSA: d: 173, e*d mod phi: 1, ciphertext 74, decrypt করে আবার 42. DH-এ 2-এর order 28 (primitive root), A: 6, B: 18, দুই দিকের key 9 9, আর brute-force discrete log [17]. Affine KDWDS, inverse 15, ফেরত BAZAR, বৈধ key 312. Vigenère EHZKRJOAB থেকে উল্টো দিকে আবার BAZARGHAR. প্রথম লাইনের মন্তব্যটি মনে রাখুন: এই সংখ্যাগুলো শুধু শেখার জন্য।

৫ · মডিউল ৬–৭ — গণনা আর বিচ্ছিন্ন সম্ভাবনা

সূত্রের কার্ড

“অন্তত একটি” = মোট − “একটিও না”। Generalized pigeonhole: N বস্তু k বাক্সে ⇒ কোনো বাক্সে ⌈N/k⌉. (x + y)n-এ xkyn−k-এর সহগ C(n, k). Stars and bars: x1 + ⋯ + xk = n, xi ≥ 0-এর সমাধান C(n + k − 1, k − 1). Bayes: P(A∣B) = P(B∣A)P(A)/P(B). Var(X) = E[X2] − (E[X])2.

৫.১(সহজ) (ক) ৬ অক্ষরের password, প্রতিটি ঘরে ইংরেজি বড় হাতের ২৬টি অক্ষর বা ১০টি অঙ্ক; অন্তত একটি অঙ্ক বাধ্যতামূলক। কয়টি? (খ) ৪ অঙ্কের PIN, কোনো অঙ্ক পুনরাবৃত্তি নয় আর প্রথম অঙ্ক 0 নয়। কয়টি? (ঝালিয়ে নিন: পর্ব ৩১)
(a) all - no digit = 36^6 - 26^6 = 2176782336 - 308915776 = 1867866560
(b) first digit 9 ways (1-9), then 9, 8, 7 -> 9·9·8·7 = 4536

(ক)-তে “অন্তত একটি অঙ্কের ঘর বেছে, বাকি ৫টি যেকোনো” (6 · 10 · 365) লিখলে একাধিক অঙ্কের password বারবার গোনা হয়; complement-ই নিরাপদ পথ। (খ)-তে বাধাওয়ালা ঘর (প্রথম অঙ্ক) আগে ভরুন।

৫.২(সহজ) (ক) 1 থেকে 8-এর মধ্যে যেকোনো ৫টি আলাদা সংখ্যা নিলে দুটির যোগফল 9 হবেই। দেখান, আর বলুন ৪টি নিলে কেন নিশ্চয়তা নেই। (খ) এক সপ্তাহে ১০০টি অর্ডার এলে কোনো একদিনে অন্তত কয়টি? (গ) অন্তত কতজন মানুষ নিলে নিশ্চিতভাবে তিনজনের জন্মমাস এক? (ঝালিয়ে নিন: পর্ব ৩২)
(a) boxes {1,8} {2,7} {3,6} {4,5} : 4 boxes, 5 numbers -> one box gets 2 -> sum 9
    with 4 numbers {1,2,3,4} no pair sums to 9
(b) ⌈100/7⌉ = 15
(c) 2 per month is possible with 24 people ; 2·12 + 1 = 25

Pigeonhole-এ আসল কাজ বাক্স বানানো: এখানে যোগফল 9-এর জোড়াই বাক্স। (গ)-তে উত্তর ২৫ “ন্যূনতম” হওয়ার প্রমাণে দুটি অংশ লাগে: ২৫-এ নিশ্চয়তা, আর ২৪ জনের এমন উদাহরণ যেখানে প্রতি মাসে ঠিক দুজন।

৫.৩(মাঝারি) (ক) (2x − y)8-এ x3y5-এর সহগ কত? (খ) (0, 0) থেকে (6, 4)-এ শুধু ডানে আর ওপরে এক ঘর করে গেলে কয়টি lattice path? (গ) তার কয়টি (3, 2) দিয়ে যায়? (ঝালিয়ে নিন: পর্ব ৩৪, ৩৭)
(a) term C(8,3)(2x)^3(-y)^5 -> 56 · 8 · (-1) = -448
(b) 10 steps, choose which 4 are "up": C(10, 4) = 210
(c) (0,0)->(3,2): C(5,2) = 10 ; (3,2)->(6,4): C(5,2) = 10 -> 10·10 = 100

(ক)-তে সবচেয়ে সাধারণ ভুল 23 আর (−1)5 ভুলে যাওয়া; উত্তর ৫৬ নয়। (গ) গুণের নিয়ম: দুই অংশের পথ স্বাধীনভাবে বাছা যায়।

৫.৪(মাঝারি) বাজারঘর ১৫টি একই রকম coupon চারটি জেলার শাখায় ভাগ করবে: x1 + x2 + x3 + x4 = 15. (ক) xi ≥ 0 হলে কয়টি উপায়? (খ) x1 ≥ 2, x2 ≥ 1 হলে? (গ) প্রতিটি শাখা বড়জোর ৬টি পেলে? (ঝালিয়ে নিন: পর্ব ৩৫, ৪৯)
(a) C(15 + 3, 3) = C(18, 3) = 816
(b) give 2 and 1 first: 12 left -> C(15, 3) = 455
(c) inclusion-exclusion on "x_i >= 7":
    816 - C(4,1)·C(11,3) + C(4,2)·C(4,3) = 816 - 4·165 + 6·4 = 816 - 660 + 24 = 180
    (three branches with >= 7 need 21 > 15 coupons: 0)

(গ)-তে x1 ≥ 7 হলে আগে ৭টি দিয়ে বাকি ৮টি ভাগ: C(11, 3) = 165. দুটি শাখা ≥ 7 হলে বাকি ১টি: C(4, 3) = 4. চেকার 164টি tuple গুনে তিনটি উত্তরই মেলায়।

৫.৫(মাঝারি) বাজারঘরের ২% অর্ডার প্রতারণামূলক। একটি সতর্ক-ব্যবস্থা প্রতারণার ৯৫% ধরে (sensitivity), আর সৎ অর্ডারের ৪%-কে ভুল করে দাগায়; এটি false positive-এর হার। দাগানো একটি অর্ডার সত্যিই প্রতারণা হওয়ার সম্ভাবনা কত? (ঝালিয়ে নিন: পর্ব ৩৯)
P(flag | fraud) P(fraud) = 0.95 · 0.02 = 0.0190
P(flag | honest) P(honest) = 0.04 · 0.98 = 0.0392
P(flag) = 0.0582
P(fraud | flag) = 0.0190 / 0.0582 = 95/291 ≈ 0.3265
natural frequencies, per 10,000 orders: 200 fraud -> 190 flagged ; 9800 honest -> 392 flagged
-> 190 of 582 flagged orders are fraud

৯৫% নির্ভুল ব্যবস্থা, অথচ দাগানো অর্ডারের মাত্র এক-তৃতীয়াংশ প্রতারণা। কারণ base rate মাত্র ২%; সৎ অর্ডার এত বেশি যে ৪% ভুলও সংখ্যায় বড়। ১০,০০০টি অর্ডারের গণনায় ভাবলে ফাঁদটি চোখে পড়ে।

৫.৬(মাঝারি) (ক) একটি ন্যায্য ছক্কার ফল X: E[X] আর Var(X)? (খ) দুটি স্বাধীন ছক্কার যোগফলের variance? (গ) X ~ Binomial(10, 0.3)-এর E আর Var? (ঘ) ৩০ জনের দলে একই জন্মদিনের জোড়ার প্রত্যাশিত সংখ্যা (৩৬৫ দিন, সমান সম্ভাবনা)? (ঝালিয়ে নিন: পর্ব ৪০, ৪১)
(a) E = 21/6 = 7/2 ; E[X^2] = 91/6 ; Var = 91/6 - 49/4 = 35/12 ≈ 2.9167
(b) independent -> variances add: 35/12 + 35/12 = 35/6
(c) E = np = 3 ; Var = np(1 - p) = 2.1
(d) indicator for each pair: C(30,2) pairs, each P = 1/365
    E = 435/365 = 87/73 ≈ 1.1918

(ঘ)-তে linearity of expectation-এর শক্তি: জোড়াগুলো স্বাধীন নয়, তবু প্রত্যাশা যোগ হয়। Variance-এ একই কাজ চলে না; (খ)-তে যোগ করা গেছে শুধু স্বাধীনতার জন্য।

৫.৭(কঠিন) (ক) ২৩ জনের দলে অন্তত দুজনের জন্মদিন এক হওয়ার সম্ভাবনা (৩৬৫ দিন, সমান সম্ভাবনা, স্বাধীন)? ২২ জনে? (খ) একটি hash-এর মান N = 216 = 65536টি, সমান সম্ভাবনায়। অন্তত কতটি আলাদা key দিলে collision-এর সম্ভাবনা প্রথম ০.৫ ছাড়ায়? আনুমানিক সূত্রের সঙ্গে মেলান। (ঝালিয়ে নিন: পর্ব ৪২)
(a) P(no match, k people) = (365/365)(364/365)…((365-k+1)/365)
    k = 23: 1 - 0.4927 = 0.5073 ; k = 22: 0.4757
(b) smallest k with 1 - ∏(1 - i/N) >= 0.5 : k = 302
    approximation k ≈ sqrt(2 N ln 2) ≈ 1.1774 · sqrt(N) = 1.1774 · 256 ≈ 301.4

N-এর বর্গমূলের কাছেই collision: ৬৫ হাজার মানের hash-এ মাত্র ৩০২টি key. তাই ১৬ bit-এর hash পরিচয় হিসেবে দুর্বল, আর cryptographic hash-এর output অনেক লম্বা রাখা হয়।

from itertools import product, combinations
from math import comb, prod
from fractions import Fraction as Fr
print("5.1 >=1 digit:", 36**6 - 26**6, "| PIN:", sum(1 for t in product(range(10), repeat=4)
      if t[0] != 0 and len(set(t)) == 4))
print("5.2 5 of 1..8, always a pair summing to 9:",
      all(any(x + y == 9 for x, y in combinations(S, 2)) for S in combinations(range(1, 9), 5)),
      "| some 4-set has none:", [S for S in combinations(range(1, 9), 4)
                                  if not any(x + y == 9 for x, y in combinations(S, 2))][:1])
print("5.3 coeff x^3 y^5 in (2x-y)^8:", comb(8, 3) * 2**3 * (-1)**5,
      "| paths (0,0)->(6,4):", comb(10, 4), "| via (3,2):", comb(5, 2) * comb(5, 2))
sols = [x for x in product(range(16), repeat=4) if sum(x) == 15]
print("5.4 all:", len(sols), "| x1>=2, x2>=1:", sum(x[0] >= 2 and x[1] >= 1 for x in sols),
      "| all <=6:", sum(max(x) <= 6 for x in sols))
pf, pn = Fr(2, 100) * Fr(95, 100), Fr(98, 100) * Fr(4, 100)
print("5.5 P(flag):", float(pf + pn), "| P(fraud|flag):", pf / (pf + pn), "=", round(float(pf / (pf + pn)), 4))
X = Fr(sum(range(1, 7)), 6); X2 = Fr(sum(k * k for k in range(1, 7)), 6)
print("5.6 E[X]:", X, "| Var:", X2 - X**2, "| Bin(10,0.3) E, Var:", 10 * 0.3, round(10 * 0.3 * 0.7, 2),
      "| E[pairs], 30 people:", Fr(comb(30, 2), 365), "~", round(comb(30, 2) / 365, 4))
p_coll = lambda k, N: 1 - prod((N - i) / N for i in range(k))
print("5.7 P(23 people):", round(p_coll(23, 365), 4), "| P(22):", round(p_coll(22, 365), 4),
      "| smallest k, N=2^16:", next(k for k in range(2, 1000) if p_coll(k, 2**16) >= 0.5))

Password 1867866560, PIN 4536. Pigeonhole-এর দাবি ৫৬টি পাঁচ-সংখ্যার সেটেই True, আর চার সংখ্যার counterexample (1, 2, 3, 4). সহগ -448, পথ 210 আর 100. Stars and bars-এর তিন উত্তর 816, 455, 180 সব tuple গুনে মিলেছে। Bayes 95/291 = 0.3265; variance 35/12, জোড়ার প্রত্যাশা 87/73; birthday 0.5073 আর 0.4757, আর 216 মানের hash-এ 302.

৬ · মডিউল ৮ — Recurrence, generating function আর উন্নত গণনা

সূত্রের কার্ড

an = c1an−1 + c2an−2: characteristic equation r2 = c1r + c2; আলাদা root ⇒ Ar1n + Br2n, দ্বিগুণ root ⇒ (A + Bn)rn. F(n) = sn-এর particular solution Csn, s root হলে Cn sn. Master: T(n) = aT(n/b) + Θ(nd): d < logba ⇒ Θ(nlogba), সমান ⇒ Θ(nd log n), বড় ⇒ Θ(nd). Dn = (n − 1)(Dn−1 + Dn−2). Burnside: orbit-এর সংখ্যা = প্রতিটি symmetry-র স্থির রঙের গড়।

৬.১(সহজ) সমাধান করুন: (ক) an = 5an−1 − 6an−2, a0 = 1, a1 = 4. (খ) an = 4an−1 − 4an−2, a0 = 1, a1 = 6. (ঝালিয়ে নিন: পর্ব ৪৫)
(a) r^2 - 5r + 6 = 0 -> r = 2, 3 ; a_n = A·2^n + B·3^n
    A + B = 1 ; 2A + 3B = 4 -> B = 2, A = -1 -> a_n = 2·3^n - 2^n
    check a_2 = 18 - 4 = 14 = 5·4 - 6·1
(b) r^2 - 4r + 4 = 0 -> r = 2 (double) ; a_n = (A + Bn)·2^n
    A = 1 ; 2(1 + B) = 6 -> B = 2 -> a_n = (1 + 2n)·2^n
    check a_2 = 5·4 = 20 = 4·6 - 4·1

দ্বিগুণ root-এ (A + Bn) না লিখে শুধু A · 2n লিখলে দুটি প্রাথমিক শর্ত একসঙ্গে মেলানো যায় না; এটিই সংকেত যে n-এর গুণক লাগবে।

৬.২(মাঝারি) (ক) an = 3an−1 + 2n, a0 = 1. (খ) an = 2an−1 + 2n, a0 = 1; এখানে particular solution-এর রূপ কেন বদলায়? (ঝালিয়ে নিন: পর্ব ৪৬)
(a) homogeneous: A·3^n ; try p_n = C·2^n:
    C·2^n = 3C·2^(n-1) + 2^n -> C = 3C/2 + 1 -> C = -2
    a_n = A·3^n - 2^(n+1) ; a_0: A - 2 = 1 -> A = 3 -> a_n = 3^(n+1) - 2^(n+1)
    check a_1 = 9 - 4 = 5 = 3·1 + 2
(b) 2 is a root of r - 2 = 0 -> try p_n = C·n·2^n:
    Cn·2^n = 2C(n-1)·2^(n-1) + 2^n -> Cn = C(n-1) + 1 -> C = 1
    a_n = A·2^n + n·2^n ; A = 1 -> a_n = (n + 1)·2^n

(খ)-তে C · 2n বসালে C = C + 1 আসে, যা অসম্ভব। Forcing term-এর ভিত্তি characteristic root হলে n দিয়ে গুণ করতে হয়; একে resonance বলে।

৬.৩(মাঝারি) Master theorem দিয়ে Θ বলুন: (ক) T(n) = 4T(n/2) + n; (খ) 2T(n/2) + n; (গ) 3T(n/4) + n; (ঘ) 7T(n/2) + n2; (ঙ) 2T(n/2) + n log n কেন এই ছাঁচে পড়ে না? (ঝালিয়ে নিন: পর্ব ৪৭)
(a) log2 4 = 2 > d = 1 -> Θ(n^2)
(b) log2 2 = 1 = d     -> Θ(n log n)
(c) log4 3 ≈ 0.792 < 1 -> Θ(n)
(d) log2 7 ≈ 2.807 > 2 -> Θ(n^2.807)   (Strassen-type)
(e) f(n) = n log n is not Θ(n^d) ; recursion tree: each level n log(n/2^j) -> Θ(n log^2 n)

তিন case মনে রাখার সহজ ছবি: q = a/bd > 1 হলে পাতা-ভারী গাছ, q = 1 সুষম, q < 1 মূল-ভারী। (ঙ)-র উত্তর পর্ব ৪৭-এ recursion tree দিয়ে পাওয়া।

৬.৪(মাঝারি) (ক) ১, ২ আর ৫ টাকার মুদ্রা (প্রতিটি যত খুশি) দিয়ে ১০ টাকা কয়ভাবে বানানো যায়? Generating function লিখে সহগ বের করুন। (খ) 1/(1 − x)3-এ x5-এর সহগ? (ঝালিয়ে নিন: পর্ব ৪৮)
(a) G(x) = 1/((1-x)(1-x^2)(1-x^5)) ; need [x^10]
    no 5-taka coin : 10 left, twos = 0..5 (ones fill the rest) -> 6
    one 5-taka coin: 5 left,  twos = 0..2                     -> 3
    two 5-taka coins: 0 left                                  -> 1
    total 6 + 3 + 1 = 10
(b) 1/(1-x)^3 = ∑ C(n + 2, 2) x^n -> C(7, 2) = 21

(ক)-তে সহগ বের করা মানে আসলে পাঁচ টাকার মুদ্রার সংখ্যা ধরে ভাগ করে গোনা; generating function এই গোনাকে গুণফলের সহগে রূপ দেয়। (খ) ঠিক ৫.৪-এর stars and bars: তিন চলকের যোগফল ৫.

৬.৫(মাঝারি) (ক) 1 থেকে 1000-এর কয়টি সংখ্যা 2, 3 বা 5 কোনোটি দিয়েই বিভাজ্য নয়? (খ) ৫টি পার্সেলের লেবেল এলোমেলো হলে একটিও ঠিক ঠিকানায় না যাওয়ার উপায় কয়টি, আর সম্ভাবনা কত? (ঝালিয়ে নিন: পর্ব ৪৯)
(a) |A2| = 500, |A3| = 333, |A5| = 200
    |A2∩A3| = 166, |A2∩A5| = 100, |A3∩A5| = 66, |A2∩A3∩A5| = 33
    |union| = 1033 - 332 + 33 = 734 -> 1000 - 734 = 266
(b) D_5 = 5!(1 - 1 + 1/2 - 1/6 + 1/24 - 1/120) = 60 - 20 + 5 - 1 = 44
    or D_n = (n-1)(D_(n-1) + D_(n-2)): D_3 = 2, D_4 = 9, D_5 = 4·(9 + 2) = 44
    P = 44/120 ≈ 0.3667   (close to 1/e ≈ 0.3679)

(ক)-তে ⌊1000/6⌋ = 166, ⌊1000/15⌋ = 66, ⌊1000/30⌋ = 33: floor না নিলে ভগ্নাংশ এসে উত্তর ভুল হয়। (খ)-র দুই পথের মিল একটি ভালো যাচাই।

৬.৬(কঠিন) (ক) ৫ জন কর্মীকে ঠিক ২টি এবং ঠিক ৩টি অশূন্য, নামহীন দলে ভাগের উপায় (S(5, 2), S(5, 3))? ৫ জনকে যেকোনো সংখ্যক দলে (Bell B5)? (খ) ৫ জোড়া বন্ধনীর বৈধ বিন্যাস (Catalan C5)? (গ) 7-এর partition p(7), আর আলাদা আলাদা অংশে কয়টি? (ঝালিয়ে নিন: পর্ব ৫০)
(a) S(n,k) = k·S(n-1,k) + S(n-1,k-1)
    S(5,2) = 2^4 - 1 = 15 ; S(5,3) = 3·S(4,3) + S(4,2) = 3·6 + 7 = 25
    B5 = S(5,1..5) = 1 + 15 + 25 + 10 + 1 = 52
(b) C5 = C(10,5)/6 = 252/6 = 42
(c) p(7) = 15 ; distinct parts: 7, 6+1, 5+2, 4+3, 4+2+1 -> 5
    (Euler: equals partitions into odd parts: 7, 5+1+1, 3+3+1, 3+1+1+1+1, 1×7 -> 5)

S(5, 2) = 24 − 1-এর যুক্তি: প্রথম জন যে দলে, বাকি চারজন প্রত্যেকে “সঙ্গে” বা “অন্য দলে”; সবাই সঙ্গে থাকলে দ্বিতীয় দল খালি, তাই বাদ।

৬.৭(কঠিন) (ক) ৬টি পুঁতির মালা, প্রতিটি পুঁতি লাল বা সাদা; শুধু ঘোরানো (rotation) একই ধরলে কয়টি আলাদা necklace? (খ) ৪টি পুঁতি, ৩টি রঙে? (ঝালিয়ে নিন: পর্ব ৫১)
(a) rotation by r positions fixes k^gcd(r, 6) colourings (k = 2):
    r = 0: 2^6 = 64 ; r = 1, 5: 2^1 = 2 each ; r = 2, 4: 2^2 = 4 each ; r = 3: 2^3 = 8
    (64 + 2 + 4 + 8 + 4 + 2)/6 = 84/6 = 14
(b) (3^4 + 3^1 + 3^2 + 3^1)/4 = (81 + 3 + 9 + 3)/4 = 96/4 = 24

২৬/৬ ভগ্নাংশ (১০.৬৭) দেয়, তাই সরল ভাগ ভুল: যে মালা ঘোরালে বদলায় না (যেমন সব লাল), তার শ্রেণি ছোট। Burnside-এর গড় সবসময় পূর্ণসংখ্যা আসে, আর তা না এলে হিসাবে ভুল আছে।

from math import comb, gcd, log
from itertools import combinations
def run(rule, init, n=8):                       # list a_0 .. a_{n-1} of a recurrence
    a = list(init)
    while len(a) < n:
        a.append(rule(a, len(a)))
    return a
print("6.1", run(lambda a, n: 5*a[-1] - 6*a[-2], [1, 4])[:5], run(lambda a, n: 5*a[-1] - 6*a[-2], [1, 4]) == [2*3**n - 2**n for n in range(8)],
      run(lambda a, n: 4*a[-1] - 4*a[-2], [1, 6]) == [(1 + 2*n) * 2**n for n in range(8)])
print("6.2", run(lambda a, n: 3*a[-1] + 2**n, [1])[:5], run(lambda a, n: 3*a[-1] + 2**n, [1]) == [3**(n+1) - 2**(n+1) for n in range(8)],
      run(lambda a, n: 2*a[-1] + 2**n, [1]) == [(n + 1) * 2**n for n in range(8)])
print("6.3 log_b a:", [round(log(a, b), 3) for a, b in [(4, 2), (2, 2), (3, 4), (7, 2)]])
w = [1] + [0] * 10                               # 6.4: coins 1, 2, 5 taka
for c in (1, 2, 5):
    for v in range(c, 11):
        w[v] += w[v - c]
print("6.4 ways to make 10:", w[10], "| [x^5] 1/(1-x)^3:", comb(7, 2))
D = [1, 0]
for n in range(2, 7):
    D.append((n - 1) * (D[-1] + D[-2]))
print("6.5 not div by 2,3,5:", sum(1 for i in range(1, 1001) if i % 2 and i % 3 and i % 5),
      "| D_0..D_6:", D, "| D_5/5!:", round(D[5] / 120, 4))
S = lambda n, k: 1 if n == k else 0 if k == 0 or k > n else k * S(n-1, k) + S(n-1, k-1)
P = lambda n, m: 1 if n == 0 else sum(P(n - i, i) for i in range(1, min(n, m) + 1))
print("6.6 S(5,2), S(5,3):", S(5, 2), S(5, 3), "| Bell B4, B5:", sum(S(4, k) for k in range(5)), sum(S(5, k) for k in range(6)),
      "| Catalan C5:", comb(10, 5) // 6, "| p(7):", P(7, 7), "| distinct parts:",
      sum(1 for L in range(1, 8) for c in combinations(range(1, 8), L) if sum(c) == 7))
neck = lambda n, k: sum(k ** gcd(r, n) for r in range(n)) // n
print("6.7 necklaces (6 beads, 2 colours):", neck(6, 2), "| (4 beads, 3 colours):", neck(4, 3))

Recurrence-এর লাইনে প্রথম পাঁচটি পদ ([1, 4, 14, 46, 146], [1, 5, 19, 65, 211]) আর closed form-এর সঙ্গে আটটি পদের মিল True True. logba-এর মান [2.0, 1.0, 0.792, 2.807] master theorem-এর চার case বেছে দেয়। মুদ্রা 10, সহগ 21, inclusion–exclusion 266, D5 = 44 আর সম্ভাবনা 0.3667. বিশেষ সংখ্যা 15 25, Bell 15 52, Catalan 42, p(7) 15, আলাদা অংশে 5. Burnside 14 আর 24, দুটিই পূর্ণসংখ্যা।

৭ · মডিউল ৯–১০ — Relation আর graph

সূত্রের কার্ড

n সদস্যের সেটে relation 2n²টি, reflexive 2n²−n, symmetric 2n(n+1)/2, antisymmetric 2n3n(n−1)/2. Warshall: Wk[i][j] = Wk−1[i][j] ∨ (Wk−1[i][k] ∧ Wk−1[k][j]). Handshake: ∑deg = 2|E|. Connected graph-এ Euler circuit ⇔ সব degree জোড়; Euler path (circuit নয়) ⇔ ঠিক দুটি বিজোড়। Connected planar: V − E + F = 2; simple হলে (V ≥ 3) E ≤ 3V − 6, triangle না থাকলে E ≤ 2V − 4.

৭.১(সহজ) {1, 2, 3, 4}-এ R = {(1,1), (1,2), (2,1), (2,2), (3,3), (4,4), (3,4)}. R কি reflexive, symmetric, antisymmetric, transitive? প্রতিটির কারণ দিন। এই সেটে মোট কয়টি antisymmetric relation? (ঝালিয়ে নিন: পর্ব ৫২)
reflexive     : YES, (1,1) (2,2) (3,3) (4,4) all present
symmetric     : NO , (3,4) in R but (4,3) not
antisymmetric : NO , (1,2) and (2,1) with 1 ≠ 2
transitive    : YES, every chain checked: (1,2)(2,1)->(1,1) ok, (2,1)(1,2)->(2,2) ok,
                (3,4)(4,4)->(3,4) ok, (3,3)(3,4)->(3,4) ok, ...
antisymmetric relations on 4 elements: 2^4 · 3^6 = 16 · 729 = 11664

Symmetric নয় আর antisymmetric-ও নয়, দুটি একসঙ্গে হতে পারে: দুটি ধর্ম একে অপরের উল্টো নয়। শেষ গণনায় ৪টি diagonal ঘর স্বাধীন (24), আর প্রতিটি অ-diagonal জোড়ার {(i, j), (j, i)}-এ তিনটি বৈধ বিকল্প: কোনোটি নয়, শুধু একটি, শুধু অন্যটি।

৭.২(মাঝারি) {1, 2, 3, 4}-এ R = {(1,2), (2,3), (3,4), (4,2)}. Warshall চালিয়ে W1…W4-এর সারিগুলো লিখুন। Transitive closure-এ কোন জোড়াগুলো নেই? (ঝালিয়ে নিন: পর্ব ৫৪)
rows (1..4) as bit strings of columns 1..4
W0 = R : 0100 0010 0001 0100
W1     : 0100 0010 0001 0100   (nobody reaches 1)
W2     : 0110 0010 0001 0110   (1->2->3, 4->2->3)
W3     : 0111 0011 0001 0111   (via 3: reach 4)
W4     : 0111 0111 0111 0111   (via 4: 2->...->4->2, 3->4->2)
missing: (1,1), (2,1), (3,1), (4,1) — no arrow ever enters 1

ধাপ k-তে শুধু k-কে মাঝের vertex হিসেবে অনুমতি দেওয়া হয়। Column 1-এ কেউ পৌঁছায় না, তাই closure-এ সেটি খালি; 2, 3, 4 একটি cycle, তাই তাদের নিজেদের সঙ্গে (2, 2), (3, 3), (4, 4) যোগ হয়।

৭.৩(সহজ) (ক) ℤ-এ a ~ b ⇔ 3 ∣ (a − b). Equivalence class কয়টি, আর −7 কোনটিতে? (খ) দৈর্ঘ্য ৩-এর bit string-এ “একই সংখ্যক 1” relation-এর class আর তাদের আকার? (গ) চার সদস্যের সেটে মোট কয়টি equivalence relation? (ঝালিয়ে নিন: পর্ব ৫৫)
(a) 3 classes [0], [1], [2] ; -7 = 3·(-3) + 2 -> [2]
(b) number of 1s = 0, 1, 2, 3 -> 4 classes of sizes 1, 3, 3, 1 (total 8)
(c) equivalence relations <-> partitions -> Bell number B4 = 15

(ক)-তে −7 mod 3-কে −1 লেখা সাধারণ ভুল; এই পাতার নিয়মে ভাগশেষ 0 থেকে 2-এর মধ্যে। (গ) equivalence relation আর partition-এর এক-এক মিল থেকে; B4 = 1 + 7 + 6 + 1 = 15.

৭.৪(মাঝারি) 36-এর ভাজকগুলোর ওপর বিভাজ্যতার poset. (ক) Hasse diagram-এ কয়টি edge? (খ) সবচেয়ে বড় chain আর antichain-এর একটি উদাহরণ। (গ) lub(4, 6) আর glb(12, 18)? (ঘ) একটি topological sort লিখুন। (ঝালিয়ে নিন: পর্ব ৫৬)
divisors: 1 2 3 4 6 9 12 18 36  (36 = 2^2·3^2 -> a 3×3 grid)
(a) covers multiply by one prime: 2 directions × 2 steps × 3 lines = 12 edges
(b) chain 1 | 2 | 4 | 12 | 36 (5 elements) ; antichain {4, 6, 9} (3 elements)
(c) lub(4, 6) = lcm = 12 ; glb(12, 18) = gcd = 6
(d) 1, 2, 3, 4, 6, 9, 12, 18, 36 (any order that puts each divisor before its multiples)

এই poset একটি lattice, কারণ যেকোনো দুটির lcm আর gcd ভাজকের মধ্যেই থাকে। মোট কয়টি topological sort সম্ভব, তা গোনা কঠিন প্রশ্ন: scratch script-এ সব ক্রম পরীক্ষা করে উত্তর এসেছে ৪২.

৭.৫(মাঝারি) (ক) একটি connected graph-এর degree sequence (4, 4, 3, 3, 2, 2): কয়টি edge? Euler path বা circuit আছে কি? (খ) (3, 3, 3, 1) কি কোনো simple graph-এর degree sequence? Havel–Hakimi চালান। (গ) K5-এ কয়টি আলাদা Hamilton cycle? (ঝালিয়ে নিন: পর্ব ৫৭, ৬০)
(a) sum = 18 -> 9 edges ; odd-degree vertices: two (the 3s)
    -> Euler path (between the two 3s), no Euler circuit
(b) 3,3,3,1 -> remove 3, subtract 1 from next 3: 2,2,0
    -> remove 2, subtract from next 2: 1,-1 -> negative: NOT graphical
(c) fix a start vertex, order the other 4: 4! = 24 ; each cycle counted twice
    (two directions) -> 12

(খ)-র সহজ কারণও আছে: degree 3-এর তিনটি vertex-এর প্রত্যেকে বাকি তিনজনের সঙ্গেই যুক্ত, ফলে চতুর্থটির degree অন্তত 3 হতো, 1 নয়। (ক)-তে sequence-টি বাস্তবে সম্ভব কি না Havel–Hakimi দিয়ে যাচাই করা হয়েছে (চেকার দেখুন)।

৭.৬ আর ৮.৩-এর graph — বাজারঘরের ছয়টি হাব (কাল্পনিক সময়, মিনিটে)

প্রতিটি রেখা দুই দিকের রাস্তা। সবুজ মোটা রেখা A থেকে shortest path tree; ধূসর রেখা কোনো সবচেয়ে ছোট পথে লাগে না। A থেকে দূরত্ব: C 2, B 3, D 8, E 10, F 12.

Six hubs A to F with travel times; the shortest path tree from A is drawn in thick green 4 2 1 5 8 10 2 4 3 ABC DEF
৭.৬(মাঝারি) ছবির graph-এ (edge: A–B 4, A–C 2, B–C 1, B–D 5, C–D 8, C–E 10, D–E 2, D–F 4, E–F 3) A থেকে Dijkstra চালান। কোন ক্রমে vertex settled হয়, আর প্রতিটির দূরত্ব ও আগের vertex কী? (ঝালিয়ে নিন: পর্ব ৬১)
settle A(0) : B 4, C 2
settle C(2) : B min(4, 2+1) = 3 ; D 2+8 = 10 ; E 2+10 = 12
settle B(3) : D min(10, 3+5) = 8
settle D(8) : E min(12, 8+2) = 10 ; F 8+4 = 12
settle E(10): F min(12, 10+3) = 12 (no change)
settle F(12)
order A C B D E F ; parents: C<-A, B<-C, D<-B, E<-D, F<-D

B-তে সরাসরি রাস্তা ৪ মিনিট, অথচ C হয়ে ৩: “সরাসরি পথই ছোট” ধারণা ভুল। Dijkstra-র সঠিকতার শর্ত সব weight অঋণাত্মক; এখানে তা সত্য। নিচের stepper প্রতিটি settle-এর পরের দূরত্বের তালিকা দেখায়।

ধাপ ১A settled
settled: A
A0 B4 C2 D∞ E∞ F∞
next: C (2)
ধাপ ২C settled
settled: A C
A0 B3 C2 D10 E12 F∞
next: B (3)
ধাপ ৩B settled
settled: A C B
A0 B3 C2 D8 E12 F∞
next: D (8)
ধাপ ৪D settled
settled: A C B D
A0 B3 C2 D8 E10 F12
next: E (10)
ধাপ ৫E আর F
E: F via E = 13 > 12
settled: A C B D E F
A0 B3 C2 D8 E10 F12
  1. শুরু। A-র দূরত্ব 0; প্রতিবেশী B পায় 4, C পায় 2. সবচেয়ে ছোট অস্থায়ী দূরত্ব C-এর।
  2. C থেকে relax. B-তে 2 + 1 = 3 < 4, তাই B হলো 3; D পায় 10, E পায় 12.
  3. B থেকে relax. D-তে 3 + 5 = 8 < 10, তাই D হলো 8.
  4. D থেকে relax. E-তে 8 + 2 = 10 < 12; F পায় 8 + 4 = 12.
  5. শেষ দুটি। E থেকে F-এ 10 + 3 = 13, যা 12-এর বেশি, তাই বদল নেই। F settled হয় 12-এ; সব দূরত্ব চূড়ান্ত।
৭.৭(মাঝারি) (ক) একটি connected planar graph-এ ১০টি vertex আর ১৫টি edge: কয়টি face? (খ) K3,3 কেন planar নয়, সংখ্যা দিয়ে দেখান। (গ) C4 (চার vertex-এর cycle)-কে ৩টি রঙে কয়ভাবে বৈধভাবে রাঙানো যায়? C5-এর chromatic number কত? (ঝালিয়ে নিন: পর্ব ৬২, ৬৩)
(a) V - E + F = 2 -> F = 2 - 10 + 15 = 7
(b) K3,3: V = 6, E = 9 ; bipartite -> no triangle -> planar would need E <= 2V - 4 = 8
    9 > 8 -> not planar
(c) chromatic polynomial of C_n: (k-1)^n + (-1)^n (k-1)
    C4, k = 3: 2^4 + 2 = 18 ; C5 is an odd cycle -> 2 colours impossible -> χ = 3

(খ)-তে E ≤ 3V − 6 = 12 শর্ত K3,3 পূরণ করে, তাই তা দিয়ে কিছু প্রমাণ হয় না; triangle-হীন graph-এর কড়া শর্ত 2V − 4 লাগে। মনে রাখুন, শর্ত পূরণ হলেই planar নয়: এগুলো শুধু প্রয়োজনীয় শর্ত।

৭.৮(কঠিন) চারজন rider আর চারটি অর্ডার। কে কোন অর্ডার নিতে পারেন: R1 → {O1, O2}, R2 → {O1}, R3 → {O2, O3}, R4 → {O3, O4}. লোভী শুরুতে R1–O1, R3–O2, R4–O3 জোড়া হয়েছে। (ক) একটি augmenting path খুঁজে perfect matching দিন। (খ) R4-এর তালিকা শুধু {O3} হলে perfect matching কেন অসম্ভব? (ঝালিয়ে নিন: পর্ব ৬৪)
(a) start at free R2: R2 - O1 = R1 - O2 = R3 - O3 = R4 - O4 (free)
    ( - : non-matching edge, = : matching edge ) ; flip all edges:
    R2-O1, R1-O2, R3-O3, R4-O4 : size 4 (perfect)
(b) all four riders together can only take {O1, O2, O3}: 3 < 4
    Hall's condition fails -> maximum matching 3

Augmenting path দুই প্রান্তেই খালি vertex, আর edge-গুলো পালাক্রমে matching-এর বাইরে ও ভেতরে; উল্টে দিলে matching এক বাড়ে, এটিই Berge-এর উপপাদ্যের মূল কথা। (খ)-তে Hall-এর শর্ত ভাঙার একটি সেটই অসম্ভবতার প্রমাণ।

import heapq
X = [1, 2, 3, 4]; R = {(1, 1), (1, 2), (2, 1), (2, 2), (3, 3), (4, 4), (3, 4)}
print("7.1 reflexive:", all((x, x) in R for x in X), "| symmetric:", all((b, a) in R for a, b in R),
      "| antisymmetric:", all(a == b or (b, a) not in R for a, b in R),
      "| transitive:", all((a, d) in R for a, b in R for c, d in R if b == c))
W = {i: {j: 0 for j in X} for i in X}
for a, b in [(1, 2), (2, 3), (3, 4), (4, 2)]:
    W[a][b] = 1
for k in X:                                         # Warshall: allow k as an interior vertex
    W = {i: {j: W[i][j] or (W[i][k] and W[k][j]) for j in X} for i in X}
    print("7.2 W%d rows:" % k, ["".join(str(W[i][j]) for j in X) for i in X])
Dv = [d for d in range(1, 37) if 36 % d == 0]
cover = [(a, b) for a in Dv for b in Dv if a != b and b % a == 0
         and not any(c not in (a, b) and c % a == 0 and b % c == 0 for c in Dv)]
print("7.4 Hasse edges:", len(cover))
G = {}
for u, v, w in [("A","B",4), ("A","C",2), ("B","C",1), ("B","D",5), ("C","D",8),
                ("C","E",10), ("D","E",2), ("D","F",4), ("E","F",3)]:
    G.setdefault(u, []).append((v, w)); G.setdefault(v, []).append((u, w))
dist, done, pq = {"A": 0}, [], [(0, "A")]
while pq:
    d, u = heapq.heappop(pq)
    if u in done:
        continue
    done.append(u)
    for v, w in G[u]:
        if d + w < dist.get(v, 99):
            dist[v] = d + w; heapq.heappush(pq, (d + w, v))
print("7.6 settle order:", done, "| dist:", dict(sorted(dist.items())))

Relation-এর চার ধর্ম: True, False, False, True. Warshall-এর চারটি লাইন হাতে লেখা W1…W4-এর সঙ্গে হুবহু মেলে; শেষে প্রতিটি সারি 0111, অর্থাৎ column 1 খালি। Hasse diagram-এ 12টি edge. Dijkstra-র settle-ক্রম A C B D E F, আর দূরত্ব F: 12 পর্যন্ত ছবির নিচের লেখার সঙ্গে এক।

from itertools import product, permutations
def graphical(seq):                                  # Havel-Hakimi
    s = sorted(seq, reverse=True)
    while s and s[0] > 0:
        d = s.pop(0)
        if d > len(s):
            return False
        s = [x - 1 if i < d else x for i, x in enumerate(s)]
        if min(s) < 0:
            return False
        s.sort(reverse=True)
    return True
print("7.5 graphical (4,4,3,3,2,2):", graphical([4, 4, 3, 3, 2, 2]), "| (3,3,3,1):", graphical([3, 3, 3, 1]),
      "| Hamilton cycles in K5:", len({min(p, p[::-1]) for p in permutations(range(1, 5))}))
C4 = [(0, 1), (1, 2), (2, 3), (3, 0)]
print("7.7 proper 3-colourings of C4:", sum(all(c[a] != c[b] for a, b in C4) for c in product(range(3), repeat=4)),
      "| formula (k-1)^4 + (k-1):", 2**4 + 2)
likes = {"R1": ["O1", "O2"], "R2": ["O1"], "R3": ["O2", "O3"], "R4": ["O3", "O4"]}
def max_matching(likes):
    match = {}                                       # order -> rider
    def augment(r, seen):
        for o in likes[r]:
            if o not in seen:
                seen.add(o)
                if o not in match or augment(match[o], seen):
                    match[o] = r; return True
        return False
    return sum(augment(r, set()) for r in likes), match
print("    matching size:", max_matching(likes)[0],
      "| with R4 -> O3 only:", max_matching({**likes, "R4": ["O3"]})[0])

Havel–Hakimi: (4, 4, 3, 3, 2, 2) True, (3, 3, 3, 1) False. K5-এর Hamilton cycle 12, কারণ চেকার প্রতিটি cycle আর তার উল্টো দিককে একবারই গোনে। C4-এর বৈধ ৩-রঙ সব 34 = 81টি বিন্যাস দেখে 18, সূত্রের সঙ্গে মিল। Augmenting path-ভিত্তিক matching 4 দেয়, আর R4-এর তালিকা ছোট করলে 3: Hall-এর শর্ত ভাঙার ফল।

৮ · মডিউল ১১–১২ — Tree, Huffman, Boolean algebra, group আর code

সূত্রের কার্ড

Tree-তে E = V − 1. Full m-ary tree, i internal ⇒ n = mi + 1, leaf = (m − 1)i + 1. Height h-এর m-ary tree-তে leaf ≤ mh. Cayley: labelled tree nn−2টি। Kruskal: ছোট থেকে বড় edge, cycle হলে বাদ। Huffman-এর গড় দৈর্ঘ্য = ∑ (ঘনত্ব × গভীরতা)। Lagrange: সসীম group-এ subgroup-এর order ∣ group-এর order. Hamming(7,4)-এ একটি error হলে syndrome = ভুল বিটের অবস্থানের binary রূপ।

৮.১(সহজ) (ক) ২০টি vertex-এর tree-তে কয়টি edge? ৩টি component-এর ২০ vertex-এর forest-এ? (খ) ১০টি internal vertex-এর full 3-ary tree-তে মোট vertex আর leaf? (গ) ১০০টি leaf-এর binary tree-র height অন্তত কত? (ঘ) {1, …, 5}-এর ওপর কয়টি labelled tree? (ঝালিয়ে নিন: পর্ব ৬৫)
(a) 19 ; forest: each component loses one -> 20 - 3 = 17
(b) n = 3·10 + 1 = 31 ; leaves = 2·10 + 1 = 21
(c) 2^h >= 100 -> h >= ⌈log2 100⌉ = 7
(d) Cayley 5^(5-2) = 125

(গ)-র যুক্তিই comparison sort-এর নিচের সীমার ভিত্তি: n!টি leaf-এর decision tree-র height অন্তত ⌈log2 n!⌉. (ঘ)-র ১২৫ চেকার K5-এর সব ৪-edge উপসেট পরীক্ষা করে মিলিয়েছে।

৮.২(মাঝারি) (ক) Edge 1–4, 2–4, 3–4, 4–5, 5–6-এর tree-র Prüfer code লিখুন। (খ) Prüfer code (2, 3, 3, 5) থেকে tree ফিরিয়ে আনুন। (ঝালিয়ে নিন: পর্ব ৬৫)
(a) leaves 1,2,3,6 ; remove 1 -> write 4 ; remove 2 -> 4 ; remove 3 -> 4
    now 4 is a leaf (neighbour 5), leaves 4,6 -> remove 4 -> write 5 ; stop (n - 2 = 4)
    code (4, 4, 4, 5)
(b) n = 6 ; degree = 1 + appearances: d1=1 d2=2 d3=3 d4=1 d5=2 d6=1
    smallest leaf 1 -> edge 1-2 ; then 2 is a leaf -> edge 2-3
    smallest leaf 4 -> edge 4-3 ; then 3 is a leaf -> edge 3-5
    last two degree-1 vertices 5, 6 -> edge 5-6

একটি vertex code-এ যতবার আসে, তার degree তার চেয়ে এক বেশি: (ক)-তে 4 এসেছে তিনবার, degree 4. এই নিয়মে শুরুতেই leaf-গুলো চেনা যায়, যা decode-এর মূল চাবি।

৮.৩(মাঝারি) ৭.৬-এর ছবির graph-এ Kruskal চালিয়ে MST আর তার ওজন বের করুন। এটি কি A-এর shortest path tree-র সমান? (ঝালিয়ে নিন: পর্ব ৬৭)
sorted: B-C 1, A-C 2, D-E 2, E-F 3, A-B 4, D-F 4, B-D 5, C-D 8, C-E 10
take B-C 1, A-C 2, D-E 2, E-F 3
skip A-B 4 (A-C-B cycle), skip D-F 4 (D-E-F cycle)
take B-D 5 -> 5 edges = V - 1 : stop ; weight 1+2+2+3+5 = 13
shortest path tree from A: A-C, C-B, B-D, D-E, D-F -> weight 2+1+5+2+4 = 14

দুটি আলাদা: MST মোট তারের দৈর্ঘ্য ছোট করে, shortest path tree একটি উৎস থেকে প্রতিটি গন্তব্যের পথ ছোট করে। MST-তে A থেকে F-এ যেতে লাগে 2 + 1 + 5 + 2 + 3 = 13, অথচ সবচেয়ে ছোট পথ 12. A–B আর D–F-এর ওজন সমান (4) হলেও দুটিই বাদ, তাই এখানে tie ফলাফল বদলায় না।

৮.৪(মাঝারি) বাজারঘরের লগে ছয়টি চিহ্নের ঘনত্ব (প্রতি ১০০টিতে): a 40, b 20, c 15, d 12, e 8, f 5. (ক) Huffman code বানান। (খ) গড় দৈর্ঘ্য কত, আর fixed-length code-এর তুলনায় কত সাশ্রয়? (গ) Entropy-র সঙ্গে তুলনা করুন। (ঝালিয়ে নিন: পর্ব ৬৮)
(a) merges: 5+8=13 ; 12+13=25 ; 15+20=35 ; 25+35=60 ; 40+60=100
    codes (lighter tree = 0): a 0, d 100, f 1010, e 1011, c 110, b 111
(b) 40·1 + 20·3 + 15·3 + 12·3 + 8·4 + 5·4 = 233 bits per 100 -> 2.33 bits/symbol
    fixed length: ⌈log2 6⌉ = 3 bits -> saves 0.67 bits (about 22%)
(c) H = -∑ p log2 p ≈ 2.2784 <= 2.33 < H + 1

নিচের stepper পাঁচটি জোড়া লাগানো দেখায়। Tie না থাকায় দৈর্ঘ্যগুলো অনন্য; tie থাকলে tree বদলাতে পারে, কিন্তু গড় দৈর্ঘ্য একই থাকে। Entropy-র নিচে কোনো prefix code যেতে পারে না।

ধাপ ১দুই হালকা
a40 b20 c15 d12 e8 f5
f5 + e8 = 13
left: a40 b20 c15 d12 [13]
ধাপ ২d আর 13
d12 + [13] = 25
left: a40 b20 c15 [25]
ধাপ ৩c আর b
c15 + b20 = 35
left: a40 [25] [35]
ধাপ ৪দুই গাছ
[25] + [35] = 60
left: a40 [60]
ধাপ ৫Root
a40 + [60] = 100
a 0 · d 100 · f 1010
e 1011 · c 110 · b 111
  1. সবচেয়ে হালকা দুটি। f (5) আর e (8) জুড়ে ওজন 13-এর গাছ; f বাঁয়ে (0) আর e ডানে (1) বসে।
  2. আবার দুই হালকা। এখন সবচেয়ে কম d (12) আর নতুন গাছ (13): জুড়ে 25.
  3. c আর b জোড়া। বাকি a 40, b 20, c 15, গাছ 25; সবচেয়ে কম c (15) আর b (20): 35.
  4. দুই গাছ। 25 আর 35 জুড়ে 60; a (40) এখনো একা।
  5. শেষ জোড়া। a (40) বাঁয়ে, 60-এর গাছ ডানে। a-এর code 0, বাকিদের code ১ দিয়ে শুরু, দৈর্ঘ্য ৩ বা ৪.
৮.৫(মাঝারি) F(a, b, c, d) = Σm(0, 1, 2, 5, 8, 9, 10). K-map বা Quine–McCluskey দিয়ে সবচেয়ে ছোট SOP বের করুন। কোন prime implicant essential? (ঝালিয়ে নিন: পর্ব ৬৯)
minterms (abcd): 0000 0001 0010 0101 1000 1001 1010
group 0,1,8,9   : b=0, c=0        -> b'c'
group 0,2,8,10  : b=0, d=0        -> b'd'   (four corners of the map)
group 1,5       : a=0, c=0, d=1   -> a'c'd
F = b'c' + b'd' + a'c'd
essential: b'c' (only one covering 9), b'd' (only one covering 2, 10), a'c'd (only one covering 5)

তিনটিই essential, তাই উত্তর অনন্য। চার কোণের group (0, 2, 8, 10) K-map-এ চোখ এড়িয়ে যায়, কারণ map-এর কিনারা গোল হয়ে মেলে; Quine–McCluskey-তে এটি সারি মিলিয়েই ধরা পড়ে।

৮.৬(মাঝারি) (ক) (ℤ12, +)-এ 8-এর order কত? ℤ12-এর generator কয়টি? (খ) U(15) = {k : gcd(k, 15) = 1}, গুণ mod 15: group-এর order আর 2-এর order? (গ) ℤ12-এ H = {0, 4, 8}-এর coset-গুলো লিখুন। (ঘ) ১২ order-এর group-এ ৫ order-এর subgroup থাকতে পারে কি? (ঝালিয়ে নিন: পর্ব ৭০)
(a) order of 8 = 12/gcd(8, 12) = 3 (8, 16≡4, 24≡0) ; generators: gcd(k,12)=1 -> 1,5,7,11 -> 4
(b) U(15) = {1,2,4,7,8,11,13,14} -> order 8 ; 2,4,8,16≡1 -> order of 2 = 4
(c) H, 1+H = {1,5,9}, 2+H = {2,6,10}, 3+H = {3,7,11} -> 4 cosets = 12/3
(d) No: 5 does not divide 12 (Lagrange)

(খ)-তে 2-এর order ৪, যা group-এর order ৮-কে ভাগ করে, Lagrange-এর সঙ্গে মিল। Coset-গুলো সমান আকারের আর পরস্পর বিচ্ছিন্ন, পুরো group-কে ভাগ করে; Lagrange-এর প্রমাণ ঠিক এই।

৮.৭(মাঝারি) GF(2)-এর ওপর: (ক) x6 + x5 + x2 + 1-কে x3 + x + 1 দিয়ে ভাগ করুন। (খ) x3 + x + 1 কি irreducible? (গ) বার্তা 1101011, generator 1011: CRC-এর ৩টি বিট কী? (ঝালিয়ে নিন: পর্ব ২৬, ৭১)
(a) bits: 1100101 ÷ 1011 (subtraction = XOR)
    1100101 xor 1011000 = 0111101   (q gets x^3)
    0111101 xor 0101100 = 0010001   (q gets x^2)
    0010001 xor 0010110 = 0000111   (q gets x^1)
    quotient x^3 + x^2 + x ; remainder x^2 + x + 1 (111)
(b) degree 3: reducible would need a linear factor = a root in GF(2)
    p(0) = 1, p(1) = 1 + 1 + 1 = 1 -> no root -> irreducible
(c) 1101011 000 ÷ 1011 -> remainder 110 -> send 1101011110

GF(2)-এ যোগ আর বিয়োগ একই (XOR), তাই কোনো “ধার” নেই। (খ)-র root পরীক্ষা শুধু degree ২ বা ৩-এ যথেষ্ট; degree ৪-এ দুটি degree-২ উৎপাদকও দেখতে হয়।

৮.৮(কঠিন) Hamming(7,4), parity অবস্থান 1, 2, 4. (ক) Data 1101 encode করুন। (খ) প্রাপক পেলেন 1010111: syndrome আর সংশোধিত শব্দ? (গ) পাঠানো শব্দের অবস্থান 2 আর 5 দুটিই উল্টে 1110001 এলে decoder কী করে? (ঝালিয়ে নিন: পর্ব ৭২)
(a) c3 c5 c6 c7 = 1 1 0 1
    p1 = c3^c5^c7 = 1^1^1 = 1 ; p2 = c3^c6^c7 = 1^0^1 = 0 ; p4 = c5^c6^c7 = 1^0^1 = 0
    codeword c1..c7 = 1 0 1 0 1 0 1 = 1010101
(b) 1s at positions 1,3,5,6,7 -> XOR of positions: 1^3^5^6^7 = 6 -> syndrome 110 = 6
    flip bit 6 -> 1010101 ; data 1101
(c) 1s at 1,2,3,7 -> 1^2^3^7 = 7 -> decoder flips bit 7 -> 1110000 : WRONG codeword

Minimum distance ৩ মানে একটি error শোধরানো যায়, কিন্তু দুটি error-এ decoder ভুল দিকে “শোধরায়”। তাই বাড়তি একটি parity বিট দিয়ে SECDED (8,4) code ব্যবহার হয়: একটি শোধরায়, দুটি অন্তত ধরে।

import heapq, math
def prufer(edges, n):
    adj = {v: set() for v in range(1, n + 1)}
    for a, b in edges:
        adj[a].add(b); adj[b].add(a)
    code = []
    for _ in range(n - 2):
        leaf = min(v for v in adj if len(adj[v]) == 1)   # smallest leaf
        nb = adj.pop(leaf).pop(); adj[nb].discard(leaf); code.append(nb)
    return code
print("8.2 code:", prufer([(1, 4), (2, 4), (3, 4), (4, 5), (5, 6)], 6),
      "| check (2,3,3,5):", prufer([(1, 2), (2, 3), (3, 4), (3, 5), (5, 6)], 6))
E = [("A","B",4), ("A","C",2), ("B","C",1), ("B","D",5), ("C","D",8),
     ("C","E",10), ("D","E",2), ("D","F",4), ("E","F",3)]
comp = {v: v for v in "ABCDEF"}; tree = []
for u, v, w in sorted(E, key=lambda e: e[2]):           # Kruskal
    cu, cv = comp[u], comp[v]
    if cu != cv:
        tree.append(u + v); comp = {x: cu if c == cv else c for x, c in comp.items()}
print("8.3 MST:", tree, "| weight:", sum(w for u, v, w in E if u + v in tree))
freq = {"a": 40, "b": 20, "c": 15, "d": 12, "e": 8, "f": 5}
h = [(w, i, {s: ""}) for i, (s, w) in enumerate(freq.items())]; heapq.heapify(h)
while len(h) > 1:
    w1, i, c1 = heapq.heappop(h); w2, j, c2 = heapq.heappop(h)
    print("    merge", w1, "+", w2, "=", w1 + w2)
    heapq.heappush(h, (w1 + w2, min(i, j) + 10, {**{s: "0" + c for s, c in c1.items()},
                                                **{s: "1" + c for s, c in c2.items()}}))
code = h[0][2]
print("8.4 codes:", dict(sorted(code.items())), "| avg bits:", sum(freq[s] * len(code[s]) for s in freq) / 100,
      "| entropy:", round(-sum(w / 100 * math.log2(w / 100) for w in freq.values()), 4))

Prüfer code [4, 4, 4, 5]; আর (খ)-তে পাওয়া tree-কে আবার encode করলে [2, 3, 3, 5] ফিরে আসে, অর্থাৎ decode ঠিক ছিল। Kruskal নেয় BC, AC, DE, EF, BD, ওজন 13. Huffman-এর পাঁচটি জোড়া stepper-এর সঙ্গে এক, code-গুলো হাতের উত্তরের মতো, গড় 2.33 আর entropy 2.2784.

from itertools import combinations, product
from math import gcd
import functools, operator
K5 = list(combinations(range(5), 2))
def is_tree(es):                                    # 4 edges on 5 vertices: tree iff no cycle
    comp = list(range(5))
    for a, b in es:
        ca, cb = comp[a], comp[b]
        if ca == cb:
            return False
        comp = [ca if c == cb else c for c in comp]
    return True
print("8.1 labelled trees on 5 vertices:", sum(is_tree(es) for es in combinations(K5, 4)), "| 5^3 =", 5**3)
mins = {0, 1, 2, 5, 8, 9, 10}
f = lambda a, b, c, d: (not b and not c) or (not b and not d) or (not a and not c and d)
print("8.5 b'c' + b'd' + a'c'd correct:", all(bool(f(*map(int, f"{m:04b}"))) == (m in mins) for m in range(16)))
print("8.6 order of 8 in Z12:", next(k for k in range(1, 13) if 8 * k % 12 == 0),
      "| U(15):", [u for u in range(1, 15) if gcd(u, 15) == 1],
      "| order of 2:", next(k for k in range(1, 9) if pow(2, k, 15) == 1),
      "| cosets of {0,4,8}:", sorted({tuple(sorted((x + h) % 12 for h in (0, 4, 8))) for x in range(12)}))
def gf2_divmod(a, b):                               # polynomials over GF(2) as bit masks
    q = 0
    while a.bit_length() >= b.bit_length():
        s = a.bit_length() - b.bit_length(); q |= 1 << s; a ^= b << s
    return q, a
q, r = gf2_divmod(0b1100101, 0b1011)
print("8.7 quotient:", bin(q), "| remainder:", bin(r), "| CRC of 1101011:", format(gf2_divmod(0b1101011 << 3, 0b1011)[1], "03b"))
syndrome = lambda w: functools.reduce(operator.xor, [p for p, bit in enumerate(w, 1) if bit == "1"], 0)  # Hamming(7,4)
print("8.8 syndrome 1010111:", syndrome("1010111"), "| codeword 1010101:", syndrome("1010101"),
      "| two errors 1110001:", syndrome("1110001"))

K5-এর সব ২১০টি চার-edge উপসেটের 125টি tree, Cayley-র সূত্রের সমান। K-map-এর উত্তর ১৬টি সারিতে True. Group-এর লাইনে order 3, U(15)-এর আটটি সদস্য, 2-এর order 4, আর চারটি coset. GF(2)-এ ভাগফল 0b1110 (x3 + x2 + x), ভাগশেষ 0b111, CRC 110. Syndrome: একটি error-এ 6, ঠিক codeword-এ 0, দুটি error-এ 7, যা ভুল দিকে শোধরাতে পাঠায়।

৯ · মডিউল ১৩ — Automaton, Turing machine আর DPLL

ঝালিয়ে নিন: পর্ব ৭৪ · Finite automaton, পর্ব ৭৫ · Turing machine, পর্ব ৭৭ · SAT আর SMT. Automaton আর computability-র গভীর পাঠ্যক্রম পরে আসবে একটি আলাদা “Theory of Computation” কোর্সে।

সূত্রের কার্ড

DFA: প্রতিটি state আর অক্ষরে ঠিক একটি পরের state. Binary-র mod 3 DFA: নতুন state = (2 × state + bit) mod 3. Subset construction: DFA-র state = NFA-র state-এর সেট; n state-এর NFA থেকে বড়জোর 2n. DPLL: unit clause-এর মান বাধ্য, pure literal নিরাপদে সত্য, নইলে শাখা; empty clause মানে এই শাখায় সমাধান নেই।

৯.১(সহজ) Binary সংখ্যা 3 দিয়ে বিভাজ্য কি না বলে এমন ৩ state-এর DFA (state 0 শুরু ও গ্রহণ) চালান “10110”-এ। গ্রহণ করে কি? দৈর্ঘ্য ৫-এর কয়টি string গ্রহণ করে (শুরুর 0 অনুমোদিত)? (ঝালিয়ে নিন: পর্ব ৭৪)
state 0 -1-> (0·2+1)=1 -0-> 2 -1-> (4+1)%3=2 -1-> 2 -0-> (4+0)%3=1
final state 1 -> REJECT ; check 10110 = 22 = 7·3 + 1
length 5 = values 0..31 ; multiples of 3: 0, 3, …, 30 -> 11 strings

State-এর অর্থ “এ পর্যন্ত পড়া সংখ্যার mod 3”; নতুন বিট এলে মান দ্বিগুণ হয়ে বিট যোগ হয়। এই invariant-ই DFA-টির সঠিকতার প্রমাণ।

৯.২(মাঝারি) {0, 1}-এর ওপর NFA: q0 শুরু, q0 –0,1→ q0, q0 –0→ q1, q1 –1→ q2, q2 গ্রহণকারী; ভাষাটি “01” দিয়ে শেষ হওয়া string-এর সেট। Subset construction দিয়ে নাগালের DFA বানান, আর “1101”-এ চালান। (ঝালিয়ে নিন: পর্ব ৭৪)
{q0}     -0-> {q0,q1}   -1-> {q0}
{q0,q1}  -0-> {q0,q1}   -1-> {q0,q2}
{q0,q2}  -0-> {q0,q1}   -1-> {q0}
reachable DFA states: 3 (accepting: {q0,q2})
1101: {q0} -1-> {q0} -1-> {q0} -0-> {q0,q1} -1-> {q0,q2} -> ACCEPT

সম্ভাব্য ৮টি উপসেটের মাত্র ৩টি নাগালে আসে। সব ভাষায় এত কম হয় না: “শেষ থেকে n-তম বিট 1” ভাষার জন্য যেকোনো DFA-তে অন্তত 2n state লাগে।

৯.৩(মাঝারি) Binary increment Turing machine: q0 0/1 পড়লে না বদলে ডানে; ফাঁকা (_) পড়লে বাঁয়ে গিয়ে q1; q1 1 পড়লে 0 লিখে বাঁয়ে; 0 বা _ পড়লে 1 লিখে থামে (গ্রহণ)। ইনপুট 10111: শেষ ফিতা আর মোট ধাপ? 111-এ? (ঝালিয়ে নিন: পর্ব ৭৫)
10111: 5 moves right to the blank, 1 move back -> q1 on the last 1
       three 1s -> 0 (carry), then 0 -> 1 and halt
       tape 11000 (23 + 1 = 24) ; steps 5 + 1 + 3 + 1 = 10
111  : 3 + 1 + 3 = 7 steps reach the blank left of the input ; write 1: 8 steps
       tape 1000 (7 + 1 = 8)

দৈর্ঘ্য n আর শেষে পরপর k-টি 1 থাকলে ধাপ n + k + 2: 5 + 3 + 2 = 10, 3 + 3 + 2 = 8. সব 1-এর ইনপুটে যন্ত্রকে ইনপুটের বাঁয়ের ফাঁকা ঘরে লিখতে হয়; ফিতা দুই দিকেই অসীম ধরলে তা বৈধ।

৯.৪(কঠিন) CNF: C1 (a ∨ b), C2 (¬a ∨ c), C3 (¬b ∨ c), C4 (¬c ∨ ¬d), C5 (d ∨ e), C6 (¬e ∨ ¬c ∨ f). (ক) শুরুতে কোনো unit clause বা pure literal আছে কি? (খ) a = T শাখায় unit propagation চালিয়ে একটি model দিন। (গ) বাড়তি clause (¬c) যোগ করলে কী হয়? (ঘ) মূল সূত্রের মোট model কয়টি? (ঝালিয়ে নিন: পর্ব ০৭, ৭৭)
(a) no unit clause ; f appears only positive -> pure literal f
(b) a = T : C2 -> c = T ; C4 -> d = F ; C5 -> e = T ; C6 -> f = T
    C1, C3 satisfied ; b free -> model a=T, c=T, d=F, e=T, f=T (b any)
(c) unit ¬c -> c = F ; C2 -> a = F ; C3 -> b = F ; C1 = (F ∨ F) empty -> UNSAT
    (no branching needed)
(d) every model needs c = T (else (c) happens), so d = F, e = T, f = T ;
    then C1 needs a or b : (a,b) = 01, 10, 11 -> 3 models

(গ) দেখায়, unit propagation একাই কখনো কখনো পুরো সূত্রকে unsatisfiable প্রমাণ করে, কোনো অনুমান ছাড়া। (ঘ)-র যুক্তি চেকার ২৬ = ৬৪টি মান-বিন্যাস পরীক্ষা করে মিলিয়েছে।

from itertools import product
state, trace = 0, []
for ch in "10110":                                  # DFA: state = value read so far mod 3
    state = (2 * state + int(ch)) % 3; trace.append(state)
print("9.1 states:", trace, "| length-5 accepted:", sum(int("".join(w), 2) % 3 == 0 for w in product("01", repeat=5)))
nfa = {("q0", "0"): {"q0", "q1"}, ("q0", "1"): {"q0"}, ("q1", "1"): {"q2"}}
start = frozenset({"q0"}); found, todo, cur, path = [start], [start], start, []
while todo:                                         # subset construction (reachable part)
    S = todo.pop(0)
    for a in "01":
        N = frozenset(x for q in S for x in nfa.get((q, a), ()))
        if N not in found:
            found.append(N); todo.append(N)
for ch in "1101":
    cur = frozenset(x for q in cur for x in nfa.get((q, ch), ())); path.append(sorted(cur))
print("9.2 DFA states:", [sorted(S) for S in found], "| run on 1101:", path)
tape, head, st, steps = list("10111") + ["_"], 0, "q0", 0
while st != "acc":                                  # binary increment Turing machine
    if head < 0: tape.insert(0, "_"); head = 0     # grow the tape to the left
    sym = tape[head]
    if st == "q0":
        head, st = (head + 1, "q0") if sym in "01" else (head - 1, "q1")
    else:
        tape[head] = "0" if sym == "1" else "1"; head -= 1; st = "q1" if sym == "1" else "acc"
    steps += 1
print("9.3 tape:", "".join(tape).strip("_"), "| steps:", steps)
F = [("a", "b"), ("-a", "c"), ("-b", "c"), ("-c", "-d"), ("d", "e"), ("-e", "-c", "f")]
ok = lambda m, cls: all(any(m[l[-1]] != l.startswith("-") for l in c) for c in cls)
ms = [dict(zip("abcdef", x)) for x in product([0, 1], repeat=6)]
print("9.4 models:", sum(ok(m, F) for m in ms), "| with clause (-c):", sum(ok(m, F + [("-c",)]) for m in ms))

DFA-র state-ধারা [1, 2, 2, 2, 1], শেষ state 1, তাই বর্জন; দৈর্ঘ্য ৫-এর গ্রহণযোগ্য string 11. Subset construction-এ নাগালের state তিনটি, আর “1101”-এর শেষ state ['q0', 'q2'], যাতে গ্রহণকারী q2 আছে। Turing machine শেষে ফিতায় 11000, 10 ধাপে। শেষ লাইনে model 3টি, আর (¬c) যোগ করলে 0: সূত্রটি unsatisfiable.

শেষ মুহূর্তের সূত্র-তালিকা আর সাধারণ ভুল

পরীক্ষার আগের রাতে এই এক টেবিলই যথেষ্ট; তৃতীয় কলামের ভুলগুলো মনে রাখাই বেশি কাজের।

বিষয়সূত্রসাধারণ ভুলপর্ব
যুক্তিp → q ≡ ¬p ∨ q; ¬∀x P ≡ ∃x ¬Pquantifier-এর ক্রম বদলানো; domain না লেখা০২–০৫
Inductionbasis, hypothesis, stepbasis বাদ; step-এ hypothesis ব্যবহার না করা১০, ১১
ফাংশন গোনাnm; n!/(n − m)!; n! S(m, n)onto গোনায় দুবার গোনা১৬
Euclid, inversegcd = ax + by; a−1 ⇔ gcd = 1শেষে গুণ করে যাচাই না করা; gcd ≠ 1-এ inverse খোঁজা২১, ২৩
CRTx = ∑ aiMiyi mod Mmodulus coprime কি না না দেখা২৩
Fermat, Eulerap−1 ≡ 1; aφ(n) ≡ 1শর্ত (p ∤ a, gcd = 1) বাদ; উল্টো দিককে সত্য ধরা২৪
RSAd = e−1 mod φ(n)d-কে mod n-এ বের করা; textbook RSA-কে নিরাপদ ভাবা২৮
গণনাcomplement; C(n + k − 1, k − 1)“অন্তত একটি”-তে overcounting; ক্রম গুরুত্বপূর্ণ কি না না ভাবা৩১–৩৫
BayesP(B∣A)P(A)/P(B)base rate ভুলে P(A∣B) আর P(B∣A) গোলানো৩৯
Recurrencecharacteristic root; resonance-এ n দিয়ে গুণদ্বিগুণ root-এ (A + Bn) বাদ৪৫, ৪৬
Masterd বনাম logban log n চালিকা-খরচে সরাসরি প্রয়োগ৪৭
IE, derangement∑(−1)k; Dn = (n − 1)(Dn−1 + Dn−2)floor না নেওয়া; চিহ্ন পালাক্রম ভুল৪৯
Burnsideস্থির বিন্দুর গড়kn/n লেখা৫১
Relationreflexive, symmetric, antisymmetric, transitivesymmetric নয় মানেই antisymmetric ভাবা৫২
Graph∑deg = 2E; V − E + F = 2প্রয়োজনীয় শর্তকে যথেষ্ট ভাবা (E ≤ 3V − 6)৫৭, ৬২
Dijkstra, MSTrelax; KruskalMST আর shortest path tree এক ভাবা; ঋণাত্মক weight-এ Dijkstra৬১, ৬৭
Tree, HuffmanE = V − 1; ∑ ঘনত্ব × গভীরতাPrüfer-এ সবচেয়ে ছোট leaf না নেওয়া৬৫, ৬৮
Group, GF(2)Lagrange; XOR-এ ভাগelement-এর order আর group-এর order গোলানো৭০, ৭১
Hammingsyndrome = ভুল অবস্থানদুটি error-কেও শোধরানো যায় ভাবা৭২
Automaton, DPLLsubset construction; unit, pure, branchপৌঁছানো যায় না এমন উপসেট গোনা; empty clause-কে “সত্য” ভাবা৭৪, ৭৭

২০ মিনিটের মিনি-সেট — ঘড়ি ধরে করুন

আটটি ছোট প্রশ্ন, প্রতিটিতে আড়াই মিনিট। কাগজ-কলম চলবে, চেকার নয়। ৭–৮ ঠিক হলে প্রস্তুত, ৫–৬ হলে সংশ্লিষ্ট ভাগ আবার, ৪-এর কম হলে ভাগ ২ থেকে আবার শুরু করুন।

  1. gcd(84, 120) কত?
  2. 3−1 mod 7 কত?
  3. ৭ জনের মধ্য থেকে ৩ জনের কমিটি কয়ভাবে?
  4. ৪টি চিঠি ৪টি খামে, একটিও ঠিক খামে নয়: কয়ভাবে?
  5. K6-এ কয়টি edge?
  6. Connected planar graph, V = 8, E = 12: কয়টি face?
  7. T(n) = 8T(n/2) + n2: Θ কত?
  8. যেকোনো ৬ জনের মধ্যে হয় ৩ জন পরস্পর পরিচিত, নয় ৩ জন পরস্পর অপরিচিত। এই উক্তি কোন Ramsey সংখ্যার কথা বলে, আর ৫ জনে কেন যথেষ্ট নয়?
উত্তরমিনি-সেটের উত্তর আর এক লাইনের কারণ (নিজে করার পরে খুলুন)
1. 120 = 84 + 36 ; 84 = 2·36 + 12 ; 36 = 3·12 -> 12
2. 3·5 = 15 ≡ 1 (mod 7) -> 5
3. C(7, 3) = 35
4. D4 = 9
5. C(6, 2) = 15
6. F = 2 - 8 + 12 = 6
7. log2 8 = 3 > 2 -> Θ(n^3)
8. R(3, 3) = 6 ; on 5 people the pentagon (C5) and its complement (another C5) have no triangle

সবচেয়ে বেশি ভুল হয় ২ আর ৭-এ: 3−1-কে 1/3 লেখা অর্থহীন, mod 7-এ এটি একটি পূর্ণসংখ্যা; আর ৭-এ n2 দেখে Θ(n2 log n) লেখা, যা শুধু logba = d হলে আসত। Ramsey-র উত্তর পর্ব ৭৬ “Ramsey theory আর extremal combinatorics-এর পরিচয়”-এর।

AI-এর যুগে — AI-এর হিসাব আর প্রমাণ যাচাই

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

AI-এর ভুলউদাহরণকীভাবে ধরবেন
বড় সংখ্যার mod হিসাবে ভুল5117 mod 19-এ ভুল মধ্যবর্তী বর্গPython-এর pow(a, b, m) দিয়ে মেলানো
Off-by-one আর দুবার গোনা“অন্তত একটি অঙ্ক”-এ 6 · 10 · 365ছোট দৈর্ঘ্যে brute force তালিকা
উপপাদ্যের শর্ত বাদgcd(6, 15) ≠ 1 হলেও 6−1 mod 15 “বের করা”প্রতিটি উপপাদ্যের শর্ত জিজ্ঞেস করা
প্রয়োজনীয়কে যথেষ্ট ভাবাE ≤ 3V − 6 দেখে “planar” বলাcounterexample খোঁজা (K3,3)
বৃত্তাকার বা উল্টো প্রমাণFermat-এর উল্টো দিক ধরে নেওয়াপ্রতিটি ধাপের কারণ লিখে মেলানো
বানানো সূত্র বা referenceনা থাকা “উপপাদ্য” বা বইয়ের পাতাবিশ্বস্ত পাঠ্যবইয়ে খুঁজে দেখা

AI-কে উত্তরদাতা নয়, যাচাইকারী হিসেবে ব্যবহার করুন। নিচের prompt-এ প্রথমে নিজের সমাধান দিন, যাতে AI ভুলের জায়গা দেখায়, পুরো উত্তর নয়।

আমি Discrete Mathematics-এর numerical অনুশীলন করছি। নিচে প্রশ্ন, আমার ধরা নিয়ম আর হাতে করা সমাধান দিলাম। প্রশ্ন: [যেমন: CRT দিয়ে x ≡ 1 (mod 4), x ≡ 2 (mod 5), x ≡ 3 (mod 7)] নিয়ম: [যেমন: mod-এর উত্তর 0 থেকে n − 1; Huffman-এ হালকা গাছ বাঁয়ে] আমার সমাধান: [ধাপগুলো পেস্ট করুন] ১. পুরো উত্তর আগে দিও না। আমার সমাধানের প্রথম যে ধাপে ভুল আছে, শুধু সেটি দেখাও। ২. কোনো উপপাদ্য ব্যবহার করলে তার শর্তগুলো লিখে দেখাও যে এখানে শর্ত পূরণ হয়েছে। ৩. প্রতিটি mod হিসাবের জন্য একটি ছোট Python লাইন দাও (pow(a, b, m) ধরনের), যাতে আমি নিজে চালাতে পারি। ৪. গণনার উত্তর হলে ছোট n-এ brute force করার ১০ লাইনের কম কোড দাও। ৫. একই ধরনের একটি নতুন প্রশ্ন দাও; উত্তর লুকিয়ে রাখো। ৬. কোনো বই বা সূত্রের উল্লেখ করলে তা আমাকে যাচাই করতে বলো; না জানলে “জানি না” বলো।

যাচাইয়ের চেকলিস্ট

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

প্রতিটি প্রশ্নে খাতায় হিসাব করে তবে উত্তর বাছুন। সব তথ্য প্রশ্নের ভেতরেই আছে।

ক্রমTextbook RSA-এর key তৈরি আর encryption-এর ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. দুটি আলাদা মৌলিক সংখ্যা p আর q বাছা
  2. n = pq আর φ(n) = (p − 1)(q − 1) হিসাব করা
  3. gcd(e, φ(n)) = 1 এমন e বাছা
  4. Extended Euclid দিয়ে d = e−1 mod φ(n) বের করা
  5. বার্তা m-এর জন্য c = me mod n পাঠানো

(সহজ) A = {1, 2, 3} থেকে B = {x, y}-এ কয়টি onto ফাংশন?

  • 6
  • 8
  • 2
  • 9

(সহজ) φ(36) কত?

  • 18
  • 24
  • 12
  • 6

(মাঝারি) 7100 mod 5 কত?

  • 2
  • 1
  • 4
  • 3

(মাঝারি) x1 + x2 + x3 = 10, প্রতিটি xi ≥ 1 পূর্ণসংখ্যা: কয়টি সমাধান?

  • 66
  • 45
  • 120
  • 36

(সহজ) দুটি ন্যায্য ছক্কা ছোড়া হলো। অন্তত একটি ৬ ওঠার সম্ভাবনা কত?

  • 11/36
  • 1/3
  • 25/36
  • 1/36

(মাঝারি) an = an−1 + 6an−2-এর characteristic root কোনগুলো?

  • −3, 2
  • 1, 6
  • 3, −2
  • 2, 3

(মাঝারি) ১০টি vertex-এর simple connected planar graph-এ সর্বোচ্চ কয়টি edge?

  • 30
  • 24
  • 16
  • 45

(মাঝারি) চারটি চিহ্নের ঘনত্ব 1, 1, 2, 4. Huffman code-এ মোট কয়টি bit লাগে?

  • 16
  • 12
  • 8
  • 14

(সহজ) (ℤ15, +)-এ 6-এর order কত?

  • 5
  • 3
  • 15
  • 6

(মাঝারি) Hamming(7,4)-এ (parity অবস্থান 1, 2, 4) প্রাপ্ত শব্দের syndrome s4s2s1 = 101. একটিমাত্র error ধরে নিলে কী করবেন?

  • অবস্থান 1 আর 4 উল্টানো
  • কিছুই না
  • অবস্থান 5 উল্টানো
  • শব্দ বাতিল করে আবার চাওয়া

(কঠিন) CNF (¬a ∨ b) ∧ (¬b ∨ c) ∧ (a) ∧ (¬c). DPLL-এ unit propagation কী দেখায়?

  • a = T, b = T, c = F একটি model
  • কোনো শাখা ছাড়াই UNSAT
  • প্রথমে a-তে শাখা করতে হয়
  • c একটি pure literal

শব্দকোষ

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

মনে রাখুন

  1. শর্ত আগে, সূত্র পরে: Fermat-এ p ∤ a, CRT-এ coprime modulus, Euler-এর সূত্রে connected planar, Dijkstra-য় অঋণাত্মক weight. শর্ত না মিললে সূত্র চুপচাপ ভুল উত্তর দেয়।
  2. এক লাইনের যাচাই: Bézout গুণ করে, ed mod φ(n) = 1, a2 recurrence-এ বসিয়ে, degree-এর যোগ জোড়, Burnside-এর গড় পূর্ণসংখ্যা।
  3. গণনায় complement আর বাক্স: “অন্তত একটি” মানে মোট বিয়োগ “একটিও না”; pigeonhole-এ আসল কাজ বাক্স বানানো।
  4. ছোট ক্ষেত্রে brute force: সূত্র পেলেই n = 3 বা 4-এ তালিকা করে মেলান; মিললেও প্রমাণ লাগে, না মিললে সূত্র ভুল।
  5. চেকার শেষে: আগে হাতে, তারপর কোড; কোড আগে চালালে ভুল ধাপটি শেখা হয় না।

পরের পর্বে: পর্ব ৮০ “MCQ প্রশ্নব্যাংক — Discrete Mathematics”-এ ১৩টি মডিউল থেকে MCQ, প্রতিটি বিকল্পের ব্যাখ্যাসহ।

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

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