QtBigInt
Loading...
Searching...
No Matches
mini-gmp.c
Go to the documentation of this file.
1/* mini-gmp, a minimalistic implementation of a GNU GMP subset.
2
3 Contributed to the GNU project by Niels Möller
4
5Copyright 1991-1997, 1999-2016 Free Software Foundation, Inc.
6
7This file is part of the GNU MP Library.
8
9The GNU MP Library is free software; you can redistribute it and/or modify
10it under the terms of either:
11
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.
15
16or
17
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.
21
22or both in parallel, as here.
23
24The GNU MP Library is distributed in the hope that it will be useful, but
25WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
26or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
27for more details.
28
29You should have received copies of the GNU General Public License and the
30GNU Lesser General Public License along with the GNU MP Library. If not,
31see https://www.gnu.org/licenses/. */
32
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. */
36
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. */
43
44#include <assert.h>
45#include <ctype.h>
46#include <limits.h>
47#include <stdio.h>
48#include <stdlib.h>
49#include <string.h>
50
51#include "mini-gmp.h"
52
53
54/* Macros */
55#define GMP_LIMB_BITS (sizeof(mp_limb_t) * CHAR_BIT)
56
57#define GMP_LIMB_MAX (~ (mp_limb_t) 0)
58#define GMP_LIMB_HIGHBIT ((mp_limb_t) 1 << (GMP_LIMB_BITS - 1))
59
60#define GMP_HLIMB_BIT ((mp_limb_t) 1 << (GMP_LIMB_BITS / 2))
61#define GMP_LLIMB_MASK (GMP_HLIMB_BIT - 1)
62
63#define GMP_ULONG_BITS (sizeof(uIntMpz) * CHAR_BIT)
64#define GMP_ULONG_HIGHBIT ((uIntMpz) 1 << (GMP_ULONG_BITS - 1))
65
66#define GMP_ABS(x) ((x) >= 0 ? (x) : -(x))
67#define GMP_NEG_CAST(T,x) (-((T)((x) + 1) - 1))
68
69#define GMP_MIN(a, b) ((a) < (b) ? (a) : (b))
70#define GMP_MAX(a, b) ((a) > (b) ? (a) : (b))
71
72#define GMP_CMP(a,b) (((a) > (b)) - ((a) < (b)))
73
74#define gmp_assert_nocarry(x) do { \
75 mp_limb_t __cy = (x); \
76 assert (__cy == 0); \
77 } while (0)
78
79#define gmp_clz(count, x) do { \
80 mp_limb_t __clz_x = (x); \
81 unsigned __clz_c; \
82 for (__clz_c = 0; \
83 (__clz_x & ((mp_limb_t) 0xff << (GMP_LIMB_BITS - 8))) == 0; \
84 __clz_c += 8) \
85 __clz_x <<= 8; \
86 for (; (__clz_x & GMP_LIMB_HIGHBIT) == 0; __clz_c++) \
87 __clz_x <<= 1; \
88 (count) = __clz_c; \
89 } while (0)
90
91#define gmp_ctz(count, x) do { \
92 mp_limb_t __ctz_x = (x); \
93 unsigned __ctz_c = 0; \
94 gmp_clz (__ctz_c, __ctz_x & - __ctz_x); \
95 (count) = GMP_LIMB_BITS - 1 - __ctz_c; \
96 } while (0)
97
98#define gmp_add_ssaaaa(sh, sl, ah, al, bh, bl) \
99 do { \
100 mp_limb_t __x; \
101 __x = (al) + (bl); \
102 (sh) = (ah) + (bh) + (__x < (al)); \
103 (sl) = __x; \
104 } while (0)
105
106#define gmp_sub_ddmmss(sh, sl, ah, al, bh, bl) \
107 do { \
108 mp_limb_t __x; \
109 __x = (al) - (bl); \
110 (sh) = (ah) - (bh) - ((al) < (bl)); \
111 (sl) = __x; \
112 } while (0)
113
114#define gmp_umul_ppmm(w1, w0, u, v) \
115 do { \
116 mp_limb_t __x0, __x1, __x2, __x3; \
117 unsigned __ul, __vl, __uh, __vh; \
118 mp_limb_t __u = (u), __v = (v); \
119 \
120 __ul = __u & GMP_LLIMB_MASK; \
121 __uh = __u >> (GMP_LIMB_BITS / 2); \
122 __vl = __v & GMP_LLIMB_MASK; \
123 __vh = __v >> (GMP_LIMB_BITS / 2); \
124 \
125 __x0 = (mp_limb_t) __ul * __vl; \
126 __x1 = (mp_limb_t) __ul * __vh; \
127 __x2 = (mp_limb_t) __uh * __vl; \
128 __x3 = (mp_limb_t) __uh * __vh; \
129 \
130 __x1 += __x0 >> (GMP_LIMB_BITS / 2);/* this can't give carry */ \
131 __x1 += __x2; /* but this indeed can */ \
132 if (__x1 < __x2) /* did we get it? */ \
133 __x3 += GMP_HLIMB_BIT; /* yes, add it in the proper pos. */ \
134 \
135 (w1) = __x3 + (__x1 >> (GMP_LIMB_BITS / 2)); \
136 (w0) = (__x1 << (GMP_LIMB_BITS / 2)) + (__x0 & GMP_LLIMB_MASK); \
137 } while (0)
138
139#define gmp_udiv_qrnnd_preinv(q, r, nh, nl, d, di) \
140 do { \
141 mp_limb_t _qh, _ql, _r, _mask; \
142 gmp_umul_ppmm (_qh, _ql, (nh), (di)); \
143 gmp_add_ssaaaa (_qh, _ql, _qh, _ql, (nh) + 1, (nl)); \
144 _r = (nl) - _qh * (d); \
145 _mask = -(mp_limb_t) (_r > _ql); /* both > and >= are OK */ \
146 _qh += _mask; \
147 _r += _mask & (d); \
148 if (_r >= (d)) \
149 { \
150 _r -= (d); \
151 _qh++; \
152 } \
153 \
154 (r) = _r; \
155 (q) = _qh; \
156 } while (0)
157
158#define gmp_udiv_qr_3by2(q, r1, r0, n2, n1, n0, d1, d0, dinv) \
159 do { \
160 mp_limb_t _q0, _t1, _t0, _mask; \
161 gmp_umul_ppmm ((q), _q0, (n2), (dinv)); \
162 gmp_add_ssaaaa ((q), _q0, (q), _q0, (n2), (n1)); \
163 \
164 /* Compute the two most significant limbs of n - q'd */ \
165 (r1) = (n1) - (d1) * (q); \
166 gmp_sub_ddmmss ((r1), (r0), (r1), (n0), (d1), (d0)); \
167 gmp_umul_ppmm (_t1, _t0, (d0), (q)); \
168 gmp_sub_ddmmss ((r1), (r0), (r1), (r0), _t1, _t0); \
169 (q)++; \
170 \
171 /* Conditionally adjust q and the remainders */ \
172 _mask = - (mp_limb_t) ((r1) >= _q0); \
173 (q) += _mask; \
174 gmp_add_ssaaaa ((r1), (r0), (r1), (r0), _mask & (d1), _mask & (d0)); \
175 if ((r1) >= (d1)) \
176 { \
177 if ((r1) > (d1) || (r0) >= (d0)) \
178 { \
179 (q)++; \
180 gmp_sub_ddmmss ((r1), (r0), (r1), (r0), (d1), (d0)); \
181 } \
182 } \
183 } while (0)
184
185/* Swap macros. */
186#define MP_LIMB_T_SWAP(x, y) \
187 do { \
188 mp_limb_t __mp_limb_t_swap__tmp = (x); \
189 (x) = (y); \
190 (y) = __mp_limb_t_swap__tmp; \
191 } while (0)
192#define MP_SIZE_T_SWAP(x, y) \
193 do { \
194 mp_size_t __mp_size_t_swap__tmp = (x); \
195 (x) = (y); \
196 (y) = __mp_size_t_swap__tmp; \
197 } while (0)
198#define MP_BITCNT_T_SWAP(x,y) \
199 do { \
200 mp_bitcnt_t __mp_bitcnt_t_swap__tmp = (x); \
201 (x) = (y); \
202 (y) = __mp_bitcnt_t_swap__tmp; \
203 } while (0)
204#define MP_PTR_SWAP(x, y) \
205 do { \
206 mp_ptr __mp_ptr_swap__tmp = (x); \
207 (x) = (y); \
208 (y) = __mp_ptr_swap__tmp; \
209 } while (0)
210#define MP_SRCPTR_SWAP(x, y) \
211 do { \
212 mp_srcptr __mp_srcptr_swap__tmp = (x); \
213 (x) = (y); \
214 (y) = __mp_srcptr_swap__tmp; \
215 } while (0)
216
217#define MPN_PTR_SWAP(xp,xs, yp,ys) \
218 do { \
219 MP_PTR_SWAP (xp, yp); \
220 MP_SIZE_T_SWAP (xs, ys); \
221 } while(0)
222#define MPN_SRCPTR_SWAP(xp,xs, yp,ys) \
223 do { \
224 MP_SRCPTR_SWAP (xp, yp); \
225 MP_SIZE_T_SWAP (xs, ys); \
226 } while(0)
227
228#define MPZ_PTR_SWAP(x, y) \
229 do { \
230 mpz_ptr __mpz_ptr_swap__tmp = (x); \
231 (x) = (y); \
232 (y) = __mpz_ptr_swap__tmp; \
233 } while (0)
234#define MPZ_SRCPTR_SWAP(x, y) \
235 do { \
236 mpz_srcptr __mpz_srcptr_swap__tmp = (x); \
237 (x) = (y); \
238 (y) = __mpz_srcptr_swap__tmp; \
239 } while (0)
240
242
243
244/* Memory allocation and other helper functions. */
245static void
246gmp_die (const char *msg)
247{
248 fprintf (stderr, "%s\n", msg);
249 abort();
250}
251
252static void *
253gmp_default_alloc (size_t size)
254{
255 void *p;
256
257 assert (size > 0);
258
259 p = malloc (size);
260 if (!p)
261 gmp_die("gmp_default_alloc: Virtual memory exhausted.");
262
263 return p;
264}
265
266static void *
267gmp_default_realloc (void *old, size_t old_size, size_t new_size)
268{
269 UN_USED(old_size);
270
271 void * p;
272
273 p = realloc (old, new_size);
274
275 if (!p)
276 gmp_die("gmp_default_realloc: Virtual memory exhausted.");
277
278 return p;
279}
280
281static void
282gmp_default_free (void *p, size_t size)
283{
284 UN_USED(size);
285 free (p);
286}
287
288static void * (*gmp_allocate_func) (size_t) = gmp_default_alloc;
289static void * (*gmp_reallocate_func) (void *, size_t, size_t) = gmp_default_realloc;
290static void (*gmp_free_func) (void *, size_t) = gmp_default_free;
291
292void
293mp_get_memory_functions (void *(**alloc_func) (size_t),
294 void *(**realloc_func) (void *, size_t, size_t),
295 void (**free_func) (void *, size_t))
296{
297 if (alloc_func)
298 *alloc_func = gmp_allocate_func;
299
300 if (realloc_func)
301 *realloc_func = gmp_reallocate_func;
302
303 if (free_func)
304 *free_func = gmp_free_func;
305}
306
307void
308mp_set_memory_functions (void *(*alloc_func) (size_t),
309 void *(*realloc_func) (void *, size_t, size_t),
310 void (*free_func) (void *, size_t))
311{
312 if (!alloc_func)
313 alloc_func = gmp_default_alloc;
314 if (!realloc_func)
315 realloc_func = gmp_default_realloc;
316 if (!free_func)
317 free_func = gmp_default_free;
318
319 gmp_allocate_func = alloc_func;
320 gmp_reallocate_func = realloc_func;
321 gmp_free_func = free_func;
322}
323
324#define gmp_xalloc(size) ((*gmp_allocate_func)((size)))
325#define gmp_free(p) ((*gmp_free_func) ((p), 0))
326
327static mp_ptr
328gmp_xalloc_limbs (mp_size_t size)
329{
330 return (mp_ptr) gmp_xalloc (size * sizeof (mp_limb_t));
331}
332
333static mp_ptr
334gmp_xrealloc_limbs (mp_ptr old, mp_size_t size)
335{
336 assert (size > 0);
337 return (mp_ptr) (*gmp_reallocate_func) (old, 0, size * sizeof (mp_limb_t));
338}
339
340
341/* MPN interface */
342
343void
345{
346 mp_size_t i;
347 for (i = 0; i < n; i++)
348 d[i] = s[i];
349}
350
351void
353{
354 while (--n >= 0)
355 d[n] = s[n];
356}
357
358int
360{
361 while (--n >= 0)
362 {
363 if (ap[n] != bp[n])
364 return ap[n] > bp[n] ? 1 : -1;
365 }
366 return 0;
367}
368
369static int
370mpn_cmp4 (mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
371{
372 if (an != bn)
373 return an < bn ? -1 : 1;
374 else
375 return mpn_cmp (ap, bp, an);
376}
377
378static mp_size_t
379mpn_normalized_size (mp_srcptr xp, mp_size_t n)
380{
381 while (n > 0 && xp[n-1] == 0)
382 --n;
383 return n;
384}
385
386int
388{
389 return mpn_normalized_size (rp, n) == 0;
390}
391
392void
394{
395 while (--n >= 0)
396 rp[n] = 0;
397}
398
401{
402 mp_size_t i;
403
404 assert (n > 0);
405 i = 0;
406 do
407 {
408 mp_limb_t r = ap[i] + b;
409 /* Carry out */
410 b = (r < b);
411 rp[i] = r;
412 }
413 while (++i < n);
414
415 return b;
416}
417
420{
421 mp_size_t i;
422 mp_limb_t cy;
423
424 for (i = 0, cy = 0; i < n; i++)
425 {
426 mp_limb_t a, b, r;
427 a = ap[i]; b = bp[i];
428 r = a + cy;
429 cy = (r < cy);
430 r += b;
431 cy += (r < b);
432 rp[i] = r;
433 }
434 return cy;
435}
436
439{
440 mp_limb_t cy;
441
442 assert (an >= bn);
443
444 cy = mpn_add_n (rp, ap, bp, bn);
445 if (an > bn)
446 cy = mpn_add_1 (rp + bn, ap + bn, an - bn, cy);
447 return cy;
448}
449
452{
453 mp_size_t i;
454
455 assert (n > 0);
456
457 i = 0;
458 do
459 {
460 mp_limb_t a = ap[i];
461 /* Carry out */
462 mp_limb_t cy = a < b;
463 rp[i] = a - b;
464 b = cy;
465 }
466 while (++i < n);
467
468 return b;
469}
470
473{
474 mp_size_t i;
475 mp_limb_t cy;
476
477 for (i = 0, cy = 0; i < n; i++)
478 {
479 mp_limb_t a, b;
480 a = ap[i]; b = bp[i];
481 b += cy;
482 cy = (b < cy);
483 cy += (a < b);
484 rp[i] = a - b;
485 }
486 return cy;
487}
488
491{
492 mp_limb_t cy;
493
494 assert (an >= bn);
495
496 cy = mpn_sub_n (rp, ap, bp, bn);
497 if (an > bn)
498 cy = mpn_sub_1 (rp + bn, ap + bn, an - bn, cy);
499 return cy;
500}
501
504{
505 mp_limb_t ul, cl, hpl, lpl;
506
507 assert (n >= 1);
508
509 cl = 0;
510 do
511 {
512 ul = *up++;
513 gmp_umul_ppmm (hpl, lpl, ul, vl);
514
515 lpl += cl;
516 cl = (lpl < cl) + hpl;
517
518 *rp++ = lpl;
519 }
520 while (--n != 0);
521
522 return cl;
523}
524
527{
528 mp_limb_t ul, cl, hpl, lpl, rl;
529
530 assert (n >= 1);
531
532 cl = 0;
533 do
534 {
535 ul = *up++;
536 gmp_umul_ppmm (hpl, lpl, ul, vl);
537
538 lpl += cl;
539 cl = (lpl < cl) + hpl;
540
541 rl = *rp;
542 lpl = rl + lpl;
543 cl += lpl < rl;
544 *rp++ = lpl;
545 }
546 while (--n != 0);
547
548 return cl;
549}
550
553{
554 mp_limb_t ul, cl, hpl, lpl, rl;
555
556 assert (n >= 1);
557
558 cl = 0;
559 do
560 {
561 ul = *up++;
562 gmp_umul_ppmm (hpl, lpl, ul, vl);
563
564 lpl += cl;
565 cl = (lpl < cl) + hpl;
566
567 rl = *rp;
568 lpl = rl - lpl;
569 cl += lpl > rl;
570 *rp++ = lpl;
571 }
572 while (--n != 0);
573
574 return cl;
575}
576
579{
580 assert (un >= vn);
581 assert (vn >= 1);
582
583 /* We first multiply by the low order limb. This result can be
584 stored, not added, to rp. We also avoid a loop for zeroing this
585 way. */
586
587 rp[un] = mpn_mul_1 (rp, up, un, vp[0]);
588
589 /* Now accumulate the product of up[] and the next higher limb from
590 vp[]. */
591
592 while (--vn >= 1)
593 {
594 rp += 1, vp += 1;
595 rp[un] = mpn_addmul_1 (rp, up, un, vp[0]);
596 }
597 return rp[un];
598}
599
600void
602{
603 mpn_mul (rp, ap, n, bp, n);
604}
605
606void
608{
609 mpn_mul (rp, ap, n, ap, n);
610}
611
613mpn_lshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
614{
615 mp_limb_t high_limb, low_limb;
616 unsigned int tnc;
617 mp_limb_t retval;
618
619 assert (n >= 1);
620 assert (cnt >= 1);
621 assert (cnt < GMP_LIMB_BITS);
622
623 up += n;
624 rp += n;
625
626 tnc = GMP_LIMB_BITS - cnt;
627 low_limb = *--up;
628 retval = low_limb >> tnc;
629 high_limb = (low_limb << cnt);
630
631 while (--n != 0)
632 {
633 low_limb = *--up;
634 *--rp = high_limb | (low_limb >> tnc);
635 high_limb = (low_limb << cnt);
636 }
637 *--rp = high_limb;
638
639 return retval;
640}
641
643mpn_rshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
644{
645 mp_limb_t high_limb, low_limb;
646 unsigned int tnc;
647 mp_limb_t retval;
648
649 assert (n >= 1);
650 assert (cnt >= 1);
651 assert (cnt < GMP_LIMB_BITS);
652
653 tnc = GMP_LIMB_BITS - cnt;
654 high_limb = *up++;
655 retval = (high_limb << tnc);
656 low_limb = high_limb >> cnt;
657
658 while (--n != 0)
659 {
660 high_limb = *up++;
661 *rp++ = low_limb | (high_limb << tnc);
662 low_limb = high_limb >> cnt;
663 }
664 *rp = low_limb;
665
666 return retval;
667}
668
669static mp_bitcnt_t
670mpn_common_scan (mp_limb_t limb, mp_size_t i, mp_srcptr up, mp_size_t un,
671 mp_limb_t ux)
672{
673 unsigned cnt;
674
675 assert (ux == 0 || ux == GMP_LIMB_MAX);
676 assert (0 <= i && i <= un );
677
678 while (limb == 0)
679 {
680 i++;
681 if (i == un)
682 return (ux == 0 ? ~(mp_bitcnt_t) 0 : un * GMP_LIMB_BITS);
683 limb = ux ^ up[i];
684 }
685 gmp_ctz (cnt, limb);
686 return (mp_bitcnt_t) i * GMP_LIMB_BITS + cnt;
687}
688
691{
692 mp_size_t i;
693 i = bit / GMP_LIMB_BITS;
694
695 return mpn_common_scan ( ptr[i] & (GMP_LIMB_MAX << (bit % GMP_LIMB_BITS)),
696 i, ptr, i, 0);
697}
698
701{
702 mp_size_t i;
703 i = bit / GMP_LIMB_BITS;
704
705 return mpn_common_scan (~ptr[i] & (GMP_LIMB_MAX << (bit % GMP_LIMB_BITS)),
706 i, ptr, i, GMP_LIMB_MAX);
707}
708
709void
711{
712 while (--n >= 0)
713 *rp++ = ~ *up++;
714}
715
718{
719 while (*up == 0)
720 {
721 *rp = 0;
722 if (!--n)
723 return 0;
724 ++up; ++rp;
725 }
726 *rp = - *up;
727 mpn_com (++rp, ++up, --n);
728 return 1;
729}
730
731
732/* MPN division interface. */
733
734/* The 3/2 inverse is defined as
735
736 m = floor( (B^3-1) / (B u1 + u0)) - B
737*/
740{
741 mp_limb_t r, p, m, ql;
742 unsigned ul, uh, qh;
743
744 assert (u1 >= GMP_LIMB_HIGHBIT);
745
746 /* For notation, let b denote the half-limb base, so that B = b^2.
747 Split u1 = b uh + ul. */
748 ul = u1 & GMP_LLIMB_MASK;
749 uh = u1 >> (GMP_LIMB_BITS / 2);
750
751 /* Approximation of the high half of quotient. Differs from the 2/1
752 inverse of the half limb uh, since we have already subtracted
753 u0. */
754 qh = ~u1 / uh;
755
756 /* Adjust to get a half-limb 3/2 inverse, i.e., we want
757
758 qh' = floor( (b^3 - 1) / u) - b = floor ((b^3 - b u - 1) / u
759 = floor( (b (~u) + b-1) / u),
760
761 and the remainder
762
763 r = b (~u) + b-1 - qh (b uh + ul)
764 = b (~u - qh uh) + b-1 - qh ul
765
766 Subtraction of qh ul may underflow, which implies adjustments.
767 But by normalization, 2 u >= B > qh ul, so we need to adjust by
768 at most 2.
769 */
770
771 r = ((~u1 - (mp_limb_t) qh * uh) << (GMP_LIMB_BITS / 2)) | GMP_LLIMB_MASK;
772
773 p = (mp_limb_t) qh * ul;
774 /* Adjustment steps taken from udiv_qrnnd_c */
775 if (r < p)
776 {
777 qh--;
778 r += u1;
779 if (r >= u1) /* i.e. we didn't get carry when adding to r */
780 if (r < p)
781 {
782 qh--;
783 r += u1;
784 }
785 }
786 r -= p;
787
788 /* Low half of the quotient is
789
790 ql = floor ( (b r + b-1) / u1).
791
792 This is a 3/2 division (on half-limbs), for which qh is a
793 suitable inverse. */
794
795 p = (r >> (GMP_LIMB_BITS / 2)) * qh + r;
796 /* Unlike full-limb 3/2, we can add 1 without overflow. For this to
797 work, it is essential that ql is a full mp_limb_t. */
798 ql = (p >> (GMP_LIMB_BITS / 2)) + 1;
799
800 /* By the 3/2 trick, we don't need the high half limb. */
801 r = (r << (GMP_LIMB_BITS / 2)) + GMP_LLIMB_MASK - ql * u1;
802
803 if (r >= (p << (GMP_LIMB_BITS / 2)))
804 {
805 ql--;
806 r += u1;
807 }
808 m = ((mp_limb_t) qh << (GMP_LIMB_BITS / 2)) + ql;
809 if (r >= u1)
810 {
811 m++;
812 r -= u1;
813 }
814
815 /* Now m is the 2/1 invers of u1. If u0 > 0, adjust it to become a
816 3/2 inverse. */
817 if (u0 > 0)
818 {
819 mp_limb_t th, tl;
820 r = ~r;
821 r += u0;
822 if (r < u0)
823 {
824 m--;
825 if (r >= u1)
826 {
827 m--;
828 r -= u1;
829 }
830 r -= u1;
831 }
832 gmp_umul_ppmm (th, tl, u0, m);
833 r += th;
834 if (r < th)
835 {
836 m--;
837 m -= ((r > u1) | ((r == u1) & (tl > u0)));
838 }
839 }
840
841 return m;
842}
843
845{
846 /* Normalization shift count. */
847 unsigned shift;
848 /* Normalized divisor (d0 unused for mpn_div_qr_1) */
850 /* Inverse, for 2/1 or 3/2. */
852};
853
854static void
855mpn_div_qr_1_invert (struct gmp_div_inverse *inv, mp_limb_t d)
856{
857 unsigned shift;
858
859 assert (d > 0);
860 gmp_clz (shift, d);
861 inv->shift = shift;
862 inv->d1 = d << shift;
863 inv->di = mpn_invert_limb (inv->d1);
864}
865
866static void
867mpn_div_qr_2_invert (struct gmp_div_inverse *inv,
868 mp_limb_t d1, mp_limb_t d0)
869{
870 unsigned shift;
871
872 assert (d1 > 0);
873 gmp_clz (shift, d1);
874 inv->shift = shift;
875 if (shift > 0)
876 {
877 d1 = (d1 << shift) | (d0 >> (GMP_LIMB_BITS - shift));
878 d0 <<= shift;
879 }
880 inv->d1 = d1;
881 inv->d0 = d0;
882 inv->di = mpn_invert_3by2 (d1, d0);
883}
884
885static void
886mpn_div_qr_invert (struct gmp_div_inverse *inv,
887 mp_srcptr dp, mp_size_t dn)
888{
889 assert (dn > 0);
890
891 if (dn == 1)
892 mpn_div_qr_1_invert (inv, dp[0]);
893 else if (dn == 2)
894 mpn_div_qr_2_invert (inv, dp[1], dp[0]);
895 else
896 {
897 unsigned shift;
898 mp_limb_t d1, d0;
899
900 d1 = dp[dn-1];
901 d0 = dp[dn-2];
902 assert (d1 > 0);
903 gmp_clz (shift, d1);
904 inv->shift = shift;
905 if (shift > 0)
906 {
907 d1 = (d1 << shift) | (d0 >> (GMP_LIMB_BITS - shift));
908 d0 = (d0 << shift) | (dp[dn-3] >> (GMP_LIMB_BITS - shift));
909 }
910 inv->d1 = d1;
911 inv->d0 = d0;
912 inv->di = mpn_invert_3by2 (d1, d0);
913 }
914}
915
916/* Not matching current public gmp interface, rather corresponding to
917 the sbpi1_div_* functions. */
918static mp_limb_t
919mpn_div_qr_1_preinv (mp_ptr qp, mp_srcptr np, mp_size_t nn,
920 const struct gmp_div_inverse *inv)
921{
922 mp_limb_t d, di;
923 mp_limb_t r;
924 mp_ptr tp = NULL;
925
926 if (inv->shift > 0)
927 {
928 tp = gmp_xalloc_limbs (nn);
929 r = mpn_lshift (tp, np, nn, inv->shift);
930 np = tp;
931 }
932 else
933 r = 0;
934
935 d = inv->d1;
936 di = inv->di;
937 while (--nn >= 0)
938 {
939 mp_limb_t q;
940
941 gmp_udiv_qrnnd_preinv (q, r, r, np[nn], d, di);
942 if (qp)
943 qp[nn] = q;
944 }
945 if (inv->shift > 0)
946 gmp_free (tp);
947
948 return r >> inv->shift;
949}
950
951static mp_limb_t
952mpn_div_qr_1 (mp_ptr qp, mp_srcptr np, mp_size_t nn, mp_limb_t d)
953{
954 assert (d > 0);
955
956 /* Special case for powers of two. */
957 if ((d & (d-1)) == 0)
958 {
959 mp_limb_t r = np[0] & (d-1);
960 if (qp)
961 {
962 if (d <= 1)
963 mpn_copyi (qp, np, nn);
964 else
965 {
966 unsigned shift;
967 gmp_ctz (shift, d);
968 mpn_rshift (qp, np, nn, shift);
969 }
970 }
971 return r;
972 }
973 else
974 {
975 struct gmp_div_inverse inv;
976 mpn_div_qr_1_invert (&inv, d);
977 return mpn_div_qr_1_preinv (qp, np, nn, &inv);
978 }
979}
980
981static void
982mpn_div_qr_2_preinv (mp_ptr qp, mp_ptr rp, mp_srcptr np, mp_size_t nn,
983 const struct gmp_div_inverse *inv)
984{
985 unsigned shift;
986 mp_size_t i;
987 mp_limb_t d1, d0, di, r1, r0;
988 mp_ptr tp;
989
990 assert (nn >= 2);
991 shift = inv->shift;
992 d1 = inv->d1;
993 d0 = inv->d0;
994 di = inv->di;
995
996 if (shift > 0)
997 {
998 tp = gmp_xalloc_limbs (nn);
999 r1 = mpn_lshift (tp, np, nn, shift);
1000 np = tp;
1001 }
1002 else
1003 r1 = 0;
1004
1005 r0 = np[nn - 1];
1006
1007 i = nn - 2;
1008 do
1009 {
1010 mp_limb_t n0, q;
1011 n0 = np[i];
1012 gmp_udiv_qr_3by2 (q, r1, r0, r1, r0, n0, d1, d0, di);
1013
1014 if (qp)
1015 qp[i] = q;
1016 }
1017 while (--i >= 0);
1018
1019 if (shift > 0)
1020 {
1021 assert ((r0 << (GMP_LIMB_BITS - shift)) == 0);
1022 r0 = (r0 >> shift) | (r1 << (GMP_LIMB_BITS - shift));
1023 r1 >>= shift;
1024
1025 gmp_free (tp);
1026 }
1027
1028 rp[1] = r1;
1029 rp[0] = r0;
1030}
1031
1032#if 0
1033static void
1034mpn_div_qr_2 (mp_ptr qp, mp_ptr rp, mp_srcptr np, mp_size_t nn,
1036{
1037 struct gmp_div_inverse inv;
1038 assert (nn >= 2);
1039
1040 mpn_div_qr_2_invert (&inv, d1, d0);
1041 mpn_div_qr_2_preinv (qp, rp, np, nn, &inv);
1042}
1043#endif
1044
1045static void
1046mpn_div_qr_pi1 (mp_ptr qp,
1047 mp_ptr np, mp_size_t nn, mp_limb_t n1,
1048 mp_srcptr dp, mp_size_t dn,
1049 mp_limb_t dinv)
1050{
1051 mp_size_t i;
1052
1053 mp_limb_t d1, d0;
1054 mp_limb_t cy, cy1;
1055 mp_limb_t q;
1056
1057 assert (dn > 2);
1058 assert (nn >= dn);
1059
1060 d1 = dp[dn - 1];
1061 d0 = dp[dn - 2];
1062
1063 assert ((d1 & GMP_LIMB_HIGHBIT) != 0);
1064 /* Iteration variable is the index of the q limb.
1065 *
1066 * We divide <n1, np[dn-1+i], np[dn-2+i], np[dn-3+i],..., np[i]>
1067 * by <d1, d0, dp[dn-3], ..., dp[0] >
1068 */
1069
1070 i = nn - dn;
1071 do
1072 {
1073 mp_limb_t n0 = np[dn-1+i];
1074
1075 if (n1 == d1 && n0 == d0)
1076 {
1077 q = GMP_LIMB_MAX;
1078 mpn_submul_1 (np+i, dp, dn, q);
1079 n1 = np[dn-1+i]; /* update n1, last loop's value will now be invalid */
1080 }
1081 else
1082 {
1083 gmp_udiv_qr_3by2 (q, n1, n0, n1, n0, np[dn-2+i], d1, d0, dinv);
1084
1085 cy = mpn_submul_1 (np + i, dp, dn-2, q);
1086
1087 cy1 = n0 < cy;
1088 n0 = n0 - cy;
1089 cy = n1 < cy1;
1090 n1 = n1 - cy1;
1091 np[dn-2+i] = n0;
1092
1093 if (cy != 0)
1094 {
1095 n1 += d1 + mpn_add_n (np + i, np + i, dp, dn - 1);
1096 q--;
1097 }
1098 }
1099
1100 if (qp)
1101 qp[i] = q;
1102 }
1103 while (--i >= 0);
1104
1105 np[dn - 1] = n1;
1106}
1107
1108static void
1109mpn_div_qr_preinv (mp_ptr qp, mp_ptr np, mp_size_t nn,
1110 mp_srcptr dp, mp_size_t dn,
1111 const struct gmp_div_inverse *inv)
1112{
1113 assert (dn > 0);
1114 assert (nn >= dn);
1115
1116 if (dn == 1)
1117 np[0] = mpn_div_qr_1_preinv (qp, np, nn, inv);
1118 else if (dn == 2)
1119 mpn_div_qr_2_preinv (qp, np, np, nn, inv);
1120 else
1121 {
1122 mp_limb_t nh;
1123 unsigned shift;
1124
1125 assert (inv->d1 == dp[dn-1]);
1126 assert (inv->d0 == dp[dn-2]);
1127 assert ((inv->d1 & GMP_LIMB_HIGHBIT) != 0);
1128
1129 shift = inv->shift;
1130 if (shift > 0)
1131 nh = mpn_lshift (np, np, nn, shift);
1132 else
1133 nh = 0;
1134
1135 mpn_div_qr_pi1 (qp, np, nn, nh, dp, dn, inv->di);
1136
1137 if (shift > 0)
1138 gmp_assert_nocarry (mpn_rshift (np, np, dn, shift));
1139 }
1140}
1141
1142static void
1143mpn_div_qr (mp_ptr qp, mp_ptr np, mp_size_t nn, mp_srcptr dp, mp_size_t dn)
1144{
1145 struct gmp_div_inverse inv;
1146 mp_ptr tp = NULL;
1147
1148 assert (dn > 0);
1149 assert (nn >= dn);
1150
1151 mpn_div_qr_invert (&inv, dp, dn);
1152 if (dn > 2 && inv.shift > 0)
1153 {
1154 tp = gmp_xalloc_limbs (dn);
1155 gmp_assert_nocarry (mpn_lshift (tp, dp, dn, inv.shift));
1156 dp = tp;
1157 }
1158 mpn_div_qr_preinv (qp, np, nn, dp, dn, &inv);
1159 if (tp)
1160 gmp_free (tp);
1161}
1162
1163
1164/* MPN base conversion. */
1165static unsigned
1166mpn_base_power_of_two_p (unsigned b)
1167{
1168 switch (b)
1169 {
1170 case 2: return 1;
1171 case 4: return 2;
1172 case 8: return 3;
1173 case 16: return 4;
1174 case 32: return 5;
1175 case 64: return 6;
1176 case 128: return 7;
1177 case 256: return 8;
1178 default: return 0;
1179 }
1180}
1181
1183{
1184 /* bb is the largest power of the base which fits in one limb, and
1185 exp is the corresponding exponent. */
1186 unsigned exp;
1188};
1189
1190static void
1191mpn_get_base_info (struct mpn_base_info *info, mp_limb_t b)
1192{
1193 mp_limb_t m;
1194 mp_limb_t p;
1195 unsigned exp;
1196
1197 m = GMP_LIMB_MAX / b;
1198 for (exp = 1, p = b; p <= m; exp++)
1199 p *= b;
1200
1201 info->exp = exp;
1202 info->bb = p;
1203}
1204
1205static mp_bitcnt_t
1206mpn_limb_size_in_base_2 (mp_limb_t u)
1207{
1208 unsigned shift;
1209
1210 assert (u > 0);
1211 gmp_clz (shift, u);
1212 return GMP_LIMB_BITS - shift;
1213}
1214
1215static size_t
1216mpn_get_str_bits (unsigned char *sp, unsigned bits, mp_srcptr up, mp_size_t un)
1217{
1218 unsigned char mask;
1219 size_t sn, j;
1220 mp_size_t i;
1221 unsigned shift;
1222
1223 sn = ((un - 1) * GMP_LIMB_BITS + mpn_limb_size_in_base_2 (up[un-1])
1224 + bits - 1) / bits;
1225
1226 mask = (1U << bits) - 1;
1227
1228 for (i = 0, j = sn, shift = 0; j-- > 0;)
1229 {
1230 unsigned char digit = up[i] >> shift;
1231
1232 shift += bits;
1233
1234 if (shift >= GMP_LIMB_BITS && ++i < un)
1235 {
1236 shift -= GMP_LIMB_BITS;
1237 digit |= up[i] << (bits - shift);
1238 }
1239 sp[j] = digit & mask;
1240 }
1241 return sn;
1242}
1243
1244/* We generate digits from the least significant end, and reverse at
1245 the end. */
1246static size_t
1247mpn_limb_get_str (unsigned char *sp, mp_limb_t w,
1248 const struct gmp_div_inverse *binv)
1249{
1250 mp_size_t i;
1251 for (i = 0; w > 0; i++)
1252 {
1253 mp_limb_t h, l, r;
1254
1255 h = w >> (GMP_LIMB_BITS - binv->shift);
1256 l = w << binv->shift;
1257
1258 gmp_udiv_qrnnd_preinv (w, r, h, l, binv->d1, binv->di);
1259 assert ( (r << (GMP_LIMB_BITS - binv->shift)) == 0);
1260 r >>= binv->shift;
1261
1262 sp[i] = r;
1263 }
1264 return i;
1265}
1266
1267static size_t
1268mpn_get_str_other (unsigned char *sp,
1269 int base, const struct mpn_base_info *info,
1270 mp_ptr up, mp_size_t un)
1271{
1272 struct gmp_div_inverse binv;
1273 size_t sn;
1274 size_t i;
1275
1276 mpn_div_qr_1_invert (&binv, base);
1277
1278 sn = 0;
1279
1280 if (un > 1)
1281 {
1282 struct gmp_div_inverse bbinv;
1283 mpn_div_qr_1_invert (&bbinv, info->bb);
1284
1285 do
1286 {
1287 mp_limb_t w;
1288 size_t done;
1289 w = mpn_div_qr_1_preinv (up, up, un, &bbinv);
1290 un -= (up[un-1] == 0);
1291 done = mpn_limb_get_str (sp + sn, w, &binv);
1292
1293 for (sn += done; done < info->exp; done++)
1294 sp[sn++] = 0;
1295 }
1296 while (un > 1);
1297 }
1298 sn += mpn_limb_get_str (sp + sn, up[0], &binv);
1299
1300 /* Reverse order */
1301 for (i = 0; 2*i + 1 < sn; i++)
1302 {
1303 unsigned char t = sp[i];
1304 sp[i] = sp[sn - i - 1];
1305 sp[sn - i - 1] = t;
1306 }
1307
1308 return sn;
1309}
1310
1311size_t
1312mpn_get_str (unsigned char *sp, int base, mp_ptr up, mp_size_t un)
1313{
1314 unsigned bits;
1315
1316 assert (un > 0);
1317 assert (up[un-1] > 0);
1318
1319 bits = mpn_base_power_of_two_p (base);
1320 if (bits)
1321 return mpn_get_str_bits (sp, bits, up, un);
1322 else
1323 {
1324 struct mpn_base_info info;
1325
1326 mpn_get_base_info (&info, base);
1327 return mpn_get_str_other (sp, base, &info, up, un);
1328 }
1329}
1330
1331static mp_size_t
1332mpn_set_str_bits (mp_ptr rp, const unsigned char *sp, size_t sn,
1333 unsigned bits)
1334{
1335 mp_size_t rn;
1336 size_t j;
1337 unsigned shift;
1338
1339 for (j = sn, rn = 0, shift = 0; j-- > 0; )
1340 {
1341 if (shift == 0)
1342 {
1343 rp[rn++] = sp[j];
1344 shift += bits;
1345 }
1346 else
1347 {
1348 rp[rn-1] |= (mp_limb_t) sp[j] << shift;
1349 shift += bits;
1350 if (shift >= GMP_LIMB_BITS)
1351 {
1352 shift -= GMP_LIMB_BITS;
1353 if (shift > 0)
1354 rp[rn++] = (mp_limb_t) sp[j] >> (bits - shift);
1355 }
1356 }
1357 }
1358 rn = mpn_normalized_size (rp, rn);
1359 return rn;
1360}
1361
1362/* Result is usually normalized, except for all-zero input, in which
1363 case a single zero limb is written at *RP, and 1 is returned. */
1364static mp_size_t
1365mpn_set_str_other (mp_ptr rp, const unsigned char *sp, size_t sn,
1366 mp_limb_t b, const struct mpn_base_info *info)
1367{
1368 mp_size_t rn;
1369 mp_limb_t w;
1370 unsigned k;
1371 size_t j;
1372
1373 assert (sn > 0);
1374
1375 k = 1 + (sn - 1) % info->exp;
1376
1377 j = 0;
1378 w = sp[j++];
1379 while (--k != 0)
1380 w = w * b + sp[j++];
1381
1382 rp[0] = w;
1383
1384 for (rn = 1; j < sn;)
1385 {
1386 mp_limb_t cy;
1387
1388 w = sp[j++];
1389 for (k = 1; k < info->exp; k++)
1390 w = w * b + sp[j++];
1391
1392 cy = mpn_mul_1 (rp, rp, rn, info->bb);
1393 cy += mpn_add_1 (rp, rp, rn, w);
1394 if (cy > 0)
1395 rp[rn++] = cy;
1396 }
1397 assert (j == sn);
1398
1399 return rn;
1400}
1401
1403mpn_set_str (mp_ptr rp, const unsigned char *sp, size_t sn, int base)
1404{
1405 unsigned bits;
1406
1407 if (sn == 0)
1408 return 0;
1409
1410 bits = mpn_base_power_of_two_p (base);
1411 if (bits)
1412 return mpn_set_str_bits (rp, sp, sn, bits);
1413 else
1414 {
1415 struct mpn_base_info info;
1416
1417 mpn_get_base_info (&info, base);
1418 return mpn_set_str_other (rp, sp, sn, base, &info);
1419 }
1420}
1421
1422
1423/* MPZ interface */
1424void
1426{
1427 static const mp_limb_t dummy_limb = 0xc1a0;
1428
1429 r->_mp_alloc = 0;
1430 r->_mp_size = 0;
1431 r->_mp_d = (mp_ptr) &dummy_limb;
1432}
1433
1434/* The utility of this function is a bit limited, since many functions
1435 assigns the result variable using mpz_swap. */
1436void
1438{
1439 mp_size_t rn;
1440
1441 bits -= (bits != 0); /* Round down, except if 0 */
1442 rn = 1 + bits / GMP_LIMB_BITS;
1443
1444 r->_mp_alloc = rn;
1445 r->_mp_size = 0;
1446 r->_mp_d = gmp_xalloc_limbs (rn);
1447}
1448
1449void
1451{
1452 if (r->_mp_alloc)
1453 gmp_free (r->_mp_d);
1454}
1455
1456static mp_ptr
1457mpz_realloc (mpz_t r, mp_size_t size)
1458{
1459 size = GMP_MAX (size, 1);
1460
1461 if (r->_mp_alloc)
1462 r->_mp_d = gmp_xrealloc_limbs (r->_mp_d, size);
1463 else
1464 r->_mp_d = gmp_xalloc_limbs (size);
1465 r->_mp_alloc = size;
1466
1467 if (GMP_ABS (r->_mp_size) > size)
1468 r->_mp_size = 0;
1469
1470 return r->_mp_d;
1471}
1472
1473/* Realloc for an mpz_t WHAT if it has less than NEEDED limbs. */
1474#define MPZ_REALLOC(z,n) ((n) > (z)->_mp_alloc \
1475 ? mpz_realloc(z,n) \
1476 : (z)->_mp_d)
1477
1478/* MPZ assignment and basic conversions. */
1479void
1481{
1482 if (x >= 0)
1483 mpz_set_ui (r, x);
1484 else /* (x < 0) */
1485 {
1486 r->_mp_size = -1;
1487 MPZ_REALLOC (r, 1)[0] = GMP_NEG_CAST (uIntMpz, x);
1488 }
1489}
1490
1491void
1493{
1494 if (x > 0)
1495 {
1496 r->_mp_size = 1;
1497 MPZ_REALLOC (r, 1)[0] = x;
1498 }
1499 else
1500 r->_mp_size = 0;
1501}
1502
1503void
1504mpz_set (mpz_t r, const mpz_t x)
1505{
1506 /* Allow the NOP r == x */
1507 if (r != x)
1508 {
1509 mp_size_t n;
1510 mp_ptr rp;
1511
1512 n = GMP_ABS (x->_mp_size);
1513 rp = MPZ_REALLOC (r, n);
1514
1515 mpn_copyi (rp, x->_mp_d, n);
1516 r->_mp_size = x->_mp_size;
1517 }
1518}
1519
1520void
1522{
1523 mpz_init (r);
1524 mpz_set_si (r, x);
1525}
1526
1527void
1529{
1530 mpz_init (r);
1531 mpz_set_ui (r, x);
1532}
1533
1534void
1536{
1537 mpz_init (r);
1538 mpz_set (r, x);
1539}
1540
1541int
1543{
1544 mp_size_t us = u->_mp_size;
1545
1546 if (us == 1)
1547 return u->_mp_d[0] < GMP_LIMB_HIGHBIT;
1548 else if (us == -1)
1549 return u->_mp_d[0] <= GMP_LIMB_HIGHBIT;
1550 else
1551 return (us == 0);
1552}
1553
1554int
1556{
1557 mp_size_t us = u->_mp_size;
1558
1559 return (us == (us > 0));
1560}
1561
1562 intMpz
1564{
1565 if (u->_mp_size < 0)
1566 /* This expression is necessary to properly handle 0x80000000 */
1567 return -1 - (long) ((u->_mp_d[0] - 1) & ~GMP_LIMB_HIGHBIT);
1568 else
1569 return (long) (mpz_get_ui (u) & ~GMP_LIMB_HIGHBIT);
1570}
1571
1572uIntMpz
1574{
1575 return u->_mp_size == 0 ? 0 : u->_mp_d[0];
1576}
1577
1578size_t
1580{
1581 return GMP_ABS (u->_mp_size);
1582}
1583
1586{
1587 if (n >= 0 && n < GMP_ABS (u->_mp_size))
1588 return u->_mp_d[n];
1589 else
1590 return 0;
1591}
1592
1593void
1595{
1596 mpz_realloc (x, 1 + (n - (n != 0)) / GMP_LIMB_BITS);
1597}
1598
1601{
1602 return x->_mp_d;
1603}
1604
1605mp_ptr
1607{
1608 assert (n > 0);
1609 return MPZ_REALLOC (x, n);
1610}
1611
1612mp_ptr
1614{
1615 return mpz_limbs_modify (x, n);
1616}
1617
1618void
1620{
1621 mp_size_t xn;
1622 xn = mpn_normalized_size (x->_mp_d, GMP_ABS (xs));
1623 x->_mp_size = xs < 0 ? -xn : xn;
1624}
1625
1628{
1629 x->_mp_alloc = 0;
1630 x->_mp_d = (mp_ptr) xp;
1631 mpz_limbs_finish (x, xs);
1632 return x;
1633}
1634
1635
1636/* Conversions and comparison to double. */
1637void
1638mpz_set_d (mpz_t r, double x)
1639{
1640 int sign;
1641 mp_ptr rp;
1642 mp_size_t rn, i;
1643 double B;
1644 double Bi;
1645 mp_limb_t f;
1646
1647 /* x != x is true when x is a NaN, and x == x * 0.5 is true when x is
1648 zero or infinity. */
1649 if (x != x || x == x * 0.5)
1650 {
1651 r->_mp_size = 0;
1652 return;
1653 }
1654
1655 sign = x < 0.0 ;
1656 if (sign)
1657 x = - x;
1658
1659 if (x < 1.0)
1660 {
1661 r->_mp_size = 0;
1662 return;
1663 }
1664 B = 2.0 * (double) GMP_LIMB_HIGHBIT;
1665 Bi = 1.0 / B;
1666 for (rn = 1; x >= B; rn++)
1667 x *= Bi;
1668
1669 rp = MPZ_REALLOC (r, rn);
1670
1671 f = (mp_limb_t) x;
1672 x -= f;
1673 assert (x < 1.0);
1674 i = rn-1;
1675 rp[i] = f;
1676 while (--i >= 0)
1677 {
1678 x = B * x;
1679 f = (mp_limb_t) x;
1680 x -= f;
1681 assert (x < 1.0);
1682 rp[i] = f;
1683 }
1684
1685 r->_mp_size = sign ? - rn : rn;
1686}
1687
1688void
1690{
1691 mpz_init (r);
1692 mpz_set_d (r, x);
1693}
1694
1695double
1697{
1698 mp_size_t un;
1699 double x;
1700 double B = 2.0 * (double) GMP_LIMB_HIGHBIT;
1701
1702 un = GMP_ABS (u->_mp_size);
1703
1704 if (un == 0)
1705 return 0.0;
1706
1707 x = u->_mp_d[--un];
1708 while (un > 0)
1709 x = B*x + u->_mp_d[--un];
1710
1711 if (u->_mp_size < 0)
1712 x = -x;
1713
1714 return x;
1715}
1716
1717int
1718mpz_cmpabs_d (const mpz_t x, double d)
1719{
1720 mp_size_t xn;
1721 double B, Bi;
1722 mp_size_t i;
1723
1724 xn = x->_mp_size;
1725 d = GMP_ABS (d);
1726
1727 if (xn != 0)
1728 {
1729 xn = GMP_ABS (xn);
1730
1731 B = 2.0 * (double) GMP_LIMB_HIGHBIT;
1732 Bi = 1.0 / B;
1733
1734 /* Scale d so it can be compared with the top limb. */
1735 for (i = 1; i < xn; i++)
1736 d *= Bi;
1737
1738 if (d >= B)
1739 return -1;
1740
1741 /* Compare floor(d) to top limb, subtract and cancel when equal. */
1742 for (i = xn; i-- > 0;)
1743 {
1744 mp_limb_t f, xl;
1745
1746 f = (mp_limb_t) d;
1747 xl = x->_mp_d[i];
1748 if (xl > f)
1749 return 1;
1750 else if (xl < f)
1751 return -1;
1752 d = B * (d - f);
1753 }
1754 }
1755 return - (d > 0.0);
1756}
1757
1758int
1759mpz_cmp_d (const mpz_t x, double d)
1760{
1761 if (x->_mp_size < 0)
1762 {
1763 if (d >= 0.0)
1764 return -1;
1765 else
1766 return -mpz_cmpabs_d (x, d);
1767 }
1768 else
1769 {
1770 if (d < 0.0)
1771 return 1;
1772 else
1773 return mpz_cmpabs_d (x, d);
1774 }
1775}
1776
1777
1778/* MPZ comparisons and the like. */
1779int
1781{
1782 return GMP_CMP (u->_mp_size, 0);
1783}
1784
1785int
1787{
1788 mp_size_t usize = u->_mp_size;
1789
1790 if (usize < -1)
1791 return -1;
1792 else if (v >= 0)
1793 return mpz_cmp_ui (u, v);
1794 else if (usize >= 0)
1795 return 1;
1796 else /* usize == -1 */
1797 return GMP_CMP (GMP_NEG_CAST (mp_limb_t, v), u->_mp_d[0]);
1798}
1799
1800int
1802{
1803 mp_size_t usize = u->_mp_size;
1804
1805 if (usize > 1)
1806 return 1;
1807 else if (usize < 0)
1808 return -1;
1809 else
1810 return GMP_CMP (mpz_get_ui (u), v);
1811}
1812
1813int
1814mpz_cmp (const mpz_t a, const mpz_t b)
1815{
1816 mp_size_t asize = a->_mp_size;
1817 mp_size_t bsize = b->_mp_size;
1818
1819 if (asize != bsize)
1820 return (asize < bsize) ? -1 : 1;
1821 else if (asize >= 0)
1822 return mpn_cmp (a->_mp_d, b->_mp_d, asize);
1823 else
1824 return mpn_cmp (b->_mp_d, a->_mp_d, -asize);
1825}
1826
1827int
1829{
1830 if (GMP_ABS (u->_mp_size) > 1)
1831 return 1;
1832 else
1833 return GMP_CMP (mpz_get_ui (u), v);
1834}
1835
1836int
1837mpz_cmpabs (const mpz_t u, const mpz_t v)
1838{
1839 return mpn_cmp4 (u->_mp_d, GMP_ABS (u->_mp_size),
1840 v->_mp_d, GMP_ABS (v->_mp_size));
1841}
1842
1843void
1844mpz_abs (mpz_t r, const mpz_t u)
1845{
1846 mpz_set (r, u);
1847 r->_mp_size = GMP_ABS (r->_mp_size);
1848}
1849
1850void
1851mpz_neg (mpz_t r, const mpz_t u)
1852{
1853 mpz_set (r, u);
1854 r->_mp_size = -r->_mp_size;
1855}
1856
1857void
1859{
1860 MP_SIZE_T_SWAP (u->_mp_size, v->_mp_size);
1861 MP_SIZE_T_SWAP (u->_mp_alloc, v->_mp_alloc);
1862 MP_PTR_SWAP (u->_mp_d, v->_mp_d);
1863}
1864
1865
1866/* MPZ addition and subtraction */
1867
1868/* Adds to the absolute value. Returns new size, but doesn't store it. */
1869static mp_size_t
1870mpz_abs_add_ui (mpz_t r, const mpz_t a, uIntMpz b)
1871{
1872 mp_size_t an;
1873 mp_ptr rp;
1874 mp_limb_t cy;
1875
1876 an = GMP_ABS (a->_mp_size);
1877 if (an == 0)
1878 {
1879 MPZ_REALLOC (r, 1)[0] = b;
1880 return b > 0;
1881 }
1882
1883 rp = MPZ_REALLOC (r, an + 1);
1884
1885 cy = mpn_add_1 (rp, a->_mp_d, an, b);
1886 rp[an] = cy;
1887 an += cy;
1888
1889 return an;
1890}
1891
1892/* Subtract from the absolute value. Returns new size, (or -1 on underflow),
1893 but doesn't store it. */
1894static mp_size_t
1895mpz_abs_sub_ui (mpz_t r, const mpz_t a, uIntMpz b)
1896{
1897 mp_size_t an = GMP_ABS (a->_mp_size);
1898 mp_ptr rp;
1899
1900 if (an == 0)
1901 {
1902 MPZ_REALLOC (r, 1)[0] = b;
1903 return -(b > 0);
1904 }
1905 rp = MPZ_REALLOC (r, an);
1906 if (an == 1 && a->_mp_d[0] < b)
1907 {
1908 rp[0] = b - a->_mp_d[0];
1909 return -1;
1910 }
1911 else
1912 {
1913 gmp_assert_nocarry (mpn_sub_1 (rp, a->_mp_d, an, b));
1914 return mpn_normalized_size (rp, an);
1915 }
1916}
1917
1918void
1920{
1921 if (a->_mp_size >= 0)
1922 r->_mp_size = mpz_abs_add_ui (r, a, b);
1923 else
1924 r->_mp_size = -mpz_abs_sub_ui (r, a, b);
1925}
1926
1927void
1929{
1930 if (a->_mp_size < 0)
1931 r->_mp_size = -mpz_abs_add_ui (r, a, b);
1932 else
1933 r->_mp_size = mpz_abs_sub_ui (r, a, b);
1934}
1935
1936void
1938{
1939 if (b->_mp_size < 0)
1940 r->_mp_size = mpz_abs_add_ui (r, b, a);
1941 else
1942 r->_mp_size = -mpz_abs_sub_ui (r, b, a);
1943}
1944
1945static mp_size_t
1946mpz_abs_add (mpz_t r, const mpz_t a, const mpz_t b)
1947{
1948 mp_size_t an = GMP_ABS (a->_mp_size);
1949 mp_size_t bn = GMP_ABS (b->_mp_size);
1950 mp_ptr rp;
1951 mp_limb_t cy;
1952
1953 if (an < bn)
1954 {
1955 MPZ_SRCPTR_SWAP (a, b);
1956 MP_SIZE_T_SWAP (an, bn);
1957 }
1958
1959 rp = MPZ_REALLOC (r, an + 1);
1960 cy = mpn_add (rp, a->_mp_d, an, b->_mp_d, bn);
1961
1962 rp[an] = cy;
1963
1964 return an + cy;
1965}
1966
1967static mp_size_t
1968mpz_abs_sub (mpz_t r, const mpz_t a, const mpz_t b)
1969{
1970 mp_size_t an = GMP_ABS (a->_mp_size);
1971 mp_size_t bn = GMP_ABS (b->_mp_size);
1972 int cmp;
1973 mp_ptr rp;
1974
1975 cmp = mpn_cmp4 (a->_mp_d, an, b->_mp_d, bn);
1976 if (cmp > 0)
1977 {
1978 rp = MPZ_REALLOC (r, an);
1979 gmp_assert_nocarry (mpn_sub (rp, a->_mp_d, an, b->_mp_d, bn));
1980 return mpn_normalized_size (rp, an);
1981 }
1982 else if (cmp < 0)
1983 {
1984 rp = MPZ_REALLOC (r, bn);
1985 gmp_assert_nocarry (mpn_sub (rp, b->_mp_d, bn, a->_mp_d, an));
1986 return -mpn_normalized_size (rp, bn);
1987 }
1988 else
1989 return 0;
1990}
1991
1992void
1993mpz_add (mpz_t r, const mpz_t a, const mpz_t b)
1994{
1995 mp_size_t rn;
1996
1997 if ( (a->_mp_size ^ b->_mp_size) >= 0)
1998 rn = mpz_abs_add (r, a, b);
1999 else
2000 rn = mpz_abs_sub (r, a, b);
2001
2002 r->_mp_size = a->_mp_size >= 0 ? rn : - rn;
2003}
2004
2005void
2006mpz_sub (mpz_t r, const mpz_t a, const mpz_t b)
2007{
2008 mp_size_t rn;
2009
2010 if ( (a->_mp_size ^ b->_mp_size) >= 0)
2011 rn = mpz_abs_sub (r, a, b);
2012 else
2013 rn = mpz_abs_add (r, a, b);
2014
2015 r->_mp_size = a->_mp_size >= 0 ? rn : - rn;
2016}
2017
2018
2019/* MPZ multiplication */
2020void
2022{
2023 if (v < 0)
2024 {
2025 mpz_mul_ui (r, u, GMP_NEG_CAST (uIntMpz, v));
2026 mpz_neg (r, r);
2027 }
2028 else
2029 mpz_mul_ui (r, u, (uIntMpz) v);
2030}
2031
2032void
2034{
2035 mp_size_t un, us;
2036 mp_ptr tp;
2037 mp_limb_t cy;
2038
2039 us = u->_mp_size;
2040
2041 if (us == 0 || v == 0)
2042 {
2043 r->_mp_size = 0;
2044 return;
2045 }
2046
2047 un = GMP_ABS (us);
2048
2049 tp = MPZ_REALLOC (r, un + 1);
2050 cy = mpn_mul_1 (tp, u->_mp_d, un, v);
2051 tp[un] = cy;
2052
2053 un += (cy > 0);
2054 r->_mp_size = (us < 0) ? - un : un;
2055}
2056
2057void
2058mpz_mul (mpz_t r, const mpz_t u, const mpz_t v)
2059{
2060 int sign;
2061 mp_size_t un, vn, rn;
2062 mpz_t t;
2063 mp_ptr tp;
2064
2065 un = u->_mp_size;
2066 vn = v->_mp_size;
2067
2068 if (un == 0 || vn == 0)
2069 {
2070 r->_mp_size = 0;
2071 return;
2072 }
2073
2074 sign = (un ^ vn) < 0;
2075
2076 un = GMP_ABS (un);
2077 vn = GMP_ABS (vn);
2078
2079 mpz_init2 (t, (un + vn) * GMP_LIMB_BITS);
2080
2081 tp = t->_mp_d;
2082 if (un >= vn)
2083 mpn_mul (tp, u->_mp_d, un, v->_mp_d, vn);
2084 else
2085 mpn_mul (tp, v->_mp_d, vn, u->_mp_d, un);
2086
2087 rn = un + vn;
2088 rn -= tp[rn-1] == 0;
2089
2090 t->_mp_size = sign ? - rn : rn;
2091 mpz_swap (r, t);
2092 mpz_clear (t);
2093}
2094
2095void
2097{
2098 mp_size_t un, rn;
2099 mp_size_t limbs;
2100 unsigned shift;
2101 mp_ptr rp;
2102
2103 un = GMP_ABS (u->_mp_size);
2104 if (un == 0)
2105 {
2106 r->_mp_size = 0;
2107 return;
2108 }
2109
2110 limbs = bits / GMP_LIMB_BITS;
2111 shift = bits % GMP_LIMB_BITS;
2112
2113 rn = un + limbs + (shift > 0);
2114 rp = MPZ_REALLOC (r, rn);
2115 if (shift > 0)
2116 {
2117 mp_limb_t cy = mpn_lshift (rp + limbs, u->_mp_d, un, shift);
2118 rp[rn-1] = cy;
2119 rn -= (cy == 0);
2120 }
2121 else
2122 mpn_copyd (rp + limbs, u->_mp_d, un);
2123
2124 mpn_zero (rp, limbs);
2125
2126 r->_mp_size = (u->_mp_size < 0) ? - rn : rn;
2127}
2128
2129void
2131{
2132 mpz_t t;
2133 mpz_init (t);
2134 mpz_mul_ui (t, u, v);
2135 mpz_add (r, r, t);
2136 mpz_clear (t);
2137}
2138
2139void
2141{
2142 mpz_t t;
2143 mpz_init (t);
2144 mpz_mul_ui (t, u, v);
2145 mpz_sub (r, r, t);
2146 mpz_clear (t);
2147}
2148
2149void
2150mpz_addmul (mpz_t r, const mpz_t u, const mpz_t v)
2151{
2152 mpz_t t;
2153 mpz_init (t);
2154 mpz_mul (t, u, v);
2155 mpz_add (r, r, t);
2156 mpz_clear (t);
2157}
2158
2159void
2160mpz_submul (mpz_t r, const mpz_t u, const mpz_t v)
2161{
2162 mpz_t t;
2163 mpz_init (t);
2164 mpz_mul (t, u, v);
2165 mpz_sub (r, r, t);
2166 mpz_clear (t);
2167}
2168
2169
2170/* MPZ division */
2172
2173/* Allows q or r to be zero. Returns 1 iff remainder is non-zero. */
2174static int
2175mpz_div_qr (mpz_t q, mpz_t r,
2176 const mpz_t n, const mpz_t d, enum mpz_div_round_mode mode)
2177{
2178 mp_size_t ns, ds, nn, dn, qs;
2179 ns = n->_mp_size;
2180 ds = d->_mp_size;
2181
2182 if (ds == 0)
2183 gmp_die("mpz_div_qr: Divide by zero.");
2184
2185 if (ns == 0)
2186 {
2187 if (q)
2188 q->_mp_size = 0;
2189 if (r)
2190 r->_mp_size = 0;
2191 return 0;
2192 }
2193
2194 nn = GMP_ABS (ns);
2195 dn = GMP_ABS (ds);
2196
2197 qs = ds ^ ns;
2198
2199 if (nn < dn)
2200 {
2201 if (mode == GMP_DIV_CEIL && qs >= 0)
2202 {
2203 /* q = 1, r = n - d */
2204 if (r)
2205 mpz_sub (r, n, d);
2206 if (q)
2207 mpz_set_ui (q, 1);
2208 }
2209 else if (mode == GMP_DIV_FLOOR && qs < 0)
2210 {
2211 /* q = -1, r = n + d */
2212 if (r)
2213 mpz_add (r, n, d);
2214 if (q)
2215 mpz_set_si (q, -1);
2216 }
2217 else
2218 {
2219 /* q = 0, r = d */
2220 if (r)
2221 mpz_set (r, n);
2222 if (q)
2223 q->_mp_size = 0;
2224 }
2225 return 1;
2226 }
2227 else
2228 {
2229 mp_ptr np, qp;
2230 mp_size_t qn, rn;
2231 mpz_t tq, tr;
2232
2233 mpz_init_set (tr, n);
2234 np = tr->_mp_d;
2235
2236 qn = nn - dn + 1;
2237
2238 if (q)
2239 {
2240 mpz_init2 (tq, qn * GMP_LIMB_BITS);
2241 qp = tq->_mp_d;
2242 }
2243 else
2244 qp = NULL;
2245
2246 mpn_div_qr (qp, np, nn, d->_mp_d, dn);
2247
2248 if (qp)
2249 {
2250 qn -= (qp[qn-1] == 0);
2251
2252 tq->_mp_size = qs < 0 ? -qn : qn;
2253 }
2254 rn = mpn_normalized_size (np, dn);
2255 tr->_mp_size = ns < 0 ? - rn : rn;
2256
2257 if (mode == GMP_DIV_FLOOR && qs < 0 && rn != 0)
2258 {
2259 if (q)
2260 mpz_sub_ui (tq, tq, 1);
2261 if (r)
2262 mpz_add (tr, tr, d);
2263 }
2264 else if (mode == GMP_DIV_CEIL && qs >= 0 && rn != 0)
2265 {
2266 if (q)
2267 mpz_add_ui (tq, tq, 1);
2268 if (r)
2269 mpz_sub (tr, tr, d);
2270 }
2271
2272 if (q)
2273 {
2274 mpz_swap (tq, q);
2275 mpz_clear (tq);
2276 }
2277 if (r)
2278 mpz_swap (tr, r);
2279
2280 mpz_clear (tr);
2281
2282 return rn != 0;
2283 }
2284}
2285
2286void
2287mpz_cdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
2288{
2289 mpz_div_qr (q, r, n, d, GMP_DIV_CEIL);
2290}
2291
2292void
2293mpz_fdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
2294{
2295 mpz_div_qr (q, r, n, d, GMP_DIV_FLOOR);
2296}
2297
2298void
2299mpz_tdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
2300{
2301 mpz_div_qr (q, r, n, d, GMP_DIV_TRUNC);
2302}
2303
2304void
2305mpz_cdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
2306{
2307 mpz_div_qr (q, NULL, n, d, GMP_DIV_CEIL);
2308}
2309
2310void
2311mpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
2312{
2313 mpz_div_qr (q, NULL, n, d, GMP_DIV_FLOOR);
2314}
2315
2316void
2317mpz_tdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
2318{
2319 mpz_div_qr (q, NULL, n, d, GMP_DIV_TRUNC);
2320}
2321
2322void
2323mpz_cdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
2324{
2325 mpz_div_qr (NULL, r, n, d, GMP_DIV_CEIL);
2326}
2327
2328void
2329mpz_fdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
2330{
2331 mpz_div_qr (NULL, r, n, d, GMP_DIV_FLOOR);
2332}
2333
2334void
2335mpz_tdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
2336{
2337 mpz_div_qr (NULL, r, n, d, GMP_DIV_TRUNC);
2338}
2339
2340void
2341mpz_mod (mpz_t r, const mpz_t n, const mpz_t d)
2342{
2343 mpz_div_qr (NULL, r, n, d, d->_mp_size >= 0 ? GMP_DIV_FLOOR : GMP_DIV_CEIL);
2344}
2345
2346static void
2347mpz_div_q_2exp (mpz_t q, const mpz_t u, mp_bitcnt_t bit_index,
2348 enum mpz_div_round_mode mode)
2349{
2350 mp_size_t un, qn;
2351 mp_size_t limb_cnt;
2352 mp_ptr qp;
2353 int adjust;
2354
2355 un = u->_mp_size;
2356 if (un == 0)
2357 {
2358 q->_mp_size = 0;
2359 return;
2360 }
2361 limb_cnt = bit_index / GMP_LIMB_BITS;
2362 qn = GMP_ABS (un) - limb_cnt;
2363 bit_index %= GMP_LIMB_BITS;
2364
2365 if (mode == ((un > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* un != 0 here. */
2366 /* Note: Below, the final indexing at limb_cnt is valid because at
2367 that point we have qn > 0. */
2368 adjust = (qn <= 0
2369 || !mpn_zero_p (u->_mp_d, limb_cnt)
2370 || (u->_mp_d[limb_cnt]
2371 & (((mp_limb_t) 1 << bit_index) - 1)));
2372 else
2373 adjust = 0;
2374
2375 if (qn <= 0)
2376 qn = 0;
2377 else
2378 {
2379 qp = MPZ_REALLOC (q, qn);
2380
2381 if (bit_index != 0)
2382 {
2383 mpn_rshift (qp, u->_mp_d + limb_cnt, qn, bit_index);
2384 qn -= qp[qn - 1] == 0;
2385 }
2386 else
2387 {
2388 mpn_copyi (qp, u->_mp_d + limb_cnt, qn);
2389 }
2390 }
2391
2392 q->_mp_size = qn;
2393
2394 if (adjust)
2395 mpz_add_ui (q, q, 1);
2396 if (un < 0)
2397 mpz_neg (q, q);
2398}
2399
2400static void
2401mpz_div_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t bit_index,
2402 enum mpz_div_round_mode mode)
2403{
2404 mp_size_t us, un, rn;
2405 mp_ptr rp;
2406 mp_limb_t mask;
2407
2408 us = u->_mp_size;
2409 if (us == 0 || bit_index == 0)
2410 {
2411 r->_mp_size = 0;
2412 return;
2413 }
2414 rn = (bit_index + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
2415 assert (rn > 0);
2416
2417 rp = MPZ_REALLOC (r, rn);
2418 un = GMP_ABS (us);
2419
2420 mask = GMP_LIMB_MAX >> (rn * GMP_LIMB_BITS - bit_index);
2421
2422 if (rn > un)
2423 {
2424 /* Quotient (with truncation) is zero, and remainder is
2425 non-zero */
2426 if (mode == ((us > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* us != 0 here. */
2427 {
2428 /* Have to negate and sign extend. */
2429 mp_size_t i;
2430
2431 gmp_assert_nocarry (! mpn_neg (rp, u->_mp_d, un));
2432 for (i = un; i < rn - 1; i++)
2433 rp[i] = GMP_LIMB_MAX;
2434
2435 rp[rn-1] = mask;
2436 us = -us;
2437 }
2438 else
2439 {
2440 /* Just copy */
2441 if (r != u)
2442 mpn_copyi (rp, u->_mp_d, un);
2443
2444 rn = un;
2445 }
2446 }
2447 else
2448 {
2449 if (r != u)
2450 mpn_copyi (rp, u->_mp_d, rn - 1);
2451
2452 rp[rn-1] = u->_mp_d[rn-1] & mask;
2453
2454 if (mode == ((us > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* us != 0 here. */
2455 {
2456 /* If r != 0, compute 2^{bit_count} - r. */
2457 mpn_neg (rp, rp, rn);
2458
2459 rp[rn-1] &= mask;
2460
2461 /* us is not used for anything else, so we can modify it
2462 here to indicate flipped sign. */
2463 us = -us;
2464 }
2465 }
2466 rn = mpn_normalized_size (rp, rn);
2467 r->_mp_size = us < 0 ? -rn : rn;
2468}
2469
2470void
2472{
2473 mpz_div_q_2exp (r, u, cnt, GMP_DIV_CEIL);
2474}
2475
2476void
2478{
2479 mpz_div_q_2exp (r, u, cnt, GMP_DIV_FLOOR);
2480}
2481
2482void
2484{
2485 mpz_div_q_2exp (r, u, cnt, GMP_DIV_TRUNC);
2486}
2487
2488void
2490{
2491 mpz_div_r_2exp (r, u, cnt, GMP_DIV_CEIL);
2492}
2493
2494void
2496{
2497 mpz_div_r_2exp (r, u, cnt, GMP_DIV_FLOOR);
2498}
2499
2500void
2502{
2503 mpz_div_r_2exp (r, u, cnt, GMP_DIV_TRUNC);
2504}
2505
2506void
2507mpz_divexact (mpz_t q, const mpz_t n, const mpz_t d)
2508{
2509 gmp_assert_nocarry (mpz_div_qr (q, NULL, n, d, GMP_DIV_TRUNC));
2510}
2511
2512int
2513mpz_divisible_p (const mpz_t n, const mpz_t d)
2514{
2515 return mpz_div_qr (NULL, NULL, n, d, GMP_DIV_TRUNC) == 0;
2516}
2517
2518int
2519mpz_congruent_p (const mpz_t a, const mpz_t b, const mpz_t m)
2520{
2521 mpz_t t;
2522 int res;
2523
2524 /* a == b (mod 0) iff a == b */
2525 if (mpz_sgn (m) == 0)
2526 return (mpz_cmp (a, b) == 0);
2527
2528 mpz_init (t);
2529 mpz_sub (t, a, b);
2530 res = mpz_divisible_p (t, m);
2531 mpz_clear (t);
2532
2533 return res;
2534}
2535
2536static uIntMpz
2537mpz_div_qr_ui (mpz_t q, mpz_t r,
2538 const mpz_t n, uIntMpz d, enum mpz_div_round_mode mode)
2539{
2540 mp_size_t ns, qn;
2541 mp_ptr qp;
2542 mp_limb_t rl;
2543 mp_size_t rs;
2544
2545 ns = n->_mp_size;
2546 if (ns == 0)
2547 {
2548 if (q)
2549 q->_mp_size = 0;
2550 if (r)
2551 r->_mp_size = 0;
2552 return 0;
2553 }
2554
2555 qn = GMP_ABS (ns);
2556 if (q)
2557 qp = MPZ_REALLOC (q, qn);
2558 else
2559 qp = NULL;
2560
2561 rl = mpn_div_qr_1 (qp, n->_mp_d, qn, d);
2562 assert (rl < d);
2563
2564 rs = rl > 0;
2565 rs = (ns < 0) ? -rs : rs;
2566
2567 if (rl > 0 && ( (mode == GMP_DIV_FLOOR && ns < 0)
2568 || (mode == GMP_DIV_CEIL && ns >= 0)))
2569 {
2570 if (q)
2571 gmp_assert_nocarry (mpn_add_1 (qp, qp, qn, 1));
2572 rl = d - rl;
2573 rs = -rs;
2574 }
2575
2576 if (r)
2577 {
2578 MPZ_REALLOC (r, 1)[0] = rl;
2579 r->_mp_size = rs;
2580 }
2581 if (q)
2582 {
2583 qn -= (qp[qn-1] == 0);
2584 assert (qn == 0 || qp[qn-1] > 0);
2585
2586 q->_mp_size = (ns < 0) ? - qn : qn;
2587 }
2588
2589 return rl;
2590}
2591
2592uIntMpz
2594{
2595 return mpz_div_qr_ui (q, r, n, d, GMP_DIV_CEIL);
2596}
2597
2598uIntMpz
2600{
2601 return mpz_div_qr_ui (q, r, n, d, GMP_DIV_FLOOR);
2602}
2603
2604uIntMpz
2606{
2607 return mpz_div_qr_ui (q, r, n, d, GMP_DIV_TRUNC);
2608}
2609
2610uIntMpz
2612{
2613 return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_CEIL);
2614}
2615
2616uIntMpz
2618{
2619 return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_FLOOR);
2620}
2621
2622uIntMpz
2624{
2625 return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_TRUNC);
2626}
2627
2628uIntMpz
2630{
2631 return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_CEIL);
2632}
2633uIntMpz
2635{
2636 return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_FLOOR);
2637}
2638uIntMpz
2640{
2641 return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_TRUNC);
2642}
2643
2644uIntMpz
2646{
2647 return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_CEIL);
2648}
2649
2650uIntMpz
2652{
2653 return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_FLOOR);
2654}
2655
2656uIntMpz
2658{
2659 return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_TRUNC);
2660}
2661
2662uIntMpz
2664{
2665 return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_FLOOR);
2666}
2667
2668void
2670{
2671 gmp_assert_nocarry (mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_TRUNC));
2672}
2673
2674int
2676{
2677 return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_TRUNC) == 0;
2678}
2679
2680
2681/* GCD */
2682static mp_limb_t
2683mpn_gcd_11 (mp_limb_t u, mp_limb_t v)
2684{
2685 unsigned shift;
2686
2687 assert ( (u | v) > 0);
2688
2689 if (u == 0)
2690 return v;
2691 else if (v == 0)
2692 return u;
2693
2694 gmp_ctz (shift, u | v);
2695
2696 u >>= shift;
2697 v >>= shift;
2698
2699 if ( (u & 1) == 0)
2700 MP_LIMB_T_SWAP (u, v);
2701
2702 while ( (v & 1) == 0)
2703 v >>= 1;
2704
2705 while (u != v)
2706 {
2707 if (u > v)
2708 {
2709 u -= v;
2710 do
2711 u >>= 1;
2712 while ( (u & 1) == 0);
2713 }
2714 else
2715 {
2716 v -= u;
2717 do
2718 v >>= 1;
2719 while ( (v & 1) == 0);
2720 }
2721 }
2722 return u << shift;
2723}
2724
2725uIntMpz
2727{
2728 mp_size_t un;
2729
2730 if (v == 0)
2731 {
2732 if (g)
2733 mpz_abs (g, u);
2734 }
2735 else
2736 {
2737 un = GMP_ABS (u->_mp_size);
2738 if (un != 0)
2739 v = mpn_gcd_11 (mpn_div_qr_1 (NULL, u->_mp_d, un, v), v);
2740
2741 if (g)
2742 mpz_set_ui (g, v);
2743 }
2744
2745 return v;
2746}
2747
2748static mp_bitcnt_t
2749mpz_make_odd (mpz_t r)
2750{
2751 mp_bitcnt_t shift;
2752
2753 assert (r->_mp_size > 0);
2754 /* Count trailing zeros, equivalent to mpn_scan1, because we know that there is a 1 */
2755 shift = mpn_common_scan (r->_mp_d[0], 0, r->_mp_d, 0, 0);
2756 mpz_tdiv_q_2exp (r, r, shift);
2757
2758 return shift;
2759}
2760
2761void
2762mpz_gcd (mpz_t g, const mpz_t u, const mpz_t v)
2763{
2764 mpz_t tu, tv;
2765 mp_bitcnt_t uz, vz, gz;
2766
2767 if (u->_mp_size == 0)
2768 {
2769 mpz_abs (g, v);
2770 return;
2771 }
2772 if (v->_mp_size == 0)
2773 {
2774 mpz_abs (g, u);
2775 return;
2776 }
2777
2778 mpz_init (tu);
2779 mpz_init (tv);
2780
2781 mpz_abs (tu, u);
2782 uz = mpz_make_odd (tu);
2783 mpz_abs (tv, v);
2784 vz = mpz_make_odd (tv);
2785 gz = GMP_MIN (uz, vz);
2786
2787 if (tu->_mp_size < tv->_mp_size)
2788 mpz_swap (tu, tv);
2789
2790 mpz_tdiv_r (tu, tu, tv);
2791 if (tu->_mp_size == 0)
2792 {
2793 mpz_swap (g, tv);
2794 }
2795 else
2796 for (;;)
2797 {
2798 int c;
2799
2800 mpz_make_odd (tu);
2801 c = mpz_cmp (tu, tv);
2802 if (c == 0)
2803 {
2804 mpz_swap (g, tu);
2805 break;
2806 }
2807 if (c < 0)
2808 mpz_swap (tu, tv);
2809
2810 if (tv->_mp_size == 1)
2811 {
2812 mp_limb_t vl = tv->_mp_d[0];
2813 mp_limb_t ul = mpz_tdiv_ui (tu, vl);
2814 mpz_set_ui (g, mpn_gcd_11 (ul, vl));
2815 break;
2816 }
2817 mpz_sub (tu, tu, tv);
2818 }
2819 mpz_clear (tu);
2820 mpz_clear (tv);
2821 mpz_mul_2exp (g, g, gz);
2822}
2823
2824void
2825mpz_gcdext (mpz_t g, mpz_t s, mpz_t t, const mpz_t u, const mpz_t v)
2826{
2827 mpz_t tu, tv, s0, s1, t0, t1;
2828 mp_bitcnt_t uz, vz, gz;
2829 mp_bitcnt_t power;
2830
2831 if (u->_mp_size == 0)
2832 {
2833 /* g = 0 u + sgn(v) v */
2834 intMpz sign = mpz_sgn (v);
2835 mpz_abs (g, v);
2836 if (s)
2837 mpz_set_ui (s, 0);
2838 if (t)
2839 mpz_set_si (t, sign);
2840 return;
2841 }
2842
2843 if (v->_mp_size == 0)
2844 {
2845 /* g = sgn(u) u + 0 v */
2846 intMpz sign = mpz_sgn (u);
2847 mpz_abs (g, u);
2848 if (s)
2849 mpz_set_si (s, sign);
2850 if (t)
2851 mpz_set_ui (t, 0);
2852 return;
2853 }
2854
2855 mpz_init (tu);
2856 mpz_init (tv);
2857 mpz_init (s0);
2858 mpz_init (s1);
2859 mpz_init (t0);
2860 mpz_init (t1);
2861
2862 mpz_abs (tu, u);
2863 uz = mpz_make_odd (tu);
2864 mpz_abs (tv, v);
2865 vz = mpz_make_odd (tv);
2866 gz = GMP_MIN (uz, vz);
2867
2868 uz -= gz;
2869 vz -= gz;
2870
2871 /* Cofactors corresponding to odd gcd. gz handled later. */
2872 if (tu->_mp_size < tv->_mp_size)
2873 {
2874 mpz_swap (tu, tv);
2875 MPZ_SRCPTR_SWAP (u, v);
2876 MPZ_PTR_SWAP (s, t);
2877 MP_BITCNT_T_SWAP (uz, vz);
2878 }
2879
2880 /* Maintain
2881 *
2882 * u = t0 tu + t1 tv
2883 * v = s0 tu + s1 tv
2884 *
2885 * where u and v denote the inputs with common factors of two
2886 * eliminated, and det (s0, t0; s1, t1) = 2^p. Then
2887 *
2888 * 2^p tu = s1 u - t1 v
2889 * 2^p tv = -s0 u + t0 v
2890 */
2891
2892 /* After initial division, tu = q tv + tu', we have
2893 *
2894 * u = 2^uz (tu' + q tv)
2895 * v = 2^vz tv
2896 *
2897 * or
2898 *
2899 * t0 = 2^uz, t1 = 2^uz q
2900 * s0 = 0, s1 = 2^vz
2901 */
2902
2903 mpz_setbit (t0, uz);
2904 mpz_tdiv_qr (t1, tu, tu, tv);
2905 mpz_mul_2exp (t1, t1, uz);
2906
2907 mpz_setbit (s1, vz);
2908 power = uz + vz;
2909
2910 if (tu->_mp_size > 0)
2911 {
2912 mp_bitcnt_t shift;
2913 shift = mpz_make_odd (tu);
2914 mpz_mul_2exp (t0, t0, shift);
2915 mpz_mul_2exp (s0, s0, shift);
2916 power += shift;
2917
2918 for (;;)
2919 {
2920 int c;
2921 c = mpz_cmp (tu, tv);
2922 if (c == 0)
2923 break;
2924
2925 if (c < 0)
2926 {
2927 /* tv = tv' + tu
2928 *
2929 * u = t0 tu + t1 (tv' + tu) = (t0 + t1) tu + t1 tv'
2930 * v = s0 tu + s1 (tv' + tu) = (s0 + s1) tu + s1 tv' */
2931
2932 mpz_sub (tv, tv, tu);
2933 mpz_add (t0, t0, t1);
2934 mpz_add (s0, s0, s1);
2935
2936 shift = mpz_make_odd (tv);
2937 mpz_mul_2exp (t1, t1, shift);
2938 mpz_mul_2exp (s1, s1, shift);
2939 }
2940 else
2941 {
2942 mpz_sub (tu, tu, tv);
2943 mpz_add (t1, t0, t1);
2944 mpz_add (s1, s0, s1);
2945
2946 shift = mpz_make_odd (tu);
2947 mpz_mul_2exp (t0, t0, shift);
2948 mpz_mul_2exp (s0, s0, shift);
2949 }
2950 power += shift;
2951 }
2952 }
2953
2954 /* Now tv = odd part of gcd, and -s0 and t0 are corresponding
2955 cofactors. */
2956
2957 mpz_mul_2exp (tv, tv, gz);
2958 mpz_neg (s0, s0);
2959
2960 /* 2^p g = s0 u + t0 v. Eliminate one factor of two at a time. To
2961 adjust cofactors, we need u / g and v / g */
2962
2963 mpz_divexact (s1, v, tv);
2964 mpz_abs (s1, s1);
2965 mpz_divexact (t1, u, tv);
2966 mpz_abs (t1, t1);
2967
2968 while (power-- > 0)
2969 {
2970 /* s0 u + t0 v = (s0 - v/g) u - (t0 + u/g) v */
2971 if (mpz_odd_p (s0) || mpz_odd_p (t0))
2972 {
2973 mpz_sub (s0, s0, s1);
2974 mpz_add (t0, t0, t1);
2975 }
2976 mpz_divexact_ui (s0, s0, 2);
2977 mpz_divexact_ui (t0, t0, 2);
2978 }
2979
2980 /* Arrange so that |s| < |u| / 2g */
2981 mpz_add (s1, s0, s1);
2982 if (mpz_cmpabs (s0, s1) > 0)
2983 {
2984 mpz_swap (s0, s1);
2985 mpz_sub (t0, t0, t1);
2986 }
2987 if (u->_mp_size < 0)
2988 mpz_neg (s0, s0);
2989 if (v->_mp_size < 0)
2990 mpz_neg (t0, t0);
2991
2992 mpz_swap (g, tv);
2993 if (s)
2994 mpz_swap (s, s0);
2995 if (t)
2996 mpz_swap (t, t0);
2997
2998 mpz_clear (tu);
2999 mpz_clear (tv);
3000 mpz_clear (s0);
3001 mpz_clear (s1);
3002 mpz_clear (t0);
3003 mpz_clear (t1);
3004}
3005
3006void
3007mpz_lcm (mpz_t r, const mpz_t u, const mpz_t v)
3008{
3009 mpz_t g;
3010
3011 if (u->_mp_size == 0 || v->_mp_size == 0)
3012 {
3013 r->_mp_size = 0;
3014 return;
3015 }
3016
3017 mpz_init (g);
3018
3019 mpz_gcd (g, u, v);
3020 mpz_divexact (g, u, g);
3021 mpz_mul (r, g, v);
3022
3023 mpz_clear (g);
3024 mpz_abs (r, r);
3025}
3026
3027void
3029{
3030 if (v == 0 || u->_mp_size == 0)
3031 {
3032 r->_mp_size = 0;
3033 return;
3034 }
3035
3036 v /= mpz_gcd_ui (NULL, u, v);
3037 mpz_mul_ui (r, u, v);
3038
3039 mpz_abs (r, r);
3040}
3041
3042int
3043mpz_invert (mpz_t r, const mpz_t u, const mpz_t m)
3044{
3045 mpz_t g, tr;
3046 int invertible;
3047
3048 if (u->_mp_size == 0 || mpz_cmpabs_ui (m, 1) <= 0)
3049 return 0;
3050
3051 mpz_init (g);
3052 mpz_init (tr);
3053
3054 mpz_gcdext (g, tr, NULL, u, m);
3055 invertible = (mpz_cmp_ui (g, 1) == 0);
3056
3057 if (invertible)
3058 {
3059 if (tr->_mp_size < 0)
3060 {
3061 if (m->_mp_size >= 0)
3062 mpz_add (tr, tr, m);
3063 else
3064 mpz_sub (tr, tr, m);
3065 }
3066 mpz_swap (r, tr);
3067 }
3068
3069 mpz_clear (g);
3070 mpz_clear (tr);
3071 return invertible;
3072}
3073
3074
3075/* Higher level operations (sqrt, pow and root) */
3076
3077void
3079{
3080 uIntMpz bit;
3081 mpz_t tr;
3082 mpz_init_set_ui (tr, 1);
3083
3084 bit = GMP_ULONG_HIGHBIT;
3085 do
3086 {
3087 mpz_mul (tr, tr, tr);
3088 if (e & bit)
3089 mpz_mul (tr, tr, b);
3090 bit >>= 1;
3091 }
3092 while (bit > 0);
3093
3094 mpz_swap (r, tr);
3095 mpz_clear (tr);
3096}
3097
3098void
3100{
3101 mpz_t b;
3102 mpz_pow_ui (r, mpz_roinit_n (b, &blimb, 1), e);
3103}
3104
3105void
3106mpz_powm (mpz_t r, const mpz_t b, const mpz_t e, const mpz_t m)
3107{
3108 mpz_t tr;
3109 mpz_t base;
3110 mp_size_t en, mn;
3111 mp_srcptr mp;
3112 struct gmp_div_inverse minv;
3113 unsigned shift;
3114 mp_ptr tp = NULL;
3115
3116 en = GMP_ABS (e->_mp_size);
3117 mn = GMP_ABS (m->_mp_size);
3118 if (mn == 0)
3119 gmp_die ("mpz_powm: Zero modulo.");
3120
3121 if (en == 0)
3122 {
3123 mpz_set_ui (r, 1);
3124 return;
3125 }
3126
3127 mp = m->_mp_d;
3128 mpn_div_qr_invert (&minv, mp, mn);
3129 shift = minv.shift;
3130
3131 if (shift > 0)
3132 {
3133 /* To avoid shifts, we do all our reductions, except the final
3134 one, using a *normalized* m. */
3135 minv.shift = 0;
3136
3137 tp = gmp_xalloc_limbs (mn);
3138 gmp_assert_nocarry (mpn_lshift (tp, mp, mn, shift));
3139 mp = tp;
3140 }
3141
3142 mpz_init (base);
3143
3144 if (e->_mp_size < 0)
3145 {
3146 if (!mpz_invert (base, b, m))
3147 gmp_die ("mpz_powm: Negative exponent and non-invertible base.");
3148 }
3149 else
3150 {
3151 mp_size_t bn;
3152 mpz_abs (base, b);
3153
3154 bn = base->_mp_size;
3155 if (bn >= mn)
3156 {
3157 mpn_div_qr_preinv (NULL, base->_mp_d, base->_mp_size, mp, mn, &minv);
3158 bn = mn;
3159 }
3160
3161 /* We have reduced the absolute value. Now take care of the
3162 sign. Note that we get zero represented non-canonically as
3163 m. */
3164 if (b->_mp_size < 0)
3165 {
3166 mp_ptr bp = MPZ_REALLOC (base, mn);
3167 gmp_assert_nocarry (mpn_sub (bp, mp, mn, bp, bn));
3168 bn = mn;
3169 }
3170 base->_mp_size = mpn_normalized_size (base->_mp_d, bn);
3171 }
3172 mpz_init_set_ui (tr, 1);
3173
3174 while (--en >= 0)
3175 {
3176 mp_limb_t w = e->_mp_d[en];
3177 mp_limb_t bit;
3178
3179 bit = GMP_LIMB_HIGHBIT;
3180 do
3181 {
3182 mpz_mul (tr, tr, tr);
3183 if (w & bit)
3184 mpz_mul (tr, tr, base);
3185 if (tr->_mp_size > mn)
3186 {
3187 mpn_div_qr_preinv (NULL, tr->_mp_d, tr->_mp_size, mp, mn, &minv);
3188 tr->_mp_size = mpn_normalized_size (tr->_mp_d, mn);
3189 }
3190 bit >>= 1;
3191 }
3192 while (bit > 0);
3193 }
3194
3195 /* Final reduction */
3196 if (tr->_mp_size >= mn)
3197 {
3198 minv.shift = shift;
3199 mpn_div_qr_preinv (NULL, tr->_mp_d, tr->_mp_size, mp, mn, &minv);
3200 tr->_mp_size = mpn_normalized_size (tr->_mp_d, mn);
3201 }
3202 if (tp)
3203 gmp_free (tp);
3204
3205 mpz_swap (r, tr);
3206 mpz_clear (tr);
3207 mpz_clear (base);
3208}
3209
3210void
3211mpz_powm_ui (mpz_t r, const mpz_t b, uIntMpz elimb, const mpz_t m)
3212{
3213 mpz_t e;
3214 mpz_powm (r, b, mpz_roinit_n (e, &elimb, 1), m);
3215}
3216
3217/* x=trunc(y^(1/z)), r=y-x^z */
3218void
3220{
3221 int sgn;
3222 mpz_t t, u;
3223
3224 sgn = y->_mp_size < 0;
3225 if ((~z & sgn) != 0)
3226 gmp_die ("mpz_rootrem: Negative argument, with even root.");
3227 if (z == 0)
3228 gmp_die ("mpz_rootrem: Zeroth root.");
3229
3230 if (mpz_cmpabs_ui (y, 1) <= 0) {
3231 if (x)
3232 mpz_set (x, y);
3233 if (r)
3234 r->_mp_size = 0;
3235 return;
3236 }
3237
3238 mpz_init (u);
3239 mpz_init (t);
3240 mpz_setbit (t, mpz_sizeinbase (y, 2) / z + 1);
3241
3242 if (z == 2) /* simplify sqrt loop: z-1 == 1 */
3243 do {
3244 mpz_swap (u, t); /* u = x */
3245 mpz_tdiv_q (t, y, u); /* t = y/x */
3246 mpz_add (t, t, u); /* t = y/x + x */
3247 mpz_tdiv_q_2exp (t, t, 1); /* x'= (y/x + x)/2 */
3248 } while (mpz_cmpabs (t, u) < 0); /* |x'| < |x| */
3249 else /* z != 2 */ {
3250 mpz_t v;
3251
3252 mpz_init (v);
3253 if (sgn)
3254 mpz_neg (t, t);
3255
3256 do {
3257 mpz_swap (u, t); /* u = x */
3258 mpz_pow_ui (t, u, z - 1); /* t = x^(z-1) */
3259 mpz_tdiv_q (t, y, t); /* t = y/x^(z-1) */
3260 mpz_mul_ui (v, u, z - 1); /* v = x*(z-1) */
3261 mpz_add (t, t, v); /* t = y/x^(z-1) + x*(z-1) */
3262 mpz_tdiv_q_ui (t, t, z); /* x'=(y/x^(z-1) + x*(z-1))/z */
3263 } while (mpz_cmpabs (t, u) < 0); /* |x'| < |x| */
3264
3265 mpz_clear (v);
3266 }
3267
3268 if (r) {
3269 mpz_pow_ui (t, u, z);
3270 mpz_sub (r, y, t);
3271 }
3272 if (x)
3273 mpz_swap (x, u);
3274 mpz_clear (u);
3275 mpz_clear (t);
3276}
3277
3278int
3280{
3281 int res;
3282 mpz_t r;
3283
3284 mpz_init (r);
3285 mpz_rootrem (x, r, y, z);
3286 res = r->_mp_size == 0;
3287 mpz_clear (r);
3288
3289 return res;
3290}
3291
3292/* Compute s = floor(sqrt(u)) and r = u - s^2. Allows r == NULL */
3293void
3295{
3296 mpz_rootrem (s, r, u, 2);
3297}
3298
3299void
3301{
3302 mpz_rootrem (s, NULL, u, 2);
3303}
3304
3305int
3307{
3308 if (u->_mp_size <= 0)
3309 return (u->_mp_size == 0);
3310 else
3311 return mpz_root (NULL, u, 2);
3312}
3313
3314int
3316{
3317 mpz_t t;
3318
3319 assert (n > 0);
3320 assert (p [n-1] != 0);
3321 return mpz_root (NULL, mpz_roinit_n (t, p, n), 2);
3322}
3323
3326{
3327 mpz_t s, r, u;
3328 mp_size_t res;
3329
3330 assert (n > 0);
3331 assert (p [n-1] != 0);
3332
3333 mpz_init (r);
3334 mpz_init (s);
3335 mpz_rootrem (s, r, mpz_roinit_n (u, p, n), 2);
3336
3337 assert (s->_mp_size == (n+1)/2);
3338 mpn_copyd (sp, s->_mp_d, s->_mp_size);
3339 mpz_clear (s);
3340 res = r->_mp_size;
3341 if (rp)
3342 mpn_copyd (rp, r->_mp_d, res);
3343 mpz_clear (r);
3344 return res;
3345}
3346
3347/* Combinatorics */
3348
3349void
3351{
3352 mpz_set_ui (x, n + (n == 0));
3353 while (n > 2)
3354 mpz_mul_ui (x, x, --n);
3355}
3356
3357void
3359{
3360 mpz_t t;
3361
3362 mpz_set_ui (r, k <= n);
3363
3364 if (k > (n >> 1))
3365 k = (k <= n) ? n - k : 0;
3366
3367 mpz_init (t);
3368 mpz_fac_ui (t, k);
3369
3370 for (; k > 0; k--)
3371 mpz_mul_ui (r, r, n--);
3372
3373 mpz_divexact (r, r, t);
3374 mpz_clear (t);
3375}
3376
3377
3378/* Primality testing */
3379static int
3380gmp_millerrabin (const mpz_t n, const mpz_t nm1, mpz_t y,
3381 const mpz_t q, mp_bitcnt_t k)
3382{
3383 assert (k > 0);
3384
3385 /* Caller must initialize y to the base. */
3386 mpz_powm (y, y, q, n);
3387
3388 if (mpz_cmp_ui (y, 1) == 0 || mpz_cmp (y, nm1) == 0)
3389 return 1;
3390
3391 while (--k > 0)
3392 {
3393 mpz_powm_ui (y, y, 2, n);
3394 if (mpz_cmp (y, nm1) == 0)
3395 return 1;
3396 /* y == 1 means that the previous y was a non-trivial square root
3397 of 1 (mod n). y == 0 means that n is a power of the base.
3398 In either case, n is not prime. */
3399 if (mpz_cmp_ui (y, 1) <= 0)
3400 return 0;
3401 }
3402 return 0;
3403}
3404
3405/* This product is 0xc0cfd797, and fits in 32 bits. */
3406#define GMP_PRIME_PRODUCT \
3407 (3UL*5UL*7UL*11UL*13UL*17UL*19UL*23UL*29UL)
3408
3409/* Bit (p+1)/2 is set, for each odd prime <= 61 */
3410#define GMP_PRIME_MASK 0xc96996dcUL
3411
3412int
3413mpz_probab_prime_p (const mpz_t n, int reps)
3414{
3415 mpz_t nm1;
3416 mpz_t q;
3417 mpz_t y;
3418 mp_bitcnt_t k;
3419 int is_prime;
3420 int j;
3421
3422 /* Note that we use the absolute value of n only, for compatibility
3423 with the real GMP. */
3424 if (mpz_even_p (n))
3425 return (mpz_cmpabs_ui (n, 2) == 0) ? 2 : 0;
3426
3427 /* Above test excludes n == 0 */
3428 assert (n->_mp_size != 0);
3429
3430 if (mpz_cmpabs_ui (n, 64) < 0)
3431 return (GMP_PRIME_MASK >> (n->_mp_d[0] >> 1)) & 2;
3432
3433 if (mpz_gcd_ui (NULL, n, GMP_PRIME_PRODUCT) != 1)
3434 return 0;
3435
3436 /* All prime factors are >= 31. */
3437 if (mpz_cmpabs_ui (n, 31*31) < 0)
3438 return 2;
3439
3440 /* Use Miller-Rabin, with a deterministic sequence of bases, a[j] =
3441 j^2 + j + 41 using Euler's polynomial. We potentially stop early,
3442 if a[j] >= n - 1. Since n >= 31*31, this can happen only if reps >
3443 30 (a[30] == 971 > 31*31 == 961). */
3444
3445 mpz_init (nm1);
3446 mpz_init (q);
3447 mpz_init (y);
3448
3449 /* Find q and k, where q is odd and n = 1 + 2**k * q. */
3450 nm1->_mp_size = mpz_abs_sub_ui (nm1, n, 1);
3451 k = mpz_scan1 (nm1, 0);
3452 mpz_tdiv_q_2exp (q, nm1, k);
3453
3454 for (j = 0, is_prime = 1; is_prime & (j < reps); j++)
3455 {
3456 mpz_set_ui (y, (uIntMpz) j*j+j+41);
3457 if (mpz_cmp (y, nm1) >= 0)
3458 {
3459 /* Don't try any further bases. This "early" break does not affect
3460 the result for any reasonable reps value (<=5000 was tested) */
3461 assert (j >= 30);
3462 break;
3463 }
3464 is_prime = gmp_millerrabin (n, nm1, y, q, k);
3465 }
3466 mpz_clear (nm1);
3467 mpz_clear (q);
3468 mpz_clear (y);
3469
3470 return is_prime;
3471}
3472
3473
3474/* Logical operations and bit manipulation. */
3475
3476/* Numbers are treated as if represented in two's complement (and
3477 infinitely sign extended). For a negative values we get the two's
3478 complement from -x = ~x + 1, where ~ is bitwise complement.
3479 Negation transforms
3480
3481 xxxx10...0
3482
3483 into
3484
3485 yyyy10...0
3486
3487 where yyyy is the bitwise complement of xxxx. So least significant
3488 bits, up to and including the first one bit, are unchanged, and
3489 the more significant bits are all complemented.
3490
3491 To change a bit from zero to one in a negative number, subtract the
3492 corresponding power of two from the absolute value. This can never
3493 underflow. To change a bit from one to zero, add the corresponding
3494 power of two, and this might overflow. E.g., if x = -001111, the
3495 two's complement is 110001. Clearing the least significant bit, we
3496 get two's complement 110000, and -010000. */
3497
3498int
3499mpz_tstbit (const mpz_t d, mp_bitcnt_t bit_index)
3500{
3501 mp_size_t limb_index;
3502 unsigned shift;
3503 mp_size_t ds;
3504 mp_size_t dn;
3505 mp_limb_t w;
3506 int bit;
3507
3508 ds = d->_mp_size;
3509 dn = GMP_ABS (ds);
3510 limb_index = bit_index / GMP_LIMB_BITS;
3511 if (limb_index >= dn)
3512 return ds < 0;
3513
3514 shift = bit_index % GMP_LIMB_BITS;
3515 w = d->_mp_d[limb_index];
3516 bit = (w >> shift) & 1;
3517
3518 if (ds < 0)
3519 {
3520 /* d < 0. Check if any of the bits below is set: If so, our bit
3521 must be complemented. */
3522 if (shift > 0 && (w << (GMP_LIMB_BITS - shift)) > 0)
3523 return bit ^ 1;
3524 while (--limb_index >= 0)
3525 if (d->_mp_d[limb_index] > 0)
3526 return bit ^ 1;
3527 }
3528 return bit;
3529}
3530
3531static void
3532mpz_abs_add_bit (mpz_t d, mp_bitcnt_t bit_index)
3533{
3534 mp_size_t dn, limb_index;
3535 mp_limb_t bit;
3536 mp_ptr dp;
3537
3538 dn = GMP_ABS (d->_mp_size);
3539
3540 limb_index = bit_index / GMP_LIMB_BITS;
3541 bit = (mp_limb_t) 1 << (bit_index % GMP_LIMB_BITS);
3542
3543 if (limb_index >= dn)
3544 {
3545 mp_size_t i;
3546 /* The bit should be set outside of the end of the number.
3547 We have to increase the size of the number. */
3548 dp = MPZ_REALLOC (d, limb_index + 1);
3549
3550 dp[limb_index] = bit;
3551 for (i = dn; i < limb_index; i++)
3552 dp[i] = 0;
3553 dn = limb_index + 1;
3554 }
3555 else
3556 {
3557 mp_limb_t cy;
3558
3559 dp = d->_mp_d;
3560
3561 cy = mpn_add_1 (dp + limb_index, dp + limb_index, dn - limb_index, bit);
3562 if (cy > 0)
3563 {
3564 dp = MPZ_REALLOC (d, dn + 1);
3565 dp[dn++] = cy;
3566 }
3567 }
3568
3569 d->_mp_size = (d->_mp_size < 0) ? - dn : dn;
3570}
3571
3572static void
3573mpz_abs_sub_bit (mpz_t d, mp_bitcnt_t bit_index)
3574{
3575 mp_size_t dn, limb_index;
3576 mp_ptr dp;
3577 mp_limb_t bit;
3578
3579 dn = GMP_ABS (d->_mp_size);
3580 dp = d->_mp_d;
3581
3582 limb_index = bit_index / GMP_LIMB_BITS;
3583 bit = (mp_limb_t) 1 << (bit_index % GMP_LIMB_BITS);
3584
3585 assert (limb_index < dn);
3586
3587 gmp_assert_nocarry (mpn_sub_1 (dp + limb_index, dp + limb_index,
3588 dn - limb_index, bit));
3589 dn = mpn_normalized_size (dp, dn);
3590 d->_mp_size = (d->_mp_size < 0) ? - dn : dn;
3591}
3592
3593void
3595{
3596 if (!mpz_tstbit (d, bit_index))
3597 {
3598 if (d->_mp_size >= 0)
3599 mpz_abs_add_bit (d, bit_index);
3600 else
3601 mpz_abs_sub_bit (d, bit_index);
3602 }
3603}
3604
3605void
3607{
3608 if (mpz_tstbit (d, bit_index))
3609 {
3610 if (d->_mp_size >= 0)
3611 mpz_abs_sub_bit (d, bit_index);
3612 else
3613 mpz_abs_add_bit (d, bit_index);
3614 }
3615}
3616
3617void
3619{
3620 if (mpz_tstbit (d, bit_index) ^ (d->_mp_size < 0))
3621 mpz_abs_sub_bit (d, bit_index);
3622 else
3623 mpz_abs_add_bit (d, bit_index);
3624}
3625
3626void
3627mpz_com (mpz_t r, const mpz_t u)
3628{
3629 mpz_neg (r, u);
3630 mpz_sub_ui (r, r, 1);
3631}
3632
3633void
3634mpz_and (mpz_t r, const mpz_t u, const mpz_t v)
3635{
3636 mp_size_t un, vn, rn, i;
3637 mp_ptr up, vp, rp;
3638
3639 mp_limb_t ux, vx, rx;
3640 mp_limb_t uc, vc, rc;
3641 mp_limb_t ul, vl, rl;
3642
3643 un = GMP_ABS (u->_mp_size);
3644 vn = GMP_ABS (v->_mp_size);
3645 if (un < vn)
3646 {
3647 MPZ_SRCPTR_SWAP (u, v);
3648 MP_SIZE_T_SWAP (un, vn);
3649 }
3650 if (vn == 0)
3651 {
3652 r->_mp_size = 0;
3653 return;
3654 }
3655
3656 uc = u->_mp_size < 0;
3657 vc = v->_mp_size < 0;
3658 rc = uc & vc;
3659
3660 ux = -uc;
3661 vx = -vc;
3662 rx = -rc;
3663
3664 /* If the smaller input is positive, higher limbs don't matter. */
3665 rn = vx ? un : vn;
3666
3667 rp = MPZ_REALLOC (r, rn + (mp_size_t) rc);
3668
3669 up = u->_mp_d;
3670 vp = v->_mp_d;
3671
3672 i = 0;
3673 do
3674 {
3675 ul = (up[i] ^ ux) + uc;
3676 uc = ul < uc;
3677
3678 vl = (vp[i] ^ vx) + vc;
3679 vc = vl < vc;
3680
3681 rl = ( (ul & vl) ^ rx) + rc;
3682 rc = rl < rc;
3683 rp[i] = rl;
3684 }
3685 while (++i < vn);
3686 assert (vc == 0);
3687
3688 for (; i < rn; i++)
3689 {
3690 ul = (up[i] ^ ux) + uc;
3691 uc = ul < uc;
3692
3693 rl = ( (ul & vx) ^ rx) + rc;
3694 rc = rl < rc;
3695 rp[i] = rl;
3696 }
3697 if (rc)
3698 rp[rn++] = rc;
3699 else
3700 rn = mpn_normalized_size (rp, rn);
3701
3702 r->_mp_size = rx ? -rn : rn;
3703}
3704
3705void
3706mpz_ior (mpz_t r, const mpz_t u, const mpz_t v)
3707{
3708 mp_size_t un, vn, rn, i;
3709 mp_ptr up, vp, rp;
3710
3711 mp_limb_t ux, vx, rx;
3712 mp_limb_t uc, vc, rc;
3713 mp_limb_t ul, vl, rl;
3714
3715 un = GMP_ABS (u->_mp_size);
3716 vn = GMP_ABS (v->_mp_size);
3717 if (un < vn)
3718 {
3719 MPZ_SRCPTR_SWAP (u, v);
3720 MP_SIZE_T_SWAP (un, vn);
3721 }
3722 if (vn == 0)
3723 {
3724 mpz_set (r, u);
3725 return;
3726 }
3727
3728 uc = u->_mp_size < 0;
3729 vc = v->_mp_size < 0;
3730 rc = uc | vc;
3731
3732 ux = -uc;
3733 vx = -vc;
3734 rx = -rc;
3735
3736 /* If the smaller input is negative, by sign extension higher limbs
3737 don't matter. */
3738 rn = vx ? vn : un;
3739
3740 rp = MPZ_REALLOC (r, rn + (mp_size_t) rc);
3741
3742 up = u->_mp_d;
3743 vp = v->_mp_d;
3744
3745 i = 0;
3746 do
3747 {
3748 ul = (up[i] ^ ux) + uc;
3749 uc = ul < uc;
3750
3751 vl = (vp[i] ^ vx) + vc;
3752 vc = vl < vc;
3753
3754 rl = ( (ul | vl) ^ rx) + rc;
3755 rc = rl < rc;
3756 rp[i] = rl;
3757 }
3758 while (++i < vn);
3759 assert (vc == 0);
3760
3761 for (; i < rn; i++)
3762 {
3763 ul = (up[i] ^ ux) + uc;
3764 uc = ul < uc;
3765
3766 rl = ( (ul | vx) ^ rx) + rc;
3767 rc = rl < rc;
3768 rp[i] = rl;
3769 }
3770 if (rc)
3771 rp[rn++] = rc;
3772 else
3773 rn = mpn_normalized_size (rp, rn);
3774
3775 r->_mp_size = rx ? -rn : rn;
3776}
3777
3778void
3779mpz_xor (mpz_t r, const mpz_t u, const mpz_t v)
3780{
3781 mp_size_t un, vn, i;
3782 mp_ptr up, vp, rp;
3783
3784 mp_limb_t ux, vx, rx;
3785 mp_limb_t uc, vc, rc;
3786 mp_limb_t ul, vl, rl;
3787
3788 un = GMP_ABS (u->_mp_size);
3789 vn = GMP_ABS (v->_mp_size);
3790 if (un < vn)
3791 {
3792 MPZ_SRCPTR_SWAP (u, v);
3793 MP_SIZE_T_SWAP (un, vn);
3794 }
3795 if (vn == 0)
3796 {
3797 mpz_set (r, u);
3798 return;
3799 }
3800
3801 uc = u->_mp_size < 0;
3802 vc = v->_mp_size < 0;
3803 rc = uc ^ vc;
3804
3805 ux = -uc;
3806 vx = -vc;
3807 rx = -rc;
3808
3809 rp = MPZ_REALLOC (r, un + (mp_size_t) rc);
3810
3811 up = u->_mp_d;
3812 vp = v->_mp_d;
3813
3814 i = 0;
3815 do
3816 {
3817 ul = (up[i] ^ ux) + uc;
3818 uc = ul < uc;
3819
3820 vl = (vp[i] ^ vx) + vc;
3821 vc = vl < vc;
3822
3823 rl = (ul ^ vl ^ rx) + rc;
3824 rc = rl < rc;
3825 rp[i] = rl;
3826 }
3827 while (++i < vn);
3828 assert (vc == 0);
3829
3830 for (; i < un; i++)
3831 {
3832 ul = (up[i] ^ ux) + uc;
3833 uc = ul < uc;
3834
3835 rl = (ul ^ ux) + rc;
3836 rc = rl < rc;
3837 rp[i] = rl;
3838 }
3839 if (rc)
3840 rp[un++] = rc;
3841 else
3842 un = mpn_normalized_size (rp, un);
3843
3844 r->_mp_size = rx ? -un : un;
3845}
3846
3847static unsigned
3848gmp_popcount_limb (mp_limb_t x)
3849{
3850 unsigned c;
3851
3852 /* Do 16 bits at a time, to avoid limb-sized constants. */
3853 for (c = 0; x > 0; x >>= 16)
3854 {
3855 unsigned w = ((x >> 1) & 0x5555) + (x & 0x5555);
3856 w = ((w >> 2) & 0x3333) + (w & 0x3333);
3857 w = ((w >> 4) & 0x0f0f) + (w & 0x0f0f);
3858 w = (w >> 8) + (w & 0x00ff);
3859 c += w;
3860 }
3861 return c;
3862}
3863
3866{
3867 mp_size_t i;
3868 mp_bitcnt_t c;
3869
3870 for (c = 0, i = 0; i < n; i++)
3871 c += gmp_popcount_limb (p[i]);
3872
3873 return c;
3874}
3875
3878{
3879 mp_size_t un;
3880
3881 un = u->_mp_size;
3882
3883 if (un < 0)
3884 return ~(mp_bitcnt_t) 0;
3885
3886 return mpn_popcount (u->_mp_d, un);
3887}
3888
3890mpz_hamdist (const mpz_t u, const mpz_t v)
3891{
3892 mp_size_t un, vn, i;
3893 mp_limb_t uc, vc, ul, vl, comp;
3894 mp_srcptr up, vp;
3895 mp_bitcnt_t c;
3896
3897 un = u->_mp_size;
3898 vn = v->_mp_size;
3899
3900 if ( (un ^ vn) < 0)
3901 return ~(mp_bitcnt_t) 0;
3902
3903 comp = - (uc = vc = (un < 0));
3904 if (uc)
3905 {
3906 assert (vn < 0);
3907 un = -un;
3908 vn = -vn;
3909 }
3910
3911 up = u->_mp_d;
3912 vp = v->_mp_d;
3913
3914 if (un < vn)
3915 MPN_SRCPTR_SWAP (up, un, vp, vn);
3916
3917 for (i = 0, c = 0; i < vn; i++)
3918 {
3919 ul = (up[i] ^ comp) + uc;
3920 uc = ul < uc;
3921
3922 vl = (vp[i] ^ comp) + vc;
3923 vc = vl < vc;
3924
3925 c += gmp_popcount_limb (ul ^ vl);
3926 }
3927 assert (vc == 0);
3928
3929 for (; i < un; i++)
3930 {
3931 ul = (up[i] ^ comp) + uc;
3932 uc = ul < uc;
3933
3934 c += gmp_popcount_limb (ul ^ comp);
3935 }
3936
3937 return c;
3938}
3939
3941mpz_scan1 (const mpz_t u, mp_bitcnt_t starting_bit)
3942{
3943 mp_ptr up;
3944 mp_size_t us, un, i;
3945 mp_limb_t limb, ux;
3946
3947 us = u->_mp_size;
3948 un = GMP_ABS (us);
3949 i = starting_bit / GMP_LIMB_BITS;
3950
3951 /* Past the end there's no 1 bits for u>=0, or an immediate 1 bit
3952 for u<0. Notice this test picks up any u==0 too. */
3953 if (i >= un)
3954 return (us >= 0 ? ~(mp_bitcnt_t) 0 : starting_bit);
3955
3956 up = u->_mp_d;
3957 ux = 0;
3958 limb = up[i];
3959
3960 if (starting_bit != 0)
3961 {
3962 if (us < 0)
3963 {
3964 ux = mpn_zero_p (up, i);
3965 limb = ~ limb + ux;
3966 ux = - (mp_limb_t) (limb >= ux);
3967 }
3968
3969 /* Mask to 0 all bits before starting_bit, thus ignoring them. */
3970 limb &= (GMP_LIMB_MAX << (starting_bit % GMP_LIMB_BITS));
3971 }
3972
3973 return mpn_common_scan (limb, i, up, un, ux);
3974}
3975
3977mpz_scan0 (const mpz_t u, mp_bitcnt_t starting_bit)
3978{
3979 mp_ptr up;
3980 mp_size_t us, un, i;
3981 mp_limb_t limb, ux;
3982
3983 us = u->_mp_size;
3984 ux = - (mp_limb_t) (us >= 0);
3985 un = GMP_ABS (us);
3986 i = starting_bit / GMP_LIMB_BITS;
3987
3988 /* When past end, there's an immediate 0 bit for u>=0, or no 0 bits for
3989 u<0. Notice this test picks up all cases of u==0 too. */
3990 if (i >= un)
3991 return (ux ? starting_bit : ~(mp_bitcnt_t) 0);
3992
3993 up = u->_mp_d;
3994 limb = up[i] ^ ux;
3995
3996 if (ux == 0)
3997 limb -= mpn_zero_p (up, i); /* limb = ~(~limb + zero_p) */
3998
3999 /* Mask all bits before starting_bit, thus ignoring them. */
4000 limb &= (GMP_LIMB_MAX << (starting_bit % GMP_LIMB_BITS));
4001
4002 return mpn_common_scan (limb, i, up, un, ux);
4003}
4004
4005
4006/* MPZ base conversion. */
4007
4008size_t
4009mpz_sizeinbase (const mpz_t u, int base)
4010{
4011 mp_size_t un;
4012 mp_srcptr up;
4013 mp_ptr tp;
4014 mp_bitcnt_t bits;
4015 struct gmp_div_inverse bi;
4016 size_t ndigits;
4017
4018 assert (base >= 2);
4019 assert (base <= 36);
4020
4021 un = GMP_ABS (u->_mp_size);
4022 if (un == 0)
4023 return 1;
4024
4025 up = u->_mp_d;
4026
4027 bits = (un - 1) * GMP_LIMB_BITS + mpn_limb_size_in_base_2 (up[un-1]);
4028 switch (base)
4029 {
4030 case 2:
4031 return bits;
4032 case 4:
4033 return (bits + 1) / 2;
4034 case 8:
4035 return (bits + 2) / 3;
4036 case 16:
4037 return (bits + 3) / 4;
4038 case 32:
4039 return (bits + 4) / 5;
4040 /* FIXME: Do something more clever for the common case of base
4041 10. */
4042 }
4043
4044 tp = gmp_xalloc_limbs (un);
4045 mpn_copyi (tp, up, un);
4046 mpn_div_qr_1_invert (&bi, base);
4047
4048 ndigits = 0;
4049 do
4050 {
4051 ndigits++;
4052 mpn_div_qr_1_preinv (tp, tp, un, &bi);
4053 un -= (tp[un-1] == 0);
4054 }
4055 while (un > 0);
4056
4057 gmp_free (tp);
4058 return ndigits;
4059}
4060
4061char *
4062mpz_get_str (char *sp, int base, const mpz_t u)
4063{
4064 unsigned bits;
4065 const char *digits;
4066 mp_size_t un;
4067 size_t i, sn;
4068
4069 if (base >= 0)
4070 {
4071 digits = "0123456789abcdefghijklmnopqrstuvwxyz";
4072 }
4073 else
4074 {
4075 base = -base;
4076 digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
4077 }
4078 if (base <= 1)
4079 base = 10;
4080 if (base > 36)
4081 return NULL;
4082
4083 sn = 1 + mpz_sizeinbase (u, base);
4084 if (!sp)
4085 sp = (char *) gmp_xalloc (1 + sn);
4086
4087 un = GMP_ABS (u->_mp_size);
4088
4089 if (un == 0)
4090 {
4091 sp[0] = '0';
4092 sp[1] = '\0';
4093 return sp;
4094 }
4095
4096 i = 0;
4097
4098 if (u->_mp_size < 0)
4099 sp[i++] = '-';
4100
4101 bits = mpn_base_power_of_two_p (base);
4102
4103 if (bits)
4104 /* Not modified in this case. */
4105 sn = i + mpn_get_str_bits ((unsigned char *) sp + i, bits, u->_mp_d, un);
4106 else
4107 {
4108 struct mpn_base_info info;
4109 mp_ptr tp;
4110
4111 mpn_get_base_info (&info, base);
4112 tp = gmp_xalloc_limbs (un);
4113 mpn_copyi (tp, u->_mp_d, un);
4114
4115 sn = i + mpn_get_str_other ((unsigned char *) sp + i, base, &info, tp, un);
4116 gmp_free (tp);
4117 }
4118
4119 for (; i < sn; i++)
4120 sp[i] = digits[(unsigned char) sp[i]];
4121
4122 sp[sn] = '\0';
4123 return sp;
4124}
4125
4126int
4127mpz_set_str (mpz_t r, const char *sp, int base)
4128{
4129 unsigned bits;
4130 mp_size_t rn, alloc;
4131 mp_ptr rp;
4132 size_t dn;
4133 int sign;
4134 unsigned char *dp;
4135
4136 assert (base == 0 || (base >= 2 && base <= 36));
4137
4138 while (isspace( (unsigned char) *sp))
4139 sp++;
4140
4141 sign = (*sp == '-');
4142 sp += sign;
4143
4144 if (base == 0)
4145 {
4146 if (sp[0] == '0')
4147 {
4148 if (sp[1] == 'x' || sp[1] == 'X')
4149 {
4150 base = 16;
4151 sp += 2;
4152 }
4153 else if (sp[1] == 'b' || sp[1] == 'B')
4154 {
4155 base = 2;
4156 sp += 2;
4157 }
4158 else
4159 base = 8;
4160 }
4161 else
4162 base = 10;
4163 }
4164
4165 if (!*sp)
4166 {
4167 r->_mp_size = 0;
4168 return -1;
4169 }
4170 dp = (unsigned char *) gmp_xalloc (strlen (sp));
4171
4172 for (dn = 0; *sp; sp++)
4173 {
4174 unsigned digit;
4175
4176 if (isspace ((unsigned char) *sp))
4177 continue;
4178 else if (*sp >= '0' && *sp <= '9')
4179 digit = *sp - '0';
4180 else if (*sp >= 'a' && *sp <= 'z')
4181 digit = *sp - 'a' + 10;
4182 else if (*sp >= 'A' && *sp <= 'Z')
4183 digit = *sp - 'A' + 10;
4184 else
4185 digit = base; /* fail */
4186
4187 if (digit >= (unsigned) base)
4188 {
4189 gmp_free (dp);
4190 r->_mp_size = 0;
4191 return -1;
4192 }
4193
4194 dp[dn++] = digit;
4195 }
4196
4197 if (!dn)
4198 {
4199 gmp_free (dp);
4200 r->_mp_size = 0;
4201 return -1;
4202 }
4203 bits = mpn_base_power_of_two_p (base);
4204
4205 if (bits > 0)
4206 {
4207 alloc = (dn * bits + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
4208 rp = MPZ_REALLOC (r, alloc);
4209 rn = mpn_set_str_bits (rp, dp, dn, bits);
4210 }
4211 else
4212 {
4213 struct mpn_base_info info;
4214 mpn_get_base_info (&info, base);
4215 alloc = (dn + info.exp - 1) / info.exp;
4216 rp = MPZ_REALLOC (r, alloc);
4217 rn = mpn_set_str_other (rp, dp, dn, base, &info);
4218 /* Normalization, needed for all-zero input. */
4219 assert (rn > 0);
4220 rn -= rp[rn-1] == 0;
4221 }
4222 assert (rn <= alloc);
4223 gmp_free (dp);
4224
4225 r->_mp_size = sign ? - rn : rn;
4226
4227 return 0;
4228}
4229
4230int
4231mpz_init_set_str (mpz_t r, const char *sp, int base)
4232{
4233 mpz_init (r);
4234 return mpz_set_str (r, sp, base);
4235}
4236
4237size_t
4238mpz_out_str (FILE *stream, int base, const mpz_t x)
4239{
4240 char *str;
4241 size_t len;
4242
4243 str = mpz_get_str (NULL, base, x);
4244 len = strlen (str);
4245 len = fwrite (str, 1, len, stream);
4246 gmp_free (str);
4247 return len;
4248}
4249
4250
4251static int
4252gmp_detect_endian (void)
4253{
4254 static const int i = 2;
4255 const unsigned char *p = (const unsigned char *) &i;
4256 return 1 - *p;
4257}
4258
4259/* Import and export. Does not support nails. */
4260void
4261mpz_import (mpz_t r, size_t count, int order, size_t size, int endian,
4262 size_t nails, const void *src)
4263{
4264 const unsigned char *p;
4265 ptrdiff_t word_step;
4266 mp_ptr rp;
4267 mp_size_t rn;
4268
4269 /* The current (partial) limb. */
4270 mp_limb_t limb;
4271 /* The number of bytes already copied to this limb (starting from
4272 the low end). */
4273 size_t bytes;
4274 /* The index where the limb should be stored, when completed. */
4275 mp_size_t i;
4276
4277 if (nails != 0)
4278 gmp_die ("mpz_import: Nails not supported.");
4279
4280 assert (order == 1 || order == -1);
4281 assert (endian >= -1 && endian <= 1);
4282
4283 if (endian == 0)
4284 endian = gmp_detect_endian ();
4285
4286 p = (unsigned char *) src;
4287
4288 word_step = (order != endian) ? 2 * size : 0;
4289
4290 /* Process bytes from the least significant end, so point p at the
4291 least significant word. */
4292 if (order == 1)
4293 {
4294 p += size * (count - 1);
4295 word_step = - word_step;
4296 }
4297
4298 /* And at least significant byte of that word. */
4299 if (endian == 1)
4300 p += (size - 1);
4301
4302 rn = (size * count + sizeof(mp_limb_t) - 1) / sizeof(mp_limb_t);
4303 rp = MPZ_REALLOC (r, rn);
4304
4305 for (limb = 0, bytes = 0, i = 0; count > 0; count--, p += word_step)
4306 {
4307 size_t j;
4308 for (j = 0; j < size; j++, p -= (ptrdiff_t) endian)
4309 {
4310 limb |= (mp_limb_t) *p << (bytes++ * CHAR_BIT);
4311 if (bytes == sizeof(mp_limb_t))
4312 {
4313 rp[i++] = limb;
4314 bytes = 0;
4315 limb = 0;
4316 }
4317 }
4318 }
4319 assert (i + (bytes > 0) == rn);
4320 if (limb != 0)
4321 rp[i++] = limb;
4322 else
4323 i = mpn_normalized_size (rp, i);
4324
4325 r->_mp_size = i;
4326}
4327
4328void *
4329mpz_export (void *r, size_t *countp, int order, size_t size, int endian,
4330 size_t nails, const mpz_t u)
4331{
4332 size_t count;
4333 mp_size_t un;
4334
4335 if (nails != 0)
4336 gmp_die ("mpz_import: Nails not supported.");
4337
4338 assert (order == 1 || order == -1);
4339 assert (endian >= -1 && endian <= 1);
4340 assert (size > 0 || u->_mp_size == 0);
4341
4342 un = u->_mp_size;
4343 count = 0;
4344 if (un != 0)
4345 {
4346 size_t k;
4347 unsigned char *p;
4348 ptrdiff_t word_step;
4349 /* The current (partial) limb. */
4350 mp_limb_t limb;
4351 /* The number of bytes left to to in this limb. */
4352 size_t bytes;
4353 /* The index where the limb was read. */
4354 mp_size_t i;
4355
4356 un = GMP_ABS (un);
4357
4358 /* Count bytes in top limb. */
4359 limb = u->_mp_d[un-1];
4360 assert (limb != 0);
4361
4362 k = 0;
4363 do {
4364 k++; limb >>= CHAR_BIT;
4365 } while (limb != 0);
4366
4367 count = (k + (un-1) * sizeof (mp_limb_t) + size - 1) / size;
4368
4369 if (!r)
4370 r = gmp_xalloc (count * size);
4371
4372 if (endian == 0)
4373 endian = gmp_detect_endian ();
4374
4375 p = (unsigned char *) r;
4376
4377 word_step = (order != endian) ? 2 * size : 0;
4378
4379 /* Process bytes from the least significant end, so point p at the
4380 least significant word. */
4381 if (order == 1)
4382 {
4383 p += size * (count - 1);
4384 word_step = - word_step;
4385 }
4386
4387 /* And at least significant byte of that word. */
4388 if (endian == 1)
4389 p += (size - 1);
4390
4391 for (bytes = 0, i = 0, k = 0; k < count; k++, p += word_step)
4392 {
4393 size_t j;
4394 for (j = 0; j < size; j++, p -= (ptrdiff_t) endian)
4395 {
4396 if (bytes == 0)
4397 {
4398 if (i < un)
4399 limb = u->_mp_d[i++];
4400 bytes = sizeof (mp_limb_t);
4401 }
4402 *p = limb;
4403 limb >>= CHAR_BIT;
4404 bytes--;
4405 }
4406 }
4407 assert (i == un);
4408 assert (k == count);
4409 }
4410
4411 if (countp)
4412 *countp = count;
4413
4414 return r;
4415}
#define GMP_ULONG_HIGHBIT
Definition: mini-gmp.c:64
void mpz_and(mpz_t r, const mpz_t u, const mpz_t v)
Definition: mini-gmp.c:3634
uIntMpz mpz_tdiv_q_ui(mpz_t q, const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2623
void mpz_clrbit(mpz_t d, mp_bitcnt_t bit_index)
Definition: mini-gmp.c:3606
uIntMpz mpz_fdiv_ui(const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2651
uIntMpz mpz_cdiv_r_ui(mpz_t r, const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2629
void mpz_sqrtrem(mpz_t s, mpz_t r, const mpz_t u)
Definition: mini-gmp.c:3294
int mpz_fits_ulong_p(const mpz_t u)
Definition: mini-gmp.c:1555
mp_size_t mpn_set_str(mp_ptr rp, const unsigned char *sp, size_t sn, int base)
Definition: mini-gmp.c:1403
void mpz_tdiv_q_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
Definition: mini-gmp.c:2483
#define gmp_udiv_qr_3by2(q, r1, r0, n2, n1, n0, d1, d0, dinv)
Definition: mini-gmp.c:158
void mpz_tdiv_r(mpz_t r, const mpz_t n, const mpz_t d)
Definition: mini-gmp.c:2335
void mpz_ui_sub(mpz_t r, uIntMpz a, const mpz_t b)
Definition: mini-gmp.c:1937
void mpz_sub_ui(mpz_t r, const mpz_t a, uIntMpz b)
Definition: mini-gmp.c:1928
#define gmp_clz(count, x)
Definition: mini-gmp.c:79
#define GMP_MAX(a, b)
Definition: mini-gmp.c:70
void mpn_copyd(mp_ptr d, mp_srcptr s, mp_size_t n)
Definition: mini-gmp.c:352
void mpz_pow_ui(mpz_t r, const mpz_t b, uIntMpz e)
Definition: mini-gmp.c:3078
int mpz_cmpabs(const mpz_t u, const mpz_t v)
Definition: mini-gmp.c:1837
int mpz_set_str(mpz_t r, const char *sp, int base)
Definition: mini-gmp.c:4127
void mpz_realloc2(mpz_t x, mp_bitcnt_t n)
Definition: mini-gmp.c:1594
uIntMpz mpz_fdiv_q_ui(mpz_t q, const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2617
void mpn_copyi(mp_ptr d, mp_srcptr s, mp_size_t n)
Definition: mini-gmp.c:344
mp_limb_t mpn_add_1(mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
Definition: mini-gmp.c:400
#define gmp_umul_ppmm(w1, w0, u, v)
Definition: mini-gmp.c:114
int mpz_perfect_square_p(const mpz_t u)
Definition: mini-gmp.c:3306
intMpz mpz_get_si(const mpz_t u)
Definition: mini-gmp.c:1563
int mpz_init_set_str(mpz_t r, const char *sp, int base)
Definition: mini-gmp.c:4231
mp_bitcnt_t mpz_popcount(const mpz_t u)
Definition: mini-gmp.c:3877
#define MPZ_SRCPTR_SWAP(x, y)
Definition: mini-gmp.c:234
int mpz_cmp_si(const mpz_t u, intMpz v)
Definition: mini-gmp.c:1786
mp_limb_t mpn_mul_1(mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
Definition: mini-gmp.c:503
void mpz_lcm_ui(mpz_t r, const mpz_t u, uIntMpz v)
Definition: mini-gmp.c:3028
#define MPZ_PTR_SWAP(x, y)
Definition: mini-gmp.c:228
void mpz_init2(mpz_t r, mp_bitcnt_t bits)
Definition: mini-gmp.c:1437
#define GMP_NEG_CAST(T, x)
Definition: mini-gmp.c:67
mp_limb_t mpn_neg(mp_ptr rp, mp_srcptr up, mp_size_t n)
Definition: mini-gmp.c:717
void mpz_init_set(mpz_t r, const mpz_t x)
Definition: mini-gmp.c:1535
void mpz_set_ui(mpz_t r, uIntMpz x)
Definition: mini-gmp.c:1492
void mpz_cdiv_q_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
Definition: mini-gmp.c:2471
uIntMpz mpz_fdiv_qr_ui(mpz_t q, mpz_t r, const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2599
#define gmp_ctz(count, x)
Definition: mini-gmp.c:91
void mpz_tdiv_r_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
Definition: mini-gmp.c:2501
void mpz_combit(mpz_t d, mp_bitcnt_t bit_index)
Definition: mini-gmp.c:3618
void mpz_mod(mpz_t r, const mpz_t n, const mpz_t d)
Definition: mini-gmp.c:2341
#define MPZ_REALLOC(z, n)
Definition: mini-gmp.c:1474
void mpz_limbs_finish(mpz_t x, mp_size_t xs)
Definition: mini-gmp.c:1619
void mpz_add(mpz_t r, const mpz_t a, const mpz_t b)
Definition: mini-gmp.c:1993
void mpn_mul_n(mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
Definition: mini-gmp.c:601
uIntMpz mpz_tdiv_r_ui(mpz_t r, const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2639
#define MP_LIMB_T_SWAP(x, y)
Definition: mini-gmp.c:186
mp_bitcnt_t mpn_scan1(mp_srcptr ptr, mp_bitcnt_t bit)
Definition: mini-gmp.c:690
void mpz_cdiv_q(mpz_t q, const mpz_t n, const mpz_t d)
Definition: mini-gmp.c:2305
void mpz_fdiv_q_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
Definition: mini-gmp.c:2477
mp_limb_t mpn_rshift(mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
Definition: mini-gmp.c:643
void mpz_powm_ui(mpz_t r, const mpz_t b, uIntMpz elimb, const mpz_t m)
Definition: mini-gmp.c:3211
int mpz_divisible_p(const mpz_t n, const mpz_t d)
Definition: mini-gmp.c:2513
mp_srcptr mpz_limbs_read(mpz_srcptr x)
Definition: mini-gmp.c:1600
#define gmp_udiv_qrnnd_preinv(q, r, nh, nl, d, di)
Definition: mini-gmp.c:139
int mpz_fits_slong_p(const mpz_t u)
Definition: mini-gmp.c:1542
int mpz_cmpabs_ui(const mpz_t u, uIntMpz v)
Definition: mini-gmp.c:1828
void mpz_submul_ui(mpz_t r, const mpz_t u, uIntMpz v)
Definition: mini-gmp.c:2140
void mpz_import(mpz_t r, size_t count, int order, size_t size, int endian, size_t nails, const void *src)
Definition: mini-gmp.c:4261
void mpz_abs(mpz_t r, const mpz_t u)
Definition: mini-gmp.c:1844
size_t mpz_sizeinbase(const mpz_t u, int base)
Definition: mini-gmp.c:4009
mp_limb_t mpn_sub_n(mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
Definition: mini-gmp.c:472
void mpz_setbit(mpz_t d, mp_bitcnt_t bit_index)
Definition: mini-gmp.c:3594
#define gmp_assert_nocarry(x)
Definition: mini-gmp.c:74
mp_limb_t mpn_add_n(mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
Definition: mini-gmp.c:419
void mpz_gcd(mpz_t g, const mpz_t u, const mpz_t v)
Definition: mini-gmp.c:2762
mp_bitcnt_t mpz_scan1(const mpz_t u, mp_bitcnt_t starting_bit)
Definition: mini-gmp.c:3941
mpz_div_round_mode
Definition: mini-gmp.c:2171
@ GMP_DIV_FLOOR
Definition: mini-gmp.c:2171
@ GMP_DIV_TRUNC
Definition: mini-gmp.c:2171
@ GMP_DIV_CEIL
Definition: mini-gmp.c:2171
void mpz_set_si(mpz_t r, intMpz x)
Definition: mini-gmp.c:1480
#define GMP_LIMB_HIGHBIT
Definition: mini-gmp.c:58
void mpz_addmul(mpz_t r, const mpz_t u, const mpz_t v)
Definition: mini-gmp.c:2150
void mpz_init(mpz_t r)
Definition: mini-gmp.c:1425
void mpz_cdiv_r_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
Definition: mini-gmp.c:2489
void mpz_fdiv_q(mpz_t q, const mpz_t n, const mpz_t d)
Definition: mini-gmp.c:2311
void mp_set_memory_functions(void *(*alloc_func)(size_t), void *(*realloc_func)(void *, size_t, size_t), void(*free_func)(void *, size_t))
Definition: mini-gmp.c:308
int mpz_congruent_p(const mpz_t a, const mpz_t b, const mpz_t m)
Definition: mini-gmp.c:2519
uIntMpz mpz_cdiv_ui(const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2645
#define GMP_LLIMB_MASK
Definition: mini-gmp.c:61
#define GMP_LIMB_MAX
Definition: mini-gmp.c:57
#define MP_PTR_SWAP(x, y)
Definition: mini-gmp.c:204
uIntMpz mpz_gcd_ui(mpz_t g, const mpz_t u, uIntMpz v)
Definition: mini-gmp.c:2726
void mpz_powm(mpz_t r, const mpz_t b, const mpz_t e, const mpz_t m)
Definition: mini-gmp.c:3106
int mpz_invert(mpz_t r, const mpz_t u, const mpz_t m)
Definition: mini-gmp.c:3043
mp_bitcnt_t mpn_scan0(mp_srcptr ptr, mp_bitcnt_t bit)
Definition: mini-gmp.c:700
uIntMpz mpz_get_ui(const mpz_t u)
Definition: mini-gmp.c:1573
#define GMP_LIMB_BITS
Definition: mini-gmp.c:55
void mpn_sqr(mp_ptr rp, mp_srcptr ap, mp_size_t n)
Definition: mini-gmp.c:607
void mpz_init_set_si(mpz_t r, intMpz x)
Definition: mini-gmp.c:1521
void mpz_ui_pow_ui(mpz_t r, uIntMpz blimb, uIntMpz e)
Definition: mini-gmp.c:3099
#define GMP_CMP(a, b)
Definition: mini-gmp.c:72
void mpz_addmul_ui(mpz_t r, const mpz_t u, uIntMpz v)
Definition: mini-gmp.c:2130
#define GMP_PRIME_PRODUCT
Definition: mini-gmp.c:3406
uIntMpz mpz_fdiv_r_ui(mpz_t r, const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2634
void mpz_init_set_ui(mpz_t r, uIntMpz x)
Definition: mini-gmp.c:1528
uIntMpz mpz_mod_ui(mpz_t r, const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2663
mp_limb_t mpn_sub(mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
Definition: mini-gmp.c:490
#define MP_BITCNT_T_SWAP(x, y)
Definition: mini-gmp.c:198
mpz_srcptr mpz_roinit_n(mpz_t x, mp_srcptr xp, mp_size_t xs)
Definition: mini-gmp.c:1627
double mpz_get_d(const mpz_t u)
Definition: mini-gmp.c:1696
#define MPN_SRCPTR_SWAP(xp, xs, yp, ys)
Definition: mini-gmp.c:222
int mpn_cmp(mp_srcptr ap, mp_srcptr bp, mp_size_t n)
Definition: mini-gmp.c:359
void mpz_ior(mpz_t r, const mpz_t u, const mpz_t v)
Definition: mini-gmp.c:3706
uIntMpz mpz_cdiv_qr_ui(mpz_t q, mpz_t r, const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2593
void mpz_mul(mpz_t r, const mpz_t u, const mpz_t v)
Definition: mini-gmp.c:2058
int mpz_cmpabs_d(const mpz_t x, double d)
Definition: mini-gmp.c:1718
mp_bitcnt_t mpz_scan0(const mpz_t u, mp_bitcnt_t starting_bit)
Definition: mini-gmp.c:3977
size_t mpn_get_str(unsigned char *sp, int base, mp_ptr up, mp_size_t un)
Definition: mini-gmp.c:1312
mp_limb_t mpn_lshift(mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
Definition: mini-gmp.c:613
int mpz_sgn(const mpz_t u)
Definition: mini-gmp.c:1780
void mpz_sqrt(mpz_t s, const mpz_t u)
Definition: mini-gmp.c:3300
int mpz_cmp_ui(const mpz_t u, uIntMpz v)
Definition: mini-gmp.c:1801
uIntMpz mpz_tdiv_ui(const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2657
char * mpz_get_str(char *sp, int base, const mpz_t u)
Definition: mini-gmp.c:4062
void mpz_fdiv_r(mpz_t r, const mpz_t n, const mpz_t d)
Definition: mini-gmp.c:2329
void mpn_zero(mp_ptr rp, mp_size_t n)
Definition: mini-gmp.c:393
mp_ptr mpz_limbs_modify(mpz_t x, mp_size_t n)
Definition: mini-gmp.c:1606
void mpz_set_d(mpz_t r, double x)
Definition: mini-gmp.c:1638
mp_limb_t mpn_submul_1(mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
Definition: mini-gmp.c:552
#define gmp_free(p)
Definition: mini-gmp.c:325
mp_size_t mpn_sqrtrem(mp_ptr sp, mp_ptr rp, mp_srcptr p, mp_size_t n)
Definition: mini-gmp.c:3325
int mpn_zero_p(mp_srcptr rp, mp_size_t n)
Definition: mini-gmp.c:387
void mpz_tdiv_qr(mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
Definition: mini-gmp.c:2299
void mpz_com(mpz_t r, const mpz_t u)
Definition: mini-gmp.c:3627
void mpz_cdiv_r(mpz_t r, const mpz_t n, const mpz_t d)
Definition: mini-gmp.c:2323
void mpz_clear(mpz_t r)
Definition: mini-gmp.c:1450
int mpz_tstbit(const mpz_t d, mp_bitcnt_t bit_index)
Definition: mini-gmp.c:3499
void mpn_com(mp_ptr rp, mp_srcptr up, mp_size_t n)
Definition: mini-gmp.c:710
void mpz_swap(mpz_t u, mpz_t v)
Definition: mini-gmp.c:1858
mp_limb_t mpn_mul(mp_ptr rp, mp_srcptr up, mp_size_t un, mp_srcptr vp, mp_size_t vn)
Definition: mini-gmp.c:578
mp_limb_t mpn_sub_1(mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
Definition: mini-gmp.c:451
mp_bitcnt_t mpz_hamdist(const mpz_t u, const mpz_t v)
Definition: mini-gmp.c:3890
void mpz_lcm(mpz_t r, const mpz_t u, const mpz_t v)
Definition: mini-gmp.c:3007
void mpz_fdiv_r_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
Definition: mini-gmp.c:2495
void mpz_init_set_d(mpz_t r, double x)
Definition: mini-gmp.c:1689
int mpz_probab_prime_p(const mpz_t n, int reps)
Definition: mini-gmp.c:3413
void * mpz_export(void *r, size_t *countp, int order, size_t size, int endian, size_t nails, const mpz_t u)
Definition: mini-gmp.c:4329
int mpz_divisible_ui_p(const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2675
void mpz_sub(mpz_t r, const mpz_t a, const mpz_t b)
Definition: mini-gmp.c:2006
size_t mpz_out_str(FILE *stream, int base, const mpz_t x)
Definition: mini-gmp.c:4238
void mpz_gcdext(mpz_t g, mpz_t s, mpz_t t, const mpz_t u, const mpz_t v)
Definition: mini-gmp.c:2825
void mp_get_memory_functions(void *(**alloc_func)(size_t), void *(**realloc_func)(void *, size_t, size_t), void(**free_func)(void *, size_t))
Definition: mini-gmp.c:293
void mpz_bin_uiui(mpz_t r, uIntMpz n, uIntMpz k)
Definition: mini-gmp.c:3358
const int mp_bits_per_limb
Definition: mini-gmp.c:241
void mpz_fac_ui(mpz_t x, uIntMpz n)
Definition: mini-gmp.c:3350
mp_limb_t mpn_invert_3by2(mp_limb_t u1, mp_limb_t u0)
Definition: mini-gmp.c:739
void mpz_add_ui(mpz_t r, const mpz_t a, uIntMpz b)
Definition: mini-gmp.c:1919
mp_limb_t mpn_add(mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
Definition: mini-gmp.c:438
void mpz_mul_si(mpz_t r, const mpz_t u, intMpz v)
Definition: mini-gmp.c:2021
uIntMpz mpz_tdiv_qr_ui(mpz_t q, mpz_t r, const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2605
size_t mpz_size(const mpz_t u)
Definition: mini-gmp.c:1579
#define GMP_PRIME_MASK
Definition: mini-gmp.c:3410
mp_ptr mpz_limbs_write(mpz_t x, mp_size_t n)
Definition: mini-gmp.c:1613
void mpz_set(mpz_t r, const mpz_t x)
Definition: mini-gmp.c:1504
void mpz_neg(mpz_t r, const mpz_t u)
Definition: mini-gmp.c:1851
void mpz_mul_2exp(mpz_t r, const mpz_t u, mp_bitcnt_t bits)
Definition: mini-gmp.c:2096
void mpz_fdiv_qr(mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
Definition: mini-gmp.c:2293
mp_limb_t mpn_addmul_1(mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
Definition: mini-gmp.c:526
void mpz_rootrem(mpz_t x, mpz_t r, const mpz_t y, uIntMpz z)
Definition: mini-gmp.c:3219
void mpz_mul_ui(mpz_t r, const mpz_t u, uIntMpz v)
Definition: mini-gmp.c:2033
int mpn_perfect_square_p(mp_srcptr p, mp_size_t n)
Definition: mini-gmp.c:3315
void mpz_divexact(mpz_t q, const mpz_t n, const mpz_t d)
Definition: mini-gmp.c:2507
void mpz_xor(mpz_t r, const mpz_t u, const mpz_t v)
Definition: mini-gmp.c:3779
void mpz_tdiv_q(mpz_t q, const mpz_t n, const mpz_t d)
Definition: mini-gmp.c:2317
mp_limb_t mpz_getlimbn(const mpz_t u, mp_size_t n)
Definition: mini-gmp.c:1585
int mpz_cmp(const mpz_t a, const mpz_t b)
Definition: mini-gmp.c:1814
int mpz_cmp_d(const mpz_t x, double d)
Definition: mini-gmp.c:1759
#define GMP_MIN(a, b)
Definition: mini-gmp.c:69
void mpz_submul(mpz_t r, const mpz_t u, const mpz_t v)
Definition: mini-gmp.c:2160
int mpz_root(mpz_t x, const mpz_t y, uIntMpz z)
Definition: mini-gmp.c:3279
#define GMP_ABS(x)
Definition: mini-gmp.c:66
#define gmp_xalloc(size)
Definition: mini-gmp.c:324
#define MP_SIZE_T_SWAP(x, y)
Definition: mini-gmp.c:192
uIntMpz mpz_cdiv_q_ui(mpz_t q, const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2611
void mpz_divexact_ui(mpz_t q, const mpz_t n, uIntMpz d)
Definition: mini-gmp.c:2669
void mpz_cdiv_qr(mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
Definition: mini-gmp.c:2287
mp_bitcnt_t mpn_popcount(mp_srcptr p, mp_size_t n)
Definition: mini-gmp.c:3865
uIntMpz mp_limb_t
Definition: mini-gmp.h:61
mp_limb_t * mp_ptr
Definition: mini-gmp.h:65
#define mpz_odd_p(z)
Definition: mini-gmp.h:131
unsigned long long uIntMpz
Definition: mini-gmp.h:58
intMpz mp_size_t
Definition: mini-gmp.h:62
#define UN_USED(X)
Definition: mini-gmp.h:48
__mpz_struct mpz_t[1]
Definition: mini-gmp.h:78
const mp_limb_t * mp_srcptr
Definition: mini-gmp.h:66
long long intMpz
Definition: mini-gmp.h:59
#define mpz_even_p(z)
Definition: mini-gmp.h:132
uIntMpz mp_bitcnt_t
Definition: mini-gmp.h:63
#define mpn_invert_limb(x)
Definition: mini-gmp.h:122
int _mp_alloc
Definition: mini-gmp.h:70
int _mp_size
Definition: mini-gmp.h:72
mp_limb_t * _mp_d
Definition: mini-gmp.h:75
unsigned shift
Definition: mini-gmp.c:847
mp_limb_t d1
Definition: mini-gmp.c:849
mp_limb_t di
Definition: mini-gmp.c:851
mp_limb_t d0
Definition: mini-gmp.c:849
mp_limb_t bb
Definition: mini-gmp.c:1187
unsigned exp
Definition: mini-gmp.c:1186