=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/fctr.c,v retrieving revision 1.13 retrieving revision 1.16 diff -u -p -r1.13 -r1.16 --- OpenXM_contrib2/asir2000/builtin/fctr.c 2002/09/27 08:40:48 1.13 +++ OpenXM_contrib2/asir2000/builtin/fctr.c 2002/10/31 03:59:50 1.16 @@ -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/fctr.c,v 1.12 2002/01/13 07:11:46 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/fctr.c,v 1.15 2002/10/23 07:54:57 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -54,12 +54,14 @@ void Pfctr(), Pgcd(), Pgcdz(), Plcm(), Psqfr(), Pufctr void Pptozp(), Pcont(); void Pafctr(), Pagcd(); void Pmodsqfr(),Pmodfctr(),Pddd(),Pnewddd(),Pddd_tab(); -void Psfsqfr(),Psfbfctr(),Psfufctr(),Psfmintdeg(),Psfgcd(); +void Psfsqfr(),Psffctr(),Psfbfctr(),Psfufctr(),Psfmintdeg(),Psfgcd(); void Pirred_check(), Pnfctr_mod(); +void Pbivariate_hensel_special(); void sfmintdeg(VL vl,P fx,int dy,int c,P *fr); struct ftab fctr_tab[] = { + {"bivariate_hensel_special",Pbivariate_hensel_special,6}, {"fctr",Pfctr,-2}, {"gcd",Pgcd,-3}, {"gcdz",Pgcdz,2}, @@ -73,6 +75,7 @@ struct ftab fctr_tab[] = { {"modsqfr",Pmodsqfr,2}, {"modfctr",Pmodfctr,2}, {"sfsqfr",Psfsqfr,1}, + {"sffctr",Psffctr,1}, {"sfufctr",Psfufctr,1}, {"sfbfctr",Psfbfctr,-4}, {"sfmintdeg",Psfmintdeg,5}, @@ -87,6 +90,40 @@ struct ftab fctr_tab[] = { {0,0,0}, }; +/* bivariate_hensel_special(f(x,y):monic in x,g0(x),h0(y),x,y,d) */ + +void Pbivariate_hensel_special(arg,rp) +NODE arg; +LIST *rp; +{ + DCP dc; + struct oVN vn[2]; + P f,g0,h0,ak,bk,gk,hk; + V vx,vy; + VL nvl; + Q qk,cbd,bb; + int d; + NODE n; + + f = (P)ARG0(arg); + g0 = (P)ARG1(arg); + h0 = (P)ARG2(arg); + vx = VR((P)ARG3(arg)); + vy = VR((P)ARG4(arg)); + d = QTOS((Q)ARG5(arg)); + NEWVL(nvl); nvl->v = vx; + NEWVL(NEXT(nvl)); NEXT(nvl)->v = vy; + NEXT(NEXT(nvl)) = 0; + vn[0].v = vy; vn[0].n = 0; + vn[1].v = 0; vn[1].n = 0; + cbound(nvl,f,&cbd); + addq(cbd,cbd,&bb); + henzq1(g0,h0,bb,&bk,&ak,&qk); + henmv(nvl,vn,f,g0,h0,ak,bk,(P)ONE,(P)ONE,(P)ONE,(P)ONE,qk,d,&gk,&hk); + n = mknode(2,gk,hk); + MKLIST(*rp,n); +} + void Pfctr(arg,rp) NODE arg; LIST *rp; @@ -336,13 +373,23 @@ LIST *rp; gcdsf(CO,ps,2,rp); } +void Psffctr(arg,rp) +NODE arg; +LIST *rp; +{ + DCP dc; + + mfctrsf(CO,ARG0(arg),&dc); + dcptolist(dc,rp); +} + void Psfsqfr(arg,rp) NODE arg; LIST *rp; { DCP dc; - sfsqfr(ARG0(arg),&dc); + sqfrsf(CO,ARG0(arg),&dc); dcptolist(dc,rp); } @@ -352,7 +399,7 @@ LIST *rp; { DCP dc; - fctrsf(ARG0(arg),&dc); + ufctrsf(ARG0(arg),&dc); dcptolist(dc,rp); }