1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 #ifndef __MINI_GMP_H__
39 #define __MINI_GMP_H__
40
41
42 #include <stddef.h>
43
44 #if defined (__cplusplus)
45 extern "C" {
46 #endif
47
48 void mp_set_memory_functions (void *(*) (size_t),
49 void *(*) (void *, size_t, size_t),
50 void (*) (void *, size_t));
51
52 void 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
60 typedef unsigned MINI_GMP_LIMB_TYPE mp_limb_t;
61 typedef long mp_size_t;
62 typedef unsigned long mp_bitcnt_t;
63
64 typedef mp_limb_t *mp_ptr;
65 typedef const mp_limb_t *mp_srcptr;
66
67 typedef struct
68 {
69 int _mp_alloc;
70
71 int _mp_size;
72
73
74 mp_limb_t *_mp_d;
75 } __mpz_struct;
76
77 typedef __mpz_struct mpz_t[1];
78
79 typedef __mpz_struct *mpz_ptr;
80 typedef const __mpz_struct *mpz_srcptr;
81
82 extern const int mp_bits_per_limb;
83
84 void mpn_copyi (mp_ptr, mp_srcptr, mp_size_t);
85 void mpn_copyd (mp_ptr, mp_srcptr, mp_size_t);
86 void mpn_zero (mp_ptr, mp_size_t);
87
88 int mpn_cmp (mp_srcptr, mp_srcptr, mp_size_t);
89 int mpn_zero_p (mp_srcptr, mp_size_t);
90
91 mp_limb_t mpn_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
92 mp_limb_t mpn_add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
93 mp_limb_t mpn_add (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
94
95 mp_limb_t mpn_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
96 mp_limb_t mpn_sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
97 mp_limb_t mpn_sub (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
98
99 mp_limb_t mpn_mul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
100 mp_limb_t mpn_addmul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
101 mp_limb_t mpn_submul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
102
103 mp_limb_t mpn_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
104 void mpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
105 void mpn_sqr (mp_ptr, mp_srcptr, mp_size_t);
106 int mpn_perfect_square_p (mp_srcptr, mp_size_t);
107 mp_size_t mpn_sqrtrem (mp_ptr, mp_ptr, mp_srcptr, mp_size_t);
108
109 mp_limb_t mpn_lshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
110 mp_limb_t mpn_rshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
111
112 mp_bitcnt_t mpn_scan0 (mp_srcptr, mp_bitcnt_t);
113 mp_bitcnt_t mpn_scan1 (mp_srcptr, mp_bitcnt_t);
114
115 void mpn_com (mp_ptr, mp_srcptr, mp_size_t);
116 mp_limb_t mpn_neg (mp_ptr, mp_srcptr, mp_size_t);
117
118 mp_bitcnt_t mpn_popcount (mp_srcptr, mp_size_t);
119
120 mp_limb_t mpn_invert_3by2 (mp_limb_t, mp_limb_t);
121 #define mpn_invert_limb(x) mpn_invert_3by2 ((x), 0)
122
123 size_t mpn_get_str (unsigned char *, int, mp_ptr, mp_size_t);
124 mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int);
125
126 void mpz_init (mpz_t);
127 void mpz_init2 (mpz_t, mp_bitcnt_t);
128 void 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
133 int mpz_sgn (const mpz_t);
134 int mpz_cmp_si (const mpz_t, long);
135 int mpz_cmp_ui (const mpz_t, unsigned long);
136 int mpz_cmp (const mpz_t, const mpz_t);
137 int mpz_cmpabs_ui (const mpz_t, unsigned long);
138 int mpz_cmpabs (const mpz_t, const mpz_t);
139 int mpz_cmp_d (const mpz_t, double);
140 int mpz_cmpabs_d (const mpz_t, double);
141
142 void mpz_abs (mpz_t, const mpz_t);
143 void mpz_neg (mpz_t, const mpz_t);
144 void mpz_swap (mpz_t, mpz_t);
145
146 void mpz_add_ui (mpz_t, const mpz_t, unsigned long);
147 void mpz_add (mpz_t, const mpz_t, const mpz_t);
148 void mpz_sub_ui (mpz_t, const mpz_t, unsigned long);
149 void mpz_ui_sub (mpz_t, unsigned long, const mpz_t);
150 void mpz_sub (mpz_t, const mpz_t, const mpz_t);
151
152 void mpz_mul_si (mpz_t, const mpz_t, long int);
153 void mpz_mul_ui (mpz_t, const mpz_t, unsigned long int);
154 void mpz_mul (mpz_t, const mpz_t, const mpz_t);
155 void mpz_mul_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
156 void mpz_addmul_ui (mpz_t, const mpz_t, unsigned long int);
157 void mpz_addmul (mpz_t, const mpz_t, const mpz_t);
158 void mpz_submul_ui (mpz_t, const mpz_t, unsigned long int);
159 void mpz_submul (mpz_t, const mpz_t, const mpz_t);
160
161 void mpz_cdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
162 void mpz_fdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
163 void mpz_tdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
164 void mpz_cdiv_q (mpz_t, const mpz_t, const mpz_t);
165 void mpz_fdiv_q (mpz_t, const mpz_t, const mpz_t);
166 void mpz_tdiv_q (mpz_t, const mpz_t, const mpz_t);
167 void mpz_cdiv_r (mpz_t, const mpz_t, const mpz_t);
168 void mpz_fdiv_r (mpz_t, const mpz_t, const mpz_t);
169 void mpz_tdiv_r (mpz_t, const mpz_t, const mpz_t);
170
171 void mpz_cdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
172 void mpz_fdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
173 void mpz_tdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
174 void mpz_cdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
175 void mpz_fdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
176 void mpz_tdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
177
178 void mpz_mod (mpz_t, const mpz_t, const mpz_t);
179
180 void mpz_divexact (mpz_t, const mpz_t, const mpz_t);
181
182 int mpz_divisible_p (const mpz_t, const mpz_t);
183 int mpz_congruent_p (const mpz_t, const mpz_t, const mpz_t);
184
185 unsigned long mpz_cdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
186 unsigned long mpz_fdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
187 unsigned long mpz_tdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
188 unsigned long mpz_cdiv_q_ui (mpz_t, const mpz_t, unsigned long);
189 unsigned long mpz_fdiv_q_ui (mpz_t, const mpz_t, unsigned long);
190 unsigned long mpz_tdiv_q_ui (mpz_t, const mpz_t, unsigned long);
191 unsigned long mpz_cdiv_r_ui (mpz_t, const mpz_t, unsigned long);
192 unsigned long mpz_fdiv_r_ui (mpz_t, const mpz_t, unsigned long);
193 unsigned long mpz_tdiv_r_ui (mpz_t, const mpz_t, unsigned long);
194 unsigned long mpz_cdiv_ui (const mpz_t, unsigned long);
195 unsigned long mpz_fdiv_ui (const mpz_t, unsigned long);
196 unsigned long mpz_tdiv_ui (const mpz_t, unsigned long);
197
198 unsigned long mpz_mod_ui (mpz_t, const mpz_t, unsigned long);
199
200 void mpz_divexact_ui (mpz_t, const mpz_t, unsigned long);
201
202 int mpz_divisible_ui_p (const mpz_t, unsigned long);
203
204 unsigned long mpz_gcd_ui (mpz_t, const mpz_t, unsigned long);
205 void mpz_gcd (mpz_t, const mpz_t, const mpz_t);
206 void mpz_gcdext (mpz_t, mpz_t, mpz_t, const mpz_t, const mpz_t);
207 void mpz_lcm_ui (mpz_t, const mpz_t, unsigned long);
208 void mpz_lcm (mpz_t, const mpz_t, const mpz_t);
209 int mpz_invert (mpz_t, const mpz_t, const mpz_t);
210
211 void mpz_sqrtrem (mpz_t, mpz_t, const mpz_t);
212 void mpz_sqrt (mpz_t, const mpz_t);
213 int mpz_perfect_square_p (const mpz_t);
214
215 void mpz_pow_ui (mpz_t, const mpz_t, unsigned long);
216 void mpz_ui_pow_ui (mpz_t, unsigned long, unsigned long);
217 void mpz_powm (mpz_t, const mpz_t, const mpz_t, const mpz_t);
218 void mpz_powm_ui (mpz_t, const mpz_t, unsigned long, const mpz_t);
219
220 void mpz_rootrem (mpz_t, mpz_t, const mpz_t, unsigned long);
221 int mpz_root (mpz_t, const mpz_t, unsigned long);
222
223 void mpz_fac_ui (mpz_t, unsigned long);
224 void mpz_2fac_ui (mpz_t, unsigned long);
225 void mpz_mfac_uiui (mpz_t, unsigned long, unsigned long);
226 void mpz_bin_uiui (mpz_t, unsigned long, unsigned long);
227
228 int mpz_probab_prime_p (const mpz_t, int);
229
230 int mpz_tstbit (const mpz_t, mp_bitcnt_t);
231 void mpz_setbit (mpz_t, mp_bitcnt_t);
232 void mpz_clrbit (mpz_t, mp_bitcnt_t);
233 void mpz_combit (mpz_t, mp_bitcnt_t);
234
235 void mpz_com (mpz_t, const mpz_t);
236 void mpz_and (mpz_t, const mpz_t, const mpz_t);
237 void mpz_ior (mpz_t, const mpz_t, const mpz_t);
238 void mpz_xor (mpz_t, const mpz_t, const mpz_t);
239
240 mp_bitcnt_t mpz_popcount (const mpz_t);
241 mp_bitcnt_t mpz_hamdist (const mpz_t, const mpz_t);
242 mp_bitcnt_t mpz_scan0 (const mpz_t, mp_bitcnt_t);
243 mp_bitcnt_t mpz_scan1 (const mpz_t, mp_bitcnt_t);
244
245 int mpz_fits_slong_p (const mpz_t);
246 int mpz_fits_ulong_p (const mpz_t);
247 int mpz_fits_sint_p (const mpz_t);
248 int mpz_fits_uint_p (const mpz_t);
249 int mpz_fits_sshort_p (const mpz_t);
250 int mpz_fits_ushort_p (const mpz_t);
251 long int mpz_get_si (const mpz_t);
252 unsigned long int mpz_get_ui (const mpz_t);
253 double mpz_get_d (const mpz_t);
254 size_t mpz_size (const mpz_t);
255 mp_limb_t mpz_getlimbn (const mpz_t, mp_size_t);
256
257 void mpz_realloc2 (mpz_t, mp_bitcnt_t);
258 mp_srcptr mpz_limbs_read (mpz_srcptr);
259 mp_ptr mpz_limbs_modify (mpz_t, mp_size_t);
260 mp_ptr mpz_limbs_write (mpz_t, mp_size_t);
261 void mpz_limbs_finish (mpz_t, mp_size_t);
262 mpz_srcptr mpz_roinit_n (mpz_t, mp_srcptr, mp_size_t);
263
264 #define MPZ_ROINIT_N(xp, xs) {{0, (xs),(xp) }}
265
266 void mpz_set_si (mpz_t, signed long int);
267 void mpz_set_ui (mpz_t, unsigned long int);
268 void mpz_set (mpz_t, const mpz_t);
269 void mpz_set_d (mpz_t, double);
270
271 void mpz_init_set_si (mpz_t, signed long int);
272 void mpz_init_set_ui (mpz_t, unsigned long int);
273 void mpz_init_set (mpz_t, const mpz_t);
274 void mpz_init_set_d (mpz_t, double);
275
276 size_t mpz_sizeinbase (const mpz_t, int);
277 char *mpz_get_str (char *, int, const mpz_t);
278 int mpz_set_str (mpz_t, const char *, int);
279 int mpz_init_set_str (mpz_t, const char *, int);
280
281
282
283
284 #if defined (FILE) \
285 || defined (H_STDIO) \
286 || defined (_H_STDIO) \
287 || defined (_STDIO_H) \
288 || defined (_STDIO_H_) \
289 || defined (__STDIO_H) \
290 || defined (__STDIO_H__) \
291 || defined (_STDIO_INCLUDED) \
292 || defined (__dj_include_stdio_h_) \
293 || defined (_FILE_DEFINED) \
294 || defined (__STDIO__) \
295 || defined (_MSL_STDIO_H) \
296 || defined (_STDIO_H_INCLUDED) \
297 || defined (_ISO_STDIO_ISO_H) \
298 || defined (__STDIO_LOADED) \
299 || defined (_STDIO) \
300 || defined (__DEFINED_FILE)
301 size_t mpz_out_str (FILE *, int, const mpz_t);
302 #endif
303
304 void mpz_import (mpz_t, size_t, int, size_t, int, size_t, const void *);
305 void *mpz_export (void *, size_t *, int, size_t, int, size_t, const mpz_t);
306
307 #if defined (__cplusplus)
308 }
309 #endif
310 #endif