1/* mini-gmp, a minimalistic implementation of a GNU GMP subset.
2
3Copyright 2011-2015, 2017, 2019-2020 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
56#ifndef MINI_GMP_LIMB_TYPE
57#define MINI_GMP_LIMB_TYPE long
58#endif
59
60typedef unsigned MINI_GMP_LIMB_TYPE mp_limb_t;
61typedef long mp_size_t;
62typedef unsigned long mp_bitcnt_t;
63
64typedef mp_limb_t *mp_ptr;
65typedef const mp_limb_t *mp_srcptr;
66
67typedef struct
68{
69  int _mp_alloc;		/* Number of *limbs* allocated and pointed
70				   to by the _mp_d field.  */
71  int _mp_size;			/* abs(_mp_size) is the number of limbs the
72				   last field points to.  If _mp_size is
73				   negative this is a negative number.  */
74  mp_limb_t *_mp_d;		/* Pointer to the limbs.  */
75} __mpz_struct;
76
77typedef __mpz_struct mpz_t[1];
78
79typedef __mpz_struct *mpz_ptr;
80typedef const __mpz_struct *mpz_srcptr;
81
82extern const int mp_bits_per_limb;
83
84void mpn_copyi (mp_ptr, mp_srcptr, mp_size_t);
85void mpn_copyd (mp_ptr, mp_srcptr, mp_size_t);
86void mpn_zero (mp_ptr, mp_size_t);
87
88int mpn_cmp (mp_srcptr, mp_srcptr, mp_size_t);
89int mpn_zero_p (mp_srcptr, mp_size_t);
90
91mp_limb_t mpn_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
92mp_limb_t mpn_add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
93mp_limb_t mpn_add (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
94
95mp_limb_t mpn_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
96mp_limb_t mpn_sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
97mp_limb_t mpn_sub (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
98
99mp_limb_t mpn_mul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
100mp_limb_t mpn_addmul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
101mp_limb_t mpn_submul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
102
103mp_limb_t mpn_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
104void mpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
105void mpn_sqr (mp_ptr, mp_srcptr, mp_size_t);
106int mpn_perfect_square_p (mp_srcptr, mp_size_t);
107mp_size_t mpn_sqrtrem (mp_ptr, mp_ptr, mp_srcptr, mp_size_t);
108
109mp_limb_t mpn_lshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
110mp_limb_t mpn_rshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
111
112mp_bitcnt_t mpn_scan0 (mp_srcptr, mp_bitcnt_t);
113mp_bitcnt_t mpn_scan1 (mp_srcptr, mp_bitcnt_t);
114
115void mpn_com (mp_ptr, mp_srcptr, mp_size_t);
116mp_limb_t mpn_neg (mp_ptr, mp_srcptr, mp_size_t);
117
118mp_bitcnt_t mpn_popcount (mp_srcptr, mp_size_t);
119
120mp_limb_t mpn_invert_3by2 (mp_limb_t, mp_limb_t);
121#define mpn_invert_limb(x) mpn_invert_3by2 ((x), 0)
122
123size_t mpn_get_str (unsigned char *, int, mp_ptr, mp_size_t);
124mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int);
125
126void mpz_init (mpz_t);
127void mpz_init2 (mpz_t, mp_bitcnt_t);
128void mpz_clear (mpz_t);
129
130#define mpz_odd_p(z)   (((z)->_mp_size != 0) & (int) (z)->_mp_d[0])
131#define mpz_even_p(z)  (! mpz_odd_p (z))
132
133int mpz_sgn (const mpz_t);
134int mpz_cmp_si (const mpz_t, long);
135int mpz_cmp_ui (const mpz_t, unsigned long);
136int mpz_cmp (const mpz_t, const mpz_t);
137int mpz_cmpabs_ui (const mpz_t, unsigned long);
138int mpz_cmpabs (const mpz_t, const mpz_t);
139int mpz_cmp_d (const mpz_t, double);
140int mpz_cmpabs_d (const mpz_t, double);
141
142void mpz_abs (mpz_t, const mpz_t);
143void mpz_neg (mpz_t, const mpz_t);
144void mpz_swap (mpz_t, mpz_t);
145
146void mpz_add_ui (mpz_t, const mpz_t, unsigned long);
147void mpz_add (mpz_t, const mpz_t, const mpz_t);
148void mpz_sub_ui (mpz_t, const mpz_t, unsigned long);
149void mpz_ui_sub (mpz_t, unsigned long, const mpz_t);
150void mpz_sub (mpz_t, const mpz_t, const mpz_t);
151
152void mpz_mul_si (mpz_t, const mpz_t, long int);
153void mpz_mul_ui (mpz_t, const mpz_t, unsigned long int);
154void mpz_mul (mpz_t, const mpz_t, const mpz_t);
155void mpz_mul_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
156void mpz_addmul_ui (mpz_t, const mpz_t, unsigned long int);
157void mpz_addmul (mpz_t, const mpz_t, const mpz_t);
158void mpz_submul_ui (mpz_t, const mpz_t, unsigned long int);
159void mpz_submul (mpz_t, const mpz_t, const mpz_t);
160
161void mpz_cdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
162void mpz_fdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
163void mpz_tdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
164void mpz_cdiv_q (mpz_t, const mpz_t, const mpz_t);
165void mpz_fdiv_q (mpz_t, const mpz_t, const mpz_t);
166void mpz_tdiv_q (mpz_t, const mpz_t, const mpz_t);
167void mpz_cdiv_r (mpz_t, const mpz_t, const mpz_t);
168void mpz_fdiv_r (mpz_t, const mpz_t, const mpz_t);
169void mpz_tdiv_r (mpz_t, const mpz_t, const mpz_t);
170
171void mpz_cdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
172void mpz_fdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
173void mpz_tdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
174void mpz_cdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
175void mpz_fdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
176void mpz_tdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
177
178void mpz_mod (mpz_t, const mpz_t, const mpz_t);
179
180void mpz_divexact (mpz_t, const mpz_t, const mpz_t);
181
182int mpz_divisible_p (const mpz_t, const mpz_t);
183int mpz_congruent_p (const mpz_t, const mpz_t, const mpz_t);
184
185unsigned long mpz_cdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
186unsigned long mpz_fdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
187unsigned long mpz_tdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
188unsigned long mpz_cdiv_q_ui (mpz_t, const mpz_t, unsigned long);
189unsigned long mpz_fdiv_q_ui (mpz_t, const mpz_t, unsigned long);
190unsigned long mpz_tdiv_q_ui (mpz_t, const mpz_t, unsigned long);
191unsigned long mpz_cdiv_r_ui (mpz_t, const mpz_t, unsigned long);
192unsigned long mpz_fdiv_r_ui (mpz_t, const mpz_t, unsigned long);
193unsigned long mpz_tdiv_r_ui (mpz_t, const mpz_t, unsigned long);
194unsigned long mpz_cdiv_ui (const mpz_t, unsigned long);
195unsigned long mpz_fdiv_ui (const mpz_t, unsigned long);
196unsigned long mpz_tdiv_ui (const mpz_t, unsigned long);
197
198unsigned long mpz_mod_ui (mpz_t, const mpz_t, unsigned long);
199
200void mpz_divexact_ui (mpz_t, const mpz_t, unsigned long);
201
202int mpz_divisible_ui_p (const mpz_t, unsigned long);
203
204unsigned long mpz_gcd_ui (mpz_t, const mpz_t, unsigned long);
205void mpz_gcd (mpz_t, const mpz_t, const mpz_t);
206void mpz_gcdext (mpz_t, mpz_t, mpz_t, const mpz_t, const mpz_t);
207void mpz_lcm_ui (mpz_t, const mpz_t, unsigned long);
208void mpz_lcm (mpz_t, const mpz_t, const mpz_t);
209int mpz_invert (mpz_t, const mpz_t, const mpz_t);
210
211void mpz_sqrtrem (mpz_t, mpz_t, const mpz_t);
212void mpz_sqrt (mpz_t, const mpz_t);
213int mpz_perfect_square_p (const mpz_t);
214
215void mpz_pow_ui (mpz_t, const mpz_t, unsigned long);
216void mpz_ui_pow_ui (mpz_t, unsigned long, unsigned long);
217void mpz_powm (mpz_t, const mpz_t, const mpz_t, const mpz_t);
218void mpz_powm_ui (mpz_t, const mpz_t, unsigned long, const mpz_t);
219
220void mpz_rootrem (mpz_t, mpz_t, const mpz_t, unsigned long);
221int mpz_root (mpz_t, const mpz_t, unsigned long);
222
223void mpz_fac_ui (mpz_t, unsigned long);
224void mpz_2fac_ui (mpz_t, unsigned long);
225void mpz_mfac_uiui (mpz_t, unsigned long, unsigned long);
226void mpz_bin_uiui (mpz_t, unsigned long, unsigned long);
227
228int mpz_probab_prime_p (const mpz_t, int);
229
230int mpz_tstbit (const mpz_t, mp_bitcnt_t);
231void mpz_setbit (mpz_t, mp_bitcnt_t);
232void mpz_clrbit (mpz_t, mp_bitcnt_t);
233void mpz_combit (mpz_t, mp_bitcnt_t);
234
235void mpz_com (mpz_t, const mpz_t);
236void mpz_and (mpz_t, const mpz_t, const mpz_t);
237void mpz_ior (mpz_t, const mpz_t, const mpz_t);
238void mpz_xor (mpz_t, const mpz_t, const mpz_t);
239
240mp_bitcnt_t mpz_popcount (const mpz_t);
241mp_bitcnt_t mpz_hamdist (const mpz_t, const mpz_t);
242mp_bitcnt_t mpz_scan0 (const mpz_t, mp_bitcnt_t);
243mp_bitcnt_t mpz_scan1 (const mpz_t, mp_bitcnt_t);
244
245int mpz_fits_slong_p (const mpz_t);
246int mpz_fits_ulong_p (const mpz_t);
247long int mpz_get_si (const mpz_t);
248unsigned long int mpz_get_ui (const mpz_t);
249double mpz_get_d (const mpz_t);
250size_t mpz_size (const mpz_t);
251mp_limb_t mpz_getlimbn (const mpz_t, mp_size_t);
252
253void mpz_realloc2 (mpz_t, mp_bitcnt_t);
254mp_srcptr mpz_limbs_read (mpz_srcptr);
255mp_ptr mpz_limbs_modify (mpz_t, mp_size_t);
256mp_ptr mpz_limbs_write (mpz_t, mp_size_t);
257void mpz_limbs_finish (mpz_t, mp_size_t);
258mpz_srcptr mpz_roinit_n (mpz_t, mp_srcptr, mp_size_t);
259
260#define MPZ_ROINIT_N(xp, xs) {{0, (xs),(xp) }}
261
262void mpz_set_si (mpz_t, signed long int);
263void mpz_set_ui (mpz_t, unsigned long int);
264void mpz_set (mpz_t, const mpz_t);
265void mpz_set_d (mpz_t, double);
266
267void mpz_init_set_si (mpz_t, signed long int);
268void mpz_init_set_ui (mpz_t, unsigned long int);
269void mpz_init_set (mpz_t, const mpz_t);
270void mpz_init_set_d (mpz_t, double);
271
272size_t mpz_sizeinbase (const mpz_t, int);
273char *mpz_get_str (char *, int, const mpz_t);
274int mpz_set_str (mpz_t, const char *, int);
275int mpz_init_set_str (mpz_t, const char *, int);
276
277/* This long list taken from gmp.h. */
278/* For reference, "defined(EOF)" cannot be used here.  In g++ 2.95.4,
279   <iostream> defines EOF but not FILE.  */
280#if defined (FILE)                                              \
281  || defined (H_STDIO)                                          \
282  || defined (_H_STDIO)               /* AIX */                 \
283  || defined (_STDIO_H)               /* glibc, Sun, SCO */     \
284  || defined (_STDIO_H_)              /* BSD, OSF */            \
285  || defined (__STDIO_H)              /* Borland */             \
286  || defined (__STDIO_H__)            /* IRIX */                \
287  || defined (_STDIO_INCLUDED)        /* HPUX */                \
288  || defined (__dj_include_stdio_h_)  /* DJGPP */               \
289  || defined (_FILE_DEFINED)          /* Microsoft */           \
290  || defined (__STDIO__)              /* Apple MPW MrC */       \
291  || defined (_MSL_STDIO_H)           /* Metrowerks */          \
292  || defined (_STDIO_H_INCLUDED)      /* QNX4 */		\
293  || defined (_ISO_STDIO_ISO_H)       /* Sun C++ */		\
294  || defined (__STDIO_LOADED)         /* VMS */			\
295  || defined (__DEFINED_FILE)         /* musl */
296size_t mpz_out_str (FILE *, int, const mpz_t);
297#endif
298
299void mpz_import (mpz_t, size_t, int, size_t, int, size_t, const void *);
300void *mpz_export (void *, size_t *, int, size_t, int, size_t, const mpz_t);
301
302#if defined (__cplusplus)
303}
304#endif
305#endif /* __MINI_GMP_H__ */
306