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