@@ -0,0 +1,4120 @@
1+/* mini-gmp, a minimalistic implementation of a GNU GMP subset.
3+ Contributed to the GNU project by Niels Möller
5+Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
6+2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7+Free Software Foundation, Inc.
9+This file is part of the GNU MP Library.
11+The GNU MP Library is free software; you can redistribute it and/or modify
12+it under the terms of the GNU Lesser General Public License as published by
13+the Free Software Foundation; either version 3 of the License, or (at your
14+option) any later version.
16+The GNU MP Library is distributed in the hope that it will be useful, but
17+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18+or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
19+License for more details.
21+You should have received a copy of the GNU Lesser General Public License
22+along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
24+/* NOTE: All functions in this file which are not declared in
25+ mini-gmp.h are internal, and are not intended to be compatible
26+ neither with GMP nor with future versions of mini-gmp. */
28+/* Much of the material copied from GMP files, including: gmp-impl.h,
29+ longlong.h, mpn/generic/add_n.c, mpn/generic/addmul_1.c,
30+ mpn/generic/lshift.c, mpn/generic/mul_1.c,
31+ mpn/generic/mul_basecase.c, mpn/generic/rshift.c,
32+ mpn/generic/sbpi1_div_qr.c, mpn/generic/sub_n.c,
33+ mpn/generic/submul_1.c. */
46+#define GMP_LIMB_BITS (sizeof(mp_limb_t) * CHAR_BIT)
48+#define GMP_LIMB_MAX (~ (mp_limb_t) 0)
49+#define GMP_LIMB_HIGHBIT ((mp_limb_t) 1 << (GMP_LIMB_BITS - 1))
51+#define GMP_HLIMB_BIT ((mp_limb_t) 1 << (GMP_LIMB_BITS / 2))
52+#define GMP_LLIMB_MASK (GMP_HLIMB_BIT - 1)
54+#define GMP_ULONG_BITS (sizeof(unsigned long) * CHAR_BIT)
55+#define GMP_ULONG_HIGHBIT ((unsigned long) 1 << (GMP_ULONG_BITS - 1))
57+#define GMP_ABS(x) ((x) >= 0 ? (x) : -(x))
58+#define GMP_NEG_CAST(T,x) (-((T)((x) + 1) - 1))
60+#define GMP_MIN(a, b) ((a) < (b) ? (a) : (b))
61+#define GMP_MAX(a, b) ((a) > (b) ? (a) : (b))
63+#define gmp_assert_nocarry(x) do { \
64+ mp_limb_t __cy = x; \
65+ assert (__cy == 0); \
68+#define gmp_clz(count, x) do { \
69+ mp_limb_t __clz_x = (x); \
72+ (__clz_x & ((mp_limb_t) 0xff << (GMP_LIMB_BITS - 8))) == 0; \
75+ for (; (__clz_x & GMP_LIMB_HIGHBIT) == 0; __clz_c++) \
80+#define gmp_ctz(count, x) do { \
81+ mp_limb_t __ctz_x = (x); \
82+ unsigned __ctz_c = 0; \
83+ gmp_clz (__ctz_c, __ctz_x & - __ctz_x); \
84+ (count) = GMP_LIMB_BITS - 1 - __ctz_c; \
87+#define gmp_add_ssaaaa(sh, sl, ah, al, bh, bl) \
91+ (sh) = (ah) + (bh) + (__x < (al)); \
95+#define gmp_sub_ddmmss(sh, sl, ah, al, bh, bl) \
99+ (sh) = (ah) - (bh) - ((al) < (bl)); \
103+#define gmp_umul_ppmm(w1, w0, u, v) \
105+ mp_limb_t __x0, __x1, __x2, __x3; \
106+ unsigned __ul, __vl, __uh, __vh; \
107+ mp_limb_t __u = (u), __v = (v); \
109+ __ul = __u & GMP_LLIMB_MASK; \
110+ __uh = __u >> (GMP_LIMB_BITS / 2); \
111+ __vl = __v & GMP_LLIMB_MASK; \
112+ __vh = __v >> (GMP_LIMB_BITS / 2); \
114+ __x0 = (mp_limb_t) __ul * __vl; \
115+ __x1 = (mp_limb_t) __ul * __vh; \
116+ __x2 = (mp_limb_t) __uh * __vl; \
117+ __x3 = (mp_limb_t) __uh * __vh; \
119+ __x1 += __x0 >> (GMP_LIMB_BITS / 2);/* this can't give carry */ \
120+ __x1 += __x2; /* but this indeed can */ \
121+ if (__x1 < __x2) /* did we get it? */ \
122+ __x3 += GMP_HLIMB_BIT; /* yes, add it in the proper pos. */ \
124+ (w1) = __x3 + (__x1 >> (GMP_LIMB_BITS / 2)); \
125+ (w0) = (__x1 << (GMP_LIMB_BITS / 2)) + (__x0 & GMP_LLIMB_MASK); \
128+#define gmp_udiv_qrnnd_preinv(q, r, nh, nl, d, di) \
130+ mp_limb_t _qh, _ql, _r, _mask; \
131+ gmp_umul_ppmm (_qh, _ql, (nh), (di)); \
132+ gmp_add_ssaaaa (_qh, _ql, _qh, _ql, (nh) + 1, (nl)); \
133+ _r = (nl) - _qh * (d); \
134+ _mask = -(mp_limb_t) (_r > _ql); /* both > and >= are OK */ \
136+ _r += _mask & (d); \
147+#define gmp_udiv_qr_3by2(q, r1, r0, n2, n1, n0, d1, d0, dinv) \
149+ mp_limb_t _q0, _t1, _t0, _mask; \
150+ gmp_umul_ppmm ((q), _q0, (n2), (dinv)); \
151+ gmp_add_ssaaaa ((q), _q0, (q), _q0, (n2), (n1)); \
153+ /* Compute the two most significant limbs of n - q'd */ \
154+ (r1) = (n1) - (d1) * (q); \
155+ gmp_sub_ddmmss ((r1), (r0), (r1), (n0), (d1), (d0)); \
156+ gmp_umul_ppmm (_t1, _t0, (d0), (q)); \
157+ gmp_sub_ddmmss ((r1), (r0), (r1), (r0), _t1, _t0); \
160+ /* Conditionally adjust q and the remainders */ \
161+ _mask = - (mp_limb_t) ((r1) >= _q0); \
163+ gmp_add_ssaaaa ((r1), (r0), (r1), (r0), _mask & (d1), _mask & (d0)); \
166+ if ((r1) > (d1) || (r0) >= (d0)) \
169+ gmp_sub_ddmmss ((r1), (r0), (r1), (r0), (d1), (d0)); \
175+#define MP_LIMB_T_SWAP(x, y) \
177+ mp_limb_t __mp_limb_t_swap__tmp = (x); \
179+ (y) = __mp_limb_t_swap__tmp; \
181+#define MP_SIZE_T_SWAP(x, y) \
183+ mp_size_t __mp_size_t_swap__tmp = (x); \
185+ (y) = __mp_size_t_swap__tmp; \
187+#define MP_BITCNT_T_SWAP(x,y) \
189+ mp_bitcnt_t __mp_bitcnt_t_swap__tmp = (x); \
191+ (y) = __mp_bitcnt_t_swap__tmp; \
193+#define MP_PTR_SWAP(x, y) \
195+ mp_ptr __mp_ptr_swap__tmp = (x); \
197+ (y) = __mp_ptr_swap__tmp; \
199+#define MP_SRCPTR_SWAP(x, y) \
201+ mp_srcptr __mp_srcptr_swap__tmp = (x); \
203+ (y) = __mp_srcptr_swap__tmp; \
206+#define MPN_PTR_SWAP(xp,xs, yp,ys) \
208+ MP_PTR_SWAP (xp, yp); \
209+ MP_SIZE_T_SWAP (xs, ys); \
211+#define MPN_SRCPTR_SWAP(xp,xs, yp,ys) \
213+ MP_SRCPTR_SWAP (xp, yp); \
214+ MP_SIZE_T_SWAP (xs, ys); \
217+#define MPZ_PTR_SWAP(x, y) \
219+ mpz_ptr __mpz_ptr_swap__tmp = (x); \
221+ (y) = __mpz_ptr_swap__tmp; \
223+#define MPZ_SRCPTR_SWAP(x, y) \
225+ mpz_srcptr __mpz_srcptr_swap__tmp = (x); \
227+ (y) = __mpz_srcptr_swap__tmp; \
231+/* Memory allocation and other helper functions. */
233+gmp_die (const char *msg)
235+ fprintf (stderr, "%s\n", msg);
240+gmp_default_alloc (size_t size)
248+ gmp_die("gmp_default_alloc: Virtual memory exhausted.");
254+gmp_default_realloc (void *old, size_t old_size, size_t new_size)
258+ p = realloc (old, new_size);
261+ gmp_die("gmp_default_realoc: Virtual memory exhausted.");
267+gmp_default_free (void *p, size_t size)
272+static void * (*gmp_allocate_func) (size_t) = gmp_default_alloc;
273+static void * (*gmp_reallocate_func) (void *, size_t, size_t) = gmp_default_realloc;
274+static void (*gmp_free_func) (void *, size_t) = gmp_default_free;
277+mp_get_memory_functions (void *(**alloc_func) (size_t),
278+ void *(**realloc_func) (void *, size_t, size_t),
279+ void (**free_func) (void *, size_t))
282+ *alloc_func = gmp_allocate_func;
285+ *realloc_func = gmp_reallocate_func;
288+ *free_func = gmp_free_func;
292+mp_set_memory_functions (void *(*alloc_func) (size_t),
293+ void *(*realloc_func) (void *, size_t, size_t),
294+ void (*free_func) (void *, size_t))
297+ alloc_func = gmp_default_alloc;
299+ realloc_func = gmp_default_realloc;
301+ free_func = gmp_default_free;
303+ gmp_allocate_func = alloc_func;
304+ gmp_reallocate_func = realloc_func;
305+ gmp_free_func = free_func;
308+#define gmp_xalloc(size) ((*gmp_allocate_func)((size)))
309+#define gmp_free(p) ((*gmp_free_func) ((p), 0))
312+gmp_xalloc_limbs (mp_size_t size)
314+ return gmp_xalloc (size * sizeof (mp_limb_t));
318+gmp_xrealloc_limbs (mp_ptr old, mp_size_t size)
321+ return (*gmp_reallocate_func) (old, 0, size * sizeof (mp_limb_t));
328+mpn_copyi (mp_ptr d, mp_srcptr s, mp_size_t n)
331+ for (i = 0; i < n; i++)
336+mpn_copyd (mp_ptr d, mp_srcptr s, mp_size_t n)
343+mpn_cmp (mp_srcptr ap, mp_srcptr bp, mp_size_t n)
348+ return ap[n] > bp[n] ? 1 : -1;
354+mpn_cmp4 (mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
357+ return an < bn ? -1 : 1;
359+ return mpn_cmp (ap, bp, an);
363+mpn_normalized_size (mp_srcptr xp, mp_size_t n)
365+ for (; n > 0 && xp[n-1] == 0; n--)
370+#define mpn_zero_p(xp, n) (mpn_normalized_size ((xp), (n)) == 0)
373+mpn_add_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
381+ mp_limb_t r = ap[i] + b;
392+mpn_add_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
397+ for (i = 0, cy = 0; i < n; i++)
400+ a = ap[i]; b = bp[i];
411+mpn_add (mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
417+ cy = mpn_add_n (rp, ap, bp, bn);
419+ cy = mpn_add_1 (rp + bn, ap + bn, an - bn, cy);
424+mpn_sub_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
433+ mp_limb_t a = ap[i];
435+ mp_limb_t cy = a < b;;
445+mpn_sub_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
450+ for (i = 0, cy = 0; i < n; i++)
453+ a = ap[i]; b = bp[i];
463+mpn_sub (mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
469+ cy = mpn_sub_n (rp, ap, bp, bn);
471+ cy = mpn_sub_1 (rp + bn, ap + bn, an - bn, cy);
476+mpn_mul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
478+ mp_limb_t ul, cl, hpl, lpl;
486+ gmp_umul_ppmm (hpl, lpl, ul, vl);
489+ cl = (lpl < cl) + hpl;
499+mpn_addmul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
501+ mp_limb_t ul, cl, hpl, lpl, rl;
509+ gmp_umul_ppmm (hpl, lpl, ul, vl);
512+ cl = (lpl < cl) + hpl;
525+mpn_submul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
527+ mp_limb_t ul, cl, hpl, lpl, rl;
535+ gmp_umul_ppmm (hpl, lpl, ul, vl);
538+ cl = (lpl < cl) + hpl;
551+mpn_mul (mp_ptr rp, mp_srcptr up, mp_size_t un, mp_srcptr vp, mp_size_t vn)
556+ /* We first multiply by the low order limb. This result can be
557+ stored, not added, to rp. We also avoid a loop for zeroing this
560+ rp[un] = mpn_mul_1 (rp, up, un, vp[0]);
561+ rp += 1, vp += 1, vn -= 1;
563+ /* Now accumulate the product of up[] and the next higher limb from
568+ rp[un] = mpn_addmul_1 (rp, up, un, vp[0]);
569+ rp += 1, vp += 1, vn -= 1;
575+mpn_mul_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
577+ mpn_mul (rp, ap, n, bp, n);
581+mpn_sqr (mp_ptr rp, mp_srcptr ap, mp_size_t n)
583+ mpn_mul (rp, ap, n, ap, n);
587+mpn_lshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
589+ mp_limb_t high_limb, low_limb;
596+ assert (cnt < GMP_LIMB_BITS);
601+ tnc = GMP_LIMB_BITS - cnt;
603+ retval = low_limb >> tnc;
604+ high_limb = (low_limb << cnt);
606+ for (i = n; --i != 0;)
609+ *--rp = high_limb | (low_limb >> tnc);
610+ high_limb = (low_limb << cnt);
618+mpn_rshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
620+ mp_limb_t high_limb, low_limb;
627+ assert (cnt < GMP_LIMB_BITS);
629+ tnc = GMP_LIMB_BITS - cnt;
631+ retval = (high_limb << tnc);
632+ low_limb = high_limb >> cnt;
634+ for (i = n; --i != 0;)
637+ *rp++ = low_limb | (high_limb << tnc);
638+ low_limb = high_limb >> cnt;
646+mpn_common_scan (mp_limb_t limb, mp_size_t i, mp_srcptr up, mp_size_t un,
651+ assert (ux == 0 || ux == GMP_LIMB_MAX);
652+ assert (0 <= i && i <= un );
658+ return (ux == 0 ? ~(mp_bitcnt_t) 0 : un * GMP_LIMB_BITS);
661+ gmp_ctz (cnt, limb);
662+ return (mp_bitcnt_t) i * GMP_LIMB_BITS + cnt;
666+mpn_scan1 (mp_srcptr ptr, mp_bitcnt_t bit)
669+ i = bit / GMP_LIMB_BITS;
671+ return mpn_common_scan ( ptr[i] & (GMP_LIMB_MAX << (bit % GMP_LIMB_BITS)),
676+mpn_scan0 (mp_srcptr ptr, mp_bitcnt_t bit)
679+ i = bit / GMP_LIMB_BITS;
681+ return mpn_common_scan (~ptr[i] & (GMP_LIMB_MAX << (bit % GMP_LIMB_BITS)),
682+ i, ptr, i, GMP_LIMB_MAX);
686+/* MPN division interface. */
688+mpn_invert_3by2 (mp_limb_t u1, mp_limb_t u0)
694+ /* First, do a 2/1 inverse. */
695+ /* The inverse m is defined as floor( (B^2 - 1 - u1)/u1 ), so that 0 <
696+ * B^2 - (B + m) u1 <= u1 */
697+ assert (u1 >= GMP_LIMB_HIGHBIT);
699+ ul = u1 & GMP_LLIMB_MASK;
700+ uh = u1 >> (GMP_LIMB_BITS / 2);
703+ r = ((~u1 - (mp_limb_t) qh * uh) << (GMP_LIMB_BITS / 2)) | GMP_LLIMB_MASK;
705+ p = (mp_limb_t) qh * ul;
706+ /* Adjustment steps taken from udiv_qrnnd_c */
711+ if (r >= u1) /* i.e. we didn't get carry when adding to r */
720+ /* Do a 3/2 division (with half limb size) */
721+ p = (r >> (GMP_LIMB_BITS / 2)) * qh + r;
722+ ql = (p >> (GMP_LIMB_BITS / 2)) + 1;
724+ /* By the 3/2 method, we don't need the high half limb. */
725+ r = (r << (GMP_LIMB_BITS / 2)) + GMP_LLIMB_MASK - ql * u1;
727+ if (r >= (p << (GMP_LIMB_BITS / 2)))
732+ m = ((mp_limb_t) qh << (GMP_LIMB_BITS / 2)) + ql;
754+ gmp_umul_ppmm (th, tl, u0, m);
759+ m -= ((r > u1) | ((r == u1) & (tl > u0)));
766+struct gmp_div_inverse
768+ /* Normalization shift count. */
770+ /* Normalized divisor (d0 unused for mpn_div_qr_1) */
772+ /* Inverse, for 2/1 or 3/2. */
777+mpn_div_qr_1_invert (struct gmp_div_inverse *inv, mp_limb_t d)
784+ inv->d1 = d << shift;
785+ inv->di = mpn_invert_limb (inv->d1);
789+mpn_div_qr_2_invert (struct gmp_div_inverse *inv,
790+ mp_limb_t d1, mp_limb_t d0)
795+ gmp_clz (shift, d1);
799+ d1 = (d1 << shift) | (d0 >> (GMP_LIMB_BITS - shift));
804+ inv->di = mpn_invert_3by2 (d1, d0);
808+mpn_div_qr_invert (struct gmp_div_inverse *inv,
809+ mp_srcptr dp, mp_size_t dn)
814+ mpn_div_qr_1_invert (inv, dp[0]);
816+ mpn_div_qr_2_invert (inv, dp[1], dp[0]);
825+ gmp_clz (shift, d1);
829+ d1 = (d1 << shift) | (d0 >> (GMP_LIMB_BITS - shift));
830+ d0 = (d0 << shift) | (dp[dn-3] >> (GMP_LIMB_BITS - shift));
834+ inv->di = mpn_invert_3by2 (d1, d0);
838+/* Not matching current public gmp interface, rather corresponding to
839+ the sbpi1_div_* functions. */
841+mpn_div_qr_1_preinv (mp_ptr qp, mp_srcptr np, mp_size_t nn,
842+ const struct gmp_div_inverse *inv)
850+ tp = gmp_xalloc_limbs (nn);
851+ r = mpn_lshift (tp, np, nn, inv->shift);
863+ gmp_udiv_qrnnd_preinv (q, r, r, np[nn], d, di);
870+ return r >> inv->shift;
874+mpn_div_qr_1 (mp_ptr qp, mp_srcptr np, mp_size_t nn, mp_limb_t d)
878+ /* Special case for powers of two. */
879+ if ((d & (d-1)) == 0)
881+ mp_limb_t r = np[0] & (d-1);
885+ mpn_copyi (qp, np, nn);
890+ mpn_rshift (qp, np, nn, shift);
897+ struct gmp_div_inverse inv;
898+ mpn_div_qr_1_invert (&inv, d);
899+ return mpn_div_qr_1_preinv (qp, np, nn, &inv);
904+mpn_div_qr_2_preinv (mp_ptr qp, mp_ptr rp, mp_srcptr np, mp_size_t nn,
905+ const struct gmp_div_inverse *inv)
909+ mp_limb_t d1, d0, di, r1, r0;
920+ tp = gmp_xalloc_limbs (nn);
921+ r1 = mpn_lshift (tp, np, nn, shift);
934+ gmp_udiv_qr_3by2 (q, r1, r0, r1, r0, n0, d1, d0, di);
943+ assert ((r0 << (GMP_LIMB_BITS - shift)) == 0);
944+ r0 = (r0 >> shift) | (r1 << (GMP_LIMB_BITS - shift));
956+mpn_div_qr_2 (mp_ptr qp, mp_ptr rp, mp_srcptr np, mp_size_t nn,
957+ mp_limb_t d1, mp_limb_t d0)
959+ struct gmp_div_inverse inv;
962+ mpn_div_qr_2_invert (&inv, d1, d0);
963+ mpn_div_qr_2_preinv (qp, rp, np, nn, &inv);
968+mpn_div_qr_pi1 (mp_ptr qp,
969+ mp_ptr np, mp_size_t nn, mp_limb_t n1,
970+ mp_srcptr dp, mp_size_t dn,
985+ assert ((d1 & GMP_LIMB_HIGHBIT) != 0);
986+ /* Iteration variable is the index of the q limb.
988+ * We divide <n1, np[dn-1+i], np[dn-2+i], np[dn-3+i],..., np[i]>
989+ * by <d1, d0, dp[dn-3], ..., dp[0] >
995+ mp_limb_t n0 = np[dn-1+i];
997+ if (n1 == d1 && n0 == d0)
1000+ mpn_submul_1 (np+i, dp, dn, q);
1001+ n1 = np[dn-1+i]; /* update n1, last loop's value will now be invalid */
1005+ gmp_udiv_qr_3by2 (q, n1, n0, n1, n0, np[dn-2+i], d1, d0, dinv);
1007+ cy = mpn_submul_1 (np + i, dp, dn-2, q);
1017+ n1 += d1 + mpn_add_n (np + i, np + i, dp, dn - 1);
1031+mpn_div_qr_preinv (mp_ptr qp, mp_ptr np, mp_size_t nn,
1032+ mp_srcptr dp, mp_size_t dn,
1033+ const struct gmp_div_inverse *inv)
1039+ np[0] = mpn_div_qr_1_preinv (qp, np, nn, inv);
1041+ mpn_div_qr_2_preinv (qp, np, np, nn, inv);
1047+ assert (inv->d1 == dp[dn-1]);
1048+ assert (inv->d0 == dp[dn-2]);
1049+ assert ((inv->d1 & GMP_LIMB_HIGHBIT) != 0);
1051+ shift = inv->shift;
1053+ nh = mpn_lshift (np, np, nn, shift);
1057+ mpn_div_qr_pi1 (qp, np, nn, nh, dp, dn, inv->di);
1060+ gmp_assert_nocarry (mpn_rshift (np, np, dn, shift));
1065+mpn_div_qr (mp_ptr qp, mp_ptr np, mp_size_t nn, mp_srcptr dp, mp_size_t dn)
1067+ struct gmp_div_inverse inv;
1073+ mpn_div_qr_invert (&inv, dp, dn);
1074+ if (dn > 2 && inv.shift > 0)
1076+ tp = gmp_xalloc_limbs (dn);
1077+ gmp_assert_nocarry (mpn_lshift (tp, dp, dn, inv.shift));
1080+ mpn_div_qr_preinv (qp, np, nn, dp, dn, &inv);
1086+/* MPN base conversion. */
1088+mpn_base_power_of_two_p (unsigned b)
1098+ case 128: return 7;
1099+ case 256: return 8;
1104+struct mpn_base_info
1106+ /* bb is the largest power of the base which fits in one limb, and
1107+ exp is the corresponding exponent. */
1113+mpn_get_base_info (struct mpn_base_info *info, mp_limb_t b)
1119+ m = GMP_LIMB_MAX / b;
1120+ for (exp = 1, p = b; p <= m; exp++)
1128+mpn_limb_size_in_base_2 (mp_limb_t u)
1133+ gmp_clz (shift, u);
1134+ return GMP_LIMB_BITS - shift;
1138+mpn_get_str_bits (unsigned char *sp, unsigned bits, mp_srcptr up, mp_size_t un)
1140+ unsigned char mask;
1145+ sn = ((un - 1) * GMP_LIMB_BITS + mpn_limb_size_in_base_2 (up[un-1])
1146+ + bits - 1) / bits;
1148+ mask = (1U << bits) - 1;
1150+ for (i = 0, j = sn, shift = 0; j-- > 0;)
1152+ unsigned char digit = up[i] >> shift;
1156+ if (shift >= GMP_LIMB_BITS && ++i < un)
1158+ shift -= GMP_LIMB_BITS;
1159+ digit |= up[i] << (bits - shift);
1161+ sp[j] = digit & mask;
1166+/* We generate digits from the least significant end, and reverse at
1169+mpn_limb_get_str (unsigned char *sp, mp_limb_t w,
1170+ const struct gmp_div_inverse *binv)
1173+ for (i = 0; w > 0; i++)
1177+ h = w >> (GMP_LIMB_BITS - binv->shift);
1178+ l = w << binv->shift;
1180+ gmp_udiv_qrnnd_preinv (w, r, h, l, binv->d1, binv->di);
1181+ assert ( (r << (GMP_LIMB_BITS - binv->shift)) == 0);
1190+mpn_get_str_other (unsigned char *sp,
1191+ int base, const struct mpn_base_info *info,
1192+ mp_ptr up, mp_size_t un)
1194+ struct gmp_div_inverse binv;
1198+ mpn_div_qr_1_invert (&binv, base);
1204+ struct gmp_div_inverse bbinv;
1205+ mpn_div_qr_1_invert (&bbinv, info->bb);
1211+ w = mpn_div_qr_1_preinv (up, up, un, &bbinv);
1212+ un -= (up[un-1] == 0);
1213+ done = mpn_limb_get_str (sp + sn, w, &binv);
1215+ for (sn += done; done < info->exp; done++)
1220+ sn += mpn_limb_get_str (sp + sn, up[0], &binv);
1222+ /* Reverse order */
1223+ for (i = 0; 2*i + 1 < sn; i++)
1225+ unsigned char t = sp[i];
1226+ sp[i] = sp[sn - i - 1];
1227+ sp[sn - i - 1] = t;
1234+mpn_get_str (unsigned char *sp, int base, mp_ptr up, mp_size_t un)
1239+ assert (up[un-1] > 0);
1241+ bits = mpn_base_power_of_two_p (base);
1243+ return mpn_get_str_bits (sp, bits, up, un);
1246+ struct mpn_base_info info;
1248+ mpn_get_base_info (&info, base);
1249+ return mpn_get_str_other (sp, base, &info, up, un);
1254+mpn_set_str_bits (mp_ptr rp, const unsigned char *sp, size_t sn,
1261+ for (j = sn, rn = 0, shift = 0; j-- > 0; )
1270+ rp[rn-1] |= (mp_limb_t) sp[j] << shift;
1272+ if (shift >= GMP_LIMB_BITS)
1274+ shift -= GMP_LIMB_BITS;
1276+ rp[rn++] = (mp_limb_t) sp[j] >> (bits - shift);
1280+ rn = mpn_normalized_size (rp, rn);
1285+mpn_set_str_other (mp_ptr rp, const unsigned char *sp, size_t sn,
1286+ mp_limb_t b, const struct mpn_base_info *info)
1293+ k = 1 + (sn - 1) % info->exp;
1298+ w = w * b + sp[j++];
1302+ for (rn = (w > 0); j < sn;)
1307+ for (k = 1; k < info->exp; k++)
1308+ w = w * b + sp[j++];
1310+ cy = mpn_mul_1 (rp, rp, rn, info->bb);
1311+ cy += mpn_add_1 (rp, rp, rn, w);
1321+mpn_set_str (mp_ptr rp, const unsigned char *sp, size_t sn, int base)
1328+ bits = mpn_base_power_of_two_p (base);
1330+ return mpn_set_str_bits (rp, sp, sn, bits);
1333+ struct mpn_base_info info;
1335+ mpn_get_base_info (&info, base);
1336+ return mpn_set_str_other (rp, sp, sn, base, &info);
1347+ r->_mp_d = gmp_xalloc_limbs (1);
1350+/* The utility of this function is a bit limited, since many functions
1351+ assigns the result variable using mpz_swap. */
1353+mpz_init2 (mpz_t r, mp_bitcnt_t bits)
1357+ bits -= (bits != 0); /* Round down, except if 0 */
1358+ rn = 1 + bits / GMP_LIMB_BITS;
1362+ r->_mp_d = gmp_xalloc_limbs (rn);
1368+ gmp_free (r->_mp_d);
1372+mpz_realloc (mpz_t r, mp_size_t size)
1374+ size = GMP_MAX (size, 1);
1376+ r->_mp_d = gmp_xrealloc_limbs (r->_mp_d, size);
1377+ r->_mp_alloc = size;
1379+ if (GMP_ABS (r->_mp_size) > size)
1385+/* Realloc for an mpz_t WHAT if it has less than NEEDED limbs. */
1386+#define MPZ_REALLOC(z,n) ((n) > (z)->_mp_alloc \
1387+ ? mpz_realloc(z,n) \
1390+/* MPZ assignment and basic conversions. */
1392+mpz_set_si (mpz_t r, signed long int x)
1399+ r->_mp_d[0] = GMP_NEG_CAST (unsigned long int, x);
1404+mpz_set_ui (mpz_t r, unsigned long int x)
1416+mpz_set (mpz_t r, const mpz_t x)
1418+ /* Allow the NOP r == x */
1424+ n = GMP_ABS (x->_mp_size);
1425+ rp = MPZ_REALLOC (r, n);
1427+ mpn_copyi (rp, x->_mp_d, n);
1428+ r->_mp_size = x->_mp_size;
1433+mpz_init_set_si (mpz_t r, signed long int x)
1440+mpz_init_set_ui (mpz_t r, unsigned long int x)
1447+mpz_init_set (mpz_t r, const mpz_t x)
1454+mpz_fits_slong_p (const mpz_t u)
1456+ mp_size_t us = u->_mp_size;
1461+ return u->_mp_d[0] < GMP_LIMB_HIGHBIT;
1463+ return u->_mp_d[0] <= GMP_LIMB_HIGHBIT;
1469+mpz_fits_ulong_p (const mpz_t u)
1471+ mp_size_t us = u->_mp_size;
1473+ return (us == (us > 0));
1477+mpz_get_si (const mpz_t u)
1479+ mp_size_t us = u->_mp_size;
1482+ return (long) (u->_mp_d[0] & ~GMP_LIMB_HIGHBIT);
1484+ return (long) (- u->_mp_d[0] | GMP_LIMB_HIGHBIT);
1490+mpz_get_ui (const mpz_t u)
1492+ return u->_mp_size == 0 ? 0 : u->_mp_d[0];
1496+mpz_size (const mpz_t u)
1498+ return GMP_ABS (u->_mp_size);
1502+mpz_getlimbn (const mpz_t u, mp_size_t n)
1504+ if (n >= 0 && n < GMP_ABS (u->_mp_size))
1505+ return u->_mp_d[n];
1511+/* Conversions and comparison to double. */
1513+mpz_set_d (mpz_t r, double x)
1522+ /* x != x is true when x is a NaN, and x == x * 0.5 is true when x is
1523+ zero or infinity. */
1524+ if (x != x || x == x * 0.5)
1539+ B = 2.0 * (double) GMP_LIMB_HIGHBIT;
1541+ for (rn = 1; x >= B; rn++)
1544+ rp = MPZ_REALLOC (r, rn);
1560+ r->_mp_size = sign ? - rn : rn;
1564+mpz_init_set_d (mpz_t r, double x)
1571+mpz_get_d (const mpz_t u)
1575+ double B = 2.0 * (double) GMP_LIMB_HIGHBIT;
1577+ un = GMP_ABS (u->_mp_size);
1582+ x = u->_mp_d[--un];
1584+ x = B*x + u->_mp_d[--un];
1586+ if (u->_mp_size < 0)
1593+mpz_cmpabs_d (const mpz_t x, double d)
1606+ B = 2.0 * (double) GMP_LIMB_HIGHBIT;
1609+ /* Scale d so it can be compared with the top limb. */
1610+ for (i = 1; i < xn; i++)
1616+ /* Compare floor(d) to top limb, subtract and cancel when equal. */
1617+ for (i = xn; i-- > 0;)
1630+ return - (d > 0.0);
1634+mpz_cmp_d (const mpz_t x, double d)
1636+ if (x->_mp_size < 0)
1641+ return -mpz_cmpabs_d (x, d);
1648+ return mpz_cmpabs_d (x, d);
1653+/* MPZ comparisons and the like. */
1655+mpz_sgn (const mpz_t u)
1657+ mp_size_t usize = u->_mp_size;
1659+ return (usize > 0) - (usize < 0);
1663+mpz_cmp_si (const mpz_t u, long v)
1665+ mp_size_t usize = u->_mp_size;
1670+ return mpz_cmp_ui (u, v);
1671+ else if (usize >= 0)
1673+ else /* usize == -1 */
1675+ mp_limb_t ul = u->_mp_d[0];
1676+ if ((mp_limb_t)GMP_NEG_CAST (unsigned long int, v) < ul)
1679+ return (mp_limb_t)GMP_NEG_CAST (unsigned long int, v) > ul;
1684+mpz_cmp_ui (const mpz_t u, unsigned long v)
1686+ mp_size_t usize = u->_mp_size;
1690+ else if (usize < 0)
1694+ mp_limb_t ul = (usize > 0) ? u->_mp_d[0] : 0;
1695+ return (ul > v) - (ul < v);
1700+mpz_cmp (const mpz_t a, const mpz_t b)
1702+ mp_size_t asize = a->_mp_size;
1703+ mp_size_t bsize = b->_mp_size;
1705+ if (asize != bsize)
1706+ return (asize < bsize) ? -1 : 1;
1707+ else if (asize >= 0)
1708+ return mpn_cmp (a->_mp_d, b->_mp_d, asize);
1710+ return mpn_cmp (b->_mp_d, a->_mp_d, -asize);
1714+mpz_cmpabs_ui (const mpz_t u, unsigned long v)
1716+ mp_size_t un = GMP_ABS (u->_mp_size);
1722+ ul = (un == 1) ? u->_mp_d[0] : 0;
1724+ return (ul > v) - (ul < v);
1728+mpz_cmpabs (const mpz_t u, const mpz_t v)
1730+ return mpn_cmp4 (u->_mp_d, GMP_ABS (u->_mp_size),
1731+ v->_mp_d, GMP_ABS (v->_mp_size));
1735+mpz_abs (mpz_t r, const mpz_t u)
1740+ r->_mp_size = GMP_ABS (r->_mp_size);
1744+mpz_neg (mpz_t r, const mpz_t u)
1749+ r->_mp_size = -r->_mp_size;
1753+mpz_swap (mpz_t u, mpz_t v)
1755+ MP_SIZE_T_SWAP (u->_mp_size, v->_mp_size);
1756+ MP_SIZE_T_SWAP (u->_mp_alloc, v->_mp_alloc);
1757+ MP_PTR_SWAP (u->_mp_d, v->_mp_d);
1761+/* MPZ addition and subtraction */
1763+/* Adds to the absolute value. Returns new size, but doesn't store it. */
1765+mpz_abs_add_ui (mpz_t r, const mpz_t a, unsigned long b)
1771+ an = GMP_ABS (a->_mp_size);
1778+ rp = MPZ_REALLOC (r, an + 1);
1780+ cy = mpn_add_1 (rp, a->_mp_d, an, b);
1787+/* Subtract from the absolute value. Returns new size, (or -1 on underflow),
1788+ but doesn't store it. */
1790+mpz_abs_sub_ui (mpz_t r, const mpz_t a, unsigned long b)
1792+ mp_size_t an = GMP_ABS (a->_mp_size);
1793+ mp_ptr rp = MPZ_REALLOC (r, an);
1800+ else if (an == 1 && a->_mp_d[0] < b)
1802+ rp[0] = b - a->_mp_d[0];
1807+ gmp_assert_nocarry (mpn_sub_1 (rp, a->_mp_d, an, b));
1808+ return mpn_normalized_size (rp, an);
1813+mpz_add_ui (mpz_t r, const mpz_t a, unsigned long b)
1815+ if (a->_mp_size >= 0)
1816+ r->_mp_size = mpz_abs_add_ui (r, a, b);
1818+ r->_mp_size = -mpz_abs_sub_ui (r, a, b);
1822+mpz_sub_ui (mpz_t r, const mpz_t a, unsigned long b)
1824+ if (a->_mp_size < 0)
1825+ r->_mp_size = -mpz_abs_add_ui (r, a, b);
1827+ r->_mp_size = mpz_abs_sub_ui (r, a, b);
1831+mpz_ui_sub (mpz_t r, unsigned long a, const mpz_t b)
1833+ if (b->_mp_size < 0)
1834+ r->_mp_size = mpz_abs_add_ui (r, b, a);
1836+ r->_mp_size = -mpz_abs_sub_ui (r, b, a);
1840+mpz_abs_add (mpz_t r, const mpz_t a, const mpz_t b)
1842+ mp_size_t an = GMP_ABS (a->_mp_size);
1843+ mp_size_t bn = GMP_ABS (b->_mp_size);
1849+ MPZ_SRCPTR_SWAP (a, b);
1850+ MP_SIZE_T_SWAP (an, bn);
1853+ rp = MPZ_REALLOC (r, an + 1);
1854+ cy = mpn_add (rp, a->_mp_d, an, b->_mp_d, bn);
1862+mpz_abs_sub (mpz_t r, const mpz_t a, const mpz_t b)
1864+ mp_size_t an = GMP_ABS (a->_mp_size);
1865+ mp_size_t bn = GMP_ABS (b->_mp_size);
1869+ cmp = mpn_cmp4 (a->_mp_d, an, b->_mp_d, bn);
1872+ rp = MPZ_REALLOC (r, an);
1873+ gmp_assert_nocarry (mpn_sub (rp, a->_mp_d, an, b->_mp_d, bn));
1874+ return mpn_normalized_size (rp, an);
1878+ rp = MPZ_REALLOC (r, bn);
1879+ gmp_assert_nocarry (mpn_sub (rp, b->_mp_d, bn, a->_mp_d, an));
1880+ return -mpn_normalized_size (rp, bn);
1887+mpz_add (mpz_t r, const mpz_t a, const mpz_t b)
1891+ if ( (a->_mp_size ^ b->_mp_size) >= 0)
1892+ rn = mpz_abs_add (r, a, b);
1894+ rn = mpz_abs_sub (r, a, b);
1896+ r->_mp_size = a->_mp_size >= 0 ? rn : - rn;
1900+mpz_sub (mpz_t r, const mpz_t a, const mpz_t b)
1904+ if ( (a->_mp_size ^ b->_mp_size) >= 0)
1905+ rn = mpz_abs_sub (r, a, b);
1907+ rn = mpz_abs_add (r, a, b);
1909+ r->_mp_size = a->_mp_size >= 0 ? rn : - rn;
1913+/* MPZ multiplication */
1915+mpz_mul_si (mpz_t r, const mpz_t u, long int v)
1919+ mpz_mul_ui (r, u, GMP_NEG_CAST (unsigned long int, v));
1923+ mpz_mul_ui (r, u, (unsigned long int) v);
1927+mpz_mul_ui (mpz_t r, const mpz_t u, unsigned long int v)
1935+ if (us == 0 || v == 0)
1943+ tp = MPZ_REALLOC (r, un + 1);
1944+ cy = mpn_mul_1 (tp, u->_mp_d, un, v);
1948+ r->_mp_size = (us < 0) ? - un : un;
1952+mpz_mul (mpz_t r, const mpz_t u, const mpz_t v)
1955+ mp_size_t un, vn, rn;
1962+ if (un == 0 || vn == 0)
1968+ sign = (un ^ vn) < 0;
1973+ mpz_init2 (t, (un + vn) * GMP_LIMB_BITS);
1977+ mpn_mul (tp, u->_mp_d, un, v->_mp_d, vn);
1979+ mpn_mul (tp, v->_mp_d, vn, u->_mp_d, un);
1982+ rn -= tp[rn-1] == 0;
1984+ t->_mp_size = sign ? - rn : rn;
1990+mpz_mul_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t bits)
1997+ un = GMP_ABS (u->_mp_size);
2004+ limbs = bits / GMP_LIMB_BITS;
2005+ shift = bits % GMP_LIMB_BITS;
2007+ rn = un + limbs + (shift > 0);
2008+ rp = MPZ_REALLOC (r, rn);
2011+ mp_limb_t cy = mpn_lshift (rp + limbs, u->_mp_d, un, shift);
2016+ mpn_copyd (rp + limbs, u->_mp_d, un);
2021+ r->_mp_size = (u->_mp_size < 0) ? - rn : rn;
2026+enum mpz_div_round_mode { GMP_DIV_FLOOR, GMP_DIV_CEIL, GMP_DIV_TRUNC };
2028+/* Allows q or r to be zero. Returns 1 iff remainder is non-zero. */
2030+mpz_div_qr (mpz_t q, mpz_t r,
2031+ const mpz_t n, const mpz_t d, enum mpz_div_round_mode mode)
2033+ mp_size_t ns, ds, nn, dn, qs;
2038+ gmp_die("mpz_div_qr: Divide by zero.");
2056+ if (mode == GMP_DIV_CEIL && qs >= 0)
2058+ /* q = 1, r = n - d */
2064+ else if (mode == GMP_DIV_FLOOR && qs < 0)
2066+ /* q = -1, r = n + d */
2070+ mpz_set_si (q, -1);
2096+ mpz_init2 (tq, qn * GMP_LIMB_BITS);
2102+ mpn_div_qr (qp, np, nn, d->_mp_d, dn);
2106+ qn -= (qp[qn-1] == 0);
2108+ tq->_mp_size = qs < 0 ? -qn : qn;
2110+ rn = mpn_normalized_size (np, dn);
2111+ tr->_mp_size = ns < 0 ? - rn : rn;
2113+ if (mode == GMP_DIV_FLOOR && qs < 0 && rn != 0)
2116+ mpz_sub_ui (tq, tq, 1);
2118+ mpz_add (tr, tr, d);
2120+ else if (mode == GMP_DIV_CEIL && qs >= 0 && rn != 0)
2123+ mpz_add_ui (tq, tq, 1);
2125+ mpz_sub (tr, tr, d);
2143+mpz_cdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
2145+ mpz_div_qr (q, r, n, d, GMP_DIV_CEIL);
2149+mpz_fdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
2151+ mpz_div_qr (q, r, n, d, GMP_DIV_FLOOR);
2155+mpz_tdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
2157+ mpz_div_qr (q, r, n, d, GMP_DIV_TRUNC);
2161+mpz_cdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
2163+ mpz_div_qr (q, NULL, n, d, GMP_DIV_CEIL);
2167+mpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
2169+ mpz_div_qr (q, NULL, n, d, GMP_DIV_FLOOR);
2173+mpz_tdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
2175+ mpz_div_qr (q, NULL, n, d, GMP_DIV_TRUNC);
2179+mpz_cdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
2181+ mpz_div_qr (NULL, r, n, d, GMP_DIV_CEIL);
2185+mpz_fdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
2187+ mpz_div_qr (NULL, r, n, d, GMP_DIV_FLOOR);
2191+mpz_tdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
2193+ mpz_div_qr (NULL, r, n, d, GMP_DIV_TRUNC);
2197+mpz_mod (mpz_t r, const mpz_t n, const mpz_t d)
2199+ mpz_div_qr (NULL, r, n, d, d->_mp_size >= 0 ? GMP_DIV_FLOOR : GMP_DIV_CEIL);
2203+mpz_div_q_2exp (mpz_t q, const mpz_t u, mp_bitcnt_t bit_index,
2204+ enum mpz_div_round_mode mode)
2207+ mp_size_t limb_cnt;
2217+ limb_cnt = bit_index / GMP_LIMB_BITS;
2218+ qn = GMP_ABS (un) - limb_cnt;
2219+ bit_index %= GMP_LIMB_BITS;
2221+ if (mode == ((un > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* un != 0 here. */
2222+ /* Note: Below, the final indexing at limb_cnt is valid because at
2223+ that point we have qn > 0. */
2225+ || !mpn_zero_p (u->_mp_d, limb_cnt)
2226+ || (u->_mp_d[limb_cnt]
2227+ & (((mp_limb_t) 1 << bit_index) - 1)));
2236+ qp = MPZ_REALLOC (q, qn);
2238+ if (bit_index != 0)
2240+ mpn_rshift (qp, u->_mp_d + limb_cnt, qn, bit_index);
2241+ qn -= qp[qn - 1] == 0;
2245+ mpn_copyi (qp, u->_mp_d + limb_cnt, qn);
2252+ mpz_add_ui (q, q, 1);
2258+mpz_div_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t bit_index,
2259+ enum mpz_div_round_mode mode)
2261+ mp_size_t us, un, rn;
2266+ if (us == 0 || bit_index == 0)
2271+ rn = (bit_index + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
2274+ rp = MPZ_REALLOC (r, rn);
2277+ mask = GMP_LIMB_MAX >> (rn * GMP_LIMB_BITS - bit_index);
2281+ /* Quotient (with truncation) is zero, and remainder is
2283+ if (mode == ((us > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* us != 0 here. */
2285+ /* Have to negate and sign extend. */
2289+ for (cy = 1, i = 0; i < un; i++)
2291+ mp_limb_t s = ~u->_mp_d[i] + cy;
2296+ for (; i < rn - 1; i++)
2297+ rp[i] = GMP_LIMB_MAX;
2306+ mpn_copyi (rp, u->_mp_d, un);
2314+ mpn_copyi (rp, u->_mp_d, rn - 1);
2316+ rp[rn-1] = u->_mp_d[rn-1] & mask;
2318+ if (mode == ((us > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* us != 0 here. */
2320+ /* If r != 0, compute 2^{bit_count} - r. */
2323+ for (i = 0; i < rn && rp[i] == 0; i++)
2327+ /* r > 0, need to flip sign. */
2328+ rp[i] = ~rp[i] + 1;
2334+ /* us is not used for anything else, so we can modify it
2335+ here to indicate flipped sign. */
2340+ rn = mpn_normalized_size (rp, rn);
2341+ r->_mp_size = us < 0 ? -rn : rn;
2345+mpz_cdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
2347+ mpz_div_q_2exp (r, u, cnt, GMP_DIV_CEIL);
2351+mpz_fdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
2353+ mpz_div_q_2exp (r, u, cnt, GMP_DIV_FLOOR);
2357+mpz_tdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
2359+ mpz_div_q_2exp (r, u, cnt, GMP_DIV_TRUNC);
2363+mpz_cdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
2365+ mpz_div_r_2exp (r, u, cnt, GMP_DIV_CEIL);
2369+mpz_fdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
2371+ mpz_div_r_2exp (r, u, cnt, GMP_DIV_FLOOR);
2375+mpz_tdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
2377+ mpz_div_r_2exp (r, u, cnt, GMP_DIV_TRUNC);
2381+mpz_divexact (mpz_t q, const mpz_t n, const mpz_t d)
2383+ gmp_assert_nocarry (mpz_div_qr (q, NULL, n, d, GMP_DIV_TRUNC));
2387+mpz_divisible_p (const mpz_t n, const mpz_t d)
2389+ return mpz_div_qr (NULL, NULL, n, d, GMP_DIV_TRUNC) == 0;
2392+static unsigned long
2393+mpz_div_qr_ui (mpz_t q, mpz_t r,
2394+ const mpz_t n, unsigned long d, enum mpz_div_round_mode mode)
2413+ qp = MPZ_REALLOC (q, qn);
2417+ rl = mpn_div_qr_1 (qp, n->_mp_d, qn, d);
2421+ rs = (ns < 0) ? -rs : rs;
2423+ if (rl > 0 && ( (mode == GMP_DIV_FLOOR && ns < 0)
2424+ || (mode == GMP_DIV_CEIL && ns >= 0)))
2427+ gmp_assert_nocarry (mpn_add_1 (qp, qp, qn, 1));
2439+ qn -= (qp[qn-1] == 0);
2440+ assert (qn == 0 || qp[qn-1] > 0);
2442+ q->_mp_size = (ns < 0) ? - qn : qn;
2449+mpz_cdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d)
2451+ return mpz_div_qr_ui (q, r, n, d, GMP_DIV_CEIL);
2455+mpz_fdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d)
2457+ return mpz_div_qr_ui (q, r, n, d, GMP_DIV_FLOOR);
2461+mpz_tdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d)
2463+ return mpz_div_qr_ui (q, r, n, d, GMP_DIV_TRUNC);
2467+mpz_cdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d)
2469+ return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_CEIL);
2473+mpz_fdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d)
2475+ return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_FLOOR);
2479+mpz_tdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d)
2481+ return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_TRUNC);
2485+mpz_cdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d)
2487+ return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_CEIL);
2490+mpz_fdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d)
2492+ return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_FLOOR);
2495+mpz_tdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d)
2497+ return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_TRUNC);
2501+mpz_cdiv_ui (const mpz_t n, unsigned long d)
2503+ return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_CEIL);
2507+mpz_fdiv_ui (const mpz_t n, unsigned long d)
2509+ return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_FLOOR);
2513+mpz_tdiv_ui (const mpz_t n, unsigned long d)
2515+ return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_TRUNC);
2519+mpz_mod_ui (mpz_t r, const mpz_t n, unsigned long d)
2521+ return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_FLOOR);
2525+mpz_divexact_ui (mpz_t q, const mpz_t n, unsigned long d)
2527+ gmp_assert_nocarry (mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_TRUNC));
2531+mpz_divisible_ui_p (const mpz_t n, unsigned long d)
2533+ return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_TRUNC) == 0;
2539+mpn_gcd_11 (mp_limb_t u, mp_limb_t v)
2543+ assert ( (u | v) > 0);
2550+ gmp_ctz (shift, u | v);
2556+ MP_LIMB_T_SWAP (u, v);
2558+ while ( (v & 1) == 0)
2568+ while ( (u & 1) == 0);
2575+ while ( (v & 1) == 0);
2582+mpz_gcd_ui (mpz_t g, const mpz_t u, unsigned long v)
2593+ un = GMP_ABS (u->_mp_size);
2595+ v = mpn_gcd_11 (mpn_div_qr_1 (NULL, u->_mp_d, un, v), v);
2605+mpz_make_odd (mpz_t r)
2609+ assert (r->_mp_size > 0);
2610+ /* Count trailing zeros, equivalent to mpn_scan1, because we know that there is a 1 */
2611+ shift = mpn_common_scan (r->_mp_d[0], 0, r->_mp_d, 0, 0);
2612+ mpz_tdiv_q_2exp (r, r, shift);
2618+mpz_gcd (mpz_t g, const mpz_t u, const mpz_t v)
2621+ mp_bitcnt_t uz, vz, gz;
2623+ if (u->_mp_size == 0)
2628+ if (v->_mp_size == 0)
2638+ uz = mpz_make_odd (tu);
2640+ vz = mpz_make_odd (tv);
2641+ gz = GMP_MIN (uz, vz);
2643+ if (tu->_mp_size < tv->_mp_size)
2646+ mpz_tdiv_r (tu, tu, tv);
2647+ if (tu->_mp_size == 0)
2657+ c = mpz_cmp (tu, tv);
2666+ if (tv->_mp_size == 1)
2668+ mp_limb_t vl = tv->_mp_d[0];
2669+ mp_limb_t ul = mpz_tdiv_ui (tu, vl);
2670+ mpz_set_ui (g, mpn_gcd_11 (ul, vl));
2673+ mpz_sub (tu, tu, tv);
2677+ mpz_mul_2exp (g, g, gz);
2681+mpz_gcdext (mpz_t g, mpz_t s, mpz_t t, const mpz_t u, const mpz_t v)
2683+ mpz_t tu, tv, s0, s1, t0, t1;
2684+ mp_bitcnt_t uz, vz, gz;
2687+ if (u->_mp_size == 0)
2689+ /* g = 0 u + sgn(v) v */
2690+ signed long sign = mpz_sgn (v);
2695+ mpz_set_si (t, sign);
2699+ if (v->_mp_size == 0)
2701+ /* g = sgn(u) u + 0 v */
2702+ signed long sign = mpz_sgn (u);
2705+ mpz_set_si (s, sign);
2719+ uz = mpz_make_odd (tu);
2721+ vz = mpz_make_odd (tv);
2722+ gz = GMP_MIN (uz, vz);
2727+ /* Cofactors corresponding to odd gcd. gz handled later. */
2728+ if (tu->_mp_size < tv->_mp_size)
2731+ MPZ_SRCPTR_SWAP (u, v);
2732+ MPZ_PTR_SWAP (s, t);
2733+ MP_BITCNT_T_SWAP (uz, vz);
2738+ * u = t0 tu + t1 tv
2739+ * v = s0 tu + s1 tv
2741+ * where u and v denote the inputs with common factors of two
2742+ * eliminated, and det (s0, t0; s1, t1) = 2^p. Then
2744+ * 2^p tu = s1 u - t1 v
2745+ * 2^p tv = -s0 u + t0 v
2748+ /* After initial division, tu = q tv + tu', we have
2750+ * u = 2^uz (tu' + q tv)
2755+ * t0 = 2^uz, t1 = 2^uz q
2756+ * s0 = 0, s1 = 2^vz
2759+ mpz_setbit (t0, uz);
2760+ mpz_tdiv_qr (t1, tu, tu, tv);
2761+ mpz_mul_2exp (t1, t1, uz);
2763+ mpz_setbit (s1, vz);
2766+ if (tu->_mp_size > 0)
2769+ shift = mpz_make_odd (tu);
2770+ mpz_mul_2exp (t0, t0, shift);
2771+ mpz_mul_2exp (s0, s0, shift);
2777+ c = mpz_cmp (tu, tv);
2785+ * u = t0 tu + t1 (tv' + tu) = (t0 + t1) tu + t1 tv'
2786+ * v = s0 tu + s1 (tv' + tu) = (s0 + s1) tu + s1 tv' */
2788+ mpz_sub (tv, tv, tu);
2789+ mpz_add (t0, t0, t1);
2790+ mpz_add (s0, s0, s1);
2792+ shift = mpz_make_odd (tv);
2793+ mpz_mul_2exp (t1, t1, shift);
2794+ mpz_mul_2exp (s1, s1, shift);
2798+ mpz_sub (tu, tu, tv);
2799+ mpz_add (t1, t0, t1);
2800+ mpz_add (s1, s0, s1);
2802+ shift = mpz_make_odd (tu);
2803+ mpz_mul_2exp (t0, t0, shift);
2804+ mpz_mul_2exp (s0, s0, shift);
2810+ /* Now tv = odd part of gcd, and -s0 and t0 are corresponding
2813+ mpz_mul_2exp (tv, tv, gz);
2816+ /* 2^p g = s0 u + t0 v. Eliminate one factor of two at a time. To
2817+ adjust cofactors, we need u / g and v / g */
2819+ mpz_divexact (s1, v, tv);
2821+ mpz_divexact (t1, u, tv);
2824+ while (power-- > 0)
2826+ /* s0 u + t0 v = (s0 - v/g) u - (t0 + u/g) v */
2827+ if (mpz_odd_p (s0) || mpz_odd_p (t0))
2829+ mpz_sub (s0, s0, s1);
2830+ mpz_add (t0, t0, t1);
2832+ mpz_divexact_ui (s0, s0, 2);
2833+ mpz_divexact_ui (t0, t0, 2);
2836+ /* Arrange so that |s| < |u| / 2g */
2837+ mpz_add (s1, s0, s1);
2838+ if (mpz_cmpabs (s0, s1) > 0)
2841+ mpz_sub (t0, t0, t1);
2843+ if (u->_mp_size < 0)
2845+ if (v->_mp_size < 0)
2863+mpz_lcm (mpz_t r, const mpz_t u, const mpz_t v)
2867+ if (u->_mp_size == 0 || v->_mp_size == 0)
2876+ mpz_divexact (g, u, g);
2884+mpz_lcm_ui (mpz_t r, const mpz_t u, unsigned long v)
2886+ if (v == 0 || u->_mp_size == 0)
2892+ v /= mpz_gcd_ui (NULL, u, v);
2893+ mpz_mul_ui (r, u, v);
2899+mpz_invert (mpz_t r, const mpz_t u, const mpz_t m)
2904+ if (u->_mp_size == 0 || mpz_cmpabs_ui (m, 1) <= 0)
2910+ mpz_gcdext (g, tr, NULL, u, m);
2911+ invertible = (mpz_cmp_ui (g, 1) == 0);
2915+ if (tr->_mp_size < 0)
2917+ if (m->_mp_size >= 0)
2918+ mpz_add (tr, tr, m);
2920+ mpz_sub (tr, tr, m);
2931+/* Higher level operations (sqrt, pow and root) */
2934+mpz_pow_ui (mpz_t r, const mpz_t b, unsigned long e)
2938+ mpz_init_set_ui (tr, 1);
2940+ bit = GMP_ULONG_HIGHBIT;
2943+ mpz_mul (tr, tr, tr);
2945+ mpz_mul (tr, tr, b);
2955+mpz_ui_pow_ui (mpz_t r, unsigned long blimb, unsigned long e)
2958+ mpz_init_set_ui (b, blimb);
2959+ mpz_pow_ui (r, b, e);
2964+mpz_powm (mpz_t r, const mpz_t b, const mpz_t e, const mpz_t m)
2970+ struct gmp_div_inverse minv;
2974+ en = GMP_ABS (e->_mp_size);
2975+ mn = GMP_ABS (m->_mp_size);
2977+ gmp_die ("mpz_powm: Zero modulo.");
2986+ mpn_div_qr_invert (&minv, mp, mn);
2987+ shift = minv.shift;
2991+ /* To avoid shifts, we do all our reductions, except the final
2992+ one, using a *normalized* m. */
2995+ tp = gmp_xalloc_limbs (mn);
2996+ gmp_assert_nocarry (mpn_lshift (tp, mp, mn, shift));
3002+ if (e->_mp_size < 0)
3004+ if (!mpz_invert (base, b, m))
3005+ gmp_die ("mpz_powm: Negative exponent and non-invertible base.");
3012+ bn = base->_mp_size;
3015+ mpn_div_qr_preinv (NULL, base->_mp_d, base->_mp_size, mp, mn, &minv);
3019+ /* We have reduced the absolute value. Now take care of the
3020+ sign. Note that we get zero represented non-canonically as
3022+ if (b->_mp_size < 0)
3024+ mp_ptr bp = MPZ_REALLOC (base, mn);
3025+ gmp_assert_nocarry (mpn_sub (bp, mp, mn, bp, bn));
3028+ base->_mp_size = mpn_normalized_size (base->_mp_d, bn);
3030+ mpz_init_set_ui (tr, 1);
3034+ mp_limb_t w = e->_mp_d[en];
3037+ bit = GMP_LIMB_HIGHBIT;
3040+ mpz_mul (tr, tr, tr);
3042+ mpz_mul (tr, tr, base);
3043+ if (tr->_mp_size > mn)
3045+ mpn_div_qr_preinv (NULL, tr->_mp_d, tr->_mp_size, mp, mn, &minv);
3046+ tr->_mp_size = mpn_normalized_size (tr->_mp_d, mn);
3053+ /* Final reduction */
3054+ if (tr->_mp_size >= mn)
3056+ minv.shift = shift;
3057+ mpn_div_qr_preinv (NULL, tr->_mp_d, tr->_mp_size, mp, mn, &minv);
3058+ tr->_mp_size = mpn_normalized_size (tr->_mp_d, mn);
3069+mpz_powm_ui (mpz_t r, const mpz_t b, unsigned long elimb, const mpz_t m)
3072+ mpz_init_set_ui (e, elimb);
3073+ mpz_powm (r, b, e, m);
3077+/* x=trunc(y^(1/z)), r=y-x^z */
3079+mpz_rootrem (mpz_t x, mpz_t r, const mpz_t y, unsigned long z)
3084+ sgn = y->_mp_size < 0;
3085+ if ((~z & sgn) != 0)
3086+ gmp_die ("mpz_rootrem: Negative argument, with even root.");
3088+ gmp_die ("mpz_rootrem: Zeroth root.");
3090+ if (mpz_cmpabs_ui (y, 1) <= 0) {
3100+ tb = mpz_sizeinbase (y, 2) / z + 1;
3102+ mpz_setbit (t, tb);
3105+ if (z == 2) /* simplify sqrt loop: z-1 == 1 */
3107+ mpz_swap (u, t); /* u = x */
3108+ mpz_tdiv_q (t, y, u); /* t = y/x */
3109+ mpz_add (t, t, u); /* t = y/x + x */
3110+ mpz_tdiv_q_2exp (t, t, 1); /* x'= (y/x + x)/2 */
3111+ } while (mpz_cmpabs (t, u) < 0); /* |x'| < |x| */
3112+ else /* z != 2 */ {
3120+ mpz_swap (u, t); /* u = x */
3121+ mpz_pow_ui (t, u, z - 1); /* t = x^(z-1) */
3122+ mpz_tdiv_q (t, y, t); /* t = y/x^(z-1) */
3123+ mpz_mul_ui (v, u, z - 1); /* v = x*(z-1) */
3124+ mpz_add (t, t, v); /* t = y/x^(z-1) + x*(z-1) */
3125+ mpz_tdiv_q_ui (t, t, z); /* x'=(y/x^(z-1) + x*(z-1))/z */
3126+ } while (mpz_cmpabs (t, u) < 0); /* |x'| < |x| */
3132+ mpz_pow_ui (t, u, z);
3141+mpz_root (mpz_t x, const mpz_t y, unsigned long z)
3147+ mpz_rootrem (x, r, y, z);
3148+ res = r->_mp_size == 0;
3154+/* Compute s = floor(sqrt(u)) and r = u - s^2. Allows r == NULL */
3156+mpz_sqrtrem (mpz_t s, mpz_t r, const mpz_t u)
3158+ mpz_rootrem (s, r, u, 2);
3162+mpz_sqrt (mpz_t s, const mpz_t u)
3164+ mpz_rootrem (s, NULL, u, 2);
3171+mpz_fac_ui (mpz_t x, unsigned long n)
3173+ mpz_set_ui (x, n + (n == 0));
3175+ mpz_mul_ui (x, x, --n);
3179+mpz_bin_uiui (mpz_t r, unsigned long n, unsigned long k)
3183+ mpz_set_ui (r, k <= n);
3186+ k = (k <= n) ? n - k : 0;
3192+ mpz_mul_ui (r, r, n--);
3194+ mpz_divexact (r, r, t);
3199+/* Logical operations and bit manipulation. */
3201+/* Numbers are treated as if represented in two's complement (and
3202+ infinitely sign extended). For a negative values we get the two's
3203+ complement from -x = ~x + 1, where ~ is bitwise complement.
3204+ Negation transforms
3212+ where yyyy is the bitwise complement of xxxx. So least significant
3213+ bits, up to and including the first one bit, are unchanged, and
3214+ the more significant bits are all complemented.
3216+ To change a bit from zero to one in a negative number, subtract the
3217+ corresponding power of two from the absolute value. This can never
3218+ underflow. To change a bit from one to zero, add the corresponding
3219+ power of two, and this might overflow. E.g., if x = -001111, the
3220+ two's complement is 110001. Clearing the least significant bit, we
3221+ get two's complement 110000, and -010000. */
3224+mpz_tstbit (const mpz_t d, mp_bitcnt_t bit_index)
3226+ mp_size_t limb_index;
3235+ limb_index = bit_index / GMP_LIMB_BITS;
3236+ if (limb_index >= dn)
3239+ shift = bit_index % GMP_LIMB_BITS;
3240+ w = d->_mp_d[limb_index];
3241+ bit = (w >> shift) & 1;
3245+ /* d < 0. Check if any of the bits below is set: If so, our bit
3246+ must be complemented. */
3247+ if (shift > 0 && (w << (GMP_LIMB_BITS - shift)) > 0)
3249+ while (limb_index-- > 0)
3250+ if (d->_mp_d[limb_index] > 0)
3257+mpz_abs_add_bit (mpz_t d, mp_bitcnt_t bit_index)
3259+ mp_size_t dn, limb_index;
3263+ dn = GMP_ABS (d->_mp_size);
3265+ limb_index = bit_index / GMP_LIMB_BITS;
3266+ bit = (mp_limb_t) 1 << (bit_index % GMP_LIMB_BITS);
3268+ if (limb_index >= dn)
3271+ /* The bit should be set outside of the end of the number.
3272+ We have to increase the size of the number. */
3273+ dp = MPZ_REALLOC (d, limb_index + 1);
3275+ dp[limb_index] = bit;
3276+ for (i = dn; i < limb_index; i++)
3278+ dn = limb_index + 1;
3286+ cy = mpn_add_1 (dp + limb_index, dp + limb_index, dn - limb_index, bit);
3289+ dp = MPZ_REALLOC (d, dn + 1);
3294+ d->_mp_size = (d->_mp_size < 0) ? - dn : dn;
3298+mpz_abs_sub_bit (mpz_t d, mp_bitcnt_t bit_index)
3300+ mp_size_t dn, limb_index;
3304+ dn = GMP_ABS (d->_mp_size);
3307+ limb_index = bit_index / GMP_LIMB_BITS;
3308+ bit = (mp_limb_t) 1 << (bit_index % GMP_LIMB_BITS);
3310+ assert (limb_index < dn);
3312+ gmp_assert_nocarry (mpn_sub_1 (dp + limb_index, dp + limb_index,
3313+ dn - limb_index, bit));
3314+ dn -= (dp[dn-1] == 0);
3315+ d->_mp_size = (d->_mp_size < 0) ? - dn : dn;
3319+mpz_setbit (mpz_t d, mp_bitcnt_t bit_index)
3321+ if (!mpz_tstbit (d, bit_index))
3323+ if (d->_mp_size >= 0)
3324+ mpz_abs_add_bit (d, bit_index);
3326+ mpz_abs_sub_bit (d, bit_index);
3331+mpz_clrbit (mpz_t d, mp_bitcnt_t bit_index)
3333+ if (mpz_tstbit (d, bit_index))
3335+ if (d->_mp_size >= 0)
3336+ mpz_abs_sub_bit (d, bit_index);
3338+ mpz_abs_add_bit (d, bit_index);
3343+mpz_combit (mpz_t d, mp_bitcnt_t bit_index)
3345+ if (mpz_tstbit (d, bit_index) ^ (d->_mp_size < 0))
3346+ mpz_abs_sub_bit (d, bit_index);
3348+ mpz_abs_add_bit (d, bit_index);
3352+mpz_com (mpz_t r, const mpz_t u)
3355+ mpz_sub_ui (r, r, 1);
3359+mpz_and (mpz_t r, const mpz_t u, const mpz_t v)
3361+ mp_size_t un, vn, rn, i;
3364+ mp_limb_t ux, vx, rx;
3365+ mp_limb_t uc, vc, rc;
3366+ mp_limb_t ul, vl, rl;
3368+ un = GMP_ABS (u->_mp_size);
3369+ vn = GMP_ABS (v->_mp_size);
3372+ MPZ_SRCPTR_SWAP (u, v);
3373+ MP_SIZE_T_SWAP (un, vn);
3381+ uc = u->_mp_size < 0;
3382+ vc = v->_mp_size < 0;
3389+ /* If the smaller input is positive, higher limbs don't matter. */
3392+ rp = MPZ_REALLOC (r, rn + rc);
3400+ ul = (up[i] ^ ux) + uc;
3403+ vl = (vp[i] ^ vx) + vc;
3406+ rl = ( (ul & vl) ^ rx) + rc;
3413+ for (; i < rn; i++)
3415+ ul = (up[i] ^ ux) + uc;
3418+ rl = ( (ul & vx) ^ rx) + rc;
3425+ rn = mpn_normalized_size (rp, rn);
3427+ r->_mp_size = rx ? -rn : rn;
3431+mpz_ior (mpz_t r, const mpz_t u, const mpz_t v)
3433+ mp_size_t un, vn, rn, i;
3436+ mp_limb_t ux, vx, rx;
3437+ mp_limb_t uc, vc, rc;
3438+ mp_limb_t ul, vl, rl;
3440+ un = GMP_ABS (u->_mp_size);
3441+ vn = GMP_ABS (v->_mp_size);
3444+ MPZ_SRCPTR_SWAP (u, v);
3445+ MP_SIZE_T_SWAP (un, vn);
3453+ uc = u->_mp_size < 0;
3454+ vc = v->_mp_size < 0;
3461+ /* If the smaller input is negative, by sign extension higher limbs
3465+ rp = MPZ_REALLOC (r, rn + rc);
3473+ ul = (up[i] ^ ux) + uc;
3476+ vl = (vp[i] ^ vx) + vc;
3479+ rl = ( (ul | vl) ^ rx) + rc;
3486+ for (; i < rn; i++)
3488+ ul = (up[i] ^ ux) + uc;
3491+ rl = ( (ul | vx) ^ rx) + rc;
3498+ rn = mpn_normalized_size (rp, rn);
3500+ r->_mp_size = rx ? -rn : rn;
3504+mpz_xor (mpz_t r, const mpz_t u, const mpz_t v)
3506+ mp_size_t un, vn, i;
3509+ mp_limb_t ux, vx, rx;
3510+ mp_limb_t uc, vc, rc;
3511+ mp_limb_t ul, vl, rl;
3513+ un = GMP_ABS (u->_mp_size);
3514+ vn = GMP_ABS (v->_mp_size);
3517+ MPZ_SRCPTR_SWAP (u, v);
3518+ MP_SIZE_T_SWAP (un, vn);
3526+ uc = u->_mp_size < 0;
3527+ vc = v->_mp_size < 0;
3534+ rp = MPZ_REALLOC (r, un + rc);
3542+ ul = (up[i] ^ ux) + uc;
3545+ vl = (vp[i] ^ vx) + vc;
3548+ rl = (ul ^ vl ^ rx) + rc;
3555+ for (; i < un; i++)
3557+ ul = (up[i] ^ ux) + uc;
3560+ rl = (ul ^ ux) + rc;
3567+ un = mpn_normalized_size (rp, un);
3569+ r->_mp_size = rx ? -un : un;
3573+gmp_popcount_limb (mp_limb_t x)
3577+ /* Do 16 bits at a time, to avoid limb-sized constants. */
3578+ for (c = 0; x > 0; x >>= 16)
3580+ unsigned w = ((x >> 1) & 0x5555) + (x & 0x5555);
3581+ w = ((w >> 2) & 0x3333) + (w & 0x3333);
3582+ w = ((w >> 4) & 0x0f0f) + (w & 0x0f0f);
3583+ w = (w >> 8) + (w & 0x00ff);
3590+mpz_popcount (const mpz_t u)
3598+ return ~(mp_bitcnt_t) 0;
3600+ for (c = 0, i = 0; i < un; i++)
3601+ c += gmp_popcount_limb (u->_mp_d[i]);
3607+mpz_hamdist (const mpz_t u, const mpz_t v)
3609+ mp_size_t un, vn, i;
3610+ mp_limb_t uc, vc, ul, vl, comp;
3617+ if ( (un ^ vn) < 0)
3618+ return ~(mp_bitcnt_t) 0;
3620+ comp = - (uc = vc = (un < 0));
3632+ MPN_SRCPTR_SWAP (up, un, vp, vn);
3634+ for (i = 0, c = 0; i < vn; i++)
3636+ ul = (up[i] ^ comp) + uc;
3639+ vl = (vp[i] ^ comp) + vc;
3642+ c += gmp_popcount_limb (ul ^ vl);
3646+ for (; i < un; i++)
3648+ ul = (up[i] ^ comp) + uc;
3651+ c += gmp_popcount_limb (ul ^ comp);
3658+mpz_scan1 (const mpz_t u, mp_bitcnt_t starting_bit)
3661+ mp_size_t us, un, i;
3662+ mp_limb_t limb, ux;
3666+ i = starting_bit / GMP_LIMB_BITS;
3668+ /* Past the end there's no 1 bits for u>=0, or an immediate 1 bit
3669+ for u<0. Notice this test picks up any u==0 too. */
3671+ return (us >= 0 ? ~(mp_bitcnt_t) 0 : starting_bit);
3677+ if (starting_bit != 0)
3681+ ux = mpn_zero_p (up, i);
3682+ limb = ~ limb + ux;
3683+ ux = - (mp_limb_t) (limb >= ux);
3686+ /* Mask to 0 all bits before starting_bit, thus ignoring them. */
3687+ limb &= (GMP_LIMB_MAX << (starting_bit % GMP_LIMB_BITS));
3690+ return mpn_common_scan (limb, i, up, un, ux);
3694+mpz_scan0 (const mpz_t u, mp_bitcnt_t starting_bit)
3697+ mp_size_t us, un, i;
3698+ mp_limb_t limb, ux;
3701+ ux = - (mp_limb_t) (us >= 0);
3703+ i = starting_bit / GMP_LIMB_BITS;
3705+ /* When past end, there's an immediate 0 bit for u>=0, or no 0 bits for
3706+ u<0. Notice this test picks up all cases of u==0 too. */
3708+ return (ux ? starting_bit : ~(mp_bitcnt_t) 0);
3714+ limb -= mpn_zero_p (up, i); /* limb = ~(~limb + zero_p) */
3716+ /* Mask all bits before starting_bit, thus ignoring them. */
3717+ limb &= (GMP_LIMB_MAX << (starting_bit % GMP_LIMB_BITS));
3719+ return mpn_common_scan (limb, i, up, un, ux);
3723+/* MPZ base conversion. */
3726+mpz_sizeinbase (const mpz_t u, int base)
3732+ struct gmp_div_inverse bi;
3735+ assert (base >= 2);
3736+ assert (base <= 36);
3738+ un = GMP_ABS (u->_mp_size);
3744+ bits = (un - 1) * GMP_LIMB_BITS + mpn_limb_size_in_base_2 (up[un-1]);
3750+ return (bits + 1) / 2;
3752+ return (bits + 2) / 3;
3754+ return (bits + 3) / 4;
3756+ return (bits + 4) / 5;
3757+ /* FIXME: Do something more clever for the common case of base
3761+ tp = gmp_xalloc_limbs (un);
3762+ mpn_copyi (tp, up, un);
3763+ mpn_div_qr_1_invert (&bi, base);
3769+ mpn_div_qr_1_preinv (tp, tp, un, &bi);
3770+ un -= (tp[un-1] == 0);
3779+mpz_get_str (char *sp, int base, const mpz_t u)
3782+ const char *digits;
3788+ digits = "0123456789abcdefghijklmnopqrstuvwxyz";
3793+ digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
3800+ sn = 1 + mpz_sizeinbase (u, base);
3802+ sp = gmp_xalloc (1 + sn);
3804+ un = GMP_ABS (u->_mp_size);
3815+ if (u->_mp_size < 0)
3818+ bits = mpn_base_power_of_two_p (base);
3821+ /* Not modified in this case. */
3822+ sn = i + mpn_get_str_bits ((unsigned char *) sp + i, bits, u->_mp_d, un);
3825+ struct mpn_base_info info;
3828+ mpn_get_base_info (&info, base);
3829+ tp = gmp_xalloc_limbs (un);
3830+ mpn_copyi (tp, u->_mp_d, un);
3832+ sn = i + mpn_get_str_other ((unsigned char *) sp + i, base, &info, tp, un);
3836+ for (; i < sn; i++)
3837+ sp[i] = digits[(unsigned char) sp[i]];
3844+mpz_set_str (mpz_t r, const char *sp, int base)
3847+ mp_size_t rn, alloc;
3853+ assert (base == 0 || (base >= 2 && base <= 36));
3855+ while (isspace( (unsigned char) *sp))
3858+ sign = (*sp == '-');
3866+ if (*sp == 'x' || *sp == 'X')
3871+ else if (*sp == 'b' || *sp == 'B')
3884+ dp = gmp_xalloc (sn + (sn == 0));
3886+ for (sn = 0; *sp; sp++)
3890+ if (isspace ((unsigned char) *sp))
3892+ if (*sp >= '0' && *sp <= '9')
3894+ else if (*sp >= 'a' && *sp <= 'z')
3895+ digit = *sp - 'a' + 10;
3896+ else if (*sp >= 'A' && *sp <= 'Z')
3897+ digit = *sp - 'A' + 10;
3899+ digit = base; /* fail */
3911+ bits = mpn_base_power_of_two_p (base);
3915+ alloc = (sn * bits + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
3916+ rp = MPZ_REALLOC (r, alloc);
3917+ rn = mpn_set_str_bits (rp, dp, sn, bits);
3921+ struct mpn_base_info info;
3922+ mpn_get_base_info (&info, base);
3923+ alloc = (sn + info.exp - 1) / info.exp;
3924+ rp = MPZ_REALLOC (r, alloc);
3925+ rn = mpn_set_str_other (rp, dp, sn, base, &info);
3927+ assert (rn <= alloc);
3930+ r->_mp_size = sign ? - rn : rn;
3936+mpz_init_set_str (mpz_t r, const char *sp, int base)
3939+ return mpz_set_str (r, sp, base);
3943+mpz_out_str (FILE *stream, int base, const mpz_t x)
3948+ str = mpz_get_str (NULL, base, x);
3949+ len = strlen (str);
3950+ len = fwrite (str, 1, len, stream);
3957+gmp_detect_endian (void)
3959+ static const int i = 2;
3960+ const unsigned char *p = (const unsigned char *) &i;
3964+/* Import and export. Does not support nails. */
3966+mpz_import (mpz_t r, size_t count, int order, size_t size, int endian,
3967+ size_t nails, const void *src)
3969+ const unsigned char *p;
3970+ ptrdiff_t word_step;
3974+ /* The current (partial) limb. */
3976+ /* The number of bytes already copied to this limb (starting from
3979+ /* The index where the limb should be stored, when completed. */
3983+ gmp_die ("mpz_import: Nails not supported.");
3985+ assert (order == 1 || order == -1);
3986+ assert (endian >= -1 && endian <= 1);
3989+ endian = gmp_detect_endian ();
3991+ p = (unsigned char *) src;
3993+ word_step = (order != endian) ? 2 * size : 0;
3995+ /* Process bytes from the least significant end, so point p at the
3996+ least significant word. */
3999+ p += size * (count - 1);
4000+ word_step = - word_step;
4003+ /* And at least significant byte of that word. */
4007+ rn = (size * count + sizeof(mp_limb_t) - 1) / sizeof(mp_limb_t);
4008+ rp = MPZ_REALLOC (r, rn);
4010+ for (limb = 0, bytes = 0, i = 0; count > 0; count--, p += word_step)
4013+ for (j = 0; j < size; j++, p -= (ptrdiff_t) endian)
4015+ limb |= (mp_limb_t) *p << (bytes++ * CHAR_BIT);
4016+ if (bytes == sizeof(mp_limb_t))
4024+ assert (i + (bytes > 0) == rn);
4028+ i = mpn_normalized_size (rp, i);
4034+mpz_export (void *r, size_t *countp, int order, size_t size, int endian,
4035+ size_t nails, const mpz_t u)
4041+ gmp_die ("mpz_import: Nails not supported.");
4043+ assert (order == 1 || order == -1);
4044+ assert (endian >= -1 && endian <= 1);
4045+ assert (size > 0 || u->_mp_size == 0);
4053+ ptrdiff_t word_step;
4054+ /* The current (partial) limb. */
4056+ /* The number of bytes left to to in this limb. */
4058+ /* The index where the limb was read. */
4063+ /* Count bytes in top limb. */
4064+ limb = u->_mp_d[un-1];
4065+ assert (limb != 0);
4069+ k++; limb >>= CHAR_BIT;
4070+ } while (limb != 0);
4072+ count = (k + (un-1) * sizeof (mp_limb_t) + size - 1) / size;
4075+ r = gmp_xalloc (count * size);
4078+ endian = gmp_detect_endian ();
4080+ p = (unsigned char *) r;
4082+ word_step = (order != endian) ? 2 * size : 0;
4084+ /* Process bytes from the least significant end, so point p at the
4085+ least significant word. */
4088+ p += size * (count - 1);
4089+ word_step = - word_step;
4092+ /* And at least significant byte of that word. */
4096+ for (bytes = 0, i = 0, k = 0; k < count; k++, p += word_step)
4099+ for (j = 0; j < size; j++, p -= (ptrdiff_t) endian)
4104+ limb = u->_mp_d[i++];
4105+ bytes = sizeof (mp_limb_t);
4113+ assert (k == count);