In the realm of computer science and algorithmic complexity, we often encounter problems that require more computational resources than others to solve. Some problems can be solved quickly, while others seem to demand exponentially more time. In this blog post, we will delve into the concepts of P, NP, and NP-Complete, which form the foundation of computational complexity theory. We will also explore the famous P ≠ NP conjecture and its significance in the world of computer science.

###### Decision Problems

Let’s first understand **decision problems**. A decision problem is a specific type of computational problem that can be framed as a question with a yes/no answer. It involves determining whether a given input satisfies a certain property or criterion. The objective of these problems is to decide, or answer, whether the input meets the specified condition. For example:

**Graph Connectivity**: Given a graph, is there a path between vertex A and vertex B?**Prime Number**: Given an integer n, is it a prime number?**Satisfiability**: Given a Boolean formula, is there an assignment of values to variables that makes the formula true?

###### P, NP, and NP-hard Problems

**P** represents the class of “decision problems” that can be solved by a deterministic Turing machine in **polynomial time**. In simpler terms, these are problems for which an efficient solution exists. The worst-case running time for these problems is **O(n ^{k})**, for some constant k.

**Example (P) – Sorting Problem**Sort a list of numbers in ascending order.

** NP **stands

**for**

**and represents decision problems for which a proposed solution can be efficiently verified in polynomial time by a deterministic Turing machine. However, it’s not known whether these problems can be efficiently solved (in polynomial time) or if they require exponential time.**

**Nondeterministic Polynomial time**In other words, if someone claims to have a solution for an NP problem, it can be efficiently checked in polynomial time but finding the solution might not be possible in polynomial time.

**Example (NP) – Subset Sum Problem**Given a set of positive integers and a target sum, determine if there exists a subset of the given set whose elements sum up to the target sum.

This problem falls into the class of NP problems because verifying a solution is easy and can be done in polynomial time. Given a subset, we can simply add up the elements and check if they sum up to the target. However, finding an actual solution (i.e., finding the subset) may require exploring all possible subsets and summing their elements, which would take exponential time.

The Subset Sum problem is just one example of an NP problem. There are many other problems in various domains, such as the Traveling Salesman Problem, Graph Coloring, and more, that fall into the NP category.

**NP-hard (Nondeterministic Polynomial-hard)** is a class of decision problems that are at least as hard as the hardest problems in NP. These problems may or may not be in NP themselves. Also, **NP-hard** problems need not have a solution that can be quickly verified. Solving an NP-hard problem efficiently would imply the ability to solve all problems in NP efficiently (ie. P = NP).

**Example (NP-hard) – Boolean Satisfiability Problem (SAT)**

Given a Boolean formula in conjunctive normal form (CNF), is there an assignment of truth values (true or false) to the variables in the formula that makes the entire formula true? In other words, you’re given a logical expression composed of variables, logical connectives (AND, OR, NOT), and grouped into clauses, where each clause is a disjunction (OR) of literals (variables or their negations). The question is whether there’s an assignment of truth values to the variables that makes the entire formula evaluate to true.

While SAT is in NP (solutions are easily verifiable), other NP-hard problems like **Halting Problem** may not be in NP.

Generally, problems that are solvable by polynomial-time algorithms are referred to as **“tractable or easy”** problems and problems that cannot be solved by any computer in polynomial-time are referred to as **“hard” **problems.

###### NP-Complete Problems

**NP-Complete** problems are a special subset of **NP-hard** problems that are believed to be the most challenging ones within NP. To be NP-complete, a problem must meet two conditions:

- It is in NP, meaning that solutions can be verified in polynomial time.
- It is NP-hard, meaning that it is at least as hard as the hardest problems in NP.

They have the property that if any NP-Complete problem can be solved in polynomial time, then all NP problems can also be solved in polynomial time also known as **P = NP conjecture**.

The status of NP-Complete problems is considered to be “**Unknown**”. No polynomial-time algorithm has yet been discovered for an NP-complete problem, nor has anyone yet been able to prove that no polynomial-time algorithm can exist for any one of them.

**Example (NP-complete) – Hamiltonian Cycle**

Hamiltonian-cycle problem: **Hamiltonian path** is a cycle in a graph that visits every vertex exactly once, except for the starting vertex, which is visited again at the end to complete the cycle.

Now, to verify is a given sequence of vertices (v_{1}, v_{2}, v_{3}, … v_{n} ) forms a Hamiltonian cycle, we could check in polynomial time that the sequence contains each of the |V| vertices exactly once and form a cycle. However, no known polynomial time solution exists to check if a graph is a Hamiltonian graph.

###### Is P equal to NP?

This so-called **P ≠ NP** question has been one of the deepest, most perplexing open research problems in theoretical computer science since it was first posed in 1971. This question lies at the heart of computational complexity theory and remains one of the most significant unsolved problems in computer science.

###### P ≠ NP Conjecture

The P ≠ NP conjecture asserts that P and NP are not equal and that there are problems in NP that cannot be solved in polynomial time.

**Implications**

If P ≠ NP is proven true, it would imply that there are inherent limitations to efficient computation and that some problems are inherently hard. On the other hand, if P = NP, it would mean that efficient solutions exist for all problems in NP, revolutionizing many fields of science and technology.

The resolution of the P ≠ NP conjecture has profound implications for cryptography, optimization, artificial intelligence, and the foundations of computer science. It has direct relevance to real-world problems and impacts various fields of research and technology.

Understanding the concepts of **P, NP, and NP-Complete** is crucial for comprehending the boundaries of efficient computation. The P ≠ NP (speculation) has kept researchers captivating and inspiring new ideas.

Remember, the P ≠ NP, represents a tantalizing challenge waiting to be solved, and the resolution will reshape our understanding of computational limits and the possibilities of efficient problem-solving.

Image source: Wikipedia