functor (X : S->
  sig
    type r = X.r
    type t
    val compare : t -> t -> int
    val hash : t -> int
    val create : (Num.num * r) list -> Num.num -> Ty.t -> t
    val add : t -> t -> t
    val sub : t -> t -> t
    val mult : t -> t -> t
    val mult_const : Num.num -> t -> t
    val div : t -> t -> t * bool
    val modulo : t -> t -> t
    val is_empty : t -> bool
    val find : r -> t -> Num.num
    val choose : t -> Num.num * r
    val subst : r -> t -> t -> t
    val remove : r -> t -> t
    val to_list : t -> (Num.num * r) list * Num.num
    val print : Format.formatter -> t -> unit
    val type_info : t -> Ty.t
    val is_monomial : t -> (Num.num * r * Num.num) option
    val ppmc_denominators : t -> Num.num
    val pgcd_numerators : t -> Num.num
    val normal_form : t -> t * Num.num * Num.num
    val normal_form_pos : t -> t * Num.num * Num.num
  end