Complexity Theory Lecture Notes October 27, 2016 Prof. Dr. Roland Meyer TU Braunschweig Winter Term 2016/2017 Preface These are the lecture notes accompanying the course Complexity Theory taught at TU Braunschweig. As of October 27, 2016, the notes cover 11 out of 28 lectures. The handwritten notes on the missing lectures can be found at http://concurrency.cs.uni-kl.de. The present document is work in progress and comes with neither a guarantee of completeness wrt. the con- tent of the classes nor a guarantee of correctness. In case you spot a bug, please send a mail to
[email protected]. Peter Chini, Judith Stengel, Sebastian Muskalla, and Prakash Saivasan helped turning initial handwritten notes into LATEX, provided valuable feed- back, and came up with interesting exercises. I am grateful for their help! Enjoy the study! Roland Meyer i Introduction Complexity Theory has two main goals: • Study computational models and programming constructs in order to understand their power and limitations. • Study computational problems and their inherent complexity. Com- plexity usually means time and space requirements (on a particular model). It can also be defined by other measurements, like random- ness, number of alternations, or circuit size. Interestingly, an impor- tant observation of computational complexity is that the precise model is not important. The classes of problems are robust against changes in the model. Background: • The theory of computability goes back to Presburger, G¨odel,Church, Turing, Post, Kleene (first half of the 20th century). It gives us methods to decide whether a problem can be computed (de- cided by a machine) at all.