পাঠ ৪৫ · ৫৬-এর মধ্যে · মডিউল ১০
Home / Courses / Formal Language & Automata Theory / Theory of Computation / পলিনমিয়াল-টাইম রিডাকশন ও NP-কমপ্লিটনেস

পলিনমিয়াল-টাইম রিডাকশন ও NP-কমপ্লিটনেস

Polynomial-time reductions & NP-completeness
৯ মিনিট পড়া উচ্চ · Advanced Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • পলিনমিয়াল-টাইম রিডাকশনের ফরমাল সংজ্ঞা এবং এটি L40-এর রিডাকশনের সাথে কীভাবে সম্পর্কিত
  • NP-হার্ড ও NP-কমপ্লিটের ফরমাল সংজ্ঞা এবং তাদের মধ্যে পার্থক্য
  • NP-কমপ্লিটনেসের কেন্দ্রীয় গুরুত্ব — P-vs-NP প্রশ্নের সাথে সরাসরি সম্পর্ক
  • ইনডিপেন্ডেন্ট সেট ↔ ভার্টেক্স কভার — একটি সত্যিকারের রিডাকশন নির্মাণ ও ব্রুট-ফোর্স যাচাই

১ · পলিনমিয়াল-টাইম রিডাকশন

M9/L40-এ আমরা দেখেছি একটি সমস্যাকে আরেকটি সমস্যায় "রূপান্তর" (রিডিউস) করে আনডিসাইডেবিলিটি প্রমাণ করা যায় — এখানে একই গঠন ব্যবহার করা হবে, কিন্তু একটি গুরুত্বপূর্ণ অতিরিক্ত শর্তসহ। ল্যাঙ্গুয়েজ $A$ পলিনমিয়াল সময়ে ল্যাঙ্গুয়েজ $B$-তে রিডিউস করে ($A \leq_p B$ লেখা হয়) যদি একটি পলিনমিয়াল-সময়ে-গণনাযোগ্য ফাংশন $f$ থাকে, যাতে —

$$w \in A \iff f(w) \in B$$

সরাসরি, গুরুত্বপূর্ণ পরিণতি — যদি $A \leq_p B$ হয় এবং $B \in \mathrm{P}$ হয়, তাহলে $A \in \mathrm{P}$-ও (প্রথমে $f$ দিয়ে $w$-কে রূপান্তর করে, তারপর $B$-এর পলিনমিয়াল অ্যালগরিদম চালিয়ে $A$ সমাধান করা যায় — দুটো পলিনমিয়ালের composition এখনও পলিনমিয়াল, তাই মোট সময়ও পলিনমিয়াল)। এই একটি সাধারণ সত্যই সমস্যাগুলোর আপেক্ষিক কঠিনতা তুলনা করার প্রধান টুল।

২ · NP-হার্ড ও NP-কমপ্লিট

একটি ল্যাঙ্গুয়েজ $B$ NP-হার্ড যদি NP-এর প্রতিটি ল্যাঙ্গুয়েজ $A$-এর জন্য $A \leq_p B$ হয় — অর্থাৎ $B$ "NP-এর প্রতিটি সমস্যার চেয়ে অন্তত ততটাই কঠিন।" গুরুত্বপূর্ণভাবে, $B$ নিজে NP-তে থাকা এখানে বাধ্যতামূলক নয়।

একটি ল্যাঙ্গুয়েজ NP-কমপ্লিট যদি এটি একই সাথে NP-তে এবং NP-হার্ড — এই সংমিশ্রণটিই এই পাঠের কেন্দ্রীয় লক্ষ্য। এর সরাসরি, গুরুত্বপূর্ণ পরিণতি — যদি যেকোনো একটি NP-কমপ্লিট সমস্যা P-তে প্রমাণিত হয়, তাহলে NP-এর প্রতিটি সমস্যাও P-তে হয়ে যাবে (কারণ প্রতিটি NP সমস্যা তাতে রিডিউস করা যায়) — অর্থাৎ $\mathrm{P} = \mathrm{NP}$। ঠিক এই কারণেই NP-কমপ্লিট সমস্যাগুলো P-vs-NP প্রশ্নের (L49) স্বাভাবিক আক্রমণ-বিন্দু — এরা এক অর্থে NP-এর "সবচেয়ে কঠিন" সমস্যা, প্রমাণযোগ্যভাবে।

L40-এর রিডাকশনের সাথে সম্পর্ক

M9/L40-এর কম্পিউটেবিলিটি-রিডাকশন প্রশ্ন করেছিল শুধু "রূপান্তর গণনাযোগ্য কি না।" এখানে কমপ্লেক্সিটি-থিওরি রিডাকশন আরও কড়া শর্ত দেয় — রূপান্তরটি নিজে পলিনমিয়াল সময়ে গণনাযোগ্য হতে হবে, নাহলে "$A \leq_p B$ ও $B \in \mathrm{P}$ হলে $A \in \mathrm{P}$" যুক্তিটি ভেঙে পড়ে — একটি এক্সপোনেনশিয়াল-সময়ের রূপান্তর দিয়ে যেকোনো সমস্যাকেই "রিডিউস" করা যায়, তাই সেই দুর্বল সংজ্ঞা অর্থহীন হয়ে যেত।

৩ · একটি সত্যিকারের রিডাকশন — ইনডিপেন্ডেন্ট সেট ↔ ভার্টেক্স কভার

একটি গ্রাফ $G=(V,E)$-তে ইনডিপেন্ডেন্ট সেটIndependent Setভার্টেক্সের এমন একটি সেট যাদের মধ্যে কোনো দুটি ভার্টেক্সই একটি এজ দিয়ে সংযুক্ত নয় হলো ভার্টেক্সের একটি সেট $S$ যাদের মধ্যে কোনো দুটিই একটি এজ দিয়ে সংযুক্ত নয়। একটি ভার্টেক্স কভারVertex Coverভার্টেক্সের এমন একটি সেট যাতে গ্রাফের প্রতিটি এজের অন্তত একটি প্রান্ত-বিন্দু সেটে থাকে হলো ভার্টেক্সের একটি সেট $C$ যাতে প্রতিটি এজের অন্তত একটি প্রান্ত-বিন্দু $C$-তে থাকে। একটি সুন্দর, প্রমাণযোগ্য সত্য — $S$ একটি ইনডিপেন্ডেন্ট সেট যদি এবং শুধু যদি $V - S$ (এর পরিপূরক) একটি ভার্টেক্স কভার হয়। তাই রিডাকশনটি খুবই সরল — একই গ্রাফ রেখে দিয়ে, "size-$k$ ইনডিপেন্ডেন্ট সেট আছে কি?" প্রশ্নকে "size-$(n-k)$ ভার্টেক্স কভার আছে কি?" প্রশ্নে রূপান্তর করা, যেখানে $n = |V|$।

Python
# ইনডিপেন্ডেন্ট সেট -> ভার্টেক্স কভার: একটি সত্যিকারের পলিনমিয়াল-টাইম রিডাকশন
# (রিডাকশনের ফাংশনটি নিজে O(1) -- শুধু k -> n-k বদলায়, গ্রাফ অপরিবর্তিত থাকে)

import itertools

def has_independent_set(vertices, edges, k):
    # ব্রুট-ফোর্স ডিসাইডার: size-k ইনডিপেন্ডেন্ট সেট আছে কি না
    for subset in itertools.combinations(vertices, k):
        s = set(subset)
        if all(not (u in s and v in s) for (u, v) in edges):
            return True, s
    return False, None

def has_vertex_cover(vertices, edges, k):
    # ব্রুট-ফোর্স ডিসাইডার: size-k ভার্টেক্স কভার আছে কি না
    for subset in itertools.combinations(vertices, k):
        s = set(subset)
        if all(u in s or v in s for (u, v) in edges):
            return True, s
    return False, None

def reduce_independent_set_to_vertex_cover(vertices, edges, k):
    # পলিনমিয়াল-টাইম রিডাকশন f: গ্রাফ অপরিবর্তিত, শুধু টার্গেট size n-k -- O(1)
    n = len(vertices)
    return vertices, edges, n - k

# টেস্ট গ্রাফ: একটি পাঁচ-নোডের path graph 0-1-2-3-4
vertices = [0, 1, 2, 3, 4]
edges = [(0, 1), (1, 2), (2, 3), (3, 4)]
n = len(vertices)

print(f"{'k':>3} | {'independent_set(k) আছে?':>26} | {'vertex_cover(n-k) আছে?':>26} | {'মিলে গেছে?':>10}")
print("-" * 78)
for k in range(0, n + 1):
    is_exists, is_set = has_independent_set(vertices, edges, k)
    v2, e2, target = reduce_independent_set_to_vertex_cover(vertices, edges, k)
    vc_exists, vc_set = has_vertex_cover(v2, e2, target) if target >= 0 else (False, None)
    match = (is_exists == vc_exists)
    print(f"{k:>3} | {str(is_exists):>26} | {str(vc_exists) + f' (size {target})':>26} | {str(match):>10}")
    assert match, "রিডাকশনের দাবি ভঙ্গ হয়েছে!"

print()
print("সব k-এর জন্য independent_set(k) ঠিক ততক্ষণই True যতক্ষণ vertex_cover(n-k) True -- রিডাকশন সঠিক প্রমাণিত।")

    
লক্ষ্য করুন has_independent_set ও has_vertex_cover নিজেরাই ব্রুট-ফোর্স, এক্সপোনেনশিয়াল সময়ের (সব সম্ভাব্য size-k সাবসেট চেষ্টা করে) — এগুলো শুধু যাচাইয়ের জন্য ব্যবহৃত হয়েছে, রিডাকশনটির নিজের সময় নয়। reduce_independent_set_to_vertex_cover ফাংশনটি নিজে $O(1)$ — এটিই আসল রিডাকশন, আর সেটিই পলিনমিয়াল হতে হবে, ডিসাইডারগুলো নয়।
মূল কথা · Key takeaway

পলিনমিয়াল-টাইম রিডাকশন সমস্যাগুলোর কঠিনতা তুলনা করার একটি সুনির্দিষ্ট, গণিতভিত্তিক টুল। NP-হার্ড ও NP-কমপ্লিটের সংজ্ঞা এই টুলের উপরেই দাঁড়িয়ে — এবং NP-কমপ্লিটনেসের কেন্দ্রীয় গুরুত্ব হলো, একটি মাত্র NP-কমপ্লিট সমস্যা সমাধান করলেই (পলিনমিয়াল সময়ে) পুরো NP ক্লাসই P-তে ভেঙে পড়বে। পরের পাঠে (L46) দেখব ইতিহাসের প্রথম প্রমাণিত NP-কমপ্লিট সমস্যা — SAT — এবং কুক-লেভিন থিওরেম।

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

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ "$B$ NP-হার্ড" বলার সময় $B$ নিজে NP-তে থাকতে হবে না কেন? এমন কোনো বাস্তব উদাহরণ ভাবতে পারেন?

NP-হার্ডের সংজ্ঞা শুধু বলে "NP-এর প্রতিটি সমস্যা $B$-তে রিডিউস করা যায়" — এটি $B$-এর নিজস্ব কঠিনতার একটি নিচের সীমা (lower bound) দেয়, কিন্তু $B$ কতটা কঠিন হতে পারে তার কোনো উপরের সীমা রাখে না। তাই এমন সমস্যা থাকতে পারে যেগুলো NP-হার্ড কিন্তু NP-এর চেয়েও কঠিন (যেমন কিছু আনডিসাইডেবল সমস্যাও "NP-হার্ড" হতে পারে, যদি NP-এর প্রতিটি সমস্যা তাতে পলিনমিয়াল-টাইমে রিডিউস করা যায় — এমন সমস্যা নিজে ডিসাইডেবলও না হতে পারে, তাই স্পষ্টতই NP-তে থাকতে পারবে না)।

প্র ০২ উপরের কোড সেলের path graph (0-1-2-3-4)-এ k=3-এর জন্য ইনডিপেন্ডেন্ট সেট {0,2,4} কেন বৈধ, হাতে-কলমে যাচাই করুন।

গ্রাফের এজগুলো হলো (0,1), (1,2), (2,3), (3,4)। সেট {0,2,4}-এর যেকোনো দুই সদস্যের জোড়া — (0,2), (0,4), (2,4) — এদের কোনোটিই উপরের এজ-তালিকায় নেই, তাই সেটের ভেতরে কোনো দুই ভার্টেক্স সরাসরি সংযুক্ত নয় — এটি একটি বৈধ ইনডিপেন্ডেন্ট সেট। আর এর পরিপূরক $V - \{0,2,4\} = \{1,3\}$ — যাচাই করলে দেখা যায় প্রতিটি এজেরই অন্তত একটি প্রান্ত-বিন্দু {1,3}-তে আছে ((0,1)→1, (1,2)→1, (2,3)→3, (3,4)→3) — তাই {1,3} একটি বৈধ, size-2 ভার্টেক্স কভার, ঠিক $n-k = 5-3 = 2$ মিলে যাচ্ছে।

প্র ০৩ যদি কেউ প্রমাণ করে ভার্টেক্স কভার P-তে আছে (একটি পলিনমিয়াল-টাইম অ্যালগরিদম দিয়ে), তাহলে এই পাঠের রিডাকশন ব্যবহার করে ইনডিপেন্ডেন্ট সেট সম্পর্কে কী সিদ্ধান্তে আসা যাবে?

ইনডিপেন্ডেন্ট সেটও P-তে চলে আসবে — কারণ ইনডিপেন্ডেন্ট-সেট-সমস্যাকে ভার্টেক্স-কভার-সমস্যায় পলিনমিয়াল সময়ে রিডিউস করা গেছে ($\text{IndependentSet} \leq_p \text{VertexCover}$), আর "$A \leq_p B$ ও $B \in \mathrm{P}$ হলে $A \in \mathrm{P}$"— এই লেসনের দ্বিতীয় সেকশনের সরাসরি ফলাফল। (বাস্তবে অবশ্য ভার্টেক্স কভার নিজেই NP-কমপ্লিট বলে বিশ্বাস করা হয়, তাই এমন প্রমাণ পাওয়া গেলে সেটি $\mathrm{P} = \mathrm{NP}$-এরও প্রমাণ হয়ে যেত — L45-L46-এর যৌথ পরিণতি।)

অনুশীলন

  1. পরীক্ষা করুন: উপরের কোড সেলে edges-এ একটি নতুন এজ (0,4) যোগ করে (path graph-কে cycle graph-এ পরিণত করে) Run চেপে দেখুন — k=3-এর জন্য কি এখনও একটি ইনডিপেন্ডেন্ট সেট পাওয়া যায়?

    না — (0,4) এজ যোগ হলে {0,2,4} আর বৈধ ইনডিপেন্ডেন্ট সেট থাকে না, কারণ 0 ও 4 এখন সরাসরি সংযুক্ত। এই 5-node cycle graph-এর সর্বোচ্চ ইনডিপেন্ডেন্ট সেটের আকার ২ (যেমন {0,2})। তাই k=3-এর জন্য has_independent_set এখন False ফেরত দেবে — এবং রিডাকশন অনুযায়ী, has_vertex_cover-ও size n-k=2-এর জন্য False ফেরত দেওয়ার কথা (এই cycle graph-এর ন্যূনতম ভার্টেক্স কভার আসলে size ৩)। দুটোই একসাথে মিলে যাওয়া উচিত, কোডে চালিয়ে যাচাই করুন।

  2. চিন্তা করুন: এই রিডাকশনটি $O(1)$ সময়ে চলে (শুধু $k$-কে $n-k$-এ বদলায়)। এত সরল একটি রিডাকশন কি তাহলে "তুচ্ছ" (trivial), নাকি এখনও একটি গুরুত্বপূর্ণ NP-কমপ্লিটনেস-প্রমাণের টুল হিসেবে গণ্য?

    সরল হলেও এটি সম্পূর্ণ বৈধ ও গুরুত্বপূর্ণ — NP-কমপ্লিটনেস প্রমাণের জন্য রিডাকশনটি কতটা জটিল, সেটি গুরুত্বপূর্ণ নয়; গুরুত্বপূর্ণ হলো এটি সত্যিই পলিনমিয়াল সময়ে গণনাযোগ্য কি না, আর দাবিকৃত if-and-only-if সম্পর্কটি সত্যিই সঠিক কি না (উভয়ই এই পাঠে যাচাই করা হয়েছে)। প্রকৃতপক্ষে, ইনডিপেন্ডেন্ট সেট ও ভার্টেক্স কভারের মধ্যে এই সরলতাই এদের একটি বিখ্যাত, ঘনিষ্ঠভাবে-সম্পর্কিত জোড়া বানিয়েছে — L47-এ ক্লিকও এই একই পরিবারে যুক্ত হবে।

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

আগের পাঠ
L44 · ক্লাস NP ও ভেরিফায়ার