Source: https://www.eecs.yorku.ca/~mbrown/Brown_Tutorial.pdf