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