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 pleased to meet with you in person and we can chat further.

### Quantum computing courses

My main area is quantum computing. There are two main courses on quantum computing, both taught by me.

- 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.
- 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. It is a continuation of CPSC 519/619. The course assumes you have completed CPSC 519/619.

### Other courses

Here is a selection of other courses I have taught in the past. In some of these courses we have covered some connections to quantum computing if and when the enrolled students have requested it. CPSC 511/611 and the topic of Boolean functions have many overlaps with quantum computing.

- 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 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 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
- 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.