functor
  (M : sig
         type 'a t
         type key
         val equal :
           ('a -> 'a -> bool) ->
           'a Linear.RingMap.t -> 'a Linear.RingMap.t -> bool
         val compare :
           ('a -> 'a -> int) ->
           'a Linear.RingMap.t -> 'a Linear.RingMap.t -> int
         val enum :
           'a Linear.RingMap.t -> (Linear.RingMap.key * 'a) BatEnum.t
         val map : ('a -> 'b) -> 'a Linear.RingMap.t -> 'b Linear.RingMap.t
         val find : Linear.RingMap.key -> 'a Linear.RingMap.t -> 'a
         val add :
           Linear.RingMap.key ->
           'a -> 'a Linear.RingMap.t -> 'a Linear.RingMap.t
         val remove :
           Linear.RingMap.key -> 'a Linear.RingMap.t -> 'a Linear.RingMap.t
         val empty : 'a Linear.RingMap.t
         val merge :
           (Linear.RingMap.key -> 'a option -> 'b option -> 'c option) ->
           'a Linear.RingMap.t -> 'b Linear.RingMap.t -> 'c Linear.RingMap.t
       end) (R : Ring) ->
  sig
    type t = R.t M.t
    type dim = M.key
    type scalar = R.t
    val equal : t -> t -> bool
    val add : t -> t -> t
    val scalar_mul : scalar -> t -> t
    val negate : t -> t
    val sub : t -> 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
  end