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

Boolean algebra-র গণিত — function, identity আর minimization

The Mathematics of Boolean Algebra — Boolean Functions, Huntington's Axioms, Duality, Normal Forms, Functional Completeness, Karnaugh Maps and Quine–McCluskey

Taught in Bangla, this lesson counts the 2^(2^n) Boolean functions of n variables and derives idempotence, absorption and De Morgan from Huntington's axioms, with duality. It shows power sets and divisor lattices as Boolean algebras, builds canonical SOP and POS forms, and decides functional completeness with Post's five classes, including XOR from four NAND gates. Minimisation uses Karnaugh maps, prime implicants, Quine–McCluskey and don't-cares, with in-page Python checking each step.

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

  • Boolean function-এর সংজ্ঞা, তাদের সংখ্যার প্রমাণ, আর logic, সেট ও বিটের মধ্যে অনুবাদ
  • Huntington-এর axiom থেকে মূল সূত্রগুলোর প্রমাণ, duality নীতি, আর power set ও ভাজকের উদাহরণ
  • Shannon expansion দিয়ে canonical SOP আর POS, আর monotone function দিয়ে completeness-এর সীমা
  • K-map কেন কাজ করে, prime ও essential prime implicant, আর Quine–McCluskey ধাপে ধাপে
  • Don't care দিয়ে সরলীকরণ, আর minimization কেন সাধারণভাবে কঠিন

১ · Boolean function — {0, 1}n থেকে {0, 1}

বাজারঘরের HR বিভাগ লিখেছে, কোন কর্মী রিফান্ড অনুমোদন করতে পারবেন। তিনটি প্রশ্ন: কর্মী কি ম্যানেজার (M)? এখন কি অফিস সময় (O)? তিনি কি দুই ধাপের যাচাই, অর্থাৎ 2FA, শেষ করেছেন (T)? প্রতিটির উত্তর হ্যাঁ (1) বা না (0), আর সিস্টেমকে দিতে হয় একটি উত্তর: অনুমতি আছে (1) বা নেই (0). বাসার সুইচবোর্ডের মতো: কয়েকটি সুইচ, প্রতিটি অন বা অফ, আর বাতি জ্বলবে কি না তা সুইচগুলোর অবস্থার ওপর নির্ভর করে।

HR-এর নিয়ম: “তিনটি শর্তের অন্তত দুটি পূরণ হলে অনুমতি।” এটি একটি নিয়ম যা প্রতিটি (M, O, T) ত্রয়ীকে 0 বা 1-এ পাঠায়। সাধারণভাবে বললে:

সংজ্ঞা ১.১ (Boolean function)

B = {0, 1}. n চলকের একটি Boolean function হলো একটি ফাংশন f : Bn → B, অর্থাৎ প্রতিটি n-বিটের ইনপুট (x1, …, xn)-কে ঠিক একটি মান 0 বা 1 দেয়। f-কে পুরোপুরি বর্ণনা করে তার truth table: 2nটি সারি, প্রতি সারিতে f-এর মান। দুটি function সমান, যদি প্রতিটি সারিতে মান সমান হয় (পর্ব ১৬-এর ফাংশনের সমতা)।

লেখার নিয়ম circuit-এর বইয়ের মতো: x + y মানে OR, xy বা x · y মানে AND, আর x′ মানে NOT (x-এর complement). Logic-এর ভাষায় এরা ∨, ∧, ¬; সেটের ভাষায় ∪, ∩ আর পূরক সেট। তিন ভাষার অভিধান এই:

Boolean algebraLogic (পর্ব ০২–০৩)সেট (পর্ব ১৪–১৫)বিট (Python)
x + yp ∨ qA ∪ Bx | y
x · yp ∧ qA ∩ Bx & y
x′¬pAc1 - x
0, 1F, T∅, U0, 1
f = gp ≡ qA = Bসব সারিতে সমান

অভিধানের শেষ সারিটি জরুরি: দুটি Boolean রাশি সমান মানে তাদের truth table এক, যা পর্ব ০৩-এর logical equivalence. তাই সেখানে প্রমাণ করা সব equivalence, যেমন De Morgan, এখানে Boolean সমীকরণ হিসেবে সত্য; প্রমাণগুলো আবার করছি না। এই পর্বের নতুন প্রশ্ন তিনটি: কয়টি function আছে, কোন axiom থেকে সব সূত্র আসে, আর একটি function-কে সবচেয়ে ছোট রাশিতে কীভাবে লেখা যায়।

উপপাদ্য ১.২ (function-এর সংখ্যা)

n চলকের আলাদা Boolean function ঠিক 22nটি।

  1. প্রতিটি ইনপুট n-বিটের একটি string, আর প্রতিটি বিটের ২টি মান, তাই ইনপুট-সারি 2nটি। — পর্ব ৩১-এর গুণের নিয়ম
  2. একটি function মানে এই 2nটি সারির প্রতিটিতে স্বাধীনভাবে একটি মান 0 বা 1 বসানো; আলাদা বাছাই আলাদা function, কারণ কোনো একটি সারিতে মান আলাদা। — সংজ্ঞা ১.১
  3. তাই বাছাইয়ের সংখ্যা 2 · 2 ⋯ 2 (2n বার) = 22n. ∎ — আবার গুণের নিয়ম

সংখ্যাটি দ্রুত বিস্ফোরিত হয়: n = 1-এ 4, n = 2-এ 16, n = 3-এ 256, n = 4-এ 65,536, n = 5-এ 4,294,967,296, আর n = 6-এ প্রায় 1.8 × 1019. তাই সব function-এর তালিকা করে কিছু খোঁজা ৫ চলকের পরেই অসম্ভব; দরকার গঠন আর উপপাদ্য।

B3-এর আটটি সারিকে একটি ঘনকের আটটি কোণ ভাবা যায়: দুটি কোণ একটি ধার দিয়ে যুক্ত, যদি তারা ঠিক এক বিটে আলাদা। এটি পর্ব ৩৬-এর hypercube Q3. রিফান্ডের নিয়মে যে চারটি কোণে f = 1, সেগুলো ছবিতে সবুজ।

ঘনকের কোণে রিফান্ড-অনুমতির function

প্রতিটি কোণ (M, O, T)-এর একটি মান। সবুজ কোণে অনুমতি আছে। মোটা সবুজ তিনটি ধার MO, MT আর OT: প্রতিটি ধার একটি দুই-চলকের পদ, যা দুটি কোণ একসঙ্গে ঢাকে।

The cube of 3-bit inputs; majority function true on 011, 101, 110, 111; edges MO, MT, OT highlighted 000001010 100011101 110111 MOT MOMTOT

লক্ষ করুন, “MO” পদটি (ম্যানেজার আর অফিস সময়, 2FA যা-ই হোক) ঠিক দুটি কোণে 1: 110 আর 111, অর্থাৎ ঘনকের একটি ধার। k-টি literal-এর একটি গুণফল-পদ 2n−kটি কোণের একটি “উপ-ঘনক” ঢাকে। এই ছবিটিই পরে K-map আর minimization-এর ভিত্তি।

২ · বিমূর্ত Boolean algebra — Huntington-এর axiom আর duality

{0, 1}, সেট আর বিটে একই সূত্র কেন খাটে? কারণ তিনটিই একটি সাধারণ কাঠামোর উদাহরণ। গণিতে এমন ক্ষেত্রে আমরা কয়েকটি axiom বেছে নিই, আর শুধু সেগুলো থেকে সব প্রমাণ করি; তখন প্রতিটি প্রমাণ সব উদাহরণে একসঙ্গে খাটে।

সংজ্ঞা ২.১ (Boolean algebra, Huntington-এর ধাঁচে)

একটি Boolean algebra হলো একটি সেট B, তাতে দুটি binary অপারেশন + আর ·, একটি unary অপারেশন ′, আর দুটি আলাদা উপাদান 0 ও 1, যাতে সব x, y, z ∈ B-এর জন্য:

(H1) x + y = y + x,   xy = yx   (commutative)
(H2) x(y + z) = xy + xz,   x + yz = (x + y)(x + z)   (দুই দিকেই distributive)
(H3) x + 0 = x,   x · 1 = x   (identity)
(H4) x + x′ = 1,   x · x′ = 0   (complement)

এই তালিকা Edward Huntington-এর ১৯০৪ সালের axiom-সেটের রূপ বলে পরিচিত (Huntington postulates). Associativity, অর্থাৎ (x + y) + z = x + (y + z), তালিকায় নেই: এটি axiom থেকেই প্রমাণ করা যায়, তবে প্রমাণটি দীর্ঘ, তাই এখানে বাদ রেখে ব্যবহার করছি। সাধারণ সংখ্যার সঙ্গে তফাত লক্ষ করুন: x + yz = (x + y)(x + z) সংখ্যায় মিথ্যা, এখানে axiom.

উপপাদ্য ২.২ (প্রথম তিনটি সূত্র)

যেকোনো Boolean algebra-য়: (ক) x + x = x (idempotent); (খ) x + 1 = 1 (সীমা); (গ) x + xy = x (absorption).

  1. (ক) x + x = (x + x) · 1 = (x + x)(x + x′) = x + x · x′ = x + 0 = x. — H3, H4, H2-এর দ্বিতীয় রূপ (x + yz), H4, H3
  2. (খ) x + 1 = (x + 1) · 1 = (x + 1)(x + x′) = x + 1 · x′ = x + x′ = 1. — H3, H4, H2, H1 আর H3 (1 · x′ = x′), H4
  3. (গ) x + xy = x · 1 + xy = x(1 + y) = x(y + 1) = x · 1 = x. ∎ — H3, H2-এর প্রথম রূপ, H1, (খ), H3
উপপাদ্য ২.৩ (complement অনন্য, আর তার ফল)

যদি x + y = 1 আর xy = 0 হয়, তবে y = x′. ফলে (x′)′ = x, আর De Morgan: (x + y)′ = x′y′ ও (xy)′ = x′ + y′.

  1. y = y · 1 = y(x + x′) = yx + yx′. — H3, H4, H2
  2. yx = xy = 0 = xx′, তাই y = xx′ + yx′ = x′x + x′y = x′(x + y). — অনুমান, H4, H1, H2
  3. x + y = 1, তাই y = x′ · 1 = x′. — অনুমান, H3
  4. x′ + x = 1 আর x′x = 0 (H1, H4), অর্থাৎ x নিজেই x′-এর complement-এর শর্ত মানে; অনন্যতায় (x′)′ = x. — ধাপ ১–৩ x′-এর জন্য
  5. De Morgan: (x + y) + x′y′ = (x + y + x′)(x + y + y′) = (1 + y)(x + 1) = 1 · 1 = 1, আর (x + y) · x′y′ = (xx′)y′ + (yy′)x′ = 0 + 0 = 0. তাই x′y′ হলো x + y-এর complement. দ্বিতীয় সূত্রটি dual. ∎ — H2, associativity, H4, উপপাদ্য ২.২(খ) আর তার dual x · 0 = 0

শেষ ধাপে “dual” শব্দটি একটি শক্তিশালী নীতির দিকে ইশারা করে। প্রতিটি axiom জোড়ায় আসে: একটিতে + আর · অদলবদল করে, 0 আর 1 অদলবদল করে অন্যটি পাওয়া যায়।

উপপাদ্য ২.৪ (duality নীতি)

Boolean algebra-র axiom থেকে প্রমাণিত যেকোনো সমীকরণে সব + আর · অদলবদল করে, আর সব 0 আর 1 অদলবদল করে (′ অপরিবর্তিত) যে dual সমীকরণ পাওয়া যায়, তাও প্রমাণযোগ্য।

প্রমাণের ধারণা: মূল প্রমাণটি সমীকরণের একটি শিকল, যার প্রতিটি ধাপ একটি axiom (বা আগে প্রমাণিত সূত্র) প্রয়োগ। পুরো শিকলের প্রতিটি রাশির dual নিন। H1–H4-এর প্রতিটি axiom-এর dual-ও তালিকায় আছে, তাই প্রতিটি নতুন ধাপ আবার একটি axiom প্রয়োগ। ফলে dual শিকলটি নিজেই dual সমীকরণের একটি বৈধ প্রমাণ। ∎ যেমন উপপাদ্য ২.২-এর dual বিনা পরিশ্রমে পাওয়া যায়: xx = x, x · 0 = 0, x(x + y) = x. সাবধান: dual নেওয়া আর complement নেওয়া এক কাজ নয়; dual-এ literal উল্টায় না।

৩ · উদাহরণ আর গঠন — power set, ভাজক আর lattice

সংজ্ঞাটি কতটা সাধারণ, তা বোঝা যায় উদাহরণে। প্রতিটি ক্ষেত্রে axiom চারটি যাচাই করতে হয়।

  • দুই-উপাদানের algebra {0, 1}: OR, AND, NOT. Circuit আর logic-এর জগৎ।
  • Power set P(S): S-এর সব উপসেট, + = ∪, · = ∩, A′ = S − A, 0 = ∅, 1 = S. পর্ব ১৪-এর power set-এর 2|S|টি উপাদান। Axiom-গুলো পর্ব ১৫-এর set identity.
  • বিট-string Bn: প্রতিটি বিটে আলাদা করে OR, AND, NOT. এটি আসলে P({1, …, n}), কারণ n-বিটের mask একটি উপসেট চেনায়।
  • সব n-চলকের function: f + g মানে প্রতিটি সারিতে OR. 22nটি উপাদানের Boolean algebra, যা 2nটি সারির power set-এর মতো।
  • ভাজক D30 = {1, 2, 3, 5, 6, 10, 15, 30}: + = lcm, · = gcd, x′ = 30/x, 0 = 1, 1 = 30. পর্ব ৫৬-এর ভাজকের lattice.

D12 = {1, 2, 3, 4, 6, 12} কিন্তু Boolean algebra নয়: 2-এর complement y হতে হলে lcm(2, y) = 12 আর gcd(2, y) = 1 লাগে; lcm 12 হয় শুধু y = 12-এ, আর তখন gcd = 2. সাধারণভাবে Dn Boolean algebra ঠিক তখন, যখন n squarefree (কোনো মৌলিকের বর্গ n-কে ভাগ করে না)। নিচের ব্লক axiom-গুলো সরাসরি যাচাই করে।

from itertools import product
from math import gcd
def check(name, E, join, meet, comp, zero, one):    # Huntington's axioms
    bad = set()
    for x, y, z in product(E, repeat=3):
        if join(x, y) != join(y, x) or meet(x, y) != meet(y, x):
            bad.add("commutative")
        if meet(x, join(y, z)) != join(meet(x, y), meet(x, z)):
            bad.add("distributive")
        if join(x, meet(y, z)) != meet(join(x, y), join(x, z)):
            bad.add("distributive")
    for x in E:
        if join(x, zero) != x or meet(x, one) != x: bad.add("identity")
        c = comp(x)
        if c is None or join(x, c) != one or meet(x, c) != zero:
            bad.add(f"no complement for {x}")
    print(f"{name:10} {len(E):2} elements:", sorted(bad) or "Boolean algebra")
U = 0b111                                   # subsets of {a, b, c} as bitmasks
check("P({a,b,c})", range(8), lambda x, y: x | y, lambda x, y: x & y,
      lambda x: U & ~x, 0, U)
lcm = lambda a, b: a * b // gcd(a, b)
for n in (30, 12):
    D = [d for d in range(1, n + 1) if n % d == 0]
    comp = lambda x, n=n, D=D: next(
        (y for y in D if lcm(x, y) == n and gcd(x, y) == 1), None)
    check(f"D{n}", D, lcm, gcd, comp, 1, n)
E = range(8)                                # derived laws, checked on P({a,b,c})
print("x + xy = x:", all(x | (x & y) == x for x in E for y in E))
print("(x + y)' = x'y':", all(U & ~(x | y) == (U & ~x) & (U & ~y) for x in E for y in E))
print("x + y = x + z => y = z?", all(y == z for x in E for y in E for z in E if x | y == x | z))

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

P({a,b,c})  8 elements: Boolean algebra
D30         8 elements: Boolean algebra
D12         6 elements: ['no complement for 2', 'no complement for 6']
x + xy = x: True
(x + y)' = x'y': True
x + y = x + z => y = z? False

P({a, b, c}) আর D30 দুটিই সব axiom মানে, আর দুটিরই ৮টি উপাদান: 30 = 2 · 3 · 5, আর প্রতিটি ভাজক কোন মৌলিকগুলো নেয় তা দিয়ে চেনা যায়, ঠিক উপসেটের মতো। D12-এ distributive আর identity ঠিক আছে, কিন্তু 2 আর 6-এর complement নেই। শেষ লাইনটি সতর্কবাণী: সাধারণ বীজগণিতের মতো “দুই পাশ থেকে x বাদ দেওয়া” এখানে চলে না (x = 1 হলে x + y সবসময় 1). এটি অনুশীলন ৪-এ আবার আসবে।

উদাহরণগুলোর আকার 2, 8, 2n: সবসময় 2-এর ঘাত। এটি কাকতালীয় নয়। Boolean algebra-য় x ≤ y সংজ্ঞায়িত করুন x + y = y (সমতুল্যভাবে xy = x) দিয়ে; এতে B একটি lattice হয়, যেখানে join = + আর meet = ·. ভাষান্তরে, Boolean algebra মানে এমন distributive lattice যাতে 0 আর 1 আছে আর প্রতিটি উপাদানের complement আছে। একটি অশূন্য উপাদান a-কে atom বলে, যদি 0 আর a-এর মাঝে কিছু না থাকে; P(S)-এ atom মানে একক-উপাদানের সেট।

উপপাদ্য ৩.১ (সসীম ক্ষেত্রে Stone-এর representation)

প্রতিটি সসীম Boolean algebra B, তার atom-সেট A-এর power set P(A)-এর isomorphic: x ↦ {a ∈ A : a ≤ x} একটি bijection, যা +, ·, ′ রক্ষা করে। ফলে |B| = 2|A|.

প্রমাণের রূপরেখা: (১) প্রতিটি অশূন্য x-এর নিচে অন্তত একটি atom আছে, কারণ সসীম সেটে নিচে নামা কোথাও থামে। (২) x হলো তার নিচের সব atom-এর যোগফল; না হলে পার্থক্যের নিচের একটি atom বিরোধ ঘটায়। (৩) a atom আর a ≤ x + y হলে a ≤ x বা a ≤ y, তাই যোগফলের atom-সেট = atom-সেটের union. বাকি অংশ একই ধাঁচের হিসাব। ∎ তাই ৬ বা ১২ উপাদানের কোনো Boolean algebra নেই। অসীম Boolean algebra-র জন্য Marshall Stone ১৯৩৬ সালে দেখান, প্রতিটি Boolean algebra কোনো সেটের উপসেটের একটি algebra-র isomorphic, যদিও পুরো power set নাও হতে পারে।

৪ · SOP আর POS — minterm, maxterm আর Shannon expansion

HR-এর নিয়ম “অন্তত দুটি” truth table-এ ৪টি সারিতে 1: 011, 101, 110, 111. সারি নম্বর হলো বাইনারি মান (M বাঁয়ের বিট): 3, 5, 6, 7. প্রতিটি সারির জন্য একটি পদ লিখুন, যা শুধু ওই সারিতে 1: সারি 3 (M = 0, O = 1, T = 1)-এর পদ M′OT. এমন পদের নাম minterm m3. সব 1-সারির minterm যোগ করলে পাওয়া যায় f-এর sum of products (SOP) রূপ, সংক্ষেপে f = Σm(3, 5, 6, 7).

উপপাদ্য ৪.১ (Shannon expansion)

প্রতিটি Boolean function f-এর জন্য: f(x1, x2, …, xn) = x1 · f(1, x2, …, xn) + x1′ · f(0, x2, …, xn).

  1. দুটি function সমান দেখাতে প্রতিটি ইনপুটে মান মেলানোই যথেষ্ট। x1-এর মান অনুযায়ী দুই ক্ষেত্র। — সংজ্ঞা ১.১, ক্ষেত্রভিত্তিক প্রমাণ
  2. x1 = 1: ডান পাশ = 1 · f(1, …) + 0 · f(0, …) = f(1, …), যা বাঁ পাশ। — H3, x · 0 = 0
  3. x1 = 0: ডান পাশ = 0 · f(1, …) + 1 · f(0, …) = f(0, …), যা বাঁ পাশ। ∎

নামটি Claude Shannon-এর, যদিও একই সূত্র George Boole-এর লেখাতেই আছে বলে উল্লেখ করা হয়। প্রতিটি চলকে বারবার এটি প্রয়োগ করলে f হয়ে যায় 2nটি পদের যোগফল, যার প্রতিটি পদ একটি minterm গুণ একটি ধ্রুবক f(a): যেখানে f(a) = 0 সেই পদ মুছে যায়।

উপপাদ্য ৪.২ (canonical SOP আর POS)

প্রতিটি Boolean function f ≠ 0 তার 1-সারিগুলোর minterm-এর যোগফল, আর এই রূপ অনন্য। Dual হিসেবে, প্রতিটি f ≠ 1 তার 0-সারিগুলোর maxterm-এর গুণফল (product of sums, POS), যেখানে সারি a-এর maxterm শুধু সারি a-তে 0.

অস্তিত্ব আসে Shannon expansion-এর induction থেকে (পর্ব ১০); পর্ব ০৩-এর উপপাদ্য ৪ একই কথা truth table থেকে প্রমাণ করেছে, তাকে সেখানে DNF আর CNF বলা হয়েছে। অনন্যতা সহজ: minterm ma ঠিক সারি a-তে 1, তাই কোন minterm যোগফলে আছে তা থেকে ঠিক কোন সারিতে f = 1 তা পড়া যায়; দুটি আলাদা minterm-সেট তাই আলাদা function দেয়। এটি উপপাদ্য ১.২-এর আরেক রূপ: 2nটি minterm-এর উপসেট 22nটি।

রিফান্ডের নিয়মে maxterm আসে 0-সারি 0, 1, 2, 4 থেকে: f = ΠM(0, 1, 2, 4) = (M + O + T)(M + O + T′)(M + O′ + T)(M′ + O + T). এখন SOP-কে সরল করুন। কৌশল: idempotent সূত্রে MOT-কে তিনবার লেখা যায়।

  1. f = M′OT + MO′T + MOT′ + MOT = (MOT + M′OT) + (MOT + MO′T) + (MOT + MOT′). — উপপাদ্য ২.২(ক), commutative আর associative
  2. প্রতিটি বন্ধনী একটি চলকের দুই রূপ: MOT + M′OT = OT(M + M′) = OT · 1 = OT. একইভাবে MT আর MO. — H2, H4, H3
  3. তাই f = MO + MT + OT. ১২টি literal থেকে ৬টি। ∎

নিচের ব্লক এই কাজগুলো যন্ত্রে করে: HR-এর লম্বা নিয়ম থেকে minterm আর DNF বানায়, সরল রূপের সঙ্গে প্রতিটি সারি মেলায়, আর একটি ভুল “সরলীকরণ”-এর প্রথম ভুল সারি দেখায়। শেষে প্রতিটি minterm-সেট থেকে আলাদা function হয় কি না গুনে উপপাদ্য ১.২ মেলায়। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।

from itertools import product, combinations
VARS = "MOT"                       # M manager, O office hours, T 2FA done
def hr_rule(m, o, t):              # the long rule as HR wrote it
    return ((m and o and t) or (m and o and not t)
            or (m and not o and t) or (not m and o and t))
def short_rule(m, o, t): return (m and o) or (m and t) or (o and t)
def wrong_rule(m, o, t): return (m and o) or t
def rows(n): return list(product((0, 1), repeat=n))
def minterms(f, n): return [i for i, r in enumerate(rows(n)) if f(*r)]
def dnf(ms, names):                # canonical sum of minterms
    def term(i):
        bits = format(i, f"0{len(names)}b")
        return "".join(v + ("" if b == "1" else "'") for v, b in zip(names, bits))
    return " + ".join(term(i) for i in ms) or "0"
def first_difference(f, g, n):     # None means: equivalent
    return next((r for r in rows(n) if bool(f(*r)) != bool(g(*r))), None)
ms = minterms(hr_rule, 3)
print("minterms:", ms, " maxterms:", [i for i in range(8) if i not in ms])
print("DNF:", dnf(ms, VARS))
print("short vs HR:", first_difference(short_rule, hr_rule, 3))
print("wrong vs HR:", first_difference(wrong_rule, hr_rule, 3))
for n in (1, 2, 3):                # each minterm set -> its own truth table
    R = rows(n)
    tables = {tuple(int(r in [R[i] for i in S]) for r in R)
              for k in range(2 ** n + 1) for S in combinations(range(2 ** n), k)}
    print(n, "variables:", len(tables), "distinct functions; 2^(2^n) =", 2 ** 2 ** n)

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

minterms: [3, 5, 6, 7]  maxterms: [0, 1, 2, 4]
DNF: M'OT + MO'T + MOT' + MOT
short vs HR: None
wrong vs HR: (0, 0, 1)
1 variables: 4 distinct functions; 2^(2^n) = 4
2 variables: 16 distinct functions; 2^(2^n) = 16
3 variables: 256 distinct functions; 2^(2^n) = 256

Minterm আর maxterm হাতের হিসাবের সঙ্গে মেলে। MO + MT + OT সব ৮ সারিতে HR-এর নিয়মের সমান (None মানে কোনো ভুল সারি নেই)। কিন্তু “MO + T” ভুল: সারি (0, 0, 1)-এ, অর্থাৎ ম্যানেজার নন আর অফিস সময়ও নয় এমন কেউ শুধু 2FA দিয়েই অনুমতি পেয়ে যান। শুধু একটি উদাহরণ সারি দেখে “ঠিক আছে” বলা বিপজ্জনক; সব 2n সারি মেলানো দরকার, যা ছোট n-এ এক লাইনের কাজ। শেষ তিন লাইনে প্রতিটি minterm-সেট আলাদা truth table দেয়: 4, 16, 256.

৫ · Functional completeness — monotone function আর Post-এর উপপাদ্য

উপপাদ্য ৪.২ বলে ¬, ∧, ∨ দিয়ে যেকোনো function লেখা যায়, অর্থাৎ {¬, ∧, ∨} functionally complete. পর্ব ০৩-এ দেখেছেন {¬, ∧}, একা NAND আর একা NOR-ও complete, আর {∧, ∨} নয়। এখানে দুটি নতুন প্রশ্ন: ¬ ছাড়া ঠিক কোন function-গুলো বানানো যায়, আর কোনো connective-সেট complete কি না তা এক নজরে কীভাবে বলা যায়?

রিফান্ডের নিয়ম MO + MT + OT-এ কোনো ′ নেই। অর্থও স্পষ্ট: কোনো শর্ত পূরণ হলে অনুমতি কখনো কমে না। এই ধর্মের নাম monotone. Bn-এ ক্রম নিন a ≤ b, যদি প্রতিটি বিটে ai ≤ bi (পর্ব ৫৬-এর product order).

উপপাদ্য ৫.১ (monotone function)

f : Bn → B monotone, যদি a ≤ b হলেই f(a) ≤ f(b). একটি function শুধু ∧, ∨ আর ধ্রুবক 0, 1 দিয়ে লেখা যায় যদি এবং কেবল যদি সেটি monotone.

  1. (⇒) রাশির গঠনের ওপর structural induction (পর্ব ১২): চলক xi আর ধ্রুবক monotone. g, h monotone আর a ≤ b হলে g(a) ≤ g(b) ও h(a) ≤ h(b), তাই g(a)h(a) ≤ g(b)h(b) আর g(a) + h(a) ≤ g(b) + h(b). — ∧ আর ∨ দুই দিকেই ক্রম রক্ষা করে
  2. (⇐) f ≡ 0 হলে ধ্রুবক 0. নইলে প্রতিটি 1-বিন্দু a-এর জন্য পদ Pa = (যেসব i-তে ai = 1, সেই xi-গুলোর গুণফল) নিন (a = 00…0 হলে Pa = 1), আর g = সব Pa-এর যোগফল। — নির্মাণ, ′ ছাড়া
  3. f(x) = 1 হলে a = x নিয়ে Px(x) = 1, তাই g(x) = 1. — পদের সংজ্ঞা
  4. g(x) = 1 হলে কোনো 1-বিন্দু a-এর জন্য Pa(x) = 1, অর্থাৎ a-এর প্রতিটি 1-বিটে x-ও 1: a ≤ x. Monotone বলে f(x) ≥ f(a) = 1. তাই g = f. ∎ — monotone-এর সংজ্ঞা

অনুসিদ্ধান্ত: ¬ monotone নয় (0 ≤ 1 অথচ ¬0 = 1 > 0 = ¬1), তাই {∧, ∨, 0, 1} complete নয়। দুই চলকের ১৬টি function-এর মধ্যে monotone ঠিক ৬টি: 0, 1, x, y, xy, x + y. n চলকের monotone function-এর সংখ্যাকে Dedekind number বলে: n = 0 থেকে 4-এ 2, 3, 6, 20, 168 (scratch-এ ২১৬টি function পরীক্ষা করে মেলানো)।

Monotonicity একটি “দেয়াল”: কোনো connective-সেটের সব সদস্য monotone হলে তাদের জুড়ে যা-ই বানান, monotone থাকে। Emil Post দেখান, এমন দেয়াল ঠিক পাঁচটি।

উপপাদ্য ৫.২ (Post-এর functional completeness উপপাদ্য, প্রমাণ ছাড়া)

পাঁচটি শ্রেণি: T0 (f(0, …, 0) = 0), T1 (f(1, …, 1) = 1), S (self-dual: f(x′1, …, x′n) = f(x1, …, xn)′), M (monotone), L (affine: কয়েকটি চলকের XOR, সঙ্গে হয়তো 1). একটি connective-সেট functionally complete যদি এবং কেবল যদি পাঁচটি শ্রেণির প্রতিটির জন্য সেটে এমন একটি connective আছে যা ওই শ্রেণির বাইরে।

প্রয়োজনীয়তার দিকটি সহজ: প্রতিটি শ্রেণি চলক (xi) ধারণ করে আর জোড়া লাগানোয় বন্ধ, তাই সব connective একটি শ্রেণিতে থাকলে বানানো সব কিছু ওই শ্রেণিতেই থাকে, অথচ ¬ T0, T1, M-এর বাইরে ধ্রুবক 0 S ও T1-এর বাইরে, আর AND L-এর বাইরে। যথেষ্টতার প্রমাণ দীর্ঘ। NAND পাঁচটির কোনোটিতেই নেই: NAND(0, 0) = 1 (T0 নয়), NAND(1, 1) = 0 (T1 নয়), monotone নয়, NAND(x′, y′) = x + y অথচ NAND(x, y)′ = xy (self-dual নয়), আর NAND = 1 ⊕ xy-এ গুণফল আছে (affine নয়)। তাই এক NAND-ই যথেষ্ট। XOR আর 1 মিলে সব affine function দেয়, কিন্তু AND দেয় না: {⊕, 1} complete নয়।

Completeness শুধু অস্তিত্বের কথা; কয়টি gate লাগে, সেটাও প্রশ্ন। পর্ব ০৩-এ NAND দিয়ে ¬, ∧, ∨ দেখেছেন। নিচের stepper আরেকটি দরকারি function, XOR, শুধু NAND দিয়ে বানায়।

1লক্ষ্য: x ⊕ y2t = x ↑ y3u = x ↑ t4v = y ↑ t5out = u ↑ v
সারি xy = 00, 01, 10, 11
x ⊕ y
t
u
v
out
  1. লক্ষ্য। x ⊕ y = xy′ + x′y, সারি 00, 01, 10, 11-এ মান 0 1 1 0. হাতিয়ার শুধু দুই-ইনপুটের NAND: x ↑ y = (xy)′, যা শুধু 11 সারিতে 0.
  2. প্রথম gate. t = x ↑ y: মান 1 1 1 0. এই t পরের দুটি gate-এ একসঙ্গে কাজে লাগবে, তাই একবারই বানানো হলো।
  3. দ্বিতীয় gate. u = x ↑ t = (x · (xy)′)′ = x′ + xy = x′ + y. সারিগুলোতে: x = 0 হলে 1; 10-এ x = 1, t = 1, তাই 0; 11-এ t = 0, তাই 1. ফল 1 1 0 1.
  4. তৃতীয় gate. একইভাবে v = y ↑ t = y′ + x: 00-এ 1, 01-এ y = 1, t = 1, তাই 0, 10-এ 1, 11-এ 1. ফল 1 0 1 1.
  5. শেষ gate. out = u ↑ v = (uv)′ = u′ + v′ = xy′ + x′y = x ⊕ y (De Morgan). মান 0 1 1 0, লক্ষ্যের সঙ্গে হুবহু। scratch-এ সব ছোট circuit খুঁজে দেখা হয়েছে: তিনটি দুই-ইনপুট NAND gate-এ (ধ্রুবক ইনপুট দিলেও) XOR হয় না, তাই চারটিই সর্বনিম্ন।

নিচের ব্লক দুই চলকের ১৬টি function-এর প্রতিটিকে Post-এর পাঁচ শ্রেণিতে বসায়, কোন একক connective complete তা খোঁজে, আর তিনটি connective-সেট থেকে বানানো যায় এমন সব function গুনে উপপাদ্য ৫.১ আর affine-এর দেয়াল মেলায়।

from itertools import product
ROWS = list(product((0, 1), repeat=2))      # x y = 00, 01, 10, 11
ALL = list(product((0, 1), repeat=4))       # all 16 two-variable functions
NAME = {(0,0,0,1): "AND", (0,1,1,1): "OR", (0,1,1,0): "XOR", (1,1,1,0): "NAND",
        (1,0,0,0): "NOR", (1,1,0,1): "IMPLIES", (0,0,1,1): "x", (0,1,0,1): "y"}
def post_classes(f):
    v = dict(zip(ROWS, f)); out = []
    if v[0, 0] == 0: out.append("T0")
    if v[1, 1] == 1: out.append("T1")
    if all(v[1 - a, 1 - b] == 1 - v[a, b] for a, b in ROWS): out.append("S")
    if all(v[a] <= v[b] for a in ROWS for b in ROWS
           if a[0] <= b[0] and a[1] <= b[1]): out.append("M")
    if any(all(v[a, b] == c ^ (p & a) ^ (q & b) for a, b in ROWS)
           for p, q, c in product((0, 1), repeat=3)): out.append("L")
    return out
for f in [(0,0,0,1), (0,1,1,1), (0,1,1,0), (1,1,0,1), (0,0,1,1)]:
    print(f"{NAME[f]:8}", post_classes(f))
print("complete on its own:", [NAME[f] for f in ALL if not post_classes(f)])
def closure(ops, start):                    # everything buildable from ops
    S = set(start)
    while True:
        new = {op(a, b) for op in ops for a in S for b in S} - S
        if not new: return S
        S |= new
x, y, zero, one = (0, 0, 1, 1), (0, 1, 0, 1), (0,) * 4, (1,) * 4
op = lambda g: (lambda a, b: tuple(g(p, q) for p, q in zip(a, b)))
NAND, AND, OR = op(lambda p, q: 1 - (p & q)), op(min), op(max)
XOR = op(lambda p, q: p ^ q)
print("from {NAND}:", len(closure([NAND], [x, y])), "of 16")
mono = closure([AND, OR], [x, y, zero, one])
print("from {AND, OR, 0, 1}:", len(mono), "| monotone:",
      sum("M" in post_classes(f) for f in ALL))
print("from {XOR, 1}:", len(closure([XOR], [x, y, one])), "| affine:",
      sum("L" in post_classes(f) for f in ALL))

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

AND      ['T0', 'T1', 'M']
OR       ['T0', 'T1', 'M']
XOR      ['T0', 'L']
IMPLIES  ['T1']
x        ['T0', 'T1', 'S', 'M', 'L']
complete on its own: ['NOR', 'NAND']
from {NAND}: 16 of 16
from {AND, OR, 0, 1}: 6 | monotone: 6
from {XOR, 1}: 8 | affine: 8

প্রতিটি function একটি 4-বিটের tuple, যেমন AND = (0, 0, 0, 1). AND আর OR তিনটি দেয়ালের ভেতরে, তাই দুটি মিলেও complete নয়। IMPLIES (x → y) শুধু T1-এ আটকা, তাই তার সঙ্গে ধ্রুবক 0 যোগ করলেই complete (0 T1-এর বাইরে)। ১৬টির মধ্যে একা complete শুধু NOR আর NAND. NAND থেকে x, y নিয়ে বারবার জুড়ে ১৬টিই পাওয়া যায়। {AND, OR, 0, 1} থেকে ঠিক ৬টি, আর monotone function-ও ঠিক ৬টি: উপপাদ্য ৫.১ দুই চলকে মিলল। {XOR, 1} আটকে থাকে ৮টি affine function-এ।

৬ · Karnaugh map — ঘনককে ছকে বিছানো

একটি রাশি circuit-এ সরাসরি logic gate হয়ে যায়: SOP রূপ মানে প্রথম স্তরে কয়েকটি AND gate, দ্বিতীয় স্তরে একটি OR gate. খরচের সহজ মাপ পদের সংখ্যা আর literal-এর সংখ্যা। তাই প্রশ্ন: সবচেয়ে কম পদ, তারপর সবচেয়ে কম literal-এর SOP কোনটি? এর নাম two-level minimization. Gate, transistor আর delay-এর দিক কম্পিউটার আর্কিটেকচার ও ডিজিটাল লজিক কোর্সের পর্ব ৮-এ; এখানে গণিতটুকু।

§৪-এ দেখেছেন, একটি চলকের দুই রূপওয়ালা দুটি পদ মিশে যায়: pX + pX′ = p. ঘনকের ভাষায়, পাশাপাশি দুটি কোণ মিলে একটি ধার, দুটি সমান্তরাল ধার মিলে একটি তল। Karnaugh map (K-map) 4-চলকের ঘনক Q4-এর ১৬টি কোণকে একটি 4 × 4 ছকে এমনভাবে বসায় যে ঘনকের প্রতিবেশী ছকেও প্রতিবেশী হয়। চাবি হলো Gray code (পর্ব ৩৬): সারি আর কলামের লেবেল 00, 01, 11, 10 ক্রমে, যেখানে পরপর দুটি লেবেল এক বিটে আলাদা, আর শেষ 10 থেকে প্রথম 00-ও এক বিটে আলাদা।

উপপাদ্য ৬.১ (K-map-এর প্রতিবেশ)

4-চলকের K-map-এ (সারি AB, কলাম CD, দুটিই Gray ক্রমে) দুটি ঘর ঠিক এক বিটে আলাদা যদি এবং কেবল যদি তারা একই সারিতে বা একই কলামে পাশাপাশি, যেখানে প্রথম আর শেষ সারি (এবং প্রথম আর শেষ কলাম) পাশাপাশি ধরা হয়। প্রতিটি গুণফল-পদ ঠিক এমন একটি আয়তক্ষেত্র ঢাকে, যার দুই বাহুর দৈর্ঘ্য 1, 2 বা 4 (প্রান্ত পেরিয়ে ঘুরে আসা চলে)।

  1. একই সারির দুটি ঘরের AB এক, তাই তফাত শুধু CD-তে। Gray ক্রমের চারটি লেবেল একটি চক্র: 00–01–11–10–00, যেখানে চক্রের পাশের দুটি লেবেল ঠিক এক বিটে আলাদা আর বিপরীত দুটি (00 আর 11, 01 আর 10) দুই বিটে। — সরাসরি তালিকা
  2. আলাদা সারি আর আলাদা কলামের দুটি ঘর অন্তত দুই বিটে আলাদা (AB-তে একটি, CD-তে একটি)। তাই প্রতিবেশ ঠিক উপপাদ্যের বর্ণনা। — ক্ষেত্র ভাগ
  3. একটি পদ AB-এর ওপর শর্ত দেয় 0, 1 বা 2টি literal দিয়ে, যা চক্রে যথাক্রমে ৪টি, পাশাপাশি ২টি বা ১টি সারি বাছে (যেমন B′ মানে AB = 00 বা 10, চক্রে পাশাপাশি); CD-র ক্ষেত্রেও তাই। সারি-বাছাই আর কলাম-বাছাইয়ের গুণফলই আয়তক্ষেত্র। ∎

তাই K-map-এ দল সবসময় ১, ২, ৪, ৮ বা ১৬টি ঘরের আয়তক্ষেত্র; তিনটি বা ছয়টি ঘরের দল কোনো পদ নয়। এবার একটি 4-চলকের function সরল করি: বাজারঘরের অর্ডার-যাচাই ব্যবস্থার একটি সতর্ক-সংকেত f(A, B, C, D) = Σm(0, 1, 2, 5, 6, 7, 8, 9, 10, 14), যেখানে ঘরের নম্বর 8A + 4B + 2C + D.

4-variable Karnaugh map of f = sum of minterms 0, 1, 2, 5, 6, 7, 8, 9, 10, 14 with groups CD', B'C', A'BD and the redundant corner group B'D' AB\CD 00011110 00011110 111 111 1 111 000 000 CD′ B′C′ A′BD B′D′
  1. ছক ভরা। সারি AB আর কলাম CD দুটিই Gray ক্রমে 00, 01, 11, 10. ঘর (AB, CD)-এর নম্বর 8A + 4B + 2C + D; যেমন সারি 01, কলাম 11 মানে 0111 = 7. দশটি ঘরে 1. লক্ষ্য: সবচেয়ে বড় আয়তক্ষেত্রে, সবচেয়ে কম সংখ্যায়, সব 1 ঢাকা।
  2. শেষ কলাম। কলাম CD = 10-এর চারটি ঘর (2, 6, 14, 10) সব 1. এখানে C = 1, D = 0, আর A, B যা-ই হোক: পদ CD′. ঘর 14-কে আর কোনো 1-ভরা আয়তক্ষেত্র ঢাকে না, তাই এই দল বাদ দেওয়া যাবে না।
  3. ঘুরে আসা দল। সারি 00 আর সারি 10 Gray চক্রে পাশাপাশি (তফাত শুধু A). তাদের প্রথম দুই কলামের চারটি ঘর 0, 1, 8, 9: এখানে B = 0, C = 0, পদ B′C′. ঘর 1 আর 9-কে শুধু এই দলই ঢাকে।
  4. বাকি 1. ঘর 5 আর 7 এখনো ঢাকা হয়নি। সারি 01-এর কলাম 01 আর 11 পাশাপাশি: A = 0, B = 1, D = 1, পদ A′BD. এখন দশটি 1-ই ঢাকা: f = B′C′ + CD′ + A′BD, ৩টি পদ আর ৭টি literal, যেখানে canonical SOP-এ ছিল ১০টি পদ আর ৪০টি literal.
  5. প্রলোভন। চার কোণের ঘর 0, 2, 8, 10 সারি আর কলাম দুই দিকেই ঘুরে এসে একটি বৈধ দল, পদ B′D′, আর একে বড় করা যায় না। তবু এটি লাগে না: এর চারটি ঘর ইতিমধ্যে B′C′ আর CD′ ঢেকেছে। “সবচেয়ে বড় দল” মানেই “উত্তরে থাকতে হবে” নয়; §৭-এর prime implicant chart দেখায় এই তিন পদই একমাত্র সবচেয়ে ছোট উত্তর, আর সেখানের Python ব্লকের brute force-ও একই উত্তর দেয়।

K-map ৫–৬ চলকে আরও জটিল হয়ে যায় (একাধিক ছক পাশাপাশি), আর চোখে দেখা দলে ভুলের ঝুঁকি বাড়ে। হাতে-কলমে K-map-এর বহু উদাহরণ কম্পিউটার আর্কিটেকচার কোর্সের পর্ব ৯-এ। গণিতের দিক থেকে দরকার এমন একটি পদ্ধতি, যা চোখের বদলে নিয়ম মেনে চলে।

৭ · Prime implicant আর Quine–McCluskey পদ্ধতি

সংজ্ঞা ৭.১

একটি গুণফল-পদ p হলো f-এর implicant, যদি যেখানে p = 1 সেখানে f = 1 (p ≤ f). p একটি prime implicant, যদি p implicant আর তার কোনো একটি literal মুছলে আর implicant থাকে না। কোনো 1-সারিকে যদি একটিমাত্র prime implicant ঢাকে, তবে সেটি essential prime implicant.

K-map-এর ভাষায়: implicant = শুধু 1-ভরা একটি বৈধ আয়তক্ষেত্র, prime = যাকে আর দ্বিগুণ করা যায় না। আগের উদাহরণে CD′ আর B′C′ essential, আর B′D′ prime কিন্তু essential নয়।

উপপাদ্য ৭.২ (minimal SOP শুধু prime দিয়ে)

খরচ যদি literal-এর সংখ্যা হয় (বা আগে পদের সংখ্যা, তারপর literal), তবে f-এর প্রতিটি minimal SOP-এর প্রতিটি পদ একটি prime implicant.

  1. Minimal SOP f = p1 + ⋯ + pk-এ প্রতিটি pi ≤ f, তাই প্রতিটি পদ implicant. — x ≤ x + y
  2. ধরুন p1 prime নয়: একটি literal মুছে পাওয়া q1 এখনো implicant, আর q1 ≥ p1 (কম শর্ত, বেশি সারিতে 1). — বিরোধের অনুমান
  3. g = q1 + p2 + ⋯ + pk নিন। সব পদ implicant, তাই g ≤ f; আর q1 ≥ p1, তাই g ≥ f. ফলে g = f. — দুই দিকের অসমতা
  4. g-তে পদ সমান কিন্তু literal একটি কম, যা minimal হওয়ার বিরোধী। ∎

উল্টোটি সত্য নয়: সব prime implicant উত্তরে লাগে না (B′D′)। তাই minimization দুই ভাগে: (১) সব prime implicant খোঁজা, (২) তাদের মধ্যে সবচেয়ে সস্তা এমন একটি দল বাছা যা প্রতিটি 1-সারি ঢাকে। প্রথম ভাগের পদ্ধতিগত উপায় Quine–McCluskey (Willard Quine ১৯৫২, Edward McCluskey ১৯৫৬)। পদকে লেখা হয় 0, 1, - দিয়ে, যেমন 0-01 মানে A′C′D (B যা-ই হোক)।

  • মিলনের নিয়ম: দুটি পদ যদি ঠিক একটি অবস্থানে 0 বনাম 1-এ আলাদা হয় আর '-' একই জায়গায় থাকে, তবে তারা মিশে সেখানে '-' হয়, কারণ pX + pX′ = p.
  • সম্পূর্ণতা: 2k ঘরের যেকোনো implicant-কে যেকোনো একটি '-' বরাবর দুই ভাগ করলে দুটি 2k−1 ঘরের implicant পাওয়া যায়; তাই k-এর ওপর induction-এ প্রতিটি implicant কোনো এক রাউন্ডে তৈরি হয়।
  • Prime চেনা: যে পদ কোনো রাউন্ডে কারও সঙ্গে মেশে না, তাকে আর বড় করা যায় না: সেটিই prime.
1দল ০: 00002দল ১: 0001 0010 10003দল ২: 0101 0110 1001 10104দল ৩: 0111 11105রাউন্ড ২: জোড়া মেলানো6রাউন্ড ৩: চার ঘরের পদ7আর কিছু মেশে না8chart: সবচেয়ে ছোট cover
f = Σm(0, 1, 2, 5, 6, 7, 8, 9, 10, 14)
নতুন পদ
prime
উত্তর
  1. দলে ভাগ। দশটি minterm-কে 4-বিটে লিখে 1-এর সংখ্যা অনুযায়ী সাজান। শুধু পাশের দুই দলের পদ মিশতে পারে, কারণ এক বিটের তফাত মানে 1-এর সংখ্যায় ঠিক এক তফাত। এতে তুলনার সংখ্যা কমে।
  2. রাউন্ড ২। পাশের দলের প্রতিটি জোড়া দেখুন। যেমন 0000 আর 1000 শুধু A-তে আলাদা, মিলে -000 (ঘর 0, 8). মোট ১৩টি দুই-ঘরের পদ, আর দশটি minterm-এর প্রতিটি অন্তত একবার মিশেছে, তাই কোনো একক minterm prime নয়।
  3. রাউন্ড ৩। দুই-ঘরের পদ আবার মেলান ('-' একই জায়গায় থাকতে হবে)। যেমন -000 আর -010 মিলে -0-0 (ঘর 0, 2, 8, 10). চার ঘরের পদ মাত্র ৩টি: -0-0, -00-, --10 (একই পদ একাধিক জোড়া থেকে আসে, একবার রাখুন)। যে তিনটি দুই-ঘরের পদ কারও সঙ্গে মেশেনি, সেগুলো prime: 0-01 (A′C′D), 01-1 (A′BD), 011- (A′BC).
  4. রাউন্ড ৪ নেই। চার ঘরের তিনটি পদের কোনো দুটি এক বিটে আলাদা নয়, তাই তিনটিই prime: B′D′, B′C′, CD′. মোট ৬টি prime implicant, ঠিক K-map-এ যতগুলো সর্বোচ্চ আয়তক্ষেত্র আছে।
  5. Prime implicant chart. প্রতিটি minterm-কে কোন prime ঢাকে দেখুন। ঘর 1 আর 9 শুধু B′C′, ঘর 14 শুধু CD′: দুটিই essential. এরা 0, 1, 2, 6, 8, 9, 10, 14 ঢাকে; বাকি 5 আর 7. A′BD একাই দুটি ঢাকে, আর A′C′D + A′BC দুটি পদ নেয়। উত্তর B′C′ + CD′ + A′BD.

দ্বিতীয় ভাগ, অর্থাৎ chart থেকে সবচেয়ে ছোট cover বাছা, একটি set cover সমস্যা। ছোট ক্ষেত্রে সব উপসেট পরীক্ষা করা চলে, আর নিচের ব্লক ঠিক তাই করে: Q–M দিয়ে prime implicant, brute force দিয়ে সবচেয়ে কম পদ (সমান হলে কম literal), আর শেষে উত্তরটি truth table-এর প্রতিটি সারিতে মেলানো। দ্বিতীয় উদাহরণে don't care আছে, যা §৮-এ ব্যাখ্যা করা হয়েছে।

from itertools import combinations
def combine(a, b):                      # '0-10' + '0-11' -> '0-1-'
    d = [i for i in range(len(a)) if a[i] != b[i]]
    if len(d) == 1 and '-' not in (a[d[0]], b[d[0]]):
        return a[:d[0]] + '-' + a[d[0] + 1:]
def prime_implicants(n, ones, dc=()):
    terms, primes, rnd = {format(m, f'0{n}b') for m in (*ones, *dc)}, set(), 0
    while terms:
        new, used = set(), set()
        for a, b in combinations(sorted(terms), 2):
            c = combine(a, b)
            if c: new.add(c); used |= {a, b}
        rnd += 1; print(f"  round {rnd}: {len(terms)} terms, {len(terms - used)} prime")
        primes |= terms - used; terms = new
    return sorted(primes)
def covers(p, m):
    return all(c in '-' + b for c, b in zip(p, format(m, f'0{len(p)}b')))
def text(p):
    return ''.join('ABCD'[i] + ("'" if c == '0' else '') for i, c in enumerate(p) if c != '-')
def minimal_cover(n, ones, dc=()):      # brute force over sets of primes
    P = prime_implicants(n, ones, dc)
    for k in range(1, len(P) + 1):
        good = [S for S in combinations(P, k)
                if all(any(covers(p, m) for p in S) for m in ones)]
        if good: return P, min(good, key=lambda S: sum(n - p.count('-') for p in S))
for ones, dc in [((0, 1, 2, 5, 6, 7, 8, 9, 10, 14), ()),
                 ((5, 6, 7, 8, 9), tuple(range(10, 16)))]:
    print("f = sum of m", ones, "dont-care", dc)
    P, best = minimal_cover(4, ones, dc)
    print("  primes :", " ".join(text(p) for p in P))
    print("  minimal:", " + ".join(text(p) for p in best))
    ok = all((m in ones) == any(covers(p, m) for p in best)
             for m in range(16) if m not in dc)
    print("  agrees with the truth table on every cared row:", ok)

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

f = sum of m (0, 1, 2, 5, 6, 7, 8, 9, 10, 14) dont-care ()
  round 1: 10 terms, 0 prime
  round 2: 13 terms, 3 prime
  round 3: 3 terms, 3 prime
  primes : CD' B'D' B'C' A'C'D A'BD A'BC
  minimal: CD' + B'C' + A'BD
  agrees with the truth table on every cared row: True
f = sum of m (5, 6, 7, 8, 9) dont-care (10, 11, 12, 13, 14, 15)
  round 1: 11 terms, 0 prime
  round 2: 17 terms, 0 prime
  round 3: 8 terms, 2 prime
  round 4: 1 terms, 1 prime
  primes : BD BC A
  minimal: BD + BC + A
  agrees with the truth table on every cared row: True

প্রথম function-এ রাউন্ডের সংখ্যা stepper-এর সঙ্গে হুবহু: ১০, ১৩, ৩টি পদ, prime ০, ৩, ৩. ছয়টি prime, আর brute force-এর সবচেয়ে ছোট উত্তর CD′ + B′C′ + A′BD, যাতে B′D′ নেই। দ্বিতীয়টি §৮-এর don't care উদাহরণ। কোড ছোট রাখতে combine শুধু “এক জায়গায় 0 বনাম 1” দেখে; একই পদ দুই জোড়া থেকে এলে set একবারই রাখে।

৮ · Don't care, আর minimization কতটা কঠিন

বাজারঘরের গুদামে প্রতিটি তাকের স্টক-স্তর ০ থেকে ৯-এর একটি অঙ্ক, 4 বিটে ABCD (BCD রূপে) রাখা। স্তর ৫ বা বেশি হলে সবুজ বাতি জ্বলবে: f = Σm(5, 6, 7, 8, 9). কিন্তু 1010 থেকে 1111 (১০–১৫) কখনো আসে না। ওই সারিতে f যা-ই হোক, কারও কিছু যায় আসে না: এগুলো don't care, লেখা হয় d(10, …, 15). Minimization-এ এদের যেটিকে 1 ধরলে দল বড় হয় সেটিকে 1, বাকিগুলোকে 0 ধরা যায়।

  • Don't care ছাড়া: f = A′BD + A′BC + AB′C′, ৩টি পদ, ৯টি literal.
  • Don't care নিয়ে: f = A + BD + BC, ৩টি পদ, ৫টি literal. যেমন A একাই ঘর 8–15 ঢাকে, যার 8, 9 আসল 1 আর বাকিগুলো don't care.

দুটি উত্তরই Q–M ব্লকে মেলানো, আর শুধু “যত্নের” সারিতে (০–৯) মূল নিয়মের সমান। সাবধান: don't care-কে উত্তরের শর্ত বানাবেন না; সেই সারি সত্যিই এলে (যেমন ত্রুটিপূর্ণ সেন্সর 1100 পাঠাল) circuit-এর আচরণ অনির্ধারিত।

এবার কঠিনতা। Q–M-এর প্রথম ভাগই বিপুল হতে পারে: n চলকে prime implicant-এর সংখ্যা n-এর সঙ্গে exponential হারে বাড়তে পারে, আর ইনপুট হিসেবে truth table নিজেই 2n সারির। দ্বিতীয় ভাগ set cover, যা সাধারণভাবে NP-hard. Truth table থেকে সবচেয়ে ছোট SOP বের করার সমস্যাটি NP-complete বলে পরিচিত (William Masek-এর ১৯৭৯ সালের একটি অপ্রকাশিত পাণ্ডুলিপিতে প্রমাণ বলে উল্লেখ করা হয়), আর ইনপুট যখন truth table নয় বরং একটি রাশি, তখন সমস্যাটি আরও কঠিন শ্রেণিতে পড়ে (Christopher Umans, ২০০১, বলে উল্লেখ করা হয়)। NP-hardness-এর ধারণা DSA কোর্সের পর্ব ৬৪-এ।

তাই বাস্তবের chip-নকশায় সঠিক minimum নয়, ভালো heuristic আর multi-level রূপ ব্যবহার হয়; বিস্তারিত কম্পিউটার আর্কিটেকচার কোর্সের পর্ব ১০-এ। বাজারঘরের ক্ষেত্রে শিক্ষাটি সরল: permission-এর নিয়ম যত চলকে ছড়ায়, হাতে সরল করা তত ঝুঁকিপূর্ণ, আর প্রতিটি সরল রূপ যন্ত্রে সব সারিতে মেলানো উচিত।

৯ · পরীক্ষার অঙ্ক আর একটি ভুল প্রমাণ

অঙ্ক ১: Canonical রূপে রূপান্তর

F(x, y, z) = x + y′z-কে Σm আর ΠM রূপে লিখুন।

  1. x = 1-এর চার সারি: 100, 101, 110, 111, অর্থাৎ 4, 5, 6, 7.
  2. y′z = 1 মানে y = 0, z = 1: 001 আর 101, অর্থাৎ 1, 5 (5 আগেই আছে)।
  3. F = Σm(1, 4, 5, 6, 7), আর বাকি সারি থেকে F = ΠM(0, 2, 3) = (x + y + z)(x + y′ + z)(x + y′ + z′) (scratch-এ ৮টি সারি মিলিয়ে দেখা)।

অঙ্ক ২: Don't care আর একাধিক উত্তর

f(A, B, C, D) = Σm(4, 8, 10, 11, 12, 15) + d(9, 14)-এর minimal SOP বের করুন।

  1. Prime implicant (Q–M বা K-map): BC′D′ (4, 12), AD′ (8, 10, 12, 14), AC (10, 11, 14, 15), AB′ (8, 9, 10, 11).
  2. ঘর 4 শুধু BC′D′, ঘর 15 শুধু AC ঢাকে: দুটিই essential. এরা 4, 10, 11, 12, 15 ঢাকে; বাকি শুধু 8.
  3. 8 ঢাকে AD′ আর AB′, দুটিই ২ literal. তাই দুটি সমান ভালো উত্তর: BC′D′ + AC + AD′ অথবা BC′D′ + AC + AB′, প্রতিটি ৭ literal (scratch-এ brute force-এ মেলানো)। Minimal SOP অনন্য হতে হবে, এমন কোনো নিয়ম নেই।

অঙ্ক ৩: কয়টি function?

৩ চলকের কয়টি Boolean function-এ f(0, 0, 0) = 0? উত্তর: একটি সারির মান বাঁধা, বাকি ৭টি স্বাধীন, তাই 27 = 128. আর f(0, 0, 0) = 0 ও f(1, 1, 1) = 1 দুটিই হলে 26 = 64 (দুটিই scratch-এ ২৫৬টি function গুনে মেলানো)।

প্রমাণের ভুল ধরুন: “সব prime implicant লাগে”

একজন লিখলেন: “উপপাদ্য ৭.২ বলে minimal SOP-এর প্রতিটি পদ prime implicant. প্রতিটি prime implicant একটি সর্বোচ্চ দল, তাই কোনোটি বাদ দিলে কিছু 1 ঢাকা পড়বে না। অতএব minimal SOP = সব prime implicant-এর যোগফল।”

ভুল কোথায়: প্রথম বাক্য “minimal ⇒ সব পদ prime” বলে, উল্টো “prime ⇒ minimal-এ আছে” বলে না; এটি converse-এর ভুল। দ্বিতীয় বাক্যও মিথ্যা: “সর্বোচ্চ” মানে দলটিকে বড় করা যায় না, এর মানে এই নয় যে তার প্রতিটি 1 শুধু সে-ই ঢাকে। পাল্টা-উদাহরণ §৬-এর f: সব ৬টি prime যোগ করলে ১৫টি literal, অথচ B′C′ + CD′ + A′BD-তে ৭টি; B′D′-এর চারটি ঘর অন্য দুটি দল ঢেকে দেয়। শুধু essential prime implicant নিশ্চিতভাবে লাগে।

আরও গভীরে: Boolean algebra আর Boolean ring একই জিনিসের দুই রূপ: x + y-এর বদলে x ⊕ y আর গুণ xy নিলে একটি ring পাওয়া যায় যাতে xx = x; এই দৃষ্টিভঙ্গি পর্ব ৭১ “Ring আর field — modular ring, polynomial আর GF(2ⁿ)”-এ কাজে লাগবে। Function-কে সরল রাশির বদলে একটি সাজানো সিদ্ধান্ত-গ্রাফে রাখার পদ্ধতি Binary Decision Diagram (Randal Bryant, ১৯৮৬), যেখানে চলকের একটি নির্দিষ্ট ক্রমে প্রতিটি function-এর রূপ অনন্য, তাই equivalence যাচাই সহজ। আর যেকোনো function সত্য হয় এমন একটি সারি খোঁজা হলো SAT, যা পর্ব ৭৭ “SAT আর SMT solver — discrete math দিয়ে software যাচাই”-এর বিষয়।

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

  • n চলকের কয়টি Boolean function? 22n; প্রতিটি 2n সারিতে দুটি বাছাই।
  • x + yz = (x + y)(x + z) প্রমাণ করুন। Huntington-এর axiom H2; বা ডান পাশ খুলে absorption.
  • NAND কেন universal? ¬x = x ↑ x আর xy = (x ↑ y)′, আর {¬, ∧} complete; Post-এর পাঁচ শ্রেণির বাইরে।
  • K-map-এ সারি 00, 01, 11, 10 কেন? Gray ক্রম: পাশের ঘর এক বিটে আলাদা, তাই দল মানে একটি পদ।
  • Essential prime implicant কী? যে prime একাই কোনো 1 ঢাকে; প্রতিটি minimal SOP-এ থাকে।

১০ · AI-এর যুগে — Boolean সরলীকরণ আর প্রমাণ যাচাই

Boolean algebra-র প্রশ্নে AI সহকারী পরিচিত সূত্র ঠিক বলে, কিন্তু বড় রাশি সরল করতে গিয়ে একটি পদ হারায়, K-map-এ অবৈধ দল বাঁধে, আর প্রমাণে উল্টো দিক বা শর্ত গুলিয়ে ফেলে। কয়েকটি নিয়মিত ভুল আর ধরার উপায়:

AI-এর ভুলকীভাবে ধরবেন
De Morgan উল্টো: (x + y)′ = x′ + y′x = 1, y = 0 বসান: বাঁয়ে 0, ডানে 1
K-map-এ ৩ বা ৬ ঘরের দল, বা ঘুরে আসা প্রতিবেশ ভুলে যাওয়াপ্রতিটি দলের আকার 2-এর ঘাত কি না, আর উত্তর সব 2n সারিতে মেলে কি না দেখুন
“সব prime implicant যোগ করলেই minimal”§৬-এর f: ৬টি prime-এ ১৫ literal, minimal-এ ৭
Function গোনায় 2n বা 22n বলাn = 2-এ সব truth table তালিকা করুন: ১৬টি
{⊕, 1} বা {∧, ∨}-কে complete বলাPost-এর শ্রেণি দেখুন, বা closure গুনুন: ৮ আর ৬, ১৬ নয়
Don't care সারিতেও উত্তর মেলাতে গিয়ে বা না মিলিয়ে বিভ্রান্তিশুধু যত্নের সারিতে মেলান; don't care কোথায় 1 ধরা হলো তা লিখে রাখুন

AI-এর কাছে সরলীকরণ বা প্রমাণ চাইলে এমন কাঠামো দিন, যাতে প্রতিটি ধাপ আলাদা করে যাচাই করা যায়:

নিচের Boolean function-টি সরল করো আর প্রতিটি ধাপ যাচাইযোগ্য রাখো: function: [যেমন f(A,B,C,D) = Σm(0,1,2,5,6,7,8,9,10,14)], don't care: [থাকলে দাও] ১. প্রথমে সব prime implicant-এর তালিকা দাও, প্রতিটি কোন minterm ঢাকে তা সহ। ২. কোনগুলো essential, আর কেন (কোন minterm-কে একাই ঢাকে) তা লেখো। ৩. বাকি minterm কীভাবে ঢাকলে, আর খরচ কীভাবে মাপলে (পদ, literal) উত্তরটি minimal, তা ব্যাখ্যা করো; একাধিক সমান উত্তর থাকলে সবগুলো দাও। ৪. Algebra-য় প্রমাণ করলে প্রতিটি ধাপে কোন সূত্র (axiom, absorption, consensus) লাগল তা পাশে লেখো। ৫. শুধু itertools দিয়ে একটি ছোট Python কোড দাও, যা সব সারিতে মূল function আর উত্তর মেলায়। ৬. কোনো ইতিহাস, নাম বা সাল নিয়ে নিশ্চিত না হলে তা স্পষ্ট বলো।

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

নিয়মটি সহজ: ছোট n-এ Boolean দাবির চূড়ান্ত বিচারক truth table. ৪–৬ চলকে সব সারি মেলাতে এক সেকেন্ডও লাগে না, তাই না মিলিয়ে কোনো সরল রূপ circuit বা permission নিয়মে বসাবেন না।

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

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

প্র ০১George Boole-এর ১৮৫৪ সালের “চিন্তার নিয়ম” কীভাবে ৮০ বছর পর relay circuit-এর নকশার ভাষা হলো?

George Boole ছিলেন ইংল্যান্ডে জন্ম নেওয়া স্বশিক্ষিত গণিতবিদ, পরে আয়ারল্যান্ডের Cork-এ অধ্যাপক। ১৮৪৭ সালে “The Mathematical Analysis of Logic” আর ১৮৫৪ সালে “An Investigation of the Laws of Thought” বইয়ে তিনি যুক্তিকে বীজগণিতের মতো লিখতে চেয়েছিলেন: শ্রেণিকে চলক ধরে, “এবং”-কে গুণ ধরে, আর x · x = x সমীকরণকে চিন্তার একটি মৌলিক নিয়ম বলে। তাঁর লক্ষ্য ছিল দর্শন আর যুক্তিবিদ্যা, কোনো যন্ত্র নয়।

পরের কয়েক দশকে William Stanley Jevons, Charles Sanders Peirce আর Ernst Schröder এই বীজগণিতকে আধুনিক রূপ দেন; যেমন Boole-এর “বর্জনমূলক যোগ”-এর বদলে সাধারণ OR গ্রহণ করা হয়। Peirce প্রায় ১৮৮০ সালে লক্ষ করেন যে একটিমাত্র connective (আজকের NOR বা NAND) দিয়েই সব কিছু লেখা যায়, যদিও লেখাটি তখন প্রকাশিত হয়নি বলে জানা যায়; ১৯১৩ সালে Henry Sheffer একই ধারণা প্রকাশ করেন। ১৯০৪ সালে Huntington axiom-গুলো স্পষ্ট করেন, যা §২-এ দেখেছেন।

মোড় ঘোরে ১৯৩৭ সালে। MIT-এর ছাত্র Claude Shannon তাঁর master's thesis-এ (১৯৩৮ সালে “A Symbolic Analysis of Relay and Switching Circuits” নামে প্রকাশিত) দেখান যে টেলিফোন এক্সচেঞ্জের relay আর switch-এর জাল ঠিক Boole-এর বীজগণিত মেনে চলে: সিরিজে যুক্ত দুটি switch মানে AND, সমান্তরালে মানে OR. ফলে circuit-কে সমীকরণে লিখে সরল করা যায়, আর সমীকরণ থেকে circuit নকশা করা যায়। প্রায় একই সময়ে জাপানে Akira Nakashima আর সোভিয়েত ইউনিয়নে Victor Shestakov স্বাধীনভাবে কাছাকাছি ধারণায় পৌঁছান বলে ইতিহাসে উল্লেখ করা হয়।

পরের ধাপগুলো এই পর্বেই আছে: ১৯৫০-এর দশকে relay থেকে transistor, আর সঙ্গে K-map (Veitch ১৯৫২, Karnaugh ১৯৫৩) ও Quine–McCluskey দিয়ে নকশা ছোট করার পদ্ধতি। আজ একটি processor-এর কোটি কোটি gate-এর প্রতিটিকে বর্ণনা করার ভাষা এখনো সেই বীজগণিত।

মূল উপলব্ধি: একটি বিমূর্ত গাণিতিক কাঠামো প্রায় এক শতাব্দী পর সম্পূর্ণ অপ্রত্যাশিত প্রয়োগ পেয়েছে; Shannon-এর অবদান ছিল লক্ষ করা যে switch-এর জাল আর Boole-এর সমীকরণ একই গঠন।

প্র ০২Robbins-এর প্রশ্ন কী ছিল, আর ১৯৯৬ সালে একটি কম্পিউটার প্রোগ্রাম কীভাবে ৬০ বছরের পুরোনো সমস্যার সমাধান করল?

§২-এ Boolean algebra-র সংজ্ঞায় চার জোড়া axiom ছিল। গণিতবিদেরা প্রশ্ন করেন, আরও কম বা আরও ভিন্ন axiom যথেষ্ট কি না। ১৯৩৩ সালে Huntington একটি ছোট axiom-সেট দেন: + commutative আর associative, আর একটি তৃতীয় সমীকরণ, (x′ + y)′ + (x′ + y′)′ = x, যেখানে · আর 0, 1 ছাড়াই শুধু + আর ′ দিয়ে পুরো Boolean algebra সংজ্ঞায়িত হয়।

প্রায় একই সময়ে Herbert Robbins প্রস্তাব করেন: তৃতীয় সমীকরণের বদলে ((x + y)′ + (x + y′)′)′ = x নিলেও কি একই কাঠামো, অর্থাৎ Boolean algebra, পাওয়া যায়? দেখতে প্রায় একই, কিন্তু কেউ প্রমাণ করতে পারেননি, পাল্টা-উদাহরণও পাননি। Alfred Tarski আর তাঁর ছাত্ররাসহ অনেকে চেষ্টা করেন। প্রশ্নটি “Robbins conjecture” নামে কয়েক দশক খোলা থাকে।

১৯৯৬ সালের অক্টোবরে Argonne National Laboratory-র William McCune-এর তৈরি স্বয়ংক্রিয় theorem prover EQP প্রমাণটি খুঁজে পায়, প্রায় আট দিনের গণনায় বলে বর্ণনা করা হয়। প্রোগ্রামটি সমীকরণ থেকে নতুন সমীকরণ বের করে, শুধু প্রতিস্থাপন আর একীকরণের নিয়ম মেনে। প্রমাণটি পরে মানুষ যাচাই করে সহজ রূপে লিখেছেন। এটি প্রায়ই উল্লেখ করা হয় এমন প্রথম উদাহরণগুলোর একটি হিসেবে, যেখানে একটি প্রোগ্রাম একটি পরিচিত খোলা গাণিতিক প্রশ্নের সমাধান খুঁজে পেয়েছে।

শিক্ষাটি এই পর্বের সঙ্গে সরাসরি যুক্ত: axiom থেকে প্রমাণ মানে সমীকরণের শিকল, যার প্রতিটি ধাপ যন্ত্রে যাচাই করা যায়। আজকের Lean বা Isabelle-এর মতো proof assistant আরও এক ধাপ এগিয়ে, যেখানে মানুষের লেখা প্রমাণও যন্ত্রে মিলিয়ে নেওয়া হয়। তবে truth table দিয়ে {0, 1}-এ যাচাই যথেষ্ট নয়: Robbins-এর প্রশ্ন ছিল সব কাঠামো নিয়ে, যার কিছু অসীম।

মূল উপলব্ধি: কয়েকটি সরল সমীকরণও গভীর প্রশ্ন তোলে; Robbins conjecture দেখায় যে axiom থেকে সমীকরণের প্রমাণ একটি যান্ত্রিক খোঁজ, যেখানে কম্পিউটার মানুষের চেয়ে এগিয়ে যেতে পারে।

প্র ০৩Shannon প্রমাণ করেছিলেন প্রায় সব Boolean function-এর জন্য বিশাল circuit লাগে। তবু একটিও নির্দিষ্ট function-এর জন্য তা দেখানো যায় না কেন?

১৯৪৯ সালে Shannon একটি গণনার যুক্তি দেন, যা এই পর্বের উপপাদ্য ১.২-এর সরাসরি প্রয়োগ। n চলকের function 22nটি। অন্যদিকে, s-টি gate-এর circuit কয়টি হতে পারে তা গোনা যায়: প্রতিটি gate-এর ধরন আর দুটি ইনপুট বাছাইয়ের উপায় সীমিত, তাই মোট circuit মোটামুটি (c · s2)s-এর ক্রমে। s যদি 2n/n-এর চেয়ে যথেষ্ট ছোট হয়, তবে এই সংখ্যা 22n-এর তুলনায় নগণ্য। অর্থাৎ ছোট circuit সংখ্যায় কম, function অনেক বেশি; পর্ব ৩২-এর pigeonhole-এর মতো, বেশিরভাগ function-এর ভাগ্যে ছোট circuit জোটে না।

উল্টো দিকে, প্রতিটি function-ই প্রায় 2n/n আকারের circuit-এ বানানো যায় বলে Oleg Lupanov ১৯৫০-এর দশকের শেষে দেখান বলে উল্লেখ করা হয়। তাই “সাধারণ” function-এর circuit-আকার মোটামুটি 2n/n, exponential.

অদ্ভুত বিষয় হলো, এই যুক্তি কোন function কঠিন তা বলে না; শুধু বলে কঠিন function আছে, প্রচুর আছে। কোনো নির্দিষ্ট, স্পষ্টভাবে বর্ণনা করা যায় এমন function (যেমন NP-এর কোনো সমস্যা) নিয়ে সবচেয়ে ভালো জানা নিম্নসীমা সাধারণ circuit-এ মাত্র 3n-এর সামান্য বেশি বলে বর্ণনা পাওয়া যায়। এটি linear, exponential-এর ধারেকাছেও নয়। যদি কেউ NP-এর কোনো সমস্যার জন্য superpolynomial circuit নিম্নসীমা প্রমাণ করতে পারেন, তবে P ≠ NP প্রমাণ হয়ে যাবে।

কেন এত কঠিন, তার আংশিক ব্যাখ্যাও আছে: Razborov আর Rudich-এর ১৯৯০-এর দশকের “natural proofs” ফল দেখায় যে অনেক স্বাভাবিক প্রমাণ-কৌশল, যদি শক্তিশালী pseudorandom function থাকে, এই কাজ পারবে না। এটি পর্ব ৪৩-এর probabilistic method-এর মতো অস্তিত্ব-প্রমাণের সীমার একটি নাটকীয় উদাহরণ।

মূল উপলব্ধি: গণনার যুক্তি দেখায় প্রায় সব Boolean function-এর circuit exponential আকারের, কিন্তু একটি নির্দিষ্ট function-এর জন্য তা প্রমাণ করা জটিলতা তত্ত্বের সবচেয়ে কঠিন খোলা সমস্যাগুলোর একটি।

প্র ০৪Two-level minimization যদি এত কঠিন হয়, তবে বাস্তবের chip-নকশার software কী করে?

§৮-এ দেখেছেন, সবচেয়ে ছোট SOP খোঁজা সাধারণভাবে NP-hard, আর Quine–McCluskey-এর prime implicant-ই exponential সংখ্যায় হতে পারে। বাস্তবের circuit-এ ইনপুট কয়েক ডজন থেকে শত শত। তাই শিল্পে লক্ষ্য বদলে যায়: সবচেয়ে ছোট নয়, যথেষ্ট ছোট, আর দ্রুত।

১৯৮০-এর দশকে IBM আর University of California, Berkeley-র গবেষকেরা (Robert Brayton প্রমুখ) Espresso নামে একটি heuristic পদ্ধতি তৈরি করেন বলে জানা যায়। Espresso সব prime implicant তালিকা করে না। এটি একটি cover দিয়ে শুরু করে, আর বারবার তিনটি কাজ করে: প্রতিটি পদকে যতটা সম্ভব বড় করা (prime-এর দিকে), অপ্রয়োজনীয় পদ বাদ দেওয়া (B′D′-এর মতো), আর পদগুলোকে ছোট করে নতুনভাবে বড় করার জায়গা তৈরি করা। ফল সাধারণত খুব কাছাকাছি-সর্বোত্তম, যদিও নিশ্চয়তা নেই।

দ্বিতীয় পরিবর্তন: আধুনিক নকশা দুই স্তরে থেমে থাকে না। f = xy + xz-কে x(y + z) লিখলে literal কমে, কিন্তু রাশিটি তিন স্তরের। Multi-level logic synthesis সাধারণ উৎপাদক বের করে, gate-এর বিলম্ব (delay) আর chip-এর জায়গা দুটোই হিসাবে রাখে। এখানে “সর্বোত্তম” সংজ্ঞাও একাধিক মাপের মিশ্রণ।

তৃতীয় হাতিয়ার হলো সঠিকতা যাচাই। নকশা যত পরিবর্তনই হোক, শেষ circuit মূল নির্দেশের সমান কি না তা নিশ্চিত করতে হয়। এর জন্য Binary Decision Diagram আর SAT solver ব্যবহার হয়: “দুটি circuit-এর XOR কি কোনো ইনপুটে 1?” একটি SAT প্রশ্ন, যার উত্তর “না” হলে দুটি সমান। পর্ব ৭৭-এ এর বিস্তারিত আসবে।

বাজারঘরের ছোট permission নিয়মে Q–M আর brute force যথেষ্ট; কিন্তু নীতিটি একই: সরলীকরণ heuristic হতে পারে, সঠিকতার যাচাই হতে হবে নিখুঁত।

মূল উপলব্ধি: NP-hard সমস্যায় শিল্প সর্বোত্তমের বদলে ভালো heuristic আর multi-level রূপ বেছে নেয়, কিন্তু প্রতিটি ফল মূল function-এর সমান কি না তা যন্ত্রে নিখুঁতভাবে যাচাই করে।

প্র ০৫Monotone function কয়টি আছে, তা গোনা এত কঠিন কেন? Dedekind number আর ২০২৩ সালের হিসাবের গল্প কী?

উপপাদ্য ৫.১ বলে monotone function মানে ¬ ছাড়া লেখা যায় এমন function. n চলকে এদের সংখ্যা M(n)-কে Richard Dedekind-এর নামে Dedekind number বলে, কারণ তিনি ১৮৯৭ সালে প্রশ্নটি তোলেন বলে উল্লেখ করা হয়। প্রথম মানগুলো: 2, 3, 6, 20, 168, 7581, 7828354 (n = 0 থেকে 6). প্রথম পাঁচটি এই পর্বের পেছনের scratch-এ সব function পরীক্ষা করে মেলানো।

গোনা কঠিন কেন? Brute force-এ 22nটি function পরীক্ষা করতে হয়, যা n = 6-এই 1.8 × 1019. আর কোনো সহজ সূত্র জানা নেই। একটি monotone function তার “সর্বনিম্ন 1-বিন্দু”-গুলো দিয়ে চেনা যায়, যারা Bn-এ একটি antichain (পর্ব ৫৬)। তাই M(n) আসলে n-উপাদানের সেটের উপসেটগুলোর antichain-এর সংখ্যা। Sperner-এর উপপাদ্য বলে সবচেয়ে বড় antichain-এর আকার C(n, ⌊n/2⌋), তাই M(n) অন্তত 2C(n, ⌊n/2⌋); এর কাছাকাছি একটি ঊর্ধ্বসীমাও জানা।

সঠিক মান পেতে লেগেছে চতুর গণনা আর বিপুল কম্পিউটার। M(8) ১৯৯১ সালে Doug Wiedemann গণনা করেন বলে উল্লেখ করা হয়। M(9), প্রায় 2.86 × 1041, ২০২৩ সালে দুটি দল স্বাধীনভাবে বের করে বলে জানা যায়: একটি দলে Christian Jäkel, অন্যটিতে Lennart Van Hirtum আর সহকর্মীরা, যাঁরা FPGA-ভিত্তিক বিশেষ হার্ডওয়্যার ব্যবহার করেন। দুই দলের মান মিলে যাওয়াই ছিল ফলের বড় নিশ্চয়তা।

Monotone function circuit-জটিলতায়ও বিশেষ। ১৯৮৫ সালে Alexander Razborov দেখান, শুধু AND আর OR gate দিয়ে (NOT ছাড়া) একটি graph-এ বড় clique আছে কি না বলার circuit superpolynomial আকারের হতেই হবে বলে উল্লেখ করা হয়। সাধারণ circuit-এ এমন ফল পাওয়া যায়নি (প্র ০৩), তাই NOT gate-এর ক্ষমতা আসলে কতটা, তা এখনো রহস্য।

মূল উপলব্ধি: “¬ ছাড়া লেখা যায়” এমন সরল সংজ্ঞার function গোনাও এত কঠিন যে নবম মানটি পেতে ১২৬ বছর আর বিশেষ হার্ডওয়্যার লেগেছে; আর monotone circuit-এ যা প্রমাণ করা যায়, সাধারণ circuit-এ তা এখনো যায় না।

অনুশীলন

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

  1. প্রমাণ: যেকোনো Boolean algebra-য় consensus সূত্র প্রমাণ করুন: xy + x′z + yz = xy + x′z. তারপর তার dual লিখুন।
    1. yz = yz · 1 = yz(x + x′) = xyz + x′yz. — H3, H4, H2, commutative
    2. বাঁ পাশ = xy + x′z + xyz + x′yz = (xy + xy · z) + (x′z + x′z · y). — ধাপ ১, commutative আর associative
    3. Absorption (উপপাদ্য ২.২(গ)): xy + xy · z = xy আর x′z + x′z · y = x′z. তাই বাঁ পাশ = xy + x′z. ∎

    Dual: (x + y)(x′ + z)(y + z) = (x + y)(x′ + z), যা duality নীতিতে বিনা প্রমাণে সত্য। অর্থ: x আর x′-এর দুই পদের “বাকি অংশের গুণফল” yz কখনো নতুন কিছু ঢাকে না। দুটি সূত্রই scratch-এ ৮টি সারিতে মেলানো।

  2. গণনা: (ক) ৪ চলকের কয়টি Boolean function? (খ) ৩ চলকের কয়টি self-dual function (f(x′, y′, z′) = f(x, y, z)′)? (গ) ২ চলকের monotone function-গুলোর তালিকা দিন। (ঘ) Post-এর উপপাদ্য দিয়ে বলুন {→, 0} complete কি না।

    (ক) 216 = 65,536. (খ) ৮টি সারি ৪টি জোড়ায় ভাগ হয়: প্রতিটি সারি আর তার সব বিট উল্টানো সারি (000 আর 111, 001 আর 110, …)। Self-dual মানে জোড়ার একটির মান বাছলে অন্যটি বাঁধা, তাই 24 = 16. (গ) ৬টি: 0, 1, x, y, xy, x + y. (ঘ) x → y = x′ + y কেবল T1-এ আছে (T0-এ নেই কারণ 0 → 0 = 1; monotone নয়, self-dual নয়, affine নয়), আর 0 T1-এর বাইরে। তাই পাঁচ শ্রেণির প্রতিটি থেকে বেরোনো যায়: complete. সরাসরি: x′ = x → 0, আর x + y = x′ → y. চারটিই scratch-এ সব function গুনে মেলানো।

  3. আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে। তারপর যেকোনো Python-এ চালিয়ে মেলান।
    from itertools import product
    f = lambda a, b, c: (a and not b) or (b and c) or (a and c)
    g = lambda a, b, c: (a and not b) or (b and c)
    R = list(product((0, 1), repeat=3))
    print([i for i, r in enumerate(R) if f(*r)])
    print(all(bool(f(*r)) == bool(g(*r)) for r in R))
    print(f(1, 0, 0), f(0, 1, 1), f(0, 0, 1))
    [3, 4, 5, 7]
    True
    True 1 0

    f = ab′ + bc + ac: 1-সারি 011 (bc), 100 আর 101 (ab′), 111 (bc), অর্থাৎ 3, 4, 5, 7. দ্বিতীয় লাইন True, কারণ ac হলো ab′ আর bc-এর consensus পদ (অনুশীলন ১), তাই বাদ দিলেও function বদলায় না। তৃতীয় লাইনে ফাঁদ: Python-এর and/or bool নয়, একটি অপারেন্ড ফেরত দেয়। f(1, 0, 0)-এ 1 and not 0 ফেরত দেয় True; f(0, 1, 1)-এ প্রথম অংশ 0, তারপর 1 and 1 ফেরত দেয় 1; f(0, 0, 1)-এ সব অংশ মিথ্যা, শেষ অপারেন্ড 0. তাই দ্বিতীয় লাইনে bool() লাগানো হয়েছে (CPython 3.14-এ চালিয়ে মেলানো)।

  4. প্রমাণের ভুল ধরুন: দাবি: “Boolean algebra-য় x + y = x + z হলে y = z.” প্রমাণ: “দুই পাশ থেকে x বিয়োগ করুন। ∎” ভুল কোথায়? পাল্টা-উদাহরণ দিন, আর একটি অতিরিক্ত শর্ত যোগ করে সঠিক দাবিটি প্রমাণ করুন।
    • ভুল ধাপ: Boolean algebra-র axiom-এ বিয়োগ বা + -এর বিপরীত (inverse) নেই। x + 1 = 1 = 1 + 0 থেকে 1 = 0 আসত, যা অসম্ভব।
    • পাল্টা-উদাহরণ: {0, 1}-এ x = 1, y = 0, z = 1: x + y = 1 = x + z, অথচ y ≠ z. §৩-এর ব্লকেও শেষ লাইন False.
    • সঠিক দাবি: x + y = x + z আর xy = xz দুটিই হলে y = z. প্রমাণ: y = y + xy (absorption) = y + xz (অনুমান) = (y + x)(y + z) (H2) = (x + z)(y + z) (অনুমান) = z + xy (H2) = z + xz (অনুমান) = z (absorption). ∎ scratch-এ {0, 1}-এর সব ত্রয়ীতে মেলানো।

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

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

ক্রমQuine–McCluskey পদ্ধতিতে minimal SOP বের করার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. Minterm-গুলো বাইনারিতে লিখে 1-এর সংখ্যা অনুযায়ী দলে ভাগ করা
  2. পাশের দলের যে দুটি পদ ঠিক এক বিটে আলাদা, তাদের মিলিয়ে সেখানে '-' বসানো
  3. নতুন পদ নিয়ে একই কাজ, যতক্ষণ কোনো জোড়া মেলে
  4. কখনো না মেশা পদগুলোকে prime implicant হিসেবে তালিকায় তোলা
  5. Prime implicant chart থেকে essential বেছে বাকি minterm সবচেয়ে সস্তায় ঢাকা

৩ চলকের কয়টি আলাদা Boolean function আছে?

  • 8
  • 256
  • 64
  • 512

নিচের কোন connective-সেট functionally complete নয়?

  • {NAND}
  • {¬, ∧}
  • {∧, ∨, 0, 1}
  • {NOR}

4-চলকের K-map-এ সারি AB আর কলাম CD দুটিই 00, 01, 11, 10 ক্রমে। ঘর ABCD = 0000-এর প্রতিবেশী (এক বিটে আলাদা) নয় কোনটি?

  • 0001
  • 0010
  • 1000
  • 0011

একটি সসীম Boolean algebra-র উপাদানের সংখ্যা নিচের কোনটি হতে পারে?

  • 6
  • 8
  • 12
  • 10

একটি Boolean function-এর minimal SOP (সবচেয়ে কম literal) সম্পর্কে কোনটি সবসময় সত্য?

  • এর প্রতিটি পদ একটি prime implicant
  • এতে সব prime implicant থাকে
  • এটি শুধু minterm দিয়ে গঠিত
  • এটি সবসময় অনন্য

x + x′y = x + y একটি সত্য Boolean সূত্র। Duality নীতি অনুযায়ী নিচের কোনটি তার dual, যা তাই সত্য?

  • x′ + xy = x′ + y
  • x(x′ + y) = x + y
  • x(x′ + y) = xy
  • (x + x′y)′ = x′y′ + y

শব্দকোষ

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

মনে রাখুন

  1. গোনা: n চলকের Boolean function 22nটি; প্রতিটি function একটি truth table, আর প্রতিটি k-literal পদ ঘনকের 2n−k কোণের একটি উপ-ঘনক।
  2. Axiom আর duality: Huntington-এর চার জোড়া axiom থেকে idempotent, absorption, অনন্য complement আর De Morgan; প্রতিটি উপপাদ্যের dual-ও সত্য।
  3. গঠন: {0, 1}, P(S), squarefree n-এর Dn সবই Boolean algebra; সসীম Boolean algebra-র আকার 2-এর ঘাত।
  4. Normal form আর completeness: Shannon expansion থেকে canonical SOP ও POS; ¬ ছাড়া ঠিক monotone function, আর Post-এর পাঁচ শ্রেণি completeness ঠিক করে।
  5. Minimization: K-map-এ Gray ক্রম, দল মানে 2-এর ঘাতের আয়তক্ষেত্র; minimal SOP শুধু prime implicant দিয়ে, essential অবশ্যই থাকে, আর cover বাছাই সাধারণভাবে NP-hard.

পরের পর্বে: পর্ব ৭০ “Group — symmetry, cyclic group আর Lagrange-এর উপপাদ্য”: একটি অপারেশন আর চারটি axiom থেকে symmetry-র বীজগণিত, cyclic group-এর generator, আর কেন subgroup-এর আকার পুরো group-এর আকারকে ভাগ করে তার প্রমাণ।

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

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