Computability theory emerged in the 1930’s from the need to understand what exactly one means by “algorithm”. Many problems in mathematics can be solved by a person following a set of rules, assuming they have an unlimited amount of time and scratch paper. For example, a person can divide polynomials or determine if a number is prime. Mathematicians have long had an intuitive understanding of what constitutes a valid set of computational rules, i.e., an algorithm. However, to prove that an algorithm cannot solve something, it is needed to formalize that intuition. This problem was addressed by the work of Gödel, Church, and Turing, who took different approaches, yet all managed to identify the same class of “computable functions”. (This class captures what can be solved by a programable computer, even though it would be 10 years before the first computer was built.) This early work showed that there are specific problems in elementary number theory that do not have computable solutions. Since then, non-computable problems have been identified in many different subfields of mathematics. Most famously, the solution sets to some Diophantine equations and the word problem for some finitely presented groups are not computable. In computability theory, the goal is not only to show which problems are solvable by an algorithm, but also to study the relative algorithmic complexity of such non-computable problems, which is often connected to the complexity of those problems as measured