Annotation of OpenXM/src/kan96xx/gmp-2.0.2/gmp.h, Revision 1.1.1.1
1.1 maekawa 1: /* gmp.h -- Definitions for GNU multiple precision functions.
2:
3: Copyright (C) 1991, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
4:
5: This file is part of the GNU MP Library.
6:
7: The GNU MP Library is free software; you can redistribute it and/or modify
8: it under the terms of the GNU Library General Public License as published by
9: the Free Software Foundation; either version 2 of the License, or (at your
10: option) any later version.
11:
12: The GNU MP Library is distributed in the hope that it will be useful, but
13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
15: License for more details.
16:
17: You should have received a copy of the GNU Library General Public License
18: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20: MA 02111-1307, USA. */
21:
22: #ifndef __GMP_H__
23:
24: #ifndef __GNU_MP__
25: #define __GNU_MP__ 2
26: #define __need_size_t
27: #include <stddef.h>
28: #undef __need_size_t
29:
30: #if defined (__STDC__) || defined (__cplusplus)
31: #define __gmp_const const
32: #else
33: #define __gmp_const
34: #endif
35:
36: #if defined (__GNUC__)
37: #define __gmp_inline __inline__
38: #else
39: #define __gmp_inline
40: #endif
41:
42: #ifndef _EXTERN_INLINE
43: #ifdef __GNUC__
44: #define _EXTERN_INLINE extern __inline__
45: #else
46: #define _EXTERN_INLINE static
47: #endif
48: #endif
49:
50: #ifdef _SHORT_LIMB
51: typedef unsigned int mp_limb_t;
52: typedef int mp_limb_signed_t;
53: #else
54: #ifdef _LONG_LONG_LIMB
55: typedef unsigned long long int mp_limb_t;
56: typedef long long int mp_limb_signed_t;
57: #else
58: typedef unsigned long int mp_limb_t;
59: typedef long int mp_limb_signed_t;
60: #endif
61: #endif
62:
63: typedef mp_limb_t * mp_ptr;
64: typedef __gmp_const mp_limb_t * mp_srcptr;
65: typedef long int mp_size_t;
66: typedef long int mp_exp_t;
67:
68: #ifndef __MP_SMALL__
69: typedef struct
70: {
71: int _mp_alloc; /* Number of *limbs* allocated and pointed
72: to by the D field. */
73: int _mp_size; /* abs(SIZE) is the number of limbs
74: the last field points to. If SIZE
75: is negative this is a negative
76: number. */
77: mp_limb_t *_mp_d; /* Pointer to the limbs. */
78: } __mpz_struct;
79: #else
80: typedef struct
81: {
82: short int _mp_alloc; /* Number of *limbs* allocated and pointed
83: to by the D field. */
84: short int _mp_size; /* abs(SIZE) is the number of limbs
85: the last field points to. If SIZE
86: is negative this is a negative
87: number. */
88: mp_limb_t *_mp_d; /* Pointer to the limbs. */
89: } __mpz_struct;
90: #endif
91: #endif /* __GNU_MP__ */
92:
93: /* User-visible types. */
94: typedef __mpz_struct MP_INT;
95: typedef __mpz_struct mpz_t[1];
96:
97: /* Structure for rational numbers. Zero is represented as 0/any, i.e.
98: the denominator is ignored. Negative numbers have the sign in
99: the numerator. */
100: typedef struct
101: {
102: __mpz_struct _mp_num;
103: __mpz_struct _mp_den;
104: #if 0
105: int _mp_num_alloc; /* Number of limbs allocated
106: for the numerator. */
107: int _mp_num_size; /* The absolute value of this field is the
108: length of the numerator; the sign is the
109: sign of the entire rational number. */
110: mp_ptr _mp_num; /* Pointer to the numerator limbs. */
111: int _mp_den_alloc; /* Number of limbs allocated
112: for the denominator. */
113: int _mp_den_size; /* Length of the denominator. (This field
114: should always be positive.) */
115: mp_ptr _mp_den; /* Pointer to the denominator limbs. */
116: #endif
117: } __mpq_struct;
118:
119: typedef __mpq_struct MP_RAT;
120: typedef __mpq_struct mpq_t[1];
121:
122: typedef struct
123: {
124: int _mp_prec; /* Max precision, in number of `mp_limb_t's.
125: Set by mpf_init and modified by
126: mpf_set_prec. The area pointed to
127: by the `d' field contains `prec' + 1
128: limbs. */
129: int _mp_size; /* abs(SIZE) is the number of limbs
130: the last field points to. If SIZE
131: is negative this is a negative
132: number. */
133: mp_exp_t _mp_exp; /* Exponent, in the base of `mp_limb_t'. */
134: mp_limb_t *_mp_d; /* Pointer to the limbs. */
135: } __mpf_struct;
136:
137: /* typedef __mpf_struct MP_FLOAT; */
138: typedef __mpf_struct mpf_t[1];
139:
140: /* Types for function declarations in gmp files. */
141: /* ??? Should not pollute user name space with these ??? */
142: typedef __gmp_const __mpz_struct *mpz_srcptr;
143: typedef __mpz_struct *mpz_ptr;
144: typedef __gmp_const __mpf_struct *mpf_srcptr;
145: typedef __mpf_struct *mpf_ptr;
146: typedef __gmp_const __mpq_struct *mpq_srcptr;
147: typedef __mpq_struct *mpq_ptr;
148:
149: #ifndef _PROTO
150: #if defined (__STDC__) || defined (__cplusplus)
151: #define _PROTO(x) x
152: #else
153: #define _PROTO(x) ()
154: #endif
155: #endif
156:
157: #ifndef __MPN
158: #if defined (__STDC__) || defined (__cplusplus)
159: #define __MPN(x) __mpn_##x
160: #else
161: #define __MPN(x) __mpn_/**/x
162: #endif
163: #endif
164:
165: #if defined (FILE) || defined (H_STDIO) || defined (_H_STDIO) \
166: || defined (_STDIO_H) || defined (_STDIO_H_) || defined (__STDIO_H__) \
167: || defined (_STDIO_INCLUDED)
168: #define _GMP_H_HAVE_FILE 1
169: #endif
170:
171: void mp_set_memory_functions _PROTO ((void *(*) (size_t),
172: void *(*) (void *, size_t, size_t),
173: void (*) (void *, size_t)));
174: extern __gmp_const int mp_bits_per_limb;
175:
176: /**************** Integer (i.e. Z) routines. ****************/
177:
178: #if defined (__cplusplus)
179: extern "C" {
180: #endif
181: void *_mpz_realloc _PROTO ((mpz_ptr, mp_size_t));
182:
183: void mpz_abs _PROTO ((mpz_ptr, mpz_srcptr));
184: void mpz_add _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
185: void mpz_add_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
186: void mpz_and _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
187: void mpz_array_init _PROTO ((mpz_ptr, mp_size_t, mp_size_t));
188: void mpz_cdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
189: unsigned long int mpz_cdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
190: void mpz_cdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
191: unsigned long int mpz_cdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int));
192: void mpz_cdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
193: unsigned long int mpz_cdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
194: unsigned long int mpz_cdiv_ui _PROTO ((mpz_srcptr, unsigned long int));
195: void mpz_clear _PROTO ((mpz_ptr));
196: void mpz_clrbit _PROTO ((mpz_ptr, unsigned long int));
197: int mpz_cmp _PROTO ((mpz_srcptr, mpz_srcptr));
198: int mpz_cmp_si _PROTO ((mpz_srcptr, signed long int));
199: int mpz_cmp_ui _PROTO ((mpz_srcptr, unsigned long int));
200: void mpz_com _PROTO ((mpz_ptr, mpz_srcptr));
201: void mpz_divexact _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
202: void mpz_fac_ui _PROTO ((mpz_ptr, unsigned long int));
203: void mpz_fdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
204: void mpz_fdiv_q_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
205: unsigned long int mpz_fdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
206: void mpz_fdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
207: unsigned long int mpz_fdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int));
208: void mpz_fdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
209: void mpz_fdiv_r_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
210: unsigned long int mpz_fdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
211: unsigned long int mpz_fdiv_ui _PROTO ((mpz_srcptr, unsigned long int));
212: void mpz_gcd _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
213: unsigned long int mpz_gcd_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
214: void mpz_gcdext _PROTO ((mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
215: double mpz_get_d _PROTO ((mpz_srcptr));
216: /* signed */ long int mpz_get_si _PROTO ((mpz_srcptr));
217: char *mpz_get_str _PROTO ((char *, int, mpz_srcptr));
218: unsigned long int mpz_get_ui _PROTO ((mpz_srcptr));
219: mp_limb_t mpz_getlimbn _PROTO ((mpz_srcptr, mp_size_t));
220: unsigned long int mpz_hamdist _PROTO ((mpz_srcptr, mpz_srcptr));
221: void mpz_init _PROTO ((mpz_ptr));
222: #ifdef _GMP_H_HAVE_FILE
223: size_t mpz_inp_binary _PROTO ((mpz_ptr, FILE *));
224: size_t mpz_inp_raw _PROTO ((mpz_ptr, FILE *));
225: size_t mpz_inp_str _PROTO ((mpz_ptr, FILE *, int));
226: #endif
227: void mpz_init_set _PROTO ((mpz_ptr, mpz_srcptr));
228: void mpz_init_set_d _PROTO ((mpz_ptr, double));
229: void mpz_init_set_si _PROTO ((mpz_ptr, signed long int));
230: int mpz_init_set_str _PROTO ((mpz_ptr, const char *, int));
231: void mpz_init_set_ui _PROTO ((mpz_ptr, unsigned long int));
232: int mpz_invert _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
233: void mpz_ior _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
234: int mpz_jacobi _PROTO ((mpz_srcptr, mpz_srcptr));
235: int mpz_legendre _PROTO ((mpz_srcptr, mpz_srcptr));
236: void mpz_mod _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
237: void mpz_mul _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
238: void mpz_mul_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
239: void mpz_mul_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
240: void mpz_neg _PROTO ((mpz_ptr, mpz_srcptr));
241: #ifdef _GMP_H_HAVE_FILE
242: size_t mpz_out_binary _PROTO ((FILE *, mpz_srcptr));
243: size_t mpz_out_raw _PROTO ((FILE *, mpz_srcptr));
244: size_t mpz_out_str _PROTO ((FILE *, int, mpz_srcptr));
245: #endif
246: int mpz_perfect_square_p _PROTO ((mpz_srcptr));
247: unsigned long int mpz_popcount _PROTO ((mpz_srcptr));
248: void mpz_pow_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
249: void mpz_powm _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr));
250: void mpz_powm_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int, mpz_srcptr));
251: int mpz_probab_prime_p _PROTO ((mpz_srcptr, int));
252: void mpz_random _PROTO ((mpz_ptr, mp_size_t));
253: void mpz_random2 _PROTO ((mpz_ptr, mp_size_t));
254: unsigned long int mpz_scan0 _PROTO ((mpz_srcptr, unsigned long int));
255: unsigned long int mpz_scan1 _PROTO ((mpz_srcptr, unsigned long int));
256: void mpz_set _PROTO ((mpz_ptr, mpz_srcptr));
257: void mpz_set_d _PROTO ((mpz_ptr, double));
258: void mpz_set_f _PROTO ((mpz_ptr, mpf_srcptr));
259: void mpz_set_q _PROTO ((mpz_ptr, mpq_srcptr));
260: void mpz_set_si _PROTO ((mpz_ptr, signed long int));
261: int mpz_set_str _PROTO ((mpz_ptr, const char *, int));
262: void mpz_set_ui _PROTO ((mpz_ptr, unsigned long int));
263: void mpz_setbit _PROTO ((mpz_ptr, unsigned long int));
264: size_t mpz_size _PROTO ((mpz_srcptr));
265: size_t mpz_sizeinbase _PROTO ((mpz_srcptr, int));
266: void mpz_sqrt _PROTO ((mpz_ptr, mpz_srcptr));
267: void mpz_sqrtrem _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr));
268: void mpz_sub _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
269: void mpz_sub_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
270: void mpz_tdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
271: void mpz_tdiv_q_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
272: void mpz_tdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
273: void mpz_tdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
274: void mpz_tdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int));
275: void mpz_tdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
276: void mpz_tdiv_r_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
277: void mpz_tdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
278: void mpz_ui_pow_ui _PROTO ((mpz_ptr, unsigned long int, unsigned long int));
279:
280: /**************** Rational (i.e. Q) routines. ****************/
281:
282: void mpq_init _PROTO ((mpq_ptr));
283: void mpq_clear _PROTO ((mpq_ptr));
284: void mpq_set _PROTO ((mpq_ptr, mpq_srcptr));
285: void mpq_set_ui _PROTO ((mpq_ptr, unsigned long int, unsigned long int));
286: void mpq_set_si _PROTO ((mpq_ptr, signed long int, unsigned long int));
287: void mpq_set_z _PROTO ((mpq_ptr, mpz_srcptr));
288: void mpq_add _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
289: void mpq_sub _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
290: void mpq_mul _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
291: void mpq_div _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
292: void mpq_neg _PROTO ((mpq_ptr, mpq_srcptr));
293: int mpq_cmp _PROTO ((mpq_srcptr, mpq_srcptr));
294: int mpq_cmp_ui _PROTO ((mpq_srcptr, unsigned long int, unsigned long int));
295: int mpq_equal _PROTO ((mpq_srcptr, mpq_srcptr));
296: void mpq_inv _PROTO ((mpq_ptr, mpq_srcptr));
297: void mpq_set_num _PROTO ((mpq_ptr, mpz_srcptr));
298: void mpq_set_den _PROTO ((mpq_ptr, mpz_srcptr));
299: void mpq_get_num _PROTO ((mpz_ptr, mpq_srcptr));
300: void mpq_get_den _PROTO ((mpz_ptr, mpq_srcptr));
301: double mpq_get_d _PROTO ((mpq_srcptr));
302: void mpq_canonicalize _PROTO ((mpq_ptr));
303:
304: /**************** Float (i.e. F) routines. ****************/
305:
306: void mpf_abs _PROTO ((mpf_ptr, mpf_srcptr));
307: void mpf_add _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
308: void mpf_add_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
309: void mpf_clear _PROTO ((mpf_ptr));
310: int mpf_cmp _PROTO ((mpf_srcptr, mpf_srcptr));
311: int mpf_cmp_si _PROTO ((mpf_srcptr, signed long int));
312: int mpf_cmp_ui _PROTO ((mpf_srcptr, unsigned long int));
313: void mpf_div _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
314: void mpf_div_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
315: void mpf_div_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
316: void mpf_dump _PROTO ((mpf_srcptr));
317: int mpf_eq _PROTO ((mpf_srcptr, mpf_srcptr, unsigned long int));
318: double mpf_get_d _PROTO ((mpf_srcptr));
319: unsigned long int mpf_get_prec _PROTO ((mpf_srcptr));
320: char *mpf_get_str _PROTO ((char *, mp_exp_t *, int, size_t, mpf_srcptr));
321: void mpf_init _PROTO ((mpf_ptr));
322: void mpf_init2 _PROTO ((mpf_ptr, unsigned long int));
323: #ifdef _GMP_H_HAVE_FILE
324: size_t mpf_inp_str _PROTO ((mpf_ptr, FILE *, int));
325: #endif
326: void mpf_init_set _PROTO ((mpf_ptr, mpf_srcptr));
327: void mpf_init_set_d _PROTO ((mpf_ptr, double));
328: void mpf_init_set_si _PROTO ((mpf_ptr, signed long int));
329: int mpf_init_set_str _PROTO ((mpf_ptr, const char *, int));
330: void mpf_init_set_ui _PROTO ((mpf_ptr, unsigned long int));
331: void mpf_mul _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
332: void mpf_mul_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
333: void mpf_mul_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
334: void mpf_neg _PROTO ((mpf_ptr, mpf_srcptr));
335: #ifdef _GMP_H_HAVE_FILE
336: size_t mpf_out_str _PROTO ((FILE *, int, size_t, mpf_srcptr));
337: #endif
338: void mpf_random2 _PROTO ((mpf_ptr, mp_size_t, mp_exp_t));
339: void mpf_reldiff _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
340: void mpf_set _PROTO ((mpf_ptr, mpf_srcptr));
341: void mpf_set_d _PROTO ((mpf_ptr, double));
342: void mpf_set_default_prec _PROTO ((unsigned long int));
343: void mpf_set_prec _PROTO ((mpf_ptr, unsigned long int));
344: void mpf_set_prec_raw _PROTO ((mpf_ptr, unsigned long int));
345: void mpf_set_q _PROTO ((mpf_ptr, mpq_srcptr));
346: void mpf_set_si _PROTO ((mpf_ptr, signed long int));
347: int mpf_set_str _PROTO ((mpf_ptr, const char *, int));
348: void mpf_set_ui _PROTO ((mpf_ptr, unsigned long int));
349: void mpf_set_z _PROTO ((mpf_ptr, mpz_srcptr));
350: size_t mpf_size _PROTO ((mpf_srcptr));
351: void mpf_sqrt _PROTO ((mpf_ptr, mpf_srcptr));
352: void mpf_sqrt_ui _PROTO ((mpf_ptr, unsigned long int));
353: void mpf_sub _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
354: void mpf_sub_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
355: void mpf_ui_div _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr));
356: void mpf_ui_sub _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr));
357: #if defined (__cplusplus)
358: }
359: #endif
360: /************ Low level positive-integer (i.e. N) routines. ************/
361:
362: /* This is ugly, but we need to make usr calls reach the prefixed function. */
363: #define mpn_add __MPN(add)
364: #define mpn_add_1 __MPN(add_1)
365: #define mpn_add_n __MPN(add_n)
366: #define mpn_addmul_1 __MPN(addmul_1)
367: #define mpn_bdivmod __MPN(bdivmod)
368: #define mpn_cmp __MPN(cmp)
369: #define mpn_divmod_1 __MPN(divmod_1)
370: #define mpn_divrem __MPN(divrem)
371: #define mpn_divrem_1 __MPN(divrem_1)
372: #define mpn_dump __MPN(dump)
373: #define mpn_gcd __MPN(gcd)
374: #define mpn_gcd_1 __MPN(gcd_1)
375: #define mpn_gcdext __MPN(gcdext)
376: #define mpn_get_str __MPN(get_str)
377: #define mpn_hamdist __MPN(hamdist)
378: #define mpn_lshift __MPN(lshift)
379: #define mpn_mod_1 __MPN(mod_1)
380: #define mpn_mul __MPN(mul)
381: #define mpn_mul_1 __MPN(mul_1)
382: #define mpn_mul_n __MPN(mul_n)
383: #define mpn_perfect_square_p __MPN(perfect_square_p)
384: #define mpn_popcount __MPN(popcount)
385: #define mpn_preinv_mod_1 __MPN(preinv_mod_1)
386: #define mpn_random2 __MPN(random2)
387: #define mpn_rshift __MPN(rshift)
388: #define mpn_scan0 __MPN(scan0)
389: #define mpn_scan1 __MPN(scan1)
390: #define mpn_set_str __MPN(set_str)
391: #define mpn_sqrtrem __MPN(sqrtrem)
392: #define mpn_sub __MPN(sub)
393: #define mpn_sub_1 __MPN(sub_1)
394: #define mpn_sub_n __MPN(sub_n)
395: #define mpn_submul_1 __MPN(submul_1)
396: #define mpn_udiv_w_sdiv __MPN(udiv_w_sdiv)
397:
398: #if defined (__cplusplus)
399: extern "C" {
400: #endif
401: mp_limb_t mpn_add _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t));
402: mp_limb_t mpn_add_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
403: mp_limb_t mpn_add_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
404: mp_limb_t mpn_addmul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
405: mp_limb_t mpn_bdivmod _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, unsigned long int));
406: int mpn_cmp _PROTO ((mp_srcptr, mp_srcptr, mp_size_t));
407: mp_limb_t mpn_divmod_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
408: mp_limb_t mpn_divrem _PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t));
409: mp_limb_t mpn_divrem_1 _PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t));
410: void mpn_dump _PROTO ((mp_srcptr, mp_size_t));
411: mp_size_t mpn_gcd _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t));
412: mp_limb_t mpn_gcd_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t));
413: mp_size_t mpn_gcdext _PROTO ((mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t));
414: size_t mpn_get_str _PROTO ((unsigned char *, int, mp_ptr, mp_size_t));
415: unsigned long int mpn_hamdist _PROTO ((mp_srcptr, mp_srcptr, mp_size_t));
416: mp_limb_t mpn_lshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int));
417: mp_limb_t mpn_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t));
418: mp_limb_t mpn_mul _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t));
419: mp_limb_t mpn_mul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
420: void mpn_mul_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
421: int mpn_perfect_square_p _PROTO ((mp_srcptr, mp_size_t));
422: unsigned long int mpn_popcount _PROTO ((mp_srcptr, mp_size_t));
423: mp_limb_t mpn_preinv_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t));
424: void mpn_random2 _PROTO ((mp_ptr, mp_size_t));
425: mp_limb_t mpn_rshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int));
426: unsigned long int mpn_scan0 _PROTO ((mp_srcptr, unsigned long int));
427: unsigned long int mpn_scan1 _PROTO ((mp_srcptr, unsigned long int));
428: mp_size_t mpn_set_str _PROTO ((mp_ptr, const unsigned char *, size_t, int));
429: mp_size_t mpn_sqrtrem _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t));
430: mp_limb_t mpn_sub _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t));
431: mp_limb_t mpn_sub_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
432: mp_limb_t mpn_sub_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
433: mp_limb_t mpn_submul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
434: #if defined (__cplusplus)
435: }
436: #endif
437:
438: #if defined (__GNUC__) || defined (_FORCE_INLINES)
439: _EXTERN_INLINE mp_limb_t
440: #if defined (__STDC__) || defined (__cplusplus)
441: mpn_add_1 (register mp_ptr res_ptr,
442: register mp_srcptr s1_ptr,
443: register mp_size_t s1_size,
444: register mp_limb_t s2_limb)
445: #else
446: mpn_add_1 (res_ptr, s1_ptr, s1_size, s2_limb)
447: register mp_ptr res_ptr;
448: register mp_srcptr s1_ptr;
449: register mp_size_t s1_size;
450: register mp_limb_t s2_limb;
451: #endif
452: {
453: register mp_limb_t x;
454:
455: x = *s1_ptr++;
456: s2_limb = x + s2_limb;
457: *res_ptr++ = s2_limb;
458: if (s2_limb < x)
459: {
460: while (--s1_size != 0)
461: {
462: x = *s1_ptr++ + 1;
463: *res_ptr++ = x;
464: if (x != 0)
465: goto fin;
466: }
467:
468: return 1;
469: }
470:
471: fin:
472: if (res_ptr != s1_ptr)
473: {
474: mp_size_t i;
475: for (i = 0; i < s1_size - 1; i++)
476: res_ptr[i] = s1_ptr[i];
477: }
478: return 0;
479: }
480:
481: _EXTERN_INLINE mp_limb_t
482: #if defined (__STDC__) || defined (__cplusplus)
483: mpn_add (register mp_ptr res_ptr,
484: register mp_srcptr s1_ptr,
485: register mp_size_t s1_size,
486: register mp_srcptr s2_ptr,
487: register mp_size_t s2_size)
488: #else
489: mpn_add (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size)
490: register mp_ptr res_ptr;
491: register mp_srcptr s1_ptr;
492: register mp_size_t s1_size;
493: register mp_srcptr s2_ptr;
494: register mp_size_t s2_size;
495: #endif
496: {
497: mp_limb_t cy_limb = 0;
498:
499: if (s2_size != 0)
500: cy_limb = mpn_add_n (res_ptr, s1_ptr, s2_ptr, s2_size);
501:
502: if (s1_size - s2_size != 0)
503: cy_limb = mpn_add_1 (res_ptr + s2_size,
504: s1_ptr + s2_size,
505: s1_size - s2_size,
506: cy_limb);
507: return cy_limb;
508: }
509:
510: _EXTERN_INLINE mp_limb_t
511: #if defined (__STDC__) || defined (__cplusplus)
512: mpn_sub_1 (register mp_ptr res_ptr,
513: register mp_srcptr s1_ptr,
514: register mp_size_t s1_size,
515: register mp_limb_t s2_limb)
516: #else
517: mpn_sub_1 (res_ptr, s1_ptr, s1_size, s2_limb)
518: register mp_ptr res_ptr;
519: register mp_srcptr s1_ptr;
520: register mp_size_t s1_size;
521: register mp_limb_t s2_limb;
522: #endif
523: {
524: register mp_limb_t x;
525:
526: x = *s1_ptr++;
527: s2_limb = x - s2_limb;
528: *res_ptr++ = s2_limb;
529: if (s2_limb > x)
530: {
531: while (--s1_size != 0)
532: {
533: x = *s1_ptr++;
534: *res_ptr++ = x - 1;
535: if (x != 0)
536: goto fin;
537: }
538:
539: return 1;
540: }
541:
542: fin:
543: if (res_ptr != s1_ptr)
544: {
545: mp_size_t i;
546: for (i = 0; i < s1_size - 1; i++)
547: res_ptr[i] = s1_ptr[i];
548: }
549: return 0;
550: }
551:
552: _EXTERN_INLINE mp_limb_t
553: #if defined (__STDC__) || defined (__cplusplus)
554: mpn_sub (register mp_ptr res_ptr,
555: register mp_srcptr s1_ptr,
556: register mp_size_t s1_size,
557: register mp_srcptr s2_ptr,
558: register mp_size_t s2_size)
559: #else
560: mpn_sub (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size)
561: register mp_ptr res_ptr;
562: register mp_srcptr s1_ptr;
563: register mp_size_t s1_size;
564: register mp_srcptr s2_ptr;
565: register mp_size_t s2_size;
566: #endif
567: {
568: mp_limb_t cy_limb = 0;
569:
570: if (s2_size != 0)
571: cy_limb = mpn_sub_n (res_ptr, s1_ptr, s2_ptr, s2_size);
572:
573: if (s1_size - s2_size != 0)
574: cy_limb = mpn_sub_1 (res_ptr + s2_size,
575: s1_ptr + s2_size,
576: s1_size - s2_size,
577: cy_limb);
578: return cy_limb;
579: }
580: #endif /* __GNUC__ */
581:
582: /* Allow faster testing for negative, zero, and positive. */
583: #define mpz_sgn(Z) ((Z)->_mp_size < 0 ? -1 : (Z)->_mp_size > 0)
584: #define mpf_sgn(F) ((F)->_mp_size < 0 ? -1 : (F)->_mp_size > 0)
585: #define mpq_sgn(Q) ((Q)->_mp_num._mp_size < 0 ? -1 : (Q)->_mp_num._mp_size > 0)
586:
587: /* Allow direct user access to numerator and denominator of a mpq_t object. */
588: #define mpq_numref(Q) (&((Q)->_mp_num))
589: #define mpq_denref(Q) (&((Q)->_mp_den))
590:
591: /* When using GCC, optimize certain common comparisons. */
592: #if defined (__GNUC__)
593: #define mpz_cmp_ui(Z,UI) \
594: (__builtin_constant_p (UI) && (UI) == 0 \
595: ? mpz_sgn (Z) : mpz_cmp_ui (Z,UI))
596: #define mpz_cmp_si(Z,UI) \
597: (__builtin_constant_p (UI) && (UI) == 0 ? mpz_sgn (Z) \
598: : __builtin_constant_p (UI) && (UI) > 0 ? mpz_cmp_ui (Z,UI) \
599: : mpz_cmp_si (Z,UI))
600: #define mpq_cmp_ui(Q,NUI,DUI) \
601: (__builtin_constant_p (NUI) && (NUI) == 0 \
602: ? mpq_sgn (Q) : mpq_cmp_ui (Q,NUI,DUI))
603: #endif
604:
605: #define mpn_divmod(qp,np,nsize,dp,dsize) mpn_divrem (qp,0,np,nsize,dp,dsize)
606: #if 0
607: #define mpn_divmod_1(qp,np,nsize,dlimb) mpn_divrem_1 (qp,0,np,nsize,dlimb)
608: #endif
609:
610: /* Compatibility with GMP 1. */
611: #define mpz_mdiv mpz_fdiv_q
612: #define mpz_mdivmod mpz_fdiv_qr
613: #define mpz_mmod mpz_fdiv_r
614: #define mpz_mdiv_ui mpz_fdiv_q_ui
615: #define mpz_mdivmod_ui(q,r,n,d) \
616: ((r == 0) ? mpz_fdiv_q_ui (q,n,d) : mpz_fdiv_qr_ui (q,r,n,d))
617: #define mpz_mmod_ui(r,n,d) \
618: ((r == 0) ? mpz_fdiv_ui (n,d) : mpz_fdiv_r_ui (r,n,d))
619:
620: /* Useful synonyms, but not quite compatible with GMP 1. */
621: #define mpz_div mpz_fdiv_q
622: #define mpz_divmod mpz_fdiv_qr
623: #define mpz_div_ui mpz_fdiv_q_ui
624: #define mpz_divmod_ui mpz_fdiv_qr_ui
625: #define mpz_mod_ui mpz_fdiv_r_ui
626: #define mpz_div_2exp mpz_fdiv_q_2exp
627: #define mpz_mod_2exp mpz_fdiv_r_2exp
628:
629: #define __GNU_MP_VERSION 2
630: #define __GNU_MP_VERSION_MINOR 0
631: #define __GMP_H__
632: #endif /* __GMP_H__ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>