This course is about the part of theoretical computer science that
studies the *limits* of what can be done with computing machines.

The
course is divided into three parts, corresponding three ways of modeling
computations. In the first part we consider the model of *finite state
automata*. This is a very simple model, and it captures only a small set of
algorithms. Its advantage is that it captures algorithms used in parsing and
string matching and it is simple enough that we can understand it inside out. In
the second part we see how all conceivable discrete computing devices can be
simulated by Turing machines, a conceptually simple abstract device, and we
consider the model of Turing machines that always solve the given problem, even
though they can take arbitrary time. This is too powerful a model, in the sense
that there are problems which are intractable in any practical sense but that
can be solved in such a model. Its generality makes it easier to study, and in
fact a lot is known about this model too. Finally, we come to the study of *polynomial
time *computations, a sensible model of the computations that can actually be
realized in practice. Being the most realistic, this is also the most messy
field of study, and our ignorance far outweighs our understanding here. (And
million dollar price awaits the solver of the main open question in this field.)
Meanwhile, complexity theorist have already proved several very beautiful, and
sometimes unexpected, results in the past thirty-five years, and we will see a
few of them.

- Weekly homeworks, 45%
- Two midterms, 15% each
- Final exam, 25 %

CS170 is a prerequisite for this course.

Presenting another person's work as your own constitutes cheating, whether
that person is a friend, a student in this class or a previous
semester's class, or an anonymous person on the Web who happens to have
solved the problem you've been asked to solve. Everything you turn in must
be your own doing, and it is your responsibility to make it clear to the
graders that it really is your own work. The following activities are specifically
forbidden in all graded course work:

- Possession (or theft) of another student's solution or partial solution in any form (electronic, handwritten, or printed).
- Giving a solution or partial solution to another student, even with the explicit understanding that it will not be copied.
- Working together to develop a single solution and then turning in copies (or modified versions) of that solution under multiple names.