Annotation of OpenXM_contrib2/windows/pari2/win32/paricom.h, Revision 1.2
1.1 noro 1: /* $Id: paricom.h,v 1.28 2002/09/10 18:40:48 karim Exp $
2:
3: Copyright (C) 2000 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 < 0 ].
41: * RETRY = as TRY, but execute 'recovery', then 'code' again [still catching] */
42: #define CATCH(err) { \
43: VOLATILE long __err = err; \
44: jmp_buf __env; \
45: void *__catcherr; \
46: if (setjmp(__env))
47:
48: #define RETRY { __catcherr = err_catch(__err, __env, NULL); {
49: #define TRY else { __catcherr = err_catch(__err, __env, NULL); {
50:
51: #define ENDCATCH }} err_leave(&__catcherr); }
52: /*=====================================================================*/
53:
54: #define bit_accuracy(x) (((x)-2) << TWOPOTBITS_IN_LONG)
55:
56: #define GSTR(x) ((char*) (((GEN) (x)) + 1 ))
57:
58: /* For compatibility with 1.x.x */
59: #define err pari_err /* move to e.g paritr.h ? */
60: #define init pari_init
61: #define gen2str GENtostr
62: #define gpui gpow
63: #define gpuigs gpowgs
64: #define classno3 hclassno
65: #define strtoGEN flisexpr
66: #define permute numtoperm
67: #define permuteInv permtonum
68:
69: #define rcopy mpcopy
70: #define absr mpabs
71: #define absi mpabs
72: #define negi mpneg
73: #define negr mpneg
74: #define mpnegz(x,y) \
75: STMT_START {gpmem_t av=avma;mpaff(mpneg(x),y);avma=av;} STMT_END
76: #define mpabsz(x,y) \
77: STMT_START {gpmem_t av=avma;mpaff(mpabs(x),y);avma=av;} STMT_END
78: #define absrz(x,z) mpabsz((x),(z))
79: #define negrz(x,z) mpnegz((x),(z))
80:
81: /* Common global variables: */
82:
83: extern PariOUT *pariOut, *pariErr;
84: extern FILE *pari_outfile, *logfile, *infile, *errfile;
85:
86: extern ulong DEBUGFILES, DEBUGLEVEL, DEBUGMEM, precdl;
87: extern long *ordvar;
88: extern GEN bernzone,gpi,geuler;
89: extern GEN polvar,*polun,*polx,primetab;
90: extern GEN gun,gdeux,ghalf,gi,gzero;
91:
92: extern const long lontyp[];
93: extern void* global_err_data;
94:
95: extern int new_galois_format;
96:
97: #define MAXITERPOL 10 /* max #of prec increase in polredabs-type operations */
98:
99: /* let SL = sizeof(long) */
100: #define pariK (9.632959862*(BYTES_IN_LONG/4)) /* SL*log(2)/log(10) */
101: #define pariK1 (0.103810253/(BYTES_IN_LONG/4)) /* log(10)/(SL*log(2)) */
102: #define pariK2 (1.1239968) /* 1/(1-(log(2)/(2*pi))) */
103: #define pariK4 (17.079468445347/BITS_IN_LONG) /* 2*e*pi/SL */
104: #define LOG2 (0.69314718055994531) /* log(2) */
105: #define L2SL10 (0.301029995663981) /* log(2)/log(10) */
106: #define pariC1 (0.9189385332) /* log(2*pi)/2 */
107: #define pariC2 (22.18070978*(BYTES_IN_LONG/4)) /* SL*log(2) */
108: #define pariC3 (0.0216950598/(BYTES_IN_LONG/4)) /* log((1+sqrt(5))/2)/C2 */
109:
110: #ifndef PI
111: # define PI (3.141592653589)
112: #endif
113:
1.2 ! ohara 114: #if defined(LONG_IS_64BIT)
1.1 noro 115: # define VERYBIGINT (9223372036854775807L) /* 2^63-1 */
116: # define EXP220 (1099511627776L) /* 2^40 */
117: # define BIGINT (2147483647) /* 2^31-1 */
118: #else
119: # define VERYBIGINT (2147483647L) /* 2^31-1 */
120: # define EXP220 (1048576L) /* 2^20 */
121: # define BIGINT (32767) /* 2^15-1 */
122: #endif
123:
124: #ifdef NOEXP2
125: # ifdef __cplusplus
126: inline double exp2(double x) {return exp(x*LOG2);}
127: inline double log2(double x) {return log(x)/LOG2;}
128: # else
129: # define exp2(x) (exp((double)(x)*LOG2))
130: # ifndef __CYGWIN32__
131: # define log2(x) (log((double)(x))/LOG2)
132: # endif
133: # endif
134: #else
135: BEGINEXTERN
136: double exp2(double);
137: double log2(double);
138: ENDEXTERN
139: #endif
140:
1.2 ! ohara 141: #if !defined(LONG_IS_64BIT)
1.1 noro 142: # undef labs
143: # define labs(x) abs(x)
144: #endif
145:
146: #ifdef min
147: # undef min
148: #endif
149: #ifdef max
150: # undef max
151: #endif
152: #define min(a,b) ((a)>(b)?(b):(a))
153: #define max(a,b) ((a)>(b)?(a):(b))
154:
155: #define gval(x,v) (ggval((x),polx[v]))
156:
157: #define ggrando(x,n) (grando0((x),(n),1))
158: #define ggrandocp(x,n) (grando0((x),(n),0))
159:
160: #define addis(x,s) (addsi((s),(x)))
161: #define addrs(x,s) (addsr((s),(x)))
162: #define mulis(x,s) (mulsi((s),(x)))
163: #define muliu(x,s) (mului((s),(x)))
164: #define mulri(x,s) (mulir((s),(x)))
165: #define mulrs(x,s) (mulsr((s),(x)))
166: #define gmulgs(y,s) (gmulsg((s),(y)))
167: #define lmulgs(y,s) ((long)gmulsg((s),(y)))
168:
169: #define mpmodz(x,y,z) (modiiz((x),(y),(z)))
170: #define mpresz(x,y,z) (resiiz((x),(y),(z)))
171: #define mpmod(x,y) (modii((x),(y)))
172: #define mpres(x,y) (resii((x),(y)))
173:
174: #define laddgs(y,s) (lopsg2(gadd,(s),(y)))
175: #define laddsg(s,y) (lopsg2(gadd,(s),(y)))
176: #define ldiventgs(y,s) (lopgs2(gdivent,(y),(s)))
177: #define ldiventsg(s,y) (lopsg2(gdivent,(s),(y)))
178: #define ldivsg(s,y) (lopsg2(gdiv,(s),(y)))
179: #define lmaxgs(y,s) (lopgs2(gmax,(y),(s)))
180: #define lmaxsg(s,y) (lopsg2(gmax,(s),(y)))
181: #define lmings(y,s) (lopgs2(gmin,(y),(s)))
182: #define lminsg(s,y) (lopsg2(gmin,(s),(y)))
183: #define lmodgs(y,s) (lopgs2(gmod,(y),(s)))
184: #define lmodsg(s,y) (lopsg2(gmod,(s),(y)))
185: #define lsubgs(y,s) (lopgs2(gsub,(y),(s)))
186: #define lsubsg(s,y) (lopsg2(gsub,(s),(y)))
187:
188: #define mppiz(x) (gop0z(mppi,(x)))
189: #define mpeulerz(x) (gop0z(mpeuler,(x)))
190:
191: #define autz(x,y) (gop1z(mpaut,(x),(y)))
192: #define mpsqrtz(x,y) (gop1z(mpsqrt,(x),(y)))
193: #define mpexpz(x,y) (gop1z(mpexp,(x),(y)))
194: #define mpexp1z(x,y) (gop1z(mpexp1,(x),(y)))
195: #define mplogz(x,y) (gop1z(mplog,(x),(y)))
196: #define mpcosz(x,y) (gop1z(mpcos,(x),(y)))
197: #define mpsinz(x,y) (gop1z(mpsin,(x),(y)))
198: #define mptanz(x,y) (gop1z(mptan,(x),(y)))
199: #define mpatanz(x,y) (gop1z(mpatan,(x),(y)))
200: #define mpasinz(x,y) (gop1z(mpasin,(x),(y)))
201: #define mpacosz(x,y) (gop1z(mpacos,(x),(y)))
202: #define mpchz(x,y) (gop1z(mpch,(x),(y)))
203: #define mpshz(x,y) (gop1z(mpsh,(x),(y)))
204: #define mpthz(x,y) (gop1z(mpth,(x),(y)))
205: #define mpathz(x,y) (gop1z(mpath,(x),(y)))
206: #define mpashz(x,y) (gop1z(mpash,(x),(y)))
207: #define mpachz(x,y) (gop1z(mpach,(x),(y)))
208: #define mpgammaz(x,y) (gop1z(mpgamma,(x),(y)))
209: #define gredz(x,y) (gop1z(gred,(x),(y)))
210: #define gnegz(x,y) (gop1z(gneg,(x),(y)))
211:
212: #define mpargz(x,y,z) (gop2z(mparg,(x),(y),(z)))
213: #define gabsz(x,prec,y) (gop2z(gabs,(x),(prec),(y)))
214: #define gmaxz(x,y,z) (gop2z(gmax,(x),(y),(z)))
215: #define gminz(x,y,z) (gop2z(gmin,(x),(y),(z)))
216: #define gaddz(x,y,z) (gop2z(gadd,(x),(y),(z)))
217: #define gsubz(x,y,z) (gop2z(gsub,(x),(y),(z)))
218: #define gmulz(x,y,z) (gop2z(gmul,(x),(y),(z)))
219: #define gdivz(x,y,z) (gop2z(gdiv,(x),(y),(z)))
220: #define gdiventz(x,y,z) (gop2z(gdivent,(x),(y),(z)))
221: #define gmodz(x,y,z) (gop2z(gmod,(x),(y),(z)))
222:
223: #define gaddgs(y,s) (gopsg2(gadd,(s),(y)))
224: #define gaddsg(s,y) (gopsg2(gadd,(s),(y)))
225: #define gaddsmat(s,y) (gopsg2(gaddmat,(s),(y)))
226: #define gdiventsg(s,y) (gopsg2(gdivent,(s),(y)))
227: #define gdivsg(s,y) (gopsg2(gdiv,(s),(y)))
228: #define gmaxsg(s,y) (gopsg2(gmax,(s),(y)))
229: #define gminsg(s,y) (gopsg2(gmin,(s),(y)))
230: #define gmodsg(s,y) (gopsg2(gmod,(s),(y)))
231: #define gsubsg(s,y) (gopsg2(gsub,(s),(y)))
232:
233: #define gdiventgs(y,s) (gopgs2(gdivent,(y),(s)))
234: #define gmaxgs(y,s) (gopgs2(gmax,(y),(s)))
235: #define gmings(y,s) (gopgs2(gmin,(y),(s)))
236: #define gmodgs(y,s) (gopgs2(gmod,(y),(s)))
237: #define gsubgs(y,s) (gopgs2(gsub,(y),(s)))
238:
239: #define gcmpsg(s,y) (-opgs2(gcmp,(y),(s)))
240: #define gcmpgs(y,s) (opgs2(gcmp,(y),(s)))
241: #define gegalsg(s,y) (opgs2(gegal,(y),(s)))
242: #define gegalgs(y,s) (opgs2(gegal,(y),(s)))
243:
244: #define gaddgsz(y,s,z) (gopsg2z(gadd,(s),(y),(z)))
245: #define gaddsgz(s,y,z) (gopsg2z(gadd,(s),(y),(z)))
246: #define gdiventsgz(s,y,z) (gopsg2z(gdivent,(s),y),(z)))
247: #define gdivsgz(s,y,z) (gopsg2z(gdiv,(s),(y),(z)))
248: #define gmaxsgz(s,y,z) (gopsg2z(gmax,(s),(y),(z)))
249: #define gminsgz(s,y,z) (gopsg2z(gmin,(s),(y),(z)))
250: #define gmodsgz(s,y,z) (gopsg2z(gmod,(s),(y),(z)))
251: #define gsubsgz(s,y,z) (gopsg2z(gsub,(s),(y),(z)))
252:
253: #define gdiventgsz(y,s,z) (gopgs2z(gdivent,(y),(s),(z)))
254: #define gmaxgsz(y,s,z) (gopgs2z(gmax,(y),(s),(z)))
255: #define gmingsz(y,s,z) (gopgs2z(gmin,(y),(s),(z)))
256: #define gmodgsz(y,s,z) (gopgs2z(gmod,(y),(s),(z)))
257: #define gsubgsz(y,s,z) (gopgs2z(gsub,(y),(s),(z)))
258:
259: #define gdivgsz(y,s,z) (gops2gsz(gdivgs,(y),(s),(z)))
260: #define gmul2nz(x,s,z) (gops2gsz(gmul2n,(x),(s),(z)))
261: #define gmulgsz(y,s,z) (gops2sgz(gmulsg,(s),(y),(z)))
262: #define gmulsgz(s,y,z) (gops2sgz(gmulsg,(s),(y),(z)))
263: #define gshiftz(x,s,z) (gops2gsz(gshift,(x),(s),(z)))
264:
265: #define bern(i) (bernzone + 3 + (i)*bernzone[2])
266:
267: /* works only for POSITIVE integers */
268: #define modBIL(x) (((x)[lgefint(x)-1]))
269: #define mod64(x) (modBIL(x) & 63)
270: #define mod32(x) (modBIL(x) & 31)
271: #define mod16(x) (modBIL(x) & 15)
272: #define mod8(x) (modBIL(x) & 7)
273: #define mod4(x) (modBIL(x) & 3)
274: #define mod2(x) (modBIL(x) & 1)
275: #define is_pm1(n) ((lgefint(n)==3) && (((GEN)(n))[2]==1))
276: #define is_bigint(n) ((lgefint(n)>3) || \
277: ((lgefint(n)==3) && ((((GEN)(n))[2]) < 0)))
278:
279: #define leading_term(x) ((GEN)(((GEN)(x))[lgef(x)-1]))
280: #define constant_term(x) (signe(x)? ((GEN)(((GEN)(x))[2])): gzero)
281: #define degpol(a) ((long)lgef(a)-3)
282: #define evaldeg(d) (evallgef(d+3))
283:
284: #define odd(x) ((x) & 1)
285: #define mpodd(x) (signe(x) && mod2(x))
286:
287: #define ONLY_REM ((GEN*)0x1L)
288: #define ONLY_DIVIDES ((GEN*)0x2L)
289: #define gdeuc(x,y) (poldivres((x),(y),NULL))
290: #define gres(x,y) (poldivres((x),(y),ONLY_REM))
291: #define FpX_div(x,y,p) (FpX_divres((x),(y),(p), NULL))
292: #define FpX_res(x,y,p) (FpX_divres((x),(y),(p), ONLY_REM))
293: #define matpascal(n) matqpascal((n),NULL)
294: #define sturm(x) (sturmpart((x),NULL,NULL))
295: #define carreparfait(x) (carrecomplet((x),NULL))
296: #define subres(x,y) (subresall((x),(y),NULL))
297: /* #define subres(x,y) (resultantducos((x),(y))) */
298:
299: #define leadingcoeff(x) (pollead((x),-1))
300: #define lift_intern(x) (lift_intern0((x),-1))
301:
302: #define idealmullll(nf,x,y) (idealoplll(idealmul,(nf),(x),(y)))
303: #define idealdivlll(nf,x,y) (idealoplll(idealdiv,(nf),(x),(y)))
304:
305: #define invmat(a) (gauss((a),NULL))
306:
307: #define element_divmodideal(nf,x,y,ideal) (\
308: nfreducemodideal((nf),\
309: element_mul((nf),(x),element_invmodideal((nf),(y),(ideal)))\
310: ,(ideal)\
311: )\
312: )
313: #define element_mulmodideal(nf,x,y,ideal) (\
314: nfreducemodideal((nf),element_mul((nf),(x),(y)),(ideal))\
315: )
316: #define element_sqrmodideal(nf,x,ideal) (\
317: nfreducemodideal((nf),element_sqr((nf),(x)),(ideal))\
318: )
319:
320: /* output of get_nf and get_bnf */
321: #define typ_NULL 0
322: #define typ_POL 1
323: #define typ_Q 2
324: #define typ_NF 3
325: #define typ_BNF 4
326: #define typ_BNR 5
327: #define typ_CLA 6 /* bnfclassunit */
328: #define typ_ELL 7 /* elliptic curve */
329: #define typ_QUA 8 /* quadclassunit */
330: #define typ_GAL 9 /* galoisinit */
331: /* for gen_sort */
332: #define cmp_IND 1
333: #define cmp_LEX 2
334: #define cmp_REV 4
335: #define cmp_C 8
336:
337: #define DIFFPTR_SKIP 255 /* Skip these entries */
338: #define NEXT_PRIME_VIADIFF(p,d) \
339: { while (*(d) == DIFFPTR_SKIP) (p) += *(d)++; (p) += *(d)++; }
340: #define NEXT_PRIME_VIADIFF_CHECK(p,d) \
341: { if (!*(d)) err(primer1); NEXT_PRIME_VIADIFF(p,d) }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>