Source: https://laure.gonnord.org/pro/teaching/AlgoProg1213_IMA/Projet_PS_IMA3_2012.pdf