Back to Blog

P vs NP: The Million-Dollar Question in Computer Science

Understanding the P vs NP problem, decision problems, polynomial-time verification, and why resolving this question would reshape cryptography, optimization, and all of engineering.

2025-10-17
Share
Theory of Computationp-vs-npcomplexity-classes

Terminology

Term Definition
Decision problem A problem whose answer is yes or no, e.g. "Is there a path of length $\le k$?"
P (complexity class) The set of decision problems solvable by a deterministic Turing machine in polynomial time $O(n^k)$
NP (complexity class) The set of decision problems where a "yes" answer can be verified in polynomial time given a certificate (witness)
Certificate (witness) A piece of evidence that lets you verify a "yes" answer quickly, e.g. the actual Hamiltonian path itself
Verifier A polynomial-time algorithm that checks whether a given certificate is valid for a "yes" instance
Polynomial time Running time bounded by $O(n^k)$ for some constant $k$; considered "efficient" in complexity theory
Nondeterministic Turing machine A theoretical machine that can "guess" the right answer at each step; NP is the class of problems it solves in polynomial time
Reduction Transforming one problem into another in polynomial time, used to show that one problem is at least as hard as another
co-NP The set of decision problems where a "no" answer can be verified in polynomial time

What & Why

P vs NP is the most important open question in computer science and one of the seven Millennium Prize Problems, carrying a $1 million reward. It asks: if you can quickly verify a solution to a problem, can you also quickly find that solution?

Every problem in P is also in NP (if you can solve it fast, you can certainly verify a solution fast). The question is whether the reverse holds: does NP = P? Most computer scientists believe the answer is no, that there are problems where checking is fundamentally easier than solving. But nobody has proven it.

This matters for real engineering because modern cryptography relies on the assumption that P \ne NP. If someone proved P = NP, every public-key cryptosystem would be breakable in polynomial time. Conversely, proving P \ne NP would give us mathematical certainty that some problems are inherently hard, which is both a limitation and a guarantee.

How It Works

Class P: Efficiently Solvable

A problem is in P if a deterministic algorithm can solve it in time O(n^k) for some constant k. Examples:

  • Sorting: O(n \log n)
  • Shortest path (Dijkstra): O((V + E) \log V)
  • Primality testing (AKS): O(\tilde{n}^6)
  • Maximum matching in bipartite graphs: O(V \cdot E)

Class NP: Efficiently Verifiable

A problem is in NP if, given a "yes" instance and a polynomial-size certificate, a verifier can confirm the answer in polynomial time. The key insight: NP is about verification, not solving.

P vs NP: Solving vs Verifying Solving (P) Find the answer in polynomial time Sorting: O(n log n) Shortest path: O(V+E)log V Primality: polynomial Tractable Verifying (NP) Check a given answer in polynomial time Hamiltonian path: verify O(V) SAT: verify O(n) Clique: verify O(k^2) Solving: exponential? ? P = NP?

Example: Hamiltonian Path

Problem: Given a graph, is there a path that visits every vertex exactly once?

Solving: No known polynomial algorithm. Best known approaches are exponential, around O(2^n \cdot n^2).

Verifying: Given a proposed path, check that it visits every vertex exactly once and each consecutive pair is connected by an edge. This takes O(V) time.

This gap between solving and verifying is the essence of P vs NP.

The Relationship Between P and NP

If P != NP (believed) NP P Sorting, Shortest Path Primality, Matching NP-Complete SAT, TSP, Clique NP-Intermediate? (Factoring?)

What we know for certain: P \subseteq NP. Every problem solvable in polynomial time is also verifiable in polynomial time (just solve it and check). The open question is whether NP \subseteq P.

Complexity Analysis

Problem Class Best Known Solving Time Verification Time
Sorting P $O(n \log n)$ $O(n)$
Shortest path P $O((V+E)\log V)$ $O(V+E)$
SAT (Boolean satisfiability) NP-Complete $O(2^n)$ worst case $O(n)$
Hamiltonian path NP-Complete $O(2^n \cdot n^2)$ $O(V)$
Integer factoring NP (not known NP-Complete) Sub-exponential $O(n^2)$ (multiply factors)

Implementation

ALGORITHM VerifyHamiltonianPath(graph, path)
INPUT: graph: adjacency structure with V vertices, path: sequence of vertices
OUTPUT: TRUE if path is a valid Hamiltonian path
BEGIN
  IF LENGTH(path) != V THEN
    RETURN FALSE
  END IF

  visited <- empty set

  FOR i <- 0 TO LENGTH(path) - 1 DO
    IF path[i] IN visited THEN
      RETURN FALSE
    END IF
    visited <- visited UNION {path[i]}
  END FOR

  FOR i <- 0 TO LENGTH(path) - 2 DO
    IF NOT edge_exists(graph, path[i], path[i+1]) THEN
      RETURN FALSE
    END IF
  END FOR

  RETURN TRUE
END

ALGORITHM VerifySATAssignment(formula, assignment)
INPUT: formula: CNF formula (list of clauses), assignment: truth values for each variable
OUTPUT: TRUE if assignment satisfies all clauses
BEGIN
  FOR EACH clause IN formula DO
    clause_satisfied <- FALSE
    FOR EACH literal IN clause DO
      variable <- |literal|
      value <- assignment[variable]
      IF literal > 0 AND value = TRUE THEN
        clause_satisfied <- TRUE
      ELSE IF literal < 0 AND value = FALSE THEN
        clause_satisfied <- TRUE
      END IF
    END FOR
    IF NOT clause_satisfied THEN
      RETURN FALSE
    END IF
  END FOR
  RETURN TRUE
END

ALGORITHM BruteForceNP(problem, n)
INPUT: problem: an NP decision problem, n: input size
OUTPUT: TRUE if a valid certificate exists
BEGIN
  FOR EACH possible_certificate of size <= polynomial(n) DO
    IF Verify(problem, possible_certificate) THEN
      RETURN TRUE
    END IF
  END FOR
  RETURN FALSE
END

Real-World Applications

  • Cryptography: RSA, Diffie-Hellman, and elliptic curve cryptography all rely on the assumption that certain problems (factoring, discrete log) are not in P; if P = NP, all public-key crypto breaks
  • Optimization: scheduling, routing, and resource allocation problems are often NP-hard; engineers use heuristics and approximation algorithms because exact solutions are intractable
  • Compiler optimization: register allocation is NP-complete (it reduces to graph coloring), so compilers use heuristic approaches rather than optimal solutions
  • Protein folding: predicting the 3D structure of a protein from its amino acid sequence is believed to be NP-hard, motivating approximate methods like AlphaFold
  • Circuit design: VLSI layout optimization involves NP-hard placement and routing problems, solved with simulated annealing and genetic algorithms

Key Takeaways

  • P is the class of problems solvable in polynomial time; NP is the class of problems verifiable in polynomial time
  • P $\subseteq$ NP is known; whether P = NP is the open question worth $1 million
  • Most experts believe P $\ne$ NP, meaning some problems are fundamentally harder to solve than to verify
  • Modern cryptography depends on P $\ne$ NP; if they were equal, secure encryption as we know it would collapse
  • When you encounter an NP problem in practice, you reach for approximation algorithms, heuristics, or special-case solvers rather than exact exponential-time solutions