https://courses.grainger.illinois.edu/cs598cto/sp2022/Files/QCLec.pdf