Source: https://www.lacl.fr/~pvanier/cours/2012-2013/algoavancee/devoir2/devoir2.pdf