[BACK]Return to dp-supp.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / builtin

Annotation of OpenXM_contrib2/asir2000/builtin/dp-supp.c, Revision 1.1.1.1

1.1       noro        1: /* $OpenXM: OpenXM/src/asir99/builtin/dp-supp.c,v 1.2 1999/11/18 05:42:01 noro Exp $ */
                      2: #include "ca.h"
                      3: #include "base.h"
                      4: #include "parse.h"
                      5: #include "ox.h"
                      6:
                      7: extern int (*cmpdl)();
                      8: double pz_t_e,pz_t_d,pz_t_d1,pz_t_c;
                      9:
                     10: void Pdp_mbase(),Pdp_lnf_mod(),Pdp_nf_tab_mod(),Pdp_mdtod();
                     11: void Pdp_vtoe(), Pdp_etov(), Pdp_dtov(), Pdp_idiv(), Pdp_sep();
                     12: void Pdp_cont(), Pdp_igcdv_hist(), Pdp_idivv_hist();
                     13:
                     14: struct ftab dp_supp_tab[] = {
                     15:   {"dp_mbase",Pdp_mbase,1},
                     16:   {"dp_lnf_mod",Pdp_lnf_mod,3},
                     17:   {"dp_nf_tab_mod",Pdp_nf_tab_mod,3},
                     18:   {"dp_etov",Pdp_etov,1},
                     19:   {"dp_vtoe",Pdp_vtoe,1},
                     20:   {"dp_dtov",Pdp_dtov,1},
                     21:   {"dp_idiv",Pdp_idiv,2},
                     22:   {"dp_cont",Pdp_cont,1},
                     23:   {"dp_sep",Pdp_sep,2},
                     24:   {"dp_mdtod",Pdp_mdtod,1},
                     25:   {"dp_igcdv_hist",Pdp_igcdv_hist,1},
                     26:   {"dp_idivv_hist",Pdp_idivv_hist,1},
                     27:   {0,0,0}
                     28: };
                     29:
                     30: void Pdp_mdtod(arg,rp)
                     31: NODE arg;
                     32: DP *rp;
                     33: {
                     34:        MP m,mr,mr0;
                     35:        DP p;
                     36:        P t;
                     37:
                     38:        p = (DP)ARG0(arg);
                     39:        if ( !p )
                     40:                *rp = 0;
                     41:        else {
                     42:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
                     43:                        mptop(m->c,&t); NEXTMP(mr0,mr); mr->c = t; mr->dl = m->dl;
                     44:                }
                     45:                NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar;
                     46:        }
                     47: }
                     48:
                     49: void Pdp_sep(arg,rp)
                     50: NODE arg;
                     51: VECT *rp;
                     52: {
                     53:        DP p,r;
                     54:        MP m,t;
                     55:        MP *w0,*w;
                     56:        int i,n,d,nv,sugar;
                     57:        VECT v;
                     58:        pointer *pv;
                     59:
                     60:        p = (DP)ARG0(arg); m = BDY(p);
                     61:        d = QTOS((Q)ARG1(arg));
                     62:        for ( t = m, n = 0; t; t = NEXT(t), n++ );
                     63:        if ( d > n )
                     64:                d = n;
                     65:        MKVECT(v,d); *rp = v;
                     66:        pv = BDY(v); nv = p->nv; sugar = p->sugar;
                     67:        w0 = (MP *)MALLOC(d*sizeof(MP)); bzero(w0,d*sizeof(MP));
                     68:        w = (MP *)MALLOC(d*sizeof(MP)); bzero(w,d*sizeof(MP));
                     69:        for ( t = BDY(p), i = 0; t; t = NEXT(t), i++, i %= d  ) {
                     70:                NEXTMP(w0[i],w[i]); w[i]->c = t->c; w[i]->dl = t->dl;
                     71:        }
                     72:        for ( i = 0; i < d; i++ ) {
                     73:                NEXT(w[i]) = 0; MKDP(nv,w0[i],r); r->sugar = sugar;
                     74:                pv[i] = (pointer)r;
                     75:        }
                     76: }
                     77:
                     78: void Pdp_idiv(arg,rp)
                     79: NODE arg;
                     80: DP *rp;
                     81: {
                     82:        dp_idiv((DP)ARG0(arg),(Q)ARG1(arg),rp);
                     83: }
                     84:
                     85: void Pdp_cont(arg,rp)
                     86: NODE arg;
                     87: Q *rp;
                     88: {
                     89:        dp_cont((DP)ARG0(arg),rp);
                     90: }
                     91:
                     92: void Pdp_dtov(arg,rp)
                     93: NODE arg;
                     94: VECT *rp;
                     95: {
                     96:        dp_dtov((DP)ARG0(arg),rp);
                     97: }
                     98:
                     99: void Pdp_mbase(arg,rp)
                    100: NODE arg;
                    101: LIST *rp;
                    102: {
                    103:        NODE mb;
                    104:
                    105:        asir_assert(ARG0(arg),O_LIST,"dp_mbase");
                    106:        dp_mbase(BDY((LIST)ARG0(arg)),&mb);
                    107:        MKLIST(*rp,mb);
                    108: }
                    109:
                    110: void Pdp_etov(arg,rp)
                    111: NODE arg;
                    112: VECT *rp;
                    113: {
                    114:        DP dp;
                    115:        int n,i;
                    116:        int *d;
                    117:        VECT v;
                    118:        Q t;
                    119:
                    120:        dp = (DP)ARG0(arg);
                    121:        asir_assert(dp,O_DP,"dp_etov");
                    122:        n = dp->nv; d = BDY(dp)->dl->d;
                    123:        MKVECT(v,n);
                    124:        for ( i = 0; i < n; i++ ) {
                    125:                STOQ(d[i],t); v->body[i] = (pointer)t;
                    126:        }
                    127:        *rp = v;
                    128: }
                    129:
                    130: void Pdp_vtoe(arg,rp)
                    131: NODE arg;
                    132: DP *rp;
                    133: {
                    134:        DP dp;
                    135:        DL dl;
                    136:        MP m;
                    137:        int n,i,td;
                    138:        int *d;
                    139:        VECT v;
                    140:
                    141:        v = (VECT)ARG0(arg);
                    142:        asir_assert(v,O_VECT,"dp_vtoe");
                    143:        n = v->len;
                    144:        NEWDL(dl,n); d = dl->d;
                    145:        for ( i = 0, td = 0; i < n; i++ ) {
                    146:                d[i] = QTOS((Q)(v->body[i])); td += d[i];
                    147:        }
                    148:        dl->td = td;
                    149:        NEWMP(m); m->dl = dl; m->c = (P)ONE; NEXT(m) = 0;
                    150:        MKDP(n,m,dp); dp->sugar = td;
                    151:        *rp = dp;
                    152: }
                    153:
                    154: void Pdp_lnf_mod(arg,rp)
                    155: NODE arg;
                    156: LIST *rp;
                    157: {
                    158:        DP r1,r2;
                    159:        NODE b,g,n;
                    160:        int mod;
                    161:
                    162:        asir_assert(ARG0(arg),O_LIST,"dp_lnf_mod");
                    163:        asir_assert(ARG1(arg),O_LIST,"dp_lnf_mod");
                    164:        asir_assert(ARG2(arg),O_N,"dp_lnf_mod");
                    165:        b = BDY((LIST)ARG0(arg)); g = BDY((LIST)ARG1(arg));
                    166:        mod = QTOS((Q)ARG2(arg));
                    167:        dp_lnf_mod((DP)BDY(b),(DP)BDY(NEXT(b)),g,mod,&r1,&r2);
                    168:        NEWNODE(n); BDY(n) = (pointer)r1;
                    169:        NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)r2;
                    170:        NEXT(NEXT(n)) = 0; MKLIST(*rp,n);
                    171: }
                    172:
                    173: void Pdp_nf_tab_mod(arg,rp)
                    174: NODE arg;
                    175: DP *rp;
                    176: {
                    177:        asir_assert(ARG0(arg),O_DP,"dp_nf_tab_mod");
                    178:        asir_assert(ARG1(arg),O_VECT,"dp_nf_tab_mod");
                    179:        asir_assert(ARG2(arg),O_N,"dp_nf_tab_mod");
                    180:        dp_nf_tab_mod((DP)ARG0(arg),(LIST *)BDY((VECT)ARG1(arg)),
                    181:                QTOS((Q)ARG2(arg)),rp);
                    182: }
                    183:
                    184: void Pdp_igcdv_hist(arg,rp)
                    185: NODE arg;
                    186: Q *rp;
                    187: {
                    188:        dp_igcdv_hist((DP)ARG0(arg),rp);
                    189: }
                    190:
                    191: void Pdp_idivv_hist(arg,rp)
                    192: NODE arg;
                    193: DP *rp;
                    194: {
                    195:        dp_idivv_hist((Q)ARG0(arg),rp);
                    196: }
                    197:
                    198: void dp_idiv(p,c,rp)
                    199: DP p;
                    200: Q c;
                    201: DP *rp;
                    202: {
                    203:        Q t;
                    204:        N nm,q;
                    205:        int sgn,s;
                    206:        MP mr0,m,mr;
                    207:
                    208:        if ( !p )
                    209:                *rp = 0;
                    210:        else if ( MUNIQ((Q)c) )
                    211:                *rp = p;
                    212:        else if ( MUNIQ((Q)c) )
                    213:                chsgnd(p,rp);
                    214:        else {
                    215:                nm = NM(c); sgn = SGN(c);
                    216:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
                    217:                        NEXTMP(mr0,mr);
                    218:
                    219:                        divsn(NM((Q)(m->c)),nm,&q);
                    220:                        s = sgn*SGN((Q)(m->c));
                    221:                        NTOQ(q,s,t);
                    222:                        mr->c = (P)t;
                    223:                        mr->dl = m->dl;
                    224:                }
                    225:                NEXT(mr) = 0; MKDP(p->nv,mr0,*rp);
                    226:                if ( *rp )
                    227:                        (*rp)->sugar = p->sugar;
                    228:        }
                    229: }
                    230:
                    231: void dp_cont(p,rp)
                    232: DP p;
                    233: Q *rp;
                    234: {
                    235:        VECT v;
                    236:
                    237:        dp_dtov(p,&v); igcdv(v,rp);
                    238: }
                    239:
                    240: void dp_dtov(dp,rp)
                    241: DP dp;
                    242: VECT *rp;
                    243: {
                    244:        MP m,t;
                    245:        int i,n;
                    246:        VECT v;
                    247:        pointer *p;
                    248:
                    249:        m = BDY(dp);
                    250:        for ( t = m, n = 0; t; t = NEXT(t), n++ );
                    251:        MKVECT(v,n);
                    252:        for ( i = 0, p = BDY(v), t = m; i < n; t = NEXT(t), i++ )
                    253:                p[i] = (pointer)(t->c);
                    254:        *rp = v;
                    255: }
                    256:
                    257: void dp_mbase(hlist,mbase)
                    258: NODE hlist;
                    259: NODE *mbase;
                    260: {
                    261:        DL *dl;
                    262:        DL d;
                    263:        int i,j,n,nvar,td;
                    264:
                    265:        n = length(hlist); nvar = ((DP)BDY(hlist))->nv;
                    266:        dl = (DL *)MALLOC(n*sizeof(DL));
                    267:        for ( i = 0; i < n; i++, hlist = NEXT(hlist) )
                    268:                dl[i] = BDY((DP)BDY(hlist))->dl;
                    269:        NEWDL(d,nvar); *mbase = 0;
                    270:        while ( 1 ) {
                    271:                insert_to_node(d,mbase,nvar);
                    272:                for ( i = nvar-1; i >= 0; ) {
                    273:                        d->d[i]++; d->td++;
                    274:                        for ( j = 0; j < n; j++ ) {
                    275:                                if ( _dl_redble(dl[j],d,nvar) )
                    276:                                        break;
                    277:                        }
                    278:                        if ( j < n ) {
                    279:                                for ( j = nvar-1; j >= i; j-- )
                    280:                                        d->d[j] = 0;
                    281:                                for ( j = 0, td = 0; j < i; j++ )
                    282:                                        td += d->d[j];
                    283:                                d->td = td;
                    284:                                i--;
                    285:                        } else
                    286:                                break;
                    287:                }
                    288:                if ( i < 0 )
                    289:                        break;
                    290:        }
                    291: }
                    292:
                    293: int _dl_redble(d1,d2,nvar)
                    294: DL d1,d2;
                    295: int nvar;
                    296: {
                    297:        int i;
                    298:
                    299:        if ( d1->td > d2->td )
                    300:                return 0;
                    301:        for ( i = 0; i < nvar; i++ )
                    302:                if ( d1->d[i] > d2->d[i] )
                    303:                        break;
                    304:        if ( i < nvar )
                    305:                return 0;
                    306:        else
                    307:                return 1;
                    308: }
                    309:
                    310: void insert_to_node(d,n,nvar)
                    311: DL d;
                    312: NODE *n;
                    313: int nvar;
                    314: {
                    315:        DL d1;
                    316:        MP m;
                    317:        DP dp;
                    318:        NODE n0,n1,n2;
                    319:
                    320:        NEWDL(d1,nvar); d1->td = d->td;
                    321:        bcopy((char *)d->d,(char *)d1->d,nvar*sizeof(int));
                    322:        NEWMP(m); m->dl = d1; m->c = (P)ONE; NEXT(m) = 0;
                    323:        MKDP(nvar,m,dp); dp->sugar = d->td;
                    324:        if ( !(*n) ) {
                    325:                MKNODE(n1,dp,0); *n = n1;
                    326:        } else {
                    327:                for ( n1 = *n, n0 = 0; n1; n0 = n1, n1 = NEXT(n1) )
                    328:                        if ( (*cmpdl)(nvar,d,BDY((DP)BDY(n1))->dl) > 0 ) {
                    329:                                MKNODE(n2,dp,n1);
                    330:                                if ( !n0 )
                    331:                                        *n = n2;
                    332:                                else
                    333:                                        NEXT(n0) = n2;
                    334:                                break;
                    335:                        }
                    336:                if ( !n1 ) {
                    337:                        MKNODE(n2,dp,0); NEXT(n0) = n2;
                    338:                }
                    339:        }
                    340: }
                    341:
                    342: void dp_lnf_mod(p1,p2,g,mod,r1p,r2p)
                    343: DP p1,p2;
                    344: NODE g;
                    345: int mod;
                    346: DP *r1p,*r2p;
                    347: {
                    348:        DP r1,r2,b1,b2,t,s;
                    349:        P c;
                    350:        MQ c1,c2;
                    351:        NODE l,b;
                    352:        int n;
                    353:
                    354:        if ( !p1 ) {
                    355:                *r1p = p1; *r2p = p2; return;
                    356:        }
                    357:        n = p1->nv;
                    358:        for ( l = g, r1 = p1, r2 = p2; l; l = NEXT(l) ) {
                    359:                        if ( !r1 ) {
                    360:                                *r1p = r1; *r2p = r2; return;
                    361:                        }
                    362:                        b = BDY((LIST)BDY(l)); b1 = (DP)BDY(b);
                    363:                        if ( dl_equal(n,BDY(r1)->dl,BDY(b1)->dl) ) {
                    364:                                b2 = (DP)BDY(NEXT(b));
                    365:                                invmq(mod,(MQ)BDY(b1)->c,&c1);
                    366:                                mulmq(mod,c1,(MQ)BDY(r1)->c,&c2); chsgnmp(mod,(P)c2,&c);
                    367:                                mulmdc(CO,mod,b1,c,&t); addmd(CO,mod,r1,t,&s); r1 = s;
                    368:                                mulmdc(CO,mod,b2,c,&t); addmd(CO,mod,r2,t,&s); r2 = s;
                    369:                        }
                    370:        }
                    371:        *r1p = r1; *r2p = r2;
                    372: }
                    373:
                    374: void dp_nf_tab_mod(p,tab,mod,rp)
                    375: DP p;
                    376: LIST *tab;
                    377: int mod;
                    378: DP *rp;
                    379: {
                    380:        DP s,t,u;
                    381:        MP m;
                    382:        DL h;
                    383:        int i,n;
                    384:
                    385:        if ( !p ) {
                    386:                *rp = p; return;
                    387:        }
                    388:        n = p->nv;
                    389:        for ( s = 0, i = 0, m = BDY(p); m; m = NEXT(m) ) {
                    390:                h = m->dl;
                    391:                while ( !dl_equal(n,h,BDY((DP)BDY(BDY(tab[i])))->dl ) )
                    392:                        i++;
                    393:                mulmdc(CO,mod,(DP)BDY(NEXT(BDY(tab[i]))),m->c,&t);
                    394:                addmd(CO,mod,s,t,&u); s = u;
                    395:        }
                    396:        *rp = s;
                    397: }
                    398:
                    399: void dp_ptozp(p,rp)
                    400: DP p,*rp;
                    401: {
                    402:        MP m,mr,mr0;
                    403:        int i,n;
                    404:        Q *w;
                    405:        Q dvr;
                    406:        P t;
                    407:
                    408:        if ( !p )
                    409:                *rp = 0;
                    410:        else {
                    411:                for ( m =BDY(p), n = 0; m; m = NEXT(m), n++ );
                    412:                w = (Q *)ALLOCA(n*sizeof(Q));
                    413:                for ( m =BDY(p), i = 0; i < n; m = NEXT(m), i++ )
                    414:                        if ( NUM(m->c) )
                    415:                                w[i] = (Q)m->c;
                    416:                        else
                    417:                                ptozp(m->c,1,&w[i],&t);
                    418:                sortbynm(w,n);
                    419:                qltozl(w,n,&dvr);
                    420:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
                    421:                        NEXTMP(mr0,mr); divsp(CO,m->c,(P)dvr,&mr->c); mr->dl = m->dl;
                    422:                }
                    423:                NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar;
                    424:        }
                    425: }
                    426:
                    427: void dp_ptozp2(p0,p1,hp,rp)
                    428: DP p0,p1;
                    429: DP *hp,*rp;
                    430: {
                    431:        DP t,s,h,r;
                    432:        MP m,mr,mr0,m0;
                    433:
                    434:        addd(CO,p0,p1,&t); dp_ptozp(t,&s);
                    435:        if ( !p0 ) {
                    436:                h = 0; r = s;
                    437:        } else if ( !p1 ) {
                    438:                h = s; r = 0;
                    439:        } else {
                    440:                for ( mr0 = 0, m = BDY(s), m0 = BDY(p0); m0;
                    441:                        m = NEXT(m), m0 = NEXT(m0) ) {
                    442:                        NEXTMP(mr0,mr); mr->c = m->c; mr->dl = m->dl;
                    443:                }
                    444:                NEXT(mr) = 0; MKDP(p0->nv,mr0,h); MKDP(p0->nv,m,r);
                    445:        }
                    446:        if ( h )
                    447:                h->sugar = p0->sugar;
                    448:        if ( r )
                    449:                r->sugar = p1->sugar;
                    450:        *hp = h; *rp = r;
                    451: }
                    452:
                    453: struct igcdv_hist {
                    454:        int len;
                    455:        DP dp;
                    456:        Q d,d1;
                    457:        Q *q,*q1;
                    458: };
                    459:
                    460: static struct igcdv_hist current_igcdv_hist;
                    461:
                    462: void dp_igcdv_hist(p,rp)
                    463: DP p;
                    464: Q *rp;
                    465: {
                    466:        VECT c;
                    467:        Q *a,*q,*r,*q1,*r1;
                    468:        int i,n,nz;
                    469:        Q d,d1;
                    470:        N qn,rn,gn;
                    471:        struct oVECT v;
                    472:
                    473:        dp_dtov(p,&c); a = (Q *)c->body;
                    474:        n = c->len;
                    475:        q = (Q *)MALLOC(n*sizeof(Q)); r = (Q *)MALLOC(n*sizeof(Q));
                    476:        igcdv_estimate(c,&d);
                    477:        for ( i = 0, nz = 0; i < n; i++ ) {
                    478:                divn(NM(a[i]),NM(d),&qn,&rn);
                    479:                NTOQ(qn,SGN(a[i]),q[i]); NTOQ(rn,SGN(a[i]),r[i]);
                    480:                if ( r[i] )
                    481:                        nz = 1;
                    482:        }
                    483:        current_igcdv_hist.len = n;
                    484:        current_igcdv_hist.dp = p;
                    485:        current_igcdv_hist.d = d;
                    486:        current_igcdv_hist.q = q;
                    487:        if ( nz ) {
                    488:                v.id = O_VECT; v.len = n; v.body = (pointer *)r;
                    489:                igcdv(&v,&d1);
                    490:                q1 = (Q *)MALLOC(n*sizeof(Q)); r1 = (Q *)MALLOC(n*sizeof(Q));
                    491:                for ( i = 0; i < n; i++ ) {
                    492:                        if ( r[i] )
                    493:                                divn(NM(r[i]),NM(d1),&qn,&rn);
                    494:                        else {
                    495:                                qn = rn = 0;
                    496:                        }
                    497:                        NTOQ(qn,SGN(r[i]),q1[i]); NTOQ(rn,SGN(r[i]),r1[i]);
                    498:                }
                    499:                gcdn(NM(d),NM(d1),&gn); NTOQ(gn,1,*rp);
                    500:        } else {
                    501:                d1 = 0; q1 = 0; *rp = d;
                    502:        }
                    503:        current_igcdv_hist.d1 = d1;
                    504:        current_igcdv_hist.q1 = q1;
                    505: }
                    506:
                    507: void dp_idivv_hist(g,rp)
                    508: Q g;
                    509: DP *rp;
                    510: {
                    511:        int i,n;
                    512:        Q *q,*q1,*s;
                    513:        Q t,u,m;
                    514:        N qn;
                    515:
                    516:        n = current_igcdv_hist.len;
                    517:        q = current_igcdv_hist.q; q1 = current_igcdv_hist.q1;
                    518:        divsn(NM(current_igcdv_hist.d),NM(g),&qn); NTOQ(qn,1,m);
                    519:        s = (Q *)MALLOC(n*sizeof(Q));
                    520:        for ( i = 0; i < n; i++ )
                    521:                mulq(m,q[i],&s[i]);
                    522:        if ( q1 ) {
                    523:                divsn(NM(current_igcdv_hist.d1),NM(g),&qn); NTOQ(qn,1,m);
                    524:                for ( i = 0; i < n; i++ ) {
                    525:                        mulq(m,q1[i],&t); addq(t,s[i],&u); s[i] = u;
                    526:                }
                    527:        }
                    528:        dp_vtod(s,current_igcdv_hist.dp,rp);
                    529: }
                    530:
                    531: void dp_vtod(c,p,rp)
                    532: Q *c;
                    533: DP p;
                    534: DP *rp;
                    535: {
                    536:        MP mr0,m,mr;
                    537:        int i;
                    538:
                    539:        if ( !p )
                    540:                *rp = 0;
                    541:        else {
                    542:                for ( mr0 = 0, m = BDY(p), i = 0; m; m = NEXT(m), i++ ) {
                    543:                        NEXTMP(mr0,mr); mr->c = (P)c[i]; mr->dl = m->dl;
                    544:                }
                    545:                NEXT(mr) = 0; MKDP(p->nv,mr0,*rp);
                    546:                (*rp)->sugar = p->sugar;
                    547:        }
                    548: }
                    549:
                    550: #if INET
                    551: void dp_ptozp_d_old(dist,ndist,p,rp)
                    552: NODE dist;
                    553: int ndist;
                    554: DP p,*rp;
                    555: {
                    556:        DP d,s,u,su;
                    557:        MP m,mr,mr0;
                    558:        MP *w0,*w;
                    559:        Q *g;
                    560:        int i,n,nv,nsep;
                    561:        P t;
                    562:        NODE tn,n0,n1,n2;
                    563:        struct oVECT v;
                    564:        int id,sindex;
                    565:        Obj dmy;
                    566:        Q gcd;
                    567:        STRING cont,div;
                    568:
                    569:        if ( !p )
                    570:                *rp = 0;
                    571:        else {
                    572:                for ( m = BDY(p), n = 0; m; m = NEXT(m), n++ );
                    573:                nsep = ndist + 1;
                    574:                if ( n <= nsep ) {
                    575:                        dp_ptozp(p,rp); return;
                    576:                }
                    577:                nv = p->nv;
                    578:                w0 = (MP *)MALLOC(nsep*sizeof(MP)); bzero(w0,nsep*sizeof(MP));
                    579:                w = (MP *)MALLOC(nsep*sizeof(MP)); bzero(w,nsep*sizeof(MP));
                    580:                g = (Q *)MALLOC(nsep*sizeof(Q)); bzero(g,nsep*sizeof(Q));
                    581:                for ( m = BDY(p), i = 0; m; m = NEXT(m), i++, i %= nsep  ) {
                    582:                        NEXTMP(w0[i],w[i]); w[i]->c = m->c; w[i]->dl = m->dl;
                    583:                }
                    584:                MKSTR(cont,"reg_dp_cont"); MKSTR(div,"reg_dp_idiv");
                    585:
                    586:                for ( i = 0, tn = dist; i < ndist; i++, tn = NEXT(tn) ) {
                    587:                        NEXT(w[i]) = 0; MKDP(nv,w0[i],d); d->sugar = p->sugar;
                    588:                        MKNODE(n2,d,0); MKNODE(n1,cont,n2); MKNODE(n0,BDY(tn),n1);
                    589:                        Pox_rpc(n0,&dmy);
                    590:                }
                    591:                NEXT(w[i]) = 0; MKDP(nv,w0[i],d); d->sugar = p->sugar;
                    592:                dp_cont(d,&g[i]);
                    593:
                    594:                for ( i = 0, tn = dist; i < ndist; i++, tn = NEXT(tn) )
                    595:                        Pox_pop_local(tn,&g[i]);
                    596:                v.id = O_VECT; v.len = nsep; v.body = (pointer *)g; igcdv(&v,&gcd);
                    597:
                    598:                for ( i = 0, tn = dist; i < ndist; i++, tn = NEXT(tn) ) {
                    599:                        MKNODE(n2,gcd,0); MKNODE(n1,div,n2); MKNODE(n0,BDY(tn),n1);
                    600:                        Pox_rpc(n0,&dmy);
                    601:                }
                    602:                dp_idiv(d,gcd,&s);
                    603:
                    604:                for ( i = 0, tn = dist; i < ndist; i++, tn = NEXT(tn) ) {
                    605:                        Pox_pop_local(tn,&u);
                    606:                        addd(CO,s,u,&su); s = su;
                    607:                }
                    608:                *rp = s;
                    609:        }
                    610: }
                    611:
                    612: void dp_ptozp_d(dist,ndist,p,rp)
                    613: NODE dist;
                    614: int ndist;
                    615: DP p,*rp;
                    616: {
                    617:        int i,j,k,l,n,nsep;
                    618:        MP m;
                    619:        NODE tn,n0,n1,n2,n3;
                    620:        struct oVECT v;
                    621:        VECT c,cs;
                    622:        VECT qi,ri;
                    623:        LIST *qr;
                    624:        int s,id;
                    625:        Obj dmy;
                    626:        Q d0,d1,gcd,a,u,u1;
                    627:        Q *q,*r;
                    628:        STRING iqr_v;
                    629:        pointer *b;
                    630:        N qn,gn;
                    631:        double get_rtime();
                    632:        int blen;
                    633:        double t0;
                    634:        double t_e,t_d,t_d1,t_c;
                    635:
                    636:        if ( !p )
                    637:                *rp = 0;
                    638:        else {
                    639:                for ( m = BDY(p), n = 0; m; m = NEXT(m), n++ );
                    640:                nsep = ndist + 1;
                    641:                if ( n <= nsep ) {
                    642:                        dp_ptozp(p,rp); return;
                    643:                }
                    644:                t0 = get_rtime();
                    645:                dp_dtov(p,&c);
                    646:                igcdv_estimate(c,&d0);
                    647:                t_e = get_rtime()-t0;
                    648:                t0 = get_rtime();
                    649:                dp_dtov(p,&c);
                    650:                sepvect(c,nsep,&cs);
                    651:                MKSTR(iqr_v,"iqr");
                    652:                qr = (LIST *)CALLOC(nsep,sizeof(LIST));
                    653:                q = (Q *)CALLOC(n,sizeof(Q));
                    654:                r = (Q *)CALLOC(n,sizeof(Q));
                    655:                for ( i = 0, tn = dist, b = BDY(cs); i < ndist; i++, tn = NEXT(tn) ) {
                    656:                        MKNODE(n3,d0,0); MKNODE(n2,b[i],n3);
                    657:                        MKNODE(n1,iqr_v,n2); MKNODE(n0,BDY(tn),n1);
                    658:                        Pox_rpc(n0,&dmy);
                    659:                }
                    660:                iqrv(b[i],d0,&qr[i]);
                    661:                dp_dtov(p,&c);
                    662:                for ( i = 0, tn = dist; i < ndist; i++, tn = NEXT(tn) ) {
                    663:                        Pox_pop_local(tn,&qr[i]);
                    664:                        if ( OID(qr[i]) == O_ERR ) {
                    665:                                printexpr(CO,(Obj)qr[i]);
                    666:                                error("dp_ptozp_d : aborted");
                    667:                        }
                    668:                }
                    669:                t_d = get_rtime()-t0;
                    670:                t_d1 = t_d/n;
                    671:                t0 = get_rtime();
                    672:                for ( i = j = 0; i < nsep; i++ ) {
                    673:                        tn = BDY(qr[i]); qi = (VECT)BDY(tn); ri = (VECT)BDY(NEXT(tn));
                    674:                        for ( k = 0, l = qi->len; k < l; k++, j++ ) {
                    675:                                q[j] = (Q)BDY(qi)[k]; r[j] = (Q)BDY(ri)[k];
                    676:                        }
                    677:                }
                    678:                v.id = O_VECT; v.len = n; v.body = (pointer *)r; igcdv(&v,&d1);
                    679:                if ( d1 ) {
                    680:                        gcdn(NM(d0),NM(d1),&gn); NTOQ(gn,1,gcd);
                    681:                        divsn(NM(d0),gn,&qn); NTOQ(qn,1,a);
                    682:                        for ( i = 0; i < n; i++ ) {
                    683:                                mulq(a,q[i],&u);
                    684:                                if ( r[i] ) {
                    685:                                        divsn(NM(r[i]),gn,&qn); NTOQ(qn,SGN(r[i]),u1);
                    686:                                        addq(u,u1,&q[i]);
                    687:                                } else
                    688:                                        q[i] = u;
                    689:                        }
                    690:                } else
                    691:                        gcd = d0;
                    692:                dp_vtod(q,p,rp);
                    693:                t_c = get_rtime()-t0;
                    694:                blen=p_mag((P)gcd);
                    695:                pz_t_e += t_e; pz_t_d += t_d; pz_t_d1 += t_d1; pz_t_c += t_c;
                    696:                if ( 0 )
                    697:                        fprintf(stderr,"(%d,%d)",p_mag((P)d0)-blen,blen);
                    698:        }
                    699: }
                    700:
                    701: void dp_ptozp2_d(dist,ndist,p0,p1,hp,rp)
                    702: NODE dist;
                    703: int ndist;
                    704: DP p0,p1;
                    705: DP *hp,*rp;
                    706: {
                    707:        DP t,s,h,r;
                    708:        MP m,mr,mr0,m0;
                    709:
                    710:        addd(CO,p0,p1,&t); dp_ptozp_d(dist,ndist,t,&s);
                    711:        if ( !p0 ) {
                    712:                h = 0; r = s;
                    713:        } else if ( !p1 ) {
                    714:                h = s; r = 0;
                    715:        } else {
                    716:                for ( mr0 = 0, m = BDY(s), m0 = BDY(p0); m0;
                    717:                        m = NEXT(m), m0 = NEXT(m0) ) {
                    718:                        NEXTMP(mr0,mr); mr->c = m->c; mr->dl = m->dl;
                    719:                }
                    720:                NEXT(mr) = 0; MKDP(p0->nv,mr0,h); MKDP(p0->nv,m,r);
                    721:        }
                    722:        if ( h )
                    723:                h->sugar = p0->sugar;
                    724:        if ( r )
                    725:                r->sugar = p1->sugar;
                    726:        *hp = h; *rp = r;
                    727: }
                    728: #endif
                    729:
                    730: /*
                    731:  * Old codes
                    732:  */
                    733:
                    734: #if 0
                    735: void Pdp_sep(arg,rp)
                    736: NODE arg;
                    737: VECT *rp;
                    738: {
                    739:        DP p,s;
                    740:        MP m,t,mr,mr0;
                    741:        int i,j,n,d,r,q,q1,nv;
                    742:        VECT w;
                    743:        pointer *pw;
                    744:
                    745:        p = (DP)ARG0(arg); m = BDY(p);
                    746:        d = QTOS((Q)ARG1(arg));
                    747:        for ( t = m, n = 0; t; t = NEXT(t), n++ );
                    748:        if ( d > n )
                    749:                d = n;
                    750:        q = n/d; r = n%d; q1 = q+1;
                    751:        MKVECT(w,d); *rp = w;
                    752:        t = m; pw = BDY(w); nv = p->nv;
                    753:        for ( i = 0; i < r; i++ ) {
                    754:                for ( mr0 = 0, j = 0; j < q1; j++, t = NEXT(t) ) {
                    755:                        NEXTMP(mr0,mr);
                    756:                        mr->c = t->c;
                    757:                        mr->dl = t->dl;
                    758:                }
                    759:                NEXT(mr) = 0; MKDP(nv,mr0,s); s->sugar = p->sugar;
                    760:                pw[i] = (pointer)s;
                    761:        }
                    762:        for ( ; i < d; i++ ) {
                    763:                for ( mr0 = 0, j = 0; j < q; j++, t = NEXT(t) ) {
                    764:                        NEXTMP(mr0,mr);
                    765:                        mr->c = t->c;
                    766:                        mr->dl = t->dl;
                    767:                }
                    768:                NEXT(mr) = 0; MKDP(nv,mr0,s); s->sugar = p->sugar;
                    769:                pw[i] = (pointer)s;
                    770:        }
                    771: }
                    772:
                    773: void dp_ptozp_mpi(dist,ndist,p,rp)
                    774: NODE dist;
                    775: int ndist;
                    776: DP p,*rp;
                    777: {
                    778:        int i,j,k,l,n,nsep;
                    779:        MP m;
                    780:        NODE tn,n0,n1,n2,n3;
                    781:        struct oVECT v;
                    782:        VECT c,cs;
                    783:        VECT qi,ri;
                    784:        LIST *qr;
                    785:        int id;
                    786:        Obj dmy;
                    787:        Q d0,d1,gcd,a,u,u1;
                    788:        Q *q,*r;
                    789:        STRING iqr_v;
                    790:        pointer *b;
                    791:        N qn,gn;
                    792:        double get_rtime();
                    793:        int blen;
                    794:        double t0;
                    795:        double t_e,t_d,t_d1,t_c;
                    796:
                    797:        if ( !p )
                    798:                *rp = 0;
                    799:        else {
                    800:                for ( m = BDY(p), n = 0; m; m = NEXT(m), n++ );
                    801:                nsep = ndist + 1;
                    802:                if ( n <= nsep ) {
                    803:                        dp_ptozp(p,rp); return;
                    804:                }
                    805:                t0 = get_rtime();
                    806:                dp_dtov(p,&c);
                    807:                igcdv_estimate(c,&d0);
                    808:                t_e = get_rtime()-t0;
                    809:                t0 = get_rtime();
                    810:                dp_dtov(p,&c);
                    811:                sepvect(c,nsep,&cs);
                    812:                MKSTR(iqr_v,"iqr");
                    813:                qr = (LIST *)CALLOC(nsep,sizeof(LIST));
                    814:                q = (Q *)CALLOC(n,sizeof(Q));
                    815:                r = (Q *)CALLOC(n,sizeof(Q));
                    816:                for ( i = 0, tn = dist, b = BDY(cs); i < ndist;
                    817:                         i++, tn = NEXT(tn) ) {
                    818:                        div_vect_mpi(QTOS((Q)BDY(tn)),b[i],d0);
                    819:                }
                    820:                iqrv(b[i],d0,&qr[i]);
                    821:                dp_dtov(p,&c);
                    822:                for ( i = j = 0, tn = dist; i < ndist; i++, tn = NEXT(tn) ) {
                    823:                        get_div_vect_mpi(QTOS((Q)BDY(tn)),&qr[i]);
                    824:                }
                    825:                t_d = get_rtime()-t0;
                    826:                t_d1 = t_d/n;
                    827:                t0 = get_rtime();
                    828:                for ( i = j = 0; i < nsep; i++ ) {
                    829:                        tn = BDY(qr[i]); qi = (VECT)BDY(tn); ri = (VECT)BDY(NEXT(tn));
                    830:                        for ( k = 0, l = qi->len; k < l; k++, j++ ) {
                    831:                                q[j] = (Q)BDY(qi)[k]; r[j] = (Q)BDY(ri)[k];
                    832:                        }
                    833:                }
                    834:                v.id = O_VECT; v.len = n; v.body = (pointer *)r; igcdv(&v,&d1);
                    835:                if ( d1 ) {
                    836:                        gcdn(NM(d0),NM(d1),&gn); NTOQ(gn,1,gcd);
                    837:                        divsn(NM(d0),gn,&qn); NTOQ(qn,1,a);
                    838:                        for ( i = 0; i < n; i++ ) {
                    839:                                mulq(a,q[i],&u);
                    840:                                if ( r[i] ) {
                    841:                                        divsn(NM(r[i]),gn,&qn); NTOQ(qn,SGN(r[i]),u1);
                    842:                                        addq(u,u1,&q[i]);
                    843:                                } else
                    844:                                        q[i] = u;
                    845:                        }
                    846:                } else
                    847:                        gcd = d0;
                    848:                dp_vtod(q,p,rp);
                    849:                t_c = get_rtime()-t0;
                    850:                blen=p_mag(gcd);
                    851:                pz_t_e += t_e; pz_t_d += t_d; pz_t_d1 += t_d1; pz_t_c += t_c;
                    852:                if ( 0 )
                    853:                        fprintf(stderr,"(%d,%d)",p_mag(d0)-blen,blen);
                    854:        }
                    855: }
                    856:
                    857: void dp_ptozp_d(dist,ndist,p,rp)
                    858: NODE dist;
                    859: int ndist;
                    860: DP p,*rp;
                    861: {
                    862:        DP d,s,u,su;
                    863:        MP m,mr,mr0;
                    864:        MP *w0,*w;
                    865:        Q *g;
                    866:        int i,n,nv,nsep;
                    867:        P t;
                    868:        NODE tn,n0,n1,n2;
                    869:        struct oVECT v;
                    870:        int sindex,id;
                    871:        Obj dmy;
                    872:        Q gcd;
                    873:        STRING gcd_h,div_h;
                    874:
                    875:        if ( !p )
                    876:                *rp = 0;
                    877:        else {
                    878:                for ( m = BDY(p), n = 0; m; m = NEXT(m), n++ );
                    879:                nsep = ndist + 1;
                    880:                if ( n <= nsep ) {
                    881:                        dp_ptozp(p,rp); return;
                    882:                }
                    883:                nv = p->nv;
                    884:                w0 = (MP *)MALLOC(nsep*sizeof(MP)); bzero(w0,nsep*sizeof(MP));
                    885:                w = (MP *)MALLOC(nsep*sizeof(MP)); bzero(w,nsep*sizeof(MP));
                    886:                g = (Q *)MALLOC(nsep*sizeof(Q)); bzero(g,nsep*sizeof(Q));
                    887:                for ( m = BDY(p), i = 0; m; m = NEXT(m), i++, i %= nsep  ) {
                    888:                        NEXTMP(w0[i],w[i]); w[i]->c = m->c; w[i]->dl = m->dl;
                    889:                }
                    890:                MKSTR(gcd_h,"dp_igcdv_hist"); MKSTR(div_h,"dp_idivv_hist");
                    891:
                    892:                for ( i = 0, tn = dist; i < ndist; i++, tn = NEXT(tn) ) {
                    893:                        NEXT(w[i]) = 0; MKDP(nv,w0[i],d); d->sugar = p->sugar;
                    894:                        MKNODE(n2,d,0); MKNODE(n1,gcd_h,n2); MKNODE(n0,BDY(tn),n1);
                    895:                        Pox_rpc(n0,&dmy);
                    896:                }
                    897:                NEXT(w[i]) = 0; MKDP(nv,w0[i],d); d->sugar = p->sugar;
                    898:                dp_igcdv_hist(d,&g[i]);
                    899:
                    900:                for ( i = 0, tn = dist; i < ndist; i++, tn = NEXT(tn) )
                    901:                        Pox_pop_local(tn,&g[i]);
                    902:                v.id = O_VECT; v.len = nsep; v.body = (pointer *)g; igcdv(&v,&gcd);
                    903:
                    904:                for ( i = 0, tn = dist; i < ndist; i++, tn = NEXT(tn) ) {
                    905:                        MKNODE(n2,gcd,0); MKNODE(n1,div_h,n2); MKNODE(n0,BDY(tn),n1);
                    906:                        Pox_rpc(n0,&dmy);
                    907:                }
                    908:                dp_idivv_hist(gcd,&s);
                    909:
                    910:                for ( i = 0, tn = dist; i < ndist; i++, tn = NEXT(tn) ) {
                    911:                        Pox_pop_local(tn,&u);
                    912:                        addd(CO,s,u,&su); s = su;
                    913:                }
                    914:                *rp = s;
                    915:        }
                    916: }
                    917: #endif

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