[BACK]Return to polydiv.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2018 / engine

Annotation of OpenXM_contrib2/asir2018/engine/polydiv.c, Revision 1.2

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");
1.2     ! noro       37:       d1 = ZTOS(deg1); d2 = ZTOS(deg2);
1.1       noro       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) )
1.2     ! noro       40:         pr[ZTOS(DEG(dc))] = COEF(dc);
1.1       noro       41:       for ( dc = dc2; dc; dc = NEXT(dc) )
1.2     ! noro       42:         pd[ZTOS(DEG(dc))] = COEF(dc);
1.1       noro       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>