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