=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/P.c,v retrieving revision 1.7 retrieving revision 1.9 diff -u -p -r1.7 -r1.9 --- OpenXM_contrib2/asir2000/engine/P.c 2003/06/24 09:49:36 1.7 +++ OpenXM_contrib2/asir2000/engine/P.c 2004/03/11 09:52:56 1.9 @@ -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/engine/P.c,v 1.6 2003/06/19 07:08:19 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/engine/P.c,v 1.8 2003/12/23 10:39:57 ohara Exp $ */ #ifndef FBASE #define FBASE @@ -460,6 +460,50 @@ P *r; } } +/* Euler derivation */ +void ediffp(vl,p,v,r) +VL vl; +P p; +V v; +P *r; +{ + P t; + DCP dc,dcr,dcr0; + + if ( !p || NUM(p) ) + *r = 0; + else { + if ( v == VR(p) ) { + for ( dc = DC(p), dcr0 = 0; + dc && DEG(dc); dc = NEXT(dc) ) { + MULPQ(COEF(dc),(P)DEG(dc),&t); + if ( t ) { + NEXTDC(dcr0,dcr); + DEG(dcr) = DEG(dc); + COEF(dcr) = t; + } + } + if ( !dcr0 ) + *r = 0; + else { + NEXT(dcr) = 0; MKP(v,dcr0,*r); + } + } else { + for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) { + ediffp(vl,COEF(dc),v,&t); + if ( t ) { + NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t; + } + } + if ( !dcr0 ) + *r = 0; + else { + NEXT(dcr) = 0; MKP(VR(p),dcr0,*r); + } + } + } +} + void coefp(p,d,pr) P p; int d; @@ -528,6 +572,38 @@ P p1,p2; for ( ; v1 != VR(vl) && v2 != VR(vl); vl = NEXT(vl) ); return v1 == VR(vl) ? 1 : -1; } +} + +int equalp(vl,p1,p2) +VL vl; +P p1,p2; +{ + DCP dc1,dc2; + V v1,v2; + + if ( !p1 ) { + if ( !p2 ) return 1; + else return 0; + } + /* p1 != 0 */ + if ( !p2 ) return 0; + + /* p1 != 0, p2 != 0 */ + if ( NUM(p1) ) { + if ( !NUM(p2) ) return 0; + /* p1 and p2 are numbers */ + if ( NID((Num)p1) != NID((Num)p2) ) return 0; + if ( !(*cmpnumt[NID(p1),NID(p1)])(p1,p2) ) return 1; + return 0; + } + if ( VR(p1) != VR(p2) ) return 0; + for ( dc1 = DC(p1), dc2 = DC(p2); + dc1 && dc2; dc1 = NEXT(dc1), dc2 = NEXT(dc2) ) { + if ( cmpq(DEG(dc1),DEG(dc2)) ) return 0; + else if ( !equalp(vl,COEF(dc1),COEF(dc2)) ) return 0; + } + if ( dc1 || dc2 ) return 0; + else return 1; } void csump(vl,p,c)