sig
  module type S =
    sig
      module Coeff : Scalar.S
      type t
      val of_list : (Monomial.t * Coeff.t) list -> Polynomial.S.t
      val to_list : Polynomial.S.t -> (Monomial.t * Coeff.t) list
      val zero : Polynomial.S.t
      val one : Polynomial.S.t
      val var : ?c:Coeff.t -> ?d:int -> int -> Polynomial.S.t
      val const : Coeff.t -> Polynomial.S.t
      val monomial : Monomial.t -> Polynomial.S.t
      val mult_scalar : Coeff.t -> Polynomial.S.t -> Polynomial.S.t
      val add : Polynomial.S.t -> Polynomial.S.t -> Polynomial.S.t
      val sub : Polynomial.S.t -> Polynomial.S.t -> Polynomial.S.t
      val mult : Polynomial.S.t -> Polynomial.S.t -> Polynomial.S.t
      val power : Polynomial.S.t -> int -> Polynomial.S.t
      exception Dimension_error
      val compose : Polynomial.S.t -> Polynomial.S.t list -> Polynomial.S.t
      val derive : Polynomial.S.t -> int -> Polynomial.S.t
      val eval : Polynomial.S.t -> Coeff.t list -> Coeff.t
      val compare : Polynomial.S.t -> Polynomial.S.t -> int
      val nb_vars : Polynomial.S.t -> int
      val degree : Polynomial.S.t -> int
      val degree_list : Polynomial.S.t -> int list
      val is_homogeneous : Polynomial.S.t -> bool
      val is_var : Polynomial.S.t -> (Coeff.t * int * int) option
      val is_const : Polynomial.S.t -> Coeff.t option
      val is_monomial : Polynomial.S.t -> Monomial.t option
      val ( ?? ) : int -> Polynomial.S.t
      val ( ! ) : Coeff.t -> Polynomial.S.t
      val ( *. ) : Coeff.t -> Polynomial.S.t -> Polynomial.S.t
      val ( ~- ) : Polynomial.S.t -> Polynomial.S.t
      val ( + ) : Polynomial.S.t -> Polynomial.S.t -> Polynomial.S.t
      val ( - ) : Polynomial.S.t -> Polynomial.S.t -> Polynomial.S.t
      val ( * ) : Polynomial.S.t -> Polynomial.S.t -> Polynomial.S.t
      val ( / ) : Polynomial.S.t -> Coeff.t -> Polynomial.S.t
      val ( /. ) : Coeff.t -> Coeff.t -> Polynomial.S.t
      val ( ** ) : Polynomial.S.t -> int -> Polynomial.S.t
      val pp : Stdlib.Format.formatter -> Polynomial.S.t -> unit
      val pp_names :
        string list -> Stdlib.Format.formatter -> Polynomial.S.t -> unit
      val merge :
        (Monomial.t -> Coeff.t option -> Coeff.t option -> Coeff.t option) ->
        Polynomial.S.t -> Polynomial.S.t -> Polynomial.S.t
      val fold :
        (Monomial.t -> Coeff.t -> '-> 'a) -> Polynomial.S.t -> '-> 'a
    end
  module Make :
    functor (SC : Scalar.S->
      sig
        module Coeff :
          sig
            type t = SC.t
            val compare : t -> t -> int
            val zero : t
            val one : t
            val of_float : float -> t
            val to_float : t -> float
            val of_q : Q.t -> t
            val to_q : t -> Q.t
            val add : t -> t -> t
            val sub : t -> t -> t
            val mult : t -> t -> t
            val div : t -> t -> t
            val pp : Format.formatter -> t -> unit
            val minus_one : t
            val of_int : int -> t
            val neg : t -> t
            val inv : t -> t
            val equal : t -> t -> bool
            val leq : t -> t -> bool
            val geq : t -> t -> bool
            val lt : t -> t -> bool
            val gt : t -> t -> bool
            val sign : t -> int
            val ( ~- ) : t -> t
            val ( + ) : t -> t -> t
            val ( - ) : t -> t -> t
            val ( * ) : t -> t -> t
            val ( / ) : t -> t -> t
            val ( = ) : t -> t -> bool
            val ( <> ) : t -> t -> bool
            val ( <= ) : t -> t -> bool
            val ( >= ) : t -> t -> bool
            val ( < ) : t -> t -> bool
            val ( > ) : t -> t -> bool
          end
        type t
        val of_list : (Monomial.t * Coeff.t) list -> t
        val to_list : t -> (Monomial.t * Coeff.t) list
        val zero : t
        val one : t
        val var : ?c:Coeff.t -> ?d:int -> int -> t
        val const : Coeff.t -> t
        val monomial : Monomial.t -> t
        val mult_scalar : Coeff.t -> t -> t
        val add : t -> t -> t
        val sub : t -> t -> t
        val mult : t -> t -> t
        val power : t -> int -> t
        exception Dimension_error
        val compose : t -> t list -> t
        val derive : t -> int -> t
        val eval : t -> Coeff.t list -> Coeff.t
        val compare : t -> t -> int
        val nb_vars : t -> int
        val degree : t -> int
        val degree_list : t -> int list
        val is_homogeneous : t -> bool
        val is_var : t -> (Coeff.t * int * int) option
        val is_const : t -> Coeff.t option
        val is_monomial : t -> Monomial.t option
        val ( ?? ) : int -> t
        val ( ! ) : Coeff.t -> t
        val ( *. ) : Coeff.t -> t -> t
        val ( ~- ) : t -> t
        val ( + ) : t -> t -> t
        val ( - ) : t -> t -> t
        val ( * ) : t -> t -> t
        val ( / ) : t -> Coeff.t -> t
        val ( /. ) : Coeff.t -> Coeff.t -> t
        val ( ** ) : t -> int -> t
        val pp : Format.formatter -> t -> unit
        val pp_names : string list -> Format.formatter -> t -> unit
        val merge :
          (Monomial.t -> Coeff.t option -> Coeff.t option -> Coeff.t option) ->
          t -> t -> t
        val fold : (Monomial.t -> Coeff.t -> '-> 'a) -> t -> '-> 'a
      end
  module Q :
    sig
      module Coeff :
        sig
          type t = Q.t
          val compare : t -> t -> int
          val zero : t
          val one : t
          val of_float : float -> t
          val to_float : t -> float
          val of_q : Q.t -> t
          val to_q : t -> Q.t
          val add : t -> t -> t
          val sub : t -> t -> t
          val mult : t -> t -> t
          val div : t -> t -> t
          val pp : Format.formatter -> t -> unit
          val minus_one : t
          val of_int : int -> t
          val neg : t -> t
          val inv : t -> t
          val equal : t -> t -> bool
          val leq : t -> t -> bool
          val geq : t -> t -> bool
          val lt : t -> t -> bool
          val gt : t -> t -> bool
          val sign : t -> int
          val ( ~- ) : t -> t
          val ( + ) : t -> t -> t
          val ( - ) : t -> t -> t
          val ( * ) : t -> t -> t
          val ( / ) : t -> t -> t
          val ( = ) : t -> t -> bool
          val ( <> ) : t -> t -> bool
          val ( <= ) : t -> t -> bool
          val ( >= ) : t -> t -> bool
          val ( < ) : t -> t -> bool
          val ( > ) : t -> t -> bool
        end
      type t
      val of_list : (Monomial.t * Coeff.t) list -> t
      val to_list : t -> (Monomial.t * Coeff.t) list
      val zero : t
      val one : t
      val var : ?c:Coeff.t -> ?d:int -> int -> t
      val const : Coeff.t -> t
      val monomial : Monomial.t -> t
      val mult_scalar : Coeff.t -> t -> t
      val add : t -> t -> t
      val sub : t -> t -> t
      val mult : t -> t -> t
      val power : t -> int -> t
      exception Dimension_error
      val compose : t -> t list -> t
      val derive : t -> int -> t
      val eval : t -> Coeff.t list -> Coeff.t
      val compare : t -> t -> int
      val nb_vars : t -> int
      val degree : t -> int
      val degree_list : t -> int list
      val is_homogeneous : t -> bool
      val is_var : t -> (Coeff.t * int * int) option
      val is_const : t -> Coeff.t option
      val is_monomial : t -> Monomial.t option
      val ( ?? ) : int -> t
      val ( ! ) : Coeff.t -> t
      val ( *. ) : Coeff.t -> t -> t
      val ( ~- ) : t -> t
      val ( + ) : t -> t -> t
      val ( - ) : t -> t -> t
      val ( * ) : t -> t -> t
      val ( / ) : t -> Coeff.t -> t
      val ( /. ) : Coeff.t -> Coeff.t -> t
      val ( ** ) : t -> int -> t
      val pp : Format.formatter -> t -> unit
      val pp_names : string list -> Format.formatter -> t -> unit
      val merge :
        (Monomial.t -> Coeff.t option -> Coeff.t option -> Coeff.t option) ->
        t -> t -> t
      val fold : (Monomial.t -> Coeff.t -> '-> 'a) -> t -> '-> 'a
    end
  module Float :
    sig
      module Coeff :
        sig
          type t = float
          val compare : t -> t -> int
          val zero : t
          val one : t
          val of_float : float -> t
          val to_float : t -> float
          val of_q : Q.t -> t
          val to_q : t -> Q.t
          val add : t -> t -> t
          val sub : t -> t -> t
          val mult : t -> t -> t
          val div : t -> t -> t
          val pp : Format.formatter -> t -> unit
          val minus_one : t
          val of_int : int -> t
          val neg : t -> t
          val inv : t -> t
          val equal : t -> t -> bool
          val leq : t -> t -> bool
          val geq : t -> t -> bool
          val lt : t -> t -> bool
          val gt : t -> t -> bool
          val sign : t -> int
          val ( ~- ) : t -> t
          val ( + ) : t -> t -> t
          val ( - ) : t -> t -> t
          val ( * ) : t -> t -> t
          val ( / ) : t -> t -> t
          val ( = ) : t -> t -> bool
          val ( <> ) : t -> t -> bool
          val ( <= ) : t -> t -> bool
          val ( >= ) : t -> t -> bool
          val ( < ) : t -> t -> bool
          val ( > ) : t -> t -> bool
        end
      type t
      val of_list : (Monomial.t * Coeff.t) list -> t
      val to_list : t -> (Monomial.t * Coeff.t) list
      val zero : t
      val one : t
      val var : ?c:Coeff.t -> ?d:int -> int -> t
      val const : Coeff.t -> t
      val monomial : Monomial.t -> t
      val mult_scalar : Coeff.t -> t -> t
      val add : t -> t -> t
      val sub : t -> t -> t
      val mult : t -> t -> t
      val power : t -> int -> t
      exception Dimension_error
      val compose : t -> t list -> t
      val derive : t -> int -> t
      val eval : t -> Coeff.t list -> Coeff.t
      val compare : t -> t -> int
      val nb_vars : t -> int
      val degree : t -> int
      val degree_list : t -> int list
      val is_homogeneous : t -> bool
      val is_var : t -> (Coeff.t * int * int) option
      val is_const : t -> Coeff.t option
      val is_monomial : t -> Monomial.t option
      val ( ?? ) : int -> t
      val ( ! ) : Coeff.t -> t
      val ( *. ) : Coeff.t -> t -> t
      val ( ~- ) : t -> t
      val ( + ) : t -> t -> t
      val ( - ) : t -> t -> t
      val ( * ) : t -> t -> t
      val ( / ) : t -> Coeff.t -> t
      val ( /. ) : Coeff.t -> Coeff.t -> t
      val ( ** ) : t -> int -> t
      val pp : Format.formatter -> t -> unit
      val pp_names : string list -> Format.formatter -> t -> unit
      val merge :
        (Monomial.t -> Coeff.t option -> Coeff.t option -> Coeff.t option) ->
        t -> t -> t
      val fold : (Monomial.t -> Coeff.t -> '-> 'a) -> t -> '-> 'a
    end
end