=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/pari.c,v retrieving revision 1.8 retrieving revision 1.11 diff -u -p -r1.8 -r1.11 --- OpenXM_contrib2/asir2000/engine/pari.c 2009/03/16 16:43:02 1.8 +++ OpenXM_contrib2/asir2000/engine/pari.c 2011/12/21 19:38:19 1.11 @@ -45,9 +45,10 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/engine/pari.c,v 1.7 2005/10/10 15:16:38 saito Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/engine/pari.c,v 1.10 2009/09/10 01:51:54 noro Exp $ */ #include "ca.h" + #if defined(PARI) #include "base.h" #include @@ -58,12 +59,23 @@ void patori_i(GEN,N *); void ritopa(Obj,GEN *); void ritopa_i(N,int,GEN *); +// PARI_VERSION(2,2,12) == 131596 +#if PARI_VERSION_CODE >= 131596 +#define prec precreal +#endif extern long prec; extern int paristack; +long get_pariprec() { + return prec; +} +void set_pariprec(long p) { + prec = p; +} + void risa_pari_init() { pari_init(paristack,2); - prec = 4; + set_pariprec(4); } void create_pari_variable(index) @@ -92,12 +104,22 @@ GEN a; return lg(a); } +void gpui_ri(Obj a, Obj e, Obj *c) +{ + GEN pa,pe,z; + long ltop,lbot; + + ltop = avma; ritopa(a,&pa); ritopa(e,&pe); lbot = avma; + z = gerepile(ltop,lbot,gpui(pa,pe,get_pariprec())); + patori(z,c); cgiv(z); +} + void ritopa(a,rp) Obj a; GEN *rp; { long ltop; - GEN pnm,z,w; + GEN pnm,z,w,u; DCP dc; int i,j,l,row,col; VL vl; @@ -115,7 +137,7 @@ GEN *rp; *rp = pnm; else { *rp = z = cgetg(3,4); z[1] = (long)pnm; - ritopa_i(DN((Q)a),1,(GEN *)&z[2]); + ritopa_i(DN((Q)a),1,&u); z[2] = u; } break; case N_R: @@ -124,7 +146,8 @@ GEN *rp; *rp = gcopy((GEN)BDY(((BF)a))); break; case N_C: z = cgetg(3,6); - ritopa((Obj)((C)a)->r,(GEN *)&z[1]); ritopa((Obj)((C)a)->i,(GEN *)&z[2]); + ritopa((Obj)((C)a)->r,&u); z[1] = u; + ritopa((Obj)((C)a)->i,&u); z[2] = u; *rp = z; break; default: @@ -141,21 +164,24 @@ GEN *rp; setlgef(z,l+3); for ( i = l+2; i >= 2; i-- ) z[i] = (long)gzero; - for ( dc = DC((P)a); dc; dc = NEXT(dc) ) - ritopa((Obj)COEF(dc),(GEN *)&z[QTOS(DEG(dc))+2]); + for ( dc = DC((P)a); dc; dc = NEXT(dc) ) { + ritopa((Obj)COEF(dc),&u); z[QTOS(DEG(dc))+2] = u; + } break; case O_VECT: l = ((VECT)a)->len; z = cgetg(l+1,17); - for ( i = 0; i < l; i++ ) - ritopa((Obj)BDY((VECT)a)[i],(GEN *)&z[i+1]); + for ( i = 0; i < l; i++ ) { + ritopa((Obj)BDY((VECT)a)[i],&u); z[i+1] = u; + } *rp = z; break; case O_MAT: row = ((MAT)a)->row; col = ((MAT)a)->col; z = cgetg(col+1,19); for ( j = 0; j < col; j++ ) { w = cgetg(row+1,18); - for ( i = 0; i < row; i++ ) - ritopa((Obj)BDY((MAT)a)[i][j],(GEN *)&w[i+1]); + for ( i = 0; i < row; i++ ) { + ritopa((Obj)BDY((MAT)a)[i][j],&u); w[i+1] = u; + } z[j+1] = (long)w; } *rp = z;