53 #if !defined(MINI_GMP_DONT_USE_FLOAT_H)
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
81 #define GMP_DBL_MANT_BITS (53)
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); \
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) \
101 (__clz_x & ((mp_limb_t) 0xff << (GMP_LIMB_BITS - 8))) == 0; \
103 { __clz_x <<= LOCAL_SHIFT_BITS; } \
104 for (; (__clz_x & GMP_LIMB_HIGHBIT) == 0; __clz_c++) \
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; \
116 #define gmp_add_ssaaaa(sh, sl, ah, al, bh, bl) \
120 (sh) = (ah) + (bh) + (__x < (al)); \
124 #define gmp_sub_ddmmss(sh, sl, ah, al, bh, bl) \
128 (sh) = (ah) - (bh) - ((al) < (bl)); \
132 #define gmp_umul_ppmm(w1, w0, u, v) \
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); \
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); \
165 __x3 += GMP_HLIMB_BIT; \
167 (w1) = __x3 + (__x1 >> (GMP_LIMB_BITS / 2)); \
168 (w0) = (__x1 << (GMP_LIMB_BITS / 2)) + (__x0 & GMP_LLIMB_MASK); \
172 #define gmp_udiv_qrnnd_preinv(q, r, nh, nl, d, di) \
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); \
191 #define gmp_udiv_qr_3by2(q, r1, r0, n2, n1, n0, d1, d0, dinv) \
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)); \
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); \
205 _mask = - (mp_limb_t) ((r1) >= _q0); \
207 gmp_add_ssaaaa ((r1), (r0), (r1), (r0), _mask & (d1), _mask & (d0)); \
210 if ((r1) > (d1) || (r0) >= (d0)) \
213 gmp_sub_ddmmss ((r1), (r0), (r1), (r0), (d1), (d0)); \
219 #define MP_LIMB_T_SWAP(x, y) \
221 mp_limb_t __mp_limb_t_swap__tmp = (x); \
223 (y) = __mp_limb_t_swap__tmp; \
225 #define MP_SIZE_T_SWAP(x, y) \
227 mp_size_t __mp_size_t_swap__tmp = (x); \
229 (y) = __mp_size_t_swap__tmp; \
231 #define MP_BITCNT_T_SWAP(x,y) \
233 mp_bitcnt_t __mp_bitcnt_t_swap__tmp = (x); \
235 (y) = __mp_bitcnt_t_swap__tmp; \
237 #define MP_PTR_SWAP(x, y) \
239 mp_ptr __mp_ptr_swap__tmp = (x); \
241 (y) = __mp_ptr_swap__tmp; \
243 #define MP_SRCPTR_SWAP(x, y) \
245 mp_srcptr __mp_srcptr_swap__tmp = (x); \
247 (y) = __mp_srcptr_swap__tmp; \
250 #define MPN_PTR_SWAP(xp,xs, yp,ys) \
252 MP_PTR_SWAP (xp, yp); \
253 MP_SIZE_T_SWAP (xs, ys); \
255 #define MPN_SRCPTR_SWAP(xp,xs, yp,ys) \
257 MP_SRCPTR_SWAP (xp, yp); \
258 MP_SIZE_T_SWAP (xs, ys); \
261 #define MPZ_PTR_SWAP(x, y) \
263 mpz_ptr __mpz_ptr_swap__tmp = (x); \
265 (y) = __mpz_ptr_swap__tmp; \
267 #define MPZ_SRCPTR_SWAP(x, y) \
269 mpz_srcptr __mpz_srcptr_swap__tmp = (x); \
271 (y) = __mpz_srcptr_swap__tmp; \
281 fprintf (stderr,
"%s\n", msg);
294 gmp_die(
"gmp_default_alloc: Virtual memory exhausted.");
304 p = realloc (old, new_size);
307 gmp_die(
"gmp_default_realloc: Virtual memory exhausted.");
324 void *(**realloc_func) (
void *,
size_t,
size_t),
325 void (**free_func) (
void *,
size_t))
339 void *(*realloc_func) (
void *,
size_t,
size_t),
340 void (*free_func) (
void *,
size_t))
354 #define gmp_xalloc(size) ((*gmp_allocate_func)((size)))
355 #define gmp_free(p) ((*gmp_free_func) ((p), 0))
367 return (
mp_ptr) (*gmp_reallocate_func) (old, 0, size *
sizeof (
mp_limb_t));
377 for (
i = 0;
i < n;
i++)
394 return ap[n] >
bp[n] ? 1 : -1;
403 return an < bn ? -1 : 1;
411 while (n > 0 &&
xp[n-1] == 0)
454 for (
i = 0, cy = 0;
i < n;
i++)
507 for (
i = 0, cy = 0;
i < n;
i++)
546 cl = (lpl < cl) + hpl;
569 cl = (lpl < cl) + hpl;
595 cl = (lpl < cl) + hpl;
660 retval = low_limb >> tnc;
661 high_limb = (low_limb << cnt);
666 *--
rp = high_limb | (low_limb >> tnc);
667 high_limb = (low_limb << cnt);
687 retval = (high_limb << tnc);
688 low_limb = high_limb >> cnt;
693 *
rp++ = low_limb | (high_limb << tnc);
694 low_limb = high_limb >> cnt;
708 assert (0 <=
i &&
i <= un );
871 m -= ((r >
u1) | ((r ==
u1) & (tl > u0)));
896 inv->
d1 = d << shift;
980 if ((inv->
shift > 0) && (
tp != qp))
983 return r >> inv->
shift;
1060 if (n1 == d1 && n0 == d0)
1080 n1 += d1 +
mpn_add_n (np +
i, np +
i, dp, dn - 1);
1110 assert (inv->
d1 == dp[dn-1]);
1111 assert (inv->
d0 == dp[dn-2]);
1137 if (dn > 2 && inv.
shift > 0)
1183 for (exp = 1, p = b; p <= m; exp++)
1211 mask = (1U << bits) - 1;
1213 for (
i = 0,
j = sn, shift = 0;
j-- > 0;)
1215 unsigned char digit =
up[
i] >> shift;
1222 digit |=
up[
i] << (bits - shift);
1224 sp[
j] = digit & mask;
1236 for (
i = 0;
w > 0;
i++)
1275 un -= (
up[un-1] == 0);
1278 for (sn += done; done < info->
exp; done++)
1286 for (
i = 0; 2*
i + 1 < sn;
i++)
1288 unsigned char t =
sp[
i];
1302 assert (
up[un-1] > 0);
1324 for (
j = sn, rn = 0, shift = 0;
j-- > 0; )
1360 k = 1 + (sn - 1) % info->
exp;
1365 w =
w * b +
sp[
j++];
1369 for (rn = 1;
j < sn;)
1374 for (
k = 1;
k < info->
exp;
k++)
1375 w =
w * b +
sp[
j++];
1416 r->_mp_d = (
mp_ptr) &dummy_limb;
1426 bits -= (bits != 0);
1450 r->_mp_alloc = size;
1452 if (
GMP_ABS (r->_mp_size) > size)
1459 #define MPZ_REALLOC(z,n) ((n) > (z)->_mp_alloc \
1460 ? mpz_realloc(z,n) \
1492 while (
x >>= LOCAL_GMP_LIMB_BITS)
1516 r->_mp_size =
x->_mp_size;
1556 return un <= ulongsize || (
up[ulongsize] < ulongrem && un == ulongsize + 1);
1576 return u->_mp_size >= 0 &&
mpz_cmpabs_ui (u, UINT_MAX) <= 0;
1588 return u->_mp_size >= 0 &&
mpz_cmpabs_ui (u, USHRT_MAX) <= 0;
1595 unsigned long c = -LONG_MAX - LONG_MIN;
1597 if (u->_mp_size < 0)
1599 return -(long) c - (
long) ((r - c) & LONG_MAX);
1601 return (
long) (r & LONG_MAX);
1610 unsigned long r = 0;
1614 r = (r << LOCAL_GMP_LIMB_BITS) + u->_mp_d[n];
1618 return u->_mp_size == 0 ? 0 : u->_mp_d[0];
1630 if (n >= 0 && n <
GMP_ABS (u->_mp_size))
1666 x->_mp_size = xs < 0 ? -xn : xn;
1700 if (
x !=
x ||
x ==
x * 0.5)
1717 for (rn = 1;
x >=
B; rn++)
1736 r->_mp_size = sign ? - rn : rn;
1766 for (
x = l; --un >= 0;)
1778 if (u->_mp_size < 0)
1802 for (
i = 1;
i < xn;
i++)
1809 for (
i = xn;
i-- > 0;)
1828 if (
x->_mp_size < 0)
1849 return GMP_CMP (u->_mp_size, 0);
1859 else if (usize >= 0)
1883 return (asize < bsize) ? -1 : 1;
1884 else if (asize >= 0)
1885 return mpn_cmp (a->_mp_d, b->_mp_d, asize);
1887 return mpn_cmp (b->_mp_d, a->_mp_d, -asize);
1915 r->_mp_size =
GMP_ABS (r->_mp_size);
1922 r->_mp_size = -r->_mp_size;
1975 cy =
mpn_add (
rp, a->_mp_d, an, b->_mp_d, bn);
1990 cmp =
mpn_cmp4 (a->_mp_d, an, b->_mp_d, bn);
2012 if ( (a->_mp_size ^ b->_mp_size) >= 0)
2017 r->_mp_size = a->_mp_size >= 0 ? rn : - rn;
2025 if ( (a->_mp_size ^ b->_mp_size) >= 0)
2030 r->_mp_size = a->_mp_size >= 0 ? rn : - rn;
2068 if (un == 0 || vn == 0)
2074 sign = (un ^ vn) < 0;
2088 rn -=
tp[rn-1] == 0;
2090 t->_mp_size = sign ? - rn : rn;
2113 rn = un + limbs + (shift > 0);
2126 r->_mp_size = (u->_mp_size < 0) ? - rn : rn;
2183 gmp_die(
"mpz_div_qr: Divide by zero.");
2250 qn -= (qp[qn-1] == 0);
2252 tq->_mp_size = qs < 0 ? -qn : qn;
2255 tr->_mp_size = ns < 0 ? - rn : rn;
2370 || (u->_mp_d[limb_cnt]
2383 mpn_rshift (qp, u->_mp_d + limb_cnt, qn, bit_index);
2384 qn -= qp[qn - 1] == 0;
2388 mpn_copyi (qp, u->_mp_d + limb_cnt, qn);
2409 if (us == 0 || bit_index == 0)
2432 for (
i = un;
i < rn - 1;
i++)
2452 rp[rn-1] = u->_mp_d[rn-1] & mask;
2467 r->_mp_size = us < 0 ? -rn : rn;
2536 static unsigned long
2651 assert ( (u |
v) > 0);
2666 while ( (
v & 1) == 0)
2676 while ( (u & 1) == 0);
2683 while ( (
v & 1) == 0);
2711 assert (r->_mp_size > 0);
2725 if (u->_mp_size == 0)
2730 if (
v->_mp_size == 0)
2745 if (tu->_mp_size < tv->_mp_size)
2749 if (tu->_mp_size == 0)
2768 if (tv->_mp_size == 1)
2789 if (u->_mp_size == 0)
2801 if (
v->_mp_size == 0)
2804 signed long sign =
mpz_sgn (u);
2830 if (tu->_mp_size < tv->_mp_size)
2868 if (tu->_mp_size > 0)
2946 if (u->_mp_size < 0)
2948 if (
v->_mp_size < 0)
2970 if (u->_mp_size == 0 ||
v->_mp_size == 0)
2989 if (
v == 0 || u->_mp_size == 0)
3018 if (tr->_mp_size < 0)
3020 if (m->_mp_size >= 0)
3081 gmp_die (
"mpz_powm: Zero modulo.");
3106 if (e->_mp_size < 0)
3109 gmp_die (
"mpz_powm: Negative exponent and non-invertible base.");
3116 bn = base->_mp_size;
3126 if (b->_mp_size < 0)
3147 if (tr->_mp_size > mn)
3158 if (tr->_mp_size >= mn)
3190 if ((~z & sgn) != 0)
3191 gmp_die (
"mpz_rootrem: Negative argument, with even root.");
3193 gmp_die (
"mpz_rootrem: Zeroth root.");
3251 res = r->_mp_size == 0;
3273 if (u->_mp_size <= 0)
3274 return (u->_mp_size == 0);
3285 assert (p [n-1] != 0);
3296 assert (p [n-1] != 0);
3302 assert (s->_mp_size == (n+1)/2);
3318 if (m + 1 < 2)
return;
3343 k = (
k <= n) ? n -
k : 0;
3380 bit ^= c & (b ^ (b >> 1));
3384 return bit & 1 ? -1 : 1;
3425 assert (Q <= - (LONG_MIN / 2));
3426 assert (Q >= - (LONG_MAX / 2));
3466 res = U->_mp_size == 0;
3493 maxD = (Qk->_mp_size == 1) ? Qk->_mp_d [0] - 1 :
GMP_LIMB_MAX;
3515 Q = (
D & 2) ? (
long) (
D >> 2) + 1 : -(
long) (
D >> 2);
3518 while (V->_mp_size != 0 && --b0 != 0)
3554 #define GMP_PRIME_PRODUCT \
3555 (3UL*5UL*7UL*11UL*13UL*17UL*19UL*23UL*29UL)
3558 #define GMP_PRIME_MASK 0xc96996dcUL
3576 assert (n->_mp_size != 0);
3607 for (
j = 0; is_prime & (
j < reps);
j++)
3664 if (limb_index >= dn)
3668 w = d->_mp_d[limb_index];
3677 while (--limb_index >= 0)
3678 if (d->_mp_d[limb_index] > 0)
3696 if (limb_index >= dn)
3703 dp[limb_index] = bit;
3704 for (
i = dn;
i < limb_index;
i++)
3706 dn = limb_index + 1;
3714 cy =
mpn_add_1 (dp + limb_index, dp + limb_index, dn - limb_index, bit);
3722 d->_mp_size = (d->_mp_size < 0) ? - dn : dn;
3738 assert (limb_index < dn);
3741 dn - limb_index, bit));
3743 d->_mp_size = (d->_mp_size < 0) ? - dn : dn;
3751 if (d->_mp_size >= 0)
3763 if (d->_mp_size >= 0)
3773 if (
mpz_tstbit (d, bit_index) ^ (d->_mp_size < 0))
3809 uc = u->_mp_size < 0;
3810 vc =
v->_mp_size < 0;
3828 ul = (
up[
i] ^ ux) + uc;
3831 vl = (
vp[
i] ^ vx) + vc;
3834 rl = ( (ul & vl) ^ rx) + rc;
3843 ul = (
up[
i] ^ ux) + uc;
3846 rl = ( (ul & vx) ^ rx) + rc;
3855 r->_mp_size = rx ? -rn : rn;
3881 uc = u->_mp_size < 0;
3882 vc =
v->_mp_size < 0;
3901 ul = (
up[
i] ^ ux) + uc;
3904 vl = (
vp[
i] ^ vx) + vc;
3907 rl = ( (ul | vl) ^ rx) + rc;
3916 ul = (
up[
i] ^ ux) + uc;
3919 rl = ( (ul | vx) ^ rx) + rc;
3928 r->_mp_size = rx ? -rn : rn;
3954 uc = u->_mp_size < 0;
3955 vc =
v->_mp_size < 0;
3970 ul = (
up[
i] ^ ux) + uc;
3973 vl = (
vp[
i] ^ vx) + vc;
3976 rl = (ul ^ vl ^ rx) + rc;
3985 ul = (
up[
i] ^ ux) + uc;
3988 rl = (ul ^ ux) + rc;
3997 r->_mp_size = rx ? -un : un;
4006 int LOCAL_SHIFT_BITS = 16;
4009 unsigned w =
x - ((
x >> 1) & 0x5555);
4010 w = ((
w >> 2) & 0x3333) + (
w & 0x3333);
4012 w = ((
w >> 8) & 0x000f) + (
w & 0x000f);
4015 x >>= LOCAL_SHIFT_BITS;
4028 for (c = 0,
i = 0;
i < n;
i++)
4061 comp = - (uc = vc = (un < 0));
4075 for (
i = 0, c = 0;
i < vn;
i++)
4077 ul = (
up[
i] ^ comp) + uc;
4080 vl = (
vp[
i] ^ comp) + vc;
4089 ul = (
up[
i] ^ comp) + uc;
4112 return (us >= 0 ? ~(
mp_bitcnt_t) 0 : starting_bit);
4118 if (starting_bit != 0)
4123 limb = ~~ limb + ux;
4177 assert (base <= 62);
4191 return (bits + 1) / 2;
4193 return (bits + 2) / 3;
4195 return (bits + 3) / 4;
4197 return (bits + 4) / 5;
4211 un -= (
tp[un-1] == 0);
4227 digits =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
4231 digits =
"0123456789abcdefghijklmnopqrstuvwxyz";
4235 else if (base >= -1)
4259 if (u->_mp_size < 0)
4281 sp[
i] = digits[(
unsigned char)
sp[
i]];
4290 unsigned bits, value_of_a;
4297 assert (base == 0 || (base >= 2 && base <= 62));
4299 while (isspace( (
unsigned char) *
sp))
4302 sign = (*
sp ==
'-');
4309 if (
sp[1] ==
'x' ||
sp[1] ==
'X')
4314 else if (
sp[1] ==
'b' ||
sp[1] ==
'B')
4333 value_of_a = (base > 36) ? 36 : 10;
4334 for (dn = 0; *
sp;
sp++)
4338 if (isspace ((
unsigned char) *
sp))
4340 else if (*
sp >=
'0' && *
sp <=
'9')
4342 else if (*
sp >=
'a' && *
sp <=
'z')
4343 digit = *
sp -
'a' + value_of_a;
4344 else if (*
sp >=
'A' && *
sp <=
'Z')
4345 digit = *
sp -
'A' + 10;
4349 if (digit >= (
unsigned) base)
4377 alloc = (dn + info.
exp - 1) / info.
exp;
4382 rn -=
rp[rn-1] == 0;
4384 assert (rn <= alloc);
4387 r->_mp_size = sign ? - rn : rn;
4407 len = fwrite (str, 1, len, stream);
4416 static const int i = 2;
4417 const unsigned char *p = (
const unsigned char *) &
i;
4424 size_t nails,
const void *src)
4426 const unsigned char *p;
4427 ptrdiff_t word_step;
4440 gmp_die (
"mpz_import: Nails not supported.");
4442 assert (order == 1 || order == -1);
4443 assert (endian >= -1 && endian <= 1);
4448 p = (
unsigned char *) src;
4450 word_step = (order != endian) ? 2 * size : 0;
4456 p += size * (count - 1);
4457 word_step = - word_step;
4467 for (limb = 0, bytes = 0,
i = 0; count > 0; count--, p += word_step)
4470 for (
j = 0;
j < size;
j++, p -= (ptrdiff_t) endian)
4472 limb |= (
mp_limb_t) *p << (bytes++ * CHAR_BIT);
4481 assert (
i + (bytes > 0) == rn);
4491 mpz_export (
void *r,
size_t *countp,
int order,
size_t size,
int endian,
4492 size_t nails,
const mpz_t u)
4498 gmp_die (
"mpz_import: Nails not supported.");
4500 assert (order == 1 || order == -1);
4501 assert (endian >= -1 && endian <= 1);
4502 assert (size > 0 || u->_mp_size == 0);
4510 ptrdiff_t word_step;
4521 limb = u->_mp_d[un-1];
4528 int LOCAL_CHAR_BIT = CHAR_BIT;
4529 k++; limb >>= LOCAL_CHAR_BIT;
4530 }
while (limb != 0);
4534 count = (
k + (un-1) *
sizeof (
mp_limb_t) + size - 1) / size;
4542 p = (
unsigned char *) r;
4544 word_step = (order != endian) ? 2 * size : 0;
4550 p += size * (count - 1);
4551 word_step = - word_step;
4558 for (bytes = 0,
i = 0,
k = 0;
k < count;
k++, p += word_step)
4561 for (
j = 0;
j < size; ++
j, p -= (ptrdiff_t) endian)
4572 int LOCAL_CHAR_BIT = CHAR_BIT;
4576 limb = u->_mp_d[
i++];
4580 limb >>= LOCAL_CHAR_BIT;
4586 assert (
k == count);
#define GMP_ULONG_HIGHBIT
void mpz_and(mpz_t r, const mpz_t u, const mpz_t v)
void mpz_clrbit(mpz_t d, mp_bitcnt_t bit_index)
void mpz_sqrtrem(mpz_t s, mpz_t r, const mpz_t u)
int mpz_cmp_ui(const mpz_t u, unsigned long v)
int mpz_fits_ulong_p(const mpz_t u)
mp_size_t mpn_set_str(mp_ptr rp, const unsigned char *sp, size_t sn, int base)
void mpz_tdiv_q_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
#define gmp_udiv_qr_3by2(q, r1, r0, n2, n1, n0, d1, d0, dinv)
void mpz_tdiv_r(mpz_t r, const mpz_t n, const mpz_t d)
#define gmp_clz(count, x)
void mpn_copyd(mp_ptr d, mp_srcptr s, mp_size_t n)
static int gmp_millerrabin(const mpz_t n, const mpz_t nm1, mpz_t y, const mpz_t q, mp_bitcnt_t k)
int mpz_cmpabs(const mpz_t u, const mpz_t v)
int mpz_set_str(mpz_t r, const char *sp, int base)
void mpz_realloc2(mpz_t x, mp_bitcnt_t n)
unsigned long mpz_fdiv_qr_ui(mpz_t q, mpz_t r, const mpz_t n, unsigned long d)
void mpn_copyi(mp_ptr d, mp_srcptr s, mp_size_t n)
int mpz_fits_uint_p(const mpz_t u)
mp_limb_t mpn_add_1(mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
#define gmp_umul_ppmm(w1, w0, u, v)
static size_t mpn_limb_get_str(unsigned char *sp, mp_limb_t w, const struct gmp_div_inverse *binv)
int mpz_perfect_square_p(const mpz_t u)
int mpz_fits_sshort_p(const mpz_t u)
static size_t mpn_get_str_other(unsigned char *sp, int base, const struct mpn_base_info *info, mp_ptr up, mp_size_t un)
unsigned long mpz_tdiv_q_ui(mpz_t q, const mpz_t n, unsigned long d)
static int mpz_div_qr(mpz_t q, mpz_t r, const mpz_t n, const mpz_t d, enum mpz_div_round_mode mode)
int mpz_init_set_str(mpz_t r, const char *sp, int base)
unsigned long mpz_gcd_ui(mpz_t g, const mpz_t u, unsigned long v)
mp_bitcnt_t mpz_popcount(const mpz_t u)
#define MPZ_SRCPTR_SWAP(x, y)
void mpz_ui_sub(mpz_t r, unsigned long a, const mpz_t b)
void mpz_init_set_ui(mpz_t r, unsigned long int x)
static mp_size_t mpn_normalized_size(mp_srcptr xp, mp_size_t n)
static mp_ptr mpz_realloc(mpz_t r, mp_size_t size)
static int gmp_jacobi_coprime(mp_limb_t a, mp_limb_t b)
mp_limb_t mpn_mul_1(mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
static void gmp_default_free(void *p, size_t unused_size)
static unsigned long mpz_div_qr_ui(mpz_t q, mpz_t r, const mpz_t n, unsigned long d, enum mpz_div_round_mode mode)
void mpz_sub_ui(mpz_t r, const mpz_t a, unsigned long b)
#define MPZ_PTR_SWAP(x, y)
void mpz_init2(mpz_t r, mp_bitcnt_t bits)
#define GMP_NEG_CAST(T, x)
static mp_bitcnt_t mpn_common_scan(mp_limb_t limb, mp_size_t i, mp_srcptr up, mp_size_t un, mp_limb_t ux)
int mpz_fits_sint_p(const mpz_t u)
mp_limb_t mpn_neg(mp_ptr rp, mp_srcptr up, mp_size_t n)
void mpz_init_set(mpz_t r, const mpz_t x)
void mpz_cdiv_q_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
#define gmp_ctz(count, x)
static mp_ptr gmp_xrealloc_limbs(mp_ptr old, mp_size_t size)
void mpz_mul_ui(mpz_t r, const mpz_t u, unsigned long int v)
unsigned long mpz_tdiv_ui(const mpz_t n, unsigned long d)
void mpz_tdiv_r_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
void mpz_combit(mpz_t d, mp_bitcnt_t bit_index)
void mpz_mod(mpz_t r, const mpz_t n, const mpz_t d)
#define MPZ_REALLOC(z, n)
unsigned long mpz_fdiv_q_ui(mpz_t q, const mpz_t n, unsigned long d)
void mpz_limbs_finish(mpz_t x, mp_size_t xs)
void mpz_add(mpz_t r, const mpz_t a, const mpz_t b)
void mpn_mul_n(mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
unsigned long mpz_tdiv_qr_ui(mpz_t q, mpz_t r, const mpz_t n, unsigned long d)
static int gmp_detect_endian(void)
#define MP_LIMB_T_SWAP(x, y)
static void * gmp_default_realloc(void *old, size_t unused_old_size, size_t new_size)
long int mpz_get_si(const mpz_t u)
mp_bitcnt_t mpn_scan1(mp_srcptr ptr, mp_bitcnt_t bit)
void mpz_submul_ui(mpz_t r, const mpz_t u, unsigned long int v)
void mpz_cdiv_q(mpz_t q, const mpz_t n, const mpz_t d)
void mpz_lcm_ui(mpz_t r, const mpz_t u, unsigned long v)
void mpz_mfac_uiui(mpz_t x, unsigned long n, unsigned long m)
void mpz_fdiv_q_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
void mpz_set_ui(mpz_t r, unsigned long int x)
mp_limb_t mpn_rshift(mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
static int gmp_lucas_mod(mpz_t V, mpz_t Qk, long Q, mp_bitcnt_t b0, const mpz_t n)
int mpz_divisible_p(const mpz_t n, const mpz_t d)
mp_srcptr mpz_limbs_read(mpz_srcptr x)
#define gmp_udiv_qrnnd_preinv(q, r, nh, nl, d, di)
int mpz_fits_slong_p(const mpz_t u)
static void mpn_div_qr_preinv(mp_ptr qp, mp_ptr np, mp_size_t nn, mp_srcptr dp, mp_size_t dn, const struct gmp_div_inverse *inv)
int mpz_divisible_ui_p(const mpz_t n, unsigned long d)
void mpz_import(mpz_t r, size_t count, int order, size_t size, int endian, size_t nails, const void *src)
void mpz_abs(mpz_t r, const mpz_t u)
size_t mpz_sizeinbase(const mpz_t u, int base)
mp_limb_t mpn_sub_n(mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
void mpz_setbit(mpz_t d, mp_bitcnt_t bit_index)
#define gmp_assert_nocarry(x)
mp_limb_t mpn_add_n(mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
void mpz_gcd(mpz_t g, const mpz_t u, const mpz_t v)
mp_bitcnt_t mpz_scan1(const mpz_t u, mp_bitcnt_t starting_bit)
unsigned long mpz_mod_ui(mpz_t r, const mpz_t n, unsigned long d)
void mpz_powm_ui(mpz_t r, const mpz_t b, unsigned long elimb, const mpz_t m)
void mpz_addmul(mpz_t r, const mpz_t u, const mpz_t v)
void mpz_cdiv_r_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
void mpz_pow_ui(mpz_t r, const mpz_t b, unsigned long e)
void mpz_fdiv_q(mpz_t q, const mpz_t n, const mpz_t d)
void mp_set_memory_functions(void *(*alloc_func)(size_t), void *(*realloc_func)(void *, size_t, size_t), void(*free_func)(void *, size_t))
unsigned long mpz_cdiv_qr_ui(mpz_t q, mpz_t r, const mpz_t n, unsigned long d)
static void *(* gmp_reallocate_func)(void *, size_t, size_t)
int mpz_congruent_p(const mpz_t a, const mpz_t b, const mpz_t m)
int mpz_cmpabs_ui(const mpz_t u, unsigned long v)
char * mpz_get_str(char *sp, int base, const mpz_t u)
#define MP_PTR_SWAP(x, y)
void mpz_powm(mpz_t r, const mpz_t b, const mpz_t e, const mpz_t m)
int mpz_invert(mpz_t r, const mpz_t u, const mpz_t m)
static int mpn_absfits_ulong_p(mp_srcptr up, mp_size_t un)
mp_bitcnt_t mpn_scan0(mp_srcptr ptr, mp_bitcnt_t bit)
static mp_size_t mpn_set_str_other(mp_ptr rp, const unsigned char *sp, size_t sn, mp_limb_t b, const struct mpn_base_info *info)
void mpn_sqr(mp_ptr rp, mp_srcptr ap, mp_size_t n)
#define GMP_MPN_OVERLAP_P(xp, xsize, yp, ysize)
#define GMP_PRIME_PRODUCT
static void mpz_abs_sub_bit(mpz_t d, mp_bitcnt_t bit_index)
static void mpn_div_qr_invert(struct gmp_div_inverse *inv, mp_srcptr dp, mp_size_t dn)
static unsigned mpn_base_power_of_two_p(unsigned b)
static void mpz_abs_add_bit(mpz_t d, mp_bitcnt_t bit_index)
void * mpz_export(void *r, size_t *countp, int order, size_t size, int endian, size_t nails, const mpz_t u)
void mpz_bin_uiui(mpz_t r, unsigned long n, unsigned long k)
mp_limb_t mpn_sub(mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
static mp_size_t mpn_set_str_bits(mp_ptr rp, const unsigned char *sp, size_t sn, unsigned bits)
void mpz_add_ui(mpz_t r, const mpz_t a, unsigned long b)
unsigned long mpz_tdiv_r_ui(mpz_t r, const mpz_t n, unsigned long d)
#define MP_BITCNT_T_SWAP(x, y)
mpz_srcptr mpz_roinit_n(mpz_t x, mp_srcptr xp, mp_size_t xs)
double mpz_get_d(const mpz_t u)
#define MPN_SRCPTR_SWAP(xp, xs, yp, ys)
static mp_size_t mpz_abs_add(mpz_t r, const mpz_t a, const mpz_t b)
static mp_size_t mpz_abs_sub(mpz_t r, const mpz_t a, const mpz_t b)
int mpn_cmp(mp_srcptr ap, mp_srcptr bp, mp_size_t n)
void mpz_ior(mpz_t r, const mpz_t u, const mpz_t v)
void mpz_mul_si(mpz_t r, const mpz_t u, long int v)
void mpz_mul(mpz_t r, const mpz_t u, const mpz_t v)
int mpz_cmpabs_d(const mpz_t x, double d)
mp_bitcnt_t mpz_scan0(const mpz_t u, mp_bitcnt_t starting_bit)
static void mpn_div_qr_1_invert(struct gmp_div_inverse *inv, mp_limb_t d)
size_t mpn_get_str(unsigned char *sp, int base, mp_ptr up, mp_size_t un)
mp_limb_t mpn_lshift(mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
int mpz_sgn(const mpz_t u)
static void mpz_div_r_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t bit_index, enum mpz_div_round_mode mode)
void mpz_sqrt(mpz_t s, const mpz_t u)
static mp_bitcnt_t mpz_make_odd(mpz_t r)
void mpz_fdiv_r(mpz_t r, const mpz_t n, const mpz_t d)
void mpz_fac_ui(mpz_t x, unsigned long n)
void mpn_zero(mp_ptr rp, mp_size_t n)
mp_ptr mpz_limbs_modify(mpz_t x, mp_size_t n)
void mpz_set_d(mpz_t r, double x)
mp_limb_t mpn_submul_1(mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
unsigned long mpz_cdiv_ui(const mpz_t n, unsigned long d)
mp_size_t mpn_sqrtrem(mp_ptr sp, mp_ptr rp, mp_srcptr p, mp_size_t n)
int mpn_zero_p(mp_srcptr rp, mp_size_t n)
int mpz_fits_ushort_p(const mpz_t u)
void mpz_tdiv_qr(mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
void mpz_com(mpz_t r, const mpz_t u)
void mpz_cdiv_r(mpz_t r, const mpz_t n, const mpz_t d)
static void mpn_div_qr_pi1(mp_ptr qp, mp_ptr np, mp_size_t nn, mp_limb_t n1, mp_srcptr dp, mp_size_t dn, mp_limb_t dinv)
int mpz_tstbit(const mpz_t d, mp_bitcnt_t bit_index)
void mpn_com(mp_ptr rp, mp_srcptr up, mp_size_t n)
void mpz_divexact_ui(mpz_t q, const mpz_t n, unsigned long d)
void mpz_2fac_ui(mpz_t x, unsigned long n)
void mpz_swap(mpz_t u, mpz_t v)
mp_limb_t mpn_mul(mp_ptr rp, mp_srcptr up, mp_size_t un, mp_srcptr vp, mp_size_t vn)
static void *(* gmp_allocate_func)(size_t)
mp_limb_t mpn_sub_1(mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
static void mpn_div_qr(mp_ptr qp, mp_ptr np, mp_size_t nn, mp_srcptr dp, mp_size_t dn)
mp_bitcnt_t mpz_hamdist(const mpz_t u, const mpz_t v)
void mpz_lcm(mpz_t r, const mpz_t u, const mpz_t v)
void mpz_fdiv_r_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
void mpz_init_set_d(mpz_t r, double x)
int mpz_probab_prime_p(const mpz_t n, int reps)
void mpz_sub(mpz_t r, const mpz_t a, const mpz_t b)
void mpz_set_si(mpz_t r, signed long int x)
int mpz_root(mpz_t x, const mpz_t y, unsigned long z)
static void mpz_div_q_2exp(mpz_t q, const mpz_t u, mp_bitcnt_t bit_index, enum mpz_div_round_mode mode)
static mp_ptr gmp_xalloc_limbs(mp_size_t size)
size_t mpz_out_str(FILE *stream, int base, const mpz_t x)
static void mpn_div_qr_2_invert(struct gmp_div_inverse *inv, mp_limb_t d1, mp_limb_t d0)
void mpz_gcdext(mpz_t g, mpz_t s, mpz_t t, const mpz_t u, const mpz_t v)
unsigned long mpz_cdiv_q_ui(mpz_t q, const mpz_t n, unsigned long d)
void mp_get_memory_functions(void *(**alloc_func)(size_t), void *(**realloc_func)(void *, size_t, size_t), void(**free_func)(void *, size_t))
const int mp_bits_per_limb
static void * gmp_default_alloc(size_t size)
static unsigned gmp_popcount_limb(mp_limb_t x)
mp_limb_t mpn_invert_3by2(mp_limb_t u1, mp_limb_t u0)
void mpz_init_set_si(mpz_t r, signed long int x)
static int mpn_cmp4(mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
unsigned long int mpz_get_ui(const mpz_t u)
unsigned long mpz_fdiv_r_ui(mpz_t r, const mpz_t n, unsigned long d)
mp_limb_t mpn_add(mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
size_t mpz_size(const mpz_t u)
unsigned long mpz_cdiv_r_ui(mpz_t r, const mpz_t n, unsigned long d)
static void mpn_get_base_info(struct mpn_base_info *info, mp_limb_t b)
mp_ptr mpz_limbs_write(mpz_t x, mp_size_t n)
unsigned long mpz_fdiv_ui(const mpz_t n, unsigned long d)
void mpz_set(mpz_t r, const mpz_t x)
static void gmp_die(const char *msg)
void mpz_neg(mpz_t r, const mpz_t u)
static void gmp_lucas_step_k_2k(mpz_t V, mpz_t Qk, const mpz_t n)
void mpz_mul_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t bits)
static mp_limb_t mpn_div_qr_1_preinv(mp_ptr qp, mp_srcptr np, mp_size_t nn, const struct gmp_div_inverse *inv)
void mpz_fdiv_qr(mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
mp_limb_t mpn_addmul_1(mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
#define GMP_DBL_MANT_BITS
static mpz_srcptr mpz_roinit_normal_n(mpz_t x, mp_srcptr xp, mp_size_t xs)
int mpn_perfect_square_p(mp_srcptr p, mp_size_t n)
void mpz_divexact(mpz_t q, const mpz_t n, const mpz_t d)
int mpz_cmp_si(const mpz_t u, long v)
void mpz_xor(mpz_t r, const mpz_t u, const mpz_t v)
static void(* gmp_free_func)(void *, size_t)
void mpz_tdiv_q(mpz_t q, const mpz_t n, const mpz_t d)
mp_limb_t mpz_getlimbn(const mpz_t u, mp_size_t n)
int mpz_cmp(const mpz_t a, const mpz_t b)
static mp_limb_t mpn_gcd_11(mp_limb_t u, mp_limb_t v)
int mpz_cmp_d(const mpz_t x, double d)
void mpz_ui_pow_ui(mpz_t r, unsigned long blimb, unsigned long e)
static mp_bitcnt_t mpn_limb_size_in_base_2(mp_limb_t u)
void mpz_submul(mpz_t r, const mpz_t u, const mpz_t v)
static size_t mpn_get_str_bits(unsigned char *sp, unsigned bits, mp_srcptr up, mp_size_t un)
void mpz_rootrem(mpz_t x, mpz_t r, const mpz_t y, unsigned long z)
#define MP_SIZE_T_SWAP(x, y)
static void mpn_div_qr_2_preinv(mp_ptr qp, mp_ptr np, mp_size_t nn, const struct gmp_div_inverse *inv)
void mpz_cdiv_qr(mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
void mpz_addmul_ui(mpz_t r, const mpz_t u, unsigned long int v)
mp_bitcnt_t mpn_popcount(mp_srcptr p, mp_size_t n)
static int gmp_stronglucas(const mpz_t x, mpz_t Qk)
unsigned long mp_bitcnt_t
const mp_limb_t * mp_srcptr
#define mpn_invert_limb(x)
static void g(uint64_t *h, uint64_t *m, uint64_t *N)