I teach courses in all aspects of quantum computing and theoretical computer science. Below is a list of some of the courses I have offered in the past. If you are interested in a particular course, some topic within quantum computing or theory, or research project such as CPSC 502/503, CPSC 599 or PHAS 598/599, I would be most pleased to meet with you in person and we can chat further.

- CPSC 519/619
- Quantum computing
- This is the introductionary course to quantum computing. It introduces the fundamental theory and practice of quantum algorithms and quantum computing.
- CPSC 511/611
- Complexity theory
- This course builds on CPSC 313 and CPSC 413, and it gives the fundamental theory of different computational models and resources such as time, space, randomization, non-determinism, quantum mechanics, circuits, communication complexity, and oracles.
- CPSC 413
- Design and analysis of algorithms I
- This is the primary course on algorithms. It discusses how to design algorithms for computational problems, analyze algorithms, and compare computational problems. A key concept is the notion of recursion.
- CPSC 313
- Introduction to computability
- This is the introductionary course to theoretical computer science. It introduces regular expressions, languages, Turing Machines, and the famous Halting Problem.
- MATH 271
- Discrete mathematics
- Discrete mathematics is an essential toolbox for computer science. It allows us to talk about concepts such as graphs, binomials, induction, and probabilities.
- 600-level
- Machine learning theory
- This course introduces analytical tools for understanding, developing, and choosing machine learning algorithms. It discusses the foundation for many approaches to machine learning.
- 600-level
- Topics in quantum computing
- This course discusses advanced algorithmic and computational techniques in quantum computing. It discusses the development of algorithms, mathematical techniques, lower bounds, and research problems in quantum computing.
- 600-level
- Matroids theory and optimization
- This course introduces some graph theory and the theory of matroids. It discusses when and why optimization techniques like greedy algorithms work, and it introduces the fundamental idea of duality which is used in e.g. max-flow min-cut and Euclid's GCD algorithm.
- 600-level
- Boolean functions
- Satisfiability, 3-SAT, quantum complexity theory, machine learning, error correcting codes, circuit complexity, communication complexity, and the PCP theorem are examples of applications of boolean functions. This course gives the foundation for analyzing and understanding such functions.