Source: https://graal.ens-lyon.fr/~abenoit/algo09/poly09.pdf