NP-complete problems are problems in NP that are the hardest problems in NP. A problem X is NP-complete if it is in NP and every problem in NP can be quickly transformed into X using a polynomial time reduction. Reduction is the process of rephrasing an instance of one problem as an instance of another problem, such that solving the new instance provides the solution to the original problem. NP-hard problems are at least as hard as the hardest problems in NP and include all NP-complete problems. A problem is NP-hard if all problems in NP can be reduced to it in polynomial time.