Teaching
Over the last few years, I've been incorporating Jupyter notebooks as a component of the courses I teach. Here are some of those notebooks, along with other materials that I've made for teaching these courses.
Calculus for the life sciences
These notebooks were designed as a practical companion to a first course in calculus.
The first two notebooks give students a brief introduction to both using Python and displaying
graphs using the matplotlib package. The final two notebooks walk students through analyzing
Newton's method for approximating zeros and to performing a logistic regression on synthetic data.
Cryptography/Number Theory
Cryptography (and number theory too, by association) fundamentally relies on a notion of computational complexity that is difficult to intuit from pen-and-paper calculations alone. These notebooks are designed to give students a tangible understanding of computational complexity by working through the example of integer division and primality testing. Simultaneously, these notebooks provide computational tools for students to use in their work throughout the remainder of their course.
Combinatorics
In the spring quarter of 2026, I taught a course on combinatorics using Richard Stanley's wonderful text Algebraic Combinatorics. A major component of the course was counting certain structures related to graphs, for example, walks. This notebook formed the basis of an exploratory lecture on a theorem of Pólya on random walks in integer lattices (colloquially, "A wandering being in a lattice of dimension 1 or 2 will eventually return to where it starts, but a being that wanders in a lattice of dimension 3 or more will probably be lost forever").