Source: https://eric.univ-lyon2.fr/jdarmont/docs/m1hn-algo-prog-doc.pdf