Lectures: 2 sessions / week, 1.5 hours / session
Recitations: 1 session / week, 1 hour / session
This course provides a challenging introduction to some of the central ideas of theoretical computer science. It attempts to present a vision of "computer science beyond computers": that is, CS as a set of mathematical tools for understanding complex systems such as universes and minds. Beginning in antiquity, with Euclid's algorithm and other ancient examples of computational thinking, the course will progress rapidly through finite automata, Turing machines and computability, decision trees and other concrete computational models, efficient algorithms and reducibility, NP-completeness, the P versus NP problem, the power of randomness, cryptography and one-way functions, computational learning theory, interactive proofs, and quantum computing and the physical limits of computation. Class participation is important, as the class will include discussion and debate about many of these topics.
We assume that you have taken 6.042 Mathematics for Computer Science, or have equivalent mathematical preparation. In particular, we will assume you have basic "mathematical maturity": i.e., that you are comfortable both reading and writing mathematical proofs.
There is no required textbook for the course. However, there are three recommended books:
Arora, Sanjeev, and Boaz Barak. Computational Complexity: A Modern Approach. Cambridge University Press, 2009. ISBN: 9780521424264. Covers most material from the second half (as well as more advanced material that won't be covered in this course).
There will be 6-7 problem sets, which will generally be due a week and a half after being assigned. Late problem sets will receive half credit, except in special circumstances such as illness or family emergency.
Problem set problems will often ask you to prove theorems, but we're looking for clarity of understanding rather than "rigor for rigor's sake." So for example, a brief verbal description of an algorithm is better than complicated spaghetti code; and a clear explanation of how you tried to solve a problem and failed will earn partial credit, while obvious nonsense won't!
You are welcome to collaborate on problem sets, provided that (1) you write up your solutions individually, and (2) you list the names of all collaborators.
Students taking 6.045 will be graded on the following basis: