Annotation of OpenXM_contrib2/asir2000/engine/RU.c, Revision 1.1
1.1 ! noro 1: /* $OpenXM: OpenXM/src/asir99/engine/RU.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
! 2: #include "ca.h"
! 3:
! 4: int qcoefr(r)
! 5: Obj r;
! 6: {
! 7: if ( !r )
! 8: return 1;
! 9: else
! 10: switch ( OID(r) ) {
! 11: case O_N:
! 12: return RATN(r)?1:0; break;
! 13: case O_P:
! 14: return qcoefp(r); break;
! 15: default:
! 16: return qcoefp((Obj)NM((R)r))&&qcoefp((Obj)DN((R)r)); break;
! 17: }
! 18: }
! 19:
! 20: int qcoefp(p)
! 21: Obj p;
! 22: {
! 23: DCP dc;
! 24:
! 25: if ( !p )
! 26: return 1;
! 27: else
! 28: switch ( OID(p) ) {
! 29: case O_N:
! 30: return RATN(p)?1:0; break;
! 31: default:
! 32: for ( dc = DC((P)p); dc; dc = NEXT(dc) )
! 33: if ( !qcoefp((Obj)COEF(dc)) )
! 34: return 0;
! 35: return 1; break;
! 36: }
! 37: }
! 38:
! 39: void reductr(vl,p,r)
! 40: VL vl;
! 41: Obj p,*r;
! 42: {
! 43: P t,s,u,cnm,cdn,pnm,pdn;
! 44: R a;
! 45:
! 46: if ( !p )
! 47: *r = 0;
! 48: else if ( OID(p) <= O_P )
! 49: *r = p;
! 50: else if ( ((R)p)->reduced )
! 51: *r = p;
! 52: else if ( NUM(DN((R)p)) )
! 53: divsp(vl,NM((R)p),DN((R)p),(P *)r);
! 54: else if ( qcoefp((Obj)NM((R)p)) && qcoefp((Obj)DN((R)p)) ) {
! 55: ptozp(NM((R)p),1,(Q *)&cnm,&pnm); ptozp(DN((R)p),1,(Q *)&cdn,&pdn);
! 56: ezgcdpz(vl,pnm,pdn,&t);
! 57: divsp(vl,NM((R)p),t,&u); divsp(vl,DN((R)p),t,&s);
! 58: if ( NUM(s) )
! 59: divsp(vl,u,s,(P *)r);
! 60: else {
! 61: divsp(vl,u,cdn,&pnm); divsp(vl,s,cdn,&pdn);
! 62: MKRAT(pnm,pdn,1,a); *r = (Obj)a;
! 63: }
! 64: } else {
! 65: MKRAT(NM((R)p),DN((R)p),1,a); *r = (Obj)a;
! 66: }
! 67: }
! 68:
! 69: void pderivr(vl,a,v,b)
! 70: VL vl;
! 71: V v;
! 72: Obj a,*b;
! 73: {
! 74: P t,s,u;
! 75: R r;
! 76:
! 77: if ( !a )
! 78: *b = 0;
! 79: else if ( OID(a) <= O_P )
! 80: diffp(vl,(P)a,v,(P *)b);
! 81: else {
! 82: diffp(vl,NM((R)a),v,&t); mulp(vl,t,DN((R)a),&s);
! 83: diffp(vl,DN((R)a),v,&t); mulp(vl,t,NM((R)a),&u);
! 84: subp(vl,s,u,&t);
! 85: if ( t ) {
! 86: mulp(vl,DN((R)a),DN((R)a),&u); MKRAT(t,u,0,r); *b = (Obj)r;
! 87: } else
! 88: *b = 0;
! 89: }
! 90: }
! 91:
! 92: void clctvr(vl,p,nvl)
! 93: VL vl,*nvl;
! 94: Obj p;
! 95: {
! 96: VL vl1,vl2;
! 97:
! 98: if ( !p )
! 99: *nvl = 0;
! 100: else if ( OID(p) <= O_P )
! 101: clctv(vl,(P)p,nvl);
! 102: else {
! 103: clctv(vl,NM((R)p),&vl1); clctv(vl,DN((R)p),&vl2); mergev(vl,vl1,vl2,nvl);
! 104: }
! 105: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>