=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/parif.c,v retrieving revision 1.6 retrieving revision 1.11 diff -u -p -r1.6 -r1.11 --- OpenXM_contrib2/asir2000/builtin/parif.c 2000/12/05 01:24:51 1.6 +++ OpenXM_contrib2/asir2000/builtin/parif.c 2002/07/12 08:05:23 1.11 @@ -45,7 +45,7 @@ * 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.5 2000/11/15 00:07:20 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/parif.c,v 1.10 2001/10/09 01:36:06 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -60,11 +60,22 @@ void patori_i(GEN,N *); void ritopa(Obj,GEN *); void ritopa_i(N,int,GEN *); +void Ptodouble(); void Peval(),Psetprec(),p_pi(),p_e(),p_mul(),p_gcd(); void asir_cgiv(GEN); +#if defined(INTERVAL) || 1 +void Psetprecword(); +#endif + struct ftab pari_tab[] = { - {"eval",Peval,-2}, {"setprec",Psetprec,-1}, {0,0,0}, + {"eval",Peval,-2}, + {"setprec",Psetprec,-1}, + {"todouble",Ptodouble,1}, +#if defined(INTERVAL) || 1 + {"setprecword",Psetprecword,-1}, +#endif + {0,0,0}, }; #define MKPREC(a,i,b) (argc(a)==(i)?mkprec(QTOS((Q)(b))):prec) @@ -83,12 +94,16 @@ void f(NODE,Obj *);\ 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 #endif #if defined(LONG_IS_64BIT) #define PREC_CONV 0.051905126 #endif +#endif /* XXX : we should be more careful when we free PARI pointers. */ @@ -104,10 +119,44 @@ GEN ptr; mkprec(p) int p; { - if ( p > 0 ) - return (int)(p*PREC_CONV+3); + if ( p <= 0 ) + p = 1; + return (int)(p*PREC_CONV+3); } +void Ptodouble(arg,rp) +NODE arg; +Num *rp; +{ + double r,i; + Real real,imag; + Num num; + + asir_assert(ARG0(arg),O_N,"todouble"); + num = (Num)ARG0(arg); + if ( !num ) { + *rp = 0; + return; + } + switch ( NID(num) ) { + case N_R: case N_Q: case N_B: + r = ToReal(num); + MKReal(r,real); + *rp = (Num)real; + break; + case N_C: + r = ToReal(((C)num)->r); + i = ToReal(((C)num)->i); + MKReal(r,real); + MKReal(i,imag); + reimtocplx((Num)real,(Num)imag,rp); + break; + default: + *rp = num; + break; + } +} + void Peval(arg,rp) NODE arg; Obj *rp; @@ -123,13 +172,42 @@ Obj *rp; int p; Q q; +#if defined(INTERVAL) || 1 + p = (int)((prec-2)/PREC_CONV); STOQ(p,q); *rp = (Obj)q; + if ( arg ) { + asir_assert(ARG0(arg),O_N,"setprec"); + p = QTOS((Q)ARG0(arg)); + if ( p > 0 ) + prec = (long)(p*PREC_CONV+3); + } +#else p = (int)((prec-3)/PREC_CONV); STOQ(p,q); *rp = (Obj)q; if ( arg ) { asir_assert(ARG0(arg),O_N,"setprec"); prec = mkprec(QTOS((Q)ARG0(arg))); } +#endif } +#if defined(INTERVAL) || 1 +void Psetprecword(arg,rp) +NODE arg; +Obj *rp; +{ + int p; + Q q; + + p = (int)((prec-2)); STOQ(p,q); *rp = (Obj)q; + if ( arg ) { + asir_assert(ARG0(arg),O_N,"setprecword"); + p = QTOS((Q)ARG0(arg)); + if ( p > 0 ) { + prec = p + 2; + } + } +} +#endif + void p_pi(arg,rp) NODE arg; Obj *rp; @@ -186,37 +264,72 @@ NODE arg; GEN a,v; long ltop,lbot; pointer r; - int ac; + int ac,opt,intarg,ret; char buf[BUFSIZ]; + Q q; + GEN (*dmy)(); if ( !f->f.binf ) { sprintf(buf,"pari : %s undefined.",f->name); error(buf); + /* NOTREACHED */ + return 0; } switch ( f->type ) { + case 0: /* in/out : integer */ + ac = argc(arg); + if ( ac > 2 ) { + fprintf(stderr,"argument mismatch in %s()\n",NAME(f)); + error(""); + /* NOTREACHED */ + return 0; + } + intarg = !ac ? 0 : QTOS((Q)ARG0(arg)); + dmy = (GEN (*)())f->f.binf; + ret = (int)(*dmy)(intarg); + STOQ(ret,q); + return (pointer)q; + case 1: ac = argc(arg); if ( !ac || ( ac > 2 ) ) { fprintf(stderr,"argument mismatch in %s()\n",NAME(f)); error(""); + /* NOTREACHED */ + return 0; } ltop = avma; ritopa((Obj)ARG0(arg),&a); -#if 1 || defined(__MWERKS__) - { - GEN (*dmy)(); - dmy = (GEN (*)())f->f.binf; v = (*dmy)(a,MKPREC(arg,2,ARG1(arg))); - } -#else - v = (GEN)(*f->f.binf)(a,MKPREC(arg,2,ARG1(arg))); -#endif lbot = avma; patori(v,(Obj *)&r); gerepile(ltop,lbot,0); return r; + + case 2: + ac = argc(arg); + if ( !ac || ( ac > 2 ) ) { + fprintf(stderr,"argument mismatch in %s()\n",NAME(f)); + error(""); + /* NOTREACHED */ + return 0; + } + if ( ac == 1 ) + opt = 0; + else + opt = QTOS((Q)ARG1(arg)); + ltop = avma; + ritopa((Obj)ARG0(arg),&a); + dmy = (GEN (*)())f->f.binf; + v = (*dmy)(a,opt); + lbot = avma; + patori(v,(Obj *)&r); gerepile(ltop,lbot,0); + return r; + default: error("evalparif : not implemented yet."); + /* NOTREACHED */ + return 0; } } @@ -226,7 +339,14 @@ struct pariftab { int type; }; +/* + * type = 1 => argc = 1, second arg = precision + * type = 2 => argc = 1, second arg = optional (long int) + * + */ + struct pariftab pariftab[] = { +{"allocatemem",(GEN(*)())allocatemoremem,0}, {"abs",(GEN (*)())gabs,1}, {"adj",adj,1}, {"arg",garg,1}, @@ -350,6 +470,8 @@ struct pariftab pariftab[] = { {"wf",wf,1}, {"wf2",wf2,1}, {"zeta",gzeta,1}, +{"factor",factor,1}, +{"factorint",factorint,2}, {0,0,0}, };