Definition egcdGI (x y : GI) :=
if ('N y <= 'N x)%N then
egcdGI_rec ('N x) x y else
let e := egcdGI_rec ('N y) y x in (e.2, e.1).

(* Specifications: *)
Lemma egcdGI_rec0r n x : egcdGI_rec n x 0 = (1, 0).
Lemma egcdGI_recP :
forall n x y,  y != 0 -> ('N y <= n)%N -> ('N y <= 'N x)%N ->
forall (e := egcdGI_rec n x y), gcdGI_rec n x y = e.1 * x + e.2 * y.
Lemma egcdGIP (x y : GI) : gcdGI x y = (egcdGI x y).1 * x + (egcdGI x y).2 * y.
Lemma mulGI_gcdr x y z : x * gcdGI y z %= gcdGI (x * y) (x * z).
Lemma mulGI_gcdl x y z : gcdGI y z * x %= gcdGI (y * x) (z * x).
Section OrdinalGI.