sig
  type t
  type dim = Monomial.t
  type scalar = QQ.t
  val equal : t -> t -> bool
  val add : t -> t -> t
  val scalar_mul : scalar -> t -> t
  val negate : t -> t
  val dot : t -> t -> scalar
  val zero : t
  val is_zero : t -> bool
  val add_term : scalar -> dim -> t -> t
  val of_term : scalar -> dim -> t
  val enum : t -> (scalar * dim) BatEnum.t
  val of_enum : (scalar * dim) BatEnum.t -> t
  val of_list : (scalar * dim) list -> t
  val coeff : dim -> t -> scalar
  val pivot : dim -> t -> scalar * t
  val pp : (Format.formatter -> int -> unit) -> Format.formatter -> t -> unit
  val compare : t -> t -> int
  val mul : t -> t -> t
  val sub : t -> t -> t
  val one : t
  val scalar : QQ.t -> t
  val of_dim : Polynomial.Monomial.dim -> t
  val of_vec : ?const:int -> Linear.QQVector.t -> t
  val split_linear : ?const:int -> t -> Linear.QQVector.t * t
  val vec_of : ?const:int -> t -> Linear.QQVector.t option
  val term_of :
    'Syntax.context ->
    (Polynomial.Monomial.dim -> 'Syntax.term) -> t -> 'Syntax.term
  val exp : t -> int -> t
  val substitute : (Polynomial.Monomial.dim -> t) -> t -> t
  val div_monomial : t -> Polynomial.Monomial.t -> t option
  val dimensions : t -> int BatEnum.t
end