sig
  type t = Field.Int.t Weak.t ref * (int -> Field.Int.t)
  val eq : t -> t -> 'a
  val get : t -> int -> Field.Int.t
  val coeff : t -> int -> Field.Int.t
  val to_string : t -> string
  val make : (int -> Field.Int.t) -> t
  val zero : t
  val one : t
  val var : t
  val add : t -> t -> t
  val sub : t -> t -> t
  val mul : t -> t -> t
  val expn : t -> int -> t
  val hadamard : t -> t -> t
  val cmul : Field.Int.t -> t -> t
  val neg : t -> t
  val star : t -> t
  val inv : t -> t
  module Polynomial :
    sig
      type t = Field.Int.t array
      val length : t -> int
      val degree : t -> int
      val eq : t -> t -> bool
      val compact : t -> t
      val coeff : t -> int -> Field.Int.t
      val init : int -> (int -> Field.Int.t) -> t
      val add : t -> t -> t
      val zero : 'a array
      val cmul : Field.Int.t -> t -> t
      val neg : t -> t
      val sub : t -> t -> t
      val mul : t -> t -> t
      val one : Field.Int.t array
      val to_string : t -> string
      val monomial : Field.Int.t -> int -> Field.Int.t array
    end
  val polynomial : Polynomial.t -> t
  module RationalFractions :
    sig
      module Polynomial :
        functor (F : Field.T->
          sig
            type t = Ring.Polynomial(F).t
            val eq : t -> t -> bool
            val add : t -> t -> t
            val zero : t
            val neg : t -> t
            val mul : t -> t -> t
            val one : t
            val to_string : t -> string
            val div : t -> t -> t * t
          end
      type t = Polynomial(Field.Int).t * Polynomial(Field.Int).t
      val gcd :
        Polynomial(Field.Int).t ->
        Polynomial(Field.Int).t -> Polynomial(Field.Int).t
      val canonize : t -> t
      val eq : t -> t -> bool
      val add : t -> t -> t
      val zero : t
      val neg : t -> t
      val mul : t -> t -> t
      val one : t
      val inv : t -> t
      val to_string : t -> string
    end
  val rational : RationalFractions.t -> t
end