Source: http://www-igm.univ-mlv.fr/~nicaud/poly/PolyMPI1_2.pdf