initial import
[glibc.git] / stdio / gmp.h
blob95c2f1bebab913241f1c7c2073a55b4f7cbee6c2
1 /* gmp.h -- Definitions for GNU multiple precision functions.
3 Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
5 This file is part of the GNU MP Library.
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.
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.
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
21 #ifndef __GMP_H__
23 #ifndef __GNU_MP__
24 #define __need_size_t
25 #include <stddef.h>
27 #ifdef __STDC__
28 #define __gmp_const const
29 #else
30 #define __gmp_const
31 #endif
33 #ifdef __GNUC__
34 #define __gmp_inline inline
35 #else
36 #define __gmp_inline
37 #endif
39 #ifdef _SHORT_LIMB
40 typedef unsigned int mp_limb;
41 typedef int mp_limb_signed;
42 #else
43 typedef unsigned long int mp_limb;
44 typedef long int mp_limb_signed;
45 #endif
47 typedef mp_limb * mp_ptr;
48 typedef __gmp_const mp_limb * mp_srcptr;
49 typedef int mp_size_t;
50 typedef long int mp_exp_t;
52 #ifndef __MP_SMALL__
53 typedef struct
55 long int alloc; /* Number of *limbs* allocated and pointed
56 to by the D field. */
57 long int size; /* abs(SIZE) is the number of limbs
58 the last field points to. If SIZE
59 is negative this is a negative
60 number. */
61 mp_limb *d; /* Pointer to the limbs. */
62 } __mpz_struct;
63 #else
64 typedef struct
66 short int alloc; /* Number of *limbs* allocated and pointed
67 to by the D field. */
68 short int size; /* abs(SIZE) is the number of limbs
69 the last field points to. If SIZE
70 is negative this is a negative
71 number. */
72 mp_limb *d; /* Pointer to the limbs. */
73 } __mpz_struct;
74 #endif
75 #endif /* __GNU_MP__ */
77 /* User-visible types. */
78 typedef __mpz_struct MP_INT;
79 typedef __mpz_struct mpz_t[1];
81 /* Structure for rational numbers. Zero is represented as 0/any, i.e.
82 the denominator is ignored. Negative numbers have the sign in
83 the numerator. */
84 typedef struct
86 __mpz_struct num;
87 __mpz_struct den;
88 #if 0
89 long int num_alloc; /* Number of limbs allocated
90 for the numerator. */
91 long int num_size; /* The absolute value of this field is the
92 length of the numerator; the sign is the
93 sign of the entire rational number. */
94 mp_ptr num; /* Pointer to the numerator limbs. */
95 long int den_alloc; /* Number of limbs allocated
96 for the denominator. */
97 long int den_size; /* Length of the denominator. (This field
98 should always be positive.) */
99 mp_ptr den; /* Pointer to the denominator limbs. */
100 #endif
101 } __mpq_struct;
103 typedef __mpq_struct MP_RAT;
104 typedef __mpq_struct mpq_t[1];
106 typedef struct
108 mp_size_t alloc; /* Number of *limbs* allocated and pointed
109 to by the D field. */
110 mp_size_t prec; /* Max precision, in number of `mp_limb's.
111 Set by mpf_init and modified by
112 mpf_set_prec. */
113 mp_size_t size; /* abs(SIZE) is the number of limbs
114 the last field points to. If SIZE
115 is negative this is a negative
116 number. */
117 mp_exp_t exp; /* Exponent, in the base of `mp_limb'. */
118 mp_limb *d; /* Pointer to the limbs. */
119 } __mpf_struct;
121 /* typedef __mpf_struct MP_FLOAT; */
122 typedef __mpf_struct mpf_t[1];
124 /* Types for function declarations in gmp files. */
125 /* ??? Should not pollute user name space ??? */
126 typedef __gmp_const __mpz_struct *mpz_srcptr;
127 typedef __mpz_struct *mpz_ptr;
128 typedef __gmp_const __mpf_struct *mpf_srcptr;
129 typedef __mpf_struct *mpf_ptr;
130 typedef __gmp_const __mpq_struct *mpq_srcptr;
131 typedef __mpq_struct *mpq_ptr;
133 #ifdef __STDC__
134 #define _PROTO(x) x
135 #else
136 #define _PROTO(x) ()
137 #endif
139 void mp_set_memory_functions _PROTO((void *(*) (size_t),
140 void *(*) (void *, size_t, size_t),
141 void (*) (void *, size_t)));
143 /**************** Integer (i.e. Z) routines. ****************/
145 void *_mpz_realloc _PROTO ((mpz_ptr, mp_size_t));
147 void mpz_abs _PROTO ((mpz_ptr, mpz_srcptr));
148 void mpz_add _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
149 void mpz_add_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
150 void mpz_and _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
151 void mpz_clear _PROTO ((mpz_ptr));
152 void mpz_clrbit _PROTO ((mpz_ptr, unsigned long int));
153 int mpz_cmp _PROTO ((mpz_srcptr, mpz_srcptr));
154 int mpz_cmp_si _PROTO ((mpz_srcptr, signed long int));
155 int mpz_cmp_ui _PROTO ((mpz_srcptr, unsigned long int));
156 void mpz_com _PROTO ((mpz_ptr, mpz_srcptr));
157 void mpz_div_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
158 void mpz_fac_ui _PROTO ((mpz_ptr, unsigned long int));
159 void mpz_gcd _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
160 unsigned long int mpz_gcd_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
161 void mpz_gcdext _PROTO ((mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
162 /* signed */ long int mpz_get_si _PROTO ((mpz_srcptr));
163 char *mpz_get_str _PROTO ((char *, int, mpz_srcptr));
164 unsigned long int mpz_get_ui _PROTO ((mpz_srcptr));
165 mp_limb mpz_getlimbn _PROTO ((mpz_srcptr, mp_size_t));
166 mp_size_t mpz_hamdist _PROTO ((mpz_srcptr, mpz_srcptr));
167 void mpz_init _PROTO ((mpz_ptr));
168 #ifdef FILE
169 void mpz_inp_raw _PROTO ((mpz_ptr, FILE *));
170 int mpz_inp_str _PROTO ((mpz_ptr, FILE *, int));
171 #endif
172 void mpz_ior _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
173 void mpz_init_set _PROTO ((mpz_ptr, mpz_srcptr));
174 void mpz_init_set_si _PROTO ((mpz_ptr, signed long int));
175 int mpz_init_set_str _PROTO ((mpz_ptr, const char *, int));
176 void mpz_init_set_ui _PROTO ((mpz_ptr, unsigned long int));
177 void mpz_lcm _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
178 void mpz_mod_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
179 void mpz_mul _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
180 void mpz_mul_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
181 void mpz_mul_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
182 void mpz_neg _PROTO ((mpz_ptr, mpz_srcptr));
183 #ifdef FILE
184 void mpz_out_raw _PROTO ((FILE *, mpz_srcptr));
185 void mpz_out_str _PROTO ((FILE *, int, mpz_srcptr));
186 #endif
187 int mpz_perfect_square_p _PROTO ((mpz_srcptr));
188 mp_size_t mpz_popcount _PROTO ((mpz_srcptr));
189 void mpz_pow_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
190 void mpz_powm _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr));
191 void mpz_powm_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int, mpz_srcptr));
192 int mpz_probab_prime_p _PROTO ((mpz_srcptr, int));
193 void mpz_random _PROTO ((mpz_ptr, mp_size_t));
194 void mpz_random2 _PROTO ((mpz_ptr, mp_size_t));
195 void mpz_set _PROTO ((mpz_ptr, mpz_srcptr));
196 void mpz_set_si _PROTO ((mpz_ptr, signed long int));
197 int mpz_set_str _PROTO ((mpz_ptr, const char *, int));
198 void mpz_set_ui _PROTO ((mpz_ptr, unsigned long int));
199 size_t mpz_size _PROTO ((mpz_srcptr));
200 size_t mpz_sizeinbase _PROTO ((mpz_srcptr, int));
201 void mpz_sqrt _PROTO ((mpz_ptr, mpz_srcptr));
202 void mpz_sqrtrem _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr));
203 void mpz_sub _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
204 void mpz_sub_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
205 void mpz_ui_pow_ui _PROTO ((mpz_ptr, unsigned long int, unsigned long int));
207 void mpz_fdiv_q _PROTO((mpz_ptr, mpz_srcptr, mpz_srcptr));
208 unsigned long int mpz_fdiv_q_ui _PROTO((mpz_ptr, mpz_srcptr, unsigned long int));
209 void mpz_fdiv_qr _PROTO((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
210 unsigned long int mpz_fdiv_qr_ui _PROTO((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int));
211 void mpz_fdiv_r _PROTO((mpz_ptr, mpz_srcptr, mpz_srcptr));
212 unsigned long int mpz_fdiv_r_ui _PROTO((mpz_ptr, mpz_srcptr, unsigned long int));
213 unsigned long int mpz_fdiv_ui _PROTO((mpz_srcptr, unsigned long int));
214 void mpz_tdiv_q _PROTO((mpz_ptr, mpz_srcptr, mpz_srcptr));
215 void mpz_tdiv_q_ui _PROTO((mpz_ptr, mpz_srcptr, unsigned long int));
216 void mpz_tdiv_qr _PROTO((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
217 void mpz_tdiv_qr_ui _PROTO((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int));
218 void mpz_tdiv_r _PROTO((mpz_ptr, mpz_srcptr, mpz_srcptr));
219 void mpz_tdiv_r_ui _PROTO((mpz_ptr, mpz_srcptr, unsigned long int));
221 /**************** Rational (i.e. Q) routines. ****************/
223 void mpq_init _PROTO ((mpq_ptr));
224 void mpq_clear _PROTO ((mpq_ptr));
225 void mpq_set _PROTO ((mpq_ptr, mpq_srcptr));
226 void mpq_set_ui _PROTO ((mpq_ptr, unsigned long int, unsigned long int));
227 void mpq_set_si _PROTO ((mpq_ptr, signed long int, unsigned long int));
228 void mpq_add _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
229 void mpq_sub _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
230 void mpq_mul _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
231 void mpq_div _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
232 void mpq_neg _PROTO ((mpq_ptr, mpq_srcptr));
233 int mpq_cmp _PROTO ((mpq_srcptr, mpq_srcptr));
234 void mpq_inv _PROTO ((mpq_ptr, mpq_srcptr));
235 void mpq_set_num _PROTO ((mpq_ptr, mpz_srcptr));
236 void mpq_set_den _PROTO ((mpq_ptr, mpz_srcptr));
237 void mpq_get_num _PROTO ((mpz_ptr, mpq_srcptr));
238 void mpq_get_den _PROTO ((mpz_ptr, mpq_srcptr));
240 /**************** Float (i.e. F) routines. ****************/
242 void mpf_abs _PROTO ((mpf_ptr, mpf_srcptr));
243 void mpf_add _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
244 void mpf_add_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
245 void mpf_clear _PROTO ((mpf_ptr));
246 int mpf_cmp _PROTO ((mpf_srcptr, mpf_srcptr));
247 int mpf_cmp_si _PROTO ((mpf_srcptr, long int));
248 int mpf_cmp_ui _PROTO ((mpf_srcptr, unsigned long int));
249 void mpf_div _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
250 void mpf_div_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
251 void mpf_div_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
252 void mpf_dump _PROTO ((mpf_srcptr));
253 char *mpf_get_str _PROTO ((char *, mp_exp_t *, int, size_t, mpf_srcptr));
254 void mpf_init _PROTO ((mpf_ptr));
255 void mpf_init2 _PROTO ((mpf_ptr, mp_size_t));
256 #ifdef FILE
257 void mpf_inp_str _PROTO ((mpf_ptr, FILE *, int));
258 #endif
259 void mpf_init_set _PROTO ((mpf_ptr, mpf_srcptr));
260 void mpf_init_set_d _PROTO ((mpf_ptr, double));
261 void mpf_init_set_si _PROTO ((mpf_ptr, long int));
262 int mpf_init_set_str _PROTO ((mpf_ptr, char *, int));
263 void mpf_init_set_ui _PROTO ((mpf_ptr, unsigned long int));
264 void mpf_mul _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
265 void mpf_mul_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
266 void mpf_mul_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
267 void mpf_neg _PROTO ((mpf_ptr, mpf_srcptr));
268 #ifdef FILE
269 void mpf_out_str _PROTO ((mpf_ptr, int, size_t, FILE *));
270 #endif
271 void mpf_set _PROTO ((mpf_ptr, mpf_srcptr));
272 void mpf_set_d _PROTO ((mpf_ptr, double));
273 mp_size_t mpf_set_default_prec _PROTO ((mp_size_t));
274 void mpf_set_si _PROTO ((mpf_ptr, long int));
275 int mpf_set_str _PROTO ((mpf_ptr, const char *, int));
276 void mpf_set_ui _PROTO ((mpf_ptr, unsigned long int));
277 size_t mpf_size _PROTO ((mpf_srcptr));
278 void mpf_sqrt _PROTO ((mpf_ptr, mpf_srcptr));
279 void mpf_sqrt_ui _PROTO ((mpf_ptr, unsigned long int));
280 void mpf_sub _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
281 void mpf_sub_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
282 void mpf_ui_div _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr));
284 /************ Low level positive-integer (i.e. N) routines. ************/
286 /* This is ugly, but we need to make usr calls reach the prefixed function. */
287 #define mpn_add_n __mpn_add_n
288 #define mpn_sub_n __mpn_sub_n
289 #define mpn_mul_1 __mpn_mul_1
290 #define mpn_addmul_1 __mpn_addmul_1
291 #define mpn_submul_1 __mpn_submul_1
292 #define mpn_lshift __mpn_lshift
293 #define mpn_rshift __mpn_rshift
294 #define mpn_sub __mpn_sub
295 #define mpn_add __mpn_add
296 #define mpn_normal_size __mpn_normal_size
297 #define mpn_cmp __mpn_cmp
298 #define mpn_add_1 __mpn_add_1
299 #define mpn_sub_1 __mpn_sub_1
300 #define mpn_mul_n __mpn_mul_n
301 #define mpn_mul __mpn_mul
302 #define mpn_divmod __mpn_divmod
303 #define mpn_divmod_1 __mpn_divmod_1
304 #define mpn_mod_1 __mpn_mod_1
305 #define mpn_sqrt __mpn_sqrt
306 #define mpn_next_bit_set __mpn_next_bit_set
307 #define mpn_popcount __mpn_popcount
308 #define mpn_hamdist __mpn_hamdist
309 #define mpn_random2 __mpn_random2
310 #define mpn_set_str __mpn_set_str
311 #define mpn_get_str __mpn_get_str
312 #define mpn_gcd_1 __mpn_gcd_1
314 mp_limb __mpn_add_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
315 mp_limb __mpn_sub_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
316 mp_limb __mpn_mul _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t));
317 void __mpn_mul_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
318 mp_limb __mpn_mul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb));
319 mp_limb __mpn_addmul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb));
320 mp_limb __mpn_submul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb));
321 mp_limb __mpn_divmod _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t));
322 mp_limb __mpn_divmod_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb));
323 mp_limb __mpn_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb));
324 mp_limb __mpn_lshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int));
325 mp_limb __mpn_rshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int));
326 mp_size_t __mpn_sqrt _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t));
327 int __mpn_cmp _PROTO ((mp_srcptr, mp_srcptr, mp_size_t));
328 mp_size_t __mpn_next_bit_set _PROTO ((mp_srcptr, mp_size_t));
329 mp_size_t __mpn_popcount _PROTO ((mp_srcptr, mp_size_t));
330 mp_size_t __mpn_hamdist _PROTO ((mp_srcptr, mp_srcptr, mp_size_t));
331 void __mpn_random2 _PROTO ((mp_ptr, mp_size_t));
332 mp_size_t __mpn_set_str _PROTO ((mp_ptr, const unsigned char *, size_t, int));
333 size_t __mpn_get_str _PROTO ((unsigned char *, int, mp_ptr, mp_size_t));
334 mp_limb __mpn_gcd_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb));
337 static __gmp_inline mp_limb
338 #if __STDC__
339 __mpn_add_1 (register mp_ptr res_ptr,
340 register mp_srcptr s1_ptr,
341 register mp_size_t s1_size,
342 register mp_limb s2_limb)
343 #else
344 __mpn_add_1 (res_ptr, s1_ptr, s1_size, s2_limb)
345 register mp_ptr res_ptr;
346 register mp_srcptr s1_ptr;
347 register mp_size_t s1_size;
348 register mp_limb s2_limb;
349 #endif
351 register mp_limb x;
353 x = *s1_ptr++;
354 s2_limb = x + s2_limb;
355 *res_ptr++ = s2_limb;
356 if (s2_limb < x)
358 while (--s1_size != 0)
360 x = *s1_ptr++ + 1;
361 *res_ptr++ = x;
362 if (x != 0)
363 goto fin;
366 return 1;
369 fin:
370 if (res_ptr != s1_ptr)
372 mp_size_t i;
373 for (i = 0; i < s1_size - 1; i++)
374 res_ptr[i] = s1_ptr[i];
376 return 0;
379 static __gmp_inline mp_limb
380 #if __STDC__
381 __mpn_add (register mp_ptr res_ptr,
382 register mp_srcptr s1_ptr,
383 register mp_size_t s1_size,
384 register mp_srcptr s2_ptr,
385 register mp_size_t s2_size)
386 #else
387 __mpn_add (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size)
388 register mp_ptr res_ptr;
389 register mp_srcptr s1_ptr;
390 register mp_size_t s1_size;
391 register mp_srcptr s2_ptr;
392 register mp_size_t s2_size;
393 #endif
395 mp_limb cy_limb = 0;
397 if (s2_size != 0)
398 cy_limb = __mpn_add_n (res_ptr, s1_ptr, s2_ptr, s2_size);
400 if (s1_size - s2_size != 0)
401 cy_limb = __mpn_add_1 (res_ptr + s2_size,
402 s1_ptr + s2_size,
403 s1_size - s2_size,
404 cy_limb);
405 return cy_limb;
408 static __gmp_inline mp_limb
409 #if __STDC__
410 __mpn_sub_1 (register mp_ptr res_ptr,
411 register mp_srcptr s1_ptr,
412 register mp_size_t s1_size,
413 register mp_limb s2_limb)
414 #else
415 __mpn_sub_1 (res_ptr, s1_ptr, s1_size, s2_limb)
416 register mp_ptr res_ptr;
417 register mp_srcptr s1_ptr;
418 register mp_size_t s1_size;
419 register mp_limb s2_limb;
420 #endif
422 register mp_limb x;
424 x = *s1_ptr++;
425 s2_limb = x - s2_limb;
426 *res_ptr++ = s2_limb;
427 if (s2_limb > x)
429 while (--s1_size != 0)
431 x = *s1_ptr++;
432 *res_ptr++ = x - 1;
433 if (x != 0)
434 goto fin;
437 return 1;
440 fin:
441 if (res_ptr != s1_ptr)
443 mp_size_t i;
444 for (i = 0; i < s1_size - 1; i++)
445 res_ptr[i] = s1_ptr[i];
447 return 0;
450 static __gmp_inline mp_limb
451 #if __STDC__
452 __mpn_sub (register mp_ptr res_ptr,
453 register mp_srcptr s1_ptr,
454 register mp_size_t s1_size,
455 register mp_srcptr s2_ptr,
456 register mp_size_t s2_size)
457 #else
458 __mpn_sub (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size)
459 register mp_ptr res_ptr;
460 register mp_srcptr s1_ptr;
461 register mp_size_t s1_size;
462 register mp_srcptr s2_ptr;
463 register mp_size_t s2_size;
464 #endif
466 mp_limb cy_limb = 0;
468 if (s2_size != 0)
469 cy_limb = __mpn_sub_n (res_ptr, s1_ptr, s2_ptr, s2_size);
471 if (s1_size - s2_size != 0)
472 cy_limb = __mpn_sub_1 (res_ptr + s2_size,
473 s1_ptr + s2_size,
474 s1_size - s2_size,
475 cy_limb);
476 return cy_limb;
479 static __gmp_inline mp_size_t
480 #if __STDC__
481 __mpn_normal_size (mp_srcptr ptr, mp_size_t size)
482 #else
483 __mpn_normal_size (ptr, size)
484 mp_srcptr ptr;
485 mp_size_t size;
486 #endif
488 while (size)
490 size--;
491 if (ptr[size] != 0)
492 return size + 1;
494 return 0;
497 /* Compatibility with GMP 1. */
499 #define mpz_mdiv mpz_fdiv_q
500 #define mpz_mdivmod mpz_fdiv_qr
501 #define mpz_mmod mpz_fdiv_r
502 #define mpz_mdiv_ui mpz_fdiv_q_ui
503 #define mpz_mdivmod_ui(q,r,n,d) \
504 ((r == 0) ? mpz_fdiv_q_ui (q,n,d) : mpz_fdiv_qr_ui (q,r,n,d))
505 #define mpz_mmod_ui(r,n,d) \
506 ((r == 0) ? mpz_fdiv_ui (n,d) : mpz_fdiv_r_ui (r,n,d))
507 /* ??? Before release...
508 #define mpz_div_2exp mpz_fdiv_q_2exp
509 #define mpz_mod_2exp mpz_fdiv_r_2exp
512 /* Useful synonyms, but not quite compatible with GMP 1. */
513 #define mpz_div mpz_fdiv_q
514 #define mpz_divmod mpz_fdiv_qr
515 #define mpz_mod mpz_fdiv_r
516 #define mpz_div_ui mpz_fdiv_q_ui
517 #define mpz_divmod_ui mpz_fdiv_qr_ui
518 #define mpz_mod_ui mpz_fdiv_r_ui
521 #define __GNU_MP__ 2
522 #define __GNU_MP_VERSION 2
523 #define __GNU_MP_VERSION_MINOR -900 /* ??? */
524 #define __GMP_H__
525 #endif /* __GMP_H__ */