Source: https://lavau.pagesperso-orange.fr/psipc14/algo2.pdf