-
Notifications
You must be signed in to change notification settings - Fork 6
/
mpz.idl
317 lines (267 loc) · 15.7 KB
/
mpz.idl
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
/* -*- mode: c -*- */
/* This file is part of the MLGmpIDL interface, released under LGPL license
with an exception allowing the redistribution of statically linked
executables.
Please read the COPYING file packaged in the distribution */
quote(C, "\n\
#include \"limits.h\"\n\
#include \"caml/custom.h\"\n\
#include \"gmp_caml.h\"\n\
")
typedef [abstract,c2ml(camlidl_mpz_ptr_c2ml),ml2c(camlidl_mpz_ptr_ml2c)] struct __mpz_struct* mpz_ptr;
typedef [abstract,c2ml(camlidl_mpz_ptr_c2ml),ml2c(camlidl_mpz_ptr_ml2c)] struct __mpz_struct* mpz_ptrm;
quote(MLMLI,"(** GMP multi-precision integers *)\n\n")
quote(MLMLI,"\n\
type m (** Mutable tag *)\n\
type f (** Functional (immutable) tag *)\n\
type t = m tt (** Mutable multi-precision integer *)\n\
")
quote(MLMLI,"(** The following operations are mapped as much as possible to their C counterpart. In case of imperative functions (like [set], [add], ...) the first parameter of type [t] is an out-parameter and holds the result when the function returns. For instance, [add x y z] adds the values of [y] and [z] and stores the result in [x].\n\n These functions are as efficient as their C counterpart: they do not imply additional memory allocation, unlike the corresponding functions in the module {!Mpzf}. *)\n\n")
/* OUTOUTOUT is a reserved variable name ! (see Makefile and sedscript_c) */
quote(MLI,"\n(** {2 Pretty printing} *)\n")
quote(MLI,"val print : Format.formatter -> 'a tt -> unit")
quote(MLMLI,"\n(** {2 Initialization Functions} *)")
quote(MLMLI,"(** {{:http://gmplib.org/manual/Initializing-Integers.html#Initializing-Integers}C documentation} *)\n")
void mpz_init([out] mpz_ptr OUTOUTOUT);
void mpz_init2([out] mpz_ptr OUTOUTOUT, unsigned long N);
void mpz_realloc2 (mpz_ptrm ROP, unsigned long N);
quote(MLMLI,"\n(** {2 Assignement Functions} *)")
quote(MLMLI,"(** {{:http://gmplib.org/manual/Assigning-Integers.html#Assigning-Integers}C documentation} *)\n")
quote(MLMLI,"\n(** The first parameter holds the result. *)\n")
void mpz_set(mpz_ptrm ROP, mpz_ptr OP);
void mpz_set_si(mpz_ptrm ROP, long int OP);
void mpz_set_d (mpz_ptrm ROP, double OP);
quote(MLI,"\n(** For [set_q: t -> Mpq.t -> unit], see {!Mpq.get_z} *)\n\n")
/* void mpz_set_q (mpz_ptr ROP, mpq_t OP); */
void mpz__set_str (mpz_ptrm ROP, [string]const char* STR, int BASE)
quote(call,"{\n\
int n = mpz_set_str(ROP,STR,BASE);\n\
if (n){ caml_invalid_argument(\"\"); }\n\
}");
quote(MLI,"val set_str : t -> string -> base:int -> unit")
quote(ML,"let set_str a b ~base = _set_str a b base")
void mpz_swap (mpz_ptrm ROP1, mpz_ptrm ROP2);
quote(MLMLI,"\n(** {2 Combined Initialization and Assignment Functions} *)")
quote(MLMLI,"(** {{:http://gmplib.org/manual/Simultaneous-Integer-Init-_0026-Assign.html#Simultaneous-Integer-Init-_0026-Assign}C documentation} *)\n")
void mpz_init_set ([out] mpz_ptr OUTOUTOUT, mpz_ptr OP);
void mpz_init_set_si ([out] mpz_ptr OUTOUTOUT, signed long int OP);
void mpz_init_set_d ([out] mpz_ptr OUTOUTOUT, double OP);
void mpz__init_set_str([out] mpz_ptr OUTOUTOUT, [string]const char *STR, int BASE)
quote(call,"\
{\n\
int n = mpz_init_set_str(OUTOUTOUT,STR,BASE);\n\
if (n){ mpz_clear(OUTOUTOUT); caml_invalid_argument(\"\"); }\n\
}");
quote(MLI,"val init_set_str : string -> base:int -> t")
quote(ML,"let init_set_str a ~base = _init_set_str a base")
quote(MLMLI,"\n(** {2 Conversion Functions} *)")
quote(MLMLI,"(** {{:http://gmplib.org/manual/Converting-Integers.html#Converting-Integers}C documentation} *)\n")
[nativeint]signed long int mpz_get_si (mpz_ptr OP);
signed long int mpz_get_int (mpz_ptr OP)
quote(call,"_res = mpz_get_si(OP);");
double mpz_get_d (mpz_ptr OP);
double mpz_get_d_2exp ([out]signed long int *EXP, mpz_ptr OP);
[string]char* mpz__get_str (int BASE, mpz_ptr OP)
quote(call,"_res = mpz_get_str(NULL,BASE,OP);")
quote(dealloc,"free(_res);");
quote(MLI,"val get_str : base:int -> 'a tt -> string")
quote(ML,"let get_str ~base a = _get_str base a")
quote(MLMLI,"\n\n(** {2 User Conversions} *)\n")
quote(MLMLI,"(** These functions are additions to or renaming of functions offered by the C library. *)\n")
quote(MLI,"val to_string : 'a tt -> string")
quote(MLI,"val to_float : 'a tt -> float")
quote(ML,"let to_string x = get_str 10 x")
quote(ML,"let to_float = get_d")
quote(MLI,"val of_string : string -> 'a tt")
quote(MLI,"val of_float : float -> 'a tt")
quote(MLI,"val of_int : int -> 'a tt")
quote(ML,"let of_string str = init_set_str str 10")
quote(ML,"let of_float = init_set_d")
quote(ML,"let of_int = init_set_si")
quote(ML,"\n(** {2 Pretty printing} *)\n")
quote(ML,"let print fmt x = Format.pp_print_string fmt (get_str 10 x)")
quote(MLMLI,"\n(** {2 Arithmetic Functions} *)")
quote(MLMLI,"(** {{:http://gmplib.org/manual/Integer-Arithmetic.html#Integer-Arithmetic}C documentation} *)\n")
quote(MLMLI,"(** The first parameter holds the result. *)\n")
void mpz_add (mpz_ptrm ROP, mpz_ptr OP1, mpz_ptr OP2);
void mpz_add_ui (mpz_ptrm ROP, mpz_ptr OP1, unsigned long int OP2);
void mpz_sub (mpz_ptrm ROP, mpz_ptr OP1, mpz_ptr OP2);
void mpz_sub_ui (mpz_ptrm ROP, mpz_ptr OP1, unsigned long int OP2);
void mpz_ui_sub (mpz_ptrm ROP, unsigned long int OP1, mpz_ptr OP2);
void mpz_mul (mpz_ptrm ROP, mpz_ptr OP1, mpz_ptr OP2);
void mpz_mul_si (mpz_ptrm ROP, mpz_ptr OP1, long int OP2);
void mpz_addmul (mpz_ptrm ROP, mpz_ptr OP1, mpz_ptr OP2);
void mpz_addmul_ui (mpz_ptrm ROP, mpz_ptr OP1, unsigned long int OP2);
void mpz_submul (mpz_ptrm ROP, mpz_ptr OP1, mpz_ptr OP2);
void mpz_submul_ui (mpz_ptrm ROP, mpz_ptr OP1, unsigned long int OP2);
void mpz_mul_2exp (mpz_ptrm ROP, mpz_ptr OP1, unsigned long int OP2);
void mpz_neg (mpz_ptrm ROP, mpz_ptr OP);
void mpz_abs (mpz_ptrm ROP, mpz_ptr OP);
quote(MLMLI,"\n(** {2 Division Functions} *)")
quote(MLMLI,"(** {{:http://gmplib.org/manual/Integer-Division.html#Integer-Division}C documentation} *)\n")
quote(MLMLI,"(** [c] stands for ceiling, [f] for floor, and [t] for truncate (rounds toward 0).*)")
quote(MLMLI,"(** {3 Ceiling division} *)\n")
quote(MLMLI,"(** The first parameter holds the quotient. *)")
void mpz_cdiv_q (mpz_ptrm Q, mpz_ptr N, mpz_ptr D);
quote(MLMLI,"(** The first parameter holds the remainder. *)")
void mpz_cdiv_r (mpz_ptrm R, mpz_ptr N, mpz_ptr D);
quote(MLMLI,"(** The two first parameters hold resp. the quotient and the remainder). *)")
void mpz_cdiv_qr (mpz_ptrm Q, mpz_ptrm R, mpz_ptr N, mpz_ptr D);
quote(MLMLI,"(** The first parameter holds the quotient. *)")
unsigned long int mpz_cdiv_q_ui (mpz_ptrm Q, mpz_ptr N, unsigned long int D);
quote(MLMLI,"(** The first parameter holds the remainder. *)")
unsigned long int mpz_cdiv_r_ui (mpz_ptrm R, mpz_ptr N, unsigned long int D);
quote(MLMLI,"(** The two first parameters hold resp. the quotient and the remainder). *)")
unsigned long int mpz_cdiv_qr_ui (mpz_ptrm Q, mpz_ptrm R, mpz_ptr N, unsigned long int D);
unsigned long int mpz_cdiv_ui (mpz_ptr N, unsigned long int D);
quote(MLMLI,"(** The first parameter holds the quotient. *)")
void mpz_cdiv_q_2exp (mpz_ptrm Q, mpz_ptr N, unsigned long int B);
quote(MLMLI,"(** The first parameter holds the remainder. *)")
void mpz_cdiv_r_2exp (mpz_ptrm R, mpz_ptr N, unsigned long int B);
quote(MLMLI,"(** {3 Floor division} *)\n")
void mpz_fdiv_q (mpz_ptrm Q, mpz_ptr N, mpz_ptr D);
void mpz_fdiv_r (mpz_ptrm R, mpz_ptr N, mpz_ptr D);
void mpz_fdiv_qr (mpz_ptrm Q, mpz_ptrm R, mpz_ptr N, mpz_ptr D);
unsigned long int mpz_fdiv_q_ui (mpz_ptrm Q, mpz_ptr N, unsigned long int D);
unsigned long int mpz_fdiv_r_ui (mpz_ptrm R, mpz_ptr N, unsigned long int D);
unsigned long int mpz_fdiv_qr_ui (mpz_ptrm Q, mpz_ptrm R, mpz_ptr N, unsigned long int D);
unsigned long int mpz_fdiv_ui (mpz_ptr N, unsigned long int D);
void mpz_fdiv_q_2exp (mpz_ptrm Q, mpz_ptr N, unsigned long int B);
void mpz_fdiv_r_2exp (mpz_ptrm R, mpz_ptr N, unsigned long int B);
quote(MLMLI,"(** {3 Truncate division} *)\n")
void mpz_tdiv_q (mpz_ptrm Q, mpz_ptr N, mpz_ptr D);
void mpz_tdiv_r (mpz_ptrm R, mpz_ptr N, mpz_ptr D);
void mpz_tdiv_qr (mpz_ptrm Q, mpz_ptrm R, mpz_ptr N, mpz_ptr D);
unsigned long int mpz_tdiv_q_ui (mpz_ptrm Q, mpz_ptr N, unsigned long int D);
unsigned long int mpz_tdiv_r_ui (mpz_ptrm R, mpz_ptr N, unsigned long int D);
unsigned long int mpz_tdiv_qr_ui (mpz_ptrm Q, mpz_ptrm R, mpz_ptr N, unsigned long int D);
unsigned long int mpz_tdiv_ui (mpz_ptr N, unsigned long int D);
void mpz_tdiv_q_2exp (mpz_ptrm Q, mpz_ptr N, unsigned long int B);
void mpz_tdiv_r_2exp (mpz_ptrm R, mpz_ptr N, unsigned long int B);
quote(MLMLI,"(** {3 Other division-related functions} *)\n")
void mpz_gmod (mpz_ptrm R, mpz_ptr N, mpz_ptr D)
quote(call,"mpz_mod(R,N,D);");
unsigned long int mpz_gmod_ui (mpz_ptrm R, mpz_ptr N, unsigned long int D)
quote(call,"_res = mpz_mod_ui(R,N,D);");
void mpz_divexact (mpz_ptrm Q, mpz_ptr N, mpz_ptr D);
void mpz_divexact_ui (mpz_ptrm Q, mpz_ptr N, unsigned long D);
boolean mpz_divisible_p (mpz_ptr N, mpz_ptr D);
boolean mpz_divisible_ui_p (mpz_ptr N, unsigned long int D);
boolean mpz_divisible_2exp_p (mpz_ptr N, unsigned long int B);
boolean mpz_congruent_p (mpz_ptr N, mpz_ptr C, mpz_ptr D);
boolean mpz_congruent_ui_p (mpz_ptr N, unsigned long int C, unsigned long int D);
boolean mpz_congruent_2exp_p (mpz_ptr N, mpz_ptr C, unsigned long int B);
quote(MLMLI,"\n(** {2 Exponentiation Functions} *)")
quote(MLMLI,"(** {{:http://gmplib.org/manual/Integer-Exponentiation.html#Integer-Exponentiation}C documentation} *)\n")
void mpz__powm (mpz_ptrm ROP, mpz_ptr BASE, mpz_ptr EXP, mpz_ptr MOD)
quote(call,"mpz_powm(ROP,BASE,EXP,MOD);");
void mpz__powm_ui (mpz_ptrm ROP, mpz_ptr BASE, unsigned long int EXP, mpz_ptr MOD)
quote(call,"mpz_powm_ui(ROP,BASE,EXP,MOD);");
quote(MLI,"\
val powm : t -> 'a tt -> 'b tt -> modulo:'c tt -> unit\n\
val powm_ui : t -> 'a tt -> int -> modulo:'b tt -> unit\n\
")
quote(ML,"\
let powm a b c ~modulo = _powm a b c modulo\n\
let powm_ui a b c ~modulo = _powm_ui a b c modulo\n\
")
void mpz_pow_ui (mpz_ptrm ROP, mpz_ptr BASE, unsigned long int EXP);
void mpz_ui_pow_ui (mpz_ptrm ROP, unsigned long int BASE,unsigned long int EXP);
quote(MLMLI,"\n(** {2 Root Extraction Functions} *)")
quote(MLMLI,"(** {{:http://gmplib.org/manual/Integer-Roots.html#Integer-Roots}C documentation} *)\n")
boolean mpz_root (mpz_ptrm ROP, mpz_ptr OP, unsigned long int N);
void mpz_sqrt (mpz_ptrm ROP, mpz_ptr OP);
void mpz__sqrtrem (mpz_ptrm ROP1, mpz_ptrm ROP2, mpz_ptr OP)
quote(call,"mpz_sqrtrem(ROP1,ROP2,OP);");
quote(MLI,"val sqrtrem : t -> remainder:t -> 'a tt -> unit")
quote(ML,"let sqrtrem a ~remainder b = _sqrtrem a remainder b")
boolean mpz_perfect_power_p (mpz_ptr OP);
boolean mpz_perfect_square_p (mpz_ptr OP);
quote(MLMLI,"\n(** {2 Number Theoretic Functions} *)")
quote(MLMLI,"(** {{:http://gmplib.org/manual/Number-Theoretic-Functions.html#Number-Theoretic-Functions}C documentation} *)\n")
int mpz_probab_prime_p (mpz_ptr N, int REPS);
void mpz_nextprime (mpz_ptrm ROP, mpz_ptr OP);
void mpz_gcd (mpz_ptrm ROP, mpz_ptr OP1, mpz_ptr OP2);
unsigned long int mpz_gcd_ui ([unique]mpz_ptrm* ROP, mpz_ptr OP1, unsigned long int OP2)
quote(call,"_res = mpz_gcd_ui(ROP ? *ROP : NULL,OP1,OP2);");
void mpz__gcdext (mpz_ptrm G, mpz_ptrm S, mpz_ptrm T, mpz_ptr A, mpz_ptr B)
quote(call,"mpz_gcdext(G,S,T,A,B);");
quote(MLI,"val gcdext : gcd:t -> alpha:t -> beta:t -> 'a tt -> 'b tt -> unit")
quote(ML,"let gcdext ~gcd ~alpha ~beta a b = _gcdext gcd alpha beta a b")
void mpz_lcm (mpz_ptrm ROP, mpz_ptr OP1, mpz_ptr OP2);
void mpz_lcm_ui (mpz_ptrm ROP, mpz_ptr OP1, unsigned long OP2);
boolean mpz_invert (mpz_ptrm ROP, mpz_ptr OP1, mpz_ptr OP2);
int mpz_jacobi (mpz_ptr A, mpz_ptr B);
int mpz_legendre (mpz_ptr A, mpz_ptr P);
int mpz_kronecker (mpz_ptr A, mpz_ptr B);
int mpz_kronecker_si (mpz_ptr A, long B);
int mpz_si_kronecker (long A, mpz_ptr B);
unsigned long int mpz_remove (mpz_ptrm ROP, mpz_ptr OP, mpz_ptr F);
void mpz_fac_ui (mpz_ptrm ROP, unsigned long int OP);
void mpz_bin_ui (mpz_ptrm ROP, mpz_ptr N, unsigned long int K);
void mpz_bin_uiui (mpz_ptrm ROP, unsigned long int N, unsigned long int K);
void mpz_fib_ui (mpz_ptrm FN, unsigned long int N);
void mpz_fib2_ui (mpz_ptrm FN, mpz_ptrm FNSUB1, unsigned long N);
void mpz_lucnum_ui (mpz_ptrm LN, unsigned long int N);
void mpz_lucnum2_ui (mpz_ptrm LN, mpz_ptrm LNSUB1, unsigned long int N);
quote(MLMLI,"\n(** {2 Comparison Functions} *)")
quote(MLMLI,"(** {{:http://gmplib.org/manual/Integer-Comparisons.html#Integer-Comparisons}C documentation} *)\n")
int mpz_cmp (mpz_ptr OP1, mpz_ptr OP2);
int mpz_cmp_d (mpz_ptr OP1, double OP2);
int mpz_cmp_si (mpz_ptr OP1, signed long int OP2);
int mpz_cmpabs (mpz_ptr OP1, mpz_ptr OP2);
int mpz_cmpabs_d (mpz_ptr OP1, double OP2);
int mpz_cmpabs_ui (mpz_ptr OP1, unsigned long int OP2);
int mpz_sgn (mpz_ptr OP);
quote(MLMLI,"\n(** {2 Logical and Bit Manipulation Functions} *)")
quote(MLMLI,"(** {{:http://gmplib.org/manual/Integer-Logic-and-Bit-Fiddling.html#Integer-Logic-and-Bit-Fiddling}C documentation} *)\n")
void mpz_gand (mpz_ptrm ROP, mpz_ptr OP1, mpz_ptr OP2)
quote(call,"mpz_and(ROP,OP1,OP2);");
void mpz_ior (mpz_ptrm ROP, mpz_ptr OP1, mpz_ptr OP2);
void mpz_xor (mpz_ptrm ROP, mpz_ptr OP1, mpz_ptr OP2);
void mpz_com (mpz_ptrm ROP, mpz_ptr OP);
unsigned long int mpz_popcount (mpz_ptr OP)
quote(call,"_res = mpz_popcount(OP); if (_res==ULONG_MAX) _res = Max_long;");
unsigned long int mpz_hamdist (mpz_ptr OP1, mpz_ptr OP2)
quote(call,"_res = mpz_hamdist(OP1,OP2); if (_res==ULONG_MAX) _res = Max_long;");
unsigned long int mpz_scan0 (mpz_ptr OP, unsigned long int STARTING_BIT)
quote(call,"_res = mpz_scan0(OP,STARTING_BIT); if (_res==ULONG_MAX) _res = Max_long;");
unsigned long int mpz_scan1 (mpz_ptr OP, unsigned long int STARTING_BIT)
quote(call,"_res = mpz_scan1(OP,STARTING_BIT); if (_res==ULONG_MAX) _res = Max_long;");
void mpz_setbit (mpz_ptrm ROP, unsigned long int BIT_INDEX);
void mpz_clrbit (mpz_ptrm ROP, unsigned long int BIT_INDEX);
boolean mpz_tstbit (mpz_ptr OP, unsigned long int BIT_INDEX);
quote(MLMLI,"\n(** {2 Input and Output Functions: not interfaced} *)\n")
quote(MLMLI,"\n(** {2 Random Number Functions: see {!Gmp_random} module} *)\n")
quote(MLMLI,"\n(** {2 Integer Import and Export Functions} *)")
quote(MLMLI,"(** {{:ttp://gmplib.org/manual/Integer-Import-and-Export.html#Integer-Import-and-Export}C documentation} *)\n")
void mpz__import (mpz_ptrm ROP, long COUNT, [size_is(COUNT),bigarray] int OP[], int ORDER, int ENDIAN)
quote(call,"mpz_import (ROP, COUNT, ORDER, sizeof(intnat), ENDIAN, 0, OP);");
[size_is(COUNT),bigarray,managed] int* mpz__export (mpz_ptr OP, int ORDER, int ENDIAN, [out,ignore]unsigned long *COUNT)
quote(call,"_res = mpz_export (NULL, COUNT, ORDER, sizeof(intnat), ENDIAN, 0, OP);");
quote(MLI,"\
val import : dest:t -> (int, Bigarray.int32_elt, Bigarray.c_layout) Bigarray.Array1.t -> order:int -> endian:int -> unit\n\
val export : 'a tt -> order:int -> endian:int -> (int, Bigarray.int32_elt, Bigarray.c_layout) Bigarray.Array1.t\n\
")
quote(ML,"\
let import ~dest array ~order ~endian = _import dest array order endian\n\
let export x ~order ~endian = _export x order endian\n\
")
quote(MLMLI,"\n(** {2 Miscellaneous Functions} *)")
quote(MLMLI,"(** {{:http://gmplib.org/manual/Miscellaneous-Integer-Functions.html#Miscellaneous-Integer-Functions}C documentation} *)\n")
quote(MLI,"\n(* Does it fit in an OCaml integer *)")
boolean mpz_fits_int_p (mpz_ptr OP);
boolean mpz_odd_p (mpz_ptr OP);
boolean mpz_even_p (mpz_ptr OP);
int mpz_size(mpz_ptr OP);
int mpz_sizeinbase (mpz_ptr OP, int BASE)
quote(call,"\
if (BASE<2 || BASE>36) caml_invalid_argument(\"Argument not supported\");\n\
_res = mpz_sizeinbase (OP,BASE);");
quote(MLI,"\n(* Limited relevance here *)")
boolean mpz_fits_ulong_p (mpz_ptr OP);
boolean mpz_fits_slong_p (mpz_ptr OP);
boolean mpz_fits_uint_p (mpz_ptr OP);
boolean mpz_fits_sint_p (mpz_ptr OP);
boolean mpz_fits_ushort_p (mpz_ptr OP);
boolean mpz_fits_sshort_p (mpz_ptr OP);