Computational Complexity Based on Turing Machines
Among the problems that can be solved in principle by Turing machines, there exists a problem that requires one to run a modern supercomputer, say, for the life time of the earth. This fact naturally leads us to classify real-world problems into two types: tractable problems, which can be computed in a feasible amount of time, and intractable problems, which cannot be computed in a feasible amount of time. In order to classify problems we employ a Turing machine as a computational model, because it turns out that the time required to run a typical computer is somehow related to that required to run an equivalent Turing machine. First, we introduce a way of measuring the time required to compute problems. The class of tractable problems, denoted by P, consists of problems that can be computed in polynomial time on a Turing machine in terms of the measure. On the other hand, we often encounter in practice a problem that can be solved somehow by checking all the possible certificates for the problem instance. Finally, we introduce the other type of problems such that, once an appropriate certificate is given, checking the validity can be done in polynomial time. The class of this type of problems is denoted by NP, which includes P by definition.