FIX BUILD (with GHC 6.2.x): System.Directory.Internals is no more
[ghc-hetmet.git] / rts / gmp / gmp.h
1 /* gmp.h -- Definitions for GNU multiple precision functions.
2
3 Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1999, 2000 Free Software
4 Foundation, Inc.
5
6 This file is part of the GNU MP Library.
7
8 The GNU MP Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or (at your
11 option) any later version.
12
13 The GNU MP Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
21 MA 02111-1307, USA. */
22
23 #ifndef __GMP_H__
24
25 #ifndef __GNU_MP__              /* to allow inclusion of both gmp.h and mp.h */
26 #define __GNU_MP__ 2
27 #define __need_size_t
28 #include <stddef.h>
29 #undef __need_size_t
30
31 #ifndef STG_H
32 /* Get DLL_IMPORT */
33 #include "../../includes/ghcconfig.h"
34 #include "../../includes/StgDLL.h"
35 #endif
36
37 #if defined (__mips) && defined (_ABIN32)
38 /* Force the use of 64-bit limbs for all 64-bit MIPS CPUs if ABI permits.  */
39 #define _LONG_LONG_LIMB
40 #endif
41
42 #if (__STDC__-0) || defined (__cplusplus)
43 #define __gmp_const const
44 #define __gmp_signed signed
45 #else
46 #define __gmp_const
47 #define __gmp_signed
48 #endif
49
50 #if defined (__GNUC__)
51 #define __gmp_inline __inline__
52 #else
53 #define __gmp_inline
54 #endif
55
56 #ifndef _EXTERN_INLINE
57 #ifdef __GNUC__
58 #define _EXTERN_INLINE extern __inline__
59 #else
60 #define _EXTERN_INLINE static
61 #endif
62 #endif
63
64 #ifdef _SHORT_LIMB
65 typedef unsigned int            mp_limb_t;
66 typedef int                     mp_limb_signed_t;
67 #else
68 #ifdef _LONG_LONG_LIMB
69 typedef unsigned long long int  mp_limb_t;
70 typedef long long int           mp_limb_signed_t;
71 #else
72 typedef unsigned long int       mp_limb_t;
73 typedef long int                mp_limb_signed_t;
74 #endif
75 #endif
76
77 typedef mp_limb_t *             mp_ptr;
78 typedef __gmp_const mp_limb_t * mp_srcptr;
79 #if defined (_CRAY) && ! defined (_CRAYMPP)
80 /* plain `int' is much faster (48 bits) */
81 typedef int                     mp_size_t;
82 typedef int                     mp_exp_t;
83 #else
84 typedef long int                mp_size_t;
85 typedef long int                mp_exp_t;
86 #endif
87
88 typedef struct
89 {
90   int _mp_alloc;                /* Number of *limbs* allocated and pointed
91                                    to by the _mp_d field.  */
92   int _mp_size;                 /* abs(_mp_size) is the number of limbs the
93                                    last field points to.  If _mp_size is
94                                    negative this is a negative number.  */
95   mp_limb_t *_mp_d;             /* Pointer to the limbs.  */
96 } __mpz_struct;
97 #endif /* __GNU_MP__ */
98
99 typedef __mpz_struct MP_INT;
100 typedef __mpz_struct mpz_t[1];
101
102 typedef struct
103 {
104   __mpz_struct _mp_num;
105   __mpz_struct _mp_den;
106 } __mpq_struct;
107
108 typedef __mpq_struct MP_RAT;
109 typedef __mpq_struct mpq_t[1];
110
111 typedef struct
112 {
113   int _mp_prec;                 /* Max precision, in number of `mp_limb_t's.
114                                    Set by mpf_init and modified by
115                                    mpf_set_prec.  The area pointed to by the
116                                    _mp_d field contains `prec' + 1 limbs.  */
117   int _mp_size;                 /* abs(_mp_size) is the number of limbs the
118                                    last field points to.  If _mp_size is
119                                    negative this is a negative number.  */
120   mp_exp_t _mp_exp;             /* Exponent, in the base of `mp_limb_t'.  */
121   mp_limb_t *_mp_d;             /* Pointer to the limbs.  */
122 } __mpf_struct;
123
124 /* typedef __mpf_struct MP_FLOAT; */
125 typedef __mpf_struct mpf_t[1];
126
127 /* Available random number generation algorithms.  */
128 typedef enum
129 {
130   GMP_RAND_ALG_DEFAULT = 0,
131   GMP_RAND_ALG_LC = GMP_RAND_ALG_DEFAULT /* Linear congruential.  */
132 } gmp_randalg_t;
133
134 /* Linear congruential data struct.  */
135 typedef struct {
136   mpz_t a;                      /* Multiplier. */
137   unsigned long int c;          /* Adder. */
138   mpz_t m;                      /* Modulus (valid only if m2exp == 0).  */
139   unsigned long int m2exp;      /* If != 0, modulus is 2 ^ m2exp.  */
140 } __gmp_randata_lc;
141
142 /* Random state struct.  */
143 typedef struct
144 {
145   mpz_t seed;                   /* Current seed.  */
146   gmp_randalg_t alg;            /* Algorithm used.  */
147   union {                       /* Algorithm specific data.  */
148     __gmp_randata_lc *lc;       /* Linear congruential.  */
149   } algdata;
150 } __gmp_randstate_struct;
151 typedef __gmp_randstate_struct gmp_randstate_t[1];
152
153 /* Types for function declarations in gmp files.  */
154 /* ??? Should not pollute user name space with these ??? */
155 typedef __gmp_const __mpz_struct *mpz_srcptr;
156 typedef __mpz_struct *mpz_ptr;
157 typedef __gmp_const __mpf_struct *mpf_srcptr;
158 typedef __mpf_struct *mpf_ptr;
159 typedef __gmp_const __mpq_struct *mpq_srcptr;
160 typedef __mpq_struct *mpq_ptr;
161
162 #ifndef _PROTO
163 #if (__STDC__-0) || defined (__cplusplus)
164 #define _PROTO(x) x
165 #else
166 #define _PROTO(x) ()
167 #endif
168 #endif
169
170 #ifndef __MPN
171 /* Really use `defined (__STDC__)' here; we want it to be true for Sun C */
172 #if defined (__STDC__) || defined (__cplusplus)
173 #define __MPN(x) __gmpn_##x
174 #else
175 #define __MPN(x) __gmpn_/**/x
176 #endif
177 #endif
178
179 #if defined (FILE) || defined (H_STDIO) || defined (_H_STDIO) \
180  || defined (_STDIO_H) || defined (_STDIO_H_) || defined (__STDIO_H__) \
181  || defined (_STDIO_INCLUDED) || defined (__dj_include_stdio_h_)
182 #define _GMP_H_HAVE_FILE 1
183 #endif
184
185 #if defined (__cplusplus)
186 extern "C" {
187 #endif
188
189 #define mp_set_memory_functions __gmp_set_memory_functions
190 DLL_IMPORT void mp_set_memory_functions _PROTO ((void *(*) (size_t),
191                                       void *(*) (void *, size_t, size_t),
192                                       void (*) (void *, size_t)));
193
194 #define mp_bits_per_limb __gmp_bits_per_limb
195 DLL_IMPORT extern __gmp_const int mp_bits_per_limb;
196
197 #if defined (__cplusplus)
198 }
199 #endif
200
201
202 /**************** Random number routines.  ****************/
203
204 #define _gmp_rand __gmp_rand
205 #define gmp_randinit __gmp_randinit
206 #define gmp_randinit_lc __gmp_randinit_lc
207 #define gmp_randinit_lc_2exp __gmp_randinit_lc_2exp
208 #define gmp_randseed __gmp_randseed
209 #define gmp_randseed_ui __gmp_randseed_ui
210 #define gmp_randclear __gmp_randclear
211
212 #if defined (__cplusplus)
213 extern "C" {
214 #endif
215
216 DLL_IMPORT void _gmp_rand _PROTO ((mp_ptr, gmp_randstate_t, unsigned long int));
217 DLL_IMPORT void gmp_randinit _PROTO ((gmp_randstate_t, gmp_randalg_t, ...));
218 DLL_IMPORT void gmp_randinit_lc _PROTO ((gmp_randstate_t, mpz_t, unsigned long int,
219                               mpz_t));
220 DLL_IMPORT void gmp_randinit_lc_2exp _PROTO ((gmp_randstate_t, mpz_t, unsigned long int,
221                                    unsigned long int));
222 DLL_IMPORT void gmp_randseed _PROTO ((gmp_randstate_t, mpz_t));
223 DLL_IMPORT void gmp_randseed_ui _PROTO ((gmp_randstate_t, unsigned long int));
224 DLL_IMPORT void gmp_randclear _PROTO ((gmp_randstate_t));
225
226 #if defined (__cplusplus)
227 }
228 #endif
229
230 /**************** Integer (i.e. Z) routines.  ****************/
231
232 #define _mpz_realloc __gmpz_realloc
233 #define mpz_realloc __gmpz_realloc
234 #define mpz_abs __gmpz_abs
235 #define mpz_add __gmpz_add
236 #define mpz_add_ui __gmpz_add_ui
237 #define mpz_addmul_ui __gmpz_addmul_ui
238 #define mpz_and __gmpz_and
239 #define mpz_array_init __gmpz_array_init
240 #define mpz_bin_ui __gmpz_bin_ui
241 #define mpz_bin_uiui __gmpz_bin_uiui
242 #define mpz_cdiv_q __gmpz_cdiv_q
243 #define mpz_cdiv_q_ui __gmpz_cdiv_q_ui
244 #define mpz_cdiv_qr __gmpz_cdiv_qr
245 #define mpz_cdiv_qr_ui __gmpz_cdiv_qr_ui
246 #define mpz_cdiv_r __gmpz_cdiv_r
247 #define mpz_cdiv_r_ui __gmpz_cdiv_r_ui
248 #define mpz_cdiv_ui __gmpz_cdiv_ui
249 #define mpz_clear __gmpz_clear
250 #define mpz_clrbit __gmpz_clrbit
251 #define mpz_cmp __gmpz_cmp
252 #define _mpz_cmp_si __gmpz_cmp_si
253 #define _mpz_cmp_ui __gmpz_cmp_ui
254 #define mpz_cmpabs __gmpz_cmpabs
255 #define mpz_cmpabs_ui __gmpz_cmpabs_ui
256 #define mpz_com __gmpz_com
257 #define mpz_divexact __gmpz_divexact
258 #define mpz_dump __gmpz_dump
259 #define mpz_fac_ui __gmpz_fac_ui
260 #define mpz_fdiv_q __gmpz_fdiv_q
261 #define mpz_fdiv_q_2exp __gmpz_fdiv_q_2exp
262 #define mpz_fdiv_q_ui __gmpz_fdiv_q_ui
263 #define mpz_fdiv_qr __gmpz_fdiv_qr
264 #define mpz_fdiv_qr_ui __gmpz_fdiv_qr_ui
265 #define mpz_fdiv_r __gmpz_fdiv_r
266 #define mpz_fdiv_r_2exp __gmpz_fdiv_r_2exp
267 #define mpz_fdiv_r_ui __gmpz_fdiv_r_ui
268 #define mpz_fdiv_ui __gmpz_fdiv_ui
269 #define mpz_fib_ui __gmpz_fib_ui
270 #define mpz_fits_sint_p __gmpz_fits_sint_p
271 #define mpz_fits_slong_p __gmpz_fits_slong_p
272 #define mpz_fits_sshort_p __gmpz_fits_sshort_p
273 #define mpz_fits_uint_p __gmpz_fits_uint_p
274 #define mpz_fits_ulong_p __gmpz_fits_ulong_p
275 #define mpz_fits_ushort_p __gmpz_fits_ushort_p
276 #define mpz_gcd __gmpz_gcd
277 #define mpz_gcd_ui __gmpz_gcd_ui
278 #define mpz_gcdext __gmpz_gcdext
279 #define mpz_get_d __gmpz_get_d
280 #define mpz_get_si __gmpz_get_si
281 #define mpz_get_str __gmpz_get_str
282 #define mpz_get_ui __gmpz_get_ui
283 #define mpz_getlimbn __gmpz_getlimbn
284 #define mpz_hamdist __gmpz_hamdist
285 #define mpz_init __gmpz_init
286 #define mpz_inp_binary __gmpz_inp_binary
287 #define mpz_inp_raw __gmpz_inp_raw
288 #define mpz_inp_str __gmpz_inp_str
289 #define mpz_init_set __gmpz_init_set
290 #define mpz_init_set_d __gmpz_init_set_d
291 #define mpz_init_set_si __gmpz_init_set_si
292 #define mpz_init_set_str __gmpz_init_set_str
293 #define mpz_init_set_ui __gmpz_init_set_ui
294 #define mpz_invert __gmpz_invert
295 #define mpz_ior __gmpz_ior
296 #define mpz_jacobi __gmpz_jacobi
297 #define mpz_lcm __gmpz_lcm
298 #define mpz_legendre __gmpz_legendre
299 #define mpz_mod __gmpz_mod
300 #define mpz_mul __gmpz_mul
301 #define mpz_mul_2exp __gmpz_mul_2exp
302 #define mpz_neg __gmpz_neg
303 #define mpz_nextprime __gmpz_nextprime
304 #define mpz_out_binary __gmpz_out_binary
305 #define mpz_out_raw __gmpz_out_raw
306 #define mpz_out_str __gmpz_out_str
307 #define mpz_perfect_power_p __gmpz_perfect_power_p
308 #define mpz_perfect_square_p __gmpz_perfect_square_p
309 #define mpz_popcount __gmpz_popcount
310 #define mpz_pow_ui __gmpz_pow_ui
311 #define mpz_powm __gmpz_powm
312 #define mpz_powm_ui __gmpz_powm_ui
313 #define mpz_probab_prime_p __gmpz_probab_prime_p
314 #define mpz_random __gmpz_random
315 #define mpz_random2 __gmpz_random2
316 #define mpz_remove __gmpz_remove
317 #define mpz_root __gmpz_root
318 #define mpz_rrandomb __gmpz_rrandomb
319 #define mpz_scan0 __gmpz_scan0
320 #define mpz_scan1 __gmpz_scan1
321 #define mpz_set __gmpz_set
322 #define mpz_set_d __gmpz_set_d
323 #define mpz_set_f __gmpz_set_f
324 #define mpz_set_q __gmpz_set_q
325 #define mpz_set_si __gmpz_set_si
326 #define mpz_set_str __gmpz_set_str
327 #define mpz_set_ui __gmpz_set_ui
328 #define mpz_setbit __gmpz_setbit
329 #define mpz_size __gmpz_size
330 #define mpz_sizeinbase __gmpz_sizeinbase
331 #define mpz_sqrt __gmpz_sqrt
332 #define mpz_sqrtrem __gmpz_sqrtrem
333 #define mpz_sub __gmpz_sub
334 #define mpz_sub_ui __gmpz_sub_ui
335 #define mpz_swap __gmpz_swap
336 #define mpz_tdiv_ui __gmpz_tdiv_ui
337 #define mpz_tdiv_q __gmpz_tdiv_q
338 #define mpz_tdiv_q_2exp __gmpz_tdiv_q_2exp
339 #define mpz_tdiv_q_ui __gmpz_tdiv_q_ui
340 #define mpz_tdiv_qr __gmpz_tdiv_qr
341 #define mpz_tdiv_qr_ui __gmpz_tdiv_qr_ui
342 #define mpz_tdiv_r __gmpz_tdiv_r
343 #define mpz_tdiv_r_2exp __gmpz_tdiv_r_2exp
344 #define mpz_tdiv_r_ui __gmpz_tdiv_r_ui
345 #define mpz_tstbit __gmpz_tstbit
346 #define mpz_ui_pow_ui __gmpz_ui_pow_ui
347 #define mpz_urandomb __gmpz_urandomb
348 #define mpz_urandomm __gmpz_urandomm
349 #define mpz_xor __gmpz_xor
350 #define mpz_eor __gmpz_xor
351
352 #if defined (__cplusplus)
353 extern "C" {
354 #endif
355 DLL_IMPORT void *_mpz_realloc _PROTO ((mpz_ptr, mp_size_t));
356
357 DLL_IMPORT void mpz_abs _PROTO ((mpz_ptr, mpz_srcptr));
358 DLL_IMPORT void mpz_add _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
359 DLL_IMPORT void mpz_add_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
360 DLL_IMPORT void mpz_addmul_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
361 DLL_IMPORT void mpz_and _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
362 DLL_IMPORT void mpz_array_init _PROTO ((mpz_ptr, mp_size_t, mp_size_t));
363 DLL_IMPORT void mpz_bin_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
364 DLL_IMPORT void mpz_bin_uiui _PROTO ((mpz_ptr, unsigned long int, unsigned long int));
365 DLL_IMPORT void mpz_cdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
366 DLL_IMPORT unsigned long int mpz_cdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
367 DLL_IMPORT void mpz_cdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
368 DLL_IMPORT unsigned long int mpz_cdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int));
369 DLL_IMPORT void mpz_cdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
370 DLL_IMPORT unsigned long int mpz_cdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
371 DLL_IMPORT unsigned long int mpz_cdiv_ui _PROTO ((mpz_srcptr, unsigned long int));
372 DLL_IMPORT void mpz_clear _PROTO ((mpz_ptr));
373 DLL_IMPORT void mpz_clrbit _PROTO ((mpz_ptr, unsigned long int));
374 DLL_IMPORT int mpz_cmp _PROTO ((mpz_srcptr, mpz_srcptr));
375 DLL_IMPORT int _mpz_cmp_si _PROTO ((mpz_srcptr, signed long int));
376 DLL_IMPORT int _mpz_cmp_ui _PROTO ((mpz_srcptr, unsigned long int));
377 DLL_IMPORT int mpz_cmpabs _PROTO ((mpz_srcptr, mpz_srcptr));
378 DLL_IMPORT int mpz_cmpabs_ui _PROTO ((mpz_srcptr, unsigned long int));
379 DLL_IMPORT void mpz_com _PROTO ((mpz_ptr, mpz_srcptr));
380 DLL_IMPORT void mpz_divexact _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
381 DLL_IMPORT void mpz_dump _PROTO ((mpz_srcptr));
382 DLL_IMPORT void mpz_fac_ui _PROTO ((mpz_ptr, unsigned long int));
383 DLL_IMPORT void mpz_fdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
384 DLL_IMPORT void mpz_fdiv_q_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
385 DLL_IMPORT unsigned long int mpz_fdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
386 DLL_IMPORT void mpz_fdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
387 DLL_IMPORT unsigned long int mpz_fdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int));
388 DLL_IMPORT void mpz_fdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
389 DLL_IMPORT void mpz_fdiv_r_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
390 DLL_IMPORT unsigned long int mpz_fdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
391 DLL_IMPORT unsigned long int mpz_fdiv_ui _PROTO ((mpz_srcptr, unsigned long int));
392 DLL_IMPORT void mpz_fib_ui _PROTO ((mpz_ptr, unsigned long int));
393 DLL_IMPORT int mpz_fits_sint_p _PROTO ((mpz_srcptr));
394 DLL_IMPORT int mpz_fits_slong_p _PROTO ((mpz_srcptr));
395 DLL_IMPORT int mpz_fits_sshort_p _PROTO ((mpz_srcptr));
396 DLL_IMPORT int mpz_fits_uint_p _PROTO ((mpz_srcptr));
397 DLL_IMPORT int mpz_fits_ulong_p _PROTO ((mpz_srcptr));
398 DLL_IMPORT int mpz_fits_ushort_p _PROTO ((mpz_srcptr));
399 DLL_IMPORT void mpz_gcd _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
400 DLL_IMPORT unsigned long int mpz_gcd_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
401 DLL_IMPORT void mpz_gcdext _PROTO ((mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
402 DLL_IMPORT double mpz_get_d _PROTO ((mpz_srcptr));
403 /* signed */ long int mpz_get_si _PROTO ((mpz_srcptr));
404 DLL_IMPORT char *mpz_get_str _PROTO ((char *, int, mpz_srcptr));
405 DLL_IMPORT unsigned long int mpz_get_ui _PROTO ((mpz_srcptr));
406 DLL_IMPORT mp_limb_t mpz_getlimbn _PROTO ((mpz_srcptr, mp_size_t));
407 DLL_IMPORT unsigned long int mpz_hamdist _PROTO ((mpz_srcptr, mpz_srcptr));
408 DLL_IMPORT void mpz_init _PROTO ((mpz_ptr));
409 #ifdef _GMP_H_HAVE_FILE
410 DLL_IMPORT size_t mpz_inp_binary _PROTO ((mpz_ptr, FILE *));
411 DLL_IMPORT size_t mpz_inp_raw _PROTO ((mpz_ptr, FILE *));
412 DLL_IMPORT size_t mpz_inp_str _PROTO ((mpz_ptr, FILE *, int));
413 #endif
414 DLL_IMPORT void mpz_init_set _PROTO ((mpz_ptr, mpz_srcptr));
415 DLL_IMPORT void mpz_init_set_d _PROTO ((mpz_ptr, double));
416 DLL_IMPORT void mpz_init_set_si _PROTO ((mpz_ptr, signed long int));
417 DLL_IMPORT int mpz_init_set_str _PROTO ((mpz_ptr, __gmp_const char *, int));
418 DLL_IMPORT void mpz_init_set_ui _PROTO ((mpz_ptr, unsigned long int));
419 DLL_IMPORT int mpz_invert _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
420 DLL_IMPORT void mpz_ior _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
421 DLL_IMPORT int mpz_jacobi _PROTO ((mpz_srcptr, mpz_srcptr));
422
423 #define mpz_kronecker_si __gmpz_kronecker_si
424 DLL_IMPORT int mpz_kronecker_si _PROTO ((mpz_srcptr, long));
425
426 #define mpz_kronecker_ui __gmpz_kronecker_ui
427 DLL_IMPORT int mpz_kronecker_ui _PROTO ((mpz_srcptr, unsigned long));
428
429 #define mpz_si_kronecker __gmpz_si_kronecker
430 DLL_IMPORT int mpz_si_kronecker _PROTO ((long, mpz_srcptr));
431
432 #define mpz_ui_kronecker __gmpz_ui_kronecker
433 DLL_IMPORT int mpz_ui_kronecker _PROTO ((unsigned long, mpz_srcptr));
434
435 DLL_IMPORT void mpz_lcm _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
436 DLL_IMPORT int mpz_legendre _PROTO ((mpz_srcptr, mpz_srcptr));
437 DLL_IMPORT void mpz_mod _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
438 DLL_IMPORT void mpz_mul _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
439 DLL_IMPORT void mpz_mul_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
440
441 #define mpz_mul_si __gmpz_mul_si
442 DLL_IMPORT void mpz_mul_si _PROTO ((mpz_ptr, mpz_srcptr, long int));
443
444 #define mpz_mul_ui __gmpz_mul_ui
445 DLL_IMPORT void mpz_mul_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
446
447 DLL_IMPORT void mpz_neg _PROTO ((mpz_ptr, mpz_srcptr));
448 DLL_IMPORT void mpz_nextprime _PROTO ((mpz_ptr, mpz_srcptr));
449 #ifdef _GMP_H_HAVE_FILE
450 DLL_IMPORT size_t mpz_out_binary _PROTO ((FILE *, mpz_srcptr));
451 DLL_IMPORT size_t mpz_out_raw _PROTO ((FILE *, mpz_srcptr));
452 DLL_IMPORT size_t mpz_out_str _PROTO ((FILE *, int, mpz_srcptr));
453 #endif
454 DLL_IMPORT int mpz_perfect_power_p _PROTO ((mpz_srcptr));
455 DLL_IMPORT int mpz_perfect_square_p _PROTO ((mpz_srcptr));
456 DLL_IMPORT unsigned long int mpz_popcount _PROTO ((mpz_srcptr));
457 DLL_IMPORT void mpz_pow_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
458 DLL_IMPORT void mpz_powm _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr));
459 DLL_IMPORT void mpz_powm_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int, mpz_srcptr));
460 DLL_IMPORT int mpz_probab_prime_p _PROTO ((mpz_srcptr, int));
461 DLL_IMPORT void mpz_random _PROTO ((mpz_ptr, mp_size_t));
462 DLL_IMPORT void mpz_random2 _PROTO ((mpz_ptr, mp_size_t));
463 DLL_IMPORT unsigned long int mpz_remove _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
464 DLL_IMPORT int mpz_root _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
465 DLL_IMPORT void mpz_rrandomb _PROTO ((mpz_ptr, gmp_randstate_t, unsigned long int));
466 DLL_IMPORT unsigned long int mpz_scan0 _PROTO ((mpz_srcptr, unsigned long int));
467 DLL_IMPORT unsigned long int mpz_scan1 _PROTO ((mpz_srcptr, unsigned long int));
468 DLL_IMPORT void mpz_set _PROTO ((mpz_ptr, mpz_srcptr));
469 DLL_IMPORT void mpz_set_d _PROTO ((mpz_ptr, double));
470 DLL_IMPORT void mpz_set_f _PROTO ((mpz_ptr, mpf_srcptr));
471 DLL_IMPORT void mpz_set_q _PROTO ((mpz_ptr, mpq_srcptr));
472 DLL_IMPORT void mpz_set_si _PROTO ((mpz_ptr, signed long int));
473 DLL_IMPORT int mpz_set_str _PROTO ((mpz_ptr, __gmp_const char *, int));
474 DLL_IMPORT void mpz_set_ui _PROTO ((mpz_ptr, unsigned long int));
475 DLL_IMPORT void mpz_setbit _PROTO ((mpz_ptr, unsigned long int));
476 DLL_IMPORT size_t mpz_size _PROTO ((mpz_srcptr));
477 DLL_IMPORT size_t mpz_sizeinbase _PROTO ((mpz_srcptr, int));
478 DLL_IMPORT void mpz_sqrt _PROTO ((mpz_ptr, mpz_srcptr));
479 DLL_IMPORT void mpz_sqrtrem _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr));
480 DLL_IMPORT void mpz_sub _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
481 DLL_IMPORT void mpz_sub_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
482 DLL_IMPORT void mpz_swap _PROTO ((mpz_ptr, mpz_ptr));
483 DLL_IMPORT void mpz_tdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
484 DLL_IMPORT void mpz_tdiv_q_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
485 DLL_IMPORT unsigned long int mpz_tdiv_ui _PROTO ((mpz_srcptr, unsigned long int));
486 DLL_IMPORT unsigned long int mpz_tdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
487 DLL_IMPORT void mpz_tdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
488 DLL_IMPORT unsigned long int mpz_tdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int));
489 DLL_IMPORT void mpz_tdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
490 DLL_IMPORT void mpz_tdiv_r_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
491 DLL_IMPORT unsigned long int mpz_tdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
492 DLL_IMPORT int mpz_tstbit _PROTO ((mpz_srcptr, unsigned long int));
493 DLL_IMPORT void mpz_ui_pow_ui _PROTO ((mpz_ptr, unsigned long int, unsigned long int));
494 DLL_IMPORT void mpz_urandomb _PROTO ((mpz_t, gmp_randstate_t, unsigned long int));
495 DLL_IMPORT void mpz_urandomm _PROTO ((mpz_t, gmp_randstate_t, mpz_t));
496 DLL_IMPORT void mpz_xor _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
497 #if defined (__cplusplus)
498 }
499 #endif
500
501 /**************** Rational (i.e. Q) routines.  ****************/
502
503 #define mpq_init __gmpq_init
504 #define mpq_clear __gmpq_clear
505 #define mpq_set __gmpq_set
506 #define mpq_set_ui __gmpq_set_ui
507 #define mpq_set_si __gmpq_set_si
508 #define mpq_set_z __gmpq_set_z
509 #define mpq_add __gmpq_add
510 #define mpq_sub __gmpq_sub
511 #define mpq_mul __gmpq_mul
512 #define mpq_div __gmpq_div
513 #define mpq_neg __gmpq_neg
514 #define mpq_cmp __gmpq_cmp
515 #define _mpq_cmp_ui __gmpq_cmp_ui
516 #define mpq_equal __gmpq_equal
517 #define mpq_inv __gmpq_inv
518 #define mpq_set_num __gmpq_set_num
519 #define mpq_set_den __gmpq_set_den
520 #define mpq_get_num __gmpq_get_num
521 #define mpq_get_den __gmpq_get_den
522 #define mpq_get_d __gmpq_get_d
523 #define mpq_set_d __gmpq_set_d
524 #define mpq_canonicalize __gmpq_canonicalize
525
526 #if defined (__cplusplus)
527 extern "C" {
528 #endif
529 DLL_IMPORT void mpq_init _PROTO ((mpq_ptr));
530 DLL_IMPORT void mpq_clear _PROTO ((mpq_ptr));
531 DLL_IMPORT void mpq_set _PROTO ((mpq_ptr, mpq_srcptr));
532 DLL_IMPORT void mpq_set_ui _PROTO ((mpq_ptr, unsigned long int, unsigned long int));
533 DLL_IMPORT void mpq_set_si _PROTO ((mpq_ptr, signed long int, unsigned long int));
534 DLL_IMPORT void mpq_set_z _PROTO ((mpq_ptr, mpz_srcptr));
535 DLL_IMPORT void mpq_add _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
536 DLL_IMPORT void mpq_sub _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
537 DLL_IMPORT void mpq_mul _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
538 DLL_IMPORT void mpq_div _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
539 DLL_IMPORT void mpq_neg _PROTO ((mpq_ptr, mpq_srcptr));
540 DLL_IMPORT int mpq_cmp _PROTO ((mpq_srcptr, mpq_srcptr));
541 DLL_IMPORT int _mpq_cmp_ui _PROTO ((mpq_srcptr, unsigned long int, unsigned long int));
542 DLL_IMPORT int mpq_equal _PROTO ((mpq_srcptr, mpq_srcptr));
543 DLL_IMPORT void mpq_inv _PROTO ((mpq_ptr, mpq_srcptr));
544 DLL_IMPORT void mpq_set_num _PROTO ((mpq_ptr, mpz_srcptr));
545 DLL_IMPORT void mpq_set_den _PROTO ((mpq_ptr, mpz_srcptr));
546 DLL_IMPORT void mpq_get_num _PROTO ((mpz_ptr, mpq_srcptr));
547 DLL_IMPORT void mpq_get_den _PROTO ((mpz_ptr, mpq_srcptr));
548 DLL_IMPORT double mpq_get_d _PROTO ((mpq_srcptr));
549 DLL_IMPORT void mpq_set_d _PROTO ((mpq_ptr, double));
550 DLL_IMPORT void mpq_canonicalize _PROTO ((mpq_ptr));
551
552 #define mpq_swap __gmpq_swap
553 DLL_IMPORT void mpq_swap _PROTO ((mpq_ptr, mpq_ptr));
554
555 #ifdef _GMP_H_HAVE_FILE
556 #define mpq_out_str __gmpq_out_str
557 DLL_IMPORT size_t mpq_out_str _PROTO ((FILE *, int, mpq_srcptr));
558 #endif
559
560 #if defined (__cplusplus)
561 }
562 #endif
563
564 /**************** Float (i.e. F) routines.  ****************/
565
566 #define mpf_abs __gmpf_abs
567 #define mpf_add __gmpf_add
568 #define mpf_add_ui __gmpf_add_ui
569 #define mpf_ceil __gmpf_ceil
570 #define mpf_clear __gmpf_clear
571 #define mpf_cmp __gmpf_cmp
572 #define mpf_cmp_si __gmpf_cmp_si
573 #define mpf_cmp_ui __gmpf_cmp_ui
574 #define mpf_div __gmpf_div
575 #define mpf_div_2exp __gmpf_div_2exp
576 #define mpf_div_ui __gmpf_div_ui
577 #define mpf_dump __gmpf_dump
578 #define mpf_floor __gmpf_floor
579 #define mpf_eq __gmpf_eq
580 #define mpf_get_d __gmpf_get_d
581 #define mpf_get_prec __gmpf_get_prec
582 #define mpf_get_str __gmpf_get_str
583 #define mpf_init __gmpf_init
584 #define mpf_init2 __gmpf_init2
585 #define mpf_inp_str __gmpf_inp_str
586 #define mpf_init_set __gmpf_init_set
587 #define mpf_init_set_d __gmpf_init_set_d
588 #define mpf_init_set_si __gmpf_init_set_si
589 #define mpf_init_set_str __gmpf_init_set_str
590 #define mpf_init_set_ui __gmpf_init_set_ui
591 #define mpf_mul __gmpf_mul
592 #define mpf_mul_2exp __gmpf_mul_2exp
593 #define mpf_mul_ui __gmpf_mul_ui
594 #define mpf_neg __gmpf_neg
595 #define mpf_out_str __gmpf_out_str
596 #define mpf_pow_ui __gmpf_pow_ui
597 #define mpf_random2 __gmpf_random2
598 #define mpf_reldiff __gmpf_reldiff
599 #define mpf_set __gmpf_set
600 #define mpf_set_d __gmpf_set_d
601 #define mpf_set_default_prec __gmpf_set_default_prec
602 #define mpf_set_prec __gmpf_set_prec
603 #define mpf_set_prec_raw __gmpf_set_prec_raw
604 #define mpf_set_q __gmpf_set_q
605 #define mpf_set_si __gmpf_set_si
606 #define mpf_set_str __gmpf_set_str
607 #define mpf_set_ui __gmpf_set_ui
608 #define mpf_set_z __gmpf_set_z
609 #define mpf_size __gmpf_size
610 #define mpf_sqrt __gmpf_sqrt
611 #define mpf_sqrt_ui __gmpf_sqrt_ui
612 #define mpf_sub __gmpf_sub
613 #define mpf_sub_ui __gmpf_sub_ui
614 #define mpf_trunc __gmpf_trunc
615 #define mpf_ui_div __gmpf_ui_div
616 #define mpf_ui_sub __gmpf_ui_sub
617 #define mpf_urandomb __gmpf_urandomb
618
619 #if defined (__cplusplus)
620 extern "C" {
621 #endif
622 DLL_IMPORT void mpf_abs _PROTO ((mpf_ptr, mpf_srcptr));
623 DLL_IMPORT void mpf_add _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
624 DLL_IMPORT void mpf_add_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
625 DLL_IMPORT void mpf_ceil _PROTO ((mpf_ptr, mpf_srcptr));
626 DLL_IMPORT void mpf_clear _PROTO ((mpf_ptr));
627 DLL_IMPORT int mpf_cmp _PROTO ((mpf_srcptr, mpf_srcptr));
628 DLL_IMPORT int mpf_cmp_si _PROTO ((mpf_srcptr, signed long int));
629 DLL_IMPORT int mpf_cmp_ui _PROTO ((mpf_srcptr, unsigned long int));
630 DLL_IMPORT void mpf_div _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
631 DLL_IMPORT void mpf_div_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
632 DLL_IMPORT void mpf_div_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
633 DLL_IMPORT void mpf_dump _PROTO ((mpf_srcptr));
634 DLL_IMPORT int mpf_eq _PROTO ((mpf_srcptr, mpf_srcptr, unsigned long int));
635 DLL_IMPORT void mpf_floor _PROTO ((mpf_ptr, mpf_srcptr));
636 DLL_IMPORT double mpf_get_d _PROTO ((mpf_srcptr));
637 DLL_IMPORT unsigned long int mpf_get_prec _PROTO ((mpf_srcptr));
638 char *mpf_get_str _PROTO ((char *, mp_exp_t *, int, size_t, mpf_srcptr));
639 DLL_IMPORT void mpf_init _PROTO ((mpf_ptr));
640 DLL_IMPORT void mpf_init2 _PROTO ((mpf_ptr, unsigned long int));
641 #ifdef _GMP_H_HAVE_FILE
642 DLL_IMPORT size_t mpf_inp_str _PROTO ((mpf_ptr, FILE *, int));
643 #endif
644 DLL_IMPORT void mpf_init_set _PROTO ((mpf_ptr, mpf_srcptr));
645 DLL_IMPORT void mpf_init_set_d _PROTO ((mpf_ptr, double));
646 DLL_IMPORT void mpf_init_set_si _PROTO ((mpf_ptr, signed long int));
647 DLL_IMPORT int mpf_init_set_str _PROTO ((mpf_ptr, __gmp_const char *, int));
648 DLL_IMPORT void mpf_init_set_ui _PROTO ((mpf_ptr, unsigned long int));
649 DLL_IMPORT void mpf_mul _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
650 DLL_IMPORT void mpf_mul_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
651 DLL_IMPORT void mpf_mul_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
652 DLL_IMPORT void mpf_neg _PROTO ((mpf_ptr, mpf_srcptr));
653 #ifdef _GMP_H_HAVE_FILE
654 DLL_IMPORT size_t mpf_out_str _PROTO ((FILE *, int, size_t, mpf_srcptr));
655 #endif
656 DLL_IMPORT void mpf_pow_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
657 DLL_IMPORT void mpf_random2 _PROTO ((mpf_ptr, mp_size_t, mp_exp_t));
658 DLL_IMPORT void mpf_reldiff _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
659 DLL_IMPORT void mpf_set _PROTO ((mpf_ptr, mpf_srcptr));
660 DLL_IMPORT void mpf_set_d _PROTO ((mpf_ptr, double));
661 DLL_IMPORT void mpf_set_default_prec _PROTO ((unsigned long int));
662 DLL_IMPORT void mpf_set_prec _PROTO ((mpf_ptr, unsigned long int));
663 DLL_IMPORT void mpf_set_prec_raw _PROTO ((mpf_ptr, unsigned long int));
664 DLL_IMPORT void mpf_set_q _PROTO ((mpf_ptr, mpq_srcptr));
665 DLL_IMPORT void mpf_set_si _PROTO ((mpf_ptr, signed long int));
666 DLL_IMPORT int mpf_set_str _PROTO ((mpf_ptr, __gmp_const char *, int));
667 DLL_IMPORT void mpf_set_ui _PROTO ((mpf_ptr, unsigned long int));
668 DLL_IMPORT void mpf_set_z _PROTO ((mpf_ptr, mpz_srcptr));
669 DLL_IMPORT size_t mpf_size _PROTO ((mpf_srcptr));
670 DLL_IMPORT void mpf_sqrt _PROTO ((mpf_ptr, mpf_srcptr));
671 DLL_IMPORT void mpf_sqrt_ui _PROTO ((mpf_ptr, unsigned long int));
672 DLL_IMPORT void mpf_sub _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
673 DLL_IMPORT void mpf_sub_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
674 DLL_IMPORT void mpf_trunc _PROTO ((mpf_ptr, mpf_srcptr));
675 DLL_IMPORT void mpf_ui_div _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr));
676 DLL_IMPORT void mpf_ui_sub _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr));
677 DLL_IMPORT void mpf_urandomb _PROTO ((mpf_t, gmp_randstate_t, unsigned long int));
678
679 #define mpf_swap __gmpf_swap
680 DLL_IMPORT void mpf_swap _PROTO ((mpf_ptr, mpf_ptr));
681
682 #if defined (__cplusplus)
683 }
684 #endif
685 /************ Low level positive-integer (i.e. N) routines.  ************/
686
687 /* This is ugly, but we need to make user calls reach the prefixed function. */
688 #define mpn_add                 __MPN(add)
689 #define mpn_add_1               __MPN(add_1)
690 #define mpn_add_n               __MPN(add_n)
691 #define mpn_add_nc              __MPN(add_nc)
692 #define mpn_addmul_1            __MPN(addmul_1)
693 #define mpn_addsub_n            __MPN(addsub_n)
694 #define mpn_addsub_nc           __MPN(addsub_nc)
695 /* #define mpn_and_n            __MPN(and_n) */
696 /* #define mpn_andn_n           __MPN(andn_n) */
697 #define mpn_bdivmod             __MPN(bdivmod)
698 #define mpn_cmp                 __MPN(cmp)
699 /* #define mpn_com_n            __MPN(com_n) */
700 #define mpn_copyd               __MPN(copyd)
701 #define mpn_copyi               __MPN(copyi)
702 #define mpn_divrem              __MPN(divrem)
703 #define mpn_divrem_1            __MPN(divrem_1)
704 #define mpn_divrem_2            __MPN(divrem_2)
705 #define mpn_dump                __MPN(dump)
706 #define mpn_gcd                 __MPN(gcd)
707 #define mpn_gcd_1               __MPN(gcd_1)
708 #define mpn_gcdext              __MPN(gcdext)
709 #define mpn_get_str             __MPN(get_str)
710 #define mpn_hamdist             __MPN(hamdist)
711 #define mpn_invert_limb         __MPN(invert_limb)
712 /* #define mpn_ior_n            __MPN(ior_n) */
713 /* #define mpn_iorn_n           __MPN(iorn_n) */
714 /* #define mpn_kara_mul_n       __MPN(kara_mul_n)  internal */
715 /* #define mpn_kara_sqr_n       __MPN(kara_sqr_n)  internal */
716 #define mpn_lshift              __MPN(lshift)
717 #define mpn_lshiftc             __MPN(lshiftc)
718 #define mpn_mod_1               __MPN(mod_1)
719 #define mpn_mul                 __MPN(mul)
720 #define mpn_mul_1               __MPN(mul_1)
721 #define mpn_mul_basecase        __MPN(mul_basecase)
722 #define mpn_mul_n               __MPN(mul_n)
723 #define mpn_perfect_square_p    __MPN(perfect_square_p)
724 #define mpn_popcount            __MPN(popcount)
725 #define mpn_preinv_mod_1        __MPN(preinv_mod_1)
726 /* #define mpn_nand_n           __MPN(nand_n) */
727 /* #define mpn_nior_n           __MPN(nior_n) */
728 #define mpn_random              __MPN(random)
729 #define mpn_random2             __MPN(random2)
730 #define mpn_rshift              __MPN(rshift)
731 #define mpn_rshiftc             __MPN(rshiftc)
732 #define mpn_scan0               __MPN(scan0)
733 #define mpn_scan1               __MPN(scan1)
734 #define mpn_set_str             __MPN(set_str)
735 #define mpn_sqr_basecase        __MPN(sqr_basecase)
736 #define mpn_sqr_n               __MPN(sqr_n)
737 #define mpn_sqrtrem             __MPN(sqrtrem)
738 #define mpn_sub                 __MPN(sub)
739 #define mpn_sub_1               __MPN(sub_1)
740 #define mpn_sub_n               __MPN(sub_n)
741 #define mpn_sub_nc              __MPN(sub_nc)
742 #define mpn_submul_1            __MPN(submul_1)
743 /* #define mpn_toom3_mul_n              __MPN(toom3_mul_n)  internal */
744 /* #define mpn_toom3_sqr_n              __MPN(toom3_sqr_n)  internal */
745 /* #define mpn_xnor_n           __MPN(xnor_n) */
746 /* #define mpn_xor_n            __MPN(xor_n) */
747
748 #if defined (__cplusplus)
749 extern "C" {
750 #endif
751
752 DLL_IMPORT mp_limb_t mpn_add _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t));
753 DLL_IMPORT mp_limb_t mpn_add_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
754 DLL_IMPORT mp_limb_t mpn_add_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
755 DLL_IMPORT mp_limb_t mpn_add_nc _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t));
756
757 DLL_IMPORT mp_limb_t mpn_addmul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
758
759 #define mpn_addmul_1c  __MPN(addmul_1c)
760 DLL_IMPORT mp_limb_t mpn_addmul_1c _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t));
761
762 DLL_IMPORT mp_limb_t mpn_addsub_n _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
763 DLL_IMPORT mp_limb_t mpn_bdivmod _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, unsigned long int));
764 DLL_IMPORT int mpn_cmp _PROTO ((mp_srcptr, mp_srcptr, mp_size_t));
765
766 #define mpn_divexact_by3(dst, src, size)  mpn_divexact_by3c (dst, src, size, 0)
767
768 #define mpn_divexact_by3c  __MPN(divexact_by3c)
769 DLL_IMPORT mp_limb_t mpn_divexact_by3c _PROTO ((mp_ptr dst, mp_srcptr src,
770                                      mp_size_t size, mp_limb_t carry));
771
772 #define mpn_divmod_1(qp,np,nsize,dlimb) mpn_divrem_1 (qp,0,np,nsize,dlimb)
773
774 DLL_IMPORT mp_limb_t mpn_divrem _PROTO((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t));
775
776 DLL_IMPORT mp_limb_t mpn_divrem_1 _PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t));
777
778 #define mpn_divrem_1c  __MPN(divrem_1c)
779 DLL_IMPORT mp_limb_t mpn_divrem_1c _PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t,
780                                  mp_limb_t, mp_limb_t));
781
782 DLL_IMPORT mp_limb_t mpn_divrem_2 _PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr));
783 DLL_IMPORT void mpn_dump _PROTO ((mp_srcptr, mp_size_t));
784 mp_size_t mpn_gcd _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t));
785 DLL_IMPORT mp_limb_t mpn_gcd_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t));
786 mp_size_t mpn_gcdext _PROTO ((mp_ptr, mp_ptr, mp_size_t *, mp_ptr, mp_size_t, mp_ptr, mp_size_t));
787 DLL_IMPORT size_t mpn_get_str _PROTO ((unsigned char *, int, mp_ptr, mp_size_t));
788 DLL_IMPORT unsigned long int mpn_hamdist _PROTO ((mp_srcptr, mp_srcptr, mp_size_t));
789
790 #define mpn_jacobi_base __MPN(jacobi_base)
791 DLL_IMPORT int mpn_jacobi_base _PROTO ((mp_limb_t a, mp_limb_t b, int result_bit1));
792
793 DLL_IMPORT mp_limb_t mpn_lshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int));
794 DLL_IMPORT mp_limb_t mpn_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t));
795
796 #define mpn_mod_1c  __MPN(mod_1c)
797 DLL_IMPORT mp_limb_t mpn_mod_1c _PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t));
798
799 #define mpn_mod_1_rshift __MPN(mod_1_rshift)
800 DLL_IMPORT mp_limb_t mpn_mod_1_rshift _PROTO ((mp_srcptr, mp_size_t, unsigned,mp_limb_t));
801
802 DLL_IMPORT mp_limb_t mpn_mul _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t));
803 DLL_IMPORT mp_limb_t mpn_mul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
804
805 #define mpn_mul_1c  __MPN(mul_1c)
806 DLL_IMPORT mp_limb_t mpn_mul_1c _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t));
807
808 DLL_IMPORT void mpn_mul_basecase _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t));
809 DLL_IMPORT void mpn_mul_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
810 DLL_IMPORT int mpn_perfect_square_p _PROTO ((mp_srcptr, mp_size_t));
811 DLL_IMPORT unsigned long int mpn_popcount _PROTO ((mp_srcptr, mp_size_t));
812 DLL_IMPORT mp_limb_t mpn_preinv_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t));
813 DLL_IMPORT void mpn_random _PROTO ((mp_ptr, mp_size_t));
814 DLL_IMPORT void mpn_random2 _PROTO ((mp_ptr, mp_size_t));
815 DLL_IMPORT mp_limb_t mpn_rshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int));
816 DLL_IMPORT unsigned long int mpn_scan0 _PROTO ((mp_srcptr, unsigned long int));
817 DLL_IMPORT unsigned long int mpn_scan1 _PROTO ((mp_srcptr, unsigned long int));
818 mp_size_t mpn_set_str _PROTO ((mp_ptr, __gmp_const unsigned char *, size_t, int));
819 DLL_IMPORT void mpn_sqr_n _PROTO ((mp_ptr, mp_srcptr, mp_size_t));
820 DLL_IMPORT void mpn_sqr_basecase _PROTO ((mp_ptr, mp_srcptr, mp_size_t));
821 mp_size_t mpn_sqrtrem _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t));
822 DLL_IMPORT mp_limb_t mpn_sub _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t));
823 DLL_IMPORT mp_limb_t mpn_sub_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
824 DLL_IMPORT mp_limb_t mpn_sub_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
825 DLL_IMPORT mp_limb_t mpn_sub_nc _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t));
826 DLL_IMPORT mp_limb_t mpn_submul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
827
828 #define mpn_submul_1c  __MPN(submul_1c)
829 DLL_IMPORT mp_limb_t mpn_submul_1c _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t));
830
831 #define mpn_tdiv_qr  __MPN(tdiv_qr)
832 DLL_IMPORT void mpn_tdiv_qr _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t));
833
834 #if defined (__cplusplus)
835 }
836 #endif
837
838 #define mpn_incr_u(p,incr) \
839   do { mp_limb_t __x; mp_ptr __p = p;                   \
840     __x = *__p + incr;                                  \
841     *__p = __x;                                         \
842     if (__x < incr)                                     \
843       while (++(*(++__p)) == 0)                         \
844         ;                                               \
845   } while (0)
846
847 #define mpn_decr_u(p,incr) \
848   do { mp_limb_t __x; mp_ptr __p = p;                   \
849     __x = *__p;                                         \
850     *__p = __x - incr;                                  \
851     if (__x < incr)                                     \
852       while ((*(++__p))-- == 0)                         \
853         ;                                               \
854   } while (0)
855
856 #if defined (__GNUC__) || defined (_FORCE_INLINES)
857 _EXTERN_INLINE mp_limb_t
858 #if (__STDC__-0) || defined (__cplusplus)
859 mpn_add_1 (register mp_ptr res_ptr,
860            register mp_srcptr s1_ptr,
861            register mp_size_t s1_size,
862            register mp_limb_t s2_limb)
863 #else
864 mpn_add_1 (res_ptr, s1_ptr, s1_size, s2_limb)
865      register mp_ptr res_ptr;
866      register mp_srcptr s1_ptr;
867      register mp_size_t s1_size;
868      register mp_limb_t s2_limb;
869 #endif
870 {
871   register mp_limb_t x;
872
873   x = *s1_ptr++;
874   s2_limb = x + s2_limb;
875   *res_ptr++ = s2_limb;
876   if (s2_limb < x)
877     {
878       while (--s1_size != 0)
879         {
880           x = *s1_ptr++ + 1;
881           *res_ptr++ = x;
882           if (x != 0)
883             goto fin;
884         }
885
886       return 1;
887     }
888
889  fin:
890   if (res_ptr != s1_ptr)
891     {
892       mp_size_t i;
893       for (i = 0; i < s1_size - 1; i++)
894         res_ptr[i] = s1_ptr[i];
895     }
896   return 0;
897 }
898
899 _EXTERN_INLINE mp_limb_t
900 #if (__STDC__-0) || defined (__cplusplus)
901 mpn_add (register mp_ptr res_ptr,
902          register mp_srcptr s1_ptr,
903          register mp_size_t s1_size,
904          register mp_srcptr s2_ptr,
905          register mp_size_t s2_size)
906 #else
907 mpn_add (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size)
908      register mp_ptr res_ptr;
909      register mp_srcptr s1_ptr;
910      register mp_size_t s1_size;
911      register mp_srcptr s2_ptr;
912      register mp_size_t s2_size;
913 #endif
914 {
915   mp_limb_t cy_limb = 0;
916
917   if (s2_size != 0)
918     cy_limb = mpn_add_n (res_ptr, s1_ptr, s2_ptr, s2_size);
919
920   if (s1_size - s2_size != 0)
921     cy_limb = mpn_add_1 (res_ptr + s2_size,
922                          s1_ptr + s2_size,
923                          s1_size - s2_size,
924                          cy_limb);
925   return cy_limb;
926 }
927
928 _EXTERN_INLINE mp_limb_t
929 #if (__STDC__-0) || defined (__cplusplus)
930 mpn_sub_1 (register mp_ptr res_ptr,
931            register mp_srcptr s1_ptr,
932            register mp_size_t s1_size,
933            register mp_limb_t s2_limb)
934 #else
935 mpn_sub_1 (res_ptr, s1_ptr, s1_size, s2_limb)
936      register mp_ptr res_ptr;
937      register mp_srcptr s1_ptr;
938      register mp_size_t s1_size;
939      register mp_limb_t s2_limb;
940 #endif
941 {
942   register mp_limb_t x;
943
944   x = *s1_ptr++;
945   s2_limb = x - s2_limb;
946   *res_ptr++ = s2_limb;
947   if (s2_limb > x)
948     {
949       while (--s1_size != 0)
950         {
951           x = *s1_ptr++;
952           *res_ptr++ = x - 1;
953           if (x != 0)
954             goto fin;
955         }
956
957       return 1;
958     }
959
960  fin:
961   if (res_ptr != s1_ptr)
962     {
963       mp_size_t i;
964       for (i = 0; i < s1_size - 1; i++)
965         res_ptr[i] = s1_ptr[i];
966     }
967   return 0;
968 }
969
970 _EXTERN_INLINE mp_limb_t
971 #if (__STDC__-0) || defined (__cplusplus)
972 mpn_sub (register mp_ptr res_ptr,
973          register mp_srcptr s1_ptr,
974          register mp_size_t s1_size,
975          register mp_srcptr s2_ptr,
976          register mp_size_t s2_size)
977 #else
978 mpn_sub (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size)
979      register mp_ptr res_ptr;
980      register mp_srcptr s1_ptr;
981      register mp_size_t s1_size;
982      register mp_srcptr s2_ptr;
983      register mp_size_t s2_size;
984 #endif
985 {
986   mp_limb_t cy_limb = 0;
987
988   if (s2_size != 0)
989     cy_limb = mpn_sub_n (res_ptr, s1_ptr, s2_ptr, s2_size);
990
991   if (s1_size - s2_size != 0)
992     cy_limb = mpn_sub_1 (res_ptr + s2_size,
993                          s1_ptr + s2_size,
994                          s1_size - s2_size,
995                          cy_limb);
996   return cy_limb;
997 }
998 #endif /* __GNUC__ */
999
1000 /* Allow faster testing for negative, zero, and positive.  */
1001 #define mpz_sgn(Z) ((Z)->_mp_size < 0 ? -1 : (Z)->_mp_size > 0)
1002 #define mpf_sgn(F) ((F)->_mp_size < 0 ? -1 : (F)->_mp_size > 0)
1003 #define mpq_sgn(Q) ((Q)->_mp_num._mp_size < 0 ? -1 : (Q)->_mp_num._mp_size > 0)
1004
1005 /* When using GCC, optimize certain common comparisons.  */
1006 #if defined (__GNUC__)
1007 #define mpz_cmp_ui(Z,UI) \
1008   (__builtin_constant_p (UI) && (UI) == 0                               \
1009    ? mpz_sgn (Z) : _mpz_cmp_ui (Z,UI))
1010 #define mpz_cmp_si(Z,SI) \
1011   (__builtin_constant_p (SI) && (SI) == 0 ? mpz_sgn (Z)                 \
1012    : __builtin_constant_p (SI) && (SI) > 0                              \
1013     ? _mpz_cmp_ui (Z, (unsigned long int) SI)                           \
1014    : _mpz_cmp_si (Z,SI))
1015 #define mpq_cmp_ui(Q,NUI,DUI) \
1016   (__builtin_constant_p (NUI) && (NUI) == 0                             \
1017    ? mpq_sgn (Q) : _mpq_cmp_ui (Q,NUI,DUI))
1018 #else
1019 #define mpz_cmp_ui(Z,UI) _mpz_cmp_ui (Z,UI)
1020 #define mpz_cmp_si(Z,UI) _mpz_cmp_si (Z,UI)
1021 #define mpq_cmp_ui(Q,NUI,DUI) _mpq_cmp_ui (Q,NUI,DUI)
1022 #endif
1023
1024
1025 /* Using "&" rather than "&&" means these can come out branch-free.  Every
1026    mpz_t has at least one limb allocated, so fetching the low limb is always
1027    allowed.  */
1028 #define mpz_odd_p(z)   ((int) ((z)->_mp_size != 0) & (int) (z)->_mp_d[0])
1029 #define mpz_even_p(z)  (! mpz_odd_p (z))
1030
1031
1032 /* Allow direct user access to numerator and denominator of a mpq_t object.  */
1033 #define mpq_numref(Q) (&((Q)->_mp_num))
1034 #define mpq_denref(Q) (&((Q)->_mp_den))
1035
1036
1037 /* Compatibility with GMP 2 and earlier. */
1038 #define mpn_divmod(qp,np,nsize,dp,dsize) mpn_divrem (qp,0,np,nsize,dp,dsize)
1039
1040 /* Compatibility with GMP 1.  */
1041 #define mpz_mdiv        mpz_fdiv_q
1042 #define mpz_mdivmod     mpz_fdiv_qr
1043 #define mpz_mmod        mpz_fdiv_r
1044 #define mpz_mdiv_ui     mpz_fdiv_q_ui
1045 #define mpz_mdivmod_ui(q,r,n,d) \
1046   ((r == 0) ? mpz_fdiv_q_ui (q,n,d) : mpz_fdiv_qr_ui (q,r,n,d))
1047 #define mpz_mmod_ui(r,n,d) \
1048   ((r == 0) ? mpz_fdiv_ui (n,d) : mpz_fdiv_r_ui (r,n,d))
1049
1050 /* Useful synonyms, but not quite compatible with GMP 1.  */
1051 #define mpz_div         mpz_fdiv_q
1052 #define mpz_divmod      mpz_fdiv_qr
1053 #define mpz_div_ui      mpz_fdiv_q_ui
1054 #define mpz_divmod_ui   mpz_fdiv_qr_ui
1055 #define mpz_mod_ui      mpz_fdiv_r_ui
1056 #define mpz_div_2exp    mpz_fdiv_q_2exp
1057 #define mpz_mod_2exp    mpz_fdiv_r_2exp
1058
1059 #define gmp_errno __gmp_errno
1060 extern int gmp_errno;
1061
1062 enum
1063 {
1064   GMP_ERROR_NONE = 0,
1065   GMP_ERROR_UNSUPPORTED_ARGUMENT = 1,
1066   GMP_ERROR_DIVISION_BY_ZERO = 2,
1067   GMP_ERROR_SQRT_OF_NEGATIVE = 4,
1068   GMP_ERROR_INVALID_ARGUMENT = 8,
1069   GMP_ERROR_ALLOCATE = 16,
1070   GMP_ERROR_BAD_STRING = 32,
1071   GMP_ERROR_UNUSED_ERROR
1072 };
1073
1074 /* Note: major version number is in mp.h too */
1075 #define __GNU_MP_VERSION 3
1076 #define __GNU_MP_VERSION_MINOR 1
1077 #define __GNU_MP_VERSION_PATCHLEVEL 1
1078
1079 #define gmp_version __gmp_version
1080 extern __gmp_const char *gmp_version;
1081
1082 #define __GMP_H__
1083 #endif /* __GMP_H__ */