ferguson-forcade algorithm