Computability theory asks which functions on natural numbers can be computed by any algorithm whatsoever, and its founding result is that the halting problem is undecidable, meaning that no program can always determine whether another program halts. Turing's paper of 1936 defined the modern notion of computation through a machine operating on a tape, a model against which Church's lambda calculus and the number theoretic approach of Godel and Herbrand could be compared, and Church's theorem together with Turing's theorem shows that the two models describe exactly the same class of functions. Computable functions can be enumerated, a function is computable exactly when some machine decides the language it indexes, and that correspondence makes decidability of a language precisely equivalent to membership in a computable function. Church's lambda calculus is also the direct ancestor of functional programming, with call by name and call by value as its two evaluation strategies studied by Kleene, Curry, and Scott, and Scott's fixed point combinator making explicit the self application that naive lambda calculus permits and the simply typed calculus forbids. A hierarchy of computable sets exists in which membership at the top level is undecidable, so Turing degree alone does not classify all computable sets, a result due to Post and Kleene, and Friedberg and Muchnik then showed that the undecidable computable sets are countable while the undecidable sets as a whole are uncountable, so most sets are uncomputable. Consequences run through the design of type systems strong enough to verify termination, through verification conditions in code proof, and through complexity classification, where the countability argument implies that there are uncountably many decision problems but only countably many algorithms, so most problems are formally undecidable in principle even when their instances are easy. Diagonalization reappears in the halting theorem, in first order incompleteness, and in the impossibility of enumerating the computable reals in increasing order. Set theory became the foundation of mathematics in the late nineteenth century when paradoxes in naive axiomatization, most famously Russell's, threatened the enterprise. In axiomatic set theory developed by Zermelo and later by Zermelo and Fraenkel with the axiom of choice, sets are built without circularity from the empty set, the pair, the union, the power set, and the infinity axiom, with separation and replacement ensuring that definable subsets and images remain sets. Cantor's theorem, that the power set of a set is strictly larger in cardinality than the set itself, yields the uncountability of the reals and the hierarchy of cardinal numbers, and the continuum hypothesis, asserting that the reals have the cardinality of the first uncountable cardinal, was shown by Godel in 1940 and Cohen in 1963 to be independent of the standard axioms, a landmark establishing that independence is a legitimate mathematical result rather than a failure. The axiom of choice is needed for the well ordering theorem, for Zorn's lemma, and for the assertion that every vector space has a basis, and its weaker forms suffice for most analysis. Set theory descends directly into computing through databases, object oriented type systems, and the encoding of finite sequences as sets of natural numbers, and modern developments include large cardinal hypotheses, forcing, and inner model theory. The lesson for any quantitative field is that axioms are choices with consequences, and independence results explain why certain questions have no answer inside a given system rather than why they are meaningless. The classifications are not merely negative, since natural numbers are computable, the rationals are computable, and the algebraic numbers are computable in the sense that an algorithm can enumerate them exactly, while the real numbers as a whole are not, because a program outputs only finitely many digits per unit of time and therefore cannot be surjective onto uncountably many reals. Turing equivalence of machines, the theory of degrees of unsolvability, and results showing that some problems are reducible to others complete the classification by showing how difficulty is organized rather than merely marking where it begins. The undecidability results have direct engineering consequences, because program equivalence, termination, and the question of whether a specification is satisfiable are undecidable in general, so no tool can verify every program and every property, and practice responds by restricting the fragment on which it will attempt verification or by accepting human review for the rest. Constructive mathematics, which rejects the use of classical logic and insists on supplying an explicit witness for every existence claim, has become a working foundation for theorem provers, where a proof term must be constructed rather than merely shown to exist, and where the connection between a program and the proposition it realizes explains the surprising success of dependent type systems in verified software.