Complexity Theory is concerned with the study of the intrinsic difficulty of computational tasks. This study tend to aim at generality:It focuses on natural computational resources, and the effect of limiting those on the class of problems that can be solved. The (half-century) history of Complexity Theory has witnessed two main research efforts (or directions). The first direction is aimed towards actually establishing concrete lower bounds on the complexity of problems, via an analysis of the evolution of the process of computation.
Thus, in a sense, the heart of this direction is a "low-level'' analysis of computation. Most research in circuit complexity and in proof complexity falls within this category. In contrast, a second research effort is aimed at exploring the connections among computational problems and notions, without being able to provide absolute statements regarding the individual problems or notions. This effort may be viewed as a "high-level'' study of computation, and the course will be confined to it. Specific topics will include:
- revisiting the P-vs-NP Question and NP-Completeness;
- separation results for time and space complexity;
- non-uniform complexity (e.g., P/poly);
- the Polynomial-time Hierarchy;
- the class #P and approximate-#P;
- randomized computations (RP and BPP);
- hardness amplification;
- pseudorandomness (generators and derandomization);
- probabilistic proof systesms (IP, PCP etc);