1 #ifndef MPFQ_P_14_H_
2 #define MPFQ_P_14_H_
3 
4 /* MPFQ generated file -- do not edit */
5 
6 #include "mpfq.h"
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <assert.h>
11 #include <stdint.h>
12 #include <ctype.h>
13 #include <stddef.h>
14 #include <stdio.h>
15 #include "assert.h"
16 #include <limits.h>
17 #include "mpfq_fixmp.h"
18 #include "mpfq_gfp_common.h"
19 #include "mpfq_vbase.h"
20 #ifdef	MPFQ_LAST_GENERATED_TAG
21 #undef	MPFQ_LAST_GENERATED_TAG
22 #endif
23 #define MPFQ_LAST_GENERATED_TAG      p_14
24 
25 /* Active handler: simd_gfp */
26 /* Automatically generated code  */
27 /* Active handler: Mpfq::defaults */
28 /* Active handler: Mpfq::defaults::vec */
29 /* Active handler: Mpfq::defaults::poly */
30 /* Active handler: Mpfq::gfp::field */
31 /* Active handler: Mpfq::gfp::elt */
32 /* Options used:{
33    family=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_14, tag=p_14, }, ],
34    fieldtype=prime,
35    n=14,
36    nn=29,
37    opthw=,
38    tag=p_14,
39    type=plain,
40    vbase_stuff={
41     choose_byfeatures=<code>,
42     families=[
43      [
44       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_m128, tag=m128, },
45       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k1, tag=u64k1, },
46       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k2, tag=u64k2, },
47       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k3, tag=u64k3, },
48       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k4, tag=u64k4, },
49       ],
50      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_1, tag=p_1, }, ],
51      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_10, tag=p_10, }, ],
52      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_11, tag=p_11, }, ],
53      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_12, tag=p_12, }, ],
54      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_13, tag=p_13, }, ],
55      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_14, tag=p_14, }, ],
56      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_15, tag=p_15, }, ],
57      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_2, tag=p_2, }, ],
58      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_3, tag=p_3, }, ],
59      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_4, tag=p_4, }, ],
60      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_5, tag=p_5, }, ],
61      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_6, tag=p_6, }, ],
62      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_7, tag=p_7, }, ],
63      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_8, tag=p_8, }, ],
64      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_9, tag=p_9, }, ],
65      [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_pz, tag=pz, }, ],
66      ],
67     member_templates_restrict={
68      m128=[
69       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_m128, tag=m128, },
70       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k1, tag=u64k1, },
71       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k2, tag=u64k2, },
72       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k3, tag=u64k3, },
73       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k4, tag=u64k4, },
74       ],
75      p_1=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_1, tag=p_1, }, ],
76      p_10=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_10, tag=p_10, }, ],
77      p_11=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_11, tag=p_11, }, ],
78      p_12=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_12, tag=p_12, }, ],
79      p_13=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_13, tag=p_13, }, ],
80      p_14=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_14, tag=p_14, }, ],
81      p_15=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_15, tag=p_15, }, ],
82      p_2=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_2, tag=p_2, }, ],
83      p_3=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_3, tag=p_3, }, ],
84      p_4=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_4, tag=p_4, }, ],
85      p_5=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_5, tag=p_5, }, ],
86      p_6=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_6, tag=p_6, }, ],
87      p_7=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_7, tag=p_7, }, ],
88      p_8=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_8, tag=p_8, }, ],
89      p_9=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_9, tag=p_9, }, ],
90      pz=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_pz, tag=pz, }, ],
91      u64k1=[
92       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_m128, tag=m128, },
93       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k1, tag=u64k1, },
94       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k2, tag=u64k2, },
95       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k3, tag=u64k3, },
96       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k4, tag=u64k4, },
97       ],
98      u64k2=[
99       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_m128, tag=m128, },
100       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k1, tag=u64k1, },
101       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k2, tag=u64k2, },
102       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k3, tag=u64k3, },
103       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k4, tag=u64k4, },
104       ],
105      u64k3=[
106       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_m128, tag=m128, },
107       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k1, tag=u64k1, },
108       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k2, tag=u64k2, },
109       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k3, tag=u64k3, },
110       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k4, tag=u64k4, },
111       ],
112      u64k4=[
113       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_m128, tag=m128, },
114       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k1, tag=u64k1, },
115       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k2, tag=u64k2, },
116       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k3, tag=u64k3, },
117       { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k4, tag=u64k4, },
118       ],
119      },
120     vc:includes=[ <stdarg.h>, ],
121     },
122    virtual_base={
123     filebase=mpfq_vbase,
124     global_prefix=mpfq_,
125     name=mpfq_vbase,
126     substitutions=[
127      [ (?^:mpfq_p_14_elt \*), void *, ],
128      [ (?^:mpfq_p_14_src_elt\b), const void *, ],
129      [ (?^:mpfq_p_14_elt\b), void *, ],
130      [ (?^:mpfq_p_14_dst_elt\b), void *, ],
131      [ (?^:mpfq_p_14_elt_ur \*), void *, ],
132      [ (?^:mpfq_p_14_src_elt_ur\b), const void *, ],
133      [ (?^:mpfq_p_14_elt_ur\b), void *, ],
134      [ (?^:mpfq_p_14_dst_elt_ur\b), void *, ],
135      [ (?^:mpfq_p_14_vec \*), void *, ],
136      [ (?^:mpfq_p_14_src_vec\b), const void *, ],
137      [ (?^:mpfq_p_14_vec\b), void *, ],
138      [ (?^:mpfq_p_14_dst_vec\b), void *, ],
139      [ (?^:mpfq_p_14_vec_ur \*), void *, ],
140      [ (?^:mpfq_p_14_src_vec_ur\b), const void *, ],
141      [ (?^:mpfq_p_14_vec_ur\b), void *, ],
142      [ (?^:mpfq_p_14_dst_vec_ur\b), void *, ],
143      [ (?^:mpfq_p_14_poly \*), void *, ],
144      [ (?^:mpfq_p_14_src_poly\b), const void *, ],
145      [ (?^:mpfq_p_14_poly\b), void *, ],
146      [ (?^:mpfq_p_14_dst_poly\b), void *, ],
147      ],
148     },
149    w=64,
150    } */
151 
152 typedef mpfq_p_field mpfq_p_14_field;
153 typedef mpfq_p_dst_field mpfq_p_14_dst_field;
154 typedef mpfq_p_src_field mpfq_p_14_src_field;
155 
156 typedef unsigned long mpfq_p_14_elt[14];
157 typedef unsigned long * mpfq_p_14_dst_elt;
158 typedef const unsigned long * mpfq_p_14_src_elt;
159 
160 typedef unsigned long mpfq_p_14_elt_ur[29];
161 typedef unsigned long * mpfq_p_14_dst_elt_ur;
162 typedef const unsigned long * mpfq_p_14_src_elt_ur;
163 
164 typedef mpfq_p_14_elt * mpfq_p_14_vec;
165 typedef mpfq_p_14_elt * mpfq_p_14_dst_vec;
166 typedef mpfq_p_14_elt * mpfq_p_14_src_vec;
167 
168 typedef mpfq_p_14_elt_ur * mpfq_p_14_vec_ur;
169 typedef mpfq_p_14_elt_ur * mpfq_p_14_dst_vec_ur;
170 typedef mpfq_p_14_elt_ur * mpfq_p_14_src_vec_ur;
171 
172 typedef struct {
173   mpfq_p_14_vec c;
174   unsigned long alloc;
175   unsigned long size;
176 } mpfq_p_14_poly_struct;
177 typedef mpfq_p_14_poly_struct mpfq_p_14_poly [1];
178 typedef mpfq_p_14_poly_struct * mpfq_p_14_dst_poly;
179 typedef mpfq_p_14_poly_struct * mpfq_p_14_src_poly;
180 
181 #ifdef  __cplusplus
182 extern "C" {
183 #endif
184 /* *Mpfq::defaults::code_for_impl_name, Mpfq::gfp */
185 #define mpfq_p_14_impl_name()	"p_14"
186 /* *Mpfq::gfp::field::code_for_impl_max_characteristic_bits, Mpfq::gfp */
187 #define mpfq_p_14_impl_max_characteristic_bits()	896
188 /* *Mpfq::gfp::field::code_for_impl_max_degree, Mpfq::gfp */
189 #define mpfq_p_14_impl_max_degree()	1
190 
191 /* Functions operating on the field structure */
192 static inline
193 void mpfq_p_14_field_characteristic(mpfq_p_14_src_field, mpz_ptr);
194 static inline
195 mpz_srcptr mpfq_p_14_field_characteristic_srcptr(mpfq_p_14_src_field);
196 static inline
197 unsigned long mpfq_p_14_field_characteristic_bits(mpfq_p_14_src_field);
198 /* *Mpfq::gfp::field::code_for_field_degree, Mpfq::gfp */
199 #define mpfq_p_14_field_degree(K)	1
200 static inline
201 void mpfq_p_14_field_init(mpfq_p_14_dst_field);
202 void mpfq_p_14_field_clear(mpfq_p_14_dst_field);
203 void mpfq_p_14_field_specify(mpfq_p_14_dst_field, unsigned long, const void *);
204 /* *Mpfq::gfp::field::code_for_field_setopt, Mpfq::gfp */
205 #define mpfq_p_14_field_setopt(f, x, y)	/**/
206 
207 /* Element allocation functions */
208 static inline
209 void mpfq_p_14_init(mpfq_p_14_dst_field, mpfq_p_14_elt *);
210 static inline
211 void mpfq_p_14_clear(mpfq_p_14_dst_field, mpfq_p_14_elt *);
212 /* *Mpfq::defaults::flatdata::code_for_elt_stride, Mpfq::gfp::elt, Mpfq::gfp */
213 #define mpfq_p_14_elt_stride(k)	sizeof(mpfq_p_14_elt)
214 
215 /* Elementary assignment functions */
216 static inline
217 void mpfq_p_14_set(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt);
218 static inline
219 void mpfq_p_14_set_ui(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, unsigned long);
220 static inline
221 void mpfq_p_14_set_zero(mpfq_p_14_dst_field, mpfq_p_14_dst_elt);
222 static inline
223 unsigned long mpfq_p_14_get_ui(mpfq_p_14_dst_field, mpfq_p_14_src_elt);
224 static inline
225 void mpfq_p_14_set_mpn(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mp_limb_t *, size_t);
226 static inline
227 void mpfq_p_14_set_mpz(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpz_srcptr);
228 static inline
229 void mpfq_p_14_get_mpn(mpfq_p_14_dst_field, mp_limb_t *, mpfq_p_14_src_elt);
230 static inline
231 void mpfq_p_14_get_mpz(mpfq_p_14_dst_field, mpz_ptr, mpfq_p_14_src_elt);
232 
233 /* Assignment of random values */
234 static inline
235 void mpfq_p_14_random(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, gmp_randstate_t);
236 static inline
237 void mpfq_p_14_random2(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, gmp_randstate_t);
238 
239 /* Arithmetic operations on elements */
240 static inline
241 void mpfq_p_14_add(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt, mpfq_p_14_src_elt);
242 static inline
243 void mpfq_p_14_sub(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt, mpfq_p_14_src_elt);
244 static inline
245 void mpfq_p_14_neg(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt);
246 static inline
247 void mpfq_p_14_mul(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt, mpfq_p_14_src_elt);
248 static inline
249 void mpfq_p_14_sqr(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt);
250 static inline
251 int mpfq_p_14_is_sqr(mpfq_p_14_dst_field, mpfq_p_14_src_elt);
252 int mpfq_p_14_sqrt(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt);
253 static inline
254 void mpfq_p_14_pow(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt, unsigned long *, size_t);
255 void mpfq_p_14_powz(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt, mpz_srcptr);
256 /* *Mpfq::gfp::elt::code_for_frobenius, Mpfq::gfp */
257 #define mpfq_p_14_frobenius(k, x, y)	mpfq_p_14_set(k, x, y)
258 static inline
259 void mpfq_p_14_add_ui(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt, unsigned long);
260 static inline
261 void mpfq_p_14_sub_ui(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt, unsigned long);
262 static inline
263 void mpfq_p_14_mul_ui(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt, unsigned long);
264 #define HAVE_mpfq_p_14_normalize
265 static inline
266 void mpfq_p_14_normalize(mpfq_p_14_dst_field, mpfq_p_14_dst_elt);
267 static inline
268 int mpfq_p_14_inv(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt);
269 #define HAVE_mpfq_p_14_hadamard
270 static inline
271 void mpfq_p_14_hadamard(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_dst_elt, mpfq_p_14_dst_elt, mpfq_p_14_dst_elt);
272 
273 /* Operations involving unreduced elements */
274 static inline
275 void mpfq_p_14_elt_ur_init(mpfq_p_14_dst_field, mpfq_p_14_elt_ur *);
276 static inline
277 void mpfq_p_14_elt_ur_clear(mpfq_p_14_dst_field, mpfq_p_14_elt_ur *);
278 /* *Mpfq::defaults::flatdata::code_for_elt_ur_stride, Mpfq::gfp::elt, Mpfq::gfp */
279 #define mpfq_p_14_elt_ur_stride(k)	sizeof(mpfq_p_14_elt_ur)
280 static inline
281 void mpfq_p_14_elt_ur_set(mpfq_p_14_dst_field, mpfq_p_14_dst_elt_ur, mpfq_p_14_src_elt_ur);
282 static inline
283 void mpfq_p_14_elt_ur_set_elt(mpfq_p_14_dst_field, mpfq_p_14_dst_elt_ur, mpfq_p_14_src_elt);
284 static inline
285 void mpfq_p_14_elt_ur_set_zero(mpfq_p_14_dst_field, mpfq_p_14_dst_elt_ur);
286 static inline
287 void mpfq_p_14_elt_ur_set_ui(mpfq_p_14_dst_field, mpfq_p_14_dst_elt_ur, unsigned long);
288 static inline
289 void mpfq_p_14_elt_ur_add(mpfq_p_14_dst_field, mpfq_p_14_dst_elt_ur, mpfq_p_14_src_elt_ur, mpfq_p_14_src_elt_ur);
290 static inline
291 void mpfq_p_14_elt_ur_neg(mpfq_p_14_dst_field, mpfq_p_14_dst_elt_ur, mpfq_p_14_src_elt_ur);
292 static inline
293 void mpfq_p_14_elt_ur_sub(mpfq_p_14_dst_field, mpfq_p_14_dst_elt_ur, mpfq_p_14_src_elt_ur, mpfq_p_14_src_elt_ur);
294 static inline
295 void mpfq_p_14_mul_ur(mpfq_p_14_dst_field, mpfq_p_14_dst_elt_ur, mpfq_p_14_src_elt, mpfq_p_14_src_elt);
296 static inline
297 void mpfq_p_14_sqr_ur(mpfq_p_14_dst_field, mpfq_p_14_dst_elt_ur, mpfq_p_14_src_elt);
298 static inline
299 void mpfq_p_14_reduce(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_dst_elt_ur);
300 #define HAVE_mpfq_p_14_addmul_si_ur
301 static inline
302 void mpfq_p_14_addmul_si_ur(mpfq_p_14_dst_field, mpfq_p_14_dst_elt_ur, mpfq_p_14_src_elt, long);
303 
304 /* Comparison functions */
305 static inline
306 int mpfq_p_14_cmp(mpfq_p_14_dst_field, mpfq_p_14_src_elt, mpfq_p_14_src_elt);
307 static inline
308 int mpfq_p_14_cmp_ui(mpfq_p_14_dst_field, mpfq_p_14_src_elt, unsigned long);
309 static inline
310 int mpfq_p_14_is_zero(mpfq_p_14_dst_field, mpfq_p_14_src_elt);
311 
312 /* Input/output functions */
313 int mpfq_p_14_asprint(mpfq_p_14_dst_field, char * *, mpfq_p_14_src_elt);
314 int mpfq_p_14_fprint(mpfq_p_14_dst_field, FILE *, mpfq_p_14_src_elt);
315 /* *Mpfq::defaults::code_for_print, Mpfq::gfp */
316 #define mpfq_p_14_print(k, x)	mpfq_p_14_fprint(k,stdout,x)
317 int mpfq_p_14_sscan(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, const char *);
318 int mpfq_p_14_fscan(mpfq_p_14_dst_field, FILE *, mpfq_p_14_dst_elt);
319 /* *Mpfq::defaults::code_for_scan, Mpfq::gfp */
320 #define mpfq_p_14_scan(k, x)	mpfq_p_14_fscan(k,stdin,x)
321 
322 /* Vector functions */
323 void mpfq_p_14_vec_init(mpfq_p_14_dst_field, mpfq_p_14_vec *, unsigned long);
324 void mpfq_p_14_vec_reinit(mpfq_p_14_dst_field, mpfq_p_14_vec *, unsigned long, unsigned long);
325 void mpfq_p_14_vec_clear(mpfq_p_14_dst_field, mpfq_p_14_vec *, unsigned long);
326 static inline
327 void mpfq_p_14_vec_set(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, mpfq_p_14_src_vec, unsigned long);
328 static inline
329 void mpfq_p_14_vec_set_zero(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, unsigned long);
330 static inline
331 void mpfq_p_14_vec_setcoeff(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, mpfq_p_14_src_elt, unsigned long);
332 static inline
333 void mpfq_p_14_vec_setcoeff_ui(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, unsigned long, unsigned long);
334 static inline
335 void mpfq_p_14_vec_getcoeff(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_vec, unsigned long);
336 static inline
337 void mpfq_p_14_vec_add(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, mpfq_p_14_src_vec, mpfq_p_14_src_vec, unsigned long);
338 static inline
339 void mpfq_p_14_vec_neg(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, mpfq_p_14_src_vec, unsigned long);
340 static inline
341 void mpfq_p_14_vec_rev(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, mpfq_p_14_src_vec, unsigned long);
342 static inline
343 void mpfq_p_14_vec_sub(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, mpfq_p_14_src_vec, mpfq_p_14_src_vec, unsigned long);
344 static inline
345 void mpfq_p_14_vec_scal_mul(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, mpfq_p_14_src_vec, mpfq_p_14_src_elt, unsigned long);
346 static inline
347 void mpfq_p_14_vec_conv(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, mpfq_p_14_src_vec, unsigned long, mpfq_p_14_src_vec, unsigned long);
348 void mpfq_p_14_vec_random(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, unsigned long, gmp_randstate_t);
349 void mpfq_p_14_vec_random2(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, unsigned long, gmp_randstate_t);
350 long mpfq_p_14_vec_cmp(mpfq_p_14_dst_field, mpfq_p_14_src_vec, mpfq_p_14_src_vec, unsigned long);
351 long mpfq_p_14_vec_is_zero(mpfq_p_14_dst_field, mpfq_p_14_src_vec, unsigned long);
352 static inline
353 mpfq_p_14_dst_vec mpfq_p_14_vec_subvec(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, long);
354 static inline
355 mpfq_p_14_src_vec mpfq_p_14_vec_subvec_const(mpfq_p_14_dst_field, mpfq_p_14_src_vec, long);
356 static inline
357 mpfq_p_14_dst_elt mpfq_p_14_vec_coeff_ptr(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, long);
358 static inline
359 mpfq_p_14_src_elt mpfq_p_14_vec_coeff_ptr_const(mpfq_p_14_dst_field, mpfq_p_14_src_vec, long);
360 long mpfq_p_14_vec_asprint(mpfq_p_14_dst_field, char * *, mpfq_p_14_src_vec, unsigned long);
361 long mpfq_p_14_vec_fprint(mpfq_p_14_dst_field, FILE *, mpfq_p_14_src_vec, unsigned long);
362 long mpfq_p_14_vec_print(mpfq_p_14_dst_field, mpfq_p_14_src_vec, unsigned long);
363 long mpfq_p_14_vec_sscan(mpfq_p_14_dst_field, mpfq_p_14_vec *, unsigned long *, const char *);
364 long mpfq_p_14_vec_fscan(mpfq_p_14_dst_field, FILE *, mpfq_p_14_vec *, unsigned long *);
365 /* *Mpfq::defaults::vec::io::code_for_vec_scan, Mpfq::defaults::vec, Mpfq::gfp */
366 #define mpfq_p_14_vec_scan(K, w, n)	mpfq_p_14_vec_fscan(K,stdin,w,n)
367 long mpfq_p_14_vec_hamming_weight(mpfq_p_14_dst_field, mpfq_p_14_src_vec, unsigned long);
368 long mpfq_p_14_vec_find_first_set(mpfq_p_14_dst_field, mpfq_p_14_src_vec, unsigned long);
369 long mpfq_p_14_vec_simd_hamming_weight(mpfq_p_14_dst_field, mpfq_p_14_src_vec, unsigned long);
370 long mpfq_p_14_vec_simd_find_first_set(mpfq_p_14_dst_field, mpfq_p_14_src_vec, unsigned long);
371 void mpfq_p_14_vec_ur_init(mpfq_p_14_dst_field, mpfq_p_14_vec_ur *, unsigned long);
372 static inline
373 void mpfq_p_14_vec_ur_set_zero(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, unsigned long);
374 static inline
375 void mpfq_p_14_vec_ur_set_vec(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, mpfq_p_14_src_vec, unsigned long);
376 void mpfq_p_14_vec_ur_reinit(mpfq_p_14_dst_field, mpfq_p_14_vec_ur *, unsigned long, unsigned long);
377 void mpfq_p_14_vec_ur_clear(mpfq_p_14_dst_field, mpfq_p_14_vec_ur *, unsigned long);
378 static inline
379 void mpfq_p_14_vec_ur_set(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, mpfq_p_14_src_vec_ur, unsigned long);
380 static inline
381 void mpfq_p_14_vec_ur_setcoeff(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, mpfq_p_14_src_elt_ur, unsigned long);
382 static inline
383 void mpfq_p_14_vec_ur_getcoeff(mpfq_p_14_dst_field, mpfq_p_14_dst_elt_ur, mpfq_p_14_src_vec_ur, unsigned long);
384 static inline
385 void mpfq_p_14_vec_ur_add(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, mpfq_p_14_src_vec_ur, mpfq_p_14_src_vec_ur, unsigned long);
386 static inline
387 void mpfq_p_14_vec_ur_sub(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, mpfq_p_14_src_vec_ur, mpfq_p_14_src_vec_ur, unsigned long);
388 static inline
389 void mpfq_p_14_vec_ur_neg(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, mpfq_p_14_src_vec_ur, unsigned long);
390 static inline
391 void mpfq_p_14_vec_ur_rev(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, mpfq_p_14_src_vec_ur, unsigned long);
392 static inline
393 void mpfq_p_14_vec_scal_mul_ur(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, mpfq_p_14_src_vec, mpfq_p_14_src_elt, unsigned long);
394 void mpfq_p_14_vec_conv_ur_ks(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, mpfq_p_14_src_vec, unsigned int, mpfq_p_14_src_vec, unsigned int);
395 static inline
396 void mpfq_p_14_vec_conv_ur_n(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, mpfq_p_14_src_vec, mpfq_p_14_src_vec, unsigned int);
397 static inline
398 void mpfq_p_14_vec_conv_ur(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, mpfq_p_14_src_vec, unsigned long, mpfq_p_14_src_vec, unsigned long);
399 static inline
400 void mpfq_p_14_vec_reduce(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, mpfq_p_14_dst_vec_ur, unsigned long);
401 static inline
402 mpfq_p_14_dst_vec_ur mpfq_p_14_vec_ur_subvec(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, long);
403 static inline
404 mpfq_p_14_src_vec_ur mpfq_p_14_vec_ur_subvec_const(mpfq_p_14_dst_field, mpfq_p_14_src_vec_ur, long);
405 static inline
406 mpfq_p_14_dst_elt mpfq_p_14_vec_ur_coeff_ptr(mpfq_p_14_dst_field, mpfq_p_14_dst_vec_ur, long);
407 static inline
408 mpfq_p_14_src_elt mpfq_p_14_vec_ur_coeff_ptr_const(mpfq_p_14_dst_field, mpfq_p_14_src_vec_ur, long);
409 /* *Mpfq::defaults::flatdata::code_for_vec_elt_stride, Mpfq::gfp::elt, Mpfq::gfp */
410 #define mpfq_p_14_vec_elt_stride(k, n)	((n) * mpfq_p_14_elt_stride((k)))
411 /* *Mpfq::defaults::flatdata::code_for_vec_ur_elt_stride, Mpfq::gfp::elt, Mpfq::gfp */
412 #define mpfq_p_14_vec_ur_elt_stride(k, n)	((n) * mpfq_p_14_elt_ur_stride((k)))
413 
414 /* Polynomial functions */
415 static inline
416 void mpfq_p_14_poly_init(mpfq_p_14_dst_field, mpfq_p_14_poly, unsigned int);
417 static inline
418 void mpfq_p_14_poly_clear(mpfq_p_14_dst_field, mpfq_p_14_poly);
419 static inline
420 void mpfq_p_14_poly_set(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_src_poly);
421 void mpfq_p_14_poly_setmonic(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_src_poly);
422 static inline
423 void mpfq_p_14_poly_setcoeff(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_src_elt, unsigned int);
424 static inline
425 void mpfq_p_14_poly_setcoeff_ui(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, unsigned long, unsigned int);
426 static inline
427 void mpfq_p_14_poly_getcoeff(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_poly, unsigned int);
428 static inline
429 int mpfq_p_14_poly_deg(mpfq_p_14_dst_field, mpfq_p_14_src_poly);
430 static inline
431 void mpfq_p_14_poly_add(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_src_poly, mpfq_p_14_src_poly);
432 static inline
433 void mpfq_p_14_poly_sub(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_src_poly, mpfq_p_14_src_poly);
434 static inline
435 void mpfq_p_14_poly_set_ui(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, unsigned long);
436 static inline
437 void mpfq_p_14_poly_add_ui(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_src_poly, unsigned long);
438 static inline
439 void mpfq_p_14_poly_sub_ui(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_src_poly, unsigned long);
440 static inline
441 void mpfq_p_14_poly_neg(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_src_poly);
442 static inline
443 void mpfq_p_14_poly_scal_mul(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_src_poly, mpfq_p_14_src_elt);
444 static inline
445 void mpfq_p_14_poly_mul(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_src_poly, mpfq_p_14_src_poly);
446 int mpfq_p_14_poly_divmod(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_dst_poly, mpfq_p_14_src_poly, mpfq_p_14_src_poly);
447 void mpfq_p_14_poly_precomp_mod(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_src_poly);
448 void mpfq_p_14_poly_mod_pre(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_src_poly, mpfq_p_14_src_poly, mpfq_p_14_src_poly);
449 static inline
450 void mpfq_p_14_poly_gcd(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_src_poly, mpfq_p_14_src_poly);
451 static inline
452 void mpfq_p_14_poly_xgcd(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, mpfq_p_14_dst_poly, mpfq_p_14_dst_poly, mpfq_p_14_src_poly, mpfq_p_14_src_poly);
453 static inline
454 void mpfq_p_14_poly_random(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, unsigned int, gmp_randstate_t);
455 static inline
456 void mpfq_p_14_poly_random2(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, unsigned int, gmp_randstate_t);
457 static inline
458 int mpfq_p_14_poly_cmp(mpfq_p_14_dst_field, mpfq_p_14_src_poly, mpfq_p_14_src_poly);
459 static inline
460 int mpfq_p_14_poly_asprint(mpfq_p_14_dst_field, char * *, mpfq_p_14_src_poly);
461 static inline
462 int mpfq_p_14_poly_fprint(mpfq_p_14_dst_field, FILE *, mpfq_p_14_src_poly);
463 static inline
464 int mpfq_p_14_poly_print(mpfq_p_14_dst_field, mpfq_p_14_src_poly);
465 static inline
466 int mpfq_p_14_poly_sscan(mpfq_p_14_dst_field, mpfq_p_14_dst_poly, const char *);
467 static inline
468 int mpfq_p_14_poly_fscan(mpfq_p_14_dst_field, FILE *, mpfq_p_14_dst_poly);
469 static inline
470 int mpfq_p_14_poly_scan(mpfq_p_14_dst_field, mpfq_p_14_dst_poly);
471 
472 /* Functions related to SIMD operation */
473 /* *simd_gfp::code_for_simd_groupsize */
474 #define mpfq_p_14_simd_groupsize(K)	1
475 static inline
476 int mpfq_p_14_simd_hamming_weight(mpfq_p_14_dst_field, mpfq_p_14_src_elt);
477 static inline
478 int mpfq_p_14_simd_find_first_set(mpfq_p_14_dst_field, mpfq_p_14_src_elt);
479 static inline
480 unsigned long mpfq_p_14_simd_get_ui_at(mpfq_p_14_dst_field, mpfq_p_14_src_elt, int);
481 static inline
482 void mpfq_p_14_simd_set_ui_at(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, int, unsigned long);
483 static inline
484 void mpfq_p_14_simd_add_ui_at(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, mpfq_p_14_src_elt, int, unsigned long);
485 static inline
486 void mpfq_p_14_simd_set_ui_all(mpfq_p_14_dst_field, mpfq_p_14_dst_elt, unsigned long);
487 void mpfq_p_14_add_dotprod(mpfq_p_14_dst_field, mpfq_p_14_dst_vec, mpfq_p_14_src_vec, mpfq_p_14_src_vec, unsigned int);
488 
489 /* Member templates related to SIMD operation */
490 
491 /* Object-oriented interface */
492 static inline
493 void mpfq_p_14_oo_field_clear(mpfq_vbase_ptr);
494 void mpfq_p_14_oo_field_init(mpfq_vbase_ptr);
495 #ifdef  __cplusplus
496 }
497 #endif
498 
499 /* Implementations for inlines */
500 /* *Mpfq::gfp::field::code_for_field_characteristic, Mpfq::gfp */
501 static inline
mpfq_p_14_field_characteristic(mpfq_p_14_src_field k,mpz_ptr z)502 void mpfq_p_14_field_characteristic(mpfq_p_14_src_field k, mpz_ptr z)
503 {
504         mpz_set(z, k->p);
505 }
506 
507 /* *Mpfq::gfp::field::code_for_field_characteristic_srcptr, Mpfq::gfp */
508 static inline
mpfq_p_14_field_characteristic_srcptr(mpfq_p_14_src_field k)509 mpz_srcptr mpfq_p_14_field_characteristic_srcptr(mpfq_p_14_src_field k)
510 {
511     return k->p;
512 }
513 
514 /* *Mpfq::gfp::field::code_for_field_characteristic_bits, Mpfq::gfp */
515 static inline
mpfq_p_14_field_characteristic_bits(mpfq_p_14_src_field k)516 unsigned long mpfq_p_14_field_characteristic_bits(mpfq_p_14_src_field k)
517 {
518         return mpz_sizeinbase(k->p, 2);
519 }
520 
521 /* *Mpfq::gfp::field::code_for_field_init, Mpfq::gfp */
522 static inline
mpfq_p_14_field_init(mpfq_p_14_dst_field k)523 void mpfq_p_14_field_init(mpfq_p_14_dst_field k)
524 {
525     mpz_init(k->p);
526     mpz_init(k->bigmul_p);
527     k->io_base = 10;
528     mpz_init(k->factor);
529     k->ts_info.e=0;
530 }
531 
532 /* *Mpfq::gfp::elt::code_for_init, Mpfq::gfp */
533 static inline
mpfq_p_14_init(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_elt * x MAYBE_UNUSED)534 void mpfq_p_14_init(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_elt * x MAYBE_UNUSED)
535 {
536     assert(k);
537     assert(*x);
538 }
539 
540 /* *Mpfq::gfp::elt::code_for_clear, Mpfq::gfp */
541 static inline
mpfq_p_14_clear(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_elt * x MAYBE_UNUSED)542 void mpfq_p_14_clear(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_elt * x MAYBE_UNUSED)
543 {
544     assert(k);
545     assert(*x);
546 }
547 
548 /* *Mpfq::gfp::elt::code_for_set, Mpfq::gfp */
549 static inline
mpfq_p_14_set(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_elt r,mpfq_p_14_src_elt s)550 void mpfq_p_14_set(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_elt r, mpfq_p_14_src_elt s)
551 {
552     mpfq_copy(r,s,14);
553 }
554 
555 /* *Mpfq::gfp::elt::code_for_set_ui, Mpfq::gfp */
556 static inline
mpfq_p_14_set_ui(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_elt r,unsigned long x)557 void mpfq_p_14_set_ui(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_elt r, unsigned long x)
558 {
559     assert (r);
560     r[0] = x;
561     mpfq_zero(r + 1, 14 - 1);
562 }
563 
564 /* *Mpfq::gfp::elt::code_for_set_zero, Mpfq::gfp */
565 static inline
mpfq_p_14_set_zero(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_elt r)566 void mpfq_p_14_set_zero(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_elt r)
567 {
568     mpfq_zero(r, 14);
569 }
570 
571 /* *Mpfq::gfp::elt::code_for_get_ui, Mpfq::gfp */
572 static inline
mpfq_p_14_get_ui(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_src_elt x)573 unsigned long mpfq_p_14_get_ui(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_src_elt x)
574 {
575     return x[0];
576 }
577 
578 /* *Mpfq::gfp::elt::code_for_set_mpn, Mpfq::gfp */
579 static inline
mpfq_p_14_set_mpn(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt r,mp_limb_t * x,size_t n)580 void mpfq_p_14_set_mpn(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt r, mp_limb_t * x, size_t n)
581 {
582     if (n < 14) {
583         mpfq_copy(r, x, n);
584         mpfq_zero(r + n, 14 - n);
585     } else {
586         mp_limb_t tmp[n-14+1];
587         mpn_tdiv_qr(tmp, r, 0, x, n, k->p->_mp_d, 14);
588     }
589 }
590 
591 /* *Mpfq::gfp::elt::code_for_set_mpz, Mpfq::gfp */
592 static inline
mpfq_p_14_set_mpz(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt r,mpz_srcptr z)593 void mpfq_p_14_set_mpz(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt r, mpz_srcptr z)
594 {
595     if (z->_mp_size < 0) {
596         mpfq_p_14_set_mpn(k, r, z->_mp_d, -z->_mp_size);
597         mpfq_p_14_neg(k, r, r);
598     } else {
599         mpfq_p_14_set_mpn(k, r, z->_mp_d, z->_mp_size);
600     }
601 }
602 
603 /* *Mpfq::gfp::elt::code_for_get_mpn, Mpfq::gfp */
604 static inline
mpfq_p_14_get_mpn(mpfq_p_14_dst_field k MAYBE_UNUSED,mp_limb_t * r,mpfq_p_14_src_elt x)605 void mpfq_p_14_get_mpn(mpfq_p_14_dst_field k MAYBE_UNUSED, mp_limb_t * r, mpfq_p_14_src_elt x)
606 {
607     mpfq_copy(r, x, 14);
608 }
609 
610 /* *Mpfq::gfp::elt::code_for_get_mpz, Mpfq::gfp */
611 static inline
mpfq_p_14_get_mpz(mpfq_p_14_dst_field k MAYBE_UNUSED,mpz_ptr z,mpfq_p_14_src_elt y)612 void mpfq_p_14_get_mpz(mpfq_p_14_dst_field k MAYBE_UNUSED, mpz_ptr z, mpfq_p_14_src_elt y)
613 {
614     int i;
615     mpz_realloc2(z, 14*64);
616     for (i = 0; i < 14; ++i)
617         z->_mp_d[i] = y[i];
618     i = 14;
619     while (i>=1 && z->_mp_d[i-1] == 0)
620         i--;
621     z->_mp_size = i;
622 }
623 
624 /* *Mpfq::gfp::elt::code_for_random, Mpfq::gfp */
625 static inline
mpfq_p_14_random(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt x,gmp_randstate_t state)626 void mpfq_p_14_random(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt x, gmp_randstate_t state)
627 {
628       mpz_t z;
629       mpz_init(z);
630       mpz_urandomb(z, state, 14 * GMP_LIMB_BITS);
631       mpfq_copy(x, z->_mp_d, 14);
632       mpz_clear(z);
633     mpfq_p_14_normalize(k, x);
634 }
635 
636 /* *Mpfq::gfp::elt::code_for_random2, Mpfq::gfp */
637 static inline
mpfq_p_14_random2(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt x,gmp_randstate_t state)638 void mpfq_p_14_random2(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt x, gmp_randstate_t state)
639 {
640       mpz_t z;
641       mpz_init(z);
642       mpz_rrandomb(z, state, 14 * GMP_LIMB_BITS);
643       mpfq_copy(x, z->_mp_d, 14);
644       mpz_clear(z);
645     mpfq_p_14_normalize(k, x);
646 }
647 
648 /* *Mpfq::gfp::elt::code_for_add, Mpfq::gfp */
649 static inline
mpfq_p_14_add(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt z,mpfq_p_14_src_elt x,mpfq_p_14_src_elt y)650 void mpfq_p_14_add(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt z, mpfq_p_14_src_elt x, mpfq_p_14_src_elt y)
651 {
652     mp_limb_t cy;
653     cy = mpfq_fixmp_14_add(z, x, y);
654     if (cy || (mpfq_fixmp_14_cmp(z, k->p->_mp_d) >= 0))
655         mpfq_fixmp_14_sub(z, z, k->p->_mp_d);
656 }
657 
658 /* *Mpfq::gfp::elt::code_for_sub, Mpfq::gfp */
659 static inline
mpfq_p_14_sub(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt z,mpfq_p_14_src_elt x,mpfq_p_14_src_elt y)660 void mpfq_p_14_sub(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt z, mpfq_p_14_src_elt x, mpfq_p_14_src_elt y)
661 {
662     mp_limb_t cy;
663     cy = mpfq_fixmp_14_sub(z, x, y);
664     if (cy) // negative result
665         mpfq_fixmp_14_add(z, z, k->p->_mp_d);
666 }
667 
668 /* *Mpfq::gfp::elt::code_for_neg, Mpfq::gfp */
669 static inline
mpfq_p_14_neg(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt z,mpfq_p_14_src_elt x)670 void mpfq_p_14_neg(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt z, mpfq_p_14_src_elt x)
671 {
672     if (mpfq_fixmp_14_cmp_ui(x, 0))
673         mpfq_fixmp_14_sub(z, k->p->_mp_d, x);
674     else {
675         int i;
676         for (i = 0; i < 14; ++i)
677             z[i] = 0;
678         }
679 }
680 
681 /* *Mpfq::gfp::elt::code_for_mul, Mpfq::gfp */
682 static inline
mpfq_p_14_mul(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt z,mpfq_p_14_src_elt x,mpfq_p_14_src_elt y)683 void mpfq_p_14_mul(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt z, mpfq_p_14_src_elt x, mpfq_p_14_src_elt y)
684 {
685     mp_limb_t tmp[28];
686     mpfq_fixmp_14_mul(tmp, x, y);
687     mpfq_fixmp_14_mod(z, tmp, k->p->_mp_d);
688 }
689 
690 /* *Mpfq::gfp::elt::code_for_sqr, Mpfq::gfp */
691 static inline
mpfq_p_14_sqr(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt z,mpfq_p_14_src_elt x)692 void mpfq_p_14_sqr(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt z, mpfq_p_14_src_elt x)
693 {
694     mp_limb_t tmp[28];
695     mpfq_fixmp_14_sqr(tmp, x);
696     mpfq_fixmp_14_mod(z, tmp, k->p->_mp_d);
697 }
698 
699 /* *Mpfq::gfp::elt::code_for_is_sqr, Mpfq::gfp */
700 static inline
mpfq_p_14_is_sqr(mpfq_p_14_dst_field k,mpfq_p_14_src_elt x)701 int mpfq_p_14_is_sqr(mpfq_p_14_dst_field k, mpfq_p_14_src_elt x)
702 {
703     mp_limb_t pp[14];
704     mpfq_p_14_elt y;
705     mpfq_fixmp_14_sub_ui_nc(pp, k->p->_mp_d, 1);
706     mpfq_fixmp_14_rshift(pp, 1);
707     mpfq_p_14_init(k, &y);
708     mpfq_p_14_pow(k, y, x, pp, 14);
709     int res = mpfq_p_14_cmp_ui(k, y, 1);
710     mpfq_p_14_clear(k, &y);
711     if (res == 0)
712         return 1;
713     else
714         return 0;
715 }
716 
717 /* *Mpfq::defaults::pow::code_for_pow, Mpfq::gfp::elt, Mpfq::gfp */
718 static inline
mpfq_p_14_pow(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt res,mpfq_p_14_src_elt r,unsigned long * x,size_t n)719 void mpfq_p_14_pow(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt res, mpfq_p_14_src_elt r, unsigned long * x, size_t n)
720 {
721     mpfq_p_14_elt u, a;
722     long i, j, lead;     /* it is a signed type */
723     unsigned long mask;
724 
725     /* get the correct (i,j) position of the most significant bit in x */
726     for(i = ((long)n)-1; i>=0 && x[i]==0; i--)
727         ;
728     if (i < 0) {
729         /* power zero gets 1 */
730         mpfq_p_14_set_ui(k, res, 1);
731         return;
732     }
733     j = 64 - 1;
734     mask = (1UL<<j);
735     for( ; (x[i]&mask)==0 ;j--, mask>>=1)
736         ;
737     lead = i*64+j;      /* Ensured. */
738 
739     mpfq_p_14_init(k, &u);
740     mpfq_p_14_init(k, &a);
741     mpfq_p_14_set(k, a, r);
742     for( ; lead > 0; lead--) {
743         if (j-- == 0) {
744             i--;
745             j = 64-1;
746             mask = (1UL<<j);
747         } else {
748             mask >>= 1;
749         }
750         if (x[i]&mask) {
751             mpfq_p_14_sqr(k, u, a);
752             mpfq_p_14_mul(k, a, u, r);
753         } else {
754             mpfq_p_14_sqr(k, a,a);
755         }
756     }
757     mpfq_p_14_set(k, res, a);
758     mpfq_p_14_clear(k, &u);
759     mpfq_p_14_clear(k, &a);
760 }
761 
762 /* *Mpfq::gfp::elt::code_for_add_ui, Mpfq::gfp */
763 static inline
mpfq_p_14_add_ui(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt z,mpfq_p_14_src_elt x,unsigned long y)764 void mpfq_p_14_add_ui(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt z, mpfq_p_14_src_elt x, unsigned long y)
765 {
766     mp_limb_t cy;
767     cy = mpfq_fixmp_14_add_ui(z, x, y);
768     if (cy || (mpfq_fixmp_14_cmp(z, k->p->_mp_d) >= 0))
769         mpfq_fixmp_14_sub(z, z, k->p->_mp_d);
770 }
771 
772 /* *Mpfq::gfp::elt::code_for_sub_ui, Mpfq::gfp */
773 static inline
mpfq_p_14_sub_ui(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt z,mpfq_p_14_src_elt x,unsigned long y)774 void mpfq_p_14_sub_ui(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt z, mpfq_p_14_src_elt x, unsigned long y)
775 {
776     mp_limb_t cy;
777     cy = mpfq_fixmp_14_sub_ui(z, x, y);
778     if (cy) // negative result
779         mpfq_fixmp_14_add(z, z, k->p->_mp_d);
780 }
781 
782 /* *Mpfq::gfp::elt::code_for_mul_ui, Mpfq::gfp */
783 static inline
mpfq_p_14_mul_ui(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt z,mpfq_p_14_src_elt x,unsigned long y)784 void mpfq_p_14_mul_ui(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt z, mpfq_p_14_src_elt x, unsigned long y)
785 {
786     mp_limb_t tmp[14+1], q[2];
787     mpfq_fixmp_14_mul1(tmp,x,y);
788     mpn_tdiv_qr(q, z, 0, tmp, 14+1, k->p->_mp_d, 14);
789 }
790 
791 /* *Mpfq::gfp::elt::code_for_normalize, Mpfq::gfp */
792 static inline
mpfq_p_14_normalize(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt x)793 void mpfq_p_14_normalize(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt x)
794 {
795     if (mpfq_fixmp_14_cmp(x,k->p->_mp_d)>=0) {
796       mp_limb_t q[14+1];
797       mpfq_p_14_elt r;
798       mpn_tdiv_qr(q, r, 0, x, 14, k->p->_mp_d, 14);
799       mpfq_p_14_set(k, x, r);
800     }
801 }
802 
803 /* *Mpfq::gfp::elt::code_for_inv, Mpfq::gfp */
804 static inline
mpfq_p_14_inv(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt z,mpfq_p_14_src_elt x)805 int mpfq_p_14_inv(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt z, mpfq_p_14_src_elt x)
806 {
807     int ret=mpfq_fixmp_14_invmod(z, x, k->p->_mp_d);
808     if (!ret)
809         mpfq_p_14_get_mpz(k, k->factor, z);
810     return ret;
811 }
812 
813 /* *Mpfq::gfp::elt::code_for_hadamard, Mpfq::gfp */
814 static inline
mpfq_p_14_hadamard(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt x,mpfq_p_14_dst_elt y,mpfq_p_14_dst_elt z,mpfq_p_14_dst_elt t)815 void mpfq_p_14_hadamard(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt x, mpfq_p_14_dst_elt y, mpfq_p_14_dst_elt z, mpfq_p_14_dst_elt t)
816 {
817     mpfq_p_14_elt tmp;
818     mpfq_p_14_init(k, &tmp);
819     mpfq_p_14_add(k, tmp, x, y);
820     mpfq_p_14_sub(k, y, x, y);
821     mpfq_p_14_set(k, x, tmp);
822     mpfq_p_14_add(k, tmp, z, t);
823     mpfq_p_14_sub(k, t, z, t);
824     mpfq_p_14_set(k, z, tmp);
825     mpfq_p_14_sub(k, tmp, x, z);
826     mpfq_p_14_add(k, x, x, z);
827     mpfq_p_14_add(k, z, y, t);
828     mpfq_p_14_sub(k, t, y, t);
829     mpfq_p_14_set(k, y, tmp);
830     mpfq_p_14_clear(k, &tmp);
831 }
832 
833 /* *Mpfq::gfp::elt::code_for_elt_ur_init, Mpfq::gfp */
834 static inline
mpfq_p_14_elt_ur_init(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_elt_ur * x MAYBE_UNUSED)835 void mpfq_p_14_elt_ur_init(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_elt_ur * x MAYBE_UNUSED)
836 {
837     assert(k);
838     assert(*x);
839 }
840 
841 /* *Mpfq::gfp::elt::code_for_elt_ur_clear, Mpfq::gfp */
842 static inline
mpfq_p_14_elt_ur_clear(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_elt_ur * x MAYBE_UNUSED)843 void mpfq_p_14_elt_ur_clear(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_elt_ur * x MAYBE_UNUSED)
844 {
845     assert(k);
846     assert(*x);
847 }
848 
849 /* *Mpfq::gfp::elt::code_for_elt_ur_set, Mpfq::gfp */
850 static inline
mpfq_p_14_elt_ur_set(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_elt_ur z,mpfq_p_14_src_elt_ur x)851 void mpfq_p_14_elt_ur_set(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_elt_ur z, mpfq_p_14_src_elt_ur x)
852 {
853     mpfq_copy(z, x, 29);
854 }
855 
856 /* *Mpfq::gfp::elt::code_for_elt_ur_set_elt, Mpfq::gfp */
857 static inline
mpfq_p_14_elt_ur_set_elt(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_elt_ur r,mpfq_p_14_src_elt s)858 void mpfq_p_14_elt_ur_set_elt(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_elt_ur r, mpfq_p_14_src_elt s)
859 {
860     mpfq_copy(r, s, 14); mpfq_zero(r+14, 29-14);
861 }
862 
863 /* *Mpfq::gfp::elt::code_for_elt_ur_set_zero, Mpfq::gfp */
864 static inline
mpfq_p_14_elt_ur_set_zero(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_elt_ur r)865 void mpfq_p_14_elt_ur_set_zero(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_elt_ur r)
866 {
867     mpfq_zero(r, 29);
868 }
869 
870 /* *Mpfq::gfp::elt::code_for_elt_ur_set_ui, Mpfq::gfp */
871 static inline
mpfq_p_14_elt_ur_set_ui(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_elt_ur r,unsigned long x)872 void mpfq_p_14_elt_ur_set_ui(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_elt_ur r, unsigned long x)
873 {
874     assert (r);
875     r[0] = x;
876     mpfq_zero(r + 1, 29 - 1);
877 }
878 
879 /* *Mpfq::gfp::elt::code_for_elt_ur_add, Mpfq::gfp */
880 static inline
mpfq_p_14_elt_ur_add(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_elt_ur z,mpfq_p_14_src_elt_ur x,mpfq_p_14_src_elt_ur y)881 void mpfq_p_14_elt_ur_add(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_elt_ur z, mpfq_p_14_src_elt_ur x, mpfq_p_14_src_elt_ur y)
882 {
883     mpn_add_n(z, x, y, 29);
884 }
885 
886 /* *Mpfq::gfp::elt::code_for_elt_ur_neg, Mpfq::gfp */
887 static inline
mpfq_p_14_elt_ur_neg(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt_ur z,mpfq_p_14_src_elt_ur x)888 void mpfq_p_14_elt_ur_neg(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt_ur z, mpfq_p_14_src_elt_ur x)
889 {
890     mpfq_p_14_elt_ur tmp;
891     mpfq_p_14_elt_ur_init(k, &tmp);
892     mpfq_zero(tmp, 29);
893     mpn_sub_n(z, tmp, x, 29);
894     mpfq_p_14_elt_ur_clear(k, &tmp);
895 }
896 
897 /* *Mpfq::gfp::elt::code_for_elt_ur_sub, Mpfq::gfp */
898 static inline
mpfq_p_14_elt_ur_sub(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_elt_ur z,mpfq_p_14_src_elt_ur x,mpfq_p_14_src_elt_ur y)899 void mpfq_p_14_elt_ur_sub(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_elt_ur z, mpfq_p_14_src_elt_ur x, mpfq_p_14_src_elt_ur y)
900 {
901     mpn_sub_n(z, x, y, 29);
902 }
903 
904 /* *Mpfq::gfp::elt::code_for_mul_ur, Mpfq::gfp */
905 static inline
mpfq_p_14_mul_ur(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_elt_ur z,mpfq_p_14_src_elt x,mpfq_p_14_src_elt y)906 void mpfq_p_14_mul_ur(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_elt_ur z, mpfq_p_14_src_elt x, mpfq_p_14_src_elt y)
907 {
908     mpfq_fixmp_14_mul(z, x, y);
909     mpfq_zero(z + 28, 29 - 28);
910 }
911 
912 /* *Mpfq::gfp::elt::code_for_sqr_ur, Mpfq::gfp */
913 static inline
mpfq_p_14_sqr_ur(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_elt_ur z,mpfq_p_14_src_elt x)914 void mpfq_p_14_sqr_ur(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_elt_ur z, mpfq_p_14_src_elt x)
915 {
916     mpfq_fixmp_14_sqr(z, x);
917     mpfq_zero(z + 28, 29 - 28);
918 }
919 
920 /* *Mpfq::gfp::elt::code_for_reduce, Mpfq::gfp */
921 static inline
mpfq_p_14_reduce(mpfq_p_14_dst_field k,mpfq_p_14_dst_elt z,mpfq_p_14_dst_elt_ur x)922 void mpfq_p_14_reduce(mpfq_p_14_dst_field k, mpfq_p_14_dst_elt z, mpfq_p_14_dst_elt_ur x)
923 {
924     mp_limb_t q[29+1];
925     if (x[29-1]>>(64-1)) {
926         // negative number, add bigmul_p to make it positive before reduction
927         mpn_add_n(x, x, k->bigmul_p->_mp_d, 29);
928     }
929     mpn_tdiv_qr(q, z, 0, x, 29, k->p->_mp_d, 14);
930 }
931 
932 /* *simd_gfp::code_for_addmul_si_ur */
933 static inline
mpfq_p_14_addmul_si_ur(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_elt_ur w,mpfq_p_14_src_elt u,long v)934 void mpfq_p_14_addmul_si_ur(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_elt_ur w, mpfq_p_14_src_elt u, long v)
935 {
936         mpfq_p_14_elt_ur s;
937         mpfq_p_14_elt vx;
938         mpfq_p_14_elt_ur_init(K, &s);
939         mpfq_p_14_init(K, &vx);
940         if (v>0) {
941             mpfq_p_14_set_ui(K, vx, v);
942             mpfq_p_14_mul_ur(K, s, u, vx);
943             mpfq_p_14_elt_ur_add(K, w, w, s);
944         } else {
945             mpfq_p_14_set_ui(K, vx, -v);
946             mpfq_p_14_mul_ur(K, s, u, vx);
947             mpfq_p_14_elt_ur_sub(K, w, w, s);
948         }
949         mpfq_p_14_clear(K, &vx);
950         mpfq_p_14_elt_ur_clear(K, &s);
951 }
952 
953 /* *Mpfq::gfp::elt::code_for_cmp, Mpfq::gfp */
954 static inline
mpfq_p_14_cmp(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_src_elt x,mpfq_p_14_src_elt y)955 int mpfq_p_14_cmp(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_src_elt x, mpfq_p_14_src_elt y)
956 {
957     return mpfq_fixmp_14_cmp(x,y);
958 }
959 
960 /* *Mpfq::gfp::elt::code_for_cmp_ui, Mpfq::gfp */
961 static inline
mpfq_p_14_cmp_ui(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_src_elt x,unsigned long y)962 int mpfq_p_14_cmp_ui(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_src_elt x, unsigned long y)
963 {
964     return mpfq_fixmp_14_cmp_ui(x,y);
965 }
966 
967 /* *Mpfq::defaults::flatdata::code_for_is_zero, Mpfq::gfp::elt, Mpfq::gfp */
968 static inline
mpfq_p_14_is_zero(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_src_elt r)969 int mpfq_p_14_is_zero(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_src_elt r)
970 {
971         unsigned int i;
972         for(i = 0 ; i < sizeof(mpfq_p_14_elt)/sizeof(r[0]) ; i++) {
973             if (r[i]) return 0;
974         }
975         return 1;
976 }
977 
978 /* *Mpfq::defaults::vec::flatdata::code_for_vec_set, Mpfq::defaults::flatdata, Mpfq::gfp::elt, Mpfq::gfp */
979 static inline
mpfq_p_14_vec_set(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec r,mpfq_p_14_src_vec s,unsigned long n)980 void mpfq_p_14_vec_set(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec r, mpfq_p_14_src_vec s, unsigned long n)
981 {
982     if (r != s) memmove(r, s, n*sizeof(mpfq_p_14_elt));
983 }
984 
985 /* *Mpfq::defaults::vec::flatdata::code_for_vec_set_zero, Mpfq::defaults::flatdata, Mpfq::gfp::elt, Mpfq::gfp */
986 static inline
mpfq_p_14_vec_set_zero(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec r,unsigned long n)987 void mpfq_p_14_vec_set_zero(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec r, unsigned long n)
988 {
989     memset(r, 0, n*sizeof(mpfq_p_14_elt));
990 }
991 
992 /* *Mpfq::defaults::vec::generic::code_for_vec_setcoeff, Mpfq::defaults::vec, Mpfq::gfp */
993 static inline
mpfq_p_14_vec_setcoeff(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec w,mpfq_p_14_src_elt x,unsigned long i)994 void mpfq_p_14_vec_setcoeff(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec w, mpfq_p_14_src_elt x, unsigned long i)
995 {
996             mpfq_p_14_dst_elt y = mpfq_p_14_vec_coeff_ptr(K, w, i);
997             mpfq_p_14_set(K, y, x);
998 }
999 
1000 /* *Mpfq::defaults::vec::generic::code_for_vec_setcoeff_ui, Mpfq::defaults::vec, Mpfq::gfp */
1001 static inline
mpfq_p_14_vec_setcoeff_ui(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec w,unsigned long x,unsigned long i)1002 void mpfq_p_14_vec_setcoeff_ui(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec w, unsigned long x, unsigned long i)
1003 {
1004             mpfq_p_14_dst_elt y = mpfq_p_14_vec_coeff_ptr(K, w, i);
1005             mpfq_p_14_set_ui(K, y, x);
1006 }
1007 
1008 /* *Mpfq::defaults::vec::generic::code_for_vec_getcoeff, Mpfq::defaults::vec, Mpfq::gfp */
1009 static inline
mpfq_p_14_vec_getcoeff(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_elt x,mpfq_p_14_src_vec w,unsigned long i)1010 void mpfq_p_14_vec_getcoeff(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_elt x, mpfq_p_14_src_vec w, unsigned long i)
1011 {
1012             mpfq_p_14_src_elt y = mpfq_p_14_vec_coeff_ptr_const(K, w, i);
1013             mpfq_p_14_set(K, x, y);
1014 }
1015 
1016 /* *Mpfq::defaults::vec::addsub::code_for_vec_add, Mpfq::defaults::vec, Mpfq::gfp */
1017 static inline
mpfq_p_14_vec_add(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec w,mpfq_p_14_src_vec u,mpfq_p_14_src_vec v,unsigned long n)1018 void mpfq_p_14_vec_add(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec w, mpfq_p_14_src_vec u, mpfq_p_14_src_vec v, unsigned long n)
1019 {
1020         unsigned int i;
1021     for(i = 0; i < n; i+=1)
1022         mpfq_p_14_add(K, w[i], u[i], v[i]);
1023 }
1024 
1025 /* *Mpfq::defaults::vec::addsub::code_for_vec_neg, Mpfq::defaults::vec, Mpfq::gfp */
1026 static inline
mpfq_p_14_vec_neg(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec w,mpfq_p_14_src_vec u,unsigned long n)1027 void mpfq_p_14_vec_neg(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec w, mpfq_p_14_src_vec u, unsigned long n)
1028 {
1029         unsigned int i;
1030     for(i = 0; i < n; ++i)
1031         mpfq_p_14_neg(K, w[i], u[i]);
1032 }
1033 
1034 /* *Mpfq::defaults::vec::addsub::code_for_vec_rev, Mpfq::defaults::vec, Mpfq::gfp */
1035 static inline
mpfq_p_14_vec_rev(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec w,mpfq_p_14_src_vec u,unsigned long n)1036 void mpfq_p_14_vec_rev(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec w, mpfq_p_14_src_vec u, unsigned long n)
1037 {
1038     unsigned int nn = n >> 1;
1039     mpfq_p_14_elt tmp[1];
1040     mpfq_p_14_init(K, tmp);
1041     unsigned int i;
1042     for(i = 0; i < nn; ++i) {
1043         mpfq_p_14_set(K, tmp[0], u[i]);
1044         mpfq_p_14_set(K, w[i], u[n-1-i]);
1045         mpfq_p_14_set(K, w[n-1-i], tmp[0]);
1046     }
1047     if (n & 1)
1048         mpfq_p_14_set(K, w[nn], u[nn]);
1049     mpfq_p_14_clear(K, tmp);
1050 }
1051 
1052 /* *Mpfq::defaults::vec::addsub::code_for_vec_sub, Mpfq::defaults::vec, Mpfq::gfp */
1053 static inline
mpfq_p_14_vec_sub(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec w,mpfq_p_14_src_vec u,mpfq_p_14_src_vec v,unsigned long n)1054 void mpfq_p_14_vec_sub(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec w, mpfq_p_14_src_vec u, mpfq_p_14_src_vec v, unsigned long n)
1055 {
1056     unsigned int i;
1057     for(i = 0; i < n; ++i)
1058         mpfq_p_14_sub(K, w[i], u[i], v[i]);
1059 }
1060 
1061 /* *Mpfq::defaults::vec::mul::code_for_vec_scal_mul, Mpfq::defaults::vec, Mpfq::gfp */
1062 static inline
mpfq_p_14_vec_scal_mul(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec w,mpfq_p_14_src_vec u,mpfq_p_14_src_elt c,unsigned long n)1063 void mpfq_p_14_vec_scal_mul(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec w, mpfq_p_14_src_vec u, mpfq_p_14_src_elt c, unsigned long n)
1064 {
1065         unsigned int i;
1066     for(i = 0; i < n; i++) {
1067         mpfq_p_14_src_elt x = mpfq_p_14_vec_coeff_ptr_const(K, u, i);
1068         mpfq_p_14_dst_elt y = mpfq_p_14_vec_coeff_ptr(K, w, i);
1069         mpfq_p_14_mul(K, y, x, c);
1070     }
1071 }
1072 
1073 /* *Mpfq::defaults::vec::conv::code_for_vec_conv, Mpfq::gfp */
1074 static inline
mpfq_p_14_vec_conv(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec w,mpfq_p_14_src_vec u,unsigned long n,mpfq_p_14_src_vec v,unsigned long m)1075 void mpfq_p_14_vec_conv(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec w, mpfq_p_14_src_vec u, unsigned long n, mpfq_p_14_src_vec v, unsigned long m)
1076 {
1077     mpfq_p_14_vec_ur tmp;
1078     mpfq_p_14_vec_ur_init(K, &tmp, m+n-1);
1079     mpfq_p_14_vec_conv_ur(K, tmp, u, n, v, m);
1080     mpfq_p_14_vec_reduce(K, w, tmp, m+n-1);
1081     mpfq_p_14_vec_ur_clear(K, &tmp, m+n-1);
1082 }
1083 
1084 /* *Mpfq::defaults::vec::getset::code_for_vec_subvec, Mpfq::defaults::vec, Mpfq::gfp */
1085 static inline
mpfq_p_14_vec_subvec(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec v,long i)1086 mpfq_p_14_dst_vec mpfq_p_14_vec_subvec(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec v, long i)
1087 {
1088     return v+i;
1089 }
1090 
1091 /* *Mpfq::defaults::vec::getset::code_for_vec_subvec_const, Mpfq::defaults::vec, Mpfq::gfp */
1092 static inline
mpfq_p_14_vec_subvec_const(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_src_vec v,long i)1093 mpfq_p_14_src_vec mpfq_p_14_vec_subvec_const(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_src_vec v, long i)
1094 {
1095     return v+i;
1096 }
1097 
1098 /* *Mpfq::defaults::vec::getset::code_for_vec_coeff_ptr, Mpfq::defaults::vec, Mpfq::gfp */
1099 static inline
mpfq_p_14_vec_coeff_ptr(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec v,long i)1100 mpfq_p_14_dst_elt mpfq_p_14_vec_coeff_ptr(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec v, long i)
1101 {
1102     return v[i];
1103 }
1104 
1105 /* *Mpfq::defaults::vec::getset::code_for_vec_coeff_ptr_const, Mpfq::defaults::vec, Mpfq::gfp */
1106 static inline
mpfq_p_14_vec_coeff_ptr_const(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_src_vec v,long i)1107 mpfq_p_14_src_elt mpfq_p_14_vec_coeff_ptr_const(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_src_vec v, long i)
1108 {
1109     return v[i];
1110 }
1111 
1112 /* *Mpfq::defaults::vec::flatdata::code_for_vec_ur_set_zero, Mpfq::defaults::flatdata, Mpfq::gfp::elt, Mpfq::gfp */
1113 static inline
mpfq_p_14_vec_ur_set_zero(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec_ur r,unsigned long n)1114 void mpfq_p_14_vec_ur_set_zero(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec_ur r, unsigned long n)
1115 {
1116     memset(r, 0, n*sizeof(mpfq_p_14_elt_ur));
1117 }
1118 
1119 /* *Mpfq::defaults::vec::generic::code_for_vec_ur_set_vec, Mpfq::defaults::vec, Mpfq::gfp */
1120 static inline
mpfq_p_14_vec_ur_set_vec(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec_ur w,mpfq_p_14_src_vec u,unsigned long n)1121 void mpfq_p_14_vec_ur_set_vec(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec_ur w, mpfq_p_14_src_vec u, unsigned long n)
1122 {
1123             unsigned int i;
1124             for(i = 0; i < n; ++i) {
1125                 mpfq_p_14_src_elt x = mpfq_p_14_vec_coeff_ptr_const(K, u, i);
1126                 mpfq_p_14_dst_elt_ur y = mpfq_p_14_vec_ur_coeff_ptr(K, w, i);
1127                 mpfq_p_14_elt_ur_set_elt(K, y, x);
1128             }
1129 }
1130 
1131 /* *Mpfq::defaults::vec::flatdata::code_for_vec_ur_set, Mpfq::defaults::flatdata, Mpfq::gfp::elt, Mpfq::gfp */
1132 static inline
mpfq_p_14_vec_ur_set(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec_ur r,mpfq_p_14_src_vec_ur s,unsigned long n)1133 void mpfq_p_14_vec_ur_set(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec_ur r, mpfq_p_14_src_vec_ur s, unsigned long n)
1134 {
1135     if (r != s) memmove(r, s, n*sizeof(mpfq_p_14_elt_ur));
1136 }
1137 
1138 /* *Mpfq::defaults::vec::generic::code_for_vec_ur_setcoeff, Mpfq::defaults::vec, Mpfq::gfp */
1139 static inline
mpfq_p_14_vec_ur_setcoeff(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec_ur w,mpfq_p_14_src_elt_ur x,unsigned long i)1140 void mpfq_p_14_vec_ur_setcoeff(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec_ur w, mpfq_p_14_src_elt_ur x, unsigned long i)
1141 {
1142             mpfq_p_14_dst_elt_ur y = mpfq_p_14_vec_ur_coeff_ptr(K, w, i);
1143             mpfq_p_14_elt_ur_set(K, y, x);
1144 }
1145 
1146 /* *Mpfq::defaults::vec::generic::code_for_vec_ur_getcoeff, Mpfq::defaults::vec, Mpfq::gfp */
1147 static inline
mpfq_p_14_vec_ur_getcoeff(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_elt_ur x,mpfq_p_14_src_vec_ur w,unsigned long i)1148 void mpfq_p_14_vec_ur_getcoeff(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_elt_ur x, mpfq_p_14_src_vec_ur w, unsigned long i)
1149 {
1150             mpfq_p_14_src_elt_ur y = mpfq_p_14_vec_ur_coeff_ptr_const(K, w, i);
1151             mpfq_p_14_elt_ur_set(K, x, y);
1152 }
1153 
1154 /* *Mpfq::defaults::vec::addsub::code_for_vec_ur_add, Mpfq::defaults::vec, Mpfq::gfp */
1155 static inline
mpfq_p_14_vec_ur_add(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec_ur w,mpfq_p_14_src_vec_ur u,mpfq_p_14_src_vec_ur v,unsigned long n)1156 void mpfq_p_14_vec_ur_add(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec_ur w, mpfq_p_14_src_vec_ur u, mpfq_p_14_src_vec_ur v, unsigned long n)
1157 {
1158     unsigned int i;
1159     for(i = 0; i < n; i+=1)
1160         mpfq_p_14_elt_ur_add(K, w[i], u[i], v[i]);
1161 }
1162 
1163 /* *Mpfq::defaults::vec::addsub::code_for_vec_ur_sub, Mpfq::defaults::vec, Mpfq::gfp */
1164 static inline
mpfq_p_14_vec_ur_sub(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec_ur w,mpfq_p_14_src_vec_ur u,mpfq_p_14_src_vec_ur v,unsigned long n)1165 void mpfq_p_14_vec_ur_sub(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec_ur w, mpfq_p_14_src_vec_ur u, mpfq_p_14_src_vec_ur v, unsigned long n)
1166 {
1167     unsigned int i;
1168     for(i = 0; i < n; i+=1)
1169         mpfq_p_14_elt_ur_sub(K, w[i], u[i], v[i]);
1170 }
1171 
1172 /* *Mpfq::defaults::vec::addsub::code_for_vec_ur_neg, Mpfq::defaults::vec, Mpfq::gfp */
1173 static inline
mpfq_p_14_vec_ur_neg(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec_ur w,mpfq_p_14_src_vec_ur u,unsigned long n)1174 void mpfq_p_14_vec_ur_neg(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec_ur w, mpfq_p_14_src_vec_ur u, unsigned long n)
1175 {
1176     unsigned int i;
1177     for(i = 0; i < n; ++i)
1178         mpfq_p_14_elt_ur_neg(K, w[i], u[i]);
1179 }
1180 
1181 /* *Mpfq::defaults::vec::addsub::code_for_vec_ur_rev, Mpfq::defaults::vec, Mpfq::gfp */
1182 static inline
mpfq_p_14_vec_ur_rev(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec_ur w,mpfq_p_14_src_vec_ur u,unsigned long n)1183 void mpfq_p_14_vec_ur_rev(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec_ur w, mpfq_p_14_src_vec_ur u, unsigned long n)
1184 {
1185     unsigned int nn = n >> 1;
1186     mpfq_p_14_elt_ur tmp[1];
1187     mpfq_p_14_elt_ur_init(K, tmp);
1188     unsigned int i;
1189     for(i = 0; i < nn; ++i) {
1190         mpfq_p_14_elt_ur_set(K, tmp[0], u[i]);
1191         mpfq_p_14_elt_ur_set(K, w[i], u[n-1-i]);
1192         mpfq_p_14_elt_ur_set(K, w[n-1-i], tmp[0]);
1193     }
1194     if (n & 1)
1195         mpfq_p_14_elt_ur_set(K, w[nn], u[nn]);
1196     mpfq_p_14_elt_ur_clear(K, tmp);
1197 }
1198 
1199 /* *Mpfq::defaults::vec::mul::code_for_vec_scal_mul_ur, Mpfq::defaults::vec, Mpfq::gfp */
1200 static inline
mpfq_p_14_vec_scal_mul_ur(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec_ur w,mpfq_p_14_src_vec u,mpfq_p_14_src_elt c,unsigned long n)1201 void mpfq_p_14_vec_scal_mul_ur(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec_ur w, mpfq_p_14_src_vec u, mpfq_p_14_src_elt c, unsigned long n)
1202 {
1203     unsigned int i;
1204     for(i = 0; i < n; i++) {
1205         mpfq_p_14_src_elt x = mpfq_p_14_vec_coeff_ptr_const(K, u, i);
1206         mpfq_p_14_dst_elt_ur y = mpfq_p_14_vec_ur_coeff_ptr(K, w, i);
1207         mpfq_p_14_mul_ur(K, y, x, c);
1208     }
1209 }
1210 
1211 /* *Mpfq::defaults::vec::conv::code_for_vec_conv_ur, Mpfq::gfp */
1212 /* Triggered by: vec_conv_ur */
1213 static inline
mpfq_p_14_vec_conv_ur_n(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec_ur w,mpfq_p_14_src_vec u,mpfq_p_14_src_vec v,unsigned int n)1214 void mpfq_p_14_vec_conv_ur_n(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec_ur w, mpfq_p_14_src_vec u, mpfq_p_14_src_vec v, unsigned int n)
1215 {
1216     if (n == 0)
1217         return;
1218     if (n == 1) {
1219         mpfq_p_14_mul_ur(K, w[0], u[0], v[0]);
1220         return;
1221     }
1222     if (n == 2) {  // Kara 2
1223         mpfq_p_14_elt t1, t2;
1224         mpfq_p_14_init(K, &t1);
1225         mpfq_p_14_init(K, &t2);
1226         mpfq_p_14_mul_ur(K, w[0], u[0], v[0]);
1227         mpfq_p_14_mul_ur(K, w[2], u[1], v[1]);
1228         mpfq_p_14_add(K, t1, u[0], u[1]);
1229         mpfq_p_14_add(K, t2, v[0], v[1]);
1230         mpfq_p_14_mul_ur(K, w[1], t1, t2);
1231         mpfq_p_14_elt_ur_sub(K, w[1], w[1], w[0]);
1232         mpfq_p_14_elt_ur_sub(K, w[1], w[1], w[2]);
1233         mpfq_p_14_clear(K, &t1);
1234         mpfq_p_14_clear(K, &t2);
1235         return;
1236     }
1237     if (n == 3) {  // do it in 6
1238         mpfq_p_14_elt t1, t2;
1239         mpfq_p_14_elt_ur s;
1240         mpfq_p_14_init(K, &t1);
1241         mpfq_p_14_init(K, &t2);
1242         mpfq_p_14_elt_ur_init(K, &s);
1243         // a0*b0*(1 - X)
1244         mpfq_p_14_mul_ur(K, w[0], u[0], v[0]);
1245         mpfq_p_14_elt_ur_neg(K, w[1], w[0]);
1246         // a1*b1*(-X + 2*X^2 - X^3)
1247         mpfq_p_14_mul_ur(K, w[2], u[1], v[1]);
1248         mpfq_p_14_elt_ur_neg(K, w[3], w[2]);
1249         mpfq_p_14_elt_ur_add(K, w[2], w[2], w[2]);
1250         mpfq_p_14_elt_ur_add(K, w[1], w[1], w[3]);
1251         // a2*b2*(-X^3+X^4)
1252         mpfq_p_14_mul_ur(K, w[4], u[2], v[2]);
1253         mpfq_p_14_elt_ur_sub(K, w[3], w[3], w[4]);
1254         // (a0+a1)*(b0+b1)*(X - X^2)
1255         mpfq_p_14_add(K, t1, u[0], u[1]);
1256         mpfq_p_14_add(K, t2, v[0], v[1]);
1257         mpfq_p_14_mul_ur(K, s, t1, t2);
1258         mpfq_p_14_elt_ur_add(K, w[1], w[1], s);
1259         mpfq_p_14_elt_ur_sub(K, w[2], w[2], s);
1260         // (a1+a2)*(b1+b2)*(X^3 - X^2)
1261         mpfq_p_14_add(K, t1, u[1], u[2]);
1262         mpfq_p_14_add(K, t2, v[1], v[2]);
1263         mpfq_p_14_mul_ur(K, s, t1, t2);
1264         mpfq_p_14_elt_ur_add(K, w[3], w[3], s);
1265         mpfq_p_14_elt_ur_sub(K, w[2], w[2], s);
1266         // (a0+a1+a2)*(b0+b1+b2)* X^2
1267         mpfq_p_14_add(K, t1, u[0], t1);
1268         mpfq_p_14_add(K, t2, v[0], t2);
1269         mpfq_p_14_mul_ur(K, s, t1, t2);
1270         mpfq_p_14_elt_ur_add(K, w[2], w[2], s);
1271         return;
1272     }
1273     unsigned int n0, n1;
1274     n0 = n / 2;
1275     n1 = n - n0;
1276     mpfq_p_14_vec_conv_ur_n(K, w, u, v, n0);
1277     mpfq_p_14_vec_conv_ur_n(K, w + 2*n0, u + n0, v + n0, n1);
1278     mpfq_p_14_elt_ur_set_ui(K, w[2*n0-1], 0);
1279 
1280     mpfq_p_14_vec tmpu, tmpv;
1281     mpfq_p_14_vec_ur tmpw;
1282     mpfq_p_14_vec_init(K, &tmpu, n1);
1283     mpfq_p_14_vec_init(K, &tmpv, n1);
1284     mpfq_p_14_vec_ur_init(K, &tmpw, 2*n1-1);
1285 
1286     mpfq_p_14_vec_set(K, tmpu, u, n0);
1287     if (n1 != n0)
1288         mpfq_p_14_set_ui(K, tmpu[n0], 0);
1289     mpfq_p_14_vec_add(K, tmpu, tmpu, u+n0, n1);
1290     mpfq_p_14_vec_set(K, tmpv, v, n0);
1291     if (n1 != n0)
1292         mpfq_p_14_set_ui(K, tmpv[n0], 0);
1293     mpfq_p_14_vec_add(K, tmpv, tmpv, v+n0, n1);
1294     mpfq_p_14_vec_conv_ur_n(K, tmpw, tmpu, tmpv, n1);
1295     mpfq_p_14_vec_ur_sub(K, tmpw, tmpw, w, 2*n0-1);
1296     mpfq_p_14_vec_ur_sub(K, tmpw, tmpw, w + 2*n0, 2*n1-1);
1297     mpfq_p_14_vec_ur_add(K, w + n0, w + n0, tmpw, 2*n1-1);
1298 
1299     mpfq_p_14_vec_clear(K, &tmpu, n1);
1300     mpfq_p_14_vec_clear(K, &tmpv, n1);
1301     mpfq_p_14_vec_ur_clear(K, &tmpw, 2*n1-1);
1302     return;
1303 }
1304 
1305 /* *Mpfq::defaults::vec::conv::code_for_vec_conv_ur, Mpfq::gfp */
1306 static inline
mpfq_p_14_vec_conv_ur(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec_ur w,mpfq_p_14_src_vec u,unsigned long n,mpfq_p_14_src_vec v,unsigned long m)1307 void mpfq_p_14_vec_conv_ur(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec_ur w, mpfq_p_14_src_vec u, unsigned long n, mpfq_p_14_src_vec v, unsigned long m)
1308 {
1309     if ((n > 1) && (m > 1) && (n+m > 15)) {
1310         mpfq_p_14_vec_conv_ur_ks(K, w, u, n, v, m);
1311         return;
1312     }
1313     if (n == m) {
1314         mpfq_p_14_vec_conv_ur_n(K, w, u, v, n);
1315         return;
1316     }
1317     unsigned int i, j MAYBE_UNUSED, k;
1318     mpfq_p_14_elt_ur acc, z;
1319     mpfq_p_14_elt_ur_init(K, &acc);
1320     mpfq_p_14_elt_ur_init(K, &z);
1321     // swap pointers to have n <= m
1322     mpfq_p_14_src_vec uu, vv;
1323     if (n <= m) {
1324         uu = u; vv = v;
1325     } else {
1326         uu = v; vv = u;
1327         unsigned int tmp = n;
1328         n = m; m = tmp;
1329     }
1330     for(k = 0; k < n; ++k) {
1331         mpfq_p_14_mul_ur(K, acc, uu[0], vv[k]);
1332         for(i = 1; i <= k; ++i) {
1333             mpfq_p_14_mul_ur(K, z, uu[i], vv[k-i]);
1334             mpfq_p_14_elt_ur_add(K, acc, acc, z);
1335         }
1336         mpfq_p_14_elt_ur_set(K, w[k], acc);
1337     }
1338     for(k = n; k < m; ++k) {
1339         mpfq_p_14_mul_ur(K, acc, uu[0], vv[k]);
1340         for(i = 1; i < n; ++i) {
1341             mpfq_p_14_mul_ur(K, z, uu[i], vv[k-i]);
1342             mpfq_p_14_elt_ur_add(K, acc, acc, z);
1343         }
1344         mpfq_p_14_elt_ur_set(K, w[k], acc);
1345     }
1346     for(k = m; k < n+m-1; ++k) {
1347         mpfq_p_14_mul_ur(K, acc, uu[k-m+1], vv[m-1]);
1348         for(i = k-m+2; i < n; ++i) {
1349             mpfq_p_14_mul_ur(K, z, uu[i], vv[k-i]);
1350             mpfq_p_14_elt_ur_add(K, acc, acc, z);
1351         }
1352         mpfq_p_14_elt_ur_set(K, w[k], acc);
1353     }
1354     mpfq_p_14_elt_ur_clear(K, &acc);
1355     mpfq_p_14_elt_ur_clear(K, &z);
1356 }
1357 
1358 /* *Mpfq::defaults::vec::mul::code_for_vec_reduce, Mpfq::defaults::vec, Mpfq::gfp */
1359 static inline
mpfq_p_14_vec_reduce(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec w,mpfq_p_14_dst_vec_ur u,unsigned long n)1360 void mpfq_p_14_vec_reduce(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec w, mpfq_p_14_dst_vec_ur u, unsigned long n)
1361 {
1362     unsigned int i;
1363     for(i = 0; i < n; i++) {
1364         mpfq_p_14_dst_elt_ur x = mpfq_p_14_vec_ur_coeff_ptr(K, u, i);
1365         mpfq_p_14_dst_elt y = mpfq_p_14_vec_coeff_ptr(K, w, i);
1366         mpfq_p_14_reduce(K, y, x);
1367     }
1368 }
1369 
1370 /* *Mpfq::defaults::vec::getset::code_for_vec_ur_subvec, Mpfq::defaults::vec, Mpfq::gfp */
1371 static inline
mpfq_p_14_vec_ur_subvec(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec_ur v,long i)1372 mpfq_p_14_dst_vec_ur mpfq_p_14_vec_ur_subvec(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec_ur v, long i)
1373 {
1374     return v+i;
1375 }
1376 
1377 /* *Mpfq::defaults::vec::getset::code_for_vec_ur_subvec_const, Mpfq::defaults::vec, Mpfq::gfp */
1378 static inline
mpfq_p_14_vec_ur_subvec_const(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_src_vec_ur v,long i)1379 mpfq_p_14_src_vec_ur mpfq_p_14_vec_ur_subvec_const(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_src_vec_ur v, long i)
1380 {
1381     return v+i;
1382 }
1383 
1384 /* *Mpfq::defaults::vec::getset::code_for_vec_ur_coeff_ptr, Mpfq::defaults::vec, Mpfq::gfp */
1385 static inline
mpfq_p_14_vec_ur_coeff_ptr(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_vec_ur v,long i)1386 mpfq_p_14_dst_elt mpfq_p_14_vec_ur_coeff_ptr(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_vec_ur v, long i)
1387 {
1388     return v[i];
1389 }
1390 
1391 /* *Mpfq::defaults::vec::getset::code_for_vec_ur_coeff_ptr_const, Mpfq::defaults::vec, Mpfq::gfp */
1392 static inline
mpfq_p_14_vec_ur_coeff_ptr_const(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_src_vec_ur v,long i)1393 mpfq_p_14_src_elt mpfq_p_14_vec_ur_coeff_ptr_const(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_src_vec_ur v, long i)
1394 {
1395     return v[i];
1396 }
1397 
1398 /* *Mpfq::defaults::poly::code_for_poly_init, Mpfq::gfp */
1399 static inline
mpfq_p_14_poly_init(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_poly p,unsigned int n)1400 void mpfq_p_14_poly_init(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_poly p, unsigned int n)
1401 {
1402     mpfq_p_14_vec_init(k, &(p->c), n);
1403     p->alloc=n;
1404     p->size=0;
1405 }
1406 
1407 /* *Mpfq::defaults::poly::code_for_poly_clear, Mpfq::gfp */
1408 static inline
mpfq_p_14_poly_clear(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_poly p)1409 void mpfq_p_14_poly_clear(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_poly p)
1410 {
1411     mpfq_p_14_vec_clear(k, &(p->c), p->alloc);
1412 }
1413 
1414 /* *Mpfq::defaults::poly::code_for_poly_set, Mpfq::gfp */
1415 static inline
mpfq_p_14_poly_set(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,mpfq_p_14_src_poly u)1416 void mpfq_p_14_poly_set(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, mpfq_p_14_src_poly u)
1417 {
1418     if (w->alloc < u->size) {
1419         mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, u->size);
1420         w->alloc = u->size;
1421     }
1422     mpfq_p_14_vec_set(k, w->c, u->c, u->size);
1423     w->size = u->size;
1424 }
1425 
1426 /* *Mpfq::defaults::poly::code_for_poly_setcoeff, Mpfq::gfp */
1427 static inline
mpfq_p_14_poly_setcoeff(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,mpfq_p_14_src_elt x,unsigned int i)1428 void mpfq_p_14_poly_setcoeff(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, mpfq_p_14_src_elt x, unsigned int i)
1429 {
1430     if (w->alloc < (i+1)) {
1431         mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, i+1);
1432         w->alloc = i+1;
1433     }
1434     if (w->size < (i+1)) {
1435         mpfq_p_14_vec_set_zero(k, mpfq_p_14_vec_subvec(k, w->c, w->size), (i - w->size));
1436         w->size = i+1;
1437     }
1438     mpfq_p_14_vec_setcoeff(k, w->c, x, i);
1439     w->size = 1 + mpfq_p_14_poly_deg(k, w);
1440 }
1441 
1442 /* *Mpfq::defaults::poly::code_for_poly_setcoeff_ui, Mpfq::gfp */
1443 static inline
mpfq_p_14_poly_setcoeff_ui(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,unsigned long x,unsigned int i)1444 void mpfq_p_14_poly_setcoeff_ui(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, unsigned long x, unsigned int i)
1445 {
1446     if (w->alloc < (i+1)) {
1447         mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, i+1);
1448         w->alloc = i+1;
1449     }
1450     if (w->size < (i+1)) {
1451         mpfq_p_14_vec_set_zero(k, mpfq_p_14_vec_subvec(k, w->c, w->size), (i - w->size));
1452         w->size = i+1;
1453     }
1454     mpfq_p_14_vec_setcoeff_ui(k, w->c, x, i);
1455     w->size = 1 + mpfq_p_14_poly_deg(k, w);
1456 }
1457 
1458 /* *Mpfq::defaults::poly::code_for_poly_getcoeff, Mpfq::gfp */
1459 static inline
mpfq_p_14_poly_getcoeff(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_elt x,mpfq_p_14_src_poly w,unsigned int i)1460 void mpfq_p_14_poly_getcoeff(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_elt x, mpfq_p_14_src_poly w, unsigned int i)
1461 {
1462     if (w->size < (i+1)) {
1463        mpfq_p_14_set_ui(k,x,0);
1464     } else {
1465        mpfq_p_14_vec_getcoeff(k, x, w->c, i);
1466     }
1467 }
1468 
1469 /* *Mpfq::defaults::poly::code_for_poly_deg, Mpfq::gfp */
1470 static inline
mpfq_p_14_poly_deg(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_src_poly w)1471 int mpfq_p_14_poly_deg(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_src_poly w)
1472 {
1473     if (w->size == 0)
1474         return -1;
1475     int deg = w->size-1;
1476     mpfq_p_14_elt temp;
1477     mpfq_p_14_init(K, &temp);
1478     mpfq_p_14_vec_getcoeff(K, temp, w->c, deg);
1479     int comp=mpfq_p_14_cmp_ui(K, temp, 0);
1480     while ((deg >= 0) && (comp == 0)){
1481         deg--;
1482         if (deg>=0) {
1483            mpfq_p_14_vec_getcoeff(K, temp, w->c, deg);
1484            comp=mpfq_p_14_cmp_ui(K, temp, 0);
1485         }
1486     }
1487     mpfq_p_14_clear(K, &temp);
1488     return deg;
1489 }
1490 
1491 /* *Mpfq::defaults::poly::code_for_poly_add, Mpfq::gfp */
1492 static inline
mpfq_p_14_poly_add(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,mpfq_p_14_src_poly u,mpfq_p_14_src_poly v)1493 void mpfq_p_14_poly_add(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, mpfq_p_14_src_poly u, mpfq_p_14_src_poly v)
1494 {
1495     unsigned int su = u->size;
1496     unsigned int sv = v->size;
1497     unsigned int maxsize = MAX(su, sv);
1498     if (w->alloc < maxsize) {
1499         mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, maxsize);
1500         w->alloc = maxsize;
1501     }
1502     w->size = maxsize;
1503     if (!maxsize) return;
1504     if (su <= sv) {
1505         mpfq_p_14_vec_add(k, w->c, u->c, v->c, su);
1506         mpfq_p_14_vec_set(k, mpfq_p_14_vec_subvec(k, w->c, su), mpfq_p_14_vec_subvec_const(k, v->c, su), sv-su);
1507     } else {
1508         mpfq_p_14_vec_add(k, w->c, u->c, v->c, sv);
1509         mpfq_p_14_vec_set(k, mpfq_p_14_vec_subvec(k, w->c, sv), mpfq_p_14_vec_subvec_const(k, u->c, sv), su-sv);
1510     }
1511     w->size = 1 + mpfq_p_14_poly_deg(k, w);
1512 }
1513 
1514 /* *Mpfq::defaults::poly::code_for_poly_sub, Mpfq::gfp */
1515 static inline
mpfq_p_14_poly_sub(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,mpfq_p_14_src_poly u,mpfq_p_14_src_poly v)1516 void mpfq_p_14_poly_sub(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, mpfq_p_14_src_poly u, mpfq_p_14_src_poly v)
1517 {
1518     unsigned int su = u->size;
1519     unsigned int sv = v->size;
1520     unsigned int maxsize = MAX(su, sv);
1521     if (w->alloc < maxsize) {
1522         mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, maxsize);
1523         w->alloc = maxsize;
1524     }
1525     w->size = maxsize;
1526     if (!maxsize) return;
1527     if (su <= sv) {
1528         mpfq_p_14_vec_sub(k, w->c, u->c, v->c, su);
1529         mpfq_p_14_vec_neg(k, mpfq_p_14_vec_subvec(k, w->c, su), mpfq_p_14_vec_subvec_const(k, v->c, su), sv-su);
1530     } else {
1531         mpfq_p_14_vec_sub(k, w->c, u->c, v->c, sv);
1532         mpfq_p_14_vec_set(k, mpfq_p_14_vec_subvec(k, w->c, sv), mpfq_p_14_vec_subvec_const(k, u->c, sv), su-sv);
1533     }
1534     w->size = 1 + mpfq_p_14_poly_deg(k, w);
1535 }
1536 
1537 /* *Mpfq::defaults::poly::code_for_poly_set_ui, Mpfq::gfp */
1538 static inline
mpfq_p_14_poly_set_ui(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,unsigned long x)1539 void mpfq_p_14_poly_set_ui(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, unsigned long x)
1540 {
1541         if (x == 0) {
1542             w->size = 0;
1543             return;
1544         }
1545         if (w->alloc == 0) {
1546             mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, 1);
1547             w->alloc = 1;
1548         }
1549         mpfq_p_14_vec_setcoeff_ui(k, w->c, x, 0);
1550         w->size = 1;
1551         w->size = 1 + mpfq_p_14_poly_deg(k, w);
1552 }
1553 
1554 /* *Mpfq::defaults::poly::code_for_poly_add_ui, Mpfq::gfp */
1555 static inline
mpfq_p_14_poly_add_ui(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,mpfq_p_14_src_poly u,unsigned long x)1556 void mpfq_p_14_poly_add_ui(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, mpfq_p_14_src_poly u, unsigned long x)
1557 {
1558     if (u->size == 0) {
1559         if (x == 0) {
1560             w->size = 0;
1561             return;
1562         }
1563         if (w->alloc == 0) {
1564             mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, 1);
1565             w->alloc = 1;
1566         }
1567         mpfq_p_14_vec_setcoeff_ui(k, w->c, x, 0);
1568         w->size = 1;
1569         w->size = 1 + mpfq_p_14_poly_deg(k, w);
1570         return;
1571     }
1572     if (w->alloc < u->size) {
1573         mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, u->size);
1574         w->alloc = u->size;
1575     }
1576     w->size=u->size;
1577     mpfq_p_14_vec_set(k, mpfq_p_14_vec_subvec(k, w->c, 1), mpfq_p_14_vec_subvec_const(k, u->c, 1), u->size - 1);
1578     mpfq_p_14_add_ui(k, mpfq_p_14_vec_coeff_ptr(k, w->c, 0), mpfq_p_14_vec_coeff_ptr_const(k, u->c, 0), x);
1579 }
1580 
1581 /* *Mpfq::defaults::poly::code_for_poly_sub_ui, Mpfq::gfp */
1582 static inline
mpfq_p_14_poly_sub_ui(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,mpfq_p_14_src_poly u,unsigned long x)1583 void mpfq_p_14_poly_sub_ui(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, mpfq_p_14_src_poly u, unsigned long x)
1584 {
1585     if (u->size == 0) {
1586         if (x == 0) {
1587             w->size = 0;
1588             return;
1589         }
1590         if (w->alloc == 0) {
1591             mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, 1);
1592             w->alloc = 1;
1593         }
1594         mpfq_p_14_elt temp;
1595         mpfq_p_14_init(k, &temp);
1596         mpfq_p_14_set_ui(k, temp, x);
1597         mpfq_p_14_neg(k, mpfq_p_14_vec_coeff_ptr(k, w->c, 0), temp);
1598         w->size = mpfq_p_14_cmp_ui(k, temp, 0);
1599         mpfq_p_14_clear(k, &temp);
1600         return;
1601     }
1602     if (w->alloc < u->size) {
1603         mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, u->size);
1604         w->alloc = u->size;
1605     }
1606     w->size=u->size;
1607     mpfq_p_14_vec_set(k, mpfq_p_14_vec_subvec(k, w->c, 1), mpfq_p_14_vec_subvec_const(k, u->c, 1), u->size - 1);
1608     mpfq_p_14_sub_ui(k, mpfq_p_14_vec_coeff_ptr(k, w->c, 0), mpfq_p_14_vec_coeff_ptr_const(k, u->c, 0), x);
1609 }
1610 
1611 /* *Mpfq::defaults::poly::code_for_poly_neg, Mpfq::gfp */
1612 static inline
mpfq_p_14_poly_neg(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,mpfq_p_14_src_poly u)1613 void mpfq_p_14_poly_neg(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, mpfq_p_14_src_poly u)
1614 {
1615     if (w->alloc < u->size) {
1616         mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, u->size);
1617         w->alloc = u->size;
1618     }
1619     mpfq_p_14_vec_neg(k, w->c, u->c, u->size);
1620     w->size = u->size;
1621 }
1622 
1623 /* *Mpfq::defaults::poly::code_for_poly_scal_mul, Mpfq::gfp */
1624 static inline
mpfq_p_14_poly_scal_mul(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,mpfq_p_14_src_poly u,mpfq_p_14_src_elt x)1625 void mpfq_p_14_poly_scal_mul(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, mpfq_p_14_src_poly u, mpfq_p_14_src_elt x)
1626 {
1627     if (mpfq_p_14_cmp_ui(k, x, 0) == 0) {
1628         w->size = 0;
1629         return;
1630     }
1631     unsigned int n = u->size;
1632     if (w->alloc < n) {
1633         mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, n);
1634         w->alloc = n;
1635     }
1636     mpfq_p_14_vec_scal_mul(k, w->c, u->c, x, n);
1637     w->size=n;
1638     w->size = 1 + mpfq_p_14_poly_deg(k, w);
1639 }
1640 
1641 /* *Mpfq::defaults::poly::code_for_poly_mul, Mpfq::gfp */
1642 static inline
mpfq_p_14_poly_mul(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,mpfq_p_14_src_poly u,mpfq_p_14_src_poly v)1643 void mpfq_p_14_poly_mul(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, mpfq_p_14_src_poly u, mpfq_p_14_src_poly v)
1644 {
1645     unsigned int usize = mpfq_p_14_poly_deg(k, u)+1;
1646     unsigned int vsize = mpfq_p_14_poly_deg(k, v)+1;
1647     if ((usize == 0) || (vsize == 0)) {
1648         w->size = 0;
1649         return;
1650     }
1651     unsigned int wsize = usize + vsize - 1;
1652     if (w->alloc < wsize) {
1653         mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, wsize);
1654         w->alloc = wsize;
1655     }
1656     mpfq_p_14_vec_conv(k, w->c, u->c, usize, v->c, vsize);
1657     w->size=wsize;
1658     w->size = 1 + mpfq_p_14_poly_deg(k, w);
1659 }
1660 
1661 /* *Mpfq::defaults::polygcd::code_for_poly_gcd, Mpfq::defaults::poly, Mpfq::gfp */
1662 static inline
mpfq_p_14_poly_gcd(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly g,mpfq_p_14_src_poly a0,mpfq_p_14_src_poly b0)1663 void mpfq_p_14_poly_gcd(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly g, mpfq_p_14_src_poly a0, mpfq_p_14_src_poly b0)
1664 {
1665     mpfq_p_14_poly a,b,q,r;
1666     int da0=mpfq_p_14_poly_deg(k,a0), db0=mpfq_p_14_poly_deg(k,b0);
1667     if (db0==-1)
1668      mpfq_p_14_poly_set(k,g,a0);
1669     else {
1670      mpfq_p_14_poly_init(k,a,da0+1);
1671      mpfq_p_14_poly_init(k,b,db0+1);
1672      mpfq_p_14_poly_init(k,q,1);
1673      mpfq_p_14_poly_init(k,r,db0);
1674      mpfq_p_14_poly_set(k,a,a0);
1675      mpfq_p_14_poly_set(k,b,b0);
1676      while (mpfq_p_14_poly_deg(k,b)>=0) {
1677       mpfq_p_14_poly_divmod(k,q,r,a,b);
1678       mpfq_p_14_poly_set(k,a,b);
1679       mpfq_p_14_poly_set(k,b,r);
1680      }
1681      mpfq_p_14_poly_setmonic(k,g,a);
1682     mpfq_p_14_poly_clear(k,a);
1683     mpfq_p_14_poly_clear(k,b);
1684     mpfq_p_14_poly_clear(k,q);
1685     mpfq_p_14_poly_clear(k,r);
1686     }
1687 }
1688 
1689 /* *Mpfq::defaults::polygcd::code_for_poly_xgcd, Mpfq::defaults::poly, Mpfq::gfp */
1690 static inline
mpfq_p_14_poly_xgcd(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly g,mpfq_p_14_dst_poly u0,mpfq_p_14_dst_poly v0,mpfq_p_14_src_poly a0,mpfq_p_14_src_poly b0)1691 void mpfq_p_14_poly_xgcd(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly g, mpfq_p_14_dst_poly u0, mpfq_p_14_dst_poly v0, mpfq_p_14_src_poly a0, mpfq_p_14_src_poly b0)
1692 {
1693     mpfq_p_14_poly a,b,u,v,w,x,q,r;
1694     mpfq_p_14_elt c;
1695     mpfq_p_14_init(k,&c);
1696     mpfq_p_14_set_ui(k,c,0);        /* placate gcc */
1697     int da0=mpfq_p_14_poly_deg(k,a0), db0=mpfq_p_14_poly_deg(k,b0), dega;
1698     if (db0==-1) {
1699      if (da0==-1) {
1700       mpfq_p_14_poly_set(k,u0,a0);
1701       mpfq_p_14_poly_set(k,v0,b0);
1702       mpfq_p_14_poly_set(k,g,a0);
1703      } else {
1704       mpfq_p_14_poly_getcoeff(k,c,a0,da0);
1705       mpfq_p_14_inv(k,c,c);
1706       mpfq_p_14_poly_scal_mul(k,g,a0,c);
1707       mpfq_p_14_poly_set(k,v0,b0);
1708       mpfq_p_14_poly_set(k,u0,b0);
1709       mpfq_p_14_poly_setcoeff(k,u0,c,0);
1710      }
1711     }
1712     else {
1713      mpfq_p_14_poly_init(k,a,da0+1);
1714      mpfq_p_14_poly_init(k,b,db0+1);
1715      mpfq_p_14_poly_init(k,q,1);
1716      mpfq_p_14_poly_init(k,r,db0);
1717      mpfq_p_14_poly_set(k,a,a0);
1718      mpfq_p_14_poly_set(k,b,b0);
1719      mpfq_p_14_poly_init(k,u,1);
1720      mpfq_p_14_poly_init(k,v,1);
1721      mpfq_p_14_poly_init(k,w,1);
1722      mpfq_p_14_poly_init(k,x,1);
1723      mpfq_p_14_poly_setcoeff_ui(k,u,1,0);
1724      mpfq_p_14_poly_setcoeff_ui(k,x,1,0);
1725      /* u*a_initial + v*b_initial = a */
1726      /* w*a_initial + x*b_initial = b */
1727      while (mpfq_p_14_poly_deg(k,b)>=0) {
1728       mpfq_p_14_poly_divmod(k,q,r,a,b);
1729       mpfq_p_14_poly_set(k,a,b);  /* a,b <- b,a-qb=r */
1730       mpfq_p_14_poly_set(k,b,r);
1731       mpfq_p_14_poly_mul(k,r,q,w);
1732       mpfq_p_14_poly_sub(k,r,u,r);
1733       mpfq_p_14_poly_set(k,u,w);   /* u,w <- w,u-qw */
1734       mpfq_p_14_poly_set(k,w,r);
1735       mpfq_p_14_poly_mul(k,r,q,x); /* v,x <- x,v-qx */
1736       mpfq_p_14_poly_sub(k,r,v,r);
1737       mpfq_p_14_poly_set(k,v,x);
1738       mpfq_p_14_poly_set(k,x,r);
1739      }
1740      dega=mpfq_p_14_poly_deg(k,a);
1741      ASSERT_FOR_STATIC_ANALYZER(dega >= 0);
1742      mpfq_p_14_poly_getcoeff(k,c,a,dega);
1743      mpfq_p_14_inv(k,c,c);
1744      mpfq_p_14_poly_scal_mul(k,g,a,c);
1745      mpfq_p_14_poly_scal_mul(k,u0,u,c);
1746      mpfq_p_14_poly_scal_mul(k,v0,v,c);
1747      mpfq_p_14_poly_clear(k,a);
1748      mpfq_p_14_poly_clear(k,b);
1749      mpfq_p_14_poly_clear(k,u);
1750      mpfq_p_14_poly_clear(k,v);
1751      mpfq_p_14_poly_clear(k,w);
1752      mpfq_p_14_poly_clear(k,x);
1753      mpfq_p_14_poly_clear(k,q);
1754      mpfq_p_14_poly_clear(k,r);
1755     }
1756     mpfq_p_14_clear(k,&c);
1757 }
1758 
1759 /* *Mpfq::defaults::poly::code_for_poly_random, Mpfq::gfp */
1760 static inline
mpfq_p_14_poly_random(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,unsigned int n,gmp_randstate_t state)1761 void mpfq_p_14_poly_random(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, unsigned int n, gmp_randstate_t state)
1762 {
1763     n++;
1764     if (w->alloc < n) {
1765         mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, n);
1766         w->alloc = n;
1767     }
1768     mpfq_p_14_vec_random(k, w->c, n,state);
1769     w->size=n;
1770     int wdeg = mpfq_p_14_poly_deg(k, w);
1771     w->size=wdeg+1;
1772 }
1773 
1774 /* *Mpfq::defaults::poly::code_for_poly_random2, Mpfq::gfp */
1775 static inline
mpfq_p_14_poly_random2(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,unsigned int n,gmp_randstate_t state)1776 void mpfq_p_14_poly_random2(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, unsigned int n, gmp_randstate_t state)
1777 {
1778     n++;
1779     if (w->alloc < n) {
1780         mpfq_p_14_vec_reinit(k, &(w->c), w->alloc, n);
1781         w->alloc = n;
1782     }
1783     mpfq_p_14_vec_random2(k, w->c, n,state);
1784     w->size=n;
1785     int wdeg = mpfq_p_14_poly_deg(k, w);
1786     w->size=wdeg+1;
1787 }
1788 
1789 /* *Mpfq::defaults::poly::code_for_poly_cmp, Mpfq::gfp */
1790 static inline
mpfq_p_14_poly_cmp(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_src_poly u,mpfq_p_14_src_poly v)1791 int mpfq_p_14_poly_cmp(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_src_poly u, mpfq_p_14_src_poly v)
1792 {
1793     if (u->size != v->size)
1794         return (int)(u->size) - (int)(v->size);
1795     else
1796         return mpfq_p_14_vec_cmp(k, u->c, v->c, u->size);
1797 }
1798 
1799 /* *Mpfq::defaults::poly::code_for_poly_asprint, Mpfq::gfp */
1800 static inline
mpfq_p_14_poly_asprint(mpfq_p_14_dst_field k MAYBE_UNUSED,char ** pstr,mpfq_p_14_src_poly w)1801 int mpfq_p_14_poly_asprint(mpfq_p_14_dst_field k MAYBE_UNUSED, char * * pstr, mpfq_p_14_src_poly w)
1802 {
1803     return mpfq_p_14_vec_asprint(k, pstr, w->c, w->size);
1804 }
1805 
1806 /* *Mpfq::defaults::poly::code_for_poly_fprint, Mpfq::gfp */
1807 static inline
mpfq_p_14_poly_fprint(mpfq_p_14_dst_field k MAYBE_UNUSED,FILE * file,mpfq_p_14_src_poly w)1808 int mpfq_p_14_poly_fprint(mpfq_p_14_dst_field k MAYBE_UNUSED, FILE * file, mpfq_p_14_src_poly w)
1809 {
1810     return mpfq_p_14_vec_fprint(k, file, w->c, w->size);
1811 }
1812 
1813 /* *Mpfq::defaults::poly::code_for_poly_print, Mpfq::gfp */
1814 static inline
mpfq_p_14_poly_print(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_src_poly w)1815 int mpfq_p_14_poly_print(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_src_poly w)
1816 {
1817     return mpfq_p_14_vec_print(k, w->c, w->size);
1818 }
1819 
1820 /* *Mpfq::defaults::poly::code_for_poly_sscan, Mpfq::gfp */
1821 static inline
mpfq_p_14_poly_sscan(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w,const char * str)1822 int mpfq_p_14_poly_sscan(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w, const char * str)
1823 {
1824     int ret;
1825     ret = mpfq_p_14_vec_sscan(k, &(w->c), &(w->alloc), str);
1826     w->size = w->alloc;
1827     return ret;
1828 }
1829 
1830 /* *Mpfq::defaults::poly::code_for_poly_fscan, Mpfq::gfp */
1831 static inline
mpfq_p_14_poly_fscan(mpfq_p_14_dst_field k MAYBE_UNUSED,FILE * file,mpfq_p_14_dst_poly w)1832 int mpfq_p_14_poly_fscan(mpfq_p_14_dst_field k MAYBE_UNUSED, FILE * file, mpfq_p_14_dst_poly w)
1833 {
1834     int ret;
1835     ret = mpfq_p_14_vec_fscan(k, file, &(w->c), &(w->alloc));
1836     w->size = w->alloc;
1837     return ret;
1838 }
1839 
1840 /* *Mpfq::defaults::poly::code_for_poly_scan, Mpfq::gfp */
1841 static inline
mpfq_p_14_poly_scan(mpfq_p_14_dst_field k MAYBE_UNUSED,mpfq_p_14_dst_poly w)1842 int mpfq_p_14_poly_scan(mpfq_p_14_dst_field k MAYBE_UNUSED, mpfq_p_14_dst_poly w)
1843 {
1844     int ret;
1845     ret = mpfq_p_14_vec_scan(k, &(w->c), &(w->alloc));
1846     w->size = w->alloc;
1847     return ret;
1848 }
1849 
1850 /* *simd_gfp::code_for_simd_hamming_weight */
1851 static inline
mpfq_p_14_simd_hamming_weight(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_src_elt p)1852 int mpfq_p_14_simd_hamming_weight(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_src_elt p)
1853 {
1854     return !mpfq_p_14_is_zero(K,p);
1855 }
1856 
1857 /* *simd_gfp::code_for_simd_find_first_set */
1858 static inline
mpfq_p_14_simd_find_first_set(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_src_elt p)1859 int mpfq_p_14_simd_find_first_set(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_src_elt p)
1860 {
1861     return mpfq_p_14_simd_hamming_weight(K,p) - 1;
1862 }
1863 
1864 /* *simd_gfp::code_for_simd_get_ui_at */
1865 static inline
mpfq_p_14_simd_get_ui_at(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_src_elt p,int k MAYBE_UNUSED)1866 unsigned long mpfq_p_14_simd_get_ui_at(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_src_elt p, int k MAYBE_UNUSED)
1867 {
1868     return mpfq_p_14_get_ui(K,p);
1869 }
1870 
1871 /* *simd_gfp::code_for_simd_set_ui_at */
1872 static inline
mpfq_p_14_simd_set_ui_at(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_elt p,int k MAYBE_UNUSED,unsigned long v)1873 void mpfq_p_14_simd_set_ui_at(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_elt p, int k MAYBE_UNUSED, unsigned long v)
1874 {
1875     mpfq_p_14_set_ui(K,p,v);
1876 }
1877 
1878 /* *simd_gfp::code_for_simd_add_ui_at */
1879 static inline
mpfq_p_14_simd_add_ui_at(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_elt p,mpfq_p_14_src_elt p0,int k MAYBE_UNUSED,unsigned long v)1880 void mpfq_p_14_simd_add_ui_at(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_elt p, mpfq_p_14_src_elt p0, int k MAYBE_UNUSED, unsigned long v)
1881 {
1882     mpfq_p_14_add_ui(K,p,p0,v);
1883 }
1884 
1885 /* *simd_gfp::code_for_simd_set_ui_all */
1886 static inline
mpfq_p_14_simd_set_ui_all(mpfq_p_14_dst_field K MAYBE_UNUSED,mpfq_p_14_dst_elt p,unsigned long v)1887 void mpfq_p_14_simd_set_ui_all(mpfq_p_14_dst_field K MAYBE_UNUSED, mpfq_p_14_dst_elt p, unsigned long v)
1888 {
1889     mpfq_p_14_set_ui(K,p,v);
1890 }
1891 
1892 /* Mpfq::engine::oo::oo_field_clear */
1893 /* Triggered by: oo */
1894 static inline
mpfq_p_14_oo_field_clear(mpfq_vbase_ptr f)1895 void mpfq_p_14_oo_field_clear(mpfq_vbase_ptr f)
1896 {
1897     mpfq_p_14_field_clear((mpfq_p_14_dst_field)(f->obj));
1898     free(f->obj);
1899     f->obj = NULL;
1900 }
1901 
1902 
1903 #endif  /* MPFQ_P_14_H_ */
1904 
1905 /* vim:set ft=cpp: */
1906