In your journey through computation, you likely have noticed that many problems can be solved with the same solution through a skill you have honed called abstraction. Through this process, you may have noticed more nuanced connections between problems. Some problems require some translation before being solved using the solution to another problem. Some problems are immune this sort of transformation and feel fundamentally more difficult than others. Some problems feel downright impossible: are they actually impossible?
In this course, we study the theory of computation where we use mathematics to model problems of increasing complexity and study their relationships with each other. Although some applications may be discussed from time to time, this course will emphasize the formal underpinnings and theory of computer science. By going through this modeling process, we can: