sig
  type round_mode = Floor | Nearest_up | Ceil | Nearest_down
  type tristate = False | Unknown | True
  module type Int_type =
    sig
      type t
      type tref
      val name : unit -> string
      val zero : Numerix.Int_type.t
      val one : Numerix.Int_type.t
      val make_ref : Numerix.Int_type.t -> Numerix.Int_type.tref
      val copy_in : Numerix.Int_type.tref -> Numerix.Int_type.t -> unit
      val copy_out : Numerix.Int_type.tref -> Numerix.Int_type.t
      val look : Numerix.Int_type.tref -> Numerix.Int_type.t
      val add :
        Numerix.Int_type.t -> Numerix.Int_type.t -> Numerix.Int_type.t
      val add_1 : Numerix.Int_type.t -> int -> Numerix.Int_type.t
      val add_in :
        Numerix.Int_type.tref ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val add_1_in :
        Numerix.Int_type.tref -> Numerix.Int_type.t -> int -> unit
      val sub :
        Numerix.Int_type.t -> Numerix.Int_type.t -> Numerix.Int_type.t
      val sub_1 : Numerix.Int_type.t -> int -> Numerix.Int_type.t
      val sub_in :
        Numerix.Int_type.tref ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val sub_1_in :
        Numerix.Int_type.tref -> Numerix.Int_type.t -> int -> unit
      val mul :
        Numerix.Int_type.t -> Numerix.Int_type.t -> Numerix.Int_type.t
      val mul_1 : Numerix.Int_type.t -> int -> Numerix.Int_type.t
      val mul_in :
        Numerix.Int_type.tref ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val mul_1_in :
        Numerix.Int_type.tref -> Numerix.Int_type.t -> int -> unit
      val quomod :
        Numerix.Int_type.t ->
        Numerix.Int_type.t -> Numerix.Int_type.t * Numerix.Int_type.t
      val quo :
        Numerix.Int_type.t -> Numerix.Int_type.t -> Numerix.Int_type.t
      val modulo :
        Numerix.Int_type.t -> Numerix.Int_type.t -> Numerix.Int_type.t
      val gquomod :
        Numerix.round_mode ->
        Numerix.Int_type.t ->
        Numerix.Int_type.t -> Numerix.Int_type.t * Numerix.Int_type.t
      val gquo :
        Numerix.round_mode ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> Numerix.Int_type.t
      val gmod :
        Numerix.round_mode ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> Numerix.Int_type.t
      val quomod_in :
        Numerix.Int_type.tref ->
        Numerix.Int_type.tref ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val quo_in :
        Numerix.Int_type.tref ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val mod_in :
        Numerix.Int_type.tref ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val gquomod_in :
        Numerix.round_mode ->
        Numerix.Int_type.tref ->
        Numerix.Int_type.tref ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val gquo_in :
        Numerix.round_mode ->
        Numerix.Int_type.tref ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val gmod_in :
        Numerix.round_mode ->
        Numerix.Int_type.tref ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val quomod_1 : Numerix.Int_type.t -> int -> Numerix.Int_type.t * int
      val quo_1 : Numerix.Int_type.t -> int -> Numerix.Int_type.t
      val mod_1 : Numerix.Int_type.t -> int -> int
      val gquomod_1 :
        Numerix.round_mode ->
        Numerix.Int_type.t -> int -> Numerix.Int_type.t * int
      val gquo_1 :
        Numerix.round_mode -> Numerix.Int_type.t -> int -> Numerix.Int_type.t
      val gmod_1 : Numerix.round_mode -> Numerix.Int_type.t -> int -> int
      val quomod_1_in :
        Numerix.Int_type.tref -> Numerix.Int_type.t -> int -> int
      val quo_1_in :
        Numerix.Int_type.tref -> Numerix.Int_type.t -> int -> unit
      val gquomod_1_in :
        Numerix.round_mode ->
        Numerix.Int_type.tref -> Numerix.Int_type.t -> int -> int
      val gquo_1_in :
        Numerix.round_mode ->
        Numerix.Int_type.tref -> Numerix.Int_type.t -> int -> unit
      val abs : Numerix.Int_type.t -> Numerix.Int_type.t
      val abs_in : Numerix.Int_type.tref -> Numerix.Int_type.t -> unit
      val neg : Numerix.Int_type.t -> Numerix.Int_type.t
      val neg_in : Numerix.Int_type.tref -> Numerix.Int_type.t -> unit
      val sqr : Numerix.Int_type.t -> Numerix.Int_type.t
      val pow : Numerix.Int_type.t -> int -> Numerix.Int_type.t
      val pow_1 : int -> int -> Numerix.Int_type.t
      val powmod :
        Numerix.Int_type.t ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> Numerix.Int_type.t
      val gpowmod :
        Numerix.round_mode ->
        Numerix.Int_type.t ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> Numerix.Int_type.t
      val sqr_in : Numerix.Int_type.tref -> Numerix.Int_type.t -> unit
      val pow_in : Numerix.Int_type.tref -> Numerix.Int_type.t -> int -> unit
      val pow_1_in : Numerix.Int_type.tref -> int -> int -> unit
      val powmod_in :
        Numerix.Int_type.tref ->
        Numerix.Int_type.t ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val gpowmod_in :
        Numerix.round_mode ->
        Numerix.Int_type.tref ->
        Numerix.Int_type.t ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val sqrt : Numerix.Int_type.t -> Numerix.Int_type.t
      val root : Numerix.Int_type.t -> int -> Numerix.Int_type.t
      val gsqrt :
        Numerix.round_mode -> Numerix.Int_type.t -> Numerix.Int_type.t
      val groot :
        Numerix.round_mode -> Numerix.Int_type.t -> int -> Numerix.Int_type.t
      val sqrt_in : Numerix.Int_type.tref -> Numerix.Int_type.t -> unit
      val root_in :
        Numerix.Int_type.tref -> Numerix.Int_type.t -> int -> unit
      val gsqrt_in :
        Numerix.round_mode ->
        Numerix.Int_type.tref -> Numerix.Int_type.t -> unit
      val groot_in :
        Numerix.round_mode ->
        Numerix.Int_type.tref -> Numerix.Int_type.t -> int -> unit
      val fact : int -> Numerix.Int_type.t
      val fact_in : Numerix.Int_type.tref -> int -> unit
      val gcd :
        Numerix.Int_type.t -> Numerix.Int_type.t -> Numerix.Int_type.t
      val gcd_ex :
        Numerix.Int_type.t ->
        Numerix.Int_type.t ->
        Numerix.Int_type.t * Numerix.Int_type.t * Numerix.Int_type.t
      val cfrac :
        Numerix.Int_type.t ->
        Numerix.Int_type.t ->
        Numerix.Int_type.t * Numerix.Int_type.t * Numerix.Int_type.t *
        Numerix.Int_type.t * Numerix.Int_type.t
      val gcd_in :
        Numerix.Int_type.tref ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val gcd_ex_in :
        Numerix.Int_type.tref ->
        Numerix.Int_type.tref ->
        Numerix.Int_type.tref ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val cfrac_in :
        Numerix.Int_type.tref ->
        Numerix.Int_type.tref ->
        Numerix.Int_type.tref ->
        Numerix.Int_type.tref ->
        Numerix.Int_type.tref ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> unit
      val isprime : Numerix.Int_type.t -> Numerix.tristate
      val isprime_1 : int -> Numerix.tristate
      val sgn : Numerix.Int_type.t -> int
      val cmp : Numerix.Int_type.t -> Numerix.Int_type.t -> int
      val cmp_1 : Numerix.Int_type.t -> int -> int
      val eq : Numerix.Int_type.t -> Numerix.Int_type.t -> bool
      val eq_1 : Numerix.Int_type.t -> int -> bool
      val neq : Numerix.Int_type.t -> Numerix.Int_type.t -> bool
      val neq_1 : Numerix.Int_type.t -> int -> bool
      val inf : Numerix.Int_type.t -> Numerix.Int_type.t -> bool
      val inf_1 : Numerix.Int_type.t -> int -> bool
      val infeq : Numerix.Int_type.t -> Numerix.Int_type.t -> bool
      val infeq_1 : Numerix.Int_type.t -> int -> bool
      val sup : Numerix.Int_type.t -> Numerix.Int_type.t -> bool
      val sup_1 : Numerix.Int_type.t -> int -> bool
      val supeq : Numerix.Int_type.t -> Numerix.Int_type.t -> bool
      val supeq_1 : Numerix.Int_type.t -> int -> bool
      val of_int : int -> Numerix.Int_type.t
      val of_string : string -> Numerix.Int_type.t
      val of_int_in : Numerix.Int_type.tref -> int -> unit
      val of_string_in : Numerix.Int_type.tref -> string -> unit
      val int_of : Numerix.Int_type.t -> int
      val string_of : Numerix.Int_type.t -> string
      val bstring_of : Numerix.Int_type.t -> string
      val hstring_of : Numerix.Int_type.t -> string
      val ostring_of : Numerix.Int_type.t -> string
      val nrandom : int -> Numerix.Int_type.t
      val zrandom : int -> Numerix.Int_type.t
      val nrandom1 : int -> Numerix.Int_type.t
      val zrandom1 : int -> Numerix.Int_type.t
      val nrandom_in : Numerix.Int_type.tref -> int -> unit
      val zrandom_in : Numerix.Int_type.tref -> int -> unit
      val nrandom1_in : Numerix.Int_type.tref -> int -> unit
      val zrandom1_in : Numerix.Int_type.tref -> int -> unit
      val random_init : int -> unit
      val nbits : Numerix.Int_type.t -> int
      val lowbits : Numerix.Int_type.t -> int
      val highbits : Numerix.Int_type.t -> int
      val nth_word : Numerix.Int_type.t -> int -> int
      val nth_bit : Numerix.Int_type.t -> int -> bool
      val shl : Numerix.Int_type.t -> int -> Numerix.Int_type.t
      val shr : Numerix.Int_type.t -> int -> Numerix.Int_type.t
      val split :
        Numerix.Int_type.t -> int -> Numerix.Int_type.t * Numerix.Int_type.t
      val join :
        Numerix.Int_type.t -> Numerix.Int_type.t -> int -> Numerix.Int_type.t
      val shl_in : Numerix.Int_type.tref -> Numerix.Int_type.t -> int -> unit
      val shr_in : Numerix.Int_type.tref -> Numerix.Int_type.t -> int -> unit
      val split_in :
        Numerix.Int_type.tref ->
        Numerix.Int_type.tref -> Numerix.Int_type.t -> int -> unit
      val join_in :
        Numerix.Int_type.tref ->
        Numerix.Int_type.t -> Numerix.Int_type.t -> int -> unit
      val toplevel_print : Numerix.Int_type.t -> unit
      val toplevel_print_tref : Numerix.Int_type.tref -> unit
      exception Error of string
    end
  module Infixes :
    functor (E : Int_type->
      sig
        val ( ++ ) : E.t -> E.t -> E.t
        val ( -- ) : E.t -> E.t -> E.t
        val ( ** ) : E.t -> E.t -> E.t
        val ( // ) : E.t -> E.t -> E.t
        val ( %% ) : E.t -> E.t -> E.t
        val ( /% ) : E.t -> E.t -> E.t * E.t
        val ( << ) : E.t -> int -> E.t
        val ( >> ) : E.t -> int -> E.t
        val ( ^^ ) : E.t -> int -> E.t
        val ( += ) : E.tref -> E.t -> unit
        val ( -= ) : E.tref -> E.t -> unit
        val ( *= ) : E.tref -> E.t -> unit
        val ( /= ) : E.tref -> E.t -> unit
        val ( %= ) : E.tref -> E.t -> unit
        val ( +. ) : E.t -> int -> E.t
        val ( -. ) : E.t -> int -> E.t
        val ( *. ) : E.t -> int -> E.t
        val ( /. ) : E.t -> int -> E.t
        val ( %. ) : E.t -> int -> int
        val ( /%. ) : E.t -> int -> E.t * int
        val ( ^. ) : int -> int -> E.t
        val ( +=. ) : E.tref -> int -> unit
        val ( -=. ) : E.tref -> int -> unit
        val ( *=. ) : E.tref -> int -> unit
        val ( /=. ) : E.tref -> int -> unit
        val ( =. ) : E.t -> int -> bool
        val ( <>. ) : E.t -> int -> bool
        val ( <. ) : E.t -> int -> bool
        val ( <=. ) : E.t -> int -> bool
        val ( >. ) : E.t -> int -> bool
        val ( >=. ) : E.t -> int -> bool
        val ( ~~ ) : E.tref -> E.t
      end
  external chrono : string -> unit = "chrono"
end