=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/poly.c,v retrieving revision 1.17 retrieving revision 1.21 diff -u -p -r1.17 -r1.21 --- OpenXM_contrib2/asir2000/builtin/poly.c 2002/09/27 04:42:59 1.17 +++ OpenXM_contrib2/asir2000/builtin/poly.c 2003/06/24 09:49:35 1.21 @@ -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/poly.c,v 1.16 2001/10/09 01:36:06 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/poly.c,v 1.20 2003/06/21 02:09:16 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -53,6 +53,8 @@ void Pranp(); +void Pheadsgn(); +void Pmul_trunc(),Pquo_trunc(); void Pumul(),Pumul_ff(),Pusquare(),Pusquare_ff(),Putmul(),Putmul_ff(); void Pkmul(),Pksquare(),Pktmul(); void Pord(), Pcoef0(), Pcoef(), Pdeg(), Pmindeg(), Psetmod(); @@ -64,7 +66,7 @@ void Pmergelist(), Pch_mv(), Pre_mv(), Pdeglist(); void Pptomp(),Pmptop(); void Pptolmp(),Plmptop(); void Pptosfp(),Psfptop(),Psf_galois_action(),Psf_embed(),Psf_find_root(); -void Psf_minipoly(),Psf_log(); +void Psf_minipoly(),Psf_log(),Psfptopsfp(); void Pptogf2n(),Pgf2ntop(),Pgf2ntovect(); void Pptogfpn(),Pgfpntop(); void Pfind_root_gf2n(); @@ -111,6 +113,9 @@ void field_order_ff(N *); int current_ff; struct ftab poly_tab[] = { + {"headsgn",Pheadsgn,1}, + {"quo_trunc",Pquo_trunc,2}, + {"mul_trunc",Pmul_trunc,3}, {"homogeneous_deg",Phomogeneous_deg,-2}, {"homogeneous_part",Phomogeneous_part,-3}, {"reorder",Preorder,3}, @@ -155,6 +160,7 @@ struct ftab poly_tab[] = { {"ptosfp",Pptosfp,1}, {"sfptop",Psfptop,1}, + {"sfptopsfp",Psfptopsfp,2}, {"ptogf2n",Pptogf2n,1}, {"gf2ntop",Pgf2ntop,-2}, {"gf2ntovect",Pgf2ntovect,1}, @@ -222,6 +228,72 @@ struct ftab poly_tab[] = { {0,0,0}, }; +void Pheadsgn(NODE arg,Q *rp) +{ + int s; + + s = headsgn((P)ARG0(arg)); + STOQ(s,*rp); +} + +void Pmul_trunc(NODE arg,P *rp) +{ + P p1,p2,p,h; + VL vl0,vl1,vl2,tvl,vl; + VN vn; + int i,n; + + p1 = (P)ARG0(arg); + p2 = (P)ARG1(arg); + get_vars((Obj)p1,&vl1); get_vars((Obj)p2,&vl2); mergev(CO,vl1,vl2,&tvl); + p = (P)ARG2(arg); + get_vars((Obj)p,&vl0); mergev(CO,tvl,vl0,&vl); + for ( tvl = vl, n = 0; tvl; tvl = NEXT(tvl), n++ ); + vn = (VN) ALLOCA((n+1)*sizeof(struct oVN)); + for ( i = 0, tvl = vl; i < n; tvl = NEXT(tvl), i++ ) { + vn[i].v = tvl->v; + vn[i].n = 0; + } + vn[i].v = 0; + vn[i].n = 0; + for ( h = p, i = 0; OID(h) == O_P; h = COEF(DC(h)) ) { + for ( ; vn[i].v != VR(h); i++ ); + vn[i].n = QTOS(DEG(DC(h))); + } + mulp_trunc(vl,p1,p2,vn,rp); +} + +void Pquo_trunc(NODE arg,P *rp) +{ + P p1,p2,p,h; + VL vl0,vl1,vl2,tvl,vl; + VN vn; + int i,n; + + p1 = (P)ARG0(arg); + p2 = (P)ARG1(arg); + if ( !p1 ) + *rp = 0; + else if ( NUM(p2) ) + divsp(CO,p1,p2,rp); + else { + get_vars((Obj)p1,&vl1); get_vars((Obj)p2,&vl2); mergev(CO,vl1,vl2,&vl); + for ( tvl = vl, n = 0; tvl; tvl = NEXT(tvl), n++ ); + vn = (VN) ALLOCA((n+1)*sizeof(struct oVN)); + for ( i = 0, tvl = vl; i < n; tvl = NEXT(tvl), i++ ) { + vn[i].v = tvl->v; + vn[i].n = 0; + } + vn[i].v = 0; + vn[i].n = 0; + for ( h = p2, i = 0; OID(h) == O_P; h = COEF(DC(h)) ) { + for ( ; vn[i].v != VR(h); i++ ); + vn[i].n = QTOS(DEG(DC(h))); + } + quop_trunc(vl,p1,p2,vn,rp); + } +} + void Phomogeneous_part(NODE arg,P *rp) { if ( argc(arg) == 2 ) @@ -1100,6 +1172,11 @@ void Pptosfp(NODE arg,P *rp) void Psfptop(NODE arg,P *rp) { sfptop((P)ARG0(arg),rp); +} + +void Psfptopsfp(NODE arg,P *rp) +{ + sfptopsfp((P)ARG0(arg),VR((P)ARG1(arg)),rp); } void Pptogf2n(NODE arg,GF2N *rp)