let gcd_poly =
let rec
f = function
p1, p2 -> (* not (is_null_poly (p1) & is_null_poly (p2)) *)
let
(q, r) = euclid_div_poly (p1, p2)
in
if is_null_poly (r)
then (* p2 est un pgcd de p1 et de p2 *)
let
a = div_rat (cons_rat ("1", "1"), leading_coef (p2))
in
rat_times_poly (a, p2)
else f (p2, r)
in
function
p1, p2 -> if not (is_null_poly (p1) & is_null_poly (p2))
then f (p1, p2)
else failwith ("gcd_poly : requires non-null polynomials as its arguments")