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