Ideally, students will have taken introductory courses in discrete mathematics and gained some familiarity with fundamental topics in computing such as computer architecture and programming. The first year undergraduate course Foundations of Computer Science provides a suitable background for this unit.