=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/F.c,v retrieving revision 1.6 retrieving revision 1.8 diff -u -p -r1.6 -r1.8 --- OpenXM_contrib2/asir2000/engine/F.c 2001/04/20 02:34:21 1.6 +++ OpenXM_contrib2/asir2000/engine/F.c 2001/05/28 08:25:31 1.8 @@ -45,12 +45,13 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/engine/F.c,v 1.5 2001/04/19 04:52:41 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/engine/F.c,v 1.7 2001/04/20 02:46:55 noro Exp $ */ #include "ca.h" #include void homfctr(); +void mfctr_wrt_v(); void fctrp(vl,f,dcp) VL vl; @@ -75,6 +76,30 @@ DCP *dcp; } } +void fctr_wrt_v_p(vl,f,v,dcp) +VL vl; +P f; +V v; +DCP *dcp; +{ + VL nvl; + DCP dc; + + if ( !f || NUM(f) ) { + NEWDC(dc); COEF(dc) = f; DEG(dc) = ONE; + NEXT(dc) = 0; *dcp = dc; + return; + } else if ( !qpcheck((Obj)f) ) + error("fctrp : invalid argument"); + else { + clctv(vl,f,&nvl); + if ( !NEXT(nvl) ) + ufctr(f,1,dcp); + else + mfctr_wrt_v(nvl,f,v,dcp); + } +} + void homfctr(vl,g,dcp) VL vl; P g; @@ -138,6 +163,45 @@ DCP *dcp; adjsgn(f,dc0); *dcp = dc0; } +void mfctr_wrt_v(vl,f,v,dcp) +VL vl; +P f; +V v; +DCP *dcp; +{ + DCP dc,dc0,dct,dcs,dcr; + P p,pmin,ppmin,cmin,t; + VL nvl,mvl; + Q c; + + ptozp(f,1,&c,&p); + NEWDC(dc0); dc = dc0; COEF(dc) = (P)c; DEG(dc) = ONE; NEXT(dc) = 0; + msqfr(vl,p,&dct); + for ( ; dct; dct = NEXT(dct) ) { + clctv(vl,f,&nvl); + reordvar(nvl,v,&mvl); + reorderp(mvl,vl,f,&pmin); + pcp(mvl,pmin,&ppmin,&cmin); + if ( !NUM(cmin) ) { + mfctrmain(mvl,cmin,&dcs); + for ( dcr = dcs; dcr; dcr = NEXT(dcr) ) { + DEG(dcr) = DEG(dct); + reorderp(vl,mvl,COEF(dcr),&t); COEF(dcr) = t; + } + for ( ; NEXT(dc); dc = NEXT(dc) ); + NEXT(dc) = dcs; + } + mfctrmain(mvl,ppmin,&dcs); + for ( dcr = dcs; dcr; dcr = NEXT(dcr) ) { + DEG(dcr) = DEG(dct); + reorderp(vl,mvl,COEF(dcr),&t); COEF(dcr) = t; + } + for ( ; NEXT(dc); dc = NEXT(dc) ); + NEXT(dc) = dcs; + } + adjsgn(f,dc0); *dcp = dc0; +} + #if 0 void adjsgn(p,dc) P p; @@ -854,10 +918,8 @@ DCP *dcp; *dcp = dc; return; } else { - d = d1; - found = 1; - sp0 = p0; sdc0 = dc0; - bcopy((char *)vn1,(char *)svn1,(int)(sizeof(struct oVN)*nv)); + d = d1+1; /* XXX : try searching better evaluation */ + found = 0; break; } }