This section contains documents that could not be made accessible to screen reader software. A "#" symbol is used to denote such documents.

Amazon logo When you click the Amazon logo to the left of any citation and purchase the book (or other media) from, MIT OpenCourseWare will receive up to 10% of this purchase and any other purchases you make during that visit. This will not increase the cost of your purchase. Links provided are to the US Amazon site, but you can also support OCW through Amazon sites in other regions. Learn more.

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:

2/7 Problem sets
2/7 Midterm
2/7 Final exam
1/7 Class participation

Students taking 6.089 will be graded on the following basis:

2/9 Problem sets
2/9 Midterm
2/9 Final exam
1/9 Class participation
2/9 Scribe notes

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:

Amazon logo Sipser, Michael. Introduction to the Theory of Computation. 2nd ed. Boston, MA: Course Technology, 2005. ISBN: 9780534950972.

Scribe Notes

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.

Collaboration Policy

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.

Relation to Other Courses

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:

  • Logic, Math, and Machines
  • Computational Complexity
  • Randomness, Adversaries, and the Physical World

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.


Logic, Math, and Machines

Ancient computational thinking (Euclid et al.)
Propositional and first-order logic
Finite automata
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")

Computational Complexity

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

Randomness, Adversaries, and the Physical World

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
Interactive proofs
Zero-knowledge proofs
Computational learning theory
Quantum computing
The ultimate physical limits of computation