1 /* $Id: paricom.h 11924 2009-09-16 09:25:40Z bill $
2 
3 Copyright (C) 2004  The PARI group.
4 
5 This file is part of the PARI/GP package.
6 
7 PARI/GP is free software; you can redistribute it and/or modify it under the
8 terms of the GNU General Public License as published by the Free Software
9 Foundation. It is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY WHATSOEVER.
11 
12 Check the License for details. You should have received a copy of it, along
13 with the package; see the file 'COPYING'. If not, write to the Free Software
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
15 
16 /******************************************************************/
17 /*                                                                */
18 /*              PARI header file (common to all versions)         */
19 /*                                                                */
20 /******************************************************************/
21 #ifdef STMT_START /* perl headers */
22 #  undef STMT_START
23 #endif
24 #ifdef STMT_END
25 #  undef STMT_END
26 #endif
27 /* STMT_START { statements; } STMT_END;
28  * can be used as a single statement, as in
29  * if (x) STMT_START { ... } STMT_END; else ...
30  * [ avoid "dangling else" problem in macros ] */
31 #define STMT_START	do
32 #define STMT_END	while (0)
33 /*=====================================================================*/
34 /* CATCH(numer) {
35  *   recovery
36  * } TRY {
37  *   code
38  * } ENDCATCH
39  * will execute 'code', then 'recovery' if exception 'numer' is thrown
40  * [ any exception if numer == CATCH_ALL ].
41  * RETRY = as TRY, but execute 'recovery', then 'code' again [still catching] */
42 #define CATCH(err) {         \
43   VOLATILE long __err = err; \
44   int pari_errno;            \
45   jmp_buf __env;             \
46   void *__catcherr = NULL;   \
47   if ((pari_errno = setjmp(__env)))
48 
49 #define RETRY { __catcherr = err_catch(__err, &__env); {
50 #define TRY else RETRY
51 
52 /* Take address of __catcher to prevent compiler from putting it into a register
53  * (could be clobbered by longjmp otherwise) */
54 #define CATCH_RELEASE() err_leave(&__catcherr)
55 #define ENDCATCH }} CATCH_RELEASE(); }
56 
57 #define CATCH_ALL -1
58 /*=====================================================================*/
59 /* VOLATILE int errorN;
60  * CATCH_ERR(errorN) {
61  *   code
62  * } ENDCATCH_ERR
63  * executes 'code', setting errorN to the number of exception thrown;
64  * errorN is 0 if no error was thrown. */
65 
66 #define CATCH_ERR(__err) {  \
67   jmp_buf __env;            \
68   __err = setjmp(__env);    \
69   if (!__err) {		    \
70     void *__catcherr = err_catch(CATCH_ALL, &__env);
71 
72 #define ENDCATCH_ERR	    \
73     CATCH_RELEASE();	    \
74   }}
75 /*=====================================================================*/
76 
77 #define LOG2   (0.6931471805599453) /* log(2) */
78 #define L2SL10 (0.3010299956639812) /* log_10(2) */
79 
80 #ifndef  PI
81 #  define PI (3.141592653589)
82 #endif
83 
84 /*3.32~log_2(10)*/
85 #define ndec2nlong(x) (1 + (long)((x)*(3.321928094887362/BITS_IN_LONG)))
86 #define ndec2prec(x) (3 + (long)((x)*(3.321928094887362/BITS_IN_LONG)))
87 #define nbits2prec(x) (((x)+3*BITS_IN_LONG-1) >> TWOPOTBITS_IN_LONG)
88 #define nbits2nlong(x) (((x)+BITS_IN_LONG-1) >> TWOPOTBITS_IN_LONG)
89 #define nchar2nlong(x) (((x)+BYTES_IN_LONG-1) >> TWOPOTBYTES_IN_LONG)
90 #define bit_accuracy(x) (((x)-2) << TWOPOTBITS_IN_LONG)
91 #define bit_accuracy_mul(x,y) (((x)-2) * (BITS_IN_LONG*(y)))
92 #define prec2ndec(x) ((long)bit_accuracy_mul((x), L2SL10))
93 #define GSTR(x) ((char*) (((GEN) (x)) + 1 ))
94 
95 #include "pariold.h"
96 
97 /* Common global variables: */
98 extern ulong DEBUGFILES, DEBUGLEVEL, DEBUGMEM, precdl;
99 extern long  *ordvar;
100 extern GEN   bernzone,gpi,geuler;
101 extern GEN   polvar,*pol_1,*pol_x,primetab;
102 extern GEN   gen_m1,gen_1,gen_2,ghalf,gi,gen_0,gnil;
103 
104 extern const long lontyp[];
105 extern void* global_err_data;
106 
107 extern int new_galois_format;
108 extern int factor_add_primes;
109 
110 enum manage_var_t {
111   manage_var_create,
112   manage_var_delete,
113   manage_var_init,
114   manage_var_next,
115   manage_var_max_avail,
116   manage_var_pop
117 };
118 
119 #ifdef LONG_IS_64BIT
120 #  define VERYBIGINT (9223372036854775807L) /* 2^63-1 */
121 #  define BIGINT (2147483647)               /* 2^31-1 */
122 #  define u_OK_ULONG(p) ((ulong)p <= 3037000493UL)
123 #else
124 #  define VERYBIGINT (2147483647L) /* 2^31-1 */
125 #  define BIGINT (32767)           /* 2^15-1 */
126 #  define u_OK_ULONG(p) ((ulong)p <= 46337UL)
127 #endif
128 
129 /* 2p^2 < 2^BITS_IN_LONG */
130 #define OK_ULONG(p) (lgefint(p) == 3 && u_OK_ULONG(p[2]))
131 
132 #ifndef HAS_EXP2
133 #  undef exp2
134 #  define exp2(x) (exp((double)(x)*LOG2))
135 #endif
136 #ifndef HAS_LOG2
137 #  undef log2
138 #  define log2(x) (log((double)(x))/LOG2)
139 #endif
140 
141 #ifdef min
142 #  undef min
143 #endif
144 #ifdef max
145 #  undef max
146 #endif
147 #define min(a,b) ((a)>(b)?(b):(a))
148 #define max(a,b) ((a)>(b)?(a):(b))
149 
150 #define gval(x,v) (ggval((x),pol_x[v]))
151 
152 #define absr  mpabs
153 #define absi  mpabs
154 #define negi  mpneg
155 #define negr  mpneg
156 #define rcopy mpcopy
157 
158 #define addis(x,s)  (addsi((s),(x)))
159 #define addrs(x,s)  (addsr((s),(x)))
160 #define addri(x,s)  (addir((s),(x)))
161 #define mulis(x,s)  (mulsi((s),(x)))
162 #define muliu(x,s)  (mului((s),(x)))
163 #define mulru(x,s)  (mulur((s),(x)))
164 #define mulri(x,s)  (mulir((s),(x)))
165 #define mulrs(x,s)  (mulsr((s),(x)))
166 
167 #define equaliu(x,y)    (equalui((y),(x)))
168 #define equalis(x,y)    (equalsi((y),(x)))
169 #define cmpiu(x,y)     (-cmpui((y),(x)))
170 #define cmpis(x,y)     (-cmpsi((y),(x)))
171 #define cmprs(x,y)     (-cmpsr((y),(x)))
172 #define cmpri(x,y)     (-cmpir((y),(x)))
173 #define subis(x,y)     (addsi(-(y),(x)))
174 #define subrs(x,y)     (addsr(-(y),(x)))
175 
176 #define truedivii(a,b) (truedvmdii((a),(b),NULL))
177 #define truedivis(a,b) (truedvmdis((a),(b),NULL))
178 #define divii(a,b)     (dvmdii((a),(b),NULL))
179 #define remii(a,b)     (dvmdii((a),(b),ONLY_REM))
180 #define mpshift(x,s)   ((typ(x)==t_INT)?shifti((x),(s)):shiftr((x),(s)))
181 
182 /*******************************************************************/
183 /*                                                                 */
184 /*                    OPERATIONS BY VALUE                          */
185 /*            f is a pointer to the function called.               */
186 /*            result is gaffect-ed to last parameter               */
187 /*                                                                 */
188 /*******************************************************************/
189 #define TRgopgz(f, x, y, fstr)  STMT_START {\
190   GEN __x = (x), __y = (y);\
191   long prec = precision(__y);\
192   pari_sp __av = avma;\
193   if (!prec) pari_err(infprecer, fstr);\
194   gaffect(f(__x), __y); avma=__av; } STMT_END
195 #define gopgz(f, x, y)  STMT_START {\
196   GEN __x = (x), __y = (y);\
197   pari_sp __av = avma;\
198   gaffect(f(__x), __y); avma=__av; } STMT_END
199 #define gopggz(f, x, y, z)  STMT_START {\
200   GEN __x = (x), __y = (y), __z = (z);\
201   pari_sp __av = avma;\
202   gaffect(f(__x,__y), __z); avma=__av; } STMT_END
203 #define gopgsz(f, x, s, z)  STMT_START {\
204   GEN __x = (x), __z = (z);\
205   long __s = (s);\
206   pari_sp __av = avma;\
207   gaffect(f(__x,__s), __z); avma=__av; } STMT_END
208 #define gopsgz(f, s, y, z)  STMT_START {\
209   GEN __y = (y), __z = (z);\
210   long __s = (s);\
211   pari_sp __av = avma;\
212   gaffect(f(__s,__y), __z); avma=__av; } STMT_END
213 #define gopssz(f, x, y, z)  STMT_START {\
214   GEN __z = (z);\
215   long __x = (x), __y = (y);\
216   pari_sp __av = avma;\
217   gaffect(f(__x,__y), __z); avma=__av; } STMT_END
218 
219 #define mptruncz(x,y)  gopgz(mptrunc,(x),(y))
220 #define mpfloorz(x,y)  gopgz(mpfloor,(x),(y))
221 #define mpaddz(x,y,z)  gopggz(mpadd,(x),(y),(z))
222 #define addsiz(s,y,z)  gopsgz(addsi,(s),(y),(z))
223 #define addsrz(s,y,z)  gopsgz(addsr,(s),(y),(z))
224 #define addiiz(x,y,z)  gopggz(addii,(x),(y),(z))
225 #define addirz(x,y,z)  gopggz(addir,(x),(y),(z))
226 #define addriz(x,y,z)  gopggz(addir,(y),(x),(z))
227 #define addrrz(x,y,z)  gopggz(addrr,(x),(y),(z))
228 #define mpsubz(x,y,z)  gopggz(mpsub,(x),(y),(z))
229 #define subss(x,y)     (addss(-(y),(x)))
230 #define subssz(x,y,z)  (addssz((x),-(y),(z)))
231 #define subsiz(s,y,z)  gopsgz(subsi,(s),(y),(z))
232 #define subsrz(s,y,z)  gopsgz(subsr,(s),(y),(z))
233 #define subisz(y,s,z)  gopsgz(addsi,-(s),(y),(z))
234 #define subrsz(y,s,z)  gopsgz(addsr,-(s),(y),(z))
235 #define subiiz(x,y,z)  gopggz(subii,(x),(y),(z))
236 #define subirz(x,y,z)  gopggz(subir,(x),(y),(z))
237 #define subriz(x,y,z)  gopggz(subri,(x),(y),(z))
238 #define subrrz(x,y,z)  gopggz(subrr,(x),(y),(z))
239 #define mpmulz(x,y,z)  gopggz(mpmul,(x),(y),(z))
240 #define mulsiz(s,y,z)  gopsgz(mulsi,(s),(y),(z))
241 #define mulsrz(s,y,z)  gopsgz(mulsr,(s),(y),)(z)
242 #define muliiz(x,y,z)  gopggz(mulii,(x),(y),(z))
243 #define mulirz(x,y,z)  gopggz(mulir,(x),(y),(z))
244 #define mulriz(x,y,z)  gopggz(mulir,(y),(x),(z))
245 #define mulrrz(x,y,z)  gopggz(mulrr,(x),(y),(z))
246 #define mpdvmdz(x,y,z,t) (dvmdiiz((x),(y),(z),(t))
247 #define addssz(s,y,z)  gopssz(addss,(s),(y),(z))
248 #define modssz(s,y,z)  gopssz(modss,(s),(y),(z))
249 #define mulssz(s,y,z)  gopssz(mulss,(s),(y),(z))
250 #define modsiz(s,y,z)  gopsgz(modsi,(s),(y),(z))
251 #define modisz(y,s,z)  gopgsz(modis,(y),(s),(z))
252 #define remsiz(s,y,z)  gopsgz(remsi,(s),(y),(z))
253 #define remisz(y,s,z)  gopgsz(remis,(y),(s),(z))
254 #define remssz(s,y,z)  gopssz(remss,(s),(y),(z))
255 #define diviiz(x,y,z)  gopggz(divii,(x),(y),(z))
256 #define divirz(x,y,z)  gopggz(divir,(x),(y),(z))
257 #define divisz(x,y,z)  gopgsz(divis,(x),(y),(z))
258 #define divriz(x,y,z)  gopggz(divri,(x),(y),(z))
259 #define divsrz(s,y,z)  gopsgz(divsr,(s),(y),(z))
260 #define divrsz(y,s,z)  gopgsz(divrs,(y),(s),(z))
261 
262 #define mpexpz(x,y)    gopgz(mpexp,(x),(y))
263 #define mplogz(x,y)    gopgz(mplog,(x),(y))
264 #define mpcosz(x,y)    gopgz(mpcos,(x),(y))
265 #define mpsinz(x,y)    gopgz(mpsin,(x),(y))
266 #define gnegz(x,y)     gopgz(gneg,(x),(y))
267 
268 #define gachz(x,y)     TRgopgz(gach,(x),(y), "gachz")
269 #define gacosz(x,y)    TRgopgz(gacos,(x),(y), "gacosz")
270 #define gashz(x,y)     TRgopgz(gash,(x),(y), "gashz")
271 #define gasinz(x,y)    TRgopgz(gasin,(x),(y), "gasinz")
272 #define gatanz(x,y)    TRgopgz(gatan,(x),(y), "gatanz")
273 #define gathz(x,y)     TRgopgz(gath,(x),(y), "gathz")
274 #define gchz(x,y)      TRgopgz(gch,(x),(y), "gchz")
275 #define gcosz(x,y)     TRgopgz(gcos,(x),(y), "gcosz")
276 #define gcotanz(x,y)   TRgopgz(gcotan,(x),(y), "gcotanz")
277 #define gexpz(x,y)     TRgopgz(gexp,(x),(y), "gexpz")
278 #define ggamdz(x,y)    TRgopgz(ggamd,(x),(y), "ggamdz")
279 #define ggammaz(x,y)   TRgopgz(ggamma,(x),(y), "ggammaz")
280 #define glngammaz(x,y) TRgopgz(glngamma,(x),(y), "glngammaz")
281 #define glogz(x,y)     TRgopgz(glog,(x),(y), "glogz")
282 #define gpsiz(x,y)     TRgopgz(gpsi,(x),(y), "gpsiz")
283 #define gshz(x,y)      TRgopgz(gsh,(x),(y), "gshz")
284 #define gsinz(x,y)     TRgopgz(gsin,(x),(y), "gsinz")
285 #define gsqrtz(x,y)    TRgopgz(gsqrt,(x),(y), "gsqrtz")
286 #define gtanz(x,y)     TRgopgz(gtan,(x),(y), "gtanz")
287 #define gthz(x,y)      TRgopgz(gth,(x),(y), "gthz")
288 #define gzetaz(x,y)    TRgopgz(gzeta,(x),(y), "gzetaz")
289 
290 #define gabsz(x,prec,y) gopgsz(gabs,(x),(prec),(y))
291 #define gmaxz(x,y,z)    gopggz(gmax,(x),(y),(z))
292 #define gminz(x,y,z)    gopggz(gmin,(x),(y),(z))
293 #define gaddz(x,y,z)    gopggz(gadd,(x),(y),(z))
294 #define gsubz(x,y,z)    gopggz(gsub,(x),(y),(z))
295 #define gmulz(x,y,z)    gopggz(gmul,(x),(y),(z))
296 #define gdivz(x,y,z)    gopggz(gdiv,(x),(y),(z))
297 #define gdiventz(x,y,z) gopggz(gdivent,(x),(y),(z))
298 #define gmodz(x,y,z)    gopggz(gmod,(x),(y),(z))
299 
300 #define gaddgs(y,s)     gaddsg((s),(y))
301 #define gcmpgs(s,y)     (-gcmpsg(y,s))
302 #define gdiventsg(s,y)  (gopsg2(gdivent,(s),(y)))
303 #define gdivsg(s,y)     (gopsg2(gdiv,(s),(y)))
304 #define gequalgs(s,y)    (gequalsg((y),(s)))
305 #define gmaxsg(s,y)     (gmaxgs((y),(s)))
306 #define gminsg(s,y)     (gmings((y),(s)))
307 #define gmodsg(s,y)     (gopsg2(gmod,(s),(y)))
308 #define gmulgs(y,s)     (gmulsg((s),(y)))
309 #define gsubgs(y,s)     gaddgs((y), -(s))
310 #define gsubsg(s,y)     (gopsg2(gsub,(s),(y)))
311 
312 #define gaddgsz(y,s,z)    gopgsz(gaddgs,(y),(s),(z))
313 #define gaddsgz(s,y,z)    gaddgsz((y),(s),(z))
314 #define gdiventgsz(y,s,z) gopgsz(gdiventgs,(y),(s),(z))
315 #define gdiventsgz(s,y,z) gopsg2z(gdivent,(s),y),(z)
316 #define gdivgsz(y,s,z)    gopgsz(gdivgs,(y),(s),(z))
317 #define gdivsgz(s,y,z)    gopsg2z(gdiv,(s),(y),(z))
318 #define gmaxgsz(y,s,z)    gopgsz(gmaxgs,(y),(s),(z))
319 #define gmaxsgz(s,y,z)    gmaxgsz((y),(s),(z))
320 #define gmingsz(y,s,z)    gopgsz(gmings,(y),(s),(z))
321 #define gminsgz(s,y,z)    gmingsz((y),(s),(z))
322 #define gmodgsz(y,s,z)    gopgsz(gmodgs,(y),(s),(z))
323 #define gmodsgz(s,y,z)    gopsg2z(gmod,(s),(y),(z))
324 #define gmulgsz(y,s,z)    gopsgz(gmulsg,(s),(y),(z))
325 #define gmulsgz(s,y,z)    gmulgsz((y),(s),(z))
326 #define gsubgsz(y,s,z)    gopgsz(gaddgs,(y),-(s),(z))
327 #define gsubsgz(s,y,z)    gopsg2z(gsub,(s),(y),(z))
328 
329 #define gmul2nz(x,s,z)  gopgsz(gmul2n,(x),(s),(z))
330 #define gshiftz(x,s,z)  gopgsz(gshift,(x),(s),(z))
331 
332 #define bern(i)       (bernzone + 3 + (i)*bernzone[2])
333 
334 /* works only for POSITIVE integers */
335 #define modBIL(x)  (*int_LSW(x))
336 #define mod64(x)  (modBIL(x) & 63)
337 #define mod32(x)  (modBIL(x) & 31)
338 #define mod16(x)  (modBIL(x) & 15)
339 #define mod8(x)   (modBIL(x) & 7)
340 #define mod4(x)   (modBIL(x) & 3)
341 #define mod2(x)   (modBIL(x) & 1)
342 #define is_bigint_lg(n,l) ((l)>3 || ((l)==3 && (((GEN)(n))[2] & HIGHBIT)))
343 #define is_pm1_lg(n,l)    ((l)==3 && ((GEN)(n))[2]==1)
344 #define is_pm1(n)    is_pm1_lg   (n, lgefint(n))
345 #define is_bigint(n) is_bigint_lg(n, lgefint(n))
346 
347 #define degpol(a) ((long)lg(a)-3)
348 #define lgpol(a) ((long)lg(a)-2)
349 
350 #define odd(x) ((x) & 1)
351 #define mpodd(x) (signe(x) && mod2(x))
352 
353 #define ONLY_REM ((GEN*)0x1L)
354 #define ONLY_DIVIDES ((GEN*)0x2L)
355 #define RgX_div(x,y)     (RgX_divrem((x),(y),NULL))
356 #define RgX_rem(x,y)     (RgX_divrem((x),(y),ONLY_REM))
357 #define RgXQX_div(x,y,T) (RgXQX_divrem((x),(y),(T),NULL))
358 #define RgXQX_rem(x,y,T) (RgXQX_divrem((x),(y),(T),ONLY_REM))
359 #define gdeuc(x,y)       (poldivrem((x),(y),NULL))
360 #define grem(x,y)        (poldivrem((x),(y),ONLY_REM))
361 #define FpX_div(x,y,p)   (FpX_divrem((x),(y),(p), NULL))
362 #define FpX_rem(x,y,p)   (FpX_divrem((x),(y),(p), ONLY_REM))
363 #define Flx_div(x,y,p)   (Flx_divrem((x),(y),(p), NULL))
364 
365 #define FpX_renormalize   ZX_renormalize
366 #define FpXX_renormalize  ZX_renormalize
367 #define FpXQX_renormalize ZX_renormalize
368 
369 #define ZY_ZXY_resultant(a,b) ZY_ZXY_rnfequation((a),(b),NULL)
370 
371 #define RgX_add gadd
372 #define RgX_sub gsub
373 #define RgX_neg gneg
374 
375 #define ZX_mul RgX_mul
376 #define ZX_sqr RgX_sqr
377 
378 #define zv_to_ZV(x)    (vecsmall_to_vec((x)))
379 #define zc_to_ZC(x)    (vecsmall_to_col((x)))
380 #define ZV_to_zv(x)    (vec_to_vecsmall((x)))
381 #define zx_to_zv(x,y)  (Flx_to_Flv((x),(y)))
382 #define zv_to_zx(x,y)  (Flv_to_Flx((x),(y)))
383 #define zm_to_zxV(x,y) (Flm_to_FlxV((x),(y)))
384 #define zero_zx(x)     (zero_Flx((x)))
385 #define polx_zx(x)     (polx_Flx((x)))
386 #define zx_shift(x,y)  (Flx_shift((x),(y)))
387 
388 #define matpascal(n) matqpascal((n),NULL)
389 #define sturm(x) (sturmpart((x),NULL,NULL))
390 #define Z_issquare(x) (Z_issquarerem((x),NULL))
391 #define subres(x,y) (subresall((x),(y),NULL))
392 /* #define subres(x,y) (resultantducos((x),(y))) */
393 
394 #define invmat(a) (gauss((a),NULL))
395 
396 /* output of get_nf and get_bnf */
397 #define typ_NULL 0
398 #define typ_POL  1
399 #define typ_Q    2
400 #define typ_NF   3
401 #define typ_BNF  4
402 #define typ_BNR  5
403 #define typ_CLA  6 /* bnfclassunit   */
404 #define typ_ELL  7 /* elliptic curve */
405 #define typ_QUA  8 /* quadclassunit  */
406 #define typ_GAL  9 /* galoisinit     */
407 #define typ_BID 10
408 /* for gen_sort */
409 #define cmp_IND 1
410 #define cmp_LEX 2
411 #define cmp_REV 4
412 #define cmp_C   8
413 
414 #define DIFFPTR_SKIP	255		/* Skip these entries */
415 #define NEXT_PRIME_VIADIFF(p,d)	 STMT_START \
416   { while (*(d) == DIFFPTR_SKIP) (p) += *(d)++; (p) += *(d)++; } STMT_END
417 #define NEXT_PRIME_VIADIFF_CHECK(p,d)  STMT_START \
418   { if (!*(d)) pari_err(primer1); NEXT_PRIME_VIADIFF(p,d); } STMT_END
419 
420 /* For use with pari_init_opts */
421 
422 #define INIT_JMPm 1
423 #define INIT_SIGm 2
424 #define INIT_DFTm 4
425