malloc-h: New module.
[gnulib.git] / lib / mini-gmp.c
bloba7b7190987074639f31be97ad1b0fd6272654971
1 /* mini-gmp, a minimalistic implementation of a GNU GMP subset.
3 Contributed to the GNU project by Niels Möller
5 Copyright 1991-1997, 1999-2020 Free Software Foundation, Inc.
7 This file is part of the GNU MP Library.
9 The GNU MP Library is free software; you can redistribute it and/or modify
10 it under the terms of either:
12 * the GNU Lesser General Public License as published by the Free
13 Software Foundation; either version 3 of the License, or (at your
14 option) any later version.
18 * the GNU General Public License as published by the Free Software
19 Foundation; either version 2 of the License, or (at your option) any
20 later version.
22 or both in parallel, as here.
24 The GNU MP Library is distributed in the hope that it will be useful, but
25 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
26 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
27 for more details.
29 You should have received copies of the GNU General Public License and the
30 GNU Lesser General Public License along with the GNU MP Library. If not,
31 see https://www.gnu.org/licenses/. */
33 /* NOTE: All functions in this file which are not declared in
34 mini-gmp.h are internal, and are not intended to be compatible
35 neither with GMP nor with future versions of mini-gmp. */
37 /* Much of the material copied from GMP files, including: gmp-impl.h,
38 longlong.h, mpn/generic/add_n.c, mpn/generic/addmul_1.c,
39 mpn/generic/lshift.c, mpn/generic/mul_1.c,
40 mpn/generic/mul_basecase.c, mpn/generic/rshift.c,
41 mpn/generic/sbpi1_div_qr.c, mpn/generic/sub_n.c,
42 mpn/generic/submul_1.c. */
44 #include <assert.h>
45 #include <ctype.h>
46 #include <limits.h>
47 #include <stdio.h>
48 #include <stdlib.h>
49 #include <string.h>
51 #include "mini-gmp.h"
53 #if !defined(MINI_GMP_DONT_USE_FLOAT_H)
54 #include <float.h>
55 #endif
58 /* Macros */
59 #define GMP_LIMB_BITS (sizeof(mp_limb_t) * CHAR_BIT)
61 #define GMP_LIMB_MAX ((mp_limb_t) ~ (mp_limb_t) 0)
62 #define GMP_LIMB_HIGHBIT ((mp_limb_t) 1 << (GMP_LIMB_BITS - 1))
64 #define GMP_HLIMB_BIT ((mp_limb_t) 1 << (GMP_LIMB_BITS / 2))
65 #define GMP_LLIMB_MASK (GMP_HLIMB_BIT - 1)
67 #define GMP_ULONG_BITS (sizeof(unsigned long) * CHAR_BIT)
68 #define GMP_ULONG_HIGHBIT ((unsigned long) 1 << (GMP_ULONG_BITS - 1))
70 #define GMP_ABS(x) ((x) >= 0 ? (x) : -(x))
71 #define GMP_NEG_CAST(T,x) (-((T)((x) + 1) - 1))
73 #define GMP_MIN(a, b) ((a) < (b) ? (a) : (b))
74 #define GMP_MAX(a, b) ((a) > (b) ? (a) : (b))
76 #define GMP_CMP(a,b) (((a) > (b)) - ((a) < (b)))
78 #if defined(DBL_MANT_DIG) && FLT_RADIX == 2
79 #define GMP_DBL_MANT_BITS DBL_MANT_DIG
80 #else
81 #define GMP_DBL_MANT_BITS (53)
82 #endif
84 /* Return non-zero if xp,xsize and yp,ysize overlap.
85 If xp+xsize<=yp there's no overlap, or if yp+ysize<=xp there's no
86 overlap. If both these are false, there's an overlap. */
87 #define GMP_MPN_OVERLAP_P(xp, xsize, yp, ysize) \
88 ((xp) + (xsize) > (yp) && (yp) + (ysize) > (xp))
90 #define gmp_assert_nocarry(x) do { \
91 mp_limb_t __cy = (x); \
92 assert (__cy == 0); \
93 } while (0)
95 #define gmp_clz(count, x) do { \
96 mp_limb_t __clz_x = (x); \
97 unsigned __clz_c = 0; \
98 int LOCAL_SHIFT_BITS = 8; \
99 if (GMP_LIMB_BITS > LOCAL_SHIFT_BITS) \
100 for (; \
101 (__clz_x & ((mp_limb_t) 0xff << (GMP_LIMB_BITS - 8))) == 0; \
102 __clz_c += 8) \
103 { __clz_x <<= LOCAL_SHIFT_BITS; } \
104 for (; (__clz_x & GMP_LIMB_HIGHBIT) == 0; __clz_c++) \
105 __clz_x <<= 1; \
106 (count) = __clz_c; \
107 } while (0)
109 #define gmp_ctz(count, x) do { \
110 mp_limb_t __ctz_x = (x); \
111 unsigned __ctz_c = 0; \
112 gmp_clz (__ctz_c, __ctz_x & - __ctz_x); \
113 (count) = GMP_LIMB_BITS - 1 - __ctz_c; \
114 } while (0)
116 #define gmp_add_ssaaaa(sh, sl, ah, al, bh, bl) \
117 do { \
118 mp_limb_t __x; \
119 __x = (al) + (bl); \
120 (sh) = (ah) + (bh) + (__x < (al)); \
121 (sl) = __x; \
122 } while (0)
124 #define gmp_sub_ddmmss(sh, sl, ah, al, bh, bl) \
125 do { \
126 mp_limb_t __x; \
127 __x = (al) - (bl); \
128 (sh) = (ah) - (bh) - ((al) < (bl)); \
129 (sl) = __x; \
130 } while (0)
132 #define gmp_umul_ppmm(w1, w0, u, v) \
133 do { \
134 int LOCAL_GMP_LIMB_BITS = GMP_LIMB_BITS; \
135 if (sizeof(unsigned int) * CHAR_BIT >= 2 * GMP_LIMB_BITS) \
137 unsigned int __ww = (unsigned int) (u) * (v); \
138 w0 = (mp_limb_t) __ww; \
139 w1 = (mp_limb_t) (__ww >> LOCAL_GMP_LIMB_BITS); \
141 else if (GMP_ULONG_BITS >= 2 * GMP_LIMB_BITS) \
143 unsigned long int __ww = (unsigned long int) (u) * (v); \
144 w0 = (mp_limb_t) __ww; \
145 w1 = (mp_limb_t) (__ww >> LOCAL_GMP_LIMB_BITS); \
147 else { \
148 mp_limb_t __x0, __x1, __x2, __x3; \
149 unsigned __ul, __vl, __uh, __vh; \
150 mp_limb_t __u = (u), __v = (v); \
152 __ul = __u & GMP_LLIMB_MASK; \
153 __uh = __u >> (GMP_LIMB_BITS / 2); \
154 __vl = __v & GMP_LLIMB_MASK; \
155 __vh = __v >> (GMP_LIMB_BITS / 2); \
157 __x0 = (mp_limb_t) __ul * __vl; \
158 __x1 = (mp_limb_t) __ul * __vh; \
159 __x2 = (mp_limb_t) __uh * __vl; \
160 __x3 = (mp_limb_t) __uh * __vh; \
162 __x1 += __x0 >> (GMP_LIMB_BITS / 2);/* this can't give carry */ \
163 __x1 += __x2; /* but this indeed can */ \
164 if (__x1 < __x2) /* did we get it? */ \
165 __x3 += GMP_HLIMB_BIT; /* yes, add it in the proper pos. */ \
167 (w1) = __x3 + (__x1 >> (GMP_LIMB_BITS / 2)); \
168 (w0) = (__x1 << (GMP_LIMB_BITS / 2)) + (__x0 & GMP_LLIMB_MASK); \
170 } while (0)
172 #define gmp_udiv_qrnnd_preinv(q, r, nh, nl, d, di) \
173 do { \
174 mp_limb_t _qh, _ql, _r, _mask; \
175 gmp_umul_ppmm (_qh, _ql, (nh), (di)); \
176 gmp_add_ssaaaa (_qh, _ql, _qh, _ql, (nh) + 1, (nl)); \
177 _r = (nl) - _qh * (d); \
178 _mask = -(mp_limb_t) (_r > _ql); /* both > and >= are OK */ \
179 _qh += _mask; \
180 _r += _mask & (d); \
181 if (_r >= (d)) \
183 _r -= (d); \
184 _qh++; \
187 (r) = _r; \
188 (q) = _qh; \
189 } while (0)
191 #define gmp_udiv_qr_3by2(q, r1, r0, n2, n1, n0, d1, d0, dinv) \
192 do { \
193 mp_limb_t _q0, _t1, _t0, _mask; \
194 gmp_umul_ppmm ((q), _q0, (n2), (dinv)); \
195 gmp_add_ssaaaa ((q), _q0, (q), _q0, (n2), (n1)); \
197 /* Compute the two most significant limbs of n - q'd */ \
198 (r1) = (n1) - (d1) * (q); \
199 gmp_sub_ddmmss ((r1), (r0), (r1), (n0), (d1), (d0)); \
200 gmp_umul_ppmm (_t1, _t0, (d0), (q)); \
201 gmp_sub_ddmmss ((r1), (r0), (r1), (r0), _t1, _t0); \
202 (q)++; \
204 /* Conditionally adjust q and the remainders */ \
205 _mask = - (mp_limb_t) ((r1) >= _q0); \
206 (q) += _mask; \
207 gmp_add_ssaaaa ((r1), (r0), (r1), (r0), _mask & (d1), _mask & (d0)); \
208 if ((r1) >= (d1)) \
210 if ((r1) > (d1) || (r0) >= (d0)) \
212 (q)++; \
213 gmp_sub_ddmmss ((r1), (r0), (r1), (r0), (d1), (d0)); \
216 } while (0)
218 /* Swap macros. */
219 #define MP_LIMB_T_SWAP(x, y) \
220 do { \
221 mp_limb_t __mp_limb_t_swap__tmp = (x); \
222 (x) = (y); \
223 (y) = __mp_limb_t_swap__tmp; \
224 } while (0)
225 #define MP_SIZE_T_SWAP(x, y) \
226 do { \
227 mp_size_t __mp_size_t_swap__tmp = (x); \
228 (x) = (y); \
229 (y) = __mp_size_t_swap__tmp; \
230 } while (0)
231 #define MP_BITCNT_T_SWAP(x,y) \
232 do { \
233 mp_bitcnt_t __mp_bitcnt_t_swap__tmp = (x); \
234 (x) = (y); \
235 (y) = __mp_bitcnt_t_swap__tmp; \
236 } while (0)
237 #define MP_PTR_SWAP(x, y) \
238 do { \
239 mp_ptr __mp_ptr_swap__tmp = (x); \
240 (x) = (y); \
241 (y) = __mp_ptr_swap__tmp; \
242 } while (0)
243 #define MP_SRCPTR_SWAP(x, y) \
244 do { \
245 mp_srcptr __mp_srcptr_swap__tmp = (x); \
246 (x) = (y); \
247 (y) = __mp_srcptr_swap__tmp; \
248 } while (0)
250 #define MPN_PTR_SWAP(xp,xs, yp,ys) \
251 do { \
252 MP_PTR_SWAP (xp, yp); \
253 MP_SIZE_T_SWAP (xs, ys); \
254 } while(0)
255 #define MPN_SRCPTR_SWAP(xp,xs, yp,ys) \
256 do { \
257 MP_SRCPTR_SWAP (xp, yp); \
258 MP_SIZE_T_SWAP (xs, ys); \
259 } while(0)
261 #define MPZ_PTR_SWAP(x, y) \
262 do { \
263 mpz_ptr __mpz_ptr_swap__tmp = (x); \
264 (x) = (y); \
265 (y) = __mpz_ptr_swap__tmp; \
266 } while (0)
267 #define MPZ_SRCPTR_SWAP(x, y) \
268 do { \
269 mpz_srcptr __mpz_srcptr_swap__tmp = (x); \
270 (x) = (y); \
271 (y) = __mpz_srcptr_swap__tmp; \
272 } while (0)
274 const int mp_bits_per_limb = GMP_LIMB_BITS;
277 /* Memory allocation and other helper functions. */
278 static void
279 gmp_die (const char *msg)
281 fprintf (stderr, "%s\n", msg);
282 abort();
285 static void *
286 gmp_default_alloc (size_t size)
288 void *p;
290 assert (size > 0);
292 p = malloc (size);
293 if (!p)
294 gmp_die("gmp_default_alloc: Virtual memory exhausted.");
296 return p;
299 static void *
300 gmp_default_realloc (void *old, size_t unused_old_size, size_t new_size)
302 void * p;
304 p = realloc (old, new_size);
306 if (!p)
307 gmp_die("gmp_default_realloc: Virtual memory exhausted.");
309 return p;
312 static void
313 gmp_default_free (void *p, size_t unused_size)
315 free (p);
318 static void * (*gmp_allocate_func) (size_t) = gmp_default_alloc;
319 static void * (*gmp_reallocate_func) (void *, size_t, size_t) = gmp_default_realloc;
320 static void (*gmp_free_func) (void *, size_t) = gmp_default_free;
322 void
323 mp_get_memory_functions (void *(**alloc_func) (size_t),
324 void *(**realloc_func) (void *, size_t, size_t),
325 void (**free_func) (void *, size_t))
327 if (alloc_func)
328 *alloc_func = gmp_allocate_func;
330 if (realloc_func)
331 *realloc_func = gmp_reallocate_func;
333 if (free_func)
334 *free_func = gmp_free_func;
337 void
338 mp_set_memory_functions (void *(*alloc_func) (size_t),
339 void *(*realloc_func) (void *, size_t, size_t),
340 void (*free_func) (void *, size_t))
342 if (!alloc_func)
343 alloc_func = gmp_default_alloc;
344 if (!realloc_func)
345 realloc_func = gmp_default_realloc;
346 if (!free_func)
347 free_func = gmp_default_free;
349 gmp_allocate_func = alloc_func;
350 gmp_reallocate_func = realloc_func;
351 gmp_free_func = free_func;
354 #define gmp_alloc(size) ((*gmp_allocate_func)((size)))
355 #define gmp_free(p, size) ((*gmp_free_func) ((p), (size)))
356 #define gmp_realloc(ptr, old_size, size) ((*gmp_reallocate_func)(ptr, old_size, size))
358 static mp_ptr
359 gmp_alloc_limbs (mp_size_t size)
361 return (mp_ptr) gmp_alloc (size * sizeof (mp_limb_t));
364 static mp_ptr
365 gmp_realloc_limbs (mp_ptr old, mp_size_t old_size, mp_size_t size)
367 assert (size > 0);
368 return (mp_ptr) gmp_realloc (old, old_size * sizeof (mp_limb_t), size * sizeof (mp_limb_t));
371 static void
372 gmp_free_limbs (mp_ptr old, mp_size_t size)
374 gmp_free (old, size * sizeof (mp_limb_t));
378 /* MPN interface */
380 void
381 mpn_copyi (mp_ptr d, mp_srcptr s, mp_size_t n)
383 mp_size_t i;
384 for (i = 0; i < n; i++)
385 d[i] = s[i];
388 void
389 mpn_copyd (mp_ptr d, mp_srcptr s, mp_size_t n)
391 while (--n >= 0)
392 d[n] = s[n];
396 mpn_cmp (mp_srcptr ap, mp_srcptr bp, mp_size_t n)
398 while (--n >= 0)
400 if (ap[n] != bp[n])
401 return ap[n] > bp[n] ? 1 : -1;
403 return 0;
406 static int
407 mpn_cmp4 (mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
409 if (an != bn)
410 return an < bn ? -1 : 1;
411 else
412 return mpn_cmp (ap, bp, an);
415 static mp_size_t
416 mpn_normalized_size (mp_srcptr xp, mp_size_t n)
418 while (n > 0 && xp[n-1] == 0)
419 --n;
420 return n;
424 mpn_zero_p(mp_srcptr rp, mp_size_t n)
426 return mpn_normalized_size (rp, n) == 0;
429 void
430 mpn_zero (mp_ptr rp, mp_size_t n)
432 while (--n >= 0)
433 rp[n] = 0;
436 mp_limb_t
437 mpn_add_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
439 mp_size_t i;
441 assert (n > 0);
442 i = 0;
445 mp_limb_t r = ap[i] + b;
446 /* Carry out */
447 b = (r < b);
448 rp[i] = r;
450 while (++i < n);
452 return b;
455 mp_limb_t
456 mpn_add_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
458 mp_size_t i;
459 mp_limb_t cy;
461 for (i = 0, cy = 0; i < n; i++)
463 mp_limb_t a, b, r;
464 a = ap[i]; b = bp[i];
465 r = a + cy;
466 cy = (r < cy);
467 r += b;
468 cy += (r < b);
469 rp[i] = r;
471 return cy;
474 mp_limb_t
475 mpn_add (mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
477 mp_limb_t cy;
479 assert (an >= bn);
481 cy = mpn_add_n (rp, ap, bp, bn);
482 if (an > bn)
483 cy = mpn_add_1 (rp + bn, ap + bn, an - bn, cy);
484 return cy;
487 mp_limb_t
488 mpn_sub_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
490 mp_size_t i;
492 assert (n > 0);
494 i = 0;
497 mp_limb_t a = ap[i];
498 /* Carry out */
499 mp_limb_t cy = a < b;
500 rp[i] = a - b;
501 b = cy;
503 while (++i < n);
505 return b;
508 mp_limb_t
509 mpn_sub_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
511 mp_size_t i;
512 mp_limb_t cy;
514 for (i = 0, cy = 0; i < n; i++)
516 mp_limb_t a, b;
517 a = ap[i]; b = bp[i];
518 b += cy;
519 cy = (b < cy);
520 cy += (a < b);
521 rp[i] = a - b;
523 return cy;
526 mp_limb_t
527 mpn_sub (mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
529 mp_limb_t cy;
531 assert (an >= bn);
533 cy = mpn_sub_n (rp, ap, bp, bn);
534 if (an > bn)
535 cy = mpn_sub_1 (rp + bn, ap + bn, an - bn, cy);
536 return cy;
539 mp_limb_t
540 mpn_mul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
542 mp_limb_t ul, cl, hpl, lpl;
544 assert (n >= 1);
546 cl = 0;
549 ul = *up++;
550 gmp_umul_ppmm (hpl, lpl, ul, vl);
552 lpl += cl;
553 cl = (lpl < cl) + hpl;
555 *rp++ = lpl;
557 while (--n != 0);
559 return cl;
562 mp_limb_t
563 mpn_addmul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
565 mp_limb_t ul, cl, hpl, lpl, rl;
567 assert (n >= 1);
569 cl = 0;
572 ul = *up++;
573 gmp_umul_ppmm (hpl, lpl, ul, vl);
575 lpl += cl;
576 cl = (lpl < cl) + hpl;
578 rl = *rp;
579 lpl = rl + lpl;
580 cl += lpl < rl;
581 *rp++ = lpl;
583 while (--n != 0);
585 return cl;
588 mp_limb_t
589 mpn_submul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
591 mp_limb_t ul, cl, hpl, lpl, rl;
593 assert (n >= 1);
595 cl = 0;
598 ul = *up++;
599 gmp_umul_ppmm (hpl, lpl, ul, vl);
601 lpl += cl;
602 cl = (lpl < cl) + hpl;
604 rl = *rp;
605 lpl = rl - lpl;
606 cl += lpl > rl;
607 *rp++ = lpl;
609 while (--n != 0);
611 return cl;
614 mp_limb_t
615 mpn_mul (mp_ptr rp, mp_srcptr up, mp_size_t un, mp_srcptr vp, mp_size_t vn)
617 assert (un >= vn);
618 assert (vn >= 1);
619 assert (!GMP_MPN_OVERLAP_P(rp, un + vn, up, un));
620 assert (!GMP_MPN_OVERLAP_P(rp, un + vn, vp, vn));
622 /* We first multiply by the low order limb. This result can be
623 stored, not added, to rp. We also avoid a loop for zeroing this
624 way. */
626 rp[un] = mpn_mul_1 (rp, up, un, vp[0]);
628 /* Now accumulate the product of up[] and the next higher limb from
629 vp[]. */
631 while (--vn >= 1)
633 rp += 1, vp += 1;
634 rp[un] = mpn_addmul_1 (rp, up, un, vp[0]);
636 return rp[un];
639 void
640 mpn_mul_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
642 mpn_mul (rp, ap, n, bp, n);
645 void
646 mpn_sqr (mp_ptr rp, mp_srcptr ap, mp_size_t n)
648 mpn_mul (rp, ap, n, ap, n);
651 mp_limb_t
652 mpn_lshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
654 mp_limb_t high_limb, low_limb;
655 unsigned int tnc;
656 mp_limb_t retval;
658 assert (n >= 1);
659 assert (cnt >= 1);
660 assert (cnt < GMP_LIMB_BITS);
662 up += n;
663 rp += n;
665 tnc = GMP_LIMB_BITS - cnt;
666 low_limb = *--up;
667 retval = low_limb >> tnc;
668 high_limb = (low_limb << cnt);
670 while (--n != 0)
672 low_limb = *--up;
673 *--rp = high_limb | (low_limb >> tnc);
674 high_limb = (low_limb << cnt);
676 *--rp = high_limb;
678 return retval;
681 mp_limb_t
682 mpn_rshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
684 mp_limb_t high_limb, low_limb;
685 unsigned int tnc;
686 mp_limb_t retval;
688 assert (n >= 1);
689 assert (cnt >= 1);
690 assert (cnt < GMP_LIMB_BITS);
692 tnc = GMP_LIMB_BITS - cnt;
693 high_limb = *up++;
694 retval = (high_limb << tnc);
695 low_limb = high_limb >> cnt;
697 while (--n != 0)
699 high_limb = *up++;
700 *rp++ = low_limb | (high_limb << tnc);
701 low_limb = high_limb >> cnt;
703 *rp = low_limb;
705 return retval;
708 static mp_bitcnt_t
709 mpn_common_scan (mp_limb_t limb, mp_size_t i, mp_srcptr up, mp_size_t un,
710 mp_limb_t ux)
712 unsigned cnt;
714 assert (ux == 0 || ux == GMP_LIMB_MAX);
715 assert (0 <= i && i <= un );
717 while (limb == 0)
719 i++;
720 if (i == un)
721 return (ux == 0 ? ~(mp_bitcnt_t) 0 : un * GMP_LIMB_BITS);
722 limb = ux ^ up[i];
724 gmp_ctz (cnt, limb);
725 return (mp_bitcnt_t) i * GMP_LIMB_BITS + cnt;
728 mp_bitcnt_t
729 mpn_scan1 (mp_srcptr ptr, mp_bitcnt_t bit)
731 mp_size_t i;
732 i = bit / GMP_LIMB_BITS;
734 return mpn_common_scan ( ptr[i] & (GMP_LIMB_MAX << (bit % GMP_LIMB_BITS)),
735 i, ptr, i, 0);
738 mp_bitcnt_t
739 mpn_scan0 (mp_srcptr ptr, mp_bitcnt_t bit)
741 mp_size_t i;
742 i = bit / GMP_LIMB_BITS;
744 return mpn_common_scan (~ptr[i] & (GMP_LIMB_MAX << (bit % GMP_LIMB_BITS)),
745 i, ptr, i, GMP_LIMB_MAX);
748 void
749 mpn_com (mp_ptr rp, mp_srcptr up, mp_size_t n)
751 while (--n >= 0)
752 *rp++ = ~ *up++;
755 mp_limb_t
756 mpn_neg (mp_ptr rp, mp_srcptr up, mp_size_t n)
758 while (*up == 0)
760 *rp = 0;
761 if (!--n)
762 return 0;
763 ++up; ++rp;
765 *rp = - *up;
766 mpn_com (++rp, ++up, --n);
767 return 1;
771 /* MPN division interface. */
773 /* The 3/2 inverse is defined as
775 m = floor( (B^3-1) / (B u1 + u0)) - B
777 mp_limb_t
778 mpn_invert_3by2 (mp_limb_t u1, mp_limb_t u0)
780 mp_limb_t r, m;
783 mp_limb_t p, ql;
784 unsigned ul, uh, qh;
786 /* For notation, let b denote the half-limb base, so that B = b^2.
787 Split u1 = b uh + ul. */
788 ul = u1 & GMP_LLIMB_MASK;
789 uh = u1 >> (GMP_LIMB_BITS / 2);
791 /* Approximation of the high half of quotient. Differs from the 2/1
792 inverse of the half limb uh, since we have already subtracted
793 u0. */
794 qh = (u1 ^ GMP_LIMB_MAX) / uh;
796 /* Adjust to get a half-limb 3/2 inverse, i.e., we want
798 qh' = floor( (b^3 - 1) / u) - b = floor ((b^3 - b u - 1) / u
799 = floor( (b (~u) + b-1) / u),
801 and the remainder
803 r = b (~u) + b-1 - qh (b uh + ul)
804 = b (~u - qh uh) + b-1 - qh ul
806 Subtraction of qh ul may underflow, which implies adjustments.
807 But by normalization, 2 u >= B > qh ul, so we need to adjust by
808 at most 2.
811 r = ((~u1 - (mp_limb_t) qh * uh) << (GMP_LIMB_BITS / 2)) | GMP_LLIMB_MASK;
813 p = (mp_limb_t) qh * ul;
814 /* Adjustment steps taken from udiv_qrnnd_c */
815 if (r < p)
817 qh--;
818 r += u1;
819 if (r >= u1) /* i.e. we didn't get carry when adding to r */
820 if (r < p)
822 qh--;
823 r += u1;
826 r -= p;
828 /* Low half of the quotient is
830 ql = floor ( (b r + b-1) / u1).
832 This is a 3/2 division (on half-limbs), for which qh is a
833 suitable inverse. */
835 p = (r >> (GMP_LIMB_BITS / 2)) * qh + r;
836 /* Unlike full-limb 3/2, we can add 1 without overflow. For this to
837 work, it is essential that ql is a full mp_limb_t. */
838 ql = (p >> (GMP_LIMB_BITS / 2)) + 1;
840 /* By the 3/2 trick, we don't need the high half limb. */
841 r = (r << (GMP_LIMB_BITS / 2)) + GMP_LLIMB_MASK - ql * u1;
843 if (r >= (GMP_LIMB_MAX & (p << (GMP_LIMB_BITS / 2))))
845 ql--;
846 r += u1;
848 m = ((mp_limb_t) qh << (GMP_LIMB_BITS / 2)) + ql;
849 if (r >= u1)
851 m++;
852 r -= u1;
856 /* Now m is the 2/1 inverse of u1. If u0 > 0, adjust it to become a
857 3/2 inverse. */
858 if (u0 > 0)
860 mp_limb_t th, tl;
861 r = ~r;
862 r += u0;
863 if (r < u0)
865 m--;
866 if (r >= u1)
868 m--;
869 r -= u1;
871 r -= u1;
873 gmp_umul_ppmm (th, tl, u0, m);
874 r += th;
875 if (r < th)
877 m--;
878 m -= ((r > u1) | ((r == u1) & (tl > u0)));
882 return m;
885 struct gmp_div_inverse
887 /* Normalization shift count. */
888 unsigned shift;
889 /* Normalized divisor (d0 unused for mpn_div_qr_1) */
890 mp_limb_t d1, d0;
891 /* Inverse, for 2/1 or 3/2. */
892 mp_limb_t di;
895 static void
896 mpn_div_qr_1_invert (struct gmp_div_inverse *inv, mp_limb_t d)
898 unsigned shift;
900 assert (d > 0);
901 gmp_clz (shift, d);
902 inv->shift = shift;
903 inv->d1 = d << shift;
904 inv->di = mpn_invert_limb (inv->d1);
907 static void
908 mpn_div_qr_2_invert (struct gmp_div_inverse *inv,
909 mp_limb_t d1, mp_limb_t d0)
911 unsigned shift;
913 assert (d1 > 0);
914 gmp_clz (shift, d1);
915 inv->shift = shift;
916 if (shift > 0)
918 d1 = (d1 << shift) | (d0 >> (GMP_LIMB_BITS - shift));
919 d0 <<= shift;
921 inv->d1 = d1;
922 inv->d0 = d0;
923 inv->di = mpn_invert_3by2 (d1, d0);
926 static void
927 mpn_div_qr_invert (struct gmp_div_inverse *inv,
928 mp_srcptr dp, mp_size_t dn)
930 assert (dn > 0);
932 if (dn == 1)
933 mpn_div_qr_1_invert (inv, dp[0]);
934 else if (dn == 2)
935 mpn_div_qr_2_invert (inv, dp[1], dp[0]);
936 else
938 unsigned shift;
939 mp_limb_t d1, d0;
941 d1 = dp[dn-1];
942 d0 = dp[dn-2];
943 assert (d1 > 0);
944 gmp_clz (shift, d1);
945 inv->shift = shift;
946 if (shift > 0)
948 d1 = (d1 << shift) | (d0 >> (GMP_LIMB_BITS - shift));
949 d0 = (d0 << shift) | (dp[dn-3] >> (GMP_LIMB_BITS - shift));
951 inv->d1 = d1;
952 inv->d0 = d0;
953 inv->di = mpn_invert_3by2 (d1, d0);
957 /* Not matching current public gmp interface, rather corresponding to
958 the sbpi1_div_* functions. */
959 static mp_limb_t
960 mpn_div_qr_1_preinv (mp_ptr qp, mp_srcptr np, mp_size_t nn,
961 const struct gmp_div_inverse *inv)
963 mp_limb_t d, di;
964 mp_limb_t r;
965 mp_ptr tp = NULL;
966 mp_size_t tn = 0;
968 if (inv->shift > 0)
970 /* Shift, reusing qp area if possible. In-place shift if qp == np. */
971 tp = qp;
972 if (!tp)
974 tn = nn;
975 tp = gmp_alloc_limbs (tn);
977 r = mpn_lshift (tp, np, nn, inv->shift);
978 np = tp;
980 else
981 r = 0;
983 d = inv->d1;
984 di = inv->di;
985 while (--nn >= 0)
987 mp_limb_t q;
989 gmp_udiv_qrnnd_preinv (q, r, r, np[nn], d, di);
990 if (qp)
991 qp[nn] = q;
993 if (tn)
994 gmp_free_limbs (tp, tn);
996 return r >> inv->shift;
999 static void
1000 mpn_div_qr_2_preinv (mp_ptr qp, mp_ptr np, mp_size_t nn,
1001 const struct gmp_div_inverse *inv)
1003 unsigned shift;
1004 mp_size_t i;
1005 mp_limb_t d1, d0, di, r1, r0;
1007 assert (nn >= 2);
1008 shift = inv->shift;
1009 d1 = inv->d1;
1010 d0 = inv->d0;
1011 di = inv->di;
1013 if (shift > 0)
1014 r1 = mpn_lshift (np, np, nn, shift);
1015 else
1016 r1 = 0;
1018 r0 = np[nn - 1];
1020 i = nn - 2;
1023 mp_limb_t n0, q;
1024 n0 = np[i];
1025 gmp_udiv_qr_3by2 (q, r1, r0, r1, r0, n0, d1, d0, di);
1027 if (qp)
1028 qp[i] = q;
1030 while (--i >= 0);
1032 if (shift > 0)
1034 assert ((r0 & (GMP_LIMB_MAX >> (GMP_LIMB_BITS - shift))) == 0);
1035 r0 = (r0 >> shift) | (r1 << (GMP_LIMB_BITS - shift));
1036 r1 >>= shift;
1039 np[1] = r1;
1040 np[0] = r0;
1043 static void
1044 mpn_div_qr_pi1 (mp_ptr qp,
1045 mp_ptr np, mp_size_t nn, mp_limb_t n1,
1046 mp_srcptr dp, mp_size_t dn,
1047 mp_limb_t dinv)
1049 mp_size_t i;
1051 mp_limb_t d1, d0;
1052 mp_limb_t cy, cy1;
1053 mp_limb_t q;
1055 assert (dn > 2);
1056 assert (nn >= dn);
1058 d1 = dp[dn - 1];
1059 d0 = dp[dn - 2];
1061 assert ((d1 & GMP_LIMB_HIGHBIT) != 0);
1062 /* Iteration variable is the index of the q limb.
1064 * We divide <n1, np[dn-1+i], np[dn-2+i], np[dn-3+i],..., np[i]>
1065 * by <d1, d0, dp[dn-3], ..., dp[0] >
1068 i = nn - dn;
1071 mp_limb_t n0 = np[dn-1+i];
1073 if (n1 == d1 && n0 == d0)
1075 q = GMP_LIMB_MAX;
1076 mpn_submul_1 (np+i, dp, dn, q);
1077 n1 = np[dn-1+i]; /* update n1, last loop's value will now be invalid */
1079 else
1081 gmp_udiv_qr_3by2 (q, n1, n0, n1, n0, np[dn-2+i], d1, d0, dinv);
1083 cy = mpn_submul_1 (np + i, dp, dn-2, q);
1085 cy1 = n0 < cy;
1086 n0 = n0 - cy;
1087 cy = n1 < cy1;
1088 n1 = n1 - cy1;
1089 np[dn-2+i] = n0;
1091 if (cy != 0)
1093 n1 += d1 + mpn_add_n (np + i, np + i, dp, dn - 1);
1094 q--;
1098 if (qp)
1099 qp[i] = q;
1101 while (--i >= 0);
1103 np[dn - 1] = n1;
1106 static void
1107 mpn_div_qr_preinv (mp_ptr qp, mp_ptr np, mp_size_t nn,
1108 mp_srcptr dp, mp_size_t dn,
1109 const struct gmp_div_inverse *inv)
1111 assert (dn > 0);
1112 assert (nn >= dn);
1114 if (dn == 1)
1115 np[0] = mpn_div_qr_1_preinv (qp, np, nn, inv);
1116 else if (dn == 2)
1117 mpn_div_qr_2_preinv (qp, np, nn, inv);
1118 else
1120 mp_limb_t nh;
1121 unsigned shift;
1123 assert (inv->d1 == dp[dn-1]);
1124 assert (inv->d0 == dp[dn-2]);
1125 assert ((inv->d1 & GMP_LIMB_HIGHBIT) != 0);
1127 shift = inv->shift;
1128 if (shift > 0)
1129 nh = mpn_lshift (np, np, nn, shift);
1130 else
1131 nh = 0;
1133 mpn_div_qr_pi1 (qp, np, nn, nh, dp, dn, inv->di);
1135 if (shift > 0)
1136 gmp_assert_nocarry (mpn_rshift (np, np, dn, shift));
1140 static void
1141 mpn_div_qr (mp_ptr qp, mp_ptr np, mp_size_t nn, mp_srcptr dp, mp_size_t dn)
1143 struct gmp_div_inverse inv;
1144 mp_ptr tp = NULL;
1146 assert (dn > 0);
1147 assert (nn >= dn);
1149 mpn_div_qr_invert (&inv, dp, dn);
1150 if (dn > 2 && inv.shift > 0)
1152 tp = gmp_alloc_limbs (dn);
1153 gmp_assert_nocarry (mpn_lshift (tp, dp, dn, inv.shift));
1154 dp = tp;
1156 mpn_div_qr_preinv (qp, np, nn, dp, dn, &inv);
1157 if (tp)
1158 gmp_free_limbs (tp, dn);
1162 /* MPN base conversion. */
1163 static unsigned
1164 mpn_base_power_of_two_p (unsigned b)
1166 switch (b)
1168 case 2: return 1;
1169 case 4: return 2;
1170 case 8: return 3;
1171 case 16: return 4;
1172 case 32: return 5;
1173 case 64: return 6;
1174 case 128: return 7;
1175 case 256: return 8;
1176 default: return 0;
1180 struct mpn_base_info
1182 /* bb is the largest power of the base which fits in one limb, and
1183 exp is the corresponding exponent. */
1184 unsigned exp;
1185 mp_limb_t bb;
1188 static void
1189 mpn_get_base_info (struct mpn_base_info *info, mp_limb_t b)
1191 mp_limb_t m;
1192 mp_limb_t p;
1193 unsigned exp;
1195 m = GMP_LIMB_MAX / b;
1196 for (exp = 1, p = b; p <= m; exp++)
1197 p *= b;
1199 info->exp = exp;
1200 info->bb = p;
1203 static mp_bitcnt_t
1204 mpn_limb_size_in_base_2 (mp_limb_t u)
1206 unsigned shift;
1208 assert (u > 0);
1209 gmp_clz (shift, u);
1210 return GMP_LIMB_BITS - shift;
1213 static size_t
1214 mpn_get_str_bits (unsigned char *sp, unsigned bits, mp_srcptr up, mp_size_t un)
1216 unsigned char mask;
1217 size_t sn, j;
1218 mp_size_t i;
1219 unsigned shift;
1221 sn = ((un - 1) * GMP_LIMB_BITS + mpn_limb_size_in_base_2 (up[un-1])
1222 + bits - 1) / bits;
1224 mask = (1U << bits) - 1;
1226 for (i = 0, j = sn, shift = 0; j-- > 0;)
1228 unsigned char digit = up[i] >> shift;
1230 shift += bits;
1232 if (shift >= GMP_LIMB_BITS && ++i < un)
1234 shift -= GMP_LIMB_BITS;
1235 digit |= up[i] << (bits - shift);
1237 sp[j] = digit & mask;
1239 return sn;
1242 /* We generate digits from the least significant end, and reverse at
1243 the end. */
1244 static size_t
1245 mpn_limb_get_str (unsigned char *sp, mp_limb_t w,
1246 const struct gmp_div_inverse *binv)
1248 mp_size_t i;
1249 for (i = 0; w > 0; i++)
1251 mp_limb_t h, l, r;
1253 h = w >> (GMP_LIMB_BITS - binv->shift);
1254 l = w << binv->shift;
1256 gmp_udiv_qrnnd_preinv (w, r, h, l, binv->d1, binv->di);
1257 assert ((r & (GMP_LIMB_MAX >> (GMP_LIMB_BITS - binv->shift))) == 0);
1258 r >>= binv->shift;
1260 sp[i] = r;
1262 return i;
1265 static size_t
1266 mpn_get_str_other (unsigned char *sp,
1267 int base, const struct mpn_base_info *info,
1268 mp_ptr up, mp_size_t un)
1270 struct gmp_div_inverse binv;
1271 size_t sn;
1272 size_t i;
1274 mpn_div_qr_1_invert (&binv, base);
1276 sn = 0;
1278 if (un > 1)
1280 struct gmp_div_inverse bbinv;
1281 mpn_div_qr_1_invert (&bbinv, info->bb);
1285 mp_limb_t w;
1286 size_t done;
1287 w = mpn_div_qr_1_preinv (up, up, un, &bbinv);
1288 un -= (up[un-1] == 0);
1289 done = mpn_limb_get_str (sp + sn, w, &binv);
1291 for (sn += done; done < info->exp; done++)
1292 sp[sn++] = 0;
1294 while (un > 1);
1296 sn += mpn_limb_get_str (sp + sn, up[0], &binv);
1298 /* Reverse order */
1299 for (i = 0; 2*i + 1 < sn; i++)
1301 unsigned char t = sp[i];
1302 sp[i] = sp[sn - i - 1];
1303 sp[sn - i - 1] = t;
1306 return sn;
1309 size_t
1310 mpn_get_str (unsigned char *sp, int base, mp_ptr up, mp_size_t un)
1312 unsigned bits;
1314 assert (un > 0);
1315 assert (up[un-1] > 0);
1317 bits = mpn_base_power_of_two_p (base);
1318 if (bits)
1319 return mpn_get_str_bits (sp, bits, up, un);
1320 else
1322 struct mpn_base_info info;
1324 mpn_get_base_info (&info, base);
1325 return mpn_get_str_other (sp, base, &info, up, un);
1329 static mp_size_t
1330 mpn_set_str_bits (mp_ptr rp, const unsigned char *sp, size_t sn,
1331 unsigned bits)
1333 mp_size_t rn;
1334 size_t j;
1335 unsigned shift;
1337 for (j = sn, rn = 0, shift = 0; j-- > 0; )
1339 if (shift == 0)
1341 rp[rn++] = sp[j];
1342 shift += bits;
1344 else
1346 rp[rn-1] |= (mp_limb_t) sp[j] << shift;
1347 shift += bits;
1348 if (shift >= GMP_LIMB_BITS)
1350 shift -= GMP_LIMB_BITS;
1351 if (shift > 0)
1352 rp[rn++] = (mp_limb_t) sp[j] >> (bits - shift);
1356 rn = mpn_normalized_size (rp, rn);
1357 return rn;
1360 /* Result is usually normalized, except for all-zero input, in which
1361 case a single zero limb is written at *RP, and 1 is returned. */
1362 static mp_size_t
1363 mpn_set_str_other (mp_ptr rp, const unsigned char *sp, size_t sn,
1364 mp_limb_t b, const struct mpn_base_info *info)
1366 mp_size_t rn;
1367 mp_limb_t w;
1368 unsigned k;
1369 size_t j;
1371 assert (sn > 0);
1373 k = 1 + (sn - 1) % info->exp;
1375 j = 0;
1376 w = sp[j++];
1377 while (--k != 0)
1378 w = w * b + sp[j++];
1380 rp[0] = w;
1382 for (rn = 1; j < sn;)
1384 mp_limb_t cy;
1386 w = sp[j++];
1387 for (k = 1; k < info->exp; k++)
1388 w = w * b + sp[j++];
1390 cy = mpn_mul_1 (rp, rp, rn, info->bb);
1391 cy += mpn_add_1 (rp, rp, rn, w);
1392 if (cy > 0)
1393 rp[rn++] = cy;
1395 assert (j == sn);
1397 return rn;
1400 mp_size_t
1401 mpn_set_str (mp_ptr rp, const unsigned char *sp, size_t sn, int base)
1403 unsigned bits;
1405 if (sn == 0)
1406 return 0;
1408 bits = mpn_base_power_of_two_p (base);
1409 if (bits)
1410 return mpn_set_str_bits (rp, sp, sn, bits);
1411 else
1413 struct mpn_base_info info;
1415 mpn_get_base_info (&info, base);
1416 return mpn_set_str_other (rp, sp, sn, base, &info);
1421 /* MPZ interface */
1422 void
1423 mpz_init (mpz_t r)
1425 static const mp_limb_t dummy_limb = GMP_LIMB_MAX & 0xc1a0;
1427 r->_mp_alloc = 0;
1428 r->_mp_size = 0;
1429 r->_mp_d = (mp_ptr) &dummy_limb;
1432 /* The utility of this function is a bit limited, since many functions
1433 assigns the result variable using mpz_swap. */
1434 void
1435 mpz_init2 (mpz_t r, mp_bitcnt_t bits)
1437 mp_size_t rn;
1439 bits -= (bits != 0); /* Round down, except if 0 */
1440 rn = 1 + bits / GMP_LIMB_BITS;
1442 r->_mp_alloc = rn;
1443 r->_mp_size = 0;
1444 r->_mp_d = gmp_alloc_limbs (rn);
1447 void
1448 mpz_clear (mpz_t r)
1450 if (r->_mp_alloc)
1451 gmp_free_limbs (r->_mp_d, r->_mp_alloc);
1454 static mp_ptr
1455 mpz_realloc (mpz_t r, mp_size_t size)
1457 size = GMP_MAX (size, 1);
1459 if (r->_mp_alloc)
1460 r->_mp_d = gmp_realloc_limbs (r->_mp_d, r->_mp_alloc, size);
1461 else
1462 r->_mp_d = gmp_alloc_limbs (size);
1463 r->_mp_alloc = size;
1465 if (GMP_ABS (r->_mp_size) > size)
1466 r->_mp_size = 0;
1468 return r->_mp_d;
1471 /* Realloc for an mpz_t WHAT if it has less than NEEDED limbs. */
1472 #define MPZ_REALLOC(z,n) ((n) > (z)->_mp_alloc \
1473 ? mpz_realloc(z,n) \
1474 : (z)->_mp_d)
1476 /* MPZ assignment and basic conversions. */
1477 void
1478 mpz_set_si (mpz_t r, signed long int x)
1480 if (x >= 0)
1481 mpz_set_ui (r, x);
1482 else /* (x < 0) */
1483 if (GMP_LIMB_BITS < GMP_ULONG_BITS)
1485 mpz_set_ui (r, GMP_NEG_CAST (unsigned long int, x));
1486 mpz_neg (r, r);
1488 else
1490 r->_mp_size = -1;
1491 MPZ_REALLOC (r, 1)[0] = GMP_NEG_CAST (unsigned long int, x);
1495 void
1496 mpz_set_ui (mpz_t r, unsigned long int x)
1498 if (x > 0)
1500 r->_mp_size = 1;
1501 MPZ_REALLOC (r, 1)[0] = x;
1502 if (GMP_LIMB_BITS < GMP_ULONG_BITS)
1504 int LOCAL_GMP_LIMB_BITS = GMP_LIMB_BITS;
1505 while (x >>= LOCAL_GMP_LIMB_BITS)
1507 ++ r->_mp_size;
1508 MPZ_REALLOC (r, r->_mp_size)[r->_mp_size - 1] = x;
1512 else
1513 r->_mp_size = 0;
1516 void
1517 mpz_set (mpz_t r, const mpz_t x)
1519 /* Allow the NOP r == x */
1520 if (r != x)
1522 mp_size_t n;
1523 mp_ptr rp;
1525 n = GMP_ABS (x->_mp_size);
1526 rp = MPZ_REALLOC (r, n);
1528 mpn_copyi (rp, x->_mp_d, n);
1529 r->_mp_size = x->_mp_size;
1533 void
1534 mpz_init_set_si (mpz_t r, signed long int x)
1536 mpz_init (r);
1537 mpz_set_si (r, x);
1540 void
1541 mpz_init_set_ui (mpz_t r, unsigned long int x)
1543 mpz_init (r);
1544 mpz_set_ui (r, x);
1547 void
1548 mpz_init_set (mpz_t r, const mpz_t x)
1550 mpz_init (r);
1551 mpz_set (r, x);
1555 mpz_fits_slong_p (const mpz_t u)
1557 return mpz_cmp_si (u, LONG_MAX) <= 0 && mpz_cmp_si (u, LONG_MIN) >= 0;
1560 static int
1561 mpn_absfits_ulong_p (mp_srcptr up, mp_size_t un)
1563 int ulongsize = GMP_ULONG_BITS / GMP_LIMB_BITS;
1564 mp_limb_t ulongrem = 0;
1566 if (GMP_ULONG_BITS % GMP_LIMB_BITS != 0)
1567 ulongrem = (mp_limb_t) (ULONG_MAX >> GMP_LIMB_BITS * ulongsize) + 1;
1569 return un <= ulongsize || (up[ulongsize] < ulongrem && un == ulongsize + 1);
1573 mpz_fits_ulong_p (const mpz_t u)
1575 mp_size_t us = u->_mp_size;
1577 return us >= 0 && mpn_absfits_ulong_p (u->_mp_d, us);
1581 mpz_fits_sint_p (const mpz_t u)
1583 return mpz_cmp_si (u, INT_MAX) <= 0 && mpz_cmp_si (u, INT_MIN) >= 0;
1587 mpz_fits_uint_p (const mpz_t u)
1589 return u->_mp_size >= 0 && mpz_cmpabs_ui (u, UINT_MAX) <= 0;
1593 mpz_fits_sshort_p (const mpz_t u)
1595 return mpz_cmp_si (u, SHRT_MAX) <= 0 && mpz_cmp_si (u, SHRT_MIN) >= 0;
1599 mpz_fits_ushort_p (const mpz_t u)
1601 return u->_mp_size >= 0 && mpz_cmpabs_ui (u, USHRT_MAX) <= 0;
1604 long int
1605 mpz_get_si (const mpz_t u)
1607 unsigned long r = mpz_get_ui (u);
1608 unsigned long c = -LONG_MAX - LONG_MIN;
1610 if (u->_mp_size < 0)
1611 /* This expression is necessary to properly handle -LONG_MIN */
1612 return -(long) c - (long) ((r - c) & LONG_MAX);
1613 else
1614 return (long) (r & LONG_MAX);
1617 unsigned long int
1618 mpz_get_ui (const mpz_t u)
1620 if (GMP_LIMB_BITS < GMP_ULONG_BITS)
1622 int LOCAL_GMP_LIMB_BITS = GMP_LIMB_BITS;
1623 unsigned long r = 0;
1624 mp_size_t n = GMP_ABS (u->_mp_size);
1625 n = GMP_MIN (n, 1 + (mp_size_t) (GMP_ULONG_BITS - 1) / GMP_LIMB_BITS);
1626 while (--n >= 0)
1627 r = (r << LOCAL_GMP_LIMB_BITS) + u->_mp_d[n];
1628 return r;
1631 return u->_mp_size == 0 ? 0 : u->_mp_d[0];
1634 size_t
1635 mpz_size (const mpz_t u)
1637 return GMP_ABS (u->_mp_size);
1640 mp_limb_t
1641 mpz_getlimbn (const mpz_t u, mp_size_t n)
1643 if (n >= 0 && n < GMP_ABS (u->_mp_size))
1644 return u->_mp_d[n];
1645 else
1646 return 0;
1649 void
1650 mpz_realloc2 (mpz_t x, mp_bitcnt_t n)
1652 mpz_realloc (x, 1 + (n - (n != 0)) / GMP_LIMB_BITS);
1655 mp_srcptr
1656 mpz_limbs_read (mpz_srcptr x)
1658 return x->_mp_d;
1661 mp_ptr
1662 mpz_limbs_modify (mpz_t x, mp_size_t n)
1664 assert (n > 0);
1665 return MPZ_REALLOC (x, n);
1668 mp_ptr
1669 mpz_limbs_write (mpz_t x, mp_size_t n)
1671 return mpz_limbs_modify (x, n);
1674 void
1675 mpz_limbs_finish (mpz_t x, mp_size_t xs)
1677 mp_size_t xn;
1678 xn = mpn_normalized_size (x->_mp_d, GMP_ABS (xs));
1679 x->_mp_size = xs < 0 ? -xn : xn;
1682 static mpz_srcptr
1683 mpz_roinit_normal_n (mpz_t x, mp_srcptr xp, mp_size_t xs)
1685 x->_mp_alloc = 0;
1686 x->_mp_d = (mp_ptr) xp;
1687 x->_mp_size = xs;
1688 return x;
1691 mpz_srcptr
1692 mpz_roinit_n (mpz_t x, mp_srcptr xp, mp_size_t xs)
1694 mpz_roinit_normal_n (x, xp, xs);
1695 mpz_limbs_finish (x, xs);
1696 return x;
1700 /* Conversions and comparison to double. */
1701 void
1702 mpz_set_d (mpz_t r, double x)
1704 int sign;
1705 mp_ptr rp;
1706 mp_size_t rn, i;
1707 double B;
1708 double Bi;
1709 mp_limb_t f;
1711 /* x != x is true when x is a NaN, and x == x * 0.5 is true when x is
1712 zero or infinity. */
1713 if (x != x || x == x * 0.5)
1715 r->_mp_size = 0;
1716 return;
1719 sign = x < 0.0 ;
1720 if (sign)
1721 x = - x;
1723 if (x < 1.0)
1725 r->_mp_size = 0;
1726 return;
1728 B = 4.0 * (double) (GMP_LIMB_HIGHBIT >> 1);
1729 Bi = 1.0 / B;
1730 for (rn = 1; x >= B; rn++)
1731 x *= Bi;
1733 rp = MPZ_REALLOC (r, rn);
1735 f = (mp_limb_t) x;
1736 x -= f;
1737 assert (x < 1.0);
1738 i = rn-1;
1739 rp[i] = f;
1740 while (--i >= 0)
1742 x = B * x;
1743 f = (mp_limb_t) x;
1744 x -= f;
1745 assert (x < 1.0);
1746 rp[i] = f;
1749 r->_mp_size = sign ? - rn : rn;
1752 void
1753 mpz_init_set_d (mpz_t r, double x)
1755 mpz_init (r);
1756 mpz_set_d (r, x);
1759 double
1760 mpz_get_d (const mpz_t u)
1762 int m;
1763 mp_limb_t l;
1764 mp_size_t un;
1765 double x;
1766 double B = 4.0 * (double) (GMP_LIMB_HIGHBIT >> 1);
1768 un = GMP_ABS (u->_mp_size);
1770 if (un == 0)
1771 return 0.0;
1773 l = u->_mp_d[--un];
1774 gmp_clz (m, l);
1775 m = m + GMP_DBL_MANT_BITS - GMP_LIMB_BITS;
1776 if (m < 0)
1777 l &= GMP_LIMB_MAX << -m;
1779 for (x = l; --un >= 0;)
1781 x = B*x;
1782 if (m > 0) {
1783 l = u->_mp_d[un];
1784 m -= GMP_LIMB_BITS;
1785 if (m < 0)
1786 l &= GMP_LIMB_MAX << -m;
1787 x += l;
1791 if (u->_mp_size < 0)
1792 x = -x;
1794 return x;
1798 mpz_cmpabs_d (const mpz_t x, double d)
1800 mp_size_t xn;
1801 double B, Bi;
1802 mp_size_t i;
1804 xn = x->_mp_size;
1805 d = GMP_ABS (d);
1807 if (xn != 0)
1809 xn = GMP_ABS (xn);
1811 B = 4.0 * (double) (GMP_LIMB_HIGHBIT >> 1);
1812 Bi = 1.0 / B;
1814 /* Scale d so it can be compared with the top limb. */
1815 for (i = 1; i < xn; i++)
1816 d *= Bi;
1818 if (d >= B)
1819 return -1;
1821 /* Compare floor(d) to top limb, subtract and cancel when equal. */
1822 for (i = xn; i-- > 0;)
1824 mp_limb_t f, xl;
1826 f = (mp_limb_t) d;
1827 xl = x->_mp_d[i];
1828 if (xl > f)
1829 return 1;
1830 else if (xl < f)
1831 return -1;
1832 d = B * (d - f);
1835 return - (d > 0.0);
1839 mpz_cmp_d (const mpz_t x, double d)
1841 if (x->_mp_size < 0)
1843 if (d >= 0.0)
1844 return -1;
1845 else
1846 return -mpz_cmpabs_d (x, d);
1848 else
1850 if (d < 0.0)
1851 return 1;
1852 else
1853 return mpz_cmpabs_d (x, d);
1858 /* MPZ comparisons and the like. */
1860 mpz_sgn (const mpz_t u)
1862 return GMP_CMP (u->_mp_size, 0);
1866 mpz_cmp_si (const mpz_t u, long v)
1868 mp_size_t usize = u->_mp_size;
1870 if (v >= 0)
1871 return mpz_cmp_ui (u, v);
1872 else if (usize >= 0)
1873 return 1;
1874 else
1875 return - mpz_cmpabs_ui (u, GMP_NEG_CAST (unsigned long int, v));
1879 mpz_cmp_ui (const mpz_t u, unsigned long v)
1881 mp_size_t usize = u->_mp_size;
1883 if (usize < 0)
1884 return -1;
1885 else
1886 return mpz_cmpabs_ui (u, v);
1890 mpz_cmp (const mpz_t a, const mpz_t b)
1892 mp_size_t asize = a->_mp_size;
1893 mp_size_t bsize = b->_mp_size;
1895 if (asize != bsize)
1896 return (asize < bsize) ? -1 : 1;
1897 else if (asize >= 0)
1898 return mpn_cmp (a->_mp_d, b->_mp_d, asize);
1899 else
1900 return mpn_cmp (b->_mp_d, a->_mp_d, -asize);
1904 mpz_cmpabs_ui (const mpz_t u, unsigned long v)
1906 mp_size_t un = GMP_ABS (u->_mp_size);
1908 if (! mpn_absfits_ulong_p (u->_mp_d, un))
1909 return 1;
1910 else
1912 unsigned long uu = mpz_get_ui (u);
1913 return GMP_CMP(uu, v);
1918 mpz_cmpabs (const mpz_t u, const mpz_t v)
1920 return mpn_cmp4 (u->_mp_d, GMP_ABS (u->_mp_size),
1921 v->_mp_d, GMP_ABS (v->_mp_size));
1924 void
1925 mpz_abs (mpz_t r, const mpz_t u)
1927 mpz_set (r, u);
1928 r->_mp_size = GMP_ABS (r->_mp_size);
1931 void
1932 mpz_neg (mpz_t r, const mpz_t u)
1934 mpz_set (r, u);
1935 r->_mp_size = -r->_mp_size;
1938 void
1939 mpz_swap (mpz_t u, mpz_t v)
1941 MP_SIZE_T_SWAP (u->_mp_size, v->_mp_size);
1942 MP_SIZE_T_SWAP (u->_mp_alloc, v->_mp_alloc);
1943 MP_PTR_SWAP (u->_mp_d, v->_mp_d);
1947 /* MPZ addition and subtraction */
1950 void
1951 mpz_add_ui (mpz_t r, const mpz_t a, unsigned long b)
1953 mpz_t bb;
1954 mpz_init_set_ui (bb, b);
1955 mpz_add (r, a, bb);
1956 mpz_clear (bb);
1959 void
1960 mpz_sub_ui (mpz_t r, const mpz_t a, unsigned long b)
1962 mpz_ui_sub (r, b, a);
1963 mpz_neg (r, r);
1966 void
1967 mpz_ui_sub (mpz_t r, unsigned long a, const mpz_t b)
1969 mpz_neg (r, b);
1970 mpz_add_ui (r, r, a);
1973 static mp_size_t
1974 mpz_abs_add (mpz_t r, const mpz_t a, const mpz_t b)
1976 mp_size_t an = GMP_ABS (a->_mp_size);
1977 mp_size_t bn = GMP_ABS (b->_mp_size);
1978 mp_ptr rp;
1979 mp_limb_t cy;
1981 if (an < bn)
1983 MPZ_SRCPTR_SWAP (a, b);
1984 MP_SIZE_T_SWAP (an, bn);
1987 rp = MPZ_REALLOC (r, an + 1);
1988 cy = mpn_add (rp, a->_mp_d, an, b->_mp_d, bn);
1990 rp[an] = cy;
1992 return an + cy;
1995 static mp_size_t
1996 mpz_abs_sub (mpz_t r, const mpz_t a, const mpz_t b)
1998 mp_size_t an = GMP_ABS (a->_mp_size);
1999 mp_size_t bn = GMP_ABS (b->_mp_size);
2000 int cmp;
2001 mp_ptr rp;
2003 cmp = mpn_cmp4 (a->_mp_d, an, b->_mp_d, bn);
2004 if (cmp > 0)
2006 rp = MPZ_REALLOC (r, an);
2007 gmp_assert_nocarry (mpn_sub (rp, a->_mp_d, an, b->_mp_d, bn));
2008 return mpn_normalized_size (rp, an);
2010 else if (cmp < 0)
2012 rp = MPZ_REALLOC (r, bn);
2013 gmp_assert_nocarry (mpn_sub (rp, b->_mp_d, bn, a->_mp_d, an));
2014 return -mpn_normalized_size (rp, bn);
2016 else
2017 return 0;
2020 void
2021 mpz_add (mpz_t r, const mpz_t a, const mpz_t b)
2023 mp_size_t rn;
2025 if ( (a->_mp_size ^ b->_mp_size) >= 0)
2026 rn = mpz_abs_add (r, a, b);
2027 else
2028 rn = mpz_abs_sub (r, a, b);
2030 r->_mp_size = a->_mp_size >= 0 ? rn : - rn;
2033 void
2034 mpz_sub (mpz_t r, const mpz_t a, const mpz_t b)
2036 mp_size_t rn;
2038 if ( (a->_mp_size ^ b->_mp_size) >= 0)
2039 rn = mpz_abs_sub (r, a, b);
2040 else
2041 rn = mpz_abs_add (r, a, b);
2043 r->_mp_size = a->_mp_size >= 0 ? rn : - rn;
2047 /* MPZ multiplication */
2048 void
2049 mpz_mul_si (mpz_t r, const mpz_t u, long int v)
2051 if (v < 0)
2053 mpz_mul_ui (r, u, GMP_NEG_CAST (unsigned long int, v));
2054 mpz_neg (r, r);
2056 else
2057 mpz_mul_ui (r, u, v);
2060 void
2061 mpz_mul_ui (mpz_t r, const mpz_t u, unsigned long int v)
2063 mpz_t vv;
2064 mpz_init_set_ui (vv, v);
2065 mpz_mul (r, u, vv);
2066 mpz_clear (vv);
2067 return;
2070 void
2071 mpz_mul (mpz_t r, const mpz_t u, const mpz_t v)
2073 int sign;
2074 mp_size_t un, vn, rn;
2075 mpz_t t;
2076 mp_ptr tp;
2078 un = u->_mp_size;
2079 vn = v->_mp_size;
2081 if (un == 0 || vn == 0)
2083 r->_mp_size = 0;
2084 return;
2087 sign = (un ^ vn) < 0;
2089 un = GMP_ABS (un);
2090 vn = GMP_ABS (vn);
2092 mpz_init2 (t, (un + vn) * GMP_LIMB_BITS);
2094 tp = t->_mp_d;
2095 if (un >= vn)
2096 mpn_mul (tp, u->_mp_d, un, v->_mp_d, vn);
2097 else
2098 mpn_mul (tp, v->_mp_d, vn, u->_mp_d, un);
2100 rn = un + vn;
2101 rn -= tp[rn-1] == 0;
2103 t->_mp_size = sign ? - rn : rn;
2104 mpz_swap (r, t);
2105 mpz_clear (t);
2108 void
2109 mpz_mul_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t bits)
2111 mp_size_t un, rn;
2112 mp_size_t limbs;
2113 unsigned shift;
2114 mp_ptr rp;
2116 un = GMP_ABS (u->_mp_size);
2117 if (un == 0)
2119 r->_mp_size = 0;
2120 return;
2123 limbs = bits / GMP_LIMB_BITS;
2124 shift = bits % GMP_LIMB_BITS;
2126 rn = un + limbs + (shift > 0);
2127 rp = MPZ_REALLOC (r, rn);
2128 if (shift > 0)
2130 mp_limb_t cy = mpn_lshift (rp + limbs, u->_mp_d, un, shift);
2131 rp[rn-1] = cy;
2132 rn -= (cy == 0);
2134 else
2135 mpn_copyd (rp + limbs, u->_mp_d, un);
2137 mpn_zero (rp, limbs);
2139 r->_mp_size = (u->_mp_size < 0) ? - rn : rn;
2142 void
2143 mpz_addmul_ui (mpz_t r, const mpz_t u, unsigned long int v)
2145 mpz_t t;
2146 mpz_init_set_ui (t, v);
2147 mpz_mul (t, u, t);
2148 mpz_add (r, r, t);
2149 mpz_clear (t);
2152 void
2153 mpz_submul_ui (mpz_t r, const mpz_t u, unsigned long int v)
2155 mpz_t t;
2156 mpz_init_set_ui (t, v);
2157 mpz_mul (t, u, t);
2158 mpz_sub (r, r, t);
2159 mpz_clear (t);
2162 void
2163 mpz_addmul (mpz_t r, const mpz_t u, const mpz_t v)
2165 mpz_t t;
2166 mpz_init (t);
2167 mpz_mul (t, u, v);
2168 mpz_add (r, r, t);
2169 mpz_clear (t);
2172 void
2173 mpz_submul (mpz_t r, const mpz_t u, const mpz_t v)
2175 mpz_t t;
2176 mpz_init (t);
2177 mpz_mul (t, u, v);
2178 mpz_sub (r, r, t);
2179 mpz_clear (t);
2183 /* MPZ division */
2184 enum mpz_div_round_mode { GMP_DIV_FLOOR, GMP_DIV_CEIL, GMP_DIV_TRUNC };
2186 /* Allows q or r to be zero. Returns 1 iff remainder is non-zero. */
2187 static int
2188 mpz_div_qr (mpz_t q, mpz_t r,
2189 const mpz_t n, const mpz_t d, enum mpz_div_round_mode mode)
2191 mp_size_t ns, ds, nn, dn, qs;
2192 ns = n->_mp_size;
2193 ds = d->_mp_size;
2195 if (ds == 0)
2196 gmp_die("mpz_div_qr: Divide by zero.");
2198 if (ns == 0)
2200 if (q)
2201 q->_mp_size = 0;
2202 if (r)
2203 r->_mp_size = 0;
2204 return 0;
2207 nn = GMP_ABS (ns);
2208 dn = GMP_ABS (ds);
2210 qs = ds ^ ns;
2212 if (nn < dn)
2214 if (mode == GMP_DIV_CEIL && qs >= 0)
2216 /* q = 1, r = n - d */
2217 if (r)
2218 mpz_sub (r, n, d);
2219 if (q)
2220 mpz_set_ui (q, 1);
2222 else if (mode == GMP_DIV_FLOOR && qs < 0)
2224 /* q = -1, r = n + d */
2225 if (r)
2226 mpz_add (r, n, d);
2227 if (q)
2228 mpz_set_si (q, -1);
2230 else
2232 /* q = 0, r = d */
2233 if (r)
2234 mpz_set (r, n);
2235 if (q)
2236 q->_mp_size = 0;
2238 return 1;
2240 else
2242 mp_ptr np, qp;
2243 mp_size_t qn, rn;
2244 mpz_t tq, tr;
2246 mpz_init_set (tr, n);
2247 np = tr->_mp_d;
2249 qn = nn - dn + 1;
2251 if (q)
2253 mpz_init2 (tq, qn * GMP_LIMB_BITS);
2254 qp = tq->_mp_d;
2256 else
2257 qp = NULL;
2259 mpn_div_qr (qp, np, nn, d->_mp_d, dn);
2261 if (qp)
2263 qn -= (qp[qn-1] == 0);
2265 tq->_mp_size = qs < 0 ? -qn : qn;
2267 rn = mpn_normalized_size (np, dn);
2268 tr->_mp_size = ns < 0 ? - rn : rn;
2270 if (mode == GMP_DIV_FLOOR && qs < 0 && rn != 0)
2272 if (q)
2273 mpz_sub_ui (tq, tq, 1);
2274 if (r)
2275 mpz_add (tr, tr, d);
2277 else if (mode == GMP_DIV_CEIL && qs >= 0 && rn != 0)
2279 if (q)
2280 mpz_add_ui (tq, tq, 1);
2281 if (r)
2282 mpz_sub (tr, tr, d);
2285 if (q)
2287 mpz_swap (tq, q);
2288 mpz_clear (tq);
2290 if (r)
2291 mpz_swap (tr, r);
2293 mpz_clear (tr);
2295 return rn != 0;
2299 void
2300 mpz_cdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
2302 mpz_div_qr (q, r, n, d, GMP_DIV_CEIL);
2305 void
2306 mpz_fdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
2308 mpz_div_qr (q, r, n, d, GMP_DIV_FLOOR);
2311 void
2312 mpz_tdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
2314 mpz_div_qr (q, r, n, d, GMP_DIV_TRUNC);
2317 void
2318 mpz_cdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
2320 mpz_div_qr (q, NULL, n, d, GMP_DIV_CEIL);
2323 void
2324 mpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
2326 mpz_div_qr (q, NULL, n, d, GMP_DIV_FLOOR);
2329 void
2330 mpz_tdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
2332 mpz_div_qr (q, NULL, n, d, GMP_DIV_TRUNC);
2335 void
2336 mpz_cdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
2338 mpz_div_qr (NULL, r, n, d, GMP_DIV_CEIL);
2341 void
2342 mpz_fdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
2344 mpz_div_qr (NULL, r, n, d, GMP_DIV_FLOOR);
2347 void
2348 mpz_tdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
2350 mpz_div_qr (NULL, r, n, d, GMP_DIV_TRUNC);
2353 void
2354 mpz_mod (mpz_t r, const mpz_t n, const mpz_t d)
2356 mpz_div_qr (NULL, r, n, d, d->_mp_size >= 0 ? GMP_DIV_FLOOR : GMP_DIV_CEIL);
2359 static void
2360 mpz_div_q_2exp (mpz_t q, const mpz_t u, mp_bitcnt_t bit_index,
2361 enum mpz_div_round_mode mode)
2363 mp_size_t un, qn;
2364 mp_size_t limb_cnt;
2365 mp_ptr qp;
2366 int adjust;
2368 un = u->_mp_size;
2369 if (un == 0)
2371 q->_mp_size = 0;
2372 return;
2374 limb_cnt = bit_index / GMP_LIMB_BITS;
2375 qn = GMP_ABS (un) - limb_cnt;
2376 bit_index %= GMP_LIMB_BITS;
2378 if (mode == ((un > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* un != 0 here. */
2379 /* Note: Below, the final indexing at limb_cnt is valid because at
2380 that point we have qn > 0. */
2381 adjust = (qn <= 0
2382 || !mpn_zero_p (u->_mp_d, limb_cnt)
2383 || (u->_mp_d[limb_cnt]
2384 & (((mp_limb_t) 1 << bit_index) - 1)));
2385 else
2386 adjust = 0;
2388 if (qn <= 0)
2389 qn = 0;
2390 else
2392 qp = MPZ_REALLOC (q, qn);
2394 if (bit_index != 0)
2396 mpn_rshift (qp, u->_mp_d + limb_cnt, qn, bit_index);
2397 qn -= qp[qn - 1] == 0;
2399 else
2401 mpn_copyi (qp, u->_mp_d + limb_cnt, qn);
2405 q->_mp_size = qn;
2407 if (adjust)
2408 mpz_add_ui (q, q, 1);
2409 if (un < 0)
2410 mpz_neg (q, q);
2413 static void
2414 mpz_div_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t bit_index,
2415 enum mpz_div_round_mode mode)
2417 mp_size_t us, un, rn;
2418 mp_ptr rp;
2419 mp_limb_t mask;
2421 us = u->_mp_size;
2422 if (us == 0 || bit_index == 0)
2424 r->_mp_size = 0;
2425 return;
2427 rn = (bit_index + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
2428 assert (rn > 0);
2430 rp = MPZ_REALLOC (r, rn);
2431 un = GMP_ABS (us);
2433 mask = GMP_LIMB_MAX >> (rn * GMP_LIMB_BITS - bit_index);
2435 if (rn > un)
2437 /* Quotient (with truncation) is zero, and remainder is
2438 non-zero */
2439 if (mode == ((us > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* us != 0 here. */
2441 /* Have to negate and sign extend. */
2442 mp_size_t i;
2444 gmp_assert_nocarry (! mpn_neg (rp, u->_mp_d, un));
2445 for (i = un; i < rn - 1; i++)
2446 rp[i] = GMP_LIMB_MAX;
2448 rp[rn-1] = mask;
2449 us = -us;
2451 else
2453 /* Just copy */
2454 if (r != u)
2455 mpn_copyi (rp, u->_mp_d, un);
2457 rn = un;
2460 else
2462 if (r != u)
2463 mpn_copyi (rp, u->_mp_d, rn - 1);
2465 rp[rn-1] = u->_mp_d[rn-1] & mask;
2467 if (mode == ((us > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* us != 0 here. */
2469 /* If r != 0, compute 2^{bit_count} - r. */
2470 mpn_neg (rp, rp, rn);
2472 rp[rn-1] &= mask;
2474 /* us is not used for anything else, so we can modify it
2475 here to indicate flipped sign. */
2476 us = -us;
2479 rn = mpn_normalized_size (rp, rn);
2480 r->_mp_size = us < 0 ? -rn : rn;
2483 void
2484 mpz_cdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
2486 mpz_div_q_2exp (r, u, cnt, GMP_DIV_CEIL);
2489 void
2490 mpz_fdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
2492 mpz_div_q_2exp (r, u, cnt, GMP_DIV_FLOOR);
2495 void
2496 mpz_tdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
2498 mpz_div_q_2exp (r, u, cnt, GMP_DIV_TRUNC);
2501 void
2502 mpz_cdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
2504 mpz_div_r_2exp (r, u, cnt, GMP_DIV_CEIL);
2507 void
2508 mpz_fdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
2510 mpz_div_r_2exp (r, u, cnt, GMP_DIV_FLOOR);
2513 void
2514 mpz_tdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
2516 mpz_div_r_2exp (r, u, cnt, GMP_DIV_TRUNC);
2519 void
2520 mpz_divexact (mpz_t q, const mpz_t n, const mpz_t d)
2522 gmp_assert_nocarry (mpz_div_qr (q, NULL, n, d, GMP_DIV_TRUNC));
2526 mpz_divisible_p (const mpz_t n, const mpz_t d)
2528 return mpz_div_qr (NULL, NULL, n, d, GMP_DIV_TRUNC) == 0;
2532 mpz_congruent_p (const mpz_t a, const mpz_t b, const mpz_t m)
2534 mpz_t t;
2535 int res;
2537 /* a == b (mod 0) iff a == b */
2538 if (mpz_sgn (m) == 0)
2539 return (mpz_cmp (a, b) == 0);
2541 mpz_init (t);
2542 mpz_sub (t, a, b);
2543 res = mpz_divisible_p (t, m);
2544 mpz_clear (t);
2546 return res;
2549 static unsigned long
2550 mpz_div_qr_ui (mpz_t q, mpz_t r,
2551 const mpz_t n, unsigned long d, enum mpz_div_round_mode mode)
2553 unsigned long ret;
2554 mpz_t rr, dd;
2556 mpz_init (rr);
2557 mpz_init_set_ui (dd, d);
2558 mpz_div_qr (q, rr, n, dd, mode);
2559 mpz_clear (dd);
2560 ret = mpz_get_ui (rr);
2562 if (r)
2563 mpz_swap (r, rr);
2564 mpz_clear (rr);
2566 return ret;
2569 unsigned long
2570 mpz_cdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d)
2572 return mpz_div_qr_ui (q, r, n, d, GMP_DIV_CEIL);
2575 unsigned long
2576 mpz_fdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d)
2578 return mpz_div_qr_ui (q, r, n, d, GMP_DIV_FLOOR);
2581 unsigned long
2582 mpz_tdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d)
2584 return mpz_div_qr_ui (q, r, n, d, GMP_DIV_TRUNC);
2587 unsigned long
2588 mpz_cdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d)
2590 return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_CEIL);
2593 unsigned long
2594 mpz_fdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d)
2596 return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_FLOOR);
2599 unsigned long
2600 mpz_tdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d)
2602 return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_TRUNC);
2605 unsigned long
2606 mpz_cdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d)
2608 return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_CEIL);
2610 unsigned long
2611 mpz_fdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d)
2613 return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_FLOOR);
2615 unsigned long
2616 mpz_tdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d)
2618 return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_TRUNC);
2621 unsigned long
2622 mpz_cdiv_ui (const mpz_t n, unsigned long d)
2624 return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_CEIL);
2627 unsigned long
2628 mpz_fdiv_ui (const mpz_t n, unsigned long d)
2630 return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_FLOOR);
2633 unsigned long
2634 mpz_tdiv_ui (const mpz_t n, unsigned long d)
2636 return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_TRUNC);
2639 unsigned long
2640 mpz_mod_ui (mpz_t r, const mpz_t n, unsigned long d)
2642 return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_FLOOR);
2645 void
2646 mpz_divexact_ui (mpz_t q, const mpz_t n, unsigned long d)
2648 gmp_assert_nocarry (mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_TRUNC));
2652 mpz_divisible_ui_p (const mpz_t n, unsigned long d)
2654 return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_TRUNC) == 0;
2658 /* GCD */
2659 static mp_limb_t
2660 mpn_gcd_11 (mp_limb_t u, mp_limb_t v)
2662 unsigned shift;
2664 assert ( (u | v) > 0);
2666 if (u == 0)
2667 return v;
2668 else if (v == 0)
2669 return u;
2671 gmp_ctz (shift, u | v);
2673 u >>= shift;
2674 v >>= shift;
2676 if ( (u & 1) == 0)
2677 MP_LIMB_T_SWAP (u, v);
2679 while ( (v & 1) == 0)
2680 v >>= 1;
2682 while (u != v)
2684 if (u > v)
2686 u -= v;
2688 u >>= 1;
2689 while ( (u & 1) == 0);
2691 else
2693 v -= u;
2695 v >>= 1;
2696 while ( (v & 1) == 0);
2699 return u << shift;
2702 unsigned long
2703 mpz_gcd_ui (mpz_t g, const mpz_t u, unsigned long v)
2705 mpz_t t;
2706 mpz_init_set_ui(t, v);
2707 mpz_gcd (t, u, t);
2708 if (v > 0)
2709 v = mpz_get_ui (t);
2711 if (g)
2712 mpz_swap (t, g);
2714 mpz_clear (t);
2716 return v;
2719 static mp_bitcnt_t
2720 mpz_make_odd (mpz_t r)
2722 mp_bitcnt_t shift;
2724 assert (r->_mp_size > 0);
2725 /* Count trailing zeros, equivalent to mpn_scan1, because we know that there is a 1 */
2726 shift = mpn_common_scan (r->_mp_d[0], 0, r->_mp_d, 0, 0);
2727 mpz_tdiv_q_2exp (r, r, shift);
2729 return shift;
2732 void
2733 mpz_gcd (mpz_t g, const mpz_t u, const mpz_t v)
2735 mpz_t tu, tv;
2736 mp_bitcnt_t uz, vz, gz;
2738 if (u->_mp_size == 0)
2740 mpz_abs (g, v);
2741 return;
2743 if (v->_mp_size == 0)
2745 mpz_abs (g, u);
2746 return;
2749 mpz_init (tu);
2750 mpz_init (tv);
2752 mpz_abs (tu, u);
2753 uz = mpz_make_odd (tu);
2754 mpz_abs (tv, v);
2755 vz = mpz_make_odd (tv);
2756 gz = GMP_MIN (uz, vz);
2758 if (tu->_mp_size < tv->_mp_size)
2759 mpz_swap (tu, tv);
2761 mpz_tdiv_r (tu, tu, tv);
2762 if (tu->_mp_size == 0)
2764 mpz_swap (g, tv);
2766 else
2767 for (;;)
2769 int c;
2771 mpz_make_odd (tu);
2772 c = mpz_cmp (tu, tv);
2773 if (c == 0)
2775 mpz_swap (g, tu);
2776 break;
2778 if (c < 0)
2779 mpz_swap (tu, tv);
2781 if (tv->_mp_size == 1)
2783 mp_limb_t vl = tv->_mp_d[0];
2784 mp_limb_t ul = mpz_tdiv_ui (tu, vl);
2785 mpz_set_ui (g, mpn_gcd_11 (ul, vl));
2786 break;
2788 mpz_sub (tu, tu, tv);
2790 mpz_clear (tu);
2791 mpz_clear (tv);
2792 mpz_mul_2exp (g, g, gz);
2795 void
2796 mpz_gcdext (mpz_t g, mpz_t s, mpz_t t, const mpz_t u, const mpz_t v)
2798 mpz_t tu, tv, s0, s1, t0, t1;
2799 mp_bitcnt_t uz, vz, gz;
2800 mp_bitcnt_t power;
2802 if (u->_mp_size == 0)
2804 /* g = 0 u + sgn(v) v */
2805 signed long sign = mpz_sgn (v);
2806 mpz_abs (g, v);
2807 if (s)
2808 s->_mp_size = 0;
2809 if (t)
2810 mpz_set_si (t, sign);
2811 return;
2814 if (v->_mp_size == 0)
2816 /* g = sgn(u) u + 0 v */
2817 signed long sign = mpz_sgn (u);
2818 mpz_abs (g, u);
2819 if (s)
2820 mpz_set_si (s, sign);
2821 if (t)
2822 t->_mp_size = 0;
2823 return;
2826 mpz_init (tu);
2827 mpz_init (tv);
2828 mpz_init (s0);
2829 mpz_init (s1);
2830 mpz_init (t0);
2831 mpz_init (t1);
2833 mpz_abs (tu, u);
2834 uz = mpz_make_odd (tu);
2835 mpz_abs (tv, v);
2836 vz = mpz_make_odd (tv);
2837 gz = GMP_MIN (uz, vz);
2839 uz -= gz;
2840 vz -= gz;
2842 /* Cofactors corresponding to odd gcd. gz handled later. */
2843 if (tu->_mp_size < tv->_mp_size)
2845 mpz_swap (tu, tv);
2846 MPZ_SRCPTR_SWAP (u, v);
2847 MPZ_PTR_SWAP (s, t);
2848 MP_BITCNT_T_SWAP (uz, vz);
2851 /* Maintain
2853 * u = t0 tu + t1 tv
2854 * v = s0 tu + s1 tv
2856 * where u and v denote the inputs with common factors of two
2857 * eliminated, and det (s0, t0; s1, t1) = 2^p. Then
2859 * 2^p tu = s1 u - t1 v
2860 * 2^p tv = -s0 u + t0 v
2863 /* After initial division, tu = q tv + tu', we have
2865 * u = 2^uz (tu' + q tv)
2866 * v = 2^vz tv
2868 * or
2870 * t0 = 2^uz, t1 = 2^uz q
2871 * s0 = 0, s1 = 2^vz
2874 mpz_setbit (t0, uz);
2875 mpz_tdiv_qr (t1, tu, tu, tv);
2876 mpz_mul_2exp (t1, t1, uz);
2878 mpz_setbit (s1, vz);
2879 power = uz + vz;
2881 if (tu->_mp_size > 0)
2883 mp_bitcnt_t shift;
2884 shift = mpz_make_odd (tu);
2885 mpz_mul_2exp (t0, t0, shift);
2886 mpz_mul_2exp (s0, s0, shift);
2887 power += shift;
2889 for (;;)
2891 int c;
2892 c = mpz_cmp (tu, tv);
2893 if (c == 0)
2894 break;
2896 if (c < 0)
2898 /* tv = tv' + tu
2900 * u = t0 tu + t1 (tv' + tu) = (t0 + t1) tu + t1 tv'
2901 * v = s0 tu + s1 (tv' + tu) = (s0 + s1) tu + s1 tv' */
2903 mpz_sub (tv, tv, tu);
2904 mpz_add (t0, t0, t1);
2905 mpz_add (s0, s0, s1);
2907 shift = mpz_make_odd (tv);
2908 mpz_mul_2exp (t1, t1, shift);
2909 mpz_mul_2exp (s1, s1, shift);
2911 else
2913 mpz_sub (tu, tu, tv);
2914 mpz_add (t1, t0, t1);
2915 mpz_add (s1, s0, s1);
2917 shift = mpz_make_odd (tu);
2918 mpz_mul_2exp (t0, t0, shift);
2919 mpz_mul_2exp (s0, s0, shift);
2921 power += shift;
2925 /* Now tv = odd part of gcd, and -s0 and t0 are corresponding
2926 cofactors. */
2928 mpz_mul_2exp (tv, tv, gz);
2929 mpz_neg (s0, s0);
2931 /* 2^p g = s0 u + t0 v. Eliminate one factor of two at a time. To
2932 adjust cofactors, we need u / g and v / g */
2934 mpz_divexact (s1, v, tv);
2935 mpz_abs (s1, s1);
2936 mpz_divexact (t1, u, tv);
2937 mpz_abs (t1, t1);
2939 while (power-- > 0)
2941 /* s0 u + t0 v = (s0 - v/g) u - (t0 + u/g) v */
2942 if (mpz_odd_p (s0) || mpz_odd_p (t0))
2944 mpz_sub (s0, s0, s1);
2945 mpz_add (t0, t0, t1);
2947 assert (mpz_even_p (t0) && mpz_even_p (s0));
2948 mpz_tdiv_q_2exp (s0, s0, 1);
2949 mpz_tdiv_q_2exp (t0, t0, 1);
2952 /* Arrange so that |s| < |u| / 2g */
2953 mpz_add (s1, s0, s1);
2954 if (mpz_cmpabs (s0, s1) > 0)
2956 mpz_swap (s0, s1);
2957 mpz_sub (t0, t0, t1);
2959 if (u->_mp_size < 0)
2960 mpz_neg (s0, s0);
2961 if (v->_mp_size < 0)
2962 mpz_neg (t0, t0);
2964 mpz_swap (g, tv);
2965 if (s)
2966 mpz_swap (s, s0);
2967 if (t)
2968 mpz_swap (t, t0);
2970 mpz_clear (tu);
2971 mpz_clear (tv);
2972 mpz_clear (s0);
2973 mpz_clear (s1);
2974 mpz_clear (t0);
2975 mpz_clear (t1);
2978 void
2979 mpz_lcm (mpz_t r, const mpz_t u, const mpz_t v)
2981 mpz_t g;
2983 if (u->_mp_size == 0 || v->_mp_size == 0)
2985 r->_mp_size = 0;
2986 return;
2989 mpz_init (g);
2991 mpz_gcd (g, u, v);
2992 mpz_divexact (g, u, g);
2993 mpz_mul (r, g, v);
2995 mpz_clear (g);
2996 mpz_abs (r, r);
2999 void
3000 mpz_lcm_ui (mpz_t r, const mpz_t u, unsigned long v)
3002 if (v == 0 || u->_mp_size == 0)
3004 r->_mp_size = 0;
3005 return;
3008 v /= mpz_gcd_ui (NULL, u, v);
3009 mpz_mul_ui (r, u, v);
3011 mpz_abs (r, r);
3015 mpz_invert (mpz_t r, const mpz_t u, const mpz_t m)
3017 mpz_t g, tr;
3018 int invertible;
3020 if (u->_mp_size == 0 || mpz_cmpabs_ui (m, 1) <= 0)
3021 return 0;
3023 mpz_init (g);
3024 mpz_init (tr);
3026 mpz_gcdext (g, tr, NULL, u, m);
3027 invertible = (mpz_cmp_ui (g, 1) == 0);
3029 if (invertible)
3031 if (tr->_mp_size < 0)
3033 if (m->_mp_size >= 0)
3034 mpz_add (tr, tr, m);
3035 else
3036 mpz_sub (tr, tr, m);
3038 mpz_swap (r, tr);
3041 mpz_clear (g);
3042 mpz_clear (tr);
3043 return invertible;
3047 /* Higher level operations (sqrt, pow and root) */
3049 void
3050 mpz_pow_ui (mpz_t r, const mpz_t b, unsigned long e)
3052 unsigned long bit;
3053 mpz_t tr;
3054 mpz_init_set_ui (tr, 1);
3056 bit = GMP_ULONG_HIGHBIT;
3059 mpz_mul (tr, tr, tr);
3060 if (e & bit)
3061 mpz_mul (tr, tr, b);
3062 bit >>= 1;
3064 while (bit > 0);
3066 mpz_swap (r, tr);
3067 mpz_clear (tr);
3070 void
3071 mpz_ui_pow_ui (mpz_t r, unsigned long blimb, unsigned long e)
3073 mpz_t b;
3075 mpz_init_set_ui (b, blimb);
3076 mpz_pow_ui (r, b, e);
3077 mpz_clear (b);
3080 void
3081 mpz_powm (mpz_t r, const mpz_t b, const mpz_t e, const mpz_t m)
3083 mpz_t tr;
3084 mpz_t base;
3085 mp_size_t en, mn;
3086 mp_srcptr mp;
3087 struct gmp_div_inverse minv;
3088 unsigned shift;
3089 mp_ptr tp = NULL;
3091 en = GMP_ABS (e->_mp_size);
3092 mn = GMP_ABS (m->_mp_size);
3093 if (mn == 0)
3094 gmp_die ("mpz_powm: Zero modulo.");
3096 if (en == 0)
3098 mpz_set_ui (r, 1);
3099 return;
3102 mp = m->_mp_d;
3103 mpn_div_qr_invert (&minv, mp, mn);
3104 shift = minv.shift;
3106 if (shift > 0)
3108 /* To avoid shifts, we do all our reductions, except the final
3109 one, using a *normalized* m. */
3110 minv.shift = 0;
3112 tp = gmp_alloc_limbs (mn);
3113 gmp_assert_nocarry (mpn_lshift (tp, mp, mn, shift));
3114 mp = tp;
3117 mpz_init (base);
3119 if (e->_mp_size < 0)
3121 if (!mpz_invert (base, b, m))
3122 gmp_die ("mpz_powm: Negative exponent and non-invertible base.");
3124 else
3126 mp_size_t bn;
3127 mpz_abs (base, b);
3129 bn = base->_mp_size;
3130 if (bn >= mn)
3132 mpn_div_qr_preinv (NULL, base->_mp_d, base->_mp_size, mp, mn, &minv);
3133 bn = mn;
3136 /* We have reduced the absolute value. Now take care of the
3137 sign. Note that we get zero represented non-canonically as
3138 m. */
3139 if (b->_mp_size < 0)
3141 mp_ptr bp = MPZ_REALLOC (base, mn);
3142 gmp_assert_nocarry (mpn_sub (bp, mp, mn, bp, bn));
3143 bn = mn;
3145 base->_mp_size = mpn_normalized_size (base->_mp_d, bn);
3147 mpz_init_set_ui (tr, 1);
3149 while (--en >= 0)
3151 mp_limb_t w = e->_mp_d[en];
3152 mp_limb_t bit;
3154 bit = GMP_LIMB_HIGHBIT;
3157 mpz_mul (tr, tr, tr);
3158 if (w & bit)
3159 mpz_mul (tr, tr, base);
3160 if (tr->_mp_size > mn)
3162 mpn_div_qr_preinv (NULL, tr->_mp_d, tr->_mp_size, mp, mn, &minv);
3163 tr->_mp_size = mpn_normalized_size (tr->_mp_d, mn);
3165 bit >>= 1;
3167 while (bit > 0);
3170 /* Final reduction */
3171 if (tr->_mp_size >= mn)
3173 minv.shift = shift;
3174 mpn_div_qr_preinv (NULL, tr->_mp_d, tr->_mp_size, mp, mn, &minv);
3175 tr->_mp_size = mpn_normalized_size (tr->_mp_d, mn);
3177 if (tp)
3178 gmp_free_limbs (tp, mn);
3180 mpz_swap (r, tr);
3181 mpz_clear (tr);
3182 mpz_clear (base);
3185 void
3186 mpz_powm_ui (mpz_t r, const mpz_t b, unsigned long elimb, const mpz_t m)
3188 mpz_t e;
3190 mpz_init_set_ui (e, elimb);
3191 mpz_powm (r, b, e, m);
3192 mpz_clear (e);
3195 /* x=trunc(y^(1/z)), r=y-x^z */
3196 void
3197 mpz_rootrem (mpz_t x, mpz_t r, const mpz_t y, unsigned long z)
3199 int sgn;
3200 mpz_t t, u;
3202 sgn = y->_mp_size < 0;
3203 if ((~z & sgn) != 0)
3204 gmp_die ("mpz_rootrem: Negative argument, with even root.");
3205 if (z == 0)
3206 gmp_die ("mpz_rootrem: Zeroth root.");
3208 if (mpz_cmpabs_ui (y, 1) <= 0) {
3209 if (x)
3210 mpz_set (x, y);
3211 if (r)
3212 r->_mp_size = 0;
3213 return;
3216 mpz_init (u);
3217 mpz_init (t);
3218 mpz_setbit (t, mpz_sizeinbase (y, 2) / z + 1);
3220 if (z == 2) /* simplify sqrt loop: z-1 == 1 */
3221 do {
3222 mpz_swap (u, t); /* u = x */
3223 mpz_tdiv_q (t, y, u); /* t = y/x */
3224 mpz_add (t, t, u); /* t = y/x + x */
3225 mpz_tdiv_q_2exp (t, t, 1); /* x'= (y/x + x)/2 */
3226 } while (mpz_cmpabs (t, u) < 0); /* |x'| < |x| */
3227 else /* z != 2 */ {
3228 mpz_t v;
3230 mpz_init (v);
3231 if (sgn)
3232 mpz_neg (t, t);
3234 do {
3235 mpz_swap (u, t); /* u = x */
3236 mpz_pow_ui (t, u, z - 1); /* t = x^(z-1) */
3237 mpz_tdiv_q (t, y, t); /* t = y/x^(z-1) */
3238 mpz_mul_ui (v, u, z - 1); /* v = x*(z-1) */
3239 mpz_add (t, t, v); /* t = y/x^(z-1) + x*(z-1) */
3240 mpz_tdiv_q_ui (t, t, z); /* x'=(y/x^(z-1) + x*(z-1))/z */
3241 } while (mpz_cmpabs (t, u) < 0); /* |x'| < |x| */
3243 mpz_clear (v);
3246 if (r) {
3247 mpz_pow_ui (t, u, z);
3248 mpz_sub (r, y, t);
3250 if (x)
3251 mpz_swap (x, u);
3252 mpz_clear (u);
3253 mpz_clear (t);
3257 mpz_root (mpz_t x, const mpz_t y, unsigned long z)
3259 int res;
3260 mpz_t r;
3262 mpz_init (r);
3263 mpz_rootrem (x, r, y, z);
3264 res = r->_mp_size == 0;
3265 mpz_clear (r);
3267 return res;
3270 /* Compute s = floor(sqrt(u)) and r = u - s^2. Allows r == NULL */
3271 void
3272 mpz_sqrtrem (mpz_t s, mpz_t r, const mpz_t u)
3274 mpz_rootrem (s, r, u, 2);
3277 void
3278 mpz_sqrt (mpz_t s, const mpz_t u)
3280 mpz_rootrem (s, NULL, u, 2);
3284 mpz_perfect_square_p (const mpz_t u)
3286 if (u->_mp_size <= 0)
3287 return (u->_mp_size == 0);
3288 else
3289 return mpz_root (NULL, u, 2);
3293 mpn_perfect_square_p (mp_srcptr p, mp_size_t n)
3295 mpz_t t;
3297 assert (n > 0);
3298 assert (p [n-1] != 0);
3299 return mpz_root (NULL, mpz_roinit_normal_n (t, p, n), 2);
3302 mp_size_t
3303 mpn_sqrtrem (mp_ptr sp, mp_ptr rp, mp_srcptr p, mp_size_t n)
3305 mpz_t s, r, u;
3306 mp_size_t res;
3308 assert (n > 0);
3309 assert (p [n-1] != 0);
3311 mpz_init (r);
3312 mpz_init (s);
3313 mpz_rootrem (s, r, mpz_roinit_normal_n (u, p, n), 2);
3315 assert (s->_mp_size == (n+1)/2);
3316 mpn_copyd (sp, s->_mp_d, s->_mp_size);
3317 mpz_clear (s);
3318 res = r->_mp_size;
3319 if (rp)
3320 mpn_copyd (rp, r->_mp_d, res);
3321 mpz_clear (r);
3322 return res;
3325 /* Combinatorics */
3327 void
3328 mpz_mfac_uiui (mpz_t x, unsigned long n, unsigned long m)
3330 mpz_set_ui (x, n + (n == 0));
3331 if (m + 1 < 2) return;
3332 while (n > m + 1)
3333 mpz_mul_ui (x, x, n -= m);
3336 void
3337 mpz_2fac_ui (mpz_t x, unsigned long n)
3339 mpz_mfac_uiui (x, n, 2);
3342 void
3343 mpz_fac_ui (mpz_t x, unsigned long n)
3345 mpz_mfac_uiui (x, n, 1);
3348 void
3349 mpz_bin_uiui (mpz_t r, unsigned long n, unsigned long k)
3351 mpz_t t;
3353 mpz_set_ui (r, k <= n);
3355 if (k > (n >> 1))
3356 k = (k <= n) ? n - k : 0;
3358 mpz_init (t);
3359 mpz_fac_ui (t, k);
3361 for (; k > 0; --k)
3362 mpz_mul_ui (r, r, n--);
3364 mpz_divexact (r, r, t);
3365 mpz_clear (t);
3369 /* Primality testing */
3371 /* Computes Kronecker (a/b) with odd b, a!=0 and GCD(a,b) = 1 */
3372 /* Adapted from JACOBI_BASE_METHOD==4 in mpn/generic/jacbase.c */
3373 static int
3374 gmp_jacobi_coprime (mp_limb_t a, mp_limb_t b)
3376 int c, bit = 0;
3378 assert (b & 1);
3379 assert (a != 0);
3380 /* assert (mpn_gcd_11 (a, b) == 1); */
3382 /* Below, we represent a and b shifted right so that the least
3383 significant one bit is implicit. */
3384 b >>= 1;
3386 gmp_ctz(c, a);
3387 a >>= 1;
3389 for (;;)
3391 a >>= c;
3392 /* (2/b) = -1 if b = 3 or 5 mod 8 */
3393 bit ^= c & (b ^ (b >> 1));
3394 if (a < b)
3396 if (a == 0)
3397 return bit & 1 ? -1 : 1;
3398 bit ^= a & b;
3399 a = b - a;
3400 b -= a;
3402 else
3404 a -= b;
3405 assert (a != 0);
3408 gmp_ctz(c, a);
3409 ++c;
3413 static void
3414 gmp_lucas_step_k_2k (mpz_t V, mpz_t Qk, const mpz_t n)
3416 mpz_mod (Qk, Qk, n);
3417 /* V_{2k} <- V_k ^ 2 - 2Q^k */
3418 mpz_mul (V, V, V);
3419 mpz_submul_ui (V, Qk, 2);
3420 mpz_tdiv_r (V, V, n);
3421 /* Q^{2k} = (Q^k)^2 */
3422 mpz_mul (Qk, Qk, Qk);
3425 /* Computes V_k, Q^k (mod n) for the Lucas' sequence */
3426 /* with P=1, Q=Q; k = (n>>b0)|1. */
3427 /* Requires an odd n > 4; b0 > 0; -2*Q must not overflow a long */
3428 /* Returns (U_k == 0) and sets V=V_k and Qk=Q^k. */
3429 static int
3430 gmp_lucas_mod (mpz_t V, mpz_t Qk, long Q,
3431 mp_bitcnt_t b0, const mpz_t n)
3433 mp_bitcnt_t bs;
3434 mpz_t U;
3435 int res;
3437 assert (b0 > 0);
3438 assert (Q <= - (LONG_MIN / 2));
3439 assert (Q >= - (LONG_MAX / 2));
3440 assert (mpz_cmp_ui (n, 4) > 0);
3441 assert (mpz_odd_p (n));
3443 mpz_init_set_ui (U, 1); /* U1 = 1 */
3444 mpz_set_ui (V, 1); /* V1 = 1 */
3445 mpz_set_si (Qk, Q);
3447 for (bs = mpz_sizeinbase (n, 2) - 1; --bs >= b0;)
3449 /* U_{2k} <- U_k * V_k */
3450 mpz_mul (U, U, V);
3451 /* V_{2k} <- V_k ^ 2 - 2Q^k */
3452 /* Q^{2k} = (Q^k)^2 */
3453 gmp_lucas_step_k_2k (V, Qk, n);
3455 /* A step k->k+1 is performed if the bit in $n$ is 1 */
3456 /* mpz_tstbit(n,bs) or the bit is 0 in $n$ but */
3457 /* should be 1 in $n+1$ (bs == b0) */
3458 if (b0 == bs || mpz_tstbit (n, bs))
3460 /* Q^{k+1} <- Q^k * Q */
3461 mpz_mul_si (Qk, Qk, Q);
3462 /* U_{k+1} <- (U_k + V_k) / 2 */
3463 mpz_swap (U, V); /* Keep in V the old value of U_k */
3464 mpz_add (U, U, V);
3465 /* We have to compute U/2, so we need an even value, */
3466 /* equivalent (mod n) */
3467 if (mpz_odd_p (U))
3468 mpz_add (U, U, n);
3469 mpz_tdiv_q_2exp (U, U, 1);
3470 /* V_{k+1} <-(D*U_k + V_k) / 2 =
3471 U_{k+1} + (D-1)/2*U_k = U_{k+1} - 2Q*U_k */
3472 mpz_mul_si (V, V, -2*Q);
3473 mpz_add (V, U, V);
3474 mpz_tdiv_r (V, V, n);
3476 mpz_tdiv_r (U, U, n);
3479 res = U->_mp_size == 0;
3480 mpz_clear (U);
3481 return res;
3484 /* Performs strong Lucas' test on x, with parameters suggested */
3485 /* for the BPSW test. Qk is only passed to recycle a variable. */
3486 /* Requires GCD (x,6) = 1.*/
3487 static int
3488 gmp_stronglucas (const mpz_t x, mpz_t Qk)
3490 mp_bitcnt_t b0;
3491 mpz_t V, n;
3492 mp_limb_t maxD, D; /* The absolute value is stored. */
3493 long Q;
3494 mp_limb_t tl;
3496 /* Test on the absolute value. */
3497 mpz_roinit_normal_n (n, x->_mp_d, GMP_ABS (x->_mp_size));
3499 assert (mpz_odd_p (n));
3500 /* assert (mpz_gcd_ui (NULL, n, 6) == 1); */
3501 if (mpz_root (Qk, n, 2))
3502 return 0; /* A square is composite. */
3504 /* Check Ds up to square root (in case, n is prime)
3505 or avoid overflows */
3506 maxD = (Qk->_mp_size == 1) ? Qk->_mp_d [0] - 1 : GMP_LIMB_MAX;
3508 D = 3;
3509 /* Search a D such that (D/n) = -1 in the sequence 5,-7,9,-11,.. */
3510 /* For those Ds we have (D/n) = (n/|D|) */
3513 if (D >= maxD)
3514 return 1 + (D != GMP_LIMB_MAX); /* (1 + ! ~ D) */
3515 D += 2;
3516 tl = mpz_tdiv_ui (n, D);
3517 if (tl == 0)
3518 return 0;
3520 while (gmp_jacobi_coprime (tl, D) == 1);
3522 mpz_init (V);
3524 /* n-(D/n) = n+1 = d*2^{b0}, with d = (n>>b0) | 1 */
3525 b0 = mpz_scan0 (n, 0);
3527 /* D= P^2 - 4Q; P = 1; Q = (1-D)/4 */
3528 Q = (D & 2) ? (long) (D >> 2) + 1 : -(long) (D >> 2);
3530 if (! gmp_lucas_mod (V, Qk, Q, b0, n)) /* If Ud != 0 */
3531 while (V->_mp_size != 0 && --b0 != 0) /* while Vk != 0 */
3532 /* V <- V ^ 2 - 2Q^k */
3533 /* Q^{2k} = (Q^k)^2 */
3534 gmp_lucas_step_k_2k (V, Qk, n);
3536 mpz_clear (V);
3537 return (b0 != 0);
3540 static int
3541 gmp_millerrabin (const mpz_t n, const mpz_t nm1, mpz_t y,
3542 const mpz_t q, mp_bitcnt_t k)
3544 assert (k > 0);
3546 /* Caller must initialize y to the base. */
3547 mpz_powm (y, y, q, n);
3549 if (mpz_cmp_ui (y, 1) == 0 || mpz_cmp (y, nm1) == 0)
3550 return 1;
3552 while (--k > 0)
3554 mpz_powm_ui (y, y, 2, n);
3555 if (mpz_cmp (y, nm1) == 0)
3556 return 1;
3557 /* y == 1 means that the previous y was a non-trivial square root
3558 of 1 (mod n). y == 0 means that n is a power of the base.
3559 In either case, n is not prime. */
3560 if (mpz_cmp_ui (y, 1) <= 0)
3561 return 0;
3563 return 0;
3566 /* This product is 0xc0cfd797, and fits in 32 bits. */
3567 #define GMP_PRIME_PRODUCT \
3568 (3UL*5UL*7UL*11UL*13UL*17UL*19UL*23UL*29UL)
3570 /* Bit (p+1)/2 is set, for each odd prime <= 61 */
3571 #define GMP_PRIME_MASK 0xc96996dcUL
3574 mpz_probab_prime_p (const mpz_t n, int reps)
3576 mpz_t nm1;
3577 mpz_t q;
3578 mpz_t y;
3579 mp_bitcnt_t k;
3580 int is_prime;
3581 int j;
3583 /* Note that we use the absolute value of n only, for compatibility
3584 with the real GMP. */
3585 if (mpz_even_p (n))
3586 return (mpz_cmpabs_ui (n, 2) == 0) ? 2 : 0;
3588 /* Above test excludes n == 0 */
3589 assert (n->_mp_size != 0);
3591 if (mpz_cmpabs_ui (n, 64) < 0)
3592 return (GMP_PRIME_MASK >> (n->_mp_d[0] >> 1)) & 2;
3594 if (mpz_gcd_ui (NULL, n, GMP_PRIME_PRODUCT) != 1)
3595 return 0;
3597 /* All prime factors are >= 31. */
3598 if (mpz_cmpabs_ui (n, 31*31) < 0)
3599 return 2;
3601 mpz_init (nm1);
3602 mpz_init (q);
3604 /* Find q and k, where q is odd and n = 1 + 2**k * q. */
3605 mpz_abs (nm1, n);
3606 nm1->_mp_d[0] -= 1;
3607 k = mpz_scan1 (nm1, 0);
3608 mpz_tdiv_q_2exp (q, nm1, k);
3610 /* BPSW test */
3611 mpz_init_set_ui (y, 2);
3612 is_prime = gmp_millerrabin (n, nm1, y, q, k) && gmp_stronglucas (n, y);
3613 reps -= 24; /* skip the first 24 repetitions */
3615 /* Use Miller-Rabin, with a deterministic sequence of bases, a[j] =
3616 j^2 + j + 41 using Euler's polynomial. We potentially stop early,
3617 if a[j] >= n - 1. Since n >= 31*31, this can happen only if reps >
3618 30 (a[30] == 971 > 31*31 == 961). */
3620 for (j = 0; is_prime & (j < reps); j++)
3622 mpz_set_ui (y, (unsigned long) j*j+j+41);
3623 if (mpz_cmp (y, nm1) >= 0)
3625 /* Don't try any further bases. This "early" break does not affect
3626 the result for any reasonable reps value (<=5000 was tested) */
3627 assert (j >= 30);
3628 break;
3630 is_prime = gmp_millerrabin (n, nm1, y, q, k);
3632 mpz_clear (nm1);
3633 mpz_clear (q);
3634 mpz_clear (y);
3636 return is_prime;
3640 /* Logical operations and bit manipulation. */
3642 /* Numbers are treated as if represented in two's complement (and
3643 infinitely sign extended). For a negative values we get the two's
3644 complement from -x = ~x + 1, where ~ is bitwise complement.
3645 Negation transforms
3647 xxxx10...0
3649 into
3651 yyyy10...0
3653 where yyyy is the bitwise complement of xxxx. So least significant
3654 bits, up to and including the first one bit, are unchanged, and
3655 the more significant bits are all complemented.
3657 To change a bit from zero to one in a negative number, subtract the
3658 corresponding power of two from the absolute value. This can never
3659 underflow. To change a bit from one to zero, add the corresponding
3660 power of two, and this might overflow. E.g., if x = -001111, the
3661 two's complement is 110001. Clearing the least significant bit, we
3662 get two's complement 110000, and -010000. */
3665 mpz_tstbit (const mpz_t d, mp_bitcnt_t bit_index)
3667 mp_size_t limb_index;
3668 unsigned shift;
3669 mp_size_t ds;
3670 mp_size_t dn;
3671 mp_limb_t w;
3672 int bit;
3674 ds = d->_mp_size;
3675 dn = GMP_ABS (ds);
3676 limb_index = bit_index / GMP_LIMB_BITS;
3677 if (limb_index >= dn)
3678 return ds < 0;
3680 shift = bit_index % GMP_LIMB_BITS;
3681 w = d->_mp_d[limb_index];
3682 bit = (w >> shift) & 1;
3684 if (ds < 0)
3686 /* d < 0. Check if any of the bits below is set: If so, our bit
3687 must be complemented. */
3688 if (shift > 0 && (mp_limb_t) (w << (GMP_LIMB_BITS - shift)) > 0)
3689 return bit ^ 1;
3690 while (--limb_index >= 0)
3691 if (d->_mp_d[limb_index] > 0)
3692 return bit ^ 1;
3694 return bit;
3697 static void
3698 mpz_abs_add_bit (mpz_t d, mp_bitcnt_t bit_index)
3700 mp_size_t dn, limb_index;
3701 mp_limb_t bit;
3702 mp_ptr dp;
3704 dn = GMP_ABS (d->_mp_size);
3706 limb_index = bit_index / GMP_LIMB_BITS;
3707 bit = (mp_limb_t) 1 << (bit_index % GMP_LIMB_BITS);
3709 if (limb_index >= dn)
3711 mp_size_t i;
3712 /* The bit should be set outside of the end of the number.
3713 We have to increase the size of the number. */
3714 dp = MPZ_REALLOC (d, limb_index + 1);
3716 dp[limb_index] = bit;
3717 for (i = dn; i < limb_index; i++)
3718 dp[i] = 0;
3719 dn = limb_index + 1;
3721 else
3723 mp_limb_t cy;
3725 dp = d->_mp_d;
3727 cy = mpn_add_1 (dp + limb_index, dp + limb_index, dn - limb_index, bit);
3728 if (cy > 0)
3730 dp = MPZ_REALLOC (d, dn + 1);
3731 dp[dn++] = cy;
3735 d->_mp_size = (d->_mp_size < 0) ? - dn : dn;
3738 static void
3739 mpz_abs_sub_bit (mpz_t d, mp_bitcnt_t bit_index)
3741 mp_size_t dn, limb_index;
3742 mp_ptr dp;
3743 mp_limb_t bit;
3745 dn = GMP_ABS (d->_mp_size);
3746 dp = d->_mp_d;
3748 limb_index = bit_index / GMP_LIMB_BITS;
3749 bit = (mp_limb_t) 1 << (bit_index % GMP_LIMB_BITS);
3751 assert (limb_index < dn);
3753 gmp_assert_nocarry (mpn_sub_1 (dp + limb_index, dp + limb_index,
3754 dn - limb_index, bit));
3755 dn = mpn_normalized_size (dp, dn);
3756 d->_mp_size = (d->_mp_size < 0) ? - dn : dn;
3759 void
3760 mpz_setbit (mpz_t d, mp_bitcnt_t bit_index)
3762 if (!mpz_tstbit (d, bit_index))
3764 if (d->_mp_size >= 0)
3765 mpz_abs_add_bit (d, bit_index);
3766 else
3767 mpz_abs_sub_bit (d, bit_index);
3771 void
3772 mpz_clrbit (mpz_t d, mp_bitcnt_t bit_index)
3774 if (mpz_tstbit (d, bit_index))
3776 if (d->_mp_size >= 0)
3777 mpz_abs_sub_bit (d, bit_index);
3778 else
3779 mpz_abs_add_bit (d, bit_index);
3783 void
3784 mpz_combit (mpz_t d, mp_bitcnt_t bit_index)
3786 if (mpz_tstbit (d, bit_index) ^ (d->_mp_size < 0))
3787 mpz_abs_sub_bit (d, bit_index);
3788 else
3789 mpz_abs_add_bit (d, bit_index);
3792 void
3793 mpz_com (mpz_t r, const mpz_t u)
3795 mpz_add_ui (r, u, 1);
3796 mpz_neg (r, r);
3799 void
3800 mpz_and (mpz_t r, const mpz_t u, const mpz_t v)
3802 mp_size_t un, vn, rn, i;
3803 mp_ptr up, vp, rp;
3805 mp_limb_t ux, vx, rx;
3806 mp_limb_t uc, vc, rc;
3807 mp_limb_t ul, vl, rl;
3809 un = GMP_ABS (u->_mp_size);
3810 vn = GMP_ABS (v->_mp_size);
3811 if (un < vn)
3813 MPZ_SRCPTR_SWAP (u, v);
3814 MP_SIZE_T_SWAP (un, vn);
3816 if (vn == 0)
3818 r->_mp_size = 0;
3819 return;
3822 uc = u->_mp_size < 0;
3823 vc = v->_mp_size < 0;
3824 rc = uc & vc;
3826 ux = -uc;
3827 vx = -vc;
3828 rx = -rc;
3830 /* If the smaller input is positive, higher limbs don't matter. */
3831 rn = vx ? un : vn;
3833 rp = MPZ_REALLOC (r, rn + (mp_size_t) rc);
3835 up = u->_mp_d;
3836 vp = v->_mp_d;
3838 i = 0;
3841 ul = (up[i] ^ ux) + uc;
3842 uc = ul < uc;
3844 vl = (vp[i] ^ vx) + vc;
3845 vc = vl < vc;
3847 rl = ( (ul & vl) ^ rx) + rc;
3848 rc = rl < rc;
3849 rp[i] = rl;
3851 while (++i < vn);
3852 assert (vc == 0);
3854 for (; i < rn; i++)
3856 ul = (up[i] ^ ux) + uc;
3857 uc = ul < uc;
3859 rl = ( (ul & vx) ^ rx) + rc;
3860 rc = rl < rc;
3861 rp[i] = rl;
3863 if (rc)
3864 rp[rn++] = rc;
3865 else
3866 rn = mpn_normalized_size (rp, rn);
3868 r->_mp_size = rx ? -rn : rn;
3871 void
3872 mpz_ior (mpz_t r, const mpz_t u, const mpz_t v)
3874 mp_size_t un, vn, rn, i;
3875 mp_ptr up, vp, rp;
3877 mp_limb_t ux, vx, rx;
3878 mp_limb_t uc, vc, rc;
3879 mp_limb_t ul, vl, rl;
3881 un = GMP_ABS (u->_mp_size);
3882 vn = GMP_ABS (v->_mp_size);
3883 if (un < vn)
3885 MPZ_SRCPTR_SWAP (u, v);
3886 MP_SIZE_T_SWAP (un, vn);
3888 if (vn == 0)
3890 mpz_set (r, u);
3891 return;
3894 uc = u->_mp_size < 0;
3895 vc = v->_mp_size < 0;
3896 rc = uc | vc;
3898 ux = -uc;
3899 vx = -vc;
3900 rx = -rc;
3902 /* If the smaller input is negative, by sign extension higher limbs
3903 don't matter. */
3904 rn = vx ? vn : un;
3906 rp = MPZ_REALLOC (r, rn + (mp_size_t) rc);
3908 up = u->_mp_d;
3909 vp = v->_mp_d;
3911 i = 0;
3914 ul = (up[i] ^ ux) + uc;
3915 uc = ul < uc;
3917 vl = (vp[i] ^ vx) + vc;
3918 vc = vl < vc;
3920 rl = ( (ul | vl) ^ rx) + rc;
3921 rc = rl < rc;
3922 rp[i] = rl;
3924 while (++i < vn);
3925 assert (vc == 0);
3927 for (; i < rn; i++)
3929 ul = (up[i] ^ ux) + uc;
3930 uc = ul < uc;
3932 rl = ( (ul | vx) ^ rx) + rc;
3933 rc = rl < rc;
3934 rp[i] = rl;
3936 if (rc)
3937 rp[rn++] = rc;
3938 else
3939 rn = mpn_normalized_size (rp, rn);
3941 r->_mp_size = rx ? -rn : rn;
3944 void
3945 mpz_xor (mpz_t r, const mpz_t u, const mpz_t v)
3947 mp_size_t un, vn, i;
3948 mp_ptr up, vp, rp;
3950 mp_limb_t ux, vx, rx;
3951 mp_limb_t uc, vc, rc;
3952 mp_limb_t ul, vl, rl;
3954 un = GMP_ABS (u->_mp_size);
3955 vn = GMP_ABS (v->_mp_size);
3956 if (un < vn)
3958 MPZ_SRCPTR_SWAP (u, v);
3959 MP_SIZE_T_SWAP (un, vn);
3961 if (vn == 0)
3963 mpz_set (r, u);
3964 return;
3967 uc = u->_mp_size < 0;
3968 vc = v->_mp_size < 0;
3969 rc = uc ^ vc;
3971 ux = -uc;
3972 vx = -vc;
3973 rx = -rc;
3975 rp = MPZ_REALLOC (r, un + (mp_size_t) rc);
3977 up = u->_mp_d;
3978 vp = v->_mp_d;
3980 i = 0;
3983 ul = (up[i] ^ ux) + uc;
3984 uc = ul < uc;
3986 vl = (vp[i] ^ vx) + vc;
3987 vc = vl < vc;
3989 rl = (ul ^ vl ^ rx) + rc;
3990 rc = rl < rc;
3991 rp[i] = rl;
3993 while (++i < vn);
3994 assert (vc == 0);
3996 for (; i < un; i++)
3998 ul = (up[i] ^ ux) + uc;
3999 uc = ul < uc;
4001 rl = (ul ^ ux) + rc;
4002 rc = rl < rc;
4003 rp[i] = rl;
4005 if (rc)
4006 rp[un++] = rc;
4007 else
4008 un = mpn_normalized_size (rp, un);
4010 r->_mp_size = rx ? -un : un;
4013 static unsigned
4014 gmp_popcount_limb (mp_limb_t x)
4016 unsigned c;
4018 /* Do 16 bits at a time, to avoid limb-sized constants. */
4019 int LOCAL_SHIFT_BITS = 16;
4020 for (c = 0; x > 0;)
4022 unsigned w = x - ((x >> 1) & 0x5555);
4023 w = ((w >> 2) & 0x3333) + (w & 0x3333);
4024 w = (w >> 4) + w;
4025 w = ((w >> 8) & 0x000f) + (w & 0x000f);
4026 c += w;
4027 if (GMP_LIMB_BITS > LOCAL_SHIFT_BITS)
4028 x >>= LOCAL_SHIFT_BITS;
4029 else
4030 x = 0;
4032 return c;
4035 mp_bitcnt_t
4036 mpn_popcount (mp_srcptr p, mp_size_t n)
4038 mp_size_t i;
4039 mp_bitcnt_t c;
4041 for (c = 0, i = 0; i < n; i++)
4042 c += gmp_popcount_limb (p[i]);
4044 return c;
4047 mp_bitcnt_t
4048 mpz_popcount (const mpz_t u)
4050 mp_size_t un;
4052 un = u->_mp_size;
4054 if (un < 0)
4055 return ~(mp_bitcnt_t) 0;
4057 return mpn_popcount (u->_mp_d, un);
4060 mp_bitcnt_t
4061 mpz_hamdist (const mpz_t u, const mpz_t v)
4063 mp_size_t un, vn, i;
4064 mp_limb_t uc, vc, ul, vl, comp;
4065 mp_srcptr up, vp;
4066 mp_bitcnt_t c;
4068 un = u->_mp_size;
4069 vn = v->_mp_size;
4071 if ( (un ^ vn) < 0)
4072 return ~(mp_bitcnt_t) 0;
4074 comp = - (uc = vc = (un < 0));
4075 if (uc)
4077 assert (vn < 0);
4078 un = -un;
4079 vn = -vn;
4082 up = u->_mp_d;
4083 vp = v->_mp_d;
4085 if (un < vn)
4086 MPN_SRCPTR_SWAP (up, un, vp, vn);
4088 for (i = 0, c = 0; i < vn; i++)
4090 ul = (up[i] ^ comp) + uc;
4091 uc = ul < uc;
4093 vl = (vp[i] ^ comp) + vc;
4094 vc = vl < vc;
4096 c += gmp_popcount_limb (ul ^ vl);
4098 assert (vc == 0);
4100 for (; i < un; i++)
4102 ul = (up[i] ^ comp) + uc;
4103 uc = ul < uc;
4105 c += gmp_popcount_limb (ul ^ comp);
4108 return c;
4111 mp_bitcnt_t
4112 mpz_scan1 (const mpz_t u, mp_bitcnt_t starting_bit)
4114 mp_ptr up;
4115 mp_size_t us, un, i;
4116 mp_limb_t limb, ux;
4118 us = u->_mp_size;
4119 un = GMP_ABS (us);
4120 i = starting_bit / GMP_LIMB_BITS;
4122 /* Past the end there's no 1 bits for u>=0, or an immediate 1 bit
4123 for u<0. Notice this test picks up any u==0 too. */
4124 if (i >= un)
4125 return (us >= 0 ? ~(mp_bitcnt_t) 0 : starting_bit);
4127 up = u->_mp_d;
4128 ux = 0;
4129 limb = up[i];
4131 if (starting_bit != 0)
4133 if (us < 0)
4135 ux = mpn_zero_p (up, i);
4136 limb = ~ limb + ux;
4137 ux = - (mp_limb_t) (limb >= ux);
4140 /* Mask to 0 all bits before starting_bit, thus ignoring them. */
4141 limb &= GMP_LIMB_MAX << (starting_bit % GMP_LIMB_BITS);
4144 return mpn_common_scan (limb, i, up, un, ux);
4147 mp_bitcnt_t
4148 mpz_scan0 (const mpz_t u, mp_bitcnt_t starting_bit)
4150 mp_ptr up;
4151 mp_size_t us, un, i;
4152 mp_limb_t limb, ux;
4154 us = u->_mp_size;
4155 ux = - (mp_limb_t) (us >= 0);
4156 un = GMP_ABS (us);
4157 i = starting_bit / GMP_LIMB_BITS;
4159 /* When past end, there's an immediate 0 bit for u>=0, or no 0 bits for
4160 u<0. Notice this test picks up all cases of u==0 too. */
4161 if (i >= un)
4162 return (ux ? starting_bit : ~(mp_bitcnt_t) 0);
4164 up = u->_mp_d;
4165 limb = up[i] ^ ux;
4167 if (ux == 0)
4168 limb -= mpn_zero_p (up, i); /* limb = ~(~limb + zero_p) */
4170 /* Mask all bits before starting_bit, thus ignoring them. */
4171 limb &= GMP_LIMB_MAX << (starting_bit % GMP_LIMB_BITS);
4173 return mpn_common_scan (limb, i, up, un, ux);
4177 /* MPZ base conversion. */
4179 size_t
4180 mpz_sizeinbase (const mpz_t u, int base)
4182 mp_size_t un, tn;
4183 mp_srcptr up;
4184 mp_ptr tp;
4185 mp_bitcnt_t bits;
4186 struct gmp_div_inverse bi;
4187 size_t ndigits;
4189 assert (base >= 2);
4190 assert (base <= 62);
4192 un = GMP_ABS (u->_mp_size);
4193 if (un == 0)
4194 return 1;
4196 up = u->_mp_d;
4198 bits = (un - 1) * GMP_LIMB_BITS + mpn_limb_size_in_base_2 (up[un-1]);
4199 switch (base)
4201 case 2:
4202 return bits;
4203 case 4:
4204 return (bits + 1) / 2;
4205 case 8:
4206 return (bits + 2) / 3;
4207 case 16:
4208 return (bits + 3) / 4;
4209 case 32:
4210 return (bits + 4) / 5;
4211 /* FIXME: Do something more clever for the common case of base
4212 10. */
4215 tp = gmp_alloc_limbs (un);
4216 mpn_copyi (tp, up, un);
4217 mpn_div_qr_1_invert (&bi, base);
4219 tn = un;
4220 ndigits = 0;
4223 ndigits++;
4224 mpn_div_qr_1_preinv (tp, tp, tn, &bi);
4225 tn -= (tp[tn-1] == 0);
4227 while (tn > 0);
4229 gmp_free_limbs (tp, un);
4230 return ndigits;
4233 char *
4234 mpz_get_str (char *sp, int base, const mpz_t u)
4236 unsigned bits;
4237 const char *digits;
4238 mp_size_t un;
4239 size_t i, sn, osn;
4241 digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
4242 if (base > 1)
4244 if (base <= 36)
4245 digits = "0123456789abcdefghijklmnopqrstuvwxyz";
4246 else if (base > 62)
4247 return NULL;
4249 else if (base >= -1)
4250 base = 10;
4251 else
4253 base = -base;
4254 if (base > 36)
4255 return NULL;
4258 sn = 1 + mpz_sizeinbase (u, base);
4259 if (!sp)
4261 osn = 1 + sn;
4262 sp = (char *) gmp_alloc (osn);
4264 else
4265 osn = 0;
4266 un = GMP_ABS (u->_mp_size);
4268 if (un == 0)
4270 sp[0] = '0';
4271 sn = 1;
4272 goto ret;
4275 i = 0;
4277 if (u->_mp_size < 0)
4278 sp[i++] = '-';
4280 bits = mpn_base_power_of_two_p (base);
4282 if (bits)
4283 /* Not modified in this case. */
4284 sn = i + mpn_get_str_bits ((unsigned char *) sp + i, bits, u->_mp_d, un);
4285 else
4287 struct mpn_base_info info;
4288 mp_ptr tp;
4290 mpn_get_base_info (&info, base);
4291 tp = gmp_alloc_limbs (un);
4292 mpn_copyi (tp, u->_mp_d, un);
4294 sn = i + mpn_get_str_other ((unsigned char *) sp + i, base, &info, tp, un);
4295 gmp_free_limbs (tp, un);
4298 for (; i < sn; i++)
4299 sp[i] = digits[(unsigned char) sp[i]];
4301 ret:
4302 sp[sn] = '\0';
4303 if (osn && osn != sn + 1)
4304 sp = gmp_realloc(sp, osn, sn + 1);
4305 return sp;
4309 mpz_set_str (mpz_t r, const char *sp, int base)
4311 unsigned bits, value_of_a;
4312 mp_size_t rn, alloc;
4313 mp_ptr rp;
4314 size_t dn, sn;
4315 int sign;
4316 unsigned char *dp;
4318 assert (base == 0 || (base >= 2 && base <= 62));
4320 while (isspace( (unsigned char) *sp))
4321 sp++;
4323 sign = (*sp == '-');
4324 sp += sign;
4326 if (base == 0)
4328 if (sp[0] == '0')
4330 if (sp[1] == 'x' || sp[1] == 'X')
4332 base = 16;
4333 sp += 2;
4335 else if (sp[1] == 'b' || sp[1] == 'B')
4337 base = 2;
4338 sp += 2;
4340 else
4341 base = 8;
4343 else
4344 base = 10;
4347 if (!*sp)
4349 r->_mp_size = 0;
4350 return -1;
4352 sn = strlen(sp);
4353 dp = (unsigned char *) gmp_alloc (sn);
4355 value_of_a = (base > 36) ? 36 : 10;
4356 for (dn = 0; *sp; sp++)
4358 unsigned digit;
4360 if (isspace ((unsigned char) *sp))
4361 continue;
4362 else if (*sp >= '0' && *sp <= '9')
4363 digit = *sp - '0';
4364 else if (*sp >= 'a' && *sp <= 'z')
4365 digit = *sp - 'a' + value_of_a;
4366 else if (*sp >= 'A' && *sp <= 'Z')
4367 digit = *sp - 'A' + 10;
4368 else
4369 digit = base; /* fail */
4371 if (digit >= (unsigned) base)
4373 gmp_free (dp, sn);
4374 r->_mp_size = 0;
4375 return -1;
4378 dp[dn++] = digit;
4381 if (!dn)
4383 gmp_free (dp, sn);
4384 r->_mp_size = 0;
4385 return -1;
4387 bits = mpn_base_power_of_two_p (base);
4389 if (bits > 0)
4391 alloc = (dn * bits + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
4392 rp = MPZ_REALLOC (r, alloc);
4393 rn = mpn_set_str_bits (rp, dp, dn, bits);
4395 else
4397 struct mpn_base_info info;
4398 mpn_get_base_info (&info, base);
4399 alloc = (dn + info.exp - 1) / info.exp;
4400 rp = MPZ_REALLOC (r, alloc);
4401 rn = mpn_set_str_other (rp, dp, dn, base, &info);
4402 /* Normalization, needed for all-zero input. */
4403 assert (rn > 0);
4404 rn -= rp[rn-1] == 0;
4406 assert (rn <= alloc);
4407 gmp_free (dp, sn);
4409 r->_mp_size = sign ? - rn : rn;
4411 return 0;
4415 mpz_init_set_str (mpz_t r, const char *sp, int base)
4417 mpz_init (r);
4418 return mpz_set_str (r, sp, base);
4421 size_t
4422 mpz_out_str (FILE *stream, int base, const mpz_t x)
4424 char *str;
4425 size_t len, n;
4427 str = mpz_get_str (NULL, base, x);
4428 len = strlen (str);
4429 n = fwrite (str, 1, len, stream);
4430 gmp_free (str, len + 1);
4431 return n;
4435 static int
4436 gmp_detect_endian (void)
4438 static const int i = 2;
4439 const unsigned char *p = (const unsigned char *) &i;
4440 return 1 - *p;
4443 /* Import and export. Does not support nails. */
4444 void
4445 mpz_import (mpz_t r, size_t count, int order, size_t size, int endian,
4446 size_t nails, const void *src)
4448 const unsigned char *p;
4449 ptrdiff_t word_step;
4450 mp_ptr rp;
4451 mp_size_t rn;
4453 /* The current (partial) limb. */
4454 mp_limb_t limb;
4455 /* The number of bytes already copied to this limb (starting from
4456 the low end). */
4457 size_t bytes;
4458 /* The index where the limb should be stored, when completed. */
4459 mp_size_t i;
4461 if (nails != 0)
4462 gmp_die ("mpz_import: Nails not supported.");
4464 assert (order == 1 || order == -1);
4465 assert (endian >= -1 && endian <= 1);
4467 if (endian == 0)
4468 endian = gmp_detect_endian ();
4470 p = (unsigned char *) src;
4472 word_step = (order != endian) ? 2 * size : 0;
4474 /* Process bytes from the least significant end, so point p at the
4475 least significant word. */
4476 if (order == 1)
4478 p += size * (count - 1);
4479 word_step = - word_step;
4482 /* And at least significant byte of that word. */
4483 if (endian == 1)
4484 p += (size - 1);
4486 rn = (size * count + sizeof(mp_limb_t) - 1) / sizeof(mp_limb_t);
4487 rp = MPZ_REALLOC (r, rn);
4489 for (limb = 0, bytes = 0, i = 0; count > 0; count--, p += word_step)
4491 size_t j;
4492 for (j = 0; j < size; j++, p -= (ptrdiff_t) endian)
4494 limb |= (mp_limb_t) *p << (bytes++ * CHAR_BIT);
4495 if (bytes == sizeof(mp_limb_t))
4497 rp[i++] = limb;
4498 bytes = 0;
4499 limb = 0;
4503 assert (i + (bytes > 0) == rn);
4504 if (limb != 0)
4505 rp[i++] = limb;
4506 else
4507 i = mpn_normalized_size (rp, i);
4509 r->_mp_size = i;
4512 void *
4513 mpz_export (void *r, size_t *countp, int order, size_t size, int endian,
4514 size_t nails, const mpz_t u)
4516 size_t count;
4517 mp_size_t un;
4519 if (nails != 0)
4520 gmp_die ("mpz_import: Nails not supported.");
4522 assert (order == 1 || order == -1);
4523 assert (endian >= -1 && endian <= 1);
4524 assert (size > 0 || u->_mp_size == 0);
4526 un = u->_mp_size;
4527 count = 0;
4528 if (un != 0)
4530 size_t k;
4531 unsigned char *p;
4532 ptrdiff_t word_step;
4533 /* The current (partial) limb. */
4534 mp_limb_t limb;
4535 /* The number of bytes left to do in this limb. */
4536 size_t bytes;
4537 /* The index where the limb was read. */
4538 mp_size_t i;
4540 un = GMP_ABS (un);
4542 /* Count bytes in top limb. */
4543 limb = u->_mp_d[un-1];
4544 assert (limb != 0);
4546 k = (GMP_LIMB_BITS <= CHAR_BIT);
4547 if (!k)
4549 do {
4550 int LOCAL_CHAR_BIT = CHAR_BIT;
4551 k++; limb >>= LOCAL_CHAR_BIT;
4552 } while (limb != 0);
4554 /* else limb = 0; */
4556 count = (k + (un-1) * sizeof (mp_limb_t) + size - 1) / size;
4558 if (!r)
4559 r = gmp_alloc (count * size);
4561 if (endian == 0)
4562 endian = gmp_detect_endian ();
4564 p = (unsigned char *) r;
4566 word_step = (order != endian) ? 2 * size : 0;
4568 /* Process bytes from the least significant end, so point p at the
4569 least significant word. */
4570 if (order == 1)
4572 p += size * (count - 1);
4573 word_step = - word_step;
4576 /* And at least significant byte of that word. */
4577 if (endian == 1)
4578 p += (size - 1);
4580 for (bytes = 0, i = 0, k = 0; k < count; k++, p += word_step)
4582 size_t j;
4583 for (j = 0; j < size; ++j, p -= (ptrdiff_t) endian)
4585 if (sizeof (mp_limb_t) == 1)
4587 if (i < un)
4588 *p = u->_mp_d[i++];
4589 else
4590 *p = 0;
4592 else
4594 int LOCAL_CHAR_BIT = CHAR_BIT;
4595 if (bytes == 0)
4597 if (i < un)
4598 limb = u->_mp_d[i++];
4599 bytes = sizeof (mp_limb_t);
4601 *p = limb;
4602 limb >>= LOCAL_CHAR_BIT;
4603 bytes--;
4607 assert (i == un);
4608 assert (k == count);
4611 if (countp)
4612 *countp = count;
4614 return r;