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")