=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/parif.c,v retrieving revision 1.12 retrieving revision 1.17 diff -u -p -r1.12 -r1.17 --- OpenXM_contrib2/asir2000/builtin/parif.c 2002/09/04 04:57:46 1.12 +++ OpenXM_contrib2/asir2000/builtin/parif.c 2011/08/10 04:51:57 1.17 @@ -45,15 +45,20 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/builtin/parif.c,v 1.11 2002/07/12 08:05:23 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/parif.c,v 1.16 2009/03/27 14:42:29 ohara Exp $ */ #include "ca.h" #include "parse.h" -#if PARI +#if defined(PARI) #include "genpari.h" +// PARI_VERSION(2,2,8) == 131592 +#if PARI_VERSION_CODE >= 131592 +#define mppgcd(a,b) (gcdii((a),(b))) +#endif -extern long prec; +long get_pariprec(); +void set_pariprec(long p); void patori(GEN,Obj *); void patori_i(GEN,N *); @@ -78,7 +83,7 @@ struct ftab pari_tab[] = { {0,0,0}, }; -#define MKPREC(a,i,b) (argc(a)==(i)?mkprec(QTOS((Q)(b))):prec) +#define MKPREC(a,i,b) (argc(a)==(i)?mkprec(QTOS((Q)(b))):get_pariprec()) #define CALLPARI1(f,a,p,r)\ ritopa((Obj)a,&_pt1_); _pt2_ = f(_pt1_,p); patori(_pt2_,r); asir_cgiv(_pt2_); asir_cgiv(_pt1_) @@ -95,15 +100,12 @@ void f(ar,rp) NODE ar; Obj *rp;\ { GEN _pt1_,_pt2_,_pt3_; CALLPARI2(pf,ARG0(ar),ARG1(ar),MKPREC(ar,3,ARG2(ar)),rp); } #if defined(INTERVAL) -#define PREC_CONV pariK1 -#else -#if defined(LONG_IS_32BIT) +#define PREC_CONV (0.103810253/(BYTES_IN_LONG/4)) /* log(10)/(SL*log(2)) */ +#elif SIZEOF_LONG == 4 #define PREC_CONV 0.103810253 -#endif -#if defined(LONG_IS_64BIT) +#elif SIZEOF_LONG == 8 #define PREC_CONV 0.051905126 #endif -#endif /* XXX : we should be more careful when we free PARI pointers. */ @@ -171,6 +173,7 @@ Obj *rp; { int p; Q q; + long prec = get_pariprec(); #if defined(INTERVAL) || 1 p = (int)((prec-2)/PREC_CONV); STOQ(p,q); *rp = (Obj)q; @@ -187,6 +190,7 @@ Obj *rp; prec = mkprec(QTOS((Q)ARG0(arg))); } #endif + set_pariprec(prec); } #if defined(INTERVAL) || 1 @@ -196,6 +200,7 @@ Obj *rp; { int p; Q q; + long prec = get_pariprec(); p = (int)((prec-2)); STOQ(p,q); *rp = (Obj)q; if ( arg ) { @@ -205,6 +210,7 @@ Obj *rp; prec = p + 2; } } + set_pariprec(prec); } #endif @@ -386,7 +392,7 @@ struct pariftab pariftab[] = { {"indsort",indexsort,1}, {"initalg",initalg,1}, {"isfund",gisfundamental,1}, -{"isprime",gisprime,1}, +{"isprime",gisprime,2}, {"ispsp",gispsp,1}, {"isqrt",racine,1}, {"issqfree",gissquarefree,1},