Lectures: 2 sessions / week, 1.5 hours / 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 propositional logic, Turing machines and computability, finite automata, Gödel's theorems, efficient algorithms and reducibility, NP-completeness, the P versus NP problem, decision trees and other concrete computational models, the power of randomness, cryptography and one-way functions, computational theories of learning, interactive proofs, and quantum computing and the physical limits of computation. Class participation is essential, as the class will include discussion and debate about the implications of many of these ideas.
Professor Aaronson's teaching statement: (PDF)
Students taking 6.080 will be graded on the following basis:
Students taking 6.089 will be graded on the following basis:
The only differences are that 6.089 includes a scribe notes requirement whereas 6.080 does not, and that 6.089 is 12-unit whereas 6.080 is 9-unit. Students should be aware that scribe notes are a nontrivial responsibility (basically a small project), requiring maturity and strong command of the material. Thus, the "default recommendation" is for underclassmen to take 6.080 and for upperclassmen to take 6.089.
While the course will not closely follow any textbook, we will sometimes use Complexity Theory: A Modern Approach by Sanjeev Arora and Boaz Barak. A draft of this new book is available for free on the Web, and a printed version will be distributed in class. In addition, the following is highly recommended, though not required:
Each student taking 6.089 is expected to prepare two scribe notes. A draft of the scribe notes will be due at midnight, one week after the class is given. Notes must be done in LaTeX; a template will be made available. Please email your draft to the TA, and set up a meeting to discuss them. A polished draft, on which you will be graded, is expected by the end of the course.
Students are welcome to collaborate on problem sets. However, if they do so, they must list the names of collaborators. Collaboration policy for scribe notes will depend on class enrollment.
This course is designed for undergraduates (both under- and upperclassmen) in computer science and related areas of science and engineering. Others are welcome to take the course but might wish to discuss with the instructor. There are no formal prerequisites. The only prerequisite is some facility with mathematical reasoning: that is, the ability to construct valid mathematical arguments (including proofs by contradiction, induction, etc.) and to recognize errors in invalid ones. Such facility might be gained, for example, by taking 6.042. Programming experience is helpful but not essential; the course has no programming assignments.
There is significant overlap between 6.080 and 6.045 (Automata, Computability, and Complexity). The main difference is that 6.080 is an experimental course, which presents many ideas normally postponed until graduate courses, whereas 6.045 provides a more traditional introduction to computability, formal languages, and complexity theory. Students who seek a solid grounding in formal languages, suitable for further work in compilers and other areas, are advised to take 6.045, whereas those wishing to learn about recent insights in theoretical computer science might prefer 6.080. There is also significant overlap between 6.080 and 6.840 (Theory of Computation). However, as a graduate course, 6.840 is able to cover topics in much more mathematical depth. It is hoped that many students taking 6.080 will go on to take 6.840. The overlap between 6.080 and 6.006 (Introduction to Algorithms), or between 6.080 and 6.046 (Design and Analysis of Algorithms), is smaller.
The course will consist of three units, lasting approximately one month each. These are:
At the end of the first unit, there will be a quiz focusing on that unit only, and similarly at the end of the second unit. At the end of the third unit there will be a cumulative final exam.
Ancient computational thinking (Euclid et al.)
Propositional and first-order logic
Turing machines and the halting problem
Oracles and computability
Basic set theory
Gödel's completeness and incompleteness theorems
Philosophical considerations (Penrose and "strong AI")
Polynomial time and its justification
Nontrivial examples of polynomial-time algorithms
The concept of a reduction
P, NP, and NP-completeness; the Cook-Levin Theorem
The P versus NP problem and why it's hard
Decision trees and circuits
The power of probabilistic algorithms
Private-key cryptography and one-way functions
Public-key cryptography and trapdoor functions
Pseudorandom number generators
Does randomness really help? The P versus BPP question
Computational learning theory
The ultimate physical limits of computation