Source: https://www.cs.bu.edu/~reyzin/teaching/cryptonotes/notes-9.pdf