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

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

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/engine/EZ.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
        !             2: #include "ca.h"
        !             3:
        !             4: void ezgcdp(vl,p1,p2,pr)
        !             5: VL vl;
        !             6: P p1,p2;
        !             7: P *pr;
        !             8: {
        !             9:        P f1,f2;
        !            10:        Q c;
        !            11:
        !            12:        if ( !p1 )
        !            13:                if ( !p2 )
        !            14:                        *pr = 0;
        !            15:                else
        !            16:                        *pr = p2;
        !            17:        else if ( !p2 )
        !            18:                *pr = p1;
        !            19:        else {
        !            20:                if ( !qpcheck((Obj)p1) || !qpcheck((Obj)p2) )
        !            21:                        error("ezgcdp : invalid argument");
        !            22:                ptozp(p1,1,&c,&f1);
        !            23:                ptozp(p2,1,&c,&f2);
        !            24:                ezgcdpz(vl,f1,f2,pr);
        !            25:        }
        !            26: }
        !            27:
        !            28: /*
        !            29:  * p1, p2 : integer coefficient
        !            30:  * returns gcd(pp(p1),pp(p2)) * gcd(cont(p1),cont(p2))
        !            31:  */
        !            32:
        !            33: void ezgcdpz(vl,p1,p2,pr)
        !            34: VL vl;
        !            35: P p1,p2,*pr;
        !            36: {
        !            37:        P f1,f2,t,s,g,gcd;
        !            38:        P fc1,fc2,cont;
        !            39:        VL tvl,svl;
        !            40:        V v1,v2;
        !            41:        DCP dc,dc1,dc2;
        !            42:        N cn;
        !            43:        Q cq;
        !            44:        Q c1,c2,c;
        !            45:        P g1,g2;
        !            46:        P mgcd;
        !            47:        extern int nez;
        !            48:        P pm[2];
        !            49:
        !            50:        if ( nez ) {
        !            51:                pm[0] = p1; pm[1] = p2; nezgcdnpz(vl,pm,2,pr); return;
        !            52:        }
        !            53:        monomialfctr(vl,p1,&f1,&dc1); p1 = f1;
        !            54:        monomialfctr(vl,p2,&f2,&dc2); p2 = f2;
        !            55:        for ( mgcd = (P)ONE; dc1; dc1 = NEXT(dc1) )
        !            56:                for ( v1 = VR(dc1->c), dc = dc2; dc; dc = NEXT(dc) )
        !            57:                        if ( v1 == VR(dc->c) ) {
        !            58:                                pwrp(vl,dc->c,cmpq(dc1->d,dc->d)>=0?dc->d:dc1->d,&t);
        !            59:                                mulp(vl,mgcd,t,&s); mgcd = s; break;
        !            60:                        }
        !            61:
        !            62:        if ( NUM(p1) ) {
        !            63:                if ( NUM(p2) ) {
        !            64:                        gcdn(NM((Q)p1),NM((Q)p2),&cn); NTOQ(cn,1,c);
        !            65:                } else {
        !            66:                        ptozp(p2,1,&c2,&t);
        !            67:                        gcdn(NM((Q)p1),NM(c2),&cn); NTOQ(cn,1,c);
        !            68:                }
        !            69:                mulp(vl,(P)c,mgcd,pr);
        !            70:                return;
        !            71:        } else if ( NUM(p2) ) {
        !            72:                ptozp(p1,1,&c1,&t);
        !            73:                gcdn(NM(c1),NM((Q)p2),&cn); NTOQ(cn,1,c);
        !            74:                mulp(vl,(P)c,mgcd,pr);
        !            75:                return;
        !            76:        }
        !            77:
        !            78:        ptozp(p1,1,&c1,&g1); ptozp(p2,1,&c2,&g2);
        !            79:        gcdn(NM(c1),NM(c2),&cn); NTOQ(cn,1,cq);
        !            80:
        !            81:        if ( ( v1 = VR(f1) ) != ( v2 = VR(f2) ) ) {
        !            82:                while ( v1 != VR(vl) && v2 != VR(vl) )
        !            83:                        vl = NEXT(vl);
        !            84:                if ( v1 == VR(vl) ) {
        !            85:                        pcp(vl,f1,&g,&fc1);
        !            86:                        ezgcdpz(vl,fc1,f2,&t);
        !            87:                } else {
        !            88:                        pcp(vl,f2,&g,&fc2);
        !            89:                        ezgcdpz(vl,fc2,f1,&t);
        !            90:                }
        !            91:                mulp(vl,t,(P)cq,&s); mulp(vl,s,mgcd,pr);
        !            92:                return;
        !            93:        }
        !            94:
        !            95:        pcp(vl,f1,&g1,&fc1); pcp(vl,f2,&g2,&fc2);
        !            96:        ezgcdpz(vl,fc1,fc2,&cont);
        !            97:        clctv(vl,g1,&tvl); clctv(vl,g2,&svl);
        !            98:        if ( !NEXT(tvl) && !NEXT(svl) ) {
        !            99:                uezgcdpz(vl,g1,g2,&t);
        !           100:                mulp(vl,t,cont,&s); mulp(vl,s,(P)cq,&t); mulp(vl,t,mgcd,pr);
        !           101:                return;
        !           102:        }
        !           103:
        !           104:        if ( homdeg(g1) > homdeg(g2) ) {
        !           105:                t = g1; g1 = g2; g2 = t;
        !           106:        }
        !           107:        sqfrp(vl,g1,&dc);
        !           108:        for ( g = g2, gcd = (P)ONE; dc && !NUM(g); dc = NEXT(dc) ) {
        !           109:                if ( NUM(COEF(dc)) )
        !           110:                        continue;
        !           111:                ezgcdpp(vl,dc,g,&t);
        !           112:                if ( NUM(t) )
        !           113:                        continue;
        !           114:                mulp(vl,gcd,t,&s); gcd = s;
        !           115:                divsp(vl,g,t,&s); g = s;
        !           116:        }
        !           117:        mulp(vl,gcd,cont,&t); mulp(vl,t,(P)cq,&s); mulp(vl,s,mgcd,pr);
        !           118: }
        !           119:
        !           120: void uezgcdpz(vl,p1,p2,pr)
        !           121: VL vl;
        !           122: P p1,p2,*pr;
        !           123: {
        !           124:        P g1,g2,gcd,t,s,g;
        !           125:        DCP dc;
        !           126:        N cn;
        !           127:        Q c1,c2,cq;
        !           128:        P f1,f2;
        !           129:
        !           130:        if ( NUM(p1) ) {
        !           131:                if ( NUM(p2) ) {
        !           132:                        gcdn(NM((Q)p1),NM((Q)p2),&cn); NTOQ(cn,1,cq),*pr = (P)cq;
        !           133:                        return;
        !           134:                } else {
        !           135:                        ptozp(p2,1,&c2,&t);
        !           136:                        gcdn(NM((Q)p1),NM(c2),&cn); NTOQ(cn,1,cq),*pr = (P)cq;
        !           137:                        return;
        !           138:                }
        !           139:        } else if ( NUM(p2) ) {
        !           140:                ptozp(p1,1,&c1,&t);
        !           141:                gcdn(NM(c1),NM((Q)p2),&cn); NTOQ(cn,1,cq),*pr = (P)cq;
        !           142:                return;
        !           143:        }
        !           144:
        !           145:        ptozp(p1,1,&c1,&f1); ptozp(p2,1,&c2,&f2);
        !           146:        gcdn(NM(c1),NM(c2),&cn); NTOQ(cn,1,cq);
        !           147:        if ( UDEG(f1) > UDEG(f2) ) {
        !           148:                g1 = f2; g2 = f1;
        !           149:        } else {
        !           150:                g1 = f1; g2 = f2;
        !           151:        }
        !           152:        usqp(g1,&dc);
        !           153:        for ( g = g2, gcd = (P)ONE; dc && !NUM(g); dc = NEXT(dc) ) {
        !           154:                if ( NUM(COEF(dc)) )
        !           155:                        continue;
        !           156:                uezgcdpp(dc,g,&t);
        !           157:                if ( NUM(t) )
        !           158:                        continue;
        !           159:                mulp(CO,gcd,t,&s); gcd = s;
        !           160:                divsp(CO,g,t,&s); g = s;
        !           161:        }
        !           162:        mulp(vl,gcd,(P)cq,pr);
        !           163: }
        !           164:
        !           165: /*
        !           166:        dc : dc pair c^d
        !           167:        r = gcd(c^d,f)
        !           168: */
        !           169:
        !           170: void ezgcdpp(vl,dc,f,r)
        !           171: VL vl;
        !           172: DCP dc;
        !           173: P f;
        !           174: P *r;
        !           175: {
        !           176:        int k;
        !           177:        P g,h,t,s,gcd;
        !           178:
        !           179:        if ( NUM(f) ) {
        !           180:                *r = (P)ONE;
        !           181:                return;
        !           182:        }
        !           183:        k = QTOS(DEG(dc)) - 1;
        !           184: /*     ezgcd1p(vl,COEF(dc),f,&gcd); */
        !           185:        ezgcdnp(vl,COEF(dc),&f,1,&gcd);
        !           186:        g = gcd; divsp(vl,f,gcd,&h);
        !           187:        for ( ; k > 0; k-- ) {
        !           188: /*             ezgcd1p(vl,g,h,&t); */
        !           189:                ezgcdnp(vl,g,&h,1,&t);
        !           190:                if ( NUM(t) )
        !           191:                        break;
        !           192:                mulp(vl,gcd,t,&s); gcd = s;
        !           193:                divsp(vl,h,t,&s); h = s;
        !           194:        }
        !           195:        *r = gcd;
        !           196: }
        !           197:
        !           198: void ezgcd1p(vl,p0,p1,gcdp)
        !           199: VL vl;
        !           200: P p0,p1;
        !           201: P *gcdp;
        !           202: {
        !           203:        VL nvl,tvl,vl0,vl1,vl2;
        !           204:        P f0,f1,t;
        !           205:
        !           206:        clctv(vl,p0,&vl0); clctv(vl,p1,&vl1); mergev(vl,vl0,vl1,&vl2);
        !           207:        minchdegp(vl,p0,&tvl,&t); reordvar(vl2,tvl->v,&nvl);
        !           208:        reorderp(nvl,vl,p0,&f0); reorderp(nvl,vl,p1,&f1);
        !           209:        ezgcdnp(nvl,f0,&f1,1,&t);
        !           210:        reorderp(vl,nvl,t,gcdp);
        !           211: }
        !           212:
        !           213: void uezgcdpp(dc,f,r)
        !           214: DCP dc;
        !           215: P f;
        !           216: P *r;
        !           217: {
        !           218:        int k;
        !           219:        P g,h,t,s,gcd;
        !           220:
        !           221:        if ( NUM(f) ) {
        !           222:                *r = (P)ONE;
        !           223:                return;
        !           224:        }
        !           225:
        !           226:        k = QTOS(DEG(dc)) - 1;
        !           227:        uezgcd1p(COEF(dc),f,&gcd);
        !           228:        g = gcd; divsp(CO,f,gcd,&h);
        !           229:        for ( ; k > 0; k-- ) {
        !           230:                uezgcd1p(g,h,&t);
        !           231:                if ( NUM(t) )
        !           232:                        break;
        !           233:                mulp(CO,gcd,t,&s); gcd = s;
        !           234:                divsp(CO,h,t,&s); h = s;
        !           235:        }
        !           236:        *r = gcd;
        !           237: }
        !           238:
        !           239: /*
        !           240:  * pr = gcd(p0,ps[0],...,ps[m-1])
        !           241:  *
        !           242:  * p0 is already square-free and primitive.
        !           243:  * ps[i] is at least primitive.
        !           244:  *
        !           245:  */
        !           246:
        !           247: void ezgcdnp(vl,p0,ps,m,pr)
        !           248: VL vl;
        !           249: int m;
        !           250: P p0,*ps,*pr;
        !           251: {
        !           252:        /* variables */
        !           253:        P p00,g,h,g0,h0,a0,b0;
        !           254:        P lp0,lgp0,lp00,lg,lg0,cbd,tq,t;
        !           255:        P *tps;
        !           256:        VL nvl1,nvl2,nvl,tvl;
        !           257:        V v;
        !           258:        int i,j,k,d0,dg,dg0,dmin;
        !           259:        VN vn0,vn1,vnt;
        !           260:        int nv,flag;
        !           261:
        !           262:        /* set-up */
        !           263:        if ( NUM(p0) ) {
        !           264:                *pr = (P) ONE;
        !           265:                return;
        !           266:        }
        !           267:        for ( v = VR(p0), i = 0; i < m; i++ )
        !           268:                if ( NUM(ps[i]) || (v != VR(ps[i])) ) {
        !           269:                        *pr = (P)ONE;
        !           270:                        return;
        !           271:                }
        !           272:        tps = (P *) ALLOCA(m*sizeof(P));
        !           273:        for ( i = 0; i < m; i++ )
        !           274:                tps[i] = ps[i];
        !           275:        sortplist(tps,m);
        !           276:        /* deg(tps[0]) <= deg(tps[1]) <= ... */
        !           277:
        !           278:        if ( !cmpq(DEG(DC(p0)),ONE) ) {
        !           279:                if ( divcheck(vl,tps,m,(P)ONE,p0) )
        !           280:                        *pr = p0;
        !           281:                else
        !           282:                        *pr = (P)ONE;
        !           283:                return;
        !           284:        }
        !           285:
        !           286:        lp0 = LC(p0); lg = lp0; dmin = d0 = deg(v,p0);
        !           287:        clctv(vl,p0,&nvl);
        !           288:        for ( i = 0; i < m; i++ ) {
        !           289:                clctv(vl,tps[i],&nvl1); mergev(vl,nvl,nvl1,&nvl2);
        !           290:                nvl = nvl2;
        !           291:                ezgcdpz(nvl,lg,LC(tps[i]),&t); lg = t;
        !           292:        }
        !           293:
        !           294:        mulp(nvl,p0,lg,&lgp0);
        !           295:        k = dbound(v,lgp0) + 1;
        !           296:        cbound(nvl,lgp0,(Q *)&cbd);
        !           297:        for ( nv = 0, tvl = nvl; tvl; tvl = NEXT(tvl), nv++ );
        !           298:        W_CALLOC(nv,struct oVN,vn0); W_CALLOC(nv,struct oVN,vnt);
        !           299:        W_CALLOC(nv,struct oVN,vn1);
        !           300:        for ( i = 0, tvl = NEXT(nvl); tvl; tvl = NEXT(tvl), i++ )
        !           301:                vn1[i].v = vn0[i].v = tvl->v;
        !           302:
        !           303:        /* main loop */
        !           304:        for ( dg = deg(v,tps[0]) + 1; ; next(vn0) )
        !           305:                do {
        !           306:                        for ( i = 0, j = 0; vn0[i].v; i++ )
        !           307:                                if ( vn0[i].n ) vnt[j++].v = (V)i;
        !           308:                        vnt[j].n = 0;
        !           309:
        !           310:                        /* find b s.t. LC(p0)(b), LC(tps[i])(b) != 0 */
        !           311:                        mulsgn(vn0,vnt,j,vn1);
        !           312:                        substvp(nvl,p0,vn1,&p00);
        !           313:                        flag = (!zerovpchk(nvl,lp0,vn1) && sqfrchk(p00));
        !           314:                        for ( i = 0; flag && (i < m); i++ )
        !           315:                                flag &= (!zerovpchk(nvl,LC(tps[i]),vn1));
        !           316:                        if ( !flag )
        !           317:                                continue;
        !           318:
        !           319:                        /* substitute y -> b */
        !           320:                        substvp(nvl,lg,vn1,&lg0);
        !           321:                        lp00 = LC(p00);
        !           322:                        /* extended-gcd in 1-variable */
        !           323:                        uexgcdnp(nvl,p00,tps,m,vn1,(Q)cbd,&g0,&h0,&a0,&b0,(Q *)&tq);
        !           324:                        if ( NUM(g0) ) {
        !           325:                                *pr = (P)ONE;
        !           326:                                return;
        !           327:                        } else if ( dg > ( dg0 = deg(v,g0) ) ) {
        !           328:                                dg = dg0;
        !           329:                                if ( dg == d0 ) {
        !           330:                                        if ( divcheck(nvl,tps,m,lp0,p0) ) {
        !           331:                                                *pr = p0;
        !           332:                                                return;
        !           333:                                        }
        !           334:                                } else if ( dg == deg(v,tps[0]) ) {
        !           335:                                        if ( divtpz(nvl,p0,tps[0],&t) &&
        !           336:                                                divcheck(nvl,tps+1,m-1,LC(tps[0]),tps[0]) ) {
        !           337:                                                *pr = tps[0];
        !           338:                                                return;
        !           339:                                        } else
        !           340:                                                break;
        !           341:                                } else {
        !           342:                                        henmv(nvl,vn1,lgp0,g0,h0,a0,b0,
        !           343:                                                lg,lp0,lg0,lp00,(Q)tq,k,&g,&h);
        !           344:                                        if ( divtpz(nvl,lgp0,g,&t) &&
        !           345:                                                divcheck(nvl,tps,m,lg,g) ) {
        !           346:                                                pcp(nvl,g,pr,&t);
        !           347:                                                return;
        !           348:                                        }
        !           349:                                }
        !           350:                        }
        !           351:                } while ( !nextbin(vnt,j) );
        !           352: }
        !           353:
        !           354: /*
        !           355:        f : sqfr
        !           356: */
        !           357:
        !           358: void uezgcd1p(f,g,r)
        !           359: P f,g;
        !           360: P *r;
        !           361: {
        !           362:        UM wf,wf1,wf2,wg,wg1,wgcd,wcof;
        !           363:        int d1,d2,dg,m,index,n;
        !           364:        ML list;
        !           365:        DCP dc;
        !           366:        P t;
        !           367:        Q c;
        !           368:
        !           369:        if ( NUM(f) || NUM(g) ) {
        !           370:                *r = (P)ONE;
        !           371:                return;
        !           372:        }
        !           373:        ptozp(f,1,&c,&t); f = t; ptozp(g,1,&c,&t); g = t;
        !           374:        d1 = UDEG(f); d2 = UDEG(g);
        !           375:        n = MAX(d1,d2)+1;
        !           376:        wf = W_UMALLOC(n); wf1 = W_UMALLOC(n);
        !           377:        wf2 = W_UMALLOC(n); wg = W_UMALLOC(n);
        !           378:        wg1 = W_UMALLOC(n); wgcd = W_UMALLOC(n);
        !           379:        wcof = W_UMALLOC(n);
        !           380:
        !           381:        for ( index = INDEX, dg = MIN(d1,d2)+1; ; ) {
        !           382:                m = sprime[index++];
        !           383:                if ( !rem(NM((Q)UCOEF(f)),m) || !rem(NM((Q)UCOEF(g)),m))
        !           384:                        continue;
        !           385:                ptoum(m,f,wf); cpyum(wf,wf1);
        !           386:                diffum(m,wf1,wf2); gcdum(m,wf1,wf2,wgcd);
        !           387:                if ( DEG(wgcd) > 0 )
        !           388:                        continue;
        !           389:                ptoum(m,g,wg); cpyum(wg,wg1); cpyum(wf,wf1);
        !           390:                gcdum(m,wf1,wg1,wgcd);
        !           391:                if ( dg <= DEG(wgcd) )
        !           392:                        continue;
        !           393:                else
        !           394:                        dg = DEG(wgcd);
        !           395:                if ( dg == 0 ) {
        !           396:                        *r = (P)ONE;
        !           397:                        return;
        !           398:                } else if ( dg == d1 ) {
        !           399:                        if ( divtpz(CO,g,f,&t) ) {
        !           400:                                *r = f;
        !           401:                                return;
        !           402:                        }
        !           403:                } else if ( dg == d2 ) {
        !           404:                        if ( divtpz(CO,f,g,&t) ) {
        !           405:                                *r = g;
        !           406:                                return;
        !           407:                        }
        !           408:                } else {
        !           409:                        divum(m,wf,wgcd,wcof);
        !           410:                        ezgcdhensel(f,m,wcof,wgcd,&list);
        !           411:                        dtest(f,list,1,&dc);
        !           412:                        if ( NEXT(dc) ) {
        !           413:                                if ( divtpz(CO,g,COEF(dc),&t) ) {
        !           414:                                        *r = COEF(dc);
        !           415:                                        return;
        !           416:                                }
        !           417:                        }
        !           418:                }
        !           419:        }
        !           420: }
        !           421:
        !           422: void uexgcdnp(vl,p1,ps,n,vn,cbd,g,h,a,b,q)
        !           423: VL vl;
        !           424: P p1;
        !           425: P *ps;
        !           426: int n;
        !           427: VN vn;
        !           428: Q cbd;
        !           429: P *g,*h,*a,*b;
        !           430: Q *q;
        !           431: {
        !           432:        UM wg,wh,wg1,wh1,wgcd,wt;
        !           433:        P t,s,gcd,cof,gk,hk,ak,bk;
        !           434:        Q c,tq,bb,tq1,qk;
        !           435:        int mod,k,i,index,d;
        !           436:
        !           437:        ptozp(p1,1,&c,&gcd);
        !           438:        for ( i = 0; i < n; i++ ) {
        !           439:                substvp(vl,ps[i],vn,&t);
        !           440:                uezgcd1p(gcd,t,&s);
        !           441:                if ( NUM(s) ) {
        !           442:                        *g = (P)ONE; *h = p1; *a = 0; *b = (P)ONE;
        !           443:                        return;
        !           444:                } else
        !           445:                        gcd = s;
        !           446:        }
        !           447:
        !           448:        if ( !dcomp(p1,gcd) ) {
        !           449:                *g = p1; *h = (P)ONE; *a = 0; *b = (P)ONE;
        !           450:                return;
        !           451:        }
        !           452:
        !           453:        divsp(CO,p1,gcd,&cof);
        !           454:        d = UDEG(p1)+1;
        !           455:        wg = W_UMALLOC(d); wh = W_UMALLOC(d);
        !           456:        wg1 = W_UMALLOC(d); wh1 = W_UMALLOC(d);
        !           457:        wgcd = W_UMALLOC(d); wt = W_UMALLOC(d);
        !           458:        for ( index = INDEX; ; ) {
        !           459:                mod = sprime[index++];
        !           460:                if ( !rem(NM((Q)LC(p1)),mod) )
        !           461:                        continue;
        !           462:                ptoum(mod,gcd,wg); ptoum(mod,cof,wh);
        !           463:                cpyum(wg,wg1); cpyum(wh,wh1);
        !           464:                gcdum(mod,wg,wh,wt); cpyum(wt,wgcd);
        !           465:                if ( DEG(wgcd) > 0 )
        !           466:                        continue;
        !           467:                STOQ(mod,tq); addq(cbd,cbd,&bb);
        !           468:                for ( k = 1; cmpq(tq,bb) < 0; k++ ) {
        !           469:                        mulq(tq,tq,&tq1); tq = tq1;
        !           470:                }
        !           471:                henzq(p1,gcd,wg1,cof,wh1,mod,k,&gk,&hk,&bk,&ak,&qk);
        !           472:                break;
        !           473:        }
        !           474:        *g = gk; *h = hk; *a = ak; *b = bk; *q = tq;
        !           475: }
        !           476:
        !           477: void ezgcdhensel(f,mod,cof,gcd,listp)
        !           478: P f;
        !           479: int mod;
        !           480: UM gcd,cof;
        !           481: ML *listp;
        !           482: {
        !           483:        register int i,j;
        !           484:        int q,n,bound;
        !           485:        int *p;
        !           486:        int **pp;
        !           487:        ML blist,clist,bqlist,cqlist,rlist;
        !           488:        UM *b;
        !           489:        LUM fl,tl;
        !           490:        LUM *l;
        !           491:        LUM LUMALLOC();
        !           492:
        !           493:        blist = W_MLALLOC(2);
        !           494:        blist->n = 2; blist->mod = mod;
        !           495:        blist->c[0] = (pointer)cof; blist->c[1] = (pointer)gcd;
        !           496:        gcdgen(f,blist,&clist);
        !           497:        henprep(f,blist,clist,&bqlist,&cqlist);
        !           498:        n = bqlist->n; q = bqlist->mod;
        !           499:        bqlist->bound = cqlist->bound = bound = mignotte(q,f);
        !           500:
        !           501:        if ( bound == 1 ) {
        !           502:                *listp = rlist = MLALLOC(n);
        !           503:                rlist->n = n;
        !           504:                rlist->mod = q;
        !           505:                rlist->bound = bound;
        !           506:
        !           507:                for ( i = 0, b = (UM *)bqlist->c, l = (LUM *)rlist->c;
        !           508:                        i < n; i++ ) {
        !           509:                        tl = LUMALLOC(DEG(b[i]),1);
        !           510:                        l[i] = tl;
        !           511:                        p = COEF(b[i]);
        !           512:
        !           513:                        for ( j = 0, pp = COEF(tl);
        !           514:                                  j <= DEG(tl); j++ )
        !           515:                                        pp[j][0] = p[j];
        !           516:                }
        !           517:        } else {
        !           518:                W_LUMALLOC((int)UDEG(f),bound,fl);
        !           519:                ptolum(q,bound,f,fl);
        !           520:                henmain(fl,bqlist,cqlist,listp);
        !           521:        }
        !           522: }
        !           523:
        !           524: void ezgcdnpz(vl,ps,m,pr)
        !           525: VL vl;
        !           526: P *ps,*pr;
        !           527: int m;
        !           528: {
        !           529:        P t,s,gcd;
        !           530:        P cont;
        !           531:        VL tvl,svl,nvl;
        !           532:        int i;
        !           533:        DCP dc;
        !           534:        N cn;
        !           535:        Q cq;
        !           536:        P *pl,*ppl,*pcl;
        !           537:        Q *cl;
        !           538:        V v;
        !           539:
        !           540:        pl = (P *)ALLOCA((m+1)*sizeof(P));
        !           541:        cl = (Q *)ALLOCA((m+1)*sizeof(Q));
        !           542:        for ( i = 0; i < m; i++ )
        !           543:                ptozp(ps[i],1,&cl[i],&pl[i]);
        !           544:        for ( i = 1, cq = cl[0]; i < m; i++ ) {
        !           545:                gcdn(NM(cl[i]),NM(cq),&cn); NTOQ(cn,1,cq);
        !           546:        }
        !           547:        for ( i = 0; i < m; i++ )
        !           548:                if ( NUM(pl[i]) ) {
        !           549:                        *pr = (P)cq;
        !           550:                        return;
        !           551:                }
        !           552:
        !           553:        for ( i = 0, nvl = 0; i < m; i++ ) {
        !           554:                clctv(vl,ps[i],&tvl); mergev(vl,nvl,tvl,&svl); nvl = svl;
        !           555:        }
        !           556:
        !           557:        ppl = (P *)ALLOCA((m+1)*sizeof(P));
        !           558:        pcl = (P *)ALLOCA((m+1)*sizeof(P));
        !           559:        for ( i = 0, v = nvl->v; i < m; i++ )
        !           560:                if ( v == VR(pl[i]) )
        !           561:                        pcp(nvl,pl[i],&ppl[i],&pcl[i]);
        !           562:                else {
        !           563:                        ppl[i] = (P)ONE; pcl[i] = pl[i];
        !           564:                }
        !           565:        ezgcdnpz(nvl,pcl,m,&cont);
        !           566:
        !           567:        for ( i = 0; i < m; i++ )
        !           568:                if ( NUM(ppl[i]) ) {
        !           569:                        mulp(nvl,cont,(P)cq,pr);
        !           570:                        return;
        !           571:                }
        !           572:        sortplist(ppl,m);
        !           573:        sqfrp(nvl,ppl[0],&dc);
        !           574:        for ( dc = NEXT(dc), gcd = (P)ONE; dc; dc = NEXT(dc) ) {
        !           575:                if ( NUM(COEF(dc)) )
        !           576:                        continue;
        !           577:                ezgcdnpp(vl,dc,ppl+1,m-1,&t);
        !           578:                if ( NUM(t) )
        !           579:                        continue;
        !           580:                mulp(vl,gcd,t,&s); gcd = s;
        !           581:        }
        !           582:        mulp(vl,gcd,cont,&t); mulp(vl,t,(P)cq,pr);
        !           583: }
        !           584:
        !           585: void ezgcdnpp(vl,dc,pl,m,r)
        !           586: VL vl;
        !           587: DCP dc;
        !           588: P *pl;
        !           589: int m;
        !           590: P *r;
        !           591: {
        !           592:        int i,k;
        !           593:        P g,t,s,gcd;
        !           594:        P *pm;
        !           595:
        !           596:        ezgcdnp(vl,COEF(dc),pl,m,&gcd);
        !           597:        if ( NUM(gcd) ) {
        !           598:                *r = (P)ONE;
        !           599:                return;
        !           600:        }
        !           601:        pm = (P *) ALLOCA((m+1)*sizeof(P));
        !           602:        for ( i = 0; i < m; i++ ) {
        !           603:                divsp(vl,pl[i],gcd,&pm[i]);
        !           604:                if ( NUM(pm[i]) ) {
        !           605:                        *r = gcd;
        !           606:                        return;
        !           607:                }
        !           608:        }
        !           609:        for ( g = gcd, k = QTOS(DEG(dc)) - 1; k > 0; k-- ) {
        !           610:                ezgcdnp(vl,g,pm,m,&t);
        !           611:                if ( NUM(t) )
        !           612:                        break;
        !           613:                mulp(vl,gcd,t,&s); gcd = s;
        !           614:                for ( i = 0; i < m; i++ ) {
        !           615:                        divsp(vl,pm[i],t,&s);
        !           616:                        if ( NUM(s) ) {
        !           617:                                *r = gcd;
        !           618:                                return;
        !           619:                        }
        !           620:                        pm[i] = s;
        !           621:                }
        !           622:        }
        !           623:        *r = gcd;
        !           624: }
        !           625:
        !           626: void pcp(vl,p,pp,c)
        !           627: VL vl;
        !           628: P p;
        !           629: P *pp,*c;
        !           630: {
        !           631:        P f,g,n;
        !           632:        DCP dc;
        !           633:        P *pl;
        !           634:        int i,m;
        !           635:        extern int nez;
        !           636:
        !           637:        if ( NUM(p) ) {
        !           638:                *c = p;
        !           639:                *pp = (P)ONE;
        !           640:        } else {
        !           641:                for ( m = 0, dc = DC(p); dc; dc = NEXT(dc), m++ );
        !           642:                if ( m == 1 ) {
        !           643:                        *c = COEF(DC(p));
        !           644:                        divsp(vl,p,*c,pp);
        !           645:                        return;
        !           646:                }
        !           647:                ptozp(p,1,(Q *)&n,&f);
        !           648:                pl = (P *)ALLOCA((m+1)*sizeof(P));
        !           649:                for ( i = 0, dc = DC(f); i < m; dc = NEXT(dc), i++ )
        !           650:                        pl[i] = COEF(dc);
        !           651:                if ( nez )
        !           652:                        nezgcdnpz(vl,pl,m,&g);
        !           653:                else
        !           654:                        ezgcdnpz(vl,pl,m,&g);
        !           655:                mulp(vl,g,n,c); divsp(vl,f,g,pp);
        !           656:        }
        !           657: }
        !           658:
        !           659: #if 0
        !           660: pcp(vl,p,pp,c)
        !           661: VL vl;
        !           662: P p;
        !           663: P *pp,*c;
        !           664: {
        !           665:        P f,g,n,t;
        !           666:        DCP dc;
        !           667:
        !           668:        if ( NUM(p) ) {
        !           669:                *c = p;
        !           670:                *pp = (P)ONE;
        !           671:        } else {
        !           672:                ptozp(p,1,&n,&f);
        !           673:                for ( g = LC(f), dc = NEXT(DC(f)); dc; dc = NEXT(dc) ) {
        !           674:                        ezgcdpz(vl,g,COEF(dc),&t); g = t;
        !           675:                }
        !           676:                mulp(vl,g,n,c);
        !           677:                divsp(vl,f,g,pp);
        !           678:        }
        !           679: }
        !           680: #endif
        !           681:
        !           682: int divcheck(vl,ps,m,l,p)
        !           683: VL vl;
        !           684: int m;
        !           685: P *ps,l,p;
        !           686: {
        !           687:        int i;
        !           688:        P r,t;
        !           689:
        !           690:        for ( i = 0; i < m; i++ ) {
        !           691:                mulp(vl,ps[i],l,&t);
        !           692:                if ( !divtpz(vl,t,p,&r) )
        !           693:                        return ( 0 );
        !           694:        }
        !           695:        return ( 1 );
        !           696: }
        !           697:
        !           698: void sortplist(plist,n)
        !           699: P *plist;
        !           700: int n;
        !           701: {
        !           702:        int i,j;
        !           703:        P t;
        !           704:
        !           705:        for ( i = 0; i < n; i++ )
        !           706:                for ( j = i + 1; j < n; j++ )
        !           707:                        if ( cmpq(DEG(DC(plist[i])),DEG(DC(plist[j]))) > 0 ) {
        !           708:                                t = plist[i]; plist[i] = plist[j]; plist[j] = t;
        !           709:                        }
        !           710: }
        !           711:
        !           712: int dcomp(p1,p2)
        !           713: P p1,p2;
        !           714: {
        !           715:        return ( cmpq(DEG(DC(p1)),DEG(DC(p2))) );
        !           716: }

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