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

Annotation of OpenXM_contrib2/asir2000/engine/distm.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/engine/distm.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
        !             2: #include "ca.h"
        !             3: #include "inline.h"
        !             4:
        !             5: #define NV(p) ((p)->nv)
        !             6: #define C(p) ((p)->c)
        !             7: #if 0
        !             8: #define ITOS(p) (((unsigned int)(p))>>1)
        !             9: #define STOI(i) ((P)((((unsigned int)(i))<<1)|1))
        !            10: #else
        !            11: #define ITOS(p) (((unsigned int)(p))&0x7fffffff)
        !            12: #define STOI(i) ((P)((unsigned int)(i)|0x80000000))
        !            13: #endif
        !            14:
        !            15: extern int (*cmpdl)();
        !            16:
        !            17: void ptomd(vl,mod,dvl,p,pr)
        !            18: VL vl,dvl;
        !            19: int mod;
        !            20: P p;
        !            21: DP *pr;
        !            22: {
        !            23:        P t;
        !            24:
        !            25:        ptomp(mod,p,&t);
        !            26:        mptomd(vl,mod,dvl,t,pr);
        !            27: }
        !            28:
        !            29: void mptomd(vl,mod,dvl,p,pr)
        !            30: VL vl,dvl;
        !            31: int mod;
        !            32: P p;
        !            33: DP *pr;
        !            34: {
        !            35:        int n,i;
        !            36:        VL tvl;
        !            37:        V v;
        !            38:        DL d;
        !            39:        MP m;
        !            40:        DCP dc;
        !            41:        DP r,s,t,u;
        !            42:        P x,c;
        !            43:
        !            44:        if ( !p )
        !            45:                *pr = 0;
        !            46:        else {
        !            47:                for ( n = 0, tvl = dvl; tvl; tvl = NEXT(tvl), n++ );
        !            48:                if ( NUM(p) ) {
        !            49:                        NEWDL(d,n);
        !            50:                        NEWMP(m); m->dl = d; C(m) = p; NEXT(m) = 0; MKDP(n,m,*pr);
        !            51:                } else {
        !            52:                        for ( i = 0, tvl = dvl, v = VR(p);
        !            53:                                tvl && tvl->v != v; tvl = NEXT(tvl), i++ );
        !            54:                        if ( !tvl ) {
        !            55:                                for ( dc = DC(p), s = 0, MKV(v,x); dc; dc = NEXT(dc) ) {
        !            56:                                        mptomd(vl,mod,dvl,COEF(dc),&t); pwrmp(vl,mod,x,DEG(dc),&c);
        !            57:                                        mulmdc(vl,mod,t,c,&r); addmd(vl,mod,r,s,&t); s = t;
        !            58:                                }
        !            59:                                *pr = s;
        !            60:                        } else {
        !            61:                                for ( dc = DC(p), s = 0; dc; dc = NEXT(dc) ) {
        !            62:                                        mptomd(vl,mod,dvl,COEF(dc),&t);
        !            63:                                        NEWDL(d,n); d->td = QTOS(DEG(dc)); d->d[i] = d->td;
        !            64:                                        NEWMP(m); m->dl = d; C(m) = (P)ONEM; NEXT(m) = 0; MKDP(n,m,u);
        !            65:                                        mulmd(vl,mod,t,u,&r); addmd(vl,mod,r,s,&t); s = t;
        !            66:                                }
        !            67:                                *pr = s;
        !            68:                        }
        !            69:                }
        !            70:        }
        !            71: }
        !            72:
        !            73: void mdtop(vl,mod,dvl,p,pr)
        !            74: VL vl,dvl;
        !            75: int mod;
        !            76: DP p;
        !            77: P *pr;
        !            78: {
        !            79:        int n,i;
        !            80:        DL d;
        !            81:        MP m;
        !            82:        P r,s,t,u,w;
        !            83:        Q q;
        !            84:        VL tvl;
        !            85:
        !            86:        if ( !p )
        !            87:                *pr = 0;
        !            88:        else {
        !            89:                for ( n = p->nv, m = BDY(p), s = 0; m; m = NEXT(m) ) {
        !            90:                        for ( i = 0, t = C(m), d = m->dl, tvl = dvl;
        !            91:                                i < n; tvl = NEXT(tvl), i++ ) {
        !            92:                                MKMV(tvl->v,r); STOQ(d->d[i],q); pwrmp(vl,mod,r,q,&u);
        !            93:                                mulmp(vl,mod,t,u,&w); t = w;
        !            94:                        }
        !            95:                        addmp(vl,mod,s,t,&u); s = u;
        !            96:                }
        !            97:                mptop(s,pr);
        !            98:        }
        !            99: }
        !           100:
        !           101: void addmd(vl,mod,p1,p2,pr)
        !           102: VL vl;
        !           103: int mod;
        !           104: DP p1,p2,*pr;
        !           105: {
        !           106:        int n;
        !           107:        MP m1,m2,mr,mr0;
        !           108:        P t;
        !           109:        int tmp;
        !           110:        MQ q;
        !           111:
        !           112:        if ( !p1 )
        !           113:                *pr = p2;
        !           114:        else if ( !p2 )
        !           115:                *pr = p1;
        !           116:        else {
        !           117:                for ( n = NV(p1), m1 = BDY(p1), m2 = BDY(p2), mr0 = 0; m1 && m2; )
        !           118:                        switch ( (*cmpdl)(n,m1->dl,m2->dl) ) {
        !           119:                                case 0:
        !           120:                                        if ( NUM(C(m1)) && NUM(C(m2)) ) {
        !           121:                                                tmp = (CONT((MQ)C(m1))+CONT((MQ)C(m2))) - mod;
        !           122:                                                if ( tmp < 0 )
        !           123:                                                        tmp += mod;
        !           124:                                                if ( tmp ) {
        !           125:                                                        STOMQ(tmp,q); t = (P)q;
        !           126:                                                } else
        !           127:                                                        t = 0;
        !           128:                                        } else
        !           129:                                                addmp(vl,mod,C(m1),C(m2),&t);
        !           130:                                        if ( t ) {
        !           131:                                                NEXTMP(mr0,mr); mr->dl = m1->dl; C(mr) = t;
        !           132:                                        }
        !           133:                                        m1 = NEXT(m1); m2 = NEXT(m2); break;
        !           134:                                case 1:
        !           135:                                        NEXTMP(mr0,mr); mr->dl = m1->dl; C(mr) = C(m1);
        !           136:                                        m1 = NEXT(m1); break;
        !           137:                                case -1:
        !           138:                                        NEXTMP(mr0,mr); mr->dl = m2->dl; C(mr) = C(m2);
        !           139:                                        m2 = NEXT(m2); break;
        !           140:                        }
        !           141:                if ( !mr0 )
        !           142:                        if ( m1 )
        !           143:                                mr0 = m1;
        !           144:                        else if ( m2 )
        !           145:                                mr0 = m2;
        !           146:                        else {
        !           147:                                *pr = 0;
        !           148:                                return;
        !           149:                        }
        !           150:                else if ( m1 )
        !           151:                        NEXT(mr) = m1;
        !           152:                else if ( m2 )
        !           153:                        NEXT(mr) = m2;
        !           154:                else
        !           155:                        NEXT(mr) = 0;
        !           156:                MKDP(NV(p1),mr0,*pr);
        !           157:                if ( *pr )
        !           158:                        (*pr)->sugar = MAX(p1->sugar,p2->sugar);
        !           159:        }
        !           160: }
        !           161:
        !           162: void submd(vl,mod,p1,p2,pr)
        !           163: VL vl;
        !           164: int mod;
        !           165: DP p1,p2,*pr;
        !           166: {
        !           167:        DP t;
        !           168:
        !           169:        if ( !p2 )
        !           170:                *pr = p1;
        !           171:        else {
        !           172:                chsgnmd(mod,p2,&t); addmd(vl,mod,p1,t,pr);
        !           173:        }
        !           174: }
        !           175:
        !           176: void chsgnmd(mod,p,pr)
        !           177: int mod;
        !           178: DP p,*pr;
        !           179: {
        !           180:        MP m,mr,mr0;
        !           181:
        !           182:        if ( !p )
        !           183:                *pr = 0;
        !           184:        else {
        !           185:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
        !           186:                        NEXTMP(mr0,mr); chsgnmp(mod,C(m),&C(mr)); mr->dl = m->dl;
        !           187:                }
        !           188:                NEXT(mr) = 0; MKDP(NV(p),mr0,*pr);
        !           189:                if ( *pr )
        !           190:                        (*pr)->sugar = p->sugar;
        !           191:        }
        !           192: }
        !           193:
        !           194: void mulmd(vl,mod,p1,p2,pr)
        !           195: VL vl;
        !           196: int mod;
        !           197: DP p1,p2,*pr;
        !           198: {
        !           199:        MP m;
        !           200:        DP s,t,u;
        !           201:
        !           202:        if ( !p1 || !p2 )
        !           203:                *pr = 0;
        !           204:        else if ( OID(p1) <= O_P )
        !           205:                mulmdc(vl,mod,p2,(P)p1,pr);
        !           206:        else if ( OID(p2) <= O_P )
        !           207:                mulmdc(vl,mod,p1,(P)p2,pr);
        !           208:        else {
        !           209:                for ( m = BDY(p2), s = 0; m; m = NEXT(m) ) {
        !           210:                        mulmdm(vl,mod,p1,m,&t); addmd(vl,mod,s,t,&u); s = u;
        !           211:                }
        !           212:                *pr = s;
        !           213:        }
        !           214: }
        !           215:
        !           216: void mulmdm(vl,mod,p,m0,pr)
        !           217: VL vl;
        !           218: int mod;
        !           219: DP p;
        !           220: MP m0;
        !           221: DP *pr;
        !           222: {
        !           223:        MP m,mr,mr0;
        !           224:        P c;
        !           225:        DL d;
        !           226:        int n,t;
        !           227:        MQ q;
        !           228:
        !           229:        if ( !p )
        !           230:                *pr = 0;
        !           231:        else {
        !           232:                for ( mr0 = 0, m = BDY(p), c = C(m0), d = m0->dl, n = NV(p);
        !           233:                        m; m = NEXT(m) ) {
        !           234:                        NEXTMP(mr0,mr);
        !           235:                        if ( NUM(C(m)) && NUM(c) ) {
        !           236:                                t = dmar(((MQ)(C(m)))->cont,((MQ)c)->cont,0,mod);
        !           237:                                STOMQ(t,q); C(mr) = (P)q;
        !           238:                        } else
        !           239:                                mulmp(vl,mod,C(m),c,&C(mr));
        !           240:                        adddl(n,m->dl,d,&mr->dl);
        !           241:                }
        !           242:                NEXT(mr) = 0; MKDP(NV(p),mr0,*pr);
        !           243:                if ( *pr )
        !           244:                        (*pr)->sugar = p->sugar + m0->dl->td;
        !           245:        }
        !           246: }
        !           247:
        !           248: void mulmdc(vl,mod,p,c,pr)
        !           249: VL vl;
        !           250: int mod;
        !           251: DP p;
        !           252: P c;
        !           253: DP *pr;
        !           254: {
        !           255:        MP m,mr,mr0;
        !           256:        int t;
        !           257:        MQ q;
        !           258:
        !           259:        if ( !p || !c )
        !           260:                *pr = 0;
        !           261:        else {
        !           262:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
        !           263:                        NEXTMP(mr0,mr);
        !           264:                        if ( NUM(C(m)) && NUM(c) ) {
        !           265:                                t = dmar(((MQ)(C(m)))->cont,((MQ)c)->cont,0,mod);
        !           266:                                STOMQ(t,q); C(mr) = (P)q;
        !           267:                        } else
        !           268:                                mulmp(vl,mod,C(m),c,&C(mr));
        !           269:                        mr->dl = m->dl;
        !           270:                }
        !           271:                NEXT(mr) = 0; MKDP(NV(p),mr0,*pr);
        !           272:                if ( *pr )
        !           273:                        (*pr)->sugar = p->sugar;
        !           274:        }
        !           275: }
        !           276:
        !           277: void divsmdc(vl,mod,p,c,pr)
        !           278: VL vl;
        !           279: int mod;
        !           280: DP p;
        !           281: P c;
        !           282: DP *pr;
        !           283: {
        !           284:        MP m,mr,mr0;
        !           285:
        !           286:        if ( !c )
        !           287:                error("disvsdc : division by 0");
        !           288:        else if ( !p )
        !           289:                *pr = 0;
        !           290:        else {
        !           291:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
        !           292:                        NEXTMP(mr0,mr); divsmp(vl,mod,C(m),c,&C(mr)); mr->dl = m->dl;
        !           293:                }
        !           294:                NEXT(mr) = 0; MKDP(NV(p),mr0,*pr);
        !           295:                if ( *pr )
        !           296:                        (*pr)->sugar = p->sugar;
        !           297:        }
        !           298: }
        !           299:
        !           300: #define MKDPM(n,m,d) (NEWDP(d),(d)->nv=(n),BDY(d)=(m))
        !           301:
        !           302: void _mdtop(vl,mod,dvl,p,pr)
        !           303: VL vl,dvl;
        !           304: int mod;
        !           305: DP p;
        !           306: P *pr;
        !           307: {
        !           308:        int n,i;
        !           309:        DL d;
        !           310:        MP m;
        !           311:        P r,s,t,u,w;
        !           312:        Q q;
        !           313:        MQ tq;
        !           314:        VL tvl;
        !           315:
        !           316:        if ( !p )
        !           317:                *pr = 0;
        !           318:        else {
        !           319:                for ( n = p->nv, m = BDY(p), s = 0; m; m = NEXT(m) ) {
        !           320:                        STOMQ(ITOS(C(m)),tq); t = (P)tq;
        !           321:                        for ( i = 0, d = m->dl, tvl = dvl;
        !           322:                                i < n; tvl = NEXT(tvl), i++ ) {
        !           323:                                MKV(tvl->v,r); STOQ(d->d[i],q); pwrmp(vl,mod,r,q,&u);
        !           324:                                mulmp(vl,mod,t,u,&w); t = w;
        !           325:                        }
        !           326:                        addmp(vl,mod,s,t,&u); s = u;
        !           327:                }
        !           328:                mptop(s,pr);
        !           329:        }
        !           330: }
        !           331:
        !           332: void _addmd(vl,mod,p1,p2,pr)
        !           333: VL vl;
        !           334: int mod;
        !           335: DP p1,p2,*pr;
        !           336: {
        !           337:        int n;
        !           338:        MP m1,m2,mr,mr0;
        !           339:        int t;
        !           340:
        !           341:        if ( !p1 )
        !           342:                *pr = p2;
        !           343:        else if ( !p2 )
        !           344:                *pr = p1;
        !           345:        else {
        !           346:                for ( n = NV(p1), m1 = BDY(p1), m2 = BDY(p2), mr0 = 0; m1 && m2; )
        !           347:                        switch ( (*cmpdl)(n,m1->dl,m2->dl) ) {
        !           348:                                case 0:
        !           349:                                        t = (ITOS(C(m1))+ITOS(C(m2))) - mod;
        !           350:                                        if ( t < 0 )
        !           351:                                                t += mod;
        !           352:                                        if ( t ) {
        !           353:                                                NEXTMP(mr0,mr); mr->dl = m1->dl; C(mr) = STOI(t);
        !           354:                                        }
        !           355:                                        m1 = NEXT(m1); m2 = NEXT(m2); break;
        !           356:                                case 1:
        !           357:                                        NEXTMP(mr0,mr); mr->dl = m1->dl; C(mr) = C(m1);
        !           358:                                        m1 = NEXT(m1); break;
        !           359:                                case -1:
        !           360:                                        NEXTMP(mr0,mr); mr->dl = m2->dl; C(mr) = C(m2);
        !           361:                                        m2 = NEXT(m2); break;
        !           362:                        }
        !           363:                if ( !mr0 )
        !           364:                        if ( m1 )
        !           365:                                mr0 = m1;
        !           366:                        else if ( m2 )
        !           367:                                mr0 = m2;
        !           368:                        else {
        !           369:                                *pr = 0;
        !           370:                                return;
        !           371:                        }
        !           372:                else if ( m1 )
        !           373:                        NEXT(mr) = m1;
        !           374:                else if ( m2 )
        !           375:                        NEXT(mr) = m2;
        !           376:                else
        !           377:                        NEXT(mr) = 0;
        !           378:                MKDPM(NV(p1),mr0,*pr);
        !           379:                if ( *pr )
        !           380:                        (*pr)->sugar = MAX(p1->sugar,p2->sugar);
        !           381:        }
        !           382: }
        !           383:
        !           384: void _submd(vl,mod,p1,p2,pr)
        !           385: VL vl;
        !           386: int mod;
        !           387: DP p1,p2,*pr;
        !           388: {
        !           389:        DP t;
        !           390:
        !           391:        if ( !p2 )
        !           392:                *pr = p1;
        !           393:        else {
        !           394:                _chsgnmd(mod,p2,&t); _addmd(vl,mod,p1,t,pr);
        !           395:        }
        !           396: }
        !           397:
        !           398: void _chsgnmd(mod,p,pr)
        !           399: int mod;
        !           400: DP p,*pr;
        !           401: {
        !           402:        MP m,mr,mr0;
        !           403:
        !           404:        if ( !p )
        !           405:                *pr = 0;
        !           406:        else {
        !           407:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
        !           408:                        NEXTMP(mr0,mr); C(mr) = STOI(mod - ITOS(C(m))); mr->dl = m->dl;
        !           409:                }
        !           410:                NEXT(mr) = 0; MKDPM(NV(p),mr0,*pr);
        !           411:                if ( *pr )
        !           412:                        (*pr)->sugar = p->sugar;
        !           413:        }
        !           414: }
        !           415:
        !           416: void _mulmd(vl,mod,p1,p2,pr)
        !           417: VL vl;
        !           418: int mod;
        !           419: DP p1,p2,*pr;
        !           420: {
        !           421:        MP m;
        !           422:        DP s,t,u;
        !           423:
        !           424:        if ( !p1 || !p2 )
        !           425:                *pr = 0;
        !           426:        else {
        !           427:                for ( m = BDY(p2), s = 0; m; m = NEXT(m) ) {
        !           428:                        _mulmdm(vl,mod,p1,m,&t); _addmd(vl,mod,s,t,&u); s = u;
        !           429:                }
        !           430:                *pr = s;
        !           431:        }
        !           432: }
        !           433:
        !           434: void _mulmdm(vl,mod,p,m0,pr)
        !           435: VL vl;
        !           436: int mod;
        !           437: DP p;
        !           438: MP m0;
        !           439: DP *pr;
        !           440: {
        !           441:        MP m,mr,mr0;
        !           442:        DL d;
        !           443:        int c,n,r;
        !           444:
        !           445:        if ( !p )
        !           446:                *pr = 0;
        !           447:        else {
        !           448:                for ( mr0 = 0, m = BDY(p), c = ITOS(C(m0)), d = m0->dl, n = NV(p);
        !           449:                        m; m = NEXT(m) ) {
        !           450:                        NEXTMP(mr0,mr);
        !           451:                        C(mr) = STOI(dmar(ITOS(C(m)),c,0,mod));
        !           452:                        adddl(n,m->dl,d,&mr->dl);
        !           453:                }
        !           454:                NEXT(mr) = 0; MKDPM(NV(p),mr0,*pr);
        !           455:                if ( *pr )
        !           456:                        (*pr)->sugar = p->sugar + m0->dl->td;
        !           457:        }
        !           458: }
        !           459:
        !           460: void _dtop_mod(vl,dvl,p,pr)
        !           461: VL vl,dvl;
        !           462: DP p;
        !           463: P *pr;
        !           464: {
        !           465:        int n,i;
        !           466:        DL d;
        !           467:        MP m;
        !           468:        P r,s,t,u,w;
        !           469:        Q q;
        !           470:        VL tvl;
        !           471:
        !           472:        if ( !p )
        !           473:                *pr = 0;
        !           474:        else {
        !           475:                for ( n = p->nv, m = BDY(p), s = 0; m; m = NEXT(m) ) {
        !           476:                        i = ITOS(m->c); STOQ(i,q); t = (P)q;
        !           477:                        for ( i = 0, d = m->dl, tvl = dvl;
        !           478:                                i < n; tvl = NEXT(tvl), i++ ) {
        !           479:                                MKV(tvl->v,r); STOQ(d->d[i],q); pwrp(vl,r,q,&u);
        !           480:                                mulp(vl,t,u,&w); t = w;
        !           481:                        }
        !           482:                        addp(vl,s,t,&u); s = u;
        !           483:                }
        !           484:                *pr = s;
        !           485:        }
        !           486: }
        !           487:
        !           488: void _dp_red_mod(p1,p2,mod,rp)
        !           489: DP p1,p2;
        !           490: int mod;
        !           491: DP *rp;
        !           492: {
        !           493:        int i,n;
        !           494:        DL d1,d2,d;
        !           495:        MP m;
        !           496:        DP t,s;
        !           497:        int c,c1;
        !           498:
        !           499:        n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;
        !           500:        NEWDL(d,n); d->td = d1->td - d2->td;
        !           501:        for ( i = 0; i < n; i++ )
        !           502:                d->d[i] = d1->d[i]-d2->d[i];
        !           503:        c = invm(ITOS(BDY(p2)->c),mod); c1 = dmar(c,ITOS(BDY(p1)->c),0,mod);
        !           504:        NEWMP(m); m->dl = d; m->c = STOI(mod-c1); NEXT(m) = 0;
        !           505:        MKDP(n,m,s); s->sugar = d->td;
        !           506:        _mulmd(CO,mod,p2,s,&t); _addmd(CO,mod,p1,t,rp);
        !           507: }
        !           508:
        !           509: void _dp_mod(p,mod,subst,rp)
        !           510: DP p;
        !           511: int mod;
        !           512: NODE subst;
        !           513: DP *rp;
        !           514: {
        !           515:        MP m,mr,mr0;
        !           516:        P t,s;
        !           517:        NODE tn;
        !           518:
        !           519:        if ( !p )
        !           520:                *rp = 0;
        !           521:        else {
        !           522:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
        !           523:                        for ( tn = subst, s = m->c; tn; tn = NEXT(NEXT(tn)) ) {
        !           524:                                substp(CO,s,BDY(tn),BDY(NEXT(tn)),&t);
        !           525:                                s = t;
        !           526:                        }
        !           527:                        ptomp(mod,s,&t);
        !           528:                        if ( t ) {
        !           529:                                NEXTMP(mr0,mr); mr->c = STOI(CONT((MQ)t)); mr->dl = m->dl;
        !           530:                        }
        !           531:                }
        !           532:                if ( mr0 ) {
        !           533:                        NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar;
        !           534:                } else
        !           535:                        *rp = 0;
        !           536:        }
        !           537: }
        !           538:
        !           539: void _dp_sp_mod(p1,p2,mod,rp)
        !           540: DP p1,p2;
        !           541: int mod;
        !           542: DP *rp;
        !           543: {
        !           544:        int i,n,td;
        !           545:        int *w;
        !           546:        DL d1,d2,d;
        !           547:        MP m;
        !           548:        DP t,s,u;
        !           549:
        !           550:        n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;
        !           551:        w = (int *)ALLOCA(n*sizeof(int));
        !           552:        for ( i = 0, td = 0; i < n; i++ ) {
        !           553:                w[i] = MAX(d1->d[i],d2->d[i]); td += w[i];
        !           554:        }
        !           555:        NEWDL(d,n); d->td = td - d1->td;
        !           556:        for ( i = 0; i < n; i++ )
        !           557:                d->d[i] = w[i] - d1->d[i];
        !           558:        NEWMP(m); m->dl = d; m->c = BDY(p2)->c; NEXT(m) = 0;
        !           559:        MKDP(n,m,s); s->sugar = d->td; _mulmd(CO,mod,p1,s,&t);
        !           560:        NEWDL(d,n); d->td = td - d2->td;
        !           561:        for ( i = 0; i < n; i++ )
        !           562:                d->d[i] = w[i] - d2->d[i];
        !           563:        NEWMP(m); m->dl = d; m->c = STOI(mod - ITOS(BDY(p1)->c)); NEXT(m) = 0;
        !           564:        MKDP(n,m,s); s->sugar = d->td; _mulmd(CO,mod,p2,s,&u);
        !           565:        _addmd(CO,mod,t,u,rp);
        !           566: }
        !           567:
        !           568: void _dp_sp_component_mod(p1,p2,mod,f1,f2)
        !           569: DP p1,p2;
        !           570: int mod;
        !           571: DP *f1,*f2;
        !           572: {
        !           573:        int i,n,td;
        !           574:        int *w;
        !           575:        DL d1,d2,d;
        !           576:        MP m;
        !           577:        DP t,s,u;
        !           578:
        !           579:        n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;
        !           580:        w = (int *)ALLOCA(n*sizeof(int));
        !           581:        for ( i = 0, td = 0; i < n; i++ ) {
        !           582:                w[i] = MAX(d1->d[i],d2->d[i]); td += w[i];
        !           583:        }
        !           584:        NEWDL(d,n); d->td = td - d1->td;
        !           585:        for ( i = 0; i < n; i++ )
        !           586:                d->d[i] = w[i] - d1->d[i];
        !           587:        NEWMP(m); m->dl = d; m->c = BDY(p2)->c; NEXT(m) = 0;
        !           588:        MKDP(n,m,s); s->sugar = d->td; _mulmd(CO,mod,p1,s,f1);
        !           589:        NEWDL(d,n); d->td = td - d2->td;
        !           590:        for ( i = 0; i < n; i++ )
        !           591:                d->d[i] = w[i] - d2->d[i];
        !           592:        NEWMP(m); m->dl = d; m->c = BDY(p1)->c; NEXT(m) = 0;
        !           593:        MKDP(n,m,s); s->sugar = d->td; _mulmd(CO,mod,p2,s,f2);
        !           594: }
        !           595:
        !           596: void _printdp(d)
        !           597: DP d;
        !           598: {
        !           599:        int n,i;
        !           600:        MP m;
        !           601:        DL dl;
        !           602:
        !           603:        if ( !d ) {
        !           604:                printf("0"); return;
        !           605:        }
        !           606:        for ( n = d->nv, m = BDY(d); m; m = NEXT(m) ) {
        !           607:                printf("%d*<<",ITOS(m->c));
        !           608:                for ( i = 0, dl = m->dl; i < n-1; i++ )
        !           609:                        printf("%d,",dl->d[i]);
        !           610:                printf("%d",dl->d[i]);
        !           611:                printf(">>");
        !           612:                if ( NEXT(m) )
        !           613:                        printf("+");
        !           614:        }
        !           615: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>