Course Overview

Introduction to theoretical computer science including formal languages, automata theory, Turing machines, computability and, most importantly, complexity classes.

The material for this class is stable and does not change much from year to year, although the lectures do change sometimes quite drastically depending on the cohort. Moreover the material is standard and taught in practically every peer university. Consequently many sources of practice material and lecture notes are available

 

The course concerns formal models of automation, and a rigorous, abstract way of thinking about computational problems, algorithms, computability, and complexity classes of computational problems and the limits of such classes. These abstractions are essential for a full-fledged computer scientist to adapt to emerging models of computation as they evolve and understand their limits. Key concepts and tools from theoretical computer science will aid the student to think about entire classes of computational problems, their alternate equivalent characterizations and closure properties, containment relationships between classes, representative computational problems in a class, reductions between problems in a class, and develop competence in wielding these concepts and tools toward the classification of computational problems into complexity classes.

(1) If you have not had any proof-based mathematics classes (i.e. a class where all class communications, HW problems, exams etc. are entirely based on mathematical proofs, where you would have encountered more than a hundred proofs during the semester), then you are almost certainly NOT ready for this class. You should strongly reconsider. Unfortunately, the "official" pre-requisites for this class, namely Discrete Mathematics and Data structures/Algorithms are very rarely taught in this manner currently.

(2) On the other hand, even without the above official prerequisite, if you have had a proof-based class in the Mathematics department OR one of the few proof-based classes in the CISE dept. e.g. CIS4930 Design and Analysis of Algorithms OR COP4533 Algorithms Abstraction and Design, you are probably ready, but it will still require a solid 12 hours per week, including contact hours, on a regular basis since the course proceeds at a rapid pace through different conceptual paradigms and ways of thinking.

If you liked the argument about why no computer can solve certain problems in finite time, such as the halting problem and various tiling problems, then this course could be of interest to you.

The course is about acquiring a way of thinking, based on computation, complexity, information and randomness: the course will cover fundamental questions about the nature of automation, models of computation, computability, and how to classify problems by their computational complexity, simply by looking at their formal description. The answers to these questions form the very foundations of computer science, from programming language principles, to algorithm design. Furthermore, the study of complexity and information is increasingly recognized as a fundamental area of Mathematics and is a key ingredient in the study of chaotic and self-organizing phenomena in Physics and the Natural sciences. See Grad school catalog for a the catalog description of course.