Source: https://www.cs.york.ac.uk/plasma/publications/pdf/Courtehoute-Plump.GCM.20.pdf