sig
  type t = Gmp.z
  val zero : Gmp.Z.t
  val one : Gmp.Z.t
  val minus_one : Gmp.Z.t
  external compare : Gmp.Z.t -> Gmp.Z.t -> int = "mlgmp_z_compare"
  external compare_int : Gmp.Z.t -> int -> int = "mlgmp_z_compare_int"
  external neg : Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_neg"
  external abs : Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_abs"
  external add : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_add"
  external add_int : Gmp.Z.t -> int -> Gmp.Z.t = "mlgmp_z_add_int"
  external sub : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_sub"
  external sub_int : Gmp.Z.t -> int -> Gmp.Z.t = "mlgmp_z_sub_int"
  external mul : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_mul"
  external mul_int : Gmp.Z.t -> int -> Gmp.Z.t = "mlgmp_z_mul_int"
  external div : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_div"
  external fma : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_fma"
  external pow_int : base:Gmp.Z.t -> exponent:int -> Gmp.Z.t
    = "mlgmp_z_pow_int"
  external int_pow_int : base:int -> exponent:int -> Gmp.Z.t
    = "mlgmp_z_int_pow_int"
  external scale : Gmp.Z.t -> base:int -> exponent:int -> Gmp.Z.t
    = "mlgmp_z_scale"
  external root : nth:int -> Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_root"
  external sqrt : Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_sqrt"
  external rem : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_rem"
  external modulo : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_modulo"
  external pow_mod : base:Gmp.Z.t -> exponent:Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t
    = "mlgmp_z_pow_mod"
  external tdiv : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t * Gmp.Z.t = "mlgmp_z_tdiv"
  external tdiv_int : Gmp.Z.t -> int -> Gmp.Z.t * int = "mlgmp_z_tdiv_int"
  external cdiv : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t * Gmp.Z.t = "mlgmp_z_cdiv"
  external cdiv_int : Gmp.Z.t -> int -> Gmp.Z.t * int = "mlgmp_z_cdiv_int"
  external fdiv : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t * Gmp.Z.t = "mlgmp_z_fdiv"
  external fdiv_int : Gmp.Z.t -> int -> Gmp.Z.t * int = "mlgmp_z_fdiv_int"
  external tsqrt : Gmp.Z.t -> Gmp.Z.t * Gmp.Z.t = "mlgmp_z_tsqrt"
  external is_perfect_power : Gmp.Z.t -> bool = "mlgmp_z_is_perfect_power"
  external is_perfect_square : Gmp.Z.t -> bool = "mlgmp_z_is_perfect_square"
  external is_probably_prime : Gmp.Z.t -> int -> int
    = "mlgmp_z_is_probably_prime"
  external next_prime : Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_next_prime"
  external gcd : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_gcd"
  external gcdext : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t * Gmp.Z.t * Gmp.Z.t
    = "mlgmp_z_gcdext"
  external lcm : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_lcm"
  external invert : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t option = "mlgmp_z_invert"
  external jacobi : Gmp.Z.t -> Gmp.Z.t -> int = "mlgmp_z_jacobi"
  val legendre : Gmp.Z.t -> Gmp.Z.t -> int
  val kronecker : Gmp.Z.t -> Gmp.Z.t -> int
  external remove : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t * int = "mlgmp_z_remove"
  external fac_int : int -> Gmp.Z.t = "mlgmp_z_fac_int"
  external dfac_int : int -> Gmp.Z.t = "mlgmp_z_dfac_int"
  external int_mfac_int : step:int -> int -> Gmp.Z.t = "mlgmp_z_int_mfac_int"
  external primorial_int : int -> Gmp.Z.t = "mlgmp_z_primorial_int"
  external bin_int : Gmp.Z.t -> int -> Gmp.Z.t = "mlgmp_z_bin_int"
  external fib_int : int -> Gmp.Z.t = "mlgmp_z_fib_int"
  external lucnum_int : int -> Gmp.Z.t = "mlgmp_z_lucnum_int"
  external logand : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_logand"
  external logand_int : Gmp.Z.t -> int -> Gmp.Z.t = "mlgmp_z_logand_int"
  external logor : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_logor"
  external logor_int : Gmp.Z.t -> int -> Gmp.Z.t = "mlgmp_z_logor_int"
  external logxor : Gmp.Z.t -> Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_logxor"
  external logxor_int : Gmp.Z.t -> int -> Gmp.Z.t = "mlgmp_z_logxor_int"
  external lognot : Gmp.Z.t -> Gmp.Z.t = "mlgmp_z_lognot"
  external shift_left : Gmp.Z.t -> int -> Gmp.Z.t = "mlgmp_z_shift_left"
  external shift_right : Gmp.Z.t -> int -> Gmp.Z.t = "mlgmp_z_shift_right"
  external population_count : Gmp.Z.t -> int = "mlgmp_z_population_count"
  external hamming_distance : Gmp.Z.t -> Gmp.Z.t -> int
    = "mlgmp_z_hamming_distance"
  external scan0 : Gmp.Z.t -> int -> int = "mlgmp_z_scan0"
  external scan1 : Gmp.Z.t -> int -> int = "mlgmp_z_scan1"
  external set_bit : Gmp.Z.t -> int -> Gmp.Z.t = "mlgmp_z_set_bit"
  external clear_bit : Gmp.Z.t -> int -> Gmp.Z.t = "mlgmp_z_clear_bit"
  external test_bit : Gmp.Z.t -> int -> int = "mlgmp_z_test_bit"
  external of_based_string : base:int -> string -> Gmp.Z.t
    = "mlgmp_z_of_based_string"
  val of_string : string -> Gmp.Z.t
  external to_based_string : base:int -> Gmp.Z.t -> string
    = "mlgmp_based_string_of_z"
  val to_string : Gmp.Z.t -> string
  external of_int : int -> Gmp.Z.t = "mlgmp_z_of_int"
  external to_int : Gmp.Z.t -> int = "mlgmp_int_of_z"
  external of_int32 : int32 -> Gmp.Z.t = "mlgmp_z_of_int32"
  external to_int32 : int32 -> Gmp.Z.t = "mlgmp_int32_of_z"
  external of_int64 : int64 -> Gmp.Z.t = "mlgmp_z_of_int64"
  external to_int64 : Gmp.Z.t -> int64 = "mlgmp_int64_of_z"
  external of_nativeint : nativeint -> Gmp.Z.t = "mlgmp_z_of_nativeint"
  external to_nativeint : nativeint -> Gmp.Z.t = "mlgmp_nativeint_of_z"
  external to_float : Gmp.Z.t -> float = "mlgmp_float_of_z"
  external export_length : Gmp.Z.t -> int = "mlgmp_z_export_length"
  val export : order:Gmp.byte_order -> Gmp.Z.t -> bytes -> int -> int -> unit
  val import :
    order:Gmp.byte_order -> signed:bool -> bytes -> int -> int -> Gmp.Z.t
end