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