Computational complexity theory provides a framework for understanding
the cost of solving computational problems, as measured by the
requirement for resources such as time and space. The objects of study
are algorithms defined within a formal model of computation. Upper
bounds on the computational complexity of a problem are usually derived
by constructing and analyzing specific algorithms. Meaningful lower
bounds on computational complexity are harder to come by, and are not
available for most problems of interest. The dominant approach in
complexity theory is to consider algorithms as oper- ating on finite
strings of symbols from a finite alphabet. Such strings may represent
various discrete objects such as integers or algebraic expressions, but
cannot rep- resent real or complex numbers, unless the numbers are
rounded to approximate values from a discrete set. A major concern of
the theory is the number of com- putation steps required to solve a
problem, as a function of the length of the input string.