summaryrefslogtreecommitdiff
path: root/gmp.mli
blob: 9a660e4364209f90c0afbe62b76b09e1178957bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
type rounding_mode = GMP_RNDN | GMP_RNDZ | GMP_RNDU | GMP_RNDD
module RNG :
  sig
    type randstate_t
    and randalg_t = GMP_RAND_ALG_LC of int
    val randinit : randalg_t -> randstate_t
    val default : randstate_t
  end
module Z2 :
  sig
    type t
    external from_int : dest:t -> int -> unit = "_mlgmp_z2_from_int"
    external from_string_base : dest:t -> base:int -> string -> unit
      = "_mlgmp_z2_from_string_base"
    external from_float : dest:t -> float -> unit = "_mlgmp_z2_from_float"
    external create : unit -> t = "_mlgmp_z_create"
    external copy : dest:t -> from:t -> unit = "_mlgmp_z2_copy"
    external add : dest:t -> t -> t -> unit = "_mlgmp_z2_add"
    external sub : dest:t -> t -> t -> unit = "_mlgmp_z2_sub"
    external mul : dest:t -> t -> t -> unit = "_mlgmp_z2_mul"
    external tdiv_q : dest:t -> t -> t -> unit = "_mlgmp_z2_tdiv_q"
    external tdiv_r : dest:t -> t -> t -> unit = "_mlgmp_z2_tdiv_r"
    external cdiv_q : dest:t -> t -> t -> unit = "_mlgmp_z2_cdiv_q"
    external cdiv_r : dest:t -> t -> t -> unit = "_mlgmp_z2_cdiv_r"
    external fdiv_q : dest:t -> t -> t -> unit = "_mlgmp_z2_fdiv_q"
    external fdiv_r : dest:t -> t -> t -> unit = "_mlgmp_z2_fdiv_r"
    external divexact : dest:t -> t -> t -> unit = "_mlgmp_z2_divexact"
    external neg : dest:t -> t -> unit = "_mlgmp_z2_neg"
    external abs : dest:t -> t -> unit = "_mlgmp_z2_abs"
  end
module Z :
  sig
    type t = Z2.t
    external copy : t -> t = "_mlgmp_z_copy"
    external from_int : int -> t = "_mlgmp_z_from_int"
    external of_int : int -> t = "_mlgmp_z_from_int"
    external from_string_base : base:int -> string -> t
      = "_mlgmp_z_from_string_base"
    external from_float : float -> t = "_mlgmp_z_from_float"
    external of_float : float -> t = "_mlgmp_z_from_float"
    external to_string_base : base:int -> t -> string
      = "_mlgmp_z_to_string_base"
    external to_int : t -> int = "_mlgmp_z_to_int"
    external to_float : t -> float = "_mlgmp_z_to_float"
    external int_from : t -> int = "_mlgmp_z_to_int"
    external float_from : t -> float = "_mlgmp_z_to_float"
    external add : t -> t -> t = "_mlgmp_z_add"
    external sub : t -> t -> t = "_mlgmp_z_sub"
    external mul : t -> t -> t = "_mlgmp_z_mul"
    external add_ui : t -> int -> t = "_mlgmp_z_add_ui"
    external sub_ui : t -> int -> t = "_mlgmp_z_sub_ui"
    external mul_ui : t -> int -> t = "_mlgmp_z_mul_ui"
    external neg : t -> t = "_mlgmp_z_neg"
    external abs : t -> t = "_mlgmp_z_abs"
    external tdiv_qr : t -> t -> t * t = "_mlgmp_z_tdiv_qr"
    external tdiv_q : t -> t -> t = "_mlgmp_z_tdiv_q"
    external tdiv_r : t -> t -> t = "_mlgmp_z_tdiv_r"
    external cdiv_qr : t -> t -> t * t = "_mlgmp_z_cdiv_qr"
    external cdiv_q : t -> t -> t = "_mlgmp_z_cdiv_q"
    external cdiv_r : t -> t -> t = "_mlgmp_z_cdiv_r"
    external fdiv_qr : t -> t -> t * t = "_mlgmp_z_fdiv_qr"
    external fdiv_q : t -> t -> t = "_mlgmp_z_fdiv_q"
    external fdiv_r : t -> t -> t = "_mlgmp_z_fdiv_r"
    external dmod : t -> t -> t = "_mlgmp_z_mod"
    external dmod_ui : t -> int -> t = "_mlgmp_z_mod_ui"
    external euclidean_division : t -> t -> t * t = "_mlgmp_z_fdiv_qr"
    external modulo : t -> t -> t = "_mlgmp_z_mod"
    external tdiv_qr_ui : t -> int -> t * t = "_mlgmp_z_tdiv_qr_ui"
    external tdiv_q_ui : t -> int -> t = "_mlgmp_z_tdiv_q_ui"
    external tdiv_r_ui : t -> int -> t = "_mlgmp_z_tdiv_r_ui"
    external tdiv_ui : t -> int -> int = "_mlgmp_z_tdiv_ui"
    external cdiv_qr_ui : t -> int -> t * t = "_mlgmp_z_cdiv_qr_ui"
    external cdiv_q_ui : t -> int -> t = "_mlgmp_z_cdiv_q_ui"
    external cdiv_r_ui : t -> int -> t = "_mlgmp_z_cdiv_r_ui"
    external cdiv_ui : t -> int -> int = "_mlgmp_z_cdiv_ui"
    external fdiv_qr_ui : t -> int -> t * t = "_mlgmp_z_fdiv_qr_ui"
    external fdiv_q_ui : t -> int -> t = "_mlgmp_z_fdiv_q_ui"
    external fdiv_r_ui : t -> int -> t = "_mlgmp_z_fdiv_r_ui"
    external fdiv_ui : t -> int -> int = "_mlgmp_z_fdiv_ui"
    external divexact : t -> t -> t = "_mlgmp_z_divexact"
    external mul_2exp : t -> int -> t = "_mlgmp_z_mul_2exp"
    external mul2exp : t -> int -> t = "_mlgmp_z_mul_2exp"
    external tdiv_q_2exp : t -> int -> t = "_mlgmp_z_tdiv_q_2exp"
    external tdiv_r_2exp : t -> int -> t = "_mlgmp_z_tdiv_r_2exp"
    external fdiv_q_2exp : t -> int -> t = "_mlgmp_z_fdiv_q_2exp"
    external fdiv_r_2exp : t -> int -> t = "_mlgmp_z_fdiv_r_2exp"
    external cdiv_q_2exp : t -> int -> t = "_mlgmp_z_cdiv_q_2exp"
    external cdiv_r_2exp : t -> int -> t = "_mlgmp_z_cdiv_r_2exp"
    external powm : t -> t -> t -> t = "_mlgmp_z_powm"
    external powm_ui : t -> int -> t -> t = "_mlgmp_z_powm_ui"
    external pow_ui : t -> int -> t = "_mlgmp_z_pow_ui"
    external ui_pow_ui : int -> int -> t = "_mlgmp_z_ui_pow_ui"
    external pow_ui_ui : int -> int -> t = "_mlgmp_z_ui_pow_ui"
    external sqrt : t -> t = "_mlgmp_z_sqrt"
    external sqrtrem : t -> t * t = "_mlgmp_z_sqrtrem"
    external root : t -> int -> t = "_mlgmp_z_root"
    external perfect_power_p : t -> bool = "_mlgmp_z_perfect_power_p"
    external perfect_square_p : t -> bool = "_mlgmp_z_perfect_square_p"
    external is_perfect_power : t -> bool = "_mlgmp_z_perfect_power_p"
    external is_perfect_square : t -> bool = "_mlgmp_z_perfect_square_p"
    external probab_prime_p : t -> int -> bool = "_mlgmp_z_probab_prime_p"
    external is_probab_prime : t -> int -> bool = "_mlgmp_z_probab_prime_p"
    external nextprime : t -> t = "_mlgmp_z_nextprime"
    external gcd : t -> t -> t = "_mlgmp_z_gcd"
    external gcd_ui : t -> t -> t = "_mlgmp_z_gcd_ui"
    external lcm : t -> t -> t = "_mlgmp_z_lcm"
    external gcdext : t -> t -> t * t * t = "_mlgmp_z_gcdext"
    external inverse : t -> t -> t option = "_mlgmp_z_invert"
    external legendre : t -> t -> int = "_mlgmp_z_legendre"
    external jacobi : t -> t -> int = "_mlgmp_z_jacobi"
    external kronecker_si : t -> int -> int = "_mlgmp_z_kronecker_si"
    external si_kronecker : int -> t -> int = "_mlgmp_z_si_kronecker"
    external remove : t -> t -> t * int = "_mlgmp_z_remove"
    external fac_ui : int -> t = "_mlgmp_z_fac_ui"
    external fib_ui : int -> t = "_mlgmp_z_fib_ui"
    external bin_ui : n:t -> k:int -> t = "_mlgmp_z_bin_ui"
    external bin_uiui : n:int -> k:int -> t = "_mlgmp_z_bin_uiui"
    external cmp : t -> t -> int = "_mlgmp_z_compare"
    external cmp_si : t -> int -> int = "_mlgmp_z_compare_si"
    external compare : t -> t -> int = "_mlgmp_z_compare"
    external compare_si : t -> int -> int = "_mlgmp_z_compare_si"
    external compare_int : t -> int -> int = "_mlgmp_z_compare_si"
    external sgn : t -> int = "_mlgmp_z_sgn"
    external band : t -> t -> t = "_mlgmp_z_and"
    external bior : t -> t -> t = "_mlgmp_z_ior"
    external bxor : t -> t -> t = "_mlgmp_z_xor"
    external bcom : t -> t = "_mlgmp_z_com"
    external popcount : t -> int = "_mlgmp_z_popcount"
    external hamdist : t -> t -> int = "_mlgmp_z_hamdist"
    external scan0 : t -> int -> int = "_mlgmp_z_scan0"
    external scan1 : t -> int -> int = "_mlgmp_z_scan1"
    external urandomb : state:RNG.randstate_t -> nbits:int -> t
      = "_mlgmp_z_urandomb"
    external urandomm : state:RNG.randstate_t -> n:t -> t
      = "_mlgmp_z_urandomm"
    external rrandomb : state:RNG.randstate_t -> nbits:int -> t
      = "_mlgmp_z_rrandomb"
    val zero : t
    val one : t
    val is_prime : ?prec:int -> t -> bool
    val equal : t -> t -> bool
    val equal_int : t -> int -> bool
    val is_zero : t -> bool
    val to_string : t -> string
    val from_string : string -> t
    val string_from : t -> string
    val output : out_channel -> t -> unit
    val sprintf : unit -> t -> string

    val print : Format.formatter -> t -> unit
    val succ : t -> t
    val pred : t -> t
    val min : t -> t -> t
    val max : t -> t -> t

    module Infixes :
      sig
        external ( +! ) : t -> t -> t = "_mlgmp_z_add"
        external ( -! ) : t -> t -> t = "_mlgmp_z_sub"
        external ( *! ) : t -> t -> t = "_mlgmp_z_mul"
        external ( /! ) : t -> t -> t = "_mlgmp_z_fdiv_q"
        external ( %! ) : t -> t -> t = "_mlgmp_z_fdiv_r"
        val ( <! ) : t -> t -> bool
        val ( <=! ) : t -> t -> bool
        val ( =! ) : t -> t -> bool
        val ( >=! ) : t -> t -> bool
        val ( >! ) : t -> t -> bool
        val ( <>! ) : t -> t -> bool
      end
  end
module Q :
  sig
    type t
    external create : unit -> t = "_mlgmp_q_create"
    external from_z : Z.t -> t = "_mlgmp_q_from_z"
    external from_si : int -> int -> t = "_mlgmp_q_from_si"
    external from_ints : int -> int -> t = "_mlgmp_q_from_si"
    val from_int : int -> t
    external from_float : float -> t = "_mlgmp_q_from_float"
    external float_from : t -> float = "_mlgmp_q_to_float"
    external to_float : t -> float = "_mlgmp_q_to_float"
    external add : t -> t -> t = "_mlgmp_q_add"
    external sub : t -> t -> t = "_mlgmp_q_sub"
    external mul : t -> t -> t = "_mlgmp_q_mul"
    external div : t -> t -> t = "_mlgmp_q_div"
    external neg : t -> t = "_mlgmp_q_neg"
    external inv : t -> t = "_mlgmp_q_inv"
    external get_num : t -> Z.t = "_mlgmp_q_get_num"
    external get_den : t -> Z.t = "_mlgmp_q_get_den"
    external cmp : t -> t -> int = "_mlgmp_q_cmp"
    external compare : t -> t -> int = "_mlgmp_q_cmp"
    external cmp_ui : t -> int -> int -> int = "_mlgmp_q_cmp_ui"
    external sgn : t -> int = "_mlgmp_q_sgn"
    val zero : t
    val is_zero : t -> bool
    val from_zs : Z.t -> Z.t -> t
    val equal : t -> t -> bool
    val output : out_channel -> t -> unit
    val to_string : t -> string
    val sprintf : unit -> t -> string
    module Infixes :
      sig
        external ( +/ ) : t -> t -> t = "_mlgmp_q_add"
        external ( -/ ) : t -> t -> t = "_mlgmp_q_sub"
        external ( */ ) : t -> t -> t = "_mlgmp_q_mul"
        external ( // ) : t -> t -> t = "_mlgmp_q_div"
        val ( </ ) : t -> t -> bool
        val ( <=/ ) : t -> t -> bool
        val ( =/ ) : t -> t -> bool
        val ( >=/ ) : t -> t -> bool
        val ( >/ ) : t -> t -> bool
        val ( <>/ ) : t -> t -> bool
      end
  end
module F :
  sig
    type t
    val zero: t
    external create : unit -> t = "_mlgmp_f_create"
    val default_prec : int ref
    external from_z_prec : prec:int -> Z.t -> t = "_mlgmp_f_from_z"
    external from_q_prec : prec:int -> Z.t -> t = "_mlgmp_f_from_q"
    external from_si_prec : prec:int -> int -> t = "_mlgmp_f_from_si"
    external from_float_prec : prec:int -> float -> t = "_mlgmp_f_from_float"
    external from_string_prec_base : prec:int -> base:int -> string -> t
      = "_mlgmp_f_from_string"
    external float_from : t->float = "_mlgmp_f_to_float";;
    external to_float : t->float = "_mlgmp_f_to_float";;
    external to_string_exp_base_digits :
      base:int -> digits:int -> t -> string * int
      = "_mlgmp_f_to_string_exp_base_digits"
    external add_prec : prec:int -> t -> t -> t = "_mlgmp_f_add"
    external sub_prec : prec:int -> t -> t -> t = "_mlgmp_f_sub"
    external mul_prec : prec:int -> t -> t -> t = "_mlgmp_f_mul"
    external div_prec : prec:int -> t -> t -> t = "_mlgmp_f_div"
    external add_prec_ui : prec:int -> t -> int -> t = "_mlgmp_f_add_ui"
    external sub_prec_ui : prec:int -> t -> int -> t = "_mlgmp_f_sub_ui"
    external mul_prec_ui : prec:int -> t -> int -> t = "_mlgmp_f_mul_ui"
    external div_prec_ui : prec:int -> t -> int -> t = "_mlgmp_f_div_ui"
    external neg_prec : prec:int -> t -> t = "_mlgmp_f_neg"
    external abs_prec : prec:int -> t -> t = "_mlgmp_f_abs"
    external inv_prec : prec:int -> t -> t = "_mlgmp_f_div"
    external reldiff_prec : prec:int -> t -> t = "_mlgmp_f_reldiff"
    external floor_prec : prec:int -> t -> t = "_mlgmp_f_floor"
    external ceil_prec : prec:int -> t -> t = "_mlgmp_f_ceil"
    external trunc_prec : prec:int -> t -> t = "_mlgmp_f_trunc"
    val from_z : Z.t -> t
    val from_q : Z.t -> t
    val from_si : int -> t
    val from_int : int -> t
    val from_float : float -> t
    val from_string_base : base:int -> string -> t
    val from_string : string -> t
    val add : t -> t -> t
    val sub : t -> t -> t
    val mul : t -> t -> t
    val div : t -> t -> t
    val reldiff : t -> t
    val add_ui : t -> int -> t
    val sub_ui : t -> int -> t
    val mul_ui : t -> int -> t
    val div_ui : t -> int -> t
    val neg : t -> t
    val abs : t -> t
    val inv : t -> t
    val floor : t -> t
    val ceil : t -> t
    val trunc : t -> t
    external cmp : t -> t -> int = "_mlgmp_f_cmp"
    external compare : t -> t -> int = "_mlgmp_f_cmp"
    external sgn : t -> int = "_mlgmp_f_sgn"
    external eq : t -> t -> prec:int -> bool = "_mlgmp_f_eq"
    external urandomb_prec :
      prec:int -> state:RNG.randstate_t -> nbits:int -> t
      = "_mlgmp_f_urandomb"
    external random2 : prec:int -> nlimbs:int -> max_exp:int -> t
      = "_mlgmp_f_random2"
    val urandomb : state:RNG.randstate_t -> nbits:int -> t
    val equal : t -> t -> bool
    val to_string_base_digits : base:int -> digits:int -> t -> string
    val to_string : t -> string
  end
module FR :
  sig
    type t
    val zero: t
    external create_prec : prec: int -> unit -> t = "_mlgmp_fr_create"
    val create: unit -> t
    val default_prec : int ref
    external from_z_prec : prec:int -> mode:rounding_mode -> Z.t -> t
      = "_mlgmp_fr_from_z"
    external from_q_prec : prec:int -> mode:rounding_mode -> Z.t -> t
      = "_mlgmp_fr_from_z"
    external from_si_prec : prec:int -> mode:rounding_mode -> int -> t
      = "_mlgmp_fr_from_si"
    external from_float_prec : prec:int -> mode:rounding_mode -> float -> t
      = "_mlgmp_fr_from_float"
    external float_from : t->float = "_mlgmp_fr_to_float";;
    external to_float_mode : mode:rounding_mode -> t -> float =
      "_mlgmp_fr_to_float";;
    external from_string_prec_base :
      prec:int -> mode:rounding_mode -> base:int -> string -> t
      = "_mlgmp_fr_from_string"
    external to_string_exp_base_digits :
      mode:rounding_mode -> base:int -> digits:int -> t -> string * int
      = "_mlgmp_fr_to_string_exp_base_digits"
    external add_prec : prec:int -> mode:rounding_mode -> t -> t -> t
      = "_mlgmp_fr_add"
    external sub_prec : prec:int -> mode:rounding_mode -> t -> t -> t
      = "_mlgmp_fr_sub"
    external mul_prec : prec:int -> mode:rounding_mode -> t -> t -> t
      = "_mlgmp_fr_mul"
    external div_prec : prec:int -> mode:rounding_mode -> t -> t -> t
      = "_mlgmp_fr_div"
    external add_prec_ui : prec:int -> mode:rounding_mode -> t -> int -> t
      = "_mlgmp_fr_add_ui"
    external sub_prec_ui : prec:int -> mode:rounding_mode -> t -> int -> t
      = "_mlgmp_fr_sub_ui"
    external mul_prec_ui : prec:int -> mode:rounding_mode -> t -> int -> t
      = "_mlgmp_fr_mul_ui"
    external div_prec_ui : prec:int -> mode:rounding_mode -> t -> int -> t
      = "_mlgmp_fr_div_ui"
    external neg_prec : prec:int -> mode:rounding_mode -> t -> t
      = "_mlgmp_fr_neg"
    external abs_prec : prec:int -> mode:rounding_mode -> t -> t
      = "_mlgmp_fr_abs"
    external inv_prec : prec:int -> mode:rounding_mode -> t -> t
      = "_mlgmp_fr_div"
    external reldiff_prec : prec:int -> mode:rounding_mode -> t -> t
      = "_mlgmp_fr_reldiff"
    external ceil_prec : prec:int -> t -> t = "_mlgmp_fr_ceil"
    external floor_prec : prec:int -> t -> t = "_mlgmp_fr_floor"
    external trunc_prec : prec:int -> t -> t = "_mlgmp_fr_trunc"
    external cmp : t -> t -> int = "_mlgmp_fr_cmp"
    external compare : t -> t -> int = "_mlgmp_fr_cmp"
    external sgn : t -> int = "_mlgmp_fr_sgn"
    external eq : t -> t -> prec:int -> bool = "_mlgmp_fr_eq"
    external is_nan : t -> bool = "_mlgmp_fr_is_nan"
    external urandomb : prec:int -> state:RNG.randstate_t -> t
      = "_mlgmp_fr_urandomb"
    external random : prec:int -> t = "_mlgmp_fr_random"
    external random2 : prec:int -> nlimbs:int -> max_exp:int -> t
      = "_mlgmp_fr_random2"
    val from_z : Z.t -> t
    val from_q : Z.t -> t
    val from_si : int -> t
    val from_int : int -> t
    val from_float : float -> t
    val to_float : t -> float
    val from_string_base : base:int -> string -> t
    val from_string : string -> t
    val add : t -> t -> t
    val sub : t -> t -> t
    val mul : t -> t -> t
    val div : t -> t -> t
    val reldiff : t -> t
    val add_ui : t -> int -> t
    val sub_ui : t -> int -> t
    val mul_ui : t -> int -> t
    val div_ui : t -> int -> t
    val neg : t -> t
    val abs : t -> t
    val inv : t -> t
    val floor : t -> t
    val ceil : t -> t
    val trunc : t -> t
    val equal : t -> t -> bool
    val to_string_base_digits :
      mode:rounding_mode -> base:int -> digits:int -> t -> string
    val to_string : t -> string
    external to_z_exp : t->Z.t*int = "_mlgmp_fr_to_z_exp";;
    val to_z_t : t->Z.t
    val to_z_c : t->Z.t
    val to_z_f : t->Z.t
    val to_z : t->Z.t
    val z_from : t->Z.t

    external is_available : unit -> bool = "_mlgmp_is_mpfr_available"
  end
exception Unimplemented of string
external get_gmp_runtime_version : unit -> string
  = "_mlgmp_get_runtime_version"
external get_gmp_compile_version : unit -> int * int * int
  = "_mlgmp_get_compile_version"