1/* Definitions for GNU multiple precision functions. -*- mode: c -*-
2
3Copyright 1991, 1993-1997, 1999-2016 Free Software Foundation, Inc.
4
5This file is part of the GNU MP Library.
6
7The GNU MP Library is free software; you can redistribute it and/or modify
8it under the terms of either:
9
10 * the GNU Lesser General Public License as published by the Free
11 Software Foundation; either version 3 of the License, or (at your
12 option) any later version.
13
14or
15
16 * the GNU General Public License as published by the Free Software
17 Foundation; either version 2 of the License, or (at your option) any
18 later version.
19
20or both in parallel, as here.
21
22The GNU MP Library is distributed in the hope that it will be useful, but
23WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
24or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25for more details.
26
27You should have received copies of the GNU General Public License and the
28GNU Lesser General Public License along with the GNU MP Library. If not,
29see https://www.gnu.org/licenses/. */
30
31#ifndef __GMP_H__
32
33#if defined (__cplusplus)
34#include <iosfwd> /* for std::istream, std::ostream, std::string */
35#include <cstdio>
36#endif
37
38
39/* Instantiated by configure. */
40#if ! defined (__GMP_WITHIN_CONFIGURE)
41#define __GMP_HAVE_HOST_CPU_FAMILY_power 0
42#define __GMP_HAVE_HOST_CPU_FAMILY_powerpc 0
43#define GMP_LIMB_BITS 64
44#define GMP_NAIL_BITS 0
45#endif
46#define GMP_NUMB_BITS (GMP_LIMB_BITS - GMP_NAIL_BITS)
47#define GMP_NUMB_MASK ((~ __GMP_CAST (mp_limb_t, 0)) >> GMP_NAIL_BITS)
48#define GMP_NUMB_MAX GMP_NUMB_MASK
49#define GMP_NAIL_MASK (~ GMP_NUMB_MASK)
50
51
52#ifndef __GNU_MP__
53#define __GNU_MP__ 6
54
55#include <stddef.h> /* for size_t */
56#include <limits.h>
57
58/* Instantiated by configure. */
59#if ! defined (__GMP_WITHIN_CONFIGURE)
60/* #undef _LONG_LONG_LIMB */
61#define __GMP_LIBGMP_DLL 0
62#endif
63
64
65/* __GMP_DECLSPEC supports Windows DLL versions of libgmp, and is empty in
66 all other circumstances.
67
68 When compiling objects for libgmp, __GMP_DECLSPEC is an export directive,
69 or when compiling for an application it's an import directive. The two
70 cases are differentiated by __GMP_WITHIN_GMP defined by the GMP Makefiles
71 (and not defined from an application).
72
73 __GMP_DECLSPEC_XX is similarly used for libgmpxx. __GMP_WITHIN_GMPXX
74 indicates when building libgmpxx, and in that case libgmpxx functions are
75 exports, but libgmp functions which might get called are imports.
76
77 Libtool DLL_EXPORT define is not used.
78
79 There's no attempt to support GMP built both static and DLL. Doing so
80 would mean applications would have to tell us which of the two is going
81 to be used when linking, and that seems very tedious and error prone if
82 using GMP by hand, and equally tedious from a package since autoconf and
83 automake don't give much help.
84
85 __GMP_DECLSPEC is required on all documented global functions and
86 variables, the various internals in gmp-impl.h etc can be left unadorned.
87 But internals used by the test programs or speed measuring programs
88 should have __GMP_DECLSPEC, and certainly constants or variables must
89 have it or the wrong address will be resolved.
90
91 In gcc __declspec can go at either the start or end of a prototype.
92
93 In Microsoft C __declspec must go at the start, or after the type like
94 void __declspec(...) *foo()". There's no __dllexport or anything to
95 guard against someone foolish #defining dllexport. _export used to be
96 available, but no longer.
97
98 In Borland C _export still exists, but needs to go after the type, like
99 "void _export foo();". Would have to change the __GMP_DECLSPEC syntax to
100 make use of that. Probably more trouble than it's worth. */
101
102#if defined (__GNUC__)
103#define __GMP_DECLSPEC_EXPORT __declspec(__dllexport__)
104#define __GMP_DECLSPEC_IMPORT __declspec(__dllimport__)
105#endif
106#if defined (_MSC_VER) || defined (__BORLANDC__)
107#define __GMP_DECLSPEC_EXPORT __declspec(dllexport)
108#define __GMP_DECLSPEC_IMPORT __declspec(dllimport)
109#endif
110#ifdef __WATCOMC__
111#define __GMP_DECLSPEC_EXPORT __export
112#define __GMP_DECLSPEC_IMPORT __import
113#endif
114#ifdef __IBMC__
115#define __GMP_DECLSPEC_EXPORT _Export
116#define __GMP_DECLSPEC_IMPORT _Import
117#endif
118
119#if __GMP_LIBGMP_DLL
120#ifdef __GMP_WITHIN_GMP
121/* compiling to go into a DLL libgmp */
122#define __GMP_DECLSPEC __GMP_DECLSPEC_EXPORT
123#else
124/* compiling to go into an application which will link to a DLL libgmp */
125#define __GMP_DECLSPEC __GMP_DECLSPEC_IMPORT
126#endif
127#else
128/* all other cases */
129#define __GMP_DECLSPEC
130#endif
131
132
133#ifdef __GMP_SHORT_LIMB
134typedef unsigned int mp_limb_t;
135typedef int mp_limb_signed_t;
136#else
137#ifdef _LONG_LONG_LIMB
138typedef unsigned long long int mp_limb_t;
139typedef long long int mp_limb_signed_t;
140#else
141typedef unsigned long int mp_limb_t;
142typedef long int mp_limb_signed_t;
143#endif
144#endif
145typedef unsigned long int mp_bitcnt_t;
146
147/* For reference, note that the name __mpz_struct gets into C++ mangled
148 function names, which means although the "__" suggests an internal, we
149 must leave this name for binary compatibility. */
150typedef struct
151{
152 int _mp_alloc; /* Number of *limbs* allocated and pointed
153 to by the _mp_d field. */
154 int _mp_size; /* abs(_mp_size) is the number of limbs the
155 last field points to. If _mp_size is
156 negative this is a negative number. */
157 mp_limb_t *_mp_d; /* Pointer to the limbs. */
158} __mpz_struct;
159
160#endif /* __GNU_MP__ */
161
162
163typedef __mpz_struct MP_INT; /* gmp 1 source compatibility */
164typedef __mpz_struct mpz_t[1];
165
166typedef mp_limb_t * mp_ptr;
167typedef const mp_limb_t * mp_srcptr;
168#if defined (_CRAY) && ! defined (_CRAYMPP)
169/* plain `int' is much faster (48 bits) */
170#define __GMP_MP_SIZE_T_INT 1
171typedef int mp_size_t;
172typedef int mp_exp_t;
173#else
174#define __GMP_MP_SIZE_T_INT 0
175typedef long int mp_size_t;
176typedef long int mp_exp_t;
177#endif
178
179typedef struct
180{
181 __mpz_struct _mp_num;
182 __mpz_struct _mp_den;
183} __mpq_struct;
184
185typedef __mpq_struct MP_RAT; /* gmp 1 source compatibility */
186typedef __mpq_struct mpq_t[1];
187
188typedef struct
189{
190 int _mp_prec; /* Max precision, in number of `mp_limb_t's.
191 Set by mpf_init and modified by
192 mpf_set_prec. The area pointed to by the
193 _mp_d field contains `prec' + 1 limbs. */
194 int _mp_size; /* abs(_mp_size) is the number of limbs the
195 last field points to. If _mp_size is
196 negative this is a negative number. */
197 mp_exp_t _mp_exp; /* Exponent, in the base of `mp_limb_t'. */
198 mp_limb_t *_mp_d; /* Pointer to the limbs. */
199} __mpf_struct;
200
201/* typedef __mpf_struct MP_FLOAT; */
202typedef __mpf_struct mpf_t[1];
203
204/* Available random number generation algorithms. */
205typedef enum
206{
207 GMP_RAND_ALG_DEFAULT = 0,
208 GMP_RAND_ALG_LC = GMP_RAND_ALG_DEFAULT /* Linear congruential. */
209} gmp_randalg_t;
210
211/* Random state struct. */
212typedef struct
213{
214 mpz_t _mp_seed; /* _mp_d member points to state of the generator. */
215 gmp_randalg_t _mp_alg; /* Currently unused. */
216 union {
217 void *_mp_lc; /* Pointer to function pointers structure. */
218 } _mp_algdata;
219} __gmp_randstate_struct;
220typedef __gmp_randstate_struct gmp_randstate_t[1];
221
222/* Types for function declarations in gmp files. */
223/* ??? Should not pollute user name space with these ??? */
224typedef const __mpz_struct *mpz_srcptr;
225typedef __mpz_struct *mpz_ptr;
226typedef const __mpf_struct *mpf_srcptr;
227typedef __mpf_struct *mpf_ptr;
228typedef const __mpq_struct *mpq_srcptr;
229typedef __mpq_struct *mpq_ptr;
230
231
232#if __GMP_LIBGMP_DLL
233#ifdef __GMP_WITHIN_GMPXX
234/* compiling to go into a DLL libgmpxx */
235#define __GMP_DECLSPEC_XX __GMP_DECLSPEC_EXPORT
236#else
237/* compiling to go into a application which will link to a DLL libgmpxx */
238#define __GMP_DECLSPEC_XX __GMP_DECLSPEC_IMPORT
239#endif
240#else
241/* all other cases */
242#define __GMP_DECLSPEC_XX
243#endif
244
245
246#ifndef __MPN
247#define __MPN(x) __gmpn_##x
248#endif
249
250/* For reference, "defined(EOF)" cannot be used here. In g++ 2.95.4,
251 <iostream> defines EOF but not FILE. */
252#if defined (FILE) \
253 || defined (H_STDIO) \
254 || defined (_H_STDIO) /* AIX */ \
255 || defined (_STDIO_H) /* glibc, Sun, SCO */ \
256 || defined (_STDIO_H_) /* BSD, OSF */ \
257 || defined (__STDIO_H) /* Borland */ \
258 || defined (__STDIO_H__) /* IRIX */ \
259 || defined (_STDIO_INCLUDED) /* HPUX */ \
260 || defined (__dj_include_stdio_h_) /* DJGPP */ \
261 || defined (_FILE_DEFINED) /* Microsoft */ \
262 || defined (__STDIO__) /* Apple MPW MrC */ \
263 || defined (_MSL_STDIO_H) /* Metrowerks */ \
264 || defined (_STDIO_H_INCLUDED) /* QNX4 */ \
265 || defined (_ISO_STDIO_ISO_H) /* Sun C++ */ \
266 || defined (__STDIO_LOADED) /* VMS */ \
267 || defined (__DEFINED_FILE) /* musl */
268#define _GMP_H_HAVE_FILE 1
269#endif
270
271/* In ISO C, if a prototype involving "struct obstack *" is given without
272 that structure defined, then the struct is scoped down to just the
273 prototype, causing a conflict if it's subsequently defined for real. So
274 only give prototypes if we've got obstack.h. */
275#if defined (_OBSTACK_H) /* glibc <obstack.h> */
276#define _GMP_H_HAVE_OBSTACK 1
277#endif
278
279/* The prototypes for gmp_vprintf etc are provided only if va_list is defined,
280 via an application having included <stdarg.h>. Usually va_list is a typedef
281 so can't be tested directly, but C99 specifies that va_start is a macro.
282
283 <stdio.h> will define some sort of va_list for vprintf and vfprintf, but
284 let's not bother trying to use that since it's not standard and since
285 application uses for gmp_vprintf etc will almost certainly require the
286 whole <stdarg.h> anyway. */
287
288#ifdef va_start
289#define _GMP_H_HAVE_VA_LIST 1
290#endif
291
292/* Test for gcc >= maj.min, as per __GNUC_PREREQ in glibc */
293#if defined (__GNUC__) && defined (__GNUC_MINOR__)
294#define __GMP_GNUC_PREREQ(maj, min) \
295 ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
296#else
297#define __GMP_GNUC_PREREQ(maj, min) 0
298#endif
299
300/* "pure" is in gcc 2.96 and up, see "(gcc)Function Attributes". Basically
301 it means a function does nothing but examine its arguments and memory
302 (global or via arguments) to generate a return value, but changes nothing
303 and has no side-effects. __GMP_NO_ATTRIBUTE_CONST_PURE lets
304 tune/common.c etc turn this off when trying to write timing loops. */
305#if __GMP_GNUC_PREREQ (2,96) && ! defined (__GMP_NO_ATTRIBUTE_CONST_PURE)
306#define __GMP_ATTRIBUTE_PURE __attribute__ ((__pure__))
307#else
308#define __GMP_ATTRIBUTE_PURE
309#endif
310
311
312/* __GMP_CAST allows us to use static_cast in C++, so our macros are clean
313 to "g++ -Wold-style-cast".
314
315 Casts in "extern inline" code within an extern "C" block don't induce
316 these warnings, so __GMP_CAST only needs to be used on documented
317 macros. */
318
319#ifdef __cplusplus
320#define __GMP_CAST(type, expr) (static_cast<type> (expr))
321#else
322#define __GMP_CAST(type, expr) ((type) (expr))
323#endif
324
325
326/* An empty "throw ()" means the function doesn't throw any C++ exceptions,
327 this can save some stack frame info in applications.
328
329 Currently it's given only on functions which never divide-by-zero etc,
330 don't allocate memory, and are expected to never need to allocate memory.
331 This leaves open the possibility of a C++ throw from a future GMP
332 exceptions scheme.
333
334 mpz_set_ui etc are omitted to leave open the lazy allocation scheme
335 described in doc/tasks.html. mpz_get_d etc are omitted to leave open
336 exceptions for float overflows.
337
338 Note that __GMP_NOTHROW must be given on any inlines the same as on their
339 prototypes (for g++ at least, where they're used together). Note also
340 that g++ 3.0 demands that __GMP_NOTHROW is before other attributes like
341 __GMP_ATTRIBUTE_PURE. */
342
343#if defined (__cplusplus)
344#define __GMP_NOTHROW throw ()
345#else
346#define __GMP_NOTHROW
347#endif
348
349
350/* PORTME: What other compilers have a useful "extern inline"? "static
351 inline" would be an acceptable substitute if the compiler (or linker)
352 discards unused statics. */
353
354 /* gcc has __inline__ in all modes, including strict ansi. Give a prototype
355 for an inline too, so as to correctly specify "dllimport" on windows, in
356 case the function is called rather than inlined.
357 GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
358 inline semantics, unless -fgnu89-inline is used. */
359#ifdef __GNUC__
360#if (defined __GNUC_STDC_INLINE__) || (__GNUC__ == 4 && __GNUC_MINOR__ == 2) \
361 || (defined __GNUC_GNU_INLINE__ && defined __cplusplus)
362#define __GMP_EXTERN_INLINE extern __inline__ __attribute__ ((__gnu_inline__))
363#else
364#define __GMP_EXTERN_INLINE extern __inline__
365#endif
366#define __GMP_INLINE_PROTOTYPES 1
367#endif
368
369/* DEC C (eg. version 5.9) supports "static __inline foo()", even in -std1
370 strict ANSI mode. Inlining is done even when not optimizing (ie. -O0
371 mode, which is the default), but an unnecessary local copy of foo is
372 emitted unless -O is used. "extern __inline" is accepted, but the
373 "extern" appears to be ignored, ie. it becomes a plain global function
374 but which is inlined within its file. Don't know if all old versions of
375 DEC C supported __inline, but as a start let's do the right thing for
376 current versions. */
377#ifdef __DECC
378#define __GMP_EXTERN_INLINE static __inline
379#endif
380
381/* SCO OpenUNIX 8 cc supports "static inline foo()" but not in -Xc strict
382 ANSI mode (__STDC__ is 1 in that mode). Inlining only actually takes
383 place under -O. Without -O "foo" seems to be emitted whether it's used
384 or not, which is wasteful. "extern inline foo()" isn't useful, the
385 "extern" is apparently ignored, so foo is inlined if possible but also
386 emitted as a global, which causes multiple definition errors when
387 building a shared libgmp. */
388#ifdef __SCO_VERSION__
389#if __SCO_VERSION__ > 400000000 && __STDC__ != 1 \
390 && ! defined (__GMP_EXTERN_INLINE)
391#define __GMP_EXTERN_INLINE static inline
392#endif
393#endif
394
395/* Microsoft's C compiler accepts __inline */
396#ifdef _MSC_VER
397#define __GMP_EXTERN_INLINE __inline
398#endif
399
400/* Recent enough Sun C compilers want "inline" */
401#if defined (__SUNPRO_C) && __SUNPRO_C >= 0x560 \
402 && ! defined (__GMP_EXTERN_INLINE)
403#define __GMP_EXTERN_INLINE inline
404#endif
405
406/* Somewhat older Sun C compilers want "static inline" */
407#if defined (__SUNPRO_C) && __SUNPRO_C >= 0x540 \
408 && ! defined (__GMP_EXTERN_INLINE)
409#define __GMP_EXTERN_INLINE static inline
410#endif
411
412
413/* C++ always has "inline" and since it's a normal feature the linker should
414 discard duplicate non-inlined copies, or if it doesn't then that's a
415 problem for everyone, not just GMP. */
416#if defined (__cplusplus) && ! defined (__GMP_EXTERN_INLINE)
417#define __GMP_EXTERN_INLINE inline
418#endif
419
420/* Don't do any inlining within a configure run, since if the compiler ends
421 up emitting copies of the code into the object file it can end up
422 demanding the various support routines (like mpn_popcount) for linking,
423 making the "alloca" test and perhaps others fail. And on hppa ia64 a
424 pre-release gcc 3.2 was seen not respecting the "extern" in "extern
425 __inline__", triggering this problem too. */
426#if defined (__GMP_WITHIN_CONFIGURE) && ! __GMP_WITHIN_CONFIGURE_INLINE
427#undef __GMP_EXTERN_INLINE
428#endif
429
430/* By default, don't give a prototype when there's going to be an inline
431 version. Note in particular that Cray C++ objects to the combination of
432 prototype and inline. */
433#ifdef __GMP_EXTERN_INLINE
434#ifndef __GMP_INLINE_PROTOTYPES
435#define __GMP_INLINE_PROTOTYPES 0
436#endif
437#else
438#define __GMP_INLINE_PROTOTYPES 1
439#endif
440
441
442#define __GMP_ABS(x) ((x) >= 0 ? (x) : -(x))
443#define __GMP_MAX(h,i) ((h) > (i) ? (h) : (i))
444
445
446/* __builtin_expect is in gcc 3.0, and not in 2.95. */
447#if __GMP_GNUC_PREREQ (3,0)
448#define __GMP_LIKELY(cond) __builtin_expect ((cond) != 0, 1)
449#define __GMP_UNLIKELY(cond) __builtin_expect ((cond) != 0, 0)
450#else
451#define __GMP_LIKELY(cond) (cond)
452#define __GMP_UNLIKELY(cond) (cond)
453#endif
454
455#ifdef _CRAY
456#define __GMP_CRAY_Pragma(str) _Pragma (str)
457#else
458#define __GMP_CRAY_Pragma(str)
459#endif
460
461
462/* Allow direct user access to numerator and denominator of an mpq_t object. */
463#define mpq_numref(Q) (&((Q)->_mp_num))
464#define mpq_denref(Q) (&((Q)->_mp_den))
465
466
467#if defined (__cplusplus)
468extern "C" {
469using std::FILE;
470#endif
471
472#define mp_set_memory_functions __gmp_set_memory_functions
473__GMP_DECLSPEC void mp_set_memory_functions (void *(*) (size_t),
474 void *(*) (void *, size_t, size_t),
475 void (*) (void *, size_t)) __GMP_NOTHROW;
476
477#define mp_get_memory_functions __gmp_get_memory_functions
478__GMP_DECLSPEC void mp_get_memory_functions (void *(**) (size_t),
479 void *(**) (void *, size_t, size_t),
480 void (**) (void *, size_t)) __GMP_NOTHROW;
481
482#define mp_bits_per_limb __gmp_bits_per_limb
483__GMP_DECLSPEC extern const int mp_bits_per_limb;
484
485#define gmp_errno __gmp_errno
486__GMP_DECLSPEC extern int gmp_errno;
487
488#define gmp_version __gmp_version
489__GMP_DECLSPEC extern const char * const gmp_version;
490
491
492/**************** Random number routines. ****************/
493
494/* obsolete */
495#define gmp_randinit __gmp_randinit
496__GMP_DECLSPEC void gmp_randinit (gmp_randstate_t, gmp_randalg_t, ...);
497
498#define gmp_randinit_default __gmp_randinit_default
499__GMP_DECLSPEC void gmp_randinit_default (gmp_randstate_t);
500
501#define gmp_randinit_lc_2exp __gmp_randinit_lc_2exp
502__GMP_DECLSPEC void gmp_randinit_lc_2exp (gmp_randstate_t, mpz_srcptr, unsigned long int, mp_bitcnt_t);
503
504#define gmp_randinit_lc_2exp_size __gmp_randinit_lc_2exp_size
505__GMP_DECLSPEC int gmp_randinit_lc_2exp_size (gmp_randstate_t, mp_bitcnt_t);
506
507#define gmp_randinit_mt __gmp_randinit_mt
508__GMP_DECLSPEC void gmp_randinit_mt (gmp_randstate_t);
509
510#define gmp_randinit_set __gmp_randinit_set
511__GMP_DECLSPEC void gmp_randinit_set (gmp_randstate_t, const __gmp_randstate_struct *);
512
513#define gmp_randseed __gmp_randseed
514__GMP_DECLSPEC void gmp_randseed (gmp_randstate_t, mpz_srcptr);
515
516#define gmp_randseed_ui __gmp_randseed_ui
517__GMP_DECLSPEC void gmp_randseed_ui (gmp_randstate_t, unsigned long int);
518
519#define gmp_randclear __gmp_randclear
520__GMP_DECLSPEC void gmp_randclear (gmp_randstate_t);
521
522#define gmp_urandomb_ui __gmp_urandomb_ui
523__GMP_DECLSPEC unsigned long gmp_urandomb_ui (gmp_randstate_t, unsigned long);
524
525#define gmp_urandomm_ui __gmp_urandomm_ui
526__GMP_DECLSPEC unsigned long gmp_urandomm_ui (gmp_randstate_t, unsigned long);
527
528
529/**************** Formatted output routines. ****************/
530
531#define gmp_asprintf __gmp_asprintf
532__GMP_DECLSPEC int gmp_asprintf (char **, const char *, ...);
533
534#define gmp_fprintf __gmp_fprintf
535#ifdef _GMP_H_HAVE_FILE
536__GMP_DECLSPEC int gmp_fprintf (FILE *, const char *, ...);
537#endif
538
539#define gmp_obstack_printf __gmp_obstack_printf
540#if defined (_GMP_H_HAVE_OBSTACK)
541__GMP_DECLSPEC int gmp_obstack_printf (struct obstack *, const char *, ...);
542#endif
543
544#define gmp_obstack_vprintf __gmp_obstack_vprintf
545#if defined (_GMP_H_HAVE_OBSTACK) && defined (_GMP_H_HAVE_VA_LIST)
546__GMP_DECLSPEC int gmp_obstack_vprintf (struct obstack *, const char *, va_list);
547#endif
548
549#define gmp_printf __gmp_printf
550__GMP_DECLSPEC int gmp_printf (const char *, ...);
551
552#define gmp_snprintf __gmp_snprintf
553__GMP_DECLSPEC int gmp_snprintf (char *, size_t, const char *, ...);
554
555#define gmp_sprintf __gmp_sprintf
556__GMP_DECLSPEC int gmp_sprintf (char *, const char *, ...);
557
558#define gmp_vasprintf __gmp_vasprintf
559#if defined (_GMP_H_HAVE_VA_LIST)
560__GMP_DECLSPEC int gmp_vasprintf (char **, const char *, va_list);
561#endif
562
563#define gmp_vfprintf __gmp_vfprintf
564#if defined (_GMP_H_HAVE_FILE) && defined (_GMP_H_HAVE_VA_LIST)
565__GMP_DECLSPEC int gmp_vfprintf (FILE *, const char *, va_list);
566#endif
567
568#define gmp_vprintf __gmp_vprintf
569#if defined (_GMP_H_HAVE_VA_LIST)
570__GMP_DECLSPEC int gmp_vprintf (const char *, va_list);
571#endif
572
573#define gmp_vsnprintf __gmp_vsnprintf
574#if defined (_GMP_H_HAVE_VA_LIST)
575__GMP_DECLSPEC int gmp_vsnprintf (char *, size_t, const char *, va_list);
576#endif
577
578#define gmp_vsprintf __gmp_vsprintf
579#if defined (_GMP_H_HAVE_VA_LIST)
580__GMP_DECLSPEC int gmp_vsprintf (char *, const char *, va_list);
581#endif
582
583
584/**************** Formatted input routines. ****************/
585
586#define gmp_fscanf __gmp_fscanf
587#ifdef _GMP_H_HAVE_FILE
588__GMP_DECLSPEC int gmp_fscanf (FILE *, const char *, ...);
589#endif
590
591#define gmp_scanf __gmp_scanf
592__GMP_DECLSPEC int gmp_scanf (const char *, ...);
593
594#define gmp_sscanf __gmp_sscanf
595__GMP_DECLSPEC int gmp_sscanf (const char *, const char *, ...);
596
597#define gmp_vfscanf __gmp_vfscanf
598#if defined (_GMP_H_HAVE_FILE) && defined (_GMP_H_HAVE_VA_LIST)
599__GMP_DECLSPEC int gmp_vfscanf (FILE *, const char *, va_list);
600#endif
601
602#define gmp_vscanf __gmp_vscanf
603#if defined (_GMP_H_HAVE_VA_LIST)
604__GMP_DECLSPEC int gmp_vscanf (const char *, va_list);
605#endif
606
607#define gmp_vsscanf __gmp_vsscanf
608#if defined (_GMP_H_HAVE_VA_LIST)
609__GMP_DECLSPEC int gmp_vsscanf (const char *, const char *, va_list);
610#endif
611
612
613/**************** Integer (i.e. Z) routines. ****************/
614
615#define _mpz_realloc __gmpz_realloc
616#define mpz_realloc __gmpz_realloc
617__GMP_DECLSPEC void *_mpz_realloc (mpz_ptr, mp_size_t);
618
619#define mpz_abs __gmpz_abs
620#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_abs)
621__GMP_DECLSPEC void mpz_abs (mpz_ptr, mpz_srcptr);
622#endif
623
624#define mpz_add __gmpz_add
625__GMP_DECLSPEC void mpz_add (mpz_ptr, mpz_srcptr, mpz_srcptr);
626
627#define mpz_add_ui __gmpz_add_ui
628__GMP_DECLSPEC void mpz_add_ui (mpz_ptr, mpz_srcptr, unsigned long int);
629
630#define mpz_addmul __gmpz_addmul
631__GMP_DECLSPEC void mpz_addmul (mpz_ptr, mpz_srcptr, mpz_srcptr);
632
633#define mpz_addmul_ui __gmpz_addmul_ui
634__GMP_DECLSPEC void mpz_addmul_ui (mpz_ptr, mpz_srcptr, unsigned long int);
635
636#define mpz_and __gmpz_and
637__GMP_DECLSPEC void mpz_and (mpz_ptr, mpz_srcptr, mpz_srcptr);
638
639#define mpz_array_init __gmpz_array_init
640__GMP_DECLSPEC void mpz_array_init (mpz_ptr, mp_size_t, mp_size_t);
641
642#define mpz_bin_ui __gmpz_bin_ui
643__GMP_DECLSPEC void mpz_bin_ui (mpz_ptr, mpz_srcptr, unsigned long int);
644
645#define mpz_bin_uiui __gmpz_bin_uiui
646__GMP_DECLSPEC void mpz_bin_uiui (mpz_ptr, unsigned long int, unsigned long int);
647
648#define mpz_cdiv_q __gmpz_cdiv_q
649__GMP_DECLSPEC void mpz_cdiv_q (mpz_ptr, mpz_srcptr, mpz_srcptr);
650
651#define mpz_cdiv_q_2exp __gmpz_cdiv_q_2exp
652__GMP_DECLSPEC void mpz_cdiv_q_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
653
654#define mpz_cdiv_q_ui __gmpz_cdiv_q_ui
655__GMP_DECLSPEC unsigned long int mpz_cdiv_q_ui (mpz_ptr, mpz_srcptr, unsigned long int);
656
657#define mpz_cdiv_qr __gmpz_cdiv_qr
658__GMP_DECLSPEC void mpz_cdiv_qr (mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr);
659
660#define mpz_cdiv_qr_ui __gmpz_cdiv_qr_ui
661__GMP_DECLSPEC unsigned long int mpz_cdiv_qr_ui (mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int);
662
663#define mpz_cdiv_r __gmpz_cdiv_r
664__GMP_DECLSPEC void mpz_cdiv_r (mpz_ptr, mpz_srcptr, mpz_srcptr);
665
666#define mpz_cdiv_r_2exp __gmpz_cdiv_r_2exp
667__GMP_DECLSPEC void mpz_cdiv_r_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
668
669#define mpz_cdiv_r_ui __gmpz_cdiv_r_ui
670__GMP_DECLSPEC unsigned long int mpz_cdiv_r_ui (mpz_ptr, mpz_srcptr, unsigned long int);
671
672#define mpz_cdiv_ui __gmpz_cdiv_ui
673__GMP_DECLSPEC unsigned long int mpz_cdiv_ui (mpz_srcptr, unsigned long int) __GMP_ATTRIBUTE_PURE;
674
675#define mpz_clear __gmpz_clear
676__GMP_DECLSPEC void mpz_clear (mpz_ptr);
677
678#define mpz_clears __gmpz_clears
679__GMP_DECLSPEC void mpz_clears (mpz_ptr, ...);
680
681#define mpz_clrbit __gmpz_clrbit
682__GMP_DECLSPEC void mpz_clrbit (mpz_ptr, mp_bitcnt_t);
683
684#define mpz_cmp __gmpz_cmp
685__GMP_DECLSPEC int mpz_cmp (mpz_srcptr, mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
686
687#define mpz_cmp_d __gmpz_cmp_d
688__GMP_DECLSPEC int mpz_cmp_d (mpz_srcptr, double) __GMP_ATTRIBUTE_PURE;
689
690#define _mpz_cmp_si __gmpz_cmp_si
691__GMP_DECLSPEC int _mpz_cmp_si (mpz_srcptr, signed long int) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
692
693#define _mpz_cmp_ui __gmpz_cmp_ui
694__GMP_DECLSPEC int _mpz_cmp_ui (mpz_srcptr, unsigned long int) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
695
696#define mpz_cmpabs __gmpz_cmpabs
697__GMP_DECLSPEC int mpz_cmpabs (mpz_srcptr, mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
698
699#define mpz_cmpabs_d __gmpz_cmpabs_d
700__GMP_DECLSPEC int mpz_cmpabs_d (mpz_srcptr, double) __GMP_ATTRIBUTE_PURE;
701
702#define mpz_cmpabs_ui __gmpz_cmpabs_ui
703__GMP_DECLSPEC int mpz_cmpabs_ui (mpz_srcptr, unsigned long int) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
704
705#define mpz_com __gmpz_com
706__GMP_DECLSPEC void mpz_com (mpz_ptr, mpz_srcptr);
707
708#define mpz_combit __gmpz_combit
709__GMP_DECLSPEC void mpz_combit (mpz_ptr, mp_bitcnt_t);
710
711#define mpz_congruent_p __gmpz_congruent_p
712__GMP_DECLSPEC int mpz_congruent_p (mpz_srcptr, mpz_srcptr, mpz_srcptr) __GMP_ATTRIBUTE_PURE;
713
714#define mpz_congruent_2exp_p __gmpz_congruent_2exp_p
715__GMP_DECLSPEC int mpz_congruent_2exp_p (mpz_srcptr, mpz_srcptr, mp_bitcnt_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
716
717#define mpz_congruent_ui_p __gmpz_congruent_ui_p
718__GMP_DECLSPEC int mpz_congruent_ui_p (mpz_srcptr, unsigned long, unsigned long) __GMP_ATTRIBUTE_PURE;
719
720#define mpz_divexact __gmpz_divexact
721__GMP_DECLSPEC void mpz_divexact (mpz_ptr, mpz_srcptr, mpz_srcptr);
722
723#define mpz_divexact_ui __gmpz_divexact_ui
724__GMP_DECLSPEC void mpz_divexact_ui (mpz_ptr, mpz_srcptr, unsigned long);
725
726#define mpz_divisible_p __gmpz_divisible_p
727__GMP_DECLSPEC int mpz_divisible_p (mpz_srcptr, mpz_srcptr) __GMP_ATTRIBUTE_PURE;
728
729#define mpz_divisible_ui_p __gmpz_divisible_ui_p
730__GMP_DECLSPEC int mpz_divisible_ui_p (mpz_srcptr, unsigned long) __GMP_ATTRIBUTE_PURE;
731
732#define mpz_divisible_2exp_p __gmpz_divisible_2exp_p
733__GMP_DECLSPEC int mpz_divisible_2exp_p (mpz_srcptr, mp_bitcnt_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
734
735#define mpz_dump __gmpz_dump
736__GMP_DECLSPEC void mpz_dump (mpz_srcptr);
737
738#define mpz_export __gmpz_export
739__GMP_DECLSPEC void *mpz_export (void *, size_t *, int, size_t, int, size_t, mpz_srcptr);
740
741#define mpz_fac_ui __gmpz_fac_ui
742__GMP_DECLSPEC void mpz_fac_ui (mpz_ptr, unsigned long int);
743
744#define mpz_2fac_ui __gmpz_2fac_ui
745__GMP_DECLSPEC void mpz_2fac_ui (mpz_ptr, unsigned long int);
746
747#define mpz_mfac_uiui __gmpz_mfac_uiui
748__GMP_DECLSPEC void mpz_mfac_uiui (mpz_ptr, unsigned long int, unsigned long int);
749
750#define mpz_primorial_ui __gmpz_primorial_ui
751__GMP_DECLSPEC void mpz_primorial_ui (mpz_ptr, unsigned long int);
752
753#define mpz_fdiv_q __gmpz_fdiv_q
754__GMP_DECLSPEC void mpz_fdiv_q (mpz_ptr, mpz_srcptr, mpz_srcptr);
755
756#define mpz_fdiv_q_2exp __gmpz_fdiv_q_2exp
757__GMP_DECLSPEC void mpz_fdiv_q_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
758
759#define mpz_fdiv_q_ui __gmpz_fdiv_q_ui
760__GMP_DECLSPEC unsigned long int mpz_fdiv_q_ui (mpz_ptr, mpz_srcptr, unsigned long int);
761
762#define mpz_fdiv_qr __gmpz_fdiv_qr
763__GMP_DECLSPEC void mpz_fdiv_qr (mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr);
764
765#define mpz_fdiv_qr_ui __gmpz_fdiv_qr_ui
766__GMP_DECLSPEC unsigned long int mpz_fdiv_qr_ui (mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int);
767
768#define mpz_fdiv_r __gmpz_fdiv_r
769__GMP_DECLSPEC void mpz_fdiv_r (mpz_ptr, mpz_srcptr, mpz_srcptr);
770
771#define mpz_fdiv_r_2exp __gmpz_fdiv_r_2exp
772__GMP_DECLSPEC void mpz_fdiv_r_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
773
774#define mpz_fdiv_r_ui __gmpz_fdiv_r_ui
775__GMP_DECLSPEC unsigned long int mpz_fdiv_r_ui (mpz_ptr, mpz_srcptr, unsigned long int);
776
777#define mpz_fdiv_ui __gmpz_fdiv_ui
778__GMP_DECLSPEC unsigned long int mpz_fdiv_ui (mpz_srcptr, unsigned long int) __GMP_ATTRIBUTE_PURE;
779
780#define mpz_fib_ui __gmpz_fib_ui
781__GMP_DECLSPEC void mpz_fib_ui (mpz_ptr, unsigned long int);
782
783#define mpz_fib2_ui __gmpz_fib2_ui
784__GMP_DECLSPEC void mpz_fib2_ui (mpz_ptr, mpz_ptr, unsigned long int);
785
786#define mpz_fits_sint_p __gmpz_fits_sint_p
787__GMP_DECLSPEC int mpz_fits_sint_p (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
788
789#define mpz_fits_slong_p __gmpz_fits_slong_p
790__GMP_DECLSPEC int mpz_fits_slong_p (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
791
792#define mpz_fits_sshort_p __gmpz_fits_sshort_p
793__GMP_DECLSPEC int mpz_fits_sshort_p (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
794
795#define mpz_fits_uint_p __gmpz_fits_uint_p
796#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_uint_p)
797__GMP_DECLSPEC int mpz_fits_uint_p (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
798#endif
799
800#define mpz_fits_ulong_p __gmpz_fits_ulong_p
801#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_ulong_p)
802__GMP_DECLSPEC int mpz_fits_ulong_p (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
803#endif
804
805#define mpz_fits_ushort_p __gmpz_fits_ushort_p
806#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_ushort_p)
807__GMP_DECLSPEC int mpz_fits_ushort_p (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
808#endif
809
810#define mpz_gcd __gmpz_gcd
811__GMP_DECLSPEC void mpz_gcd (mpz_ptr, mpz_srcptr, mpz_srcptr);
812
813#define mpz_gcd_ui __gmpz_gcd_ui
814__GMP_DECLSPEC unsigned long int mpz_gcd_ui (mpz_ptr, mpz_srcptr, unsigned long int);
815
816#define mpz_gcdext __gmpz_gcdext
817__GMP_DECLSPEC void mpz_gcdext (mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr);
818
819#define mpz_get_d __gmpz_get_d
820__GMP_DECLSPEC double mpz_get_d (mpz_srcptr) __GMP_ATTRIBUTE_PURE;
821
822#define mpz_get_d_2exp __gmpz_get_d_2exp
823__GMP_DECLSPEC double mpz_get_d_2exp (signed long int *, mpz_srcptr);
824
825#define mpz_get_si __gmpz_get_si
826__GMP_DECLSPEC /* signed */ long int mpz_get_si (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
827
828#define mpz_get_str __gmpz_get_str
829__GMP_DECLSPEC char *mpz_get_str (char *, int, mpz_srcptr);
830
831#define mpz_get_ui __gmpz_get_ui
832#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_get_ui)
833__GMP_DECLSPEC unsigned long int mpz_get_ui (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
834#endif
835
836#define mpz_getlimbn __gmpz_getlimbn
837#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_getlimbn)
838__GMP_DECLSPEC mp_limb_t mpz_getlimbn (mpz_srcptr, mp_size_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
839#endif
840
841#define mpz_hamdist __gmpz_hamdist
842__GMP_DECLSPEC mp_bitcnt_t mpz_hamdist (mpz_srcptr, mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
843
844#define mpz_import __gmpz_import
845__GMP_DECLSPEC void mpz_import (mpz_ptr, size_t, int, size_t, int, size_t, const void *);
846
847#define mpz_init __gmpz_init
848__GMP_DECLSPEC void mpz_init (mpz_ptr);
849
850#define mpz_init2 __gmpz_init2
851__GMP_DECLSPEC void mpz_init2 (mpz_ptr, mp_bitcnt_t);
852
853#define mpz_inits __gmpz_inits
854__GMP_DECLSPEC void mpz_inits (mpz_ptr, ...);
855
856#define mpz_init_set __gmpz_init_set
857__GMP_DECLSPEC void mpz_init_set (mpz_ptr, mpz_srcptr);
858
859#define mpz_init_set_d __gmpz_init_set_d
860__GMP_DECLSPEC void mpz_init_set_d (mpz_ptr, double);
861
862#define mpz_init_set_si __gmpz_init_set_si
863__GMP_DECLSPEC void mpz_init_set_si (mpz_ptr, signed long int);
864
865#define mpz_init_set_str __gmpz_init_set_str
866__GMP_DECLSPEC int mpz_init_set_str (mpz_ptr, const char *, int);
867
868#define mpz_init_set_ui __gmpz_init_set_ui
869__GMP_DECLSPEC void mpz_init_set_ui (mpz_ptr, unsigned long int);
870
871#define mpz_inp_raw __gmpz_inp_raw
872#ifdef _GMP_H_HAVE_FILE
873__GMP_DECLSPEC size_t mpz_inp_raw (mpz_ptr, FILE *);
874#endif
875
876#define mpz_inp_str __gmpz_inp_str
877#ifdef _GMP_H_HAVE_FILE
878__GMP_DECLSPEC size_t mpz_inp_str (mpz_ptr, FILE *, int);
879#endif
880
881#define mpz_invert __gmpz_invert
882__GMP_DECLSPEC int mpz_invert (mpz_ptr, mpz_srcptr, mpz_srcptr);
883
884#define mpz_ior __gmpz_ior
885__GMP_DECLSPEC void mpz_ior (mpz_ptr, mpz_srcptr, mpz_srcptr);
886
887#define mpz_jacobi __gmpz_jacobi
888__GMP_DECLSPEC int mpz_jacobi (mpz_srcptr, mpz_srcptr) __GMP_ATTRIBUTE_PURE;
889
890#define mpz_kronecker mpz_jacobi /* alias */
891
892#define mpz_kronecker_si __gmpz_kronecker_si
893__GMP_DECLSPEC int mpz_kronecker_si (mpz_srcptr, long) __GMP_ATTRIBUTE_PURE;
894
895#define mpz_kronecker_ui __gmpz_kronecker_ui
896__GMP_DECLSPEC int mpz_kronecker_ui (mpz_srcptr, unsigned long) __GMP_ATTRIBUTE_PURE;
897
898#define mpz_si_kronecker __gmpz_si_kronecker
899__GMP_DECLSPEC int mpz_si_kronecker (long, mpz_srcptr) __GMP_ATTRIBUTE_PURE;
900
901#define mpz_ui_kronecker __gmpz_ui_kronecker
902__GMP_DECLSPEC int mpz_ui_kronecker (unsigned long, mpz_srcptr) __GMP_ATTRIBUTE_PURE;
903
904#define mpz_lcm __gmpz_lcm
905__GMP_DECLSPEC void mpz_lcm (mpz_ptr, mpz_srcptr, mpz_srcptr);
906
907#define mpz_lcm_ui __gmpz_lcm_ui
908__GMP_DECLSPEC void mpz_lcm_ui (mpz_ptr, mpz_srcptr, unsigned long);
909
910#define mpz_legendre mpz_jacobi /* alias */
911
912#define mpz_lucnum_ui __gmpz_lucnum_ui
913__GMP_DECLSPEC void mpz_lucnum_ui (mpz_ptr, unsigned long int);
914
915#define mpz_lucnum2_ui __gmpz_lucnum2_ui
916__GMP_DECLSPEC void mpz_lucnum2_ui (mpz_ptr, mpz_ptr, unsigned long int);
917
918#define mpz_millerrabin __gmpz_millerrabin
919__GMP_DECLSPEC int mpz_millerrabin (mpz_srcptr, int) __GMP_ATTRIBUTE_PURE;
920
921#define mpz_mod __gmpz_mod
922__GMP_DECLSPEC void mpz_mod (mpz_ptr, mpz_srcptr, mpz_srcptr);
923
924#define mpz_mod_ui mpz_fdiv_r_ui /* same as fdiv_r because divisor unsigned */
925
926#define mpz_mul __gmpz_mul
927__GMP_DECLSPEC void mpz_mul (mpz_ptr, mpz_srcptr, mpz_srcptr);
928
929#define mpz_mul_2exp __gmpz_mul_2exp
930__GMP_DECLSPEC void mpz_mul_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
931
932#define mpz_mul_si __gmpz_mul_si
933__GMP_DECLSPEC void mpz_mul_si (mpz_ptr, mpz_srcptr, long int);
934
935#define mpz_mul_ui __gmpz_mul_ui
936__GMP_DECLSPEC void mpz_mul_ui (mpz_ptr, mpz_srcptr, unsigned long int);
937
938#define mpz_neg __gmpz_neg
939#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_neg)
940__GMP_DECLSPEC void mpz_neg (mpz_ptr, mpz_srcptr);
941#endif
942
943#define mpz_nextprime __gmpz_nextprime
944__GMP_DECLSPEC void mpz_nextprime (mpz_ptr, mpz_srcptr);
945
946#define mpz_out_raw __gmpz_out_raw
947#ifdef _GMP_H_HAVE_FILE
948__GMP_DECLSPEC size_t mpz_out_raw (FILE *, mpz_srcptr);
949#endif
950
951#define mpz_out_str __gmpz_out_str
952#ifdef _GMP_H_HAVE_FILE
953__GMP_DECLSPEC size_t mpz_out_str (FILE *, int, mpz_srcptr);
954#endif
955
956#define mpz_perfect_power_p __gmpz_perfect_power_p
957__GMP_DECLSPEC int mpz_perfect_power_p (mpz_srcptr) __GMP_ATTRIBUTE_PURE;
958
959#define mpz_perfect_square_p __gmpz_perfect_square_p
960#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_perfect_square_p)
961__GMP_DECLSPEC int mpz_perfect_square_p (mpz_srcptr) __GMP_ATTRIBUTE_PURE;
962#endif
963
964#define mpz_popcount __gmpz_popcount
965#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_popcount)
966__GMP_DECLSPEC mp_bitcnt_t mpz_popcount (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
967#endif
968
969#define mpz_pow_ui __gmpz_pow_ui
970__GMP_DECLSPEC void mpz_pow_ui (mpz_ptr, mpz_srcptr, unsigned long int);
971
972#define mpz_powm __gmpz_powm
973__GMP_DECLSPEC void mpz_powm (mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr);
974
975#define mpz_powm_sec __gmpz_powm_sec
976__GMP_DECLSPEC void mpz_powm_sec (mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr);
977
978#define mpz_powm_ui __gmpz_powm_ui
979__GMP_DECLSPEC void mpz_powm_ui (mpz_ptr, mpz_srcptr, unsigned long int, mpz_srcptr);
980
981#define mpz_probab_prime_p __gmpz_probab_prime_p
982__GMP_DECLSPEC int mpz_probab_prime_p (mpz_srcptr, int) __GMP_ATTRIBUTE_PURE;
983
984#define mpz_random __gmpz_random
985__GMP_DECLSPEC void mpz_random (mpz_ptr, mp_size_t);
986
987#define mpz_random2 __gmpz_random2
988__GMP_DECLSPEC void mpz_random2 (mpz_ptr, mp_size_t);
989
990#define mpz_realloc2 __gmpz_realloc2
991__GMP_DECLSPEC void mpz_realloc2 (mpz_ptr, mp_bitcnt_t);
992
993#define mpz_remove __gmpz_remove
994__GMP_DECLSPEC mp_bitcnt_t mpz_remove (mpz_ptr, mpz_srcptr, mpz_srcptr);
995
996#define mpz_root __gmpz_root
997__GMP_DECLSPEC int mpz_root (mpz_ptr, mpz_srcptr, unsigned long int);
998
999#define mpz_rootrem __gmpz_rootrem
1000__GMP_DECLSPEC void mpz_rootrem (mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int);
1001
1002#define mpz_rrandomb __gmpz_rrandomb
1003__GMP_DECLSPEC void mpz_rrandomb (mpz_ptr, gmp_randstate_t, mp_bitcnt_t);
1004
1005#define mpz_scan0 __gmpz_scan0
1006__GMP_DECLSPEC mp_bitcnt_t mpz_scan0 (mpz_srcptr, mp_bitcnt_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1007
1008#define mpz_scan1 __gmpz_scan1
1009__GMP_DECLSPEC mp_bitcnt_t mpz_scan1 (mpz_srcptr, mp_bitcnt_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1010
1011#define mpz_set __gmpz_set
1012__GMP_DECLSPEC void mpz_set (mpz_ptr, mpz_srcptr);
1013
1014#define mpz_set_d __gmpz_set_d
1015__GMP_DECLSPEC void mpz_set_d (mpz_ptr, double);
1016
1017#define mpz_set_f __gmpz_set_f
1018__GMP_DECLSPEC void mpz_set_f (mpz_ptr, mpf_srcptr);
1019
1020#define mpz_set_q __gmpz_set_q
1021#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_set_q)
1022__GMP_DECLSPEC void mpz_set_q (mpz_ptr, mpq_srcptr);
1023#endif
1024
1025#define mpz_set_si __gmpz_set_si
1026__GMP_DECLSPEC void mpz_set_si (mpz_ptr, signed long int);
1027
1028#define mpz_set_str __gmpz_set_str
1029__GMP_DECLSPEC int mpz_set_str (mpz_ptr, const char *, int);
1030
1031#define mpz_set_ui __gmpz_set_ui
1032__GMP_DECLSPEC void mpz_set_ui (mpz_ptr, unsigned long int);
1033
1034#define mpz_setbit __gmpz_setbit
1035__GMP_DECLSPEC void mpz_setbit (mpz_ptr, mp_bitcnt_t);
1036
1037#define mpz_size __gmpz_size
1038#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_size)
1039__GMP_DECLSPEC size_t mpz_size (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1040#endif
1041
1042#define mpz_sizeinbase __gmpz_sizeinbase
1043__GMP_DECLSPEC size_t mpz_sizeinbase (mpz_srcptr, int) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1044
1045#define mpz_sqrt __gmpz_sqrt
1046__GMP_DECLSPEC void mpz_sqrt (mpz_ptr, mpz_srcptr);
1047
1048#define mpz_sqrtrem __gmpz_sqrtrem
1049__GMP_DECLSPEC void mpz_sqrtrem (mpz_ptr, mpz_ptr, mpz_srcptr);
1050
1051#define mpz_sub __gmpz_sub
1052__GMP_DECLSPEC void mpz_sub (mpz_ptr, mpz_srcptr, mpz_srcptr);
1053
1054#define mpz_sub_ui __gmpz_sub_ui
1055__GMP_DECLSPEC void mpz_sub_ui (mpz_ptr, mpz_srcptr, unsigned long int);
1056
1057#define mpz_ui_sub __gmpz_ui_sub
1058__GMP_DECLSPEC void mpz_ui_sub (mpz_ptr, unsigned long int, mpz_srcptr);
1059
1060#define mpz_submul __gmpz_submul
1061__GMP_DECLSPEC void mpz_submul (mpz_ptr, mpz_srcptr, mpz_srcptr);
1062
1063#define mpz_submul_ui __gmpz_submul_ui
1064__GMP_DECLSPEC void mpz_submul_ui (mpz_ptr, mpz_srcptr, unsigned long int);
1065
1066#define mpz_swap __gmpz_swap
1067__GMP_DECLSPEC void mpz_swap (mpz_ptr, mpz_ptr) __GMP_NOTHROW;
1068
1069#define mpz_tdiv_ui __gmpz_tdiv_ui
1070__GMP_DECLSPEC unsigned long int mpz_tdiv_ui (mpz_srcptr, unsigned long int) __GMP_ATTRIBUTE_PURE;
1071
1072#define mpz_tdiv_q __gmpz_tdiv_q
1073__GMP_DECLSPEC void mpz_tdiv_q (mpz_ptr, mpz_srcptr, mpz_srcptr);
1074
1075#define mpz_tdiv_q_2exp __gmpz_tdiv_q_2exp
1076__GMP_DECLSPEC void mpz_tdiv_q_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
1077
1078#define mpz_tdiv_q_ui __gmpz_tdiv_q_ui
1079__GMP_DECLSPEC unsigned long int mpz_tdiv_q_ui (mpz_ptr, mpz_srcptr, unsigned long int);
1080
1081#define mpz_tdiv_qr __gmpz_tdiv_qr
1082__GMP_DECLSPEC void mpz_tdiv_qr (mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr);
1083
1084#define mpz_tdiv_qr_ui __gmpz_tdiv_qr_ui
1085__GMP_DECLSPEC unsigned long int mpz_tdiv_qr_ui (mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int);
1086
1087#define mpz_tdiv_r __gmpz_tdiv_r
1088__GMP_DECLSPEC void mpz_tdiv_r (mpz_ptr, mpz_srcptr, mpz_srcptr);
1089
1090#define mpz_tdiv_r_2exp __gmpz_tdiv_r_2exp
1091__GMP_DECLSPEC void mpz_tdiv_r_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
1092
1093#define mpz_tdiv_r_ui __gmpz_tdiv_r_ui
1094__GMP_DECLSPEC unsigned long int mpz_tdiv_r_ui (mpz_ptr, mpz_srcptr, unsigned long int);
1095
1096#define mpz_tstbit __gmpz_tstbit
1097__GMP_DECLSPEC int mpz_tstbit (mpz_srcptr, mp_bitcnt_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1098
1099#define mpz_ui_pow_ui __gmpz_ui_pow_ui
1100__GMP_DECLSPEC void mpz_ui_pow_ui (mpz_ptr, unsigned long int, unsigned long int);
1101
1102#define mpz_urandomb __gmpz_urandomb
1103__GMP_DECLSPEC void mpz_urandomb (mpz_ptr, gmp_randstate_t, mp_bitcnt_t);
1104
1105#define mpz_urandomm __gmpz_urandomm
1106__GMP_DECLSPEC void mpz_urandomm (mpz_ptr, gmp_randstate_t, mpz_srcptr);
1107
1108#define mpz_xor __gmpz_xor
1109#define mpz_eor __gmpz_xor
1110__GMP_DECLSPEC void mpz_xor (mpz_ptr, mpz_srcptr, mpz_srcptr);
1111
1112#define mpz_limbs_read __gmpz_limbs_read
1113__GMP_DECLSPEC mp_srcptr mpz_limbs_read (mpz_srcptr);
1114
1115#define mpz_limbs_write __gmpz_limbs_write
1116__GMP_DECLSPEC mp_ptr mpz_limbs_write (mpz_ptr, mp_size_t);
1117
1118#define mpz_limbs_modify __gmpz_limbs_modify
1119__GMP_DECLSPEC mp_ptr mpz_limbs_modify (mpz_ptr, mp_size_t);
1120
1121#define mpz_limbs_finish __gmpz_limbs_finish
1122__GMP_DECLSPEC void mpz_limbs_finish (mpz_ptr, mp_size_t);
1123
1124#define mpz_roinit_n __gmpz_roinit_n
1125__GMP_DECLSPEC mpz_srcptr mpz_roinit_n (mpz_ptr, mp_srcptr, mp_size_t);
1126
1127#define MPZ_ROINIT_N(xp, xs) {{0, (xs),(xp) }}
1128
1129/**************** Rational (i.e. Q) routines. ****************/
1130
1131#define mpq_abs __gmpq_abs
1132#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpq_abs)
1133__GMP_DECLSPEC void mpq_abs (mpq_ptr, mpq_srcptr);
1134#endif
1135
1136#define mpq_add __gmpq_add
1137__GMP_DECLSPEC void mpq_add (mpq_ptr, mpq_srcptr, mpq_srcptr);
1138
1139#define mpq_canonicalize __gmpq_canonicalize
1140__GMP_DECLSPEC void mpq_canonicalize (mpq_ptr);
1141
1142#define mpq_clear __gmpq_clear
1143__GMP_DECLSPEC void mpq_clear (mpq_ptr);
1144
1145#define mpq_clears __gmpq_clears
1146__GMP_DECLSPEC void mpq_clears (mpq_ptr, ...);
1147
1148#define mpq_cmp __gmpq_cmp
1149__GMP_DECLSPEC int mpq_cmp (mpq_srcptr, mpq_srcptr) __GMP_ATTRIBUTE_PURE;
1150
1151#define _mpq_cmp_si __gmpq_cmp_si
1152__GMP_DECLSPEC int _mpq_cmp_si (mpq_srcptr, long, unsigned long) __GMP_ATTRIBUTE_PURE;
1153
1154#define _mpq_cmp_ui __gmpq_cmp_ui
1155__GMP_DECLSPEC int _mpq_cmp_ui (mpq_srcptr, unsigned long int, unsigned long int) __GMP_ATTRIBUTE_PURE;
1156
1157#define mpq_cmp_z __gmpq_cmp_z
1158__GMP_DECLSPEC int mpq_cmp_z (mpq_srcptr, mpz_srcptr) __GMP_ATTRIBUTE_PURE;
1159
1160#define mpq_div __gmpq_div
1161__GMP_DECLSPEC void mpq_div (mpq_ptr, mpq_srcptr, mpq_srcptr);
1162
1163#define mpq_div_2exp __gmpq_div_2exp
1164__GMP_DECLSPEC void mpq_div_2exp (mpq_ptr, mpq_srcptr, mp_bitcnt_t);
1165
1166#define mpq_equal __gmpq_equal
1167__GMP_DECLSPEC int mpq_equal (mpq_srcptr, mpq_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1168
1169#define mpq_get_num __gmpq_get_num
1170__GMP_DECLSPEC void mpq_get_num (mpz_ptr, mpq_srcptr);
1171
1172#define mpq_get_den __gmpq_get_den
1173__GMP_DECLSPEC void mpq_get_den (mpz_ptr, mpq_srcptr);
1174
1175#define mpq_get_d __gmpq_get_d
1176__GMP_DECLSPEC double mpq_get_d (mpq_srcptr) __GMP_ATTRIBUTE_PURE;
1177
1178#define mpq_get_str __gmpq_get_str
1179__GMP_DECLSPEC char *mpq_get_str (char *, int, mpq_srcptr);
1180
1181#define mpq_init __gmpq_init
1182__GMP_DECLSPEC void mpq_init (mpq_ptr);
1183
1184#define mpq_inits __gmpq_inits
1185__GMP_DECLSPEC void mpq_inits (mpq_ptr, ...);
1186
1187#define mpq_inp_str __gmpq_inp_str
1188#ifdef _GMP_H_HAVE_FILE
1189__GMP_DECLSPEC size_t mpq_inp_str (mpq_ptr, FILE *, int);
1190#endif
1191
1192#define mpq_inv __gmpq_inv
1193__GMP_DECLSPEC void mpq_inv (mpq_ptr, mpq_srcptr);
1194
1195#define mpq_mul __gmpq_mul
1196__GMP_DECLSPEC void mpq_mul (mpq_ptr, mpq_srcptr, mpq_srcptr);
1197
1198#define mpq_mul_2exp __gmpq_mul_2exp
1199__GMP_DECLSPEC void mpq_mul_2exp (mpq_ptr, mpq_srcptr, mp_bitcnt_t);
1200
1201#define mpq_neg __gmpq_neg
1202#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpq_neg)
1203__GMP_DECLSPEC void mpq_neg (mpq_ptr, mpq_srcptr);
1204#endif
1205
1206#define mpq_out_str __gmpq_out_str
1207#ifdef _GMP_H_HAVE_FILE
1208__GMP_DECLSPEC size_t mpq_out_str (FILE *, int, mpq_srcptr);
1209#endif
1210
1211#define mpq_set __gmpq_set
1212__GMP_DECLSPEC void mpq_set (mpq_ptr, mpq_srcptr);
1213
1214#define mpq_set_d __gmpq_set_d
1215__GMP_DECLSPEC void mpq_set_d (mpq_ptr, double);
1216
1217#define mpq_set_den __gmpq_set_den
1218__GMP_DECLSPEC void mpq_set_den (mpq_ptr, mpz_srcptr);
1219
1220#define mpq_set_f __gmpq_set_f
1221__GMP_DECLSPEC void mpq_set_f (mpq_ptr, mpf_srcptr);
1222
1223#define mpq_set_num __gmpq_set_num
1224__GMP_DECLSPEC void mpq_set_num (mpq_ptr, mpz_srcptr);
1225
1226#define mpq_set_si __gmpq_set_si
1227__GMP_DECLSPEC void mpq_set_si (mpq_ptr, signed long int, unsigned long int);
1228
1229#define mpq_set_str __gmpq_set_str
1230__GMP_DECLSPEC int mpq_set_str (mpq_ptr, const char *, int);
1231
1232#define mpq_set_ui __gmpq_set_ui
1233__GMP_DECLSPEC void mpq_set_ui (mpq_ptr, unsigned long int, unsigned long int);
1234
1235#define mpq_set_z __gmpq_set_z
1236__GMP_DECLSPEC void mpq_set_z (mpq_ptr, mpz_srcptr);
1237
1238#define mpq_sub __gmpq_sub
1239__GMP_DECLSPEC void mpq_sub (mpq_ptr, mpq_srcptr, mpq_srcptr);
1240
1241#define mpq_swap __gmpq_swap
1242__GMP_DECLSPEC void mpq_swap (mpq_ptr, mpq_ptr) __GMP_NOTHROW;
1243
1244
1245/**************** Float (i.e. F) routines. ****************/
1246
1247#define mpf_abs __gmpf_abs
1248__GMP_DECLSPEC void mpf_abs (mpf_ptr, mpf_srcptr);
1249
1250#define mpf_add __gmpf_add
1251__GMP_DECLSPEC void mpf_add (mpf_ptr, mpf_srcptr, mpf_srcptr);
1252
1253#define mpf_add_ui __gmpf_add_ui
1254__GMP_DECLSPEC void mpf_add_ui (mpf_ptr, mpf_srcptr, unsigned long int);
1255#define mpf_ceil __gmpf_ceil
1256__GMP_DECLSPEC void mpf_ceil (mpf_ptr, mpf_srcptr);
1257
1258#define mpf_clear __gmpf_clear
1259__GMP_DECLSPEC void mpf_clear (mpf_ptr);
1260
1261#define mpf_clears __gmpf_clears
1262__GMP_DECLSPEC void mpf_clears (mpf_ptr, ...);
1263
1264#define mpf_cmp __gmpf_cmp
1265__GMP_DECLSPEC int mpf_cmp (mpf_srcptr, mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1266
1267#define mpf_cmp_z __gmpf_cmp_z
1268__GMP_DECLSPEC int mpf_cmp_z (mpf_srcptr, mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1269
1270#define mpf_cmp_d __gmpf_cmp_d
1271__GMP_DECLSPEC int mpf_cmp_d (mpf_srcptr, double) __GMP_ATTRIBUTE_PURE;
1272
1273#define mpf_cmp_si __gmpf_cmp_si
1274__GMP_DECLSPEC int mpf_cmp_si (mpf_srcptr, signed long int) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1275
1276#define mpf_cmp_ui __gmpf_cmp_ui
1277__GMP_DECLSPEC int mpf_cmp_ui (mpf_srcptr, unsigned long int) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1278
1279#define mpf_div __gmpf_div
1280__GMP_DECLSPEC void mpf_div (mpf_ptr, mpf_srcptr, mpf_srcptr);
1281
1282#define mpf_div_2exp __gmpf_div_2exp
1283__GMP_DECLSPEC void mpf_div_2exp (mpf_ptr, mpf_srcptr, mp_bitcnt_t);
1284
1285#define mpf_div_ui __gmpf_div_ui
1286__GMP_DECLSPEC void mpf_div_ui (mpf_ptr, mpf_srcptr, unsigned long int);
1287
1288#define mpf_dump __gmpf_dump
1289__GMP_DECLSPEC void mpf_dump (mpf_srcptr);
1290
1291#define mpf_eq __gmpf_eq
1292__GMP_DECLSPEC int mpf_eq (mpf_srcptr, mpf_srcptr, mp_bitcnt_t) __GMP_ATTRIBUTE_PURE;
1293
1294#define mpf_fits_sint_p __gmpf_fits_sint_p
1295__GMP_DECLSPEC int mpf_fits_sint_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1296
1297#define mpf_fits_slong_p __gmpf_fits_slong_p
1298__GMP_DECLSPEC int mpf_fits_slong_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1299
1300#define mpf_fits_sshort_p __gmpf_fits_sshort_p
1301__GMP_DECLSPEC int mpf_fits_sshort_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1302
1303#define mpf_fits_uint_p __gmpf_fits_uint_p
1304__GMP_DECLSPEC int mpf_fits_uint_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1305
1306#define mpf_fits_ulong_p __gmpf_fits_ulong_p
1307__GMP_DECLSPEC int mpf_fits_ulong_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1308
1309#define mpf_fits_ushort_p __gmpf_fits_ushort_p
1310__GMP_DECLSPEC int mpf_fits_ushort_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1311
1312#define mpf_floor __gmpf_floor
1313__GMP_DECLSPEC void mpf_floor (mpf_ptr, mpf_srcptr);
1314
1315#define mpf_get_d __gmpf_get_d
1316__GMP_DECLSPEC double mpf_get_d (mpf_srcptr) __GMP_ATTRIBUTE_PURE;
1317
1318#define mpf_get_d_2exp __gmpf_get_d_2exp
1319__GMP_DECLSPEC double mpf_get_d_2exp (signed long int *, mpf_srcptr);
1320
1321#define mpf_get_default_prec __gmpf_get_default_prec
1322__GMP_DECLSPEC mp_bitcnt_t mpf_get_default_prec (void) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1323
1324#define mpf_get_prec __gmpf_get_prec
1325__GMP_DECLSPEC mp_bitcnt_t mpf_get_prec (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1326
1327#define mpf_get_si __gmpf_get_si
1328__GMP_DECLSPEC long mpf_get_si (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1329
1330#define mpf_get_str __gmpf_get_str
1331__GMP_DECLSPEC char *mpf_get_str (char *, mp_exp_t *, int, size_t, mpf_srcptr);
1332
1333#define mpf_get_ui __gmpf_get_ui
1334__GMP_DECLSPEC unsigned long mpf_get_ui (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1335
1336#define mpf_init __gmpf_init
1337__GMP_DECLSPEC void mpf_init (mpf_ptr);
1338
1339#define mpf_init2 __gmpf_init2
1340__GMP_DECLSPEC void mpf_init2 (mpf_ptr, mp_bitcnt_t);
1341
1342#define mpf_inits __gmpf_inits
1343__GMP_DECLSPEC void mpf_inits (mpf_ptr, ...);
1344
1345#define mpf_init_set __gmpf_init_set
1346__GMP_DECLSPEC void mpf_init_set (mpf_ptr, mpf_srcptr);
1347
1348#define mpf_init_set_d __gmpf_init_set_d
1349__GMP_DECLSPEC void mpf_init_set_d (mpf_ptr, double);
1350
1351#define mpf_init_set_si __gmpf_init_set_si
1352__GMP_DECLSPEC void mpf_init_set_si (mpf_ptr, signed long int);
1353
1354#define mpf_init_set_str __gmpf_init_set_str
1355__GMP_DECLSPEC int mpf_init_set_str (mpf_ptr, const char *, int);
1356
1357#define mpf_init_set_ui __gmpf_init_set_ui
1358__GMP_DECLSPEC void mpf_init_set_ui (mpf_ptr, unsigned long int);
1359
1360#define mpf_inp_str __gmpf_inp_str
1361#ifdef _GMP_H_HAVE_FILE
1362__GMP_DECLSPEC size_t mpf_inp_str (mpf_ptr, FILE *, int);
1363#endif
1364
1365#define mpf_integer_p __gmpf_integer_p
1366__GMP_DECLSPEC int mpf_integer_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1367
1368#define mpf_mul __gmpf_mul
1369__GMP_DECLSPEC void mpf_mul (mpf_ptr, mpf_srcptr, mpf_srcptr);
1370
1371#define mpf_mul_2exp __gmpf_mul_2exp
1372__GMP_DECLSPEC void mpf_mul_2exp (mpf_ptr, mpf_srcptr, mp_bitcnt_t);
1373
1374#define mpf_mul_ui __gmpf_mul_ui
1375__GMP_DECLSPEC void mpf_mul_ui (mpf_ptr, mpf_srcptr, unsigned long int);
1376
1377#define mpf_neg __gmpf_neg
1378__GMP_DECLSPEC void mpf_neg (mpf_ptr, mpf_srcptr);
1379
1380#define mpf_out_str __gmpf_out_str
1381#ifdef _GMP_H_HAVE_FILE
1382__GMP_DECLSPEC size_t mpf_out_str (FILE *, int, size_t, mpf_srcptr);
1383#endif
1384
1385#define mpf_pow_ui __gmpf_pow_ui
1386__GMP_DECLSPEC void mpf_pow_ui (mpf_ptr, mpf_srcptr, unsigned long int);
1387
1388#define mpf_random2 __gmpf_random2
1389__GMP_DECLSPEC void mpf_random2 (mpf_ptr, mp_size_t, mp_exp_t);
1390
1391#define mpf_reldiff __gmpf_reldiff
1392__GMP_DECLSPEC void mpf_reldiff (mpf_ptr, mpf_srcptr, mpf_srcptr);
1393
1394#define mpf_set __gmpf_set
1395__GMP_DECLSPEC void mpf_set (mpf_ptr, mpf_srcptr);
1396
1397#define mpf_set_d __gmpf_set_d
1398__GMP_DECLSPEC void mpf_set_d (mpf_ptr, double);
1399
1400#define mpf_set_default_prec __gmpf_set_default_prec
1401__GMP_DECLSPEC void mpf_set_default_prec (mp_bitcnt_t) __GMP_NOTHROW;
1402
1403#define mpf_set_prec __gmpf_set_prec
1404__GMP_DECLSPEC void mpf_set_prec (mpf_ptr, mp_bitcnt_t);
1405
1406#define mpf_set_prec_raw __gmpf_set_prec_raw
1407__GMP_DECLSPEC void mpf_set_prec_raw (mpf_ptr, mp_bitcnt_t) __GMP_NOTHROW;
1408
1409#define mpf_set_q __gmpf_set_q
1410__GMP_DECLSPEC void mpf_set_q (mpf_ptr, mpq_srcptr);
1411
1412#define mpf_set_si __gmpf_set_si
1413__GMP_DECLSPEC void mpf_set_si (mpf_ptr, signed long int);
1414
1415#define mpf_set_str __gmpf_set_str
1416__GMP_DECLSPEC int mpf_set_str (mpf_ptr, const char *, int);
1417
1418#define mpf_set_ui __gmpf_set_ui
1419__GMP_DECLSPEC void mpf_set_ui (mpf_ptr, unsigned long int);
1420
1421#define mpf_set_z __gmpf_set_z
1422__GMP_DECLSPEC void mpf_set_z (mpf_ptr, mpz_srcptr);
1423
1424#define mpf_size __gmpf_size
1425__GMP_DECLSPEC size_t mpf_size (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1426
1427#define mpf_sqrt __gmpf_sqrt
1428__GMP_DECLSPEC void mpf_sqrt (mpf_ptr, mpf_srcptr);
1429
1430#define mpf_sqrt_ui __gmpf_sqrt_ui
1431__GMP_DECLSPEC void mpf_sqrt_ui (mpf_ptr, unsigned long int);
1432
1433#define mpf_sub __gmpf_sub
1434__GMP_DECLSPEC void mpf_sub (mpf_ptr, mpf_srcptr, mpf_srcptr);
1435
1436#define mpf_sub_ui __gmpf_sub_ui
1437__GMP_DECLSPEC void mpf_sub_ui (mpf_ptr, mpf_srcptr, unsigned long int);
1438
1439#define mpf_swap __gmpf_swap
1440__GMP_DECLSPEC void mpf_swap (mpf_ptr, mpf_ptr) __GMP_NOTHROW;
1441
1442#define mpf_trunc __gmpf_trunc
1443__GMP_DECLSPEC void mpf_trunc (mpf_ptr, mpf_srcptr);
1444
1445#define mpf_ui_div __gmpf_ui_div
1446__GMP_DECLSPEC void mpf_ui_div (mpf_ptr, unsigned long int, mpf_srcptr);
1447
1448#define mpf_ui_sub __gmpf_ui_sub
1449__GMP_DECLSPEC void mpf_ui_sub (mpf_ptr, unsigned long int, mpf_srcptr);
1450
1451#define mpf_urandomb __gmpf_urandomb
1452__GMP_DECLSPEC void mpf_urandomb (mpf_t, gmp_randstate_t, mp_bitcnt_t);
1453
1454
1455/************ Low level positive-integer (i.e. N) routines. ************/
1456
1457/* This is ugly, but we need to make user calls reach the prefixed function. */
1458
1459#define mpn_add __MPN(add)
1460#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_add)
1461__GMP_DECLSPEC mp_limb_t mpn_add (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
1462#endif
1463
1464#define mpn_add_1 __MPN(add_1)
1465#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_add_1)
1466__GMP_DECLSPEC mp_limb_t mpn_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t) __GMP_NOTHROW;
1467#endif
1468
1469#define mpn_add_n __MPN(add_n)
1470__GMP_DECLSPEC mp_limb_t mpn_add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1471
1472#define mpn_addmul_1 __MPN(addmul_1)
1473__GMP_DECLSPEC mp_limb_t mpn_addmul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
1474
1475#define mpn_cmp __MPN(cmp)
1476#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_cmp)
1477__GMP_DECLSPEC int mpn_cmp (mp_srcptr, mp_srcptr, mp_size_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1478#endif
1479
1480#define mpn_zero_p __MPN(zero_p)
1481#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_zero_p)
1482__GMP_DECLSPEC int mpn_zero_p (mp_srcptr, mp_size_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1483#endif
1484
1485#define mpn_divexact_1 __MPN(divexact_1)
1486__GMP_DECLSPEC void mpn_divexact_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
1487
1488#define mpn_divexact_by3(dst,src,size) \
1489 mpn_divexact_by3c (dst, src, size, __GMP_CAST (mp_limb_t, 0))
1490
1491#define mpn_divexact_by3c __MPN(divexact_by3c)
1492__GMP_DECLSPEC mp_limb_t mpn_divexact_by3c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
1493
1494#define mpn_divmod_1(qp,np,nsize,dlimb) \
1495 mpn_divrem_1 (qp, __GMP_CAST (mp_size_t, 0), np, nsize, dlimb)
1496
1497#define mpn_divrem __MPN(divrem)
1498__GMP_DECLSPEC mp_limb_t mpn_divrem (mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t);
1499
1500#define mpn_divrem_1 __MPN(divrem_1)
1501__GMP_DECLSPEC mp_limb_t mpn_divrem_1 (mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t);
1502
1503#define mpn_divrem_2 __MPN(divrem_2)
1504__GMP_DECLSPEC mp_limb_t mpn_divrem_2 (mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr);
1505
1506#define mpn_div_qr_1 __MPN(div_qr_1)
1507__GMP_DECLSPEC mp_limb_t mpn_div_qr_1 (mp_ptr, mp_limb_t *, mp_srcptr, mp_size_t, mp_limb_t);
1508
1509#define mpn_div_qr_2 __MPN(div_qr_2)
1510__GMP_DECLSPEC mp_limb_t mpn_div_qr_2 (mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_srcptr);
1511
1512#define mpn_gcd __MPN(gcd)
1513__GMP_DECLSPEC mp_size_t mpn_gcd (mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t);
1514
1515#define mpn_gcd_1 __MPN(gcd_1)
1516__GMP_DECLSPEC mp_limb_t mpn_gcd_1 (mp_srcptr, mp_size_t, mp_limb_t) __GMP_ATTRIBUTE_PURE;
1517
1518#define mpn_gcdext_1 __MPN(gcdext_1)
1519__GMP_DECLSPEC mp_limb_t mpn_gcdext_1 (mp_limb_signed_t *, mp_limb_signed_t *, mp_limb_t, mp_limb_t);
1520
1521#define mpn_gcdext __MPN(gcdext)
1522__GMP_DECLSPEC mp_size_t mpn_gcdext (mp_ptr, mp_ptr, mp_size_t *, mp_ptr, mp_size_t, mp_ptr, mp_size_t);
1523
1524#define mpn_get_str __MPN(get_str)
1525__GMP_DECLSPEC size_t mpn_get_str (unsigned char *, int, mp_ptr, mp_size_t);
1526
1527#define mpn_hamdist __MPN(hamdist)
1528__GMP_DECLSPEC mp_bitcnt_t mpn_hamdist (mp_srcptr, mp_srcptr, mp_size_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1529
1530#define mpn_lshift __MPN(lshift)
1531__GMP_DECLSPEC mp_limb_t mpn_lshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
1532
1533#define mpn_mod_1 __MPN(mod_1)
1534__GMP_DECLSPEC mp_limb_t mpn_mod_1 (mp_srcptr, mp_size_t, mp_limb_t) __GMP_ATTRIBUTE_PURE;
1535
1536#define mpn_mul __MPN(mul)
1537__GMP_DECLSPEC mp_limb_t mpn_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
1538
1539#define mpn_mul_1 __MPN(mul_1)
1540__GMP_DECLSPEC mp_limb_t mpn_mul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
1541
1542#define mpn_mul_n __MPN(mul_n)
1543__GMP_DECLSPEC void mpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1544
1545#define mpn_sqr __MPN(sqr)
1546__GMP_DECLSPEC void mpn_sqr (mp_ptr, mp_srcptr, mp_size_t);
1547
1548#define mpn_neg __MPN(neg)
1549#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_neg)
1550__GMP_DECLSPEC mp_limb_t mpn_neg (mp_ptr, mp_srcptr, mp_size_t);
1551#endif
1552
1553#define mpn_com __MPN(com)
1554__GMP_DECLSPEC void mpn_com (mp_ptr, mp_srcptr, mp_size_t);
1555
1556#define mpn_perfect_square_p __MPN(perfect_square_p)
1557__GMP_DECLSPEC int mpn_perfect_square_p (mp_srcptr, mp_size_t) __GMP_ATTRIBUTE_PURE;
1558
1559#define mpn_perfect_power_p __MPN(perfect_power_p)
1560__GMP_DECLSPEC int mpn_perfect_power_p (mp_srcptr, mp_size_t) __GMP_ATTRIBUTE_PURE;
1561
1562#define mpn_popcount __MPN(popcount)
1563__GMP_DECLSPEC mp_bitcnt_t mpn_popcount (mp_srcptr, mp_size_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1564
1565#define mpn_pow_1 __MPN(pow_1)
1566__GMP_DECLSPEC mp_size_t mpn_pow_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_ptr);
1567
1568/* undocumented now, but retained here for upward compatibility */
1569#define mpn_preinv_mod_1 __MPN(preinv_mod_1)
1570__GMP_DECLSPEC mp_limb_t mpn_preinv_mod_1 (mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t) __GMP_ATTRIBUTE_PURE;
1571
1572#define mpn_random __MPN(random)
1573__GMP_DECLSPEC void mpn_random (mp_ptr, mp_size_t);
1574
1575#define mpn_random2 __MPN(random2)
1576__GMP_DECLSPEC void mpn_random2 (mp_ptr, mp_size_t);
1577
1578#define mpn_rshift __MPN(rshift)
1579__GMP_DECLSPEC mp_limb_t mpn_rshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
1580
1581#define mpn_scan0 __MPN(scan0)
1582__GMP_DECLSPEC mp_bitcnt_t mpn_scan0 (mp_srcptr, mp_bitcnt_t) __GMP_ATTRIBUTE_PURE;
1583
1584#define mpn_scan1 __MPN(scan1)
1585__GMP_DECLSPEC mp_bitcnt_t mpn_scan1 (mp_srcptr, mp_bitcnt_t) __GMP_ATTRIBUTE_PURE;
1586
1587#define mpn_set_str __MPN(set_str)
1588__GMP_DECLSPEC mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int);
1589
1590#define mpn_sizeinbase __MPN(sizeinbase)
1591__GMP_DECLSPEC size_t mpn_sizeinbase (mp_srcptr, mp_size_t, int);
1592
1593#define mpn_sqrtrem __MPN(sqrtrem)
1594__GMP_DECLSPEC mp_size_t mpn_sqrtrem (mp_ptr, mp_ptr, mp_srcptr, mp_size_t);
1595
1596#define mpn_sub __MPN(sub)
1597#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_sub)
1598__GMP_DECLSPEC mp_limb_t mpn_sub (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
1599#endif
1600
1601#define mpn_sub_1 __MPN(sub_1)
1602#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_sub_1)
1603__GMP_DECLSPEC mp_limb_t mpn_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t) __GMP_NOTHROW;
1604#endif
1605
1606#define mpn_sub_n __MPN(sub_n)
1607__GMP_DECLSPEC mp_limb_t mpn_sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1608
1609#define mpn_submul_1 __MPN(submul_1)
1610__GMP_DECLSPEC mp_limb_t mpn_submul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
1611
1612#define mpn_tdiv_qr __MPN(tdiv_qr)
1613__GMP_DECLSPEC void mpn_tdiv_qr (mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
1614
1615#define mpn_and_n __MPN(and_n)
1616__GMP_DECLSPEC void mpn_and_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1617#define mpn_andn_n __MPN(andn_n)
1618__GMP_DECLSPEC void mpn_andn_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1619#define mpn_nand_n __MPN(nand_n)
1620__GMP_DECLSPEC void mpn_nand_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1621#define mpn_ior_n __MPN(ior_n)
1622__GMP_DECLSPEC void mpn_ior_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1623#define mpn_iorn_n __MPN(iorn_n)
1624__GMP_DECLSPEC void mpn_iorn_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1625#define mpn_nior_n __MPN(nior_n)
1626__GMP_DECLSPEC void mpn_nior_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1627#define mpn_xor_n __MPN(xor_n)
1628__GMP_DECLSPEC void mpn_xor_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1629#define mpn_xnor_n __MPN(xnor_n)
1630__GMP_DECLSPEC void mpn_xnor_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1631
1632#define mpn_copyi __MPN(copyi)
1633__GMP_DECLSPEC void mpn_copyi (mp_ptr, mp_srcptr, mp_size_t);
1634#define mpn_copyd __MPN(copyd)
1635__GMP_DECLSPEC void mpn_copyd (mp_ptr, mp_srcptr, mp_size_t);
1636#define mpn_zero __MPN(zero)
1637__GMP_DECLSPEC void mpn_zero (mp_ptr, mp_size_t);
1638
1639#define mpn_cnd_add_n __MPN(cnd_add_n)
1640__GMP_DECLSPEC mp_limb_t mpn_cnd_add_n (mp_limb_t, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1641#define mpn_cnd_sub_n __MPN(cnd_sub_n)
1642__GMP_DECLSPEC mp_limb_t mpn_cnd_sub_n (mp_limb_t, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1643
1644#define mpn_sec_add_1 __MPN(sec_add_1)
1645__GMP_DECLSPEC mp_limb_t mpn_sec_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_ptr);
1646#define mpn_sec_add_1_itch __MPN(sec_add_1_itch)
1647__GMP_DECLSPEC mp_size_t mpn_sec_add_1_itch (mp_size_t) __GMP_ATTRIBUTE_PURE;
1648
1649#define mpn_sec_sub_1 __MPN(sec_sub_1)
1650__GMP_DECLSPEC mp_limb_t mpn_sec_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_ptr);
1651#define mpn_sec_sub_1_itch __MPN(sec_sub_1_itch)
1652__GMP_DECLSPEC mp_size_t mpn_sec_sub_1_itch (mp_size_t) __GMP_ATTRIBUTE_PURE;
1653
1654#define mpn_cnd_swap __MPN(cnd_swap)
1655__GMP_DECLSPEC void mpn_cnd_swap (mp_limb_t, volatile mp_limb_t *, volatile mp_limb_t *, mp_size_t);
1656
1657#define mpn_sec_mul __MPN(sec_mul)
1658__GMP_DECLSPEC void mpn_sec_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr);
1659#define mpn_sec_mul_itch __MPN(sec_mul_itch)
1660__GMP_DECLSPEC mp_size_t mpn_sec_mul_itch (mp_size_t, mp_size_t) __GMP_ATTRIBUTE_PURE;
1661
1662#define mpn_sec_sqr __MPN(sec_sqr)
1663__GMP_DECLSPEC void mpn_sec_sqr (mp_ptr, mp_srcptr, mp_size_t, mp_ptr);
1664#define mpn_sec_sqr_itch __MPN(sec_sqr_itch)
1665__GMP_DECLSPEC mp_size_t mpn_sec_sqr_itch (mp_size_t) __GMP_ATTRIBUTE_PURE;
1666
1667#define mpn_sec_powm __MPN(sec_powm)
1668__GMP_DECLSPEC void mpn_sec_powm (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_bitcnt_t, mp_srcptr, mp_size_t, mp_ptr);
1669#define mpn_sec_powm_itch __MPN(sec_powm_itch)
1670__GMP_DECLSPEC mp_size_t mpn_sec_powm_itch (mp_size_t, mp_bitcnt_t, mp_size_t) __GMP_ATTRIBUTE_PURE;
1671
1672#define mpn_sec_tabselect __MPN(sec_tabselect)
1673__GMP_DECLSPEC void mpn_sec_tabselect (volatile mp_limb_t *, volatile const mp_limb_t *, mp_size_t, mp_size_t, mp_size_t);
1674
1675#define mpn_sec_div_qr __MPN(sec_div_qr)
1676__GMP_DECLSPEC mp_limb_t mpn_sec_div_qr (mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr);
1677#define mpn_sec_div_qr_itch __MPN(sec_div_qr_itch)
1678__GMP_DECLSPEC mp_size_t mpn_sec_div_qr_itch (mp_size_t, mp_size_t) __GMP_ATTRIBUTE_PURE;
1679#define mpn_sec_div_r __MPN(sec_div_r)
1680__GMP_DECLSPEC void mpn_sec_div_r (mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr);
1681#define mpn_sec_div_r_itch __MPN(sec_div_r_itch)
1682__GMP_DECLSPEC mp_size_t mpn_sec_div_r_itch (mp_size_t, mp_size_t) __GMP_ATTRIBUTE_PURE;
1683
1684#define mpn_sec_invert __MPN(sec_invert)
1685__GMP_DECLSPEC int mpn_sec_invert (mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_bitcnt_t, mp_ptr);
1686#define mpn_sec_invert_itch __MPN(sec_invert_itch)
1687__GMP_DECLSPEC mp_size_t mpn_sec_invert_itch (mp_size_t) __GMP_ATTRIBUTE_PURE;
1688
1689
1690/**************** mpz inlines ****************/
1691
1692/* The following are provided as inlines where possible, but always exist as
1693 library functions too, for binary compatibility.
1694
1695 Within gmp itself this inlining generally isn't relied on, since it
1696 doesn't get done for all compilers, whereas if something is worth
1697 inlining then it's worth arranging always.
1698
1699 There are two styles of inlining here. When the same bit of code is
1700 wanted for the inline as for the library version, then __GMP_FORCE_foo
1701 arranges for that code to be emitted and the __GMP_EXTERN_INLINE
1702 directive suppressed, eg. mpz_fits_uint_p. When a different bit of code
1703 is wanted for the inline than for the library version, then
1704 __GMP_FORCE_foo arranges the inline to be suppressed, eg. mpz_abs. */
1705
1706#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpz_abs)
1707__GMP_EXTERN_INLINE void
1708mpz_abs (mpz_ptr __gmp_w, mpz_srcptr __gmp_u)
1709{
1710 if (__gmp_w != __gmp_u)
1711 mpz_set (__gmp_w, __gmp_u);
1712 __gmp_w->_mp_size = __GMP_ABS (__gmp_w->_mp_size);
1713}
1714#endif
1715
1716#if GMP_NAIL_BITS == 0
1717#define __GMPZ_FITS_UTYPE_P(z,maxval) \
1718 mp_size_t __gmp_n = z->_mp_size; \
1719 mp_ptr __gmp_p = z->_mp_d; \
1720 return (__gmp_n == 0 || (__gmp_n == 1 && __gmp_p[0] <= maxval));
1721#else
1722#define __GMPZ_FITS_UTYPE_P(z,maxval) \
1723 mp_size_t __gmp_n = z->_mp_size; \
1724 mp_ptr __gmp_p = z->_mp_d; \
1725 return (__gmp_n == 0 || (__gmp_n == 1 && __gmp_p[0] <= maxval) \
1726 || (__gmp_n == 2 && __gmp_p[1] <= ((mp_limb_t) maxval >> GMP_NUMB_BITS)));
1727#endif
1728
1729#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_uint_p)
1730#if ! defined (__GMP_FORCE_mpz_fits_uint_p)
1731__GMP_EXTERN_INLINE
1732#endif
1733int
1734mpz_fits_uint_p (mpz_srcptr __gmp_z) __GMP_NOTHROW
1735{
1736 __GMPZ_FITS_UTYPE_P (__gmp_z, UINT_MAX);
1737}
1738#endif
1739
1740#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_ulong_p)
1741#if ! defined (__GMP_FORCE_mpz_fits_ulong_p)
1742__GMP_EXTERN_INLINE
1743#endif
1744int
1745mpz_fits_ulong_p (mpz_srcptr __gmp_z) __GMP_NOTHROW
1746{
1747 __GMPZ_FITS_UTYPE_P (__gmp_z, ULONG_MAX);
1748}
1749#endif
1750
1751#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_ushort_p)
1752#if ! defined (__GMP_FORCE_mpz_fits_ushort_p)
1753__GMP_EXTERN_INLINE
1754#endif
1755int
1756mpz_fits_ushort_p (mpz_srcptr __gmp_z) __GMP_NOTHROW
1757{
1758 __GMPZ_FITS_UTYPE_P (__gmp_z, USHRT_MAX);
1759}
1760#endif
1761
1762#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_get_ui)
1763#if ! defined (__GMP_FORCE_mpz_get_ui)
1764__GMP_EXTERN_INLINE
1765#endif
1766unsigned long
1767mpz_get_ui (mpz_srcptr __gmp_z) __GMP_NOTHROW
1768{
1769 mp_ptr __gmp_p = __gmp_z->_mp_d;
1770 mp_size_t __gmp_n = __gmp_z->_mp_size;
1771 mp_limb_t __gmp_l = __gmp_p[0];
1772 /* This is a "#if" rather than a plain "if" so as to avoid gcc warnings
1773 about "<< GMP_NUMB_BITS" exceeding the type size, and to avoid Borland
1774 C++ 6.0 warnings about condition always true for something like
1775 "ULONG_MAX < GMP_NUMB_MASK". */
1776#if GMP_NAIL_BITS == 0 || defined (_LONG_LONG_LIMB)
1777 /* limb==long and no nails, or limb==longlong, one limb is enough */
1778 return (__gmp_n != 0 ? __gmp_l : 0);
1779#else
1780 /* limb==long and nails, need two limbs when available */
1781 __gmp_n = __GMP_ABS (__gmp_n);
1782 if (__gmp_n <= 1)
1783 return (__gmp_n != 0 ? __gmp_l : 0);
1784 else
1785 return __gmp_l + (__gmp_p[1] << GMP_NUMB_BITS);
1786#endif
1787}
1788#endif
1789
1790#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_getlimbn)
1791#if ! defined (__GMP_FORCE_mpz_getlimbn)
1792__GMP_EXTERN_INLINE
1793#endif
1794mp_limb_t
1795mpz_getlimbn (mpz_srcptr __gmp_z, mp_size_t __gmp_n) __GMP_NOTHROW
1796{
1797 mp_limb_t __gmp_result = 0;
1798 if (__GMP_LIKELY (__gmp_n >= 0 && __gmp_n < __GMP_ABS (__gmp_z->_mp_size)))
1799 __gmp_result = __gmp_z->_mp_d[__gmp_n];
1800 return __gmp_result;
1801}
1802#endif
1803
1804#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpz_neg)
1805__GMP_EXTERN_INLINE void
1806mpz_neg (mpz_ptr __gmp_w, mpz_srcptr __gmp_u)
1807{
1808 if (__gmp_w != __gmp_u)
1809 mpz_set (__gmp_w, __gmp_u);
1810 __gmp_w->_mp_size = - __gmp_w->_mp_size;
1811}
1812#endif
1813
1814#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_perfect_square_p)
1815#if ! defined (__GMP_FORCE_mpz_perfect_square_p)
1816__GMP_EXTERN_INLINE
1817#endif
1818int
1819mpz_perfect_square_p (mpz_srcptr __gmp_a)
1820{
1821 mp_size_t __gmp_asize;
1822 int __gmp_result;
1823
1824 __gmp_asize = __gmp_a->_mp_size;
1825 __gmp_result = (__gmp_asize >= 0); /* zero is a square, negatives are not */
1826 if (__GMP_LIKELY (__gmp_asize > 0))
1827 __gmp_result = mpn_perfect_square_p (__gmp_a->_mp_d, __gmp_asize);
1828 return __gmp_result;
1829}
1830#endif
1831
1832#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_popcount)
1833#if ! defined (__GMP_FORCE_mpz_popcount)
1834__GMP_EXTERN_INLINE
1835#endif
1836mp_bitcnt_t
1837mpz_popcount (mpz_srcptr __gmp_u) __GMP_NOTHROW
1838{
1839 mp_size_t __gmp_usize;
1840 mp_bitcnt_t __gmp_result;
1841
1842 __gmp_usize = __gmp_u->_mp_size;
1843 __gmp_result = (__gmp_usize < 0 ? ULONG_MAX : 0);
1844 if (__GMP_LIKELY (__gmp_usize > 0))
1845 __gmp_result = mpn_popcount (__gmp_u->_mp_d, __gmp_usize);
1846 return __gmp_result;
1847}
1848#endif
1849
1850#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_set_q)
1851#if ! defined (__GMP_FORCE_mpz_set_q)
1852__GMP_EXTERN_INLINE
1853#endif
1854void
1855mpz_set_q (mpz_ptr __gmp_w, mpq_srcptr __gmp_u)
1856{
1857 mpz_tdiv_q (__gmp_w, mpq_numref (__gmp_u), mpq_denref (__gmp_u));
1858}
1859#endif
1860
1861#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_size)
1862#if ! defined (__GMP_FORCE_mpz_size)
1863__GMP_EXTERN_INLINE
1864#endif
1865size_t
1866mpz_size (mpz_srcptr __gmp_z) __GMP_NOTHROW
1867{
1868 return __GMP_ABS (__gmp_z->_mp_size);
1869}
1870#endif
1871
1872
1873/**************** mpq inlines ****************/
1874
1875#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpq_abs)
1876__GMP_EXTERN_INLINE void
1877mpq_abs (mpq_ptr __gmp_w, mpq_srcptr __gmp_u)
1878{
1879 if (__gmp_w != __gmp_u)
1880 mpq_set (__gmp_w, __gmp_u);
1881 __gmp_w->_mp_num._mp_size = __GMP_ABS (__gmp_w->_mp_num._mp_size);
1882}
1883#endif
1884
1885#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpq_neg)
1886__GMP_EXTERN_INLINE void
1887mpq_neg (mpq_ptr __gmp_w, mpq_srcptr __gmp_u)
1888{
1889 if (__gmp_w != __gmp_u)
1890 mpq_set (__gmp_w, __gmp_u);
1891 __gmp_w->_mp_num._mp_size = - __gmp_w->_mp_num._mp_size;
1892}
1893#endif
1894
1895
1896/**************** mpn inlines ****************/
1897
1898/* The comments with __GMPN_ADD_1 below apply here too.
1899
1900 The test for FUNCTION returning 0 should predict well. If it's assumed
1901 {yp,ysize} will usually have a random number of bits then the high limb
1902 won't be full and a carry out will occur a good deal less than 50% of the
1903 time.
1904
1905 ysize==0 isn't a documented feature, but is used internally in a few
1906 places.
1907
1908 Producing cout last stops it using up a register during the main part of
1909 the calculation, though gcc (as of 3.0) on an "if (mpn_add (...))"
1910 doesn't seem able to move the true and false legs of the conditional up
1911 to the two places cout is generated. */
1912
1913#define __GMPN_AORS(cout, wp, xp, xsize, yp, ysize, FUNCTION, TEST) \
1914 do { \
1915 mp_size_t __gmp_i; \
1916 mp_limb_t __gmp_x; \
1917 \
1918 /* ASSERT ((ysize) >= 0); */ \
1919 /* ASSERT ((xsize) >= (ysize)); */ \
1920 /* ASSERT (MPN_SAME_OR_SEPARATE2_P (wp, xsize, xp, xsize)); */ \
1921 /* ASSERT (MPN_SAME_OR_SEPARATE2_P (wp, xsize, yp, ysize)); */ \
1922 \
1923 __gmp_i = (ysize); \
1924 if (__gmp_i != 0) \
1925 { \
1926 if (FUNCTION (wp, xp, yp, __gmp_i)) \
1927 { \
1928 do \
1929 { \
1930 if (__gmp_i >= (xsize)) \
1931 { \
1932 (cout) = 1; \
1933 goto __gmp_done; \
1934 } \
1935 __gmp_x = (xp)[__gmp_i]; \
1936 } \
1937 while (TEST); \
1938 } \
1939 } \
1940 if ((wp) != (xp)) \
1941 __GMPN_COPY_REST (wp, xp, xsize, __gmp_i); \
1942 (cout) = 0; \
1943 __gmp_done: \
1944 ; \
1945 } while (0)
1946
1947#define __GMPN_ADD(cout, wp, xp, xsize, yp, ysize) \
1948 __GMPN_AORS (cout, wp, xp, xsize, yp, ysize, mpn_add_n, \
1949 (((wp)[__gmp_i++] = (__gmp_x + 1) & GMP_NUMB_MASK) == 0))
1950#define __GMPN_SUB(cout, wp, xp, xsize, yp, ysize) \
1951 __GMPN_AORS (cout, wp, xp, xsize, yp, ysize, mpn_sub_n, \
1952 (((wp)[__gmp_i++] = (__gmp_x - 1) & GMP_NUMB_MASK), __gmp_x == 0))
1953
1954
1955/* The use of __gmp_i indexing is designed to ensure a compile time src==dst
1956 remains nice and clear to the compiler, so that __GMPN_COPY_REST can
1957 disappear, and the load/add/store gets a chance to become a
1958 read-modify-write on CISC CPUs.
1959
1960 Alternatives:
1961
1962 Using a pair of pointers instead of indexing would be possible, but gcc
1963 isn't able to recognise compile-time src==dst in that case, even when the
1964 pointers are incremented more or less together. Other compilers would
1965 very likely have similar difficulty.
1966
1967 gcc could use "if (__builtin_constant_p(src==dst) && src==dst)" or
1968 similar to detect a compile-time src==dst. This works nicely on gcc
1969 2.95.x, it's not good on gcc 3.0 where __builtin_constant_p(p==p) seems
1970 to be always false, for a pointer p. But the current code form seems
1971 good enough for src==dst anyway.
1972
1973 gcc on x86 as usual doesn't give particularly good flags handling for the
1974 carry/borrow detection. It's tempting to want some multi instruction asm
1975 blocks to help it, and this was tried, but in truth there's only a few
1976 instructions to save and any gain is all too easily lost by register
1977 juggling setting up for the asm. */
1978
1979#if GMP_NAIL_BITS == 0
1980#define __GMPN_AORS_1(cout, dst, src, n, v, OP, CB) \
1981 do { \
1982 mp_size_t __gmp_i; \
1983 mp_limb_t __gmp_x, __gmp_r; \
1984 \
1985 /* ASSERT ((n) >= 1); */ \
1986 /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, n)); */ \
1987 \
1988 __gmp_x = (src)[0]; \
1989 __gmp_r = __gmp_x OP (v); \
1990 (dst)[0] = __gmp_r; \
1991 if (CB (__gmp_r, __gmp_x, (v))) \
1992 { \
1993 (cout) = 1; \
1994 for (__gmp_i = 1; __gmp_i < (n);) \
1995 { \
1996 __gmp_x = (src)[__gmp_i]; \
1997 __gmp_r = __gmp_x OP 1; \
1998 (dst)[__gmp_i] = __gmp_r; \
1999 ++__gmp_i; \
2000 if (!CB (__gmp_r, __gmp_x, 1)) \
2001 { \
2002 if ((src) != (dst)) \
2003 __GMPN_COPY_REST (dst, src, n, __gmp_i); \
2004 (cout) = 0; \
2005 break; \
2006 } \
2007 } \
2008 } \
2009 else \
2010 { \
2011 if ((src) != (dst)) \
2012 __GMPN_COPY_REST (dst, src, n, 1); \
2013 (cout) = 0; \
2014 } \
2015 } while (0)
2016#endif
2017
2018#if GMP_NAIL_BITS >= 1
2019#define __GMPN_AORS_1(cout, dst, src, n, v, OP, CB) \
2020 do { \
2021 mp_size_t __gmp_i; \
2022 mp_limb_t __gmp_x, __gmp_r; \
2023 \
2024 /* ASSERT ((n) >= 1); */ \
2025 /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, n)); */ \
2026 \
2027 __gmp_x = (src)[0]; \
2028 __gmp_r = __gmp_x OP (v); \
2029 (dst)[0] = __gmp_r & GMP_NUMB_MASK; \
2030 if (__gmp_r >> GMP_NUMB_BITS != 0) \
2031 { \
2032 (cout) = 1; \
2033 for (__gmp_i = 1; __gmp_i < (n);) \
2034 { \
2035 __gmp_x = (src)[__gmp_i]; \
2036 __gmp_r = __gmp_x OP 1; \
2037 (dst)[__gmp_i] = __gmp_r & GMP_NUMB_MASK; \
2038 ++__gmp_i; \
2039 if (__gmp_r >> GMP_NUMB_BITS == 0) \
2040 { \
2041 if ((src) != (dst)) \
2042 __GMPN_COPY_REST (dst, src, n, __gmp_i); \
2043 (cout) = 0; \
2044 break; \
2045 } \
2046 } \
2047 } \
2048 else \
2049 { \
2050 if ((src) != (dst)) \
2051 __GMPN_COPY_REST (dst, src, n, 1); \
2052 (cout) = 0; \
2053 } \
2054 } while (0)
2055#endif
2056
2057#define __GMPN_ADDCB(r,x,y) ((r) < (y))
2058#define __GMPN_SUBCB(r,x,y) ((x) < (y))
2059
2060#define __GMPN_ADD_1(cout, dst, src, n, v) \
2061 __GMPN_AORS_1(cout, dst, src, n, v, +, __GMPN_ADDCB)
2062#define __GMPN_SUB_1(cout, dst, src, n, v) \
2063 __GMPN_AORS_1(cout, dst, src, n, v, -, __GMPN_SUBCB)
2064
2065
2066/* Compare {xp,size} and {yp,size}, setting "result" to positive, zero or
2067 negative. size==0 is allowed. On random data usually only one limb will
2068 need to be examined to get a result, so it's worth having it inline. */
2069#define __GMPN_CMP(result, xp, yp, size) \
2070 do { \
2071 mp_size_t __gmp_i; \
2072 mp_limb_t __gmp_x, __gmp_y; \
2073 \
2074 /* ASSERT ((size) >= 0); */ \
2075 \
2076 (result) = 0; \
2077 __gmp_i = (size); \
2078 while (--__gmp_i >= 0) \
2079 { \
2080 __gmp_x = (xp)[__gmp_i]; \
2081 __gmp_y = (yp)[__gmp_i]; \
2082 if (__gmp_x != __gmp_y) \
2083 { \
2084 /* Cannot use __gmp_x - __gmp_y, may overflow an "int" */ \
2085 (result) = (__gmp_x > __gmp_y ? 1 : -1); \
2086 break; \
2087 } \
2088 } \
2089 } while (0)
2090
2091
2092#if defined (__GMPN_COPY) && ! defined (__GMPN_COPY_REST)
2093#define __GMPN_COPY_REST(dst, src, size, start) \
2094 do { \
2095 /* ASSERT ((start) >= 0); */ \
2096 /* ASSERT ((start) <= (size)); */ \
2097 __GMPN_COPY ((dst)+(start), (src)+(start), (size)-(start)); \
2098 } while (0)
2099#endif
2100
2101/* Copy {src,size} to {dst,size}, starting at "start". This is designed to
2102 keep the indexing dst[j] and src[j] nice and simple for __GMPN_ADD_1,
2103 __GMPN_ADD, etc. */
2104#if ! defined (__GMPN_COPY_REST)
2105#define __GMPN_COPY_REST(dst, src, size, start) \
2106 do { \
2107 mp_size_t __gmp_j; \
2108 /* ASSERT ((size) >= 0); */ \
2109 /* ASSERT ((start) >= 0); */ \
2110 /* ASSERT ((start) <= (size)); */ \
2111 /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, size)); */ \
2112 __GMP_CRAY_Pragma ("_CRI ivdep"); \
2113 for (__gmp_j = (start); __gmp_j < (size); __gmp_j++) \
2114 (dst)[__gmp_j] = (src)[__gmp_j]; \
2115 } while (0)
2116#endif
2117
2118/* Enhancement: Use some of the smarter code from gmp-impl.h. Maybe use
2119 mpn_copyi if there's a native version, and if we don't mind demanding
2120 binary compatibility for it (on targets which use it). */
2121
2122#if ! defined (__GMPN_COPY)
2123#define __GMPN_COPY(dst, src, size) __GMPN_COPY_REST (dst, src, size, 0)
2124#endif
2125
2126
2127#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_add)
2128#if ! defined (__GMP_FORCE_mpn_add)
2129__GMP_EXTERN_INLINE
2130#endif
2131mp_limb_t
2132mpn_add (mp_ptr __gmp_wp, mp_srcptr __gmp_xp, mp_size_t __gmp_xsize, mp_srcptr __gmp_yp, mp_size_t __gmp_ysize)
2133{
2134 mp_limb_t __gmp_c;
2135 __GMPN_ADD (__gmp_c, __gmp_wp, __gmp_xp, __gmp_xsize, __gmp_yp, __gmp_ysize);
2136 return __gmp_c;
2137}
2138#endif
2139
2140#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_add_1)
2141#if ! defined (__GMP_FORCE_mpn_add_1)
2142__GMP_EXTERN_INLINE
2143#endif
2144mp_limb_t
2145mpn_add_1 (mp_ptr __gmp_dst, mp_srcptr __gmp_src, mp_size_t __gmp_size, mp_limb_t __gmp_n) __GMP_NOTHROW
2146{
2147 mp_limb_t __gmp_c;
2148 __GMPN_ADD_1 (__gmp_c, __gmp_dst, __gmp_src, __gmp_size, __gmp_n);
2149 return __gmp_c;
2150}
2151#endif
2152
2153#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_cmp)
2154#if ! defined (__GMP_FORCE_mpn_cmp)
2155__GMP_EXTERN_INLINE
2156#endif
2157int
2158mpn_cmp (mp_srcptr __gmp_xp, mp_srcptr __gmp_yp, mp_size_t __gmp_size) __GMP_NOTHROW
2159{
2160 int __gmp_result;
2161 __GMPN_CMP (__gmp_result, __gmp_xp, __gmp_yp, __gmp_size);
2162 return __gmp_result;
2163}
2164#endif
2165
2166#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_zero_p)
2167#if ! defined (__GMP_FORCE_mpn_zero_p)
2168__GMP_EXTERN_INLINE
2169#endif
2170int
2171mpn_zero_p (mp_srcptr __gmp_p, mp_size_t __gmp_n) __GMP_NOTHROW
2172{
2173 /* if (__GMP_LIKELY (__gmp_n > 0)) */
2174 do {
2175 if (__gmp_p[--__gmp_n] != 0)
2176 return 0;
2177 } while (__gmp_n != 0);
2178 return 1;
2179}
2180#endif
2181
2182#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_sub)
2183#if ! defined (__GMP_FORCE_mpn_sub)
2184__GMP_EXTERN_INLINE
2185#endif
2186mp_limb_t
2187mpn_sub (mp_ptr __gmp_wp, mp_srcptr __gmp_xp, mp_size_t __gmp_xsize, mp_srcptr __gmp_yp, mp_size_t __gmp_ysize)
2188{
2189 mp_limb_t __gmp_c;
2190 __GMPN_SUB (__gmp_c, __gmp_wp, __gmp_xp, __gmp_xsize, __gmp_yp, __gmp_ysize);
2191 return __gmp_c;
2192}
2193#endif
2194
2195#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_sub_1)
2196#if ! defined (__GMP_FORCE_mpn_sub_1)
2197__GMP_EXTERN_INLINE
2198#endif
2199mp_limb_t
2200mpn_sub_1 (mp_ptr __gmp_dst, mp_srcptr __gmp_src, mp_size_t __gmp_size, mp_limb_t __gmp_n) __GMP_NOTHROW
2201{
2202 mp_limb_t __gmp_c;
2203 __GMPN_SUB_1 (__gmp_c, __gmp_dst, __gmp_src, __gmp_size, __gmp_n);
2204 return __gmp_c;
2205}
2206#endif
2207
2208#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_neg)
2209#if ! defined (__GMP_FORCE_mpn_neg)
2210__GMP_EXTERN_INLINE
2211#endif
2212mp_limb_t
2213mpn_neg (mp_ptr __gmp_rp, mp_srcptr __gmp_up, mp_size_t __gmp_n)
2214{
2215 while (*__gmp_up == 0) /* Low zero limbs are unchanged by negation. */
2216 {
2217 *__gmp_rp = 0;
2218 if (!--__gmp_n) /* All zero */
2219 return 0;
2220 ++__gmp_up; ++__gmp_rp;
2221 }
2222
2223 *__gmp_rp = (- *__gmp_up) & GMP_NUMB_MASK;
2224
2225 if (--__gmp_n) /* Higher limbs get complemented. */
2226 mpn_com (++__gmp_rp, ++__gmp_up, __gmp_n);
2227
2228 return 1;
2229}
2230#endif
2231
2232#if defined (__cplusplus)
2233}
2234#endif
2235
2236
2237/* Allow faster testing for negative, zero, and positive. */
2238#define mpz_sgn(Z) ((Z)->_mp_size < 0 ? -1 : (Z)->_mp_size > 0)
2239#define mpf_sgn(F) ((F)->_mp_size < 0 ? -1 : (F)->_mp_size > 0)
2240#define mpq_sgn(Q) ((Q)->_mp_num._mp_size < 0 ? -1 : (Q)->_mp_num._mp_size > 0)
2241
2242/* When using GCC, optimize certain common comparisons. */
2243#if defined (__GNUC__) && __GNUC__ >= 2
2244#define mpz_cmp_ui(Z,UI) \
2245 (__builtin_constant_p (UI) && (UI) == 0 \
2246 ? mpz_sgn (Z) : _mpz_cmp_ui (Z,UI))
2247#define mpz_cmp_si(Z,SI) \
2248 (__builtin_constant_p ((SI) >= 0) && (SI) >= 0 \
2249 ? mpz_cmp_ui (Z, __GMP_CAST (unsigned long, SI)) \
2250 : _mpz_cmp_si (Z,SI))
2251#define mpq_cmp_ui(Q,NUI,DUI) \
2252 (__builtin_constant_p (NUI) && (NUI) == 0 ? mpq_sgn (Q) \
2253 : __builtin_constant_p ((NUI) == (DUI)) && (NUI) == (DUI) \
2254 ? mpz_cmp (mpq_numref (Q), mpq_denref (Q)) \
2255 : _mpq_cmp_ui (Q,NUI,DUI))
2256#define mpq_cmp_si(q,n,d) \
2257 (__builtin_constant_p ((n) >= 0) && (n) >= 0 \
2258 ? mpq_cmp_ui (q, __GMP_CAST (unsigned long, n), d) \
2259 : _mpq_cmp_si (q, n, d))
2260#else
2261#define mpz_cmp_ui(Z,UI) _mpz_cmp_ui (Z,UI)
2262#define mpz_cmp_si(Z,UI) _mpz_cmp_si (Z,UI)
2263#define mpq_cmp_ui(Q,NUI,DUI) _mpq_cmp_ui (Q,NUI,DUI)
2264#define mpq_cmp_si(q,n,d) _mpq_cmp_si(q,n,d)
2265#endif
2266
2267
2268/* Using "&" rather than "&&" means these can come out branch-free. Every
2269 mpz_t has at least one limb allocated, so fetching the low limb is always
2270 allowed. */
2271#define mpz_odd_p(z) (((z)->_mp_size != 0) & __GMP_CAST (int, (z)->_mp_d[0]))
2272#define mpz_even_p(z) (! mpz_odd_p (z))
2273
2274
2275/**************** C++ routines ****************/
2276
2277#ifdef __cplusplus
2278__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpz_srcptr);
2279__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpq_srcptr);
2280__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpf_srcptr);
2281__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpz_ptr);
2282__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpq_ptr);
2283__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpf_ptr);
2284#endif
2285
2286
2287/* Source-level compatibility with GMP 2 and earlier. */
2288#define mpn_divmod(qp,np,nsize,dp,dsize) \
2289 mpn_divrem (qp, __GMP_CAST (mp_size_t, 0), np, nsize, dp, dsize)
2290
2291/* Source-level compatibility with GMP 1. */
2292#define mpz_mdiv mpz_fdiv_q
2293#define mpz_mdivmod mpz_fdiv_qr
2294#define mpz_mmod mpz_fdiv_r
2295#define mpz_mdiv_ui mpz_fdiv_q_ui
2296#define mpz_mdivmod_ui(q,r,n,d) \
2297 (((r) == 0) ? mpz_fdiv_q_ui (q,n,d) : mpz_fdiv_qr_ui (q,r,n,d))
2298#define mpz_mmod_ui(r,n,d) \
2299 (((r) == 0) ? mpz_fdiv_ui (n,d) : mpz_fdiv_r_ui (r,n,d))
2300
2301/* Useful synonyms, but not quite compatible with GMP 1. */
2302#define mpz_div mpz_fdiv_q
2303#define mpz_divmod mpz_fdiv_qr
2304#define mpz_div_ui mpz_fdiv_q_ui
2305#define mpz_divmod_ui mpz_fdiv_qr_ui
2306#define mpz_div_2exp mpz_fdiv_q_2exp
2307#define mpz_mod_2exp mpz_fdiv_r_2exp
2308
2309enum
2310{
2311 GMP_ERROR_NONE = 0,
2312 GMP_ERROR_UNSUPPORTED_ARGUMENT = 1,
2313 GMP_ERROR_DIVISION_BY_ZERO = 2,
2314 GMP_ERROR_SQRT_OF_NEGATIVE = 4,
2315 GMP_ERROR_INVALID_ARGUMENT = 8
2316};
2317
2318/* Define CC and CFLAGS which were used to build this version of GMP */
2319#define __GMP_CC "gcc"
2320#define __GMP_CFLAGS "-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong"
2321
2322/* Major version number is the value of __GNU_MP__ too, above. */
2323#define __GNU_MP_VERSION 6
2324#define __GNU_MP_VERSION_MINOR 1
2325#define __GNU_MP_VERSION_PATCHLEVEL 2
2326#define __GNU_MP_RELEASE (__GNU_MP_VERSION * 10000 + __GNU_MP_VERSION_MINOR * 100 + __GNU_MP_VERSION_PATCHLEVEL)
2327
2328#define __GMP_H__
2329#endif /* __GMP_H__ */
2330