



Course Description This course provides an undergraduatelevel introduction to the theory of computing. The objective is twofold: first, gaining an understanding of the nature of computation, its capabilities and its limitations, and obtaining the ability to reason rigorously about them; second, acquiring the mathematical foundation for applications of these insights in other areas of computer science. We will cover elements of automata theory and formal languages, computability theory, complexity theory, and cryptography. These topics have applications in algorithm design, programming languages and compiler construction, artificial intelligence, hardware and network protocols, and security. Prerequisites Math 240 (Discrete Mathematics, especially proofs by induction and basic notions of set theory, logic, discrete probability theory, and graph theory), and, CS 367 (Data Structures, especially familiarity with algorithms and their complexity). Text & reference books The main text that we will use is:
The following are some other books you may find useful. All except the last one are on reserve at the Wendt library. The last one is available online (follow the link). Preliminary material: Grading & Evaluation Homework (50%): There will be 5 homeworks, out roughly every other week. The schedule is here. Expect the problems to be challenging so start early. You are allowed to discuss the problems in groups but you should write out the solutions on your own and give credit to your collaborators. No sources other than the course material, the instructor, the TA, and your fellow students in the course are allowed. Exams (50%): There will be one midterm (20%) on Mar 11, and a final (30%) on May 15. Contact
