sig
  module type Rat =
    sig
      type q
      val eq : Euclid.Rat.q -> Euclid.Rat.q -> bool
      val ( + ) : Euclid.Rat.q -> Euclid.Rat.q -> Euclid.Rat.q
      val zero : Euclid.Rat.q
      val inv : Euclid.Rat.q -> Euclid.Rat.q
      val ( * ) : Euclid.Rat.q -> Euclid.Rat.q -> Euclid.Rat.q
      val one : Euclid.Rat.q
      val ( / ) : Euclid.Rat.q -> Euclid.Rat.q -> Euclid.Rat.q
      val floor : Euclid.Rat.q -> Euclid.Rat.q
      val is_int : Euclid.Rat.q -> bool
    end
  module type S =
    sig
      type t
      val euclid :
        Euclid.S.t -> Euclid.S.t -> Euclid.S.t * Euclid.S.t * Euclid.S.t
      val solve :
        Euclid.S.t list ->
        Euclid.S.t -> (Euclid.S.t * Euclid.S.t list) option
    end
  module Make :
    functor (R : Rat->
      sig
        type t = R.q
        val euclid :
          Euclid.S.t -> Euclid.S.t -> Euclid.S.t * Euclid.S.t * Euclid.S.t
        val solve :
          Euclid.S.t list ->
          Euclid.S.t -> (Euclid.S.t * Euclid.S.t list) option
      end
end