Annotation of OpenXM_contrib2/asir2018/engine/polydiv.c, Revision 1.1
1.1 ! noro 1: #ifdef MODULAR
! 2: void divsrmp(VL vl,int mod,P p1,P p2,P *q,P *r)
! 3: #else
! 4: void divsrp(VL vl,P p1,P p2,P *q,P *r)
! 5: #endif
! 6: {
! 7: register int i,j;
! 8: register DCP dc1,dc2,dc;
! 9: P m,s,dvr;
! 10: P *pq,*pr,*pd;
! 11: V v1,v2;
! 12: Z deg1,deg2;
! 13: int d1,d2,sgn;
! 14:
! 15: if ( !p1 ) {
! 16: *q = 0; *r = 0;
! 17: } else if ( NUM(p2) )
! 18: if ( NUM(p1) ) {
! 19: DIVNUM(p1,p2,q); *r = 0;
! 20: } else {
! 21: DIVSDCP(vl,p1,p2,q); *r = 0;
! 22: }
! 23: else if ( NUM(p1) ) {
! 24: *q = 0; *r = p1;
! 25: } else if ( ( v1 = VR(p1) ) == ( v2 = VR(p2) ) ) {
! 26: dc1 = DC(p1); dc2 = DC(p2);
! 27: deg1 = DEG(dc1); deg2 = DEG(dc2);
! 28: sgn = cmpz(deg1,deg2);
! 29: if ( sgn == 0 ) {
! 30: DIVSP(vl,COEF(dc1),COEF(dc2),q);
! 31: MULP(vl,p2,*q,&m); SUBP(vl,p1,m,r);
! 32: } else if ( sgn < 0 ) {
! 33: *q = 0; *r = p1;
! 34: } else {
! 35: if ( !smallz(deg1) )
! 36: error("divsrp : invalid input");
! 37: d1 = QTOS(deg1); d2 = QTOS(deg2);
! 38: W_CALLOC(d1-d2,P,pq); W_CALLOC(d1,P,pr); W_CALLOC(d2,P,pd);
! 39: for ( dc = dc1; dc; dc = NEXT(dc) )
! 40: pr[QTOS(DEG(dc))] = COEF(dc);
! 41: for ( dc = dc2; dc; dc = NEXT(dc) )
! 42: pd[QTOS(DEG(dc))] = COEF(dc);
! 43: for ( dvr = COEF(dc2), i = d1 - d2; i >= 0; i-- ) {
! 44: if ( !pr[i+d2] )
! 45: continue;
! 46: DIVSP(vl,pr[i+d2],dvr,&pq[i]);
! 47: for ( j = d2; j >= 0; j-- ) {
! 48: MULP(vl,pq[i],pd[j],&m);
! 49: SUBP(vl,pr[i + j],m,&s); pr[i + j] = s;
! 50: }
! 51: }
! 52: plisttop(pq,v1,d1 - d2,q); plisttop(pr,v1,d1 - 1,r);
! 53: }
! 54: } else {
! 55: for ( ; (v1 != vl->v) && (v2 != vl->v); vl = NEXT(vl) );
! 56: if ( v2 == vl->v ) {
! 57: *q = 0; *r = p1;
! 58: } else
! 59: DIVSRDCP(vl,p1,p2,q,r);
! 60: }
! 61: }
! 62:
! 63: #ifdef MODULAR
! 64: void divsrdcmp(VL vl,int mod,P p1,P p2,P *q,P *r)
! 65: #else
! 66: void divsrdcp(VL vl,P p1,P p2,P *q,P *r)
! 67: #endif
! 68: {
! 69:
! 70: P qc,rc;
! 71: DCP dc,dcq,dcq0,dcr,dcr0;
! 72:
! 73: for ( dc = DC(p1), dcq0 = 0, dcr0 = 0; dc; dc = NEXT(dc) ) {
! 74: DIVSRP(vl,COEF(dc),p2,&qc,&rc);
! 75: if ( qc ) {
! 76: NEXTDC(dcq0,dcq); DEG(dcq) = DEG(dc); COEF(dcq) = qc;
! 77: }
! 78: if ( rc ) {
! 79: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = rc;
! 80: }
! 81: }
! 82: if ( dcq0 ) {
! 83: NEXT(dcq) = 0; MKP(VR(p1),dcq0,*q);
! 84: } else
! 85: *q = 0;
! 86: if ( dcr0 ) {
! 87: NEXT(dcr) = 0; MKP(VR(p1),dcr0,*r);
! 88: } else
! 89: *r = 0;
! 90: }
! 91:
! 92: #ifdef MODULAR
! 93: void divsmp(VL vl,int mod,P p1,P p2,P *q)
! 94: #else
! 95: void divsp(VL vl,P p1,P p2,P *q)
! 96: #endif
! 97: {
! 98: P t;
! 99:
! 100: DIVSRP(vl,p1,p2,q,&t);
! 101: if ( t )
! 102: error("divsp: cannot happen");
! 103: }
! 104:
! 105: #ifdef MODULAR
! 106: void divsdcmp(VL vl,int mod,P p1,P p2,P *q)
! 107: #else
! 108: void divsdcp(VL vl,P p1,P p2,P *q)
! 109: #endif
! 110: {
! 111:
! 112: P m;
! 113: register DCP dc,dcr,dcr0;
! 114:
! 115: for ( dc = DC(p1), dcr0 = 0; dc; dc = NEXT(dc) ) {
! 116: DIVSP(vl,COEF(dc),p2,&m);
! 117: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = m; NEXT(dcr) = 0;
! 118: }
! 119: MKP(VR(p1),dcr0,*q);
! 120: }
! 121:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>