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

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

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/engine/F.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
        !             2: #include "ca.h"
        !             3: #include <math.h>
        !             4:
        !             5: void homfctr();
        !             6:
        !             7: void fctrp(vl,f,dcp)
        !             8: VL vl;
        !             9: P f;
        !            10: DCP *dcp;
        !            11: {
        !            12:        VL nvl;
        !            13:        DCP dc;
        !            14:
        !            15:        if ( !f || NUM(f) ) {
        !            16:                NEWDC(dc); COEF(dc) = f; DEG(dc) = ONE;
        !            17:                NEXT(dc) = 0; *dcp = dc;
        !            18:                return;
        !            19:        } else if ( !qpcheck((Obj)f) )
        !            20:                error("fctrp : invalid argument");
        !            21:        else {
        !            22:                clctv(vl,f,&nvl);
        !            23:                if ( !NEXT(nvl) )
        !            24:                        ufctr(f,1,dcp);
        !            25:                else
        !            26:                        mfctr(nvl,f,dcp);
        !            27:        }
        !            28: }
        !            29:
        !            30: void homfctr(vl,g,dcp)
        !            31: VL vl;
        !            32: P g;
        !            33: DCP *dcp;
        !            34: {
        !            35:        P s,t,u,f,h,x;
        !            36:        Q e;
        !            37:        int d,d0;
        !            38:        DCP dc,dct;
        !            39:
        !            40:        substp(vl,g,vl->v,(P)ONE,&t); fctrp(vl,t,&dc); MKV(vl->v,x);
        !            41:        for ( dct = dc; dct; dct = NEXT(dct) )
        !            42:                if ( !NUM(dc->c) ) {
        !            43:                        for ( s = 0, f = dc->c, d = d0 = homdeg(f); f; d = homdeg(f) ) {
        !            44:                                exthp(vl,f,d,&h); STOQ(d0-d,e); pwrp(vl,x,e,&t);
        !            45:                                mulp(vl,t,h,&u); addp(vl,s,u,&t); s = t;
        !            46:                                subp(vl,f,h,&u); f = u;
        !            47:                        }
        !            48:                        dc->c = s;
        !            49:                }
        !            50:        *dcp = dc;
        !            51: }
        !            52:
        !            53: void mfctr(vl,f,dcp)
        !            54: VL vl;
        !            55: P f;
        !            56: DCP *dcp;
        !            57: {
        !            58:        DCP dc,dc0,dct,dcs,dcr;
        !            59:        P p,pmin,ppmin,cmin,t;
        !            60:        VL mvl;
        !            61:        Q c;
        !            62:
        !            63:        ptozp(f,1,&c,&p);
        !            64:        NEWDC(dc0); dc = dc0; COEF(dc) = (P)c; DEG(dc) = ONE; NEXT(dc) = 0;
        !            65:        msqfr(vl,p,&dct);
        !            66:        for ( ; dct; dct = NEXT(dct) ) {
        !            67:                mindegp(vl,COEF(dct),&mvl,&pmin);
        !            68: #if 0
        !            69:                minlcdegp(vl,COEF(dct),&mvl,&pmin);
        !            70:                min_common_vars_in_coefp(vl,COEF(dct),&mvl,&pmin);
        !            71: #endif
        !            72:                pcp(mvl,pmin,&ppmin,&cmin);
        !            73:                if ( !NUM(cmin) ) {
        !            74:                        mfctrmain(mvl,cmin,&dcs);
        !            75:                        for ( dcr = dcs; dcr; dcr = NEXT(dcr) ) {
        !            76:                                DEG(dcr) = DEG(dct);
        !            77:                                reorderp(vl,mvl,COEF(dcr),&t); COEF(dcr) = t;
        !            78:                        }
        !            79:                        for ( ; NEXT(dc); dc = NEXT(dc) );
        !            80:                        NEXT(dc) = dcs;
        !            81:                }
        !            82:                mfctrmain(mvl,ppmin,&dcs);
        !            83:                for ( dcr = dcs; dcr; dcr = NEXT(dcr) ) {
        !            84:                        DEG(dcr) = DEG(dct);
        !            85:                        reorderp(vl,mvl,COEF(dcr),&t); COEF(dcr) = t;
        !            86:                }
        !            87:                for ( ; NEXT(dc); dc = NEXT(dc) );
        !            88:                NEXT(dc) = dcs;
        !            89:        }
        !            90:        adjsgn(f,dc0); *dcp = dc0;
        !            91: }
        !            92:
        !            93: void adjsgn(p,dc)
        !            94: P p;
        !            95: DCP dc;
        !            96: {
        !            97:        int sgn;
        !            98:        DCP dct;
        !            99:        P c;
        !           100:
        !           101:        for ( dct = dc, sgn = headsgn(p); dct; dct = NEXT(dct) )
        !           102:                if ( !EVENN(NM(dct->d)) )
        !           103:                        sgn *= headsgn(COEF(dct));
        !           104:        if ( sgn < 0 ) {
        !           105:                chsgnp(COEF(dc),&c); COEF(dc) = c;
        !           106:        }
        !           107: }
        !           108:
        !           109: int headsgn(p)
        !           110: P p;
        !           111: {
        !           112:        if ( !p )
        !           113:                return 0;
        !           114:        else {
        !           115:                while ( !NUM(p) )
        !           116:                        p = COEF(DC(p));
        !           117:                return SGN((Q)p);
        !           118:        }
        !           119: }
        !           120:
        !           121: void fctrwithmvp(vl,f,v,dcp)
        !           122: VL vl;
        !           123: P f;
        !           124: V v;
        !           125: DCP *dcp;
        !           126: {
        !           127:        VL nvl;
        !           128:        DCP dc;
        !           129:
        !           130:        if ( NUM(f) ) {
        !           131:                NEWDC(dc); COEF(dc) = f; DEG(dc) = ONE;
        !           132:                NEXT(dc) = 0; *dcp = dc;
        !           133:                return;
        !           134:        }
        !           135:
        !           136:        clctv(vl,f,&nvl);
        !           137:        if ( !NEXT(nvl) )
        !           138:                ufctr(f,1,dcp);
        !           139:        else
        !           140:                mfctrwithmv(nvl,f,v,dcp);
        !           141: }
        !           142:
        !           143: void mfctrwithmv(vl,f,v,dcp)
        !           144: VL vl;
        !           145: P f;
        !           146: V v;
        !           147: DCP *dcp;
        !           148: {
        !           149:        DCP dc,dc0,dct,dcs,dcr;
        !           150:        P p,pmin,ppmin,cmin,t;
        !           151:        VL mvl;
        !           152:        Q c;
        !           153:
        !           154:        ptozp(f,1,&c,&p);
        !           155:        NEWDC(dc0); dc = dc0; COEF(dc) = (P)c; DEG(dc) = ONE; NEXT(dc) = 0;
        !           156:        msqfr(vl,p,&dct);
        !           157:        for ( ; dct; dct = NEXT(dct) ) {
        !           158:                if ( !v )
        !           159:                        mindegp(vl,COEF(dct),&mvl,&pmin);
        !           160:                else {
        !           161:                        reordvar(vl,v,&mvl); reorderp(mvl,vl,COEF(dct),&pmin);
        !           162:                }
        !           163:                pcp(mvl,pmin,&ppmin,&cmin);
        !           164:                if ( !NUM(cmin) ) {
        !           165:                        mfctrmain(mvl,cmin,&dcs);
        !           166:                        for ( dcr = dcs; dcr; dcr = NEXT(dcr) ) {
        !           167:                                DEG(dcr) = DEG(dct);
        !           168:                                reorderp(vl,mvl,COEF(dcr),&t); COEF(dcr) = t;
        !           169:                        }
        !           170:                        for ( ; NEXT(dc); dc = NEXT(dc) );
        !           171:                        NEXT(dc) = dcs;
        !           172:                }
        !           173:                mfctrmain(mvl,ppmin,&dcs);
        !           174:                for ( dcr = dcs; dcr; dcr = NEXT(dcr) ) {
        !           175:                        DEG(dcr) = DEG(dct);
        !           176:                        reorderp(vl,mvl,COEF(dcr),&t); COEF(dcr) = t;
        !           177:                }
        !           178:                for ( ; NEXT(dc); dc = NEXT(dc) );
        !           179:                NEXT(dc) = dcs;
        !           180:        }
        !           181:        *dcp = dc0;
        !           182: }
        !           183:
        !           184: void ufctr(f,hint,dcp)
        !           185: P f;
        !           186: int hint;
        !           187: DCP *dcp;
        !           188: {
        !           189:        P p,c;
        !           190:        DCP dc,dct,dcs,dcr;
        !           191:
        !           192:        ptozp(f,SGN((Q)UCOEF(f)),(Q *)&c,&p);
        !           193:        NEWDC(dc); COEF(dc) = c; DEG(dc) = ONE; NEXT(dc) = 0;
        !           194:        usqp(p,&dct);
        !           195:        for ( *dcp = dc; dct; dct = NEXT(dct) ) {
        !           196:                ufctrmain(COEF(dct),hint,&dcs);
        !           197:                for ( dcr = dcs; dcr; dcr = NEXT(dcr) )
        !           198:                        DEG(dcr) = DEG(dct);
        !           199:                for ( ; NEXT(dc); dc = NEXT(dc) );
        !           200:                NEXT(dc) = dcs;
        !           201:        }
        !           202: }
        !           203:
        !           204: void mfctrmain(vl,p,dcp)
        !           205: VL vl;
        !           206: P p;
        !           207: DCP *dcp;
        !           208: {
        !           209:        int i,j,k,*win,np;
        !           210:        VL nvl,tvl;
        !           211:        VN vn,vnt,vn1;
        !           212:        P p0,f,g,f0,g0,s,t,lp,m;
        !           213:        P *fp0,*fpt,*l,*tl;
        !           214:        DCP dc,dc0,dcl;
        !           215:        int count,nv;
        !           216:
        !           217:        if ( !cmpq(DEG(DC(p)),ONE) ) {
        !           218:                NEWDC(dc); DEG(dc) = ONE; COEF(dc) = p; NEXT(dc) = 0;
        !           219:                *dcp = dc; return;
        !           220:        }
        !           221:        lp = LC(p); fctrp(vl,lp,&dcl); clctv(vl,p,&nvl);
        !           222:        for ( nv = 0, tvl = nvl; tvl; tvl = NEXT(tvl), nv++);
        !           223:        W_CALLOC(nv,struct oVN,vn); W_CALLOC(nv,struct oVN,vnt);
        !           224:        W_CALLOC(nv,struct oVN,vn1);
        !           225:        for ( i = 0, tvl = NEXT(nvl); tvl; tvl = NEXT(tvl), i++ )
        !           226:                vn1[i].v = vn[i].v = tvl->v;
        !           227:        vn1[i].v = vn[i].v = 0;
        !           228:        count = 0;
        !           229:        while  ( 1 ) {
        !           230:                while ( 1 ) {
        !           231:                        count++;
        !           232:                        for ( i = 0, j = 0; vn[i].v; i++ )
        !           233:                                if ( vn[i].n )
        !           234:                                        vnt[j++].v = (V)i;
        !           235:                        vnt[j].n = 0; mulsgn(vn,vnt,j,vn1);
        !           236:                        for ( i = 0; vn1[i].v; i++ )
        !           237:                                if ( vn1[i].n ) {
        !           238:                                        if ( vn1[i].n > 0 )
        !           239:                                                vn1[i].n = sprime[vn1[i].n];
        !           240:                                        else
        !           241:                                                vn1[i].n = -sprime[-vn1[i].n];
        !           242:                                }
        !           243:                        if ( valideval(nvl,dcl,vn1) ) {
        !           244:                                substvp(nvl,p,vn1,&p0);
        !           245:                                if ( sqfrchk(p0) ) {
        !           246:                                        ufctr(p0,1,&dc0);
        !           247:                                        if ( NEXT(NEXT(dc0)) == 0 ) {
        !           248:                                                NEWDC(dc); DEG(dc) = ONE; COEF(dc) = p; NEXT(dc) = 0;
        !           249:                                                *dcp = dc;
        !           250:                                                return;
        !           251:                                        } else
        !           252:                                                goto MAIN;
        !           253:                                }
        !           254:                        }
        !           255:                        if ( nextbin(vnt,j) )
        !           256:                                break;
        !           257:                }
        !           258:                next(vn);
        !           259:        }
        !           260: MAIN :
        !           261: #if 0
        !           262:        for ( i = 0; vn1[i].v; i++ )
        !           263:                fprintf(stderr,"%d ",vn1[i].n);
        !           264:        fprintf(stderr,"\n");
        !           265: #endif
        !           266:        for ( np = 0, dc = NEXT(dc0); dc; dc = NEXT(dc), np++ );
        !           267:        fp0 = (P *)ALLOCA((np + 1)*sizeof(P));
        !           268:        fpt = (P *)ALLOCA((np + 1)*sizeof(P));
        !           269:        l = tl = (P *)ALLOCA((np + 1)*sizeof(P));
        !           270:        for ( i = 1, dc = NEXT(dc0); dc; i++, dc = NEXT(dc) )
        !           271:                fp0[i-1] = COEF(dc);
        !           272: #if 0
        !           273:        sort_by_deg(np,fp0,fpt);
        !           274:        sort_by_deg_rev(np-1,fpt+1,fp0+1);
        !           275: #endif
        !           276: #if 0
        !           277:        sort_by_deg_rev(np,fp0,fpt); fp0[0] = fpt[0];
        !           278:        sort_by_deg(np-1,fpt+1,fp0+1); fp0[np] = 0;
        !           279: #endif
        !           280:        fp0[np] = 0;
        !           281:        win = W_ALLOC(np + 1); f = p; divsp(vl,p0,COEF(dc0),&f0);
        !           282:        for ( k = 1, win[0] = 1, --np; ; ) {
        !           283:                P h0,lcg,lch;
        !           284:                Q c;
        !           285:
        !           286:                g0 = fp0[win[0]];
        !           287:                for ( i = 1; i < k; i++ ) {
        !           288:                        mulp(vl,g0,fp0[win[i]],&m); g0 = m;
        !           289:                }
        !           290:                mulq((Q)LC(g0),(Q)COEF(dc0),&c); estimatelc(nvl,c,dcl,vn1,&lcg);
        !           291:                divsp(nvl,f0,g0,&h0);
        !           292:                mulq((Q)LC(h0),(Q)COEF(dc0),&c); estimatelc(nvl,c,dcl,vn1,&lch);
        !           293:                mfctrhen2(nvl,vn1,f,f0,g0,h0,lcg,lch,&g);
        !           294:                if ( g ) {
        !           295:                        *tl++ = g; divsp(vl,f,g,&t);
        !           296:                        f = t; divsp(vl,f0,g0,&t); ptozp(t,1,(Q *)&s,&f0);
        !           297:                        for ( i = 0; i < k - 1; i++ )
        !           298:                                for ( j = win[i] + 1; j < win[i + 1]; j++ )
        !           299:                                        fp0[j - i - 1] = fp0[j];
        !           300:                        for ( j = win[k - 1] + 1; j <= np; j++ )
        !           301:                                        fp0[j - k] = fp0[j];
        !           302:                        if ( ( np -= k ) < k ) break;
        !           303:                        if ( np - win[0] + 1 < k )
        !           304:                                if ( ++k <= np ) {
        !           305:                                        for ( i = 0; i < k; i++ ) win[i] = i + 1;
        !           306:                                        continue;
        !           307:                                } else
        !           308:                                        break;
        !           309:                        else for ( i = 1; i < k; i++ ) win[i] = win[0] + i;
        !           310:                } else {
        !           311:                        if ( ncombi(1,np,k,win) == 0 )
        !           312:                                if ( k == np ) break;
        !           313:                                else for ( i = 0, ++k; i < k; i++ ) win[i] = i + 1;
        !           314:                }
        !           315:        }
        !           316:        *tl++ = f; *tl = 0;
        !           317:        for ( dc0 = 0; *l; l++ ) {
        !           318:                NEXTDC(dc0,dc); DEG(dc) = ONE; COEF(dc) = *l;
        !           319:        }
        !           320:        NEXT(dc) = 0; *dcp = dc0;
        !           321: }
        !           322:
        !           323: void ufctrmain(p,hint,dcp)
        !           324: P p;
        !           325: int hint;
        !           326: DCP *dcp;
        !           327: {
        !           328:        ML list;
        !           329:        DCP dc;
        !           330:
        !           331:        if ( NUM(p) || (UDEG(p) == 1) ) {
        !           332:                NEWDC(dc); DEG(dc) = ONE; COEF(dc) = p; NEXT(dc) = 0;
        !           333:                *dcp = dc;
        !           334:        } else if ( iscycm(p) )
        !           335:                cycm(VR(p),UDEG(p),dcp);
        !           336:        else if ( iscycp(p) )
        !           337:                cycp(VR(p),UDEG(p),dcp);
        !           338:        else {
        !           339:                hensel(5,5,p,&list);
        !           340:                if ( list->n == 1 ) {
        !           341:                        NEWDC(dc); DEG(dc) = ONE; COEF(dc) = p; NEXT(dc) = 0;
        !           342:                        *dcp = dc;
        !           343:                } else
        !           344:                        dtest(p,list,hint,dcp);
        !           345:        }
        !           346: }
        !           347:
        !           348: struct oMF {
        !           349:        int m;
        !           350:        P f;
        !           351: };
        !           352:
        !           353: void calcphi();
        !           354:
        !           355: void cycm(v,n,dcp)
        !           356: V v;
        !           357: register int n;
        !           358: DCP *dcp;
        !           359: {
        !           360:        register int i,j;
        !           361:        struct oMF *mfp;
        !           362:        DCP dc,dc0;
        !           363:
        !           364:        if ( n == 1 ) {
        !           365:                NEWDC(dc); mkssum(v,1,1,-1,&COEF(dc)); DEG(dc) = ONE;
        !           366:        } else {
        !           367:                mfp = (struct oMF *) ALLOCA((n+1)*sizeof(struct oMF));
        !           368:                bzero((char *)mfp,(int)(sizeof(struct oMF)*(n+1)));
        !           369:                for ( i = 1, j = 0; i <= n; i++ )
        !           370:                        if ( !(n%i) ) mfp[j++].m = i;
        !           371:                mkssum(v,1,1,-1,&mfp[0].f);
        !           372:                for ( i = 1; i < j; i++ )
        !           373:                        calcphi(v,i,mfp);
        !           374:                for ( dc0 = 0, i = 0; i < j; i++ ) {
        !           375:                        NEXTDC(dc0,dc); COEF(dc) = mfp[i].f; DEG(dc) = ONE;
        !           376:                }
        !           377:        }
        !           378:        NEXT(dc) = 0; *dcp = dc0;
        !           379: }
        !           380:
        !           381: void cycp(v,n,dcp)
        !           382: V v;
        !           383: register int n;
        !           384: DCP *dcp;
        !           385: {
        !           386:        register int i,j;
        !           387:        int n0;
        !           388:        struct oMF *mfp;
        !           389:        DCP dc,dc0;
        !           390:
        !           391:        if ( n == 1 ) {
        !           392:                NEWDC(dc); mkssum(v,1,1,1,&COEF(dc)); DEG(dc) = ONE;
        !           393:        } else {
        !           394:                n0 = n; n *= 2;
        !           395:                mfp = (struct oMF *) ALLOCA((n+1)*sizeof(struct oMF));
        !           396:                bzero((char *)mfp,(int)(sizeof(struct oMF)*(n+1)));
        !           397:                for ( i = 1, j = 0; i <= n; i++ )
        !           398:                        if ( !(n%i) ) mfp[j++].m = i;
        !           399:                mkssum(v,1,1,-1,&mfp[0].f);
        !           400:                for ( i = 1; i < j; i++ )
        !           401:                        calcphi(v,i,mfp);
        !           402:                for ( dc0 = 0, i = 0; i < j; i++ )
        !           403:                        if ( n0 % mfp[i].m ) {
        !           404:                                NEXTDC(dc0,dc); COEF(dc) = mfp[i].f; DEG(dc) = ONE;
        !           405:                        }
        !           406:        }
        !           407:        NEXT(dc) = 0; *dcp = dc0;
        !           408: }
        !           409:
        !           410: void calcphi(v,n,mfp)
        !           411: V v;
        !           412: int n;
        !           413: register struct oMF *mfp;
        !           414: {
        !           415:        register int i,m;
        !           416:        P t,s,tmp;
        !           417:
        !           418:        for ( t = (P)ONE, i = 0, m = mfp[n].m; i < n; i++ )
        !           419:                if ( !(m%mfp[i].m) ) {
        !           420:                        mulp(CO,t,mfp[i].f,&s); t = s;
        !           421:                }
        !           422:        mkssum(v,m,1,-1,&s); udivpz(s,t,&mfp[n].f,&tmp);
        !           423:        if ( tmp )
        !           424:                error("calcphi: cannot happen");
        !           425: }
        !           426:
        !           427: void mkssum(v,e,s,sgn,r)
        !           428: V v;
        !           429: int e,s,sgn;
        !           430: P *r;
        !           431: {
        !           432:        register int i,sgnt;
        !           433:        DCP dc,dc0;
        !           434:        Q q;
        !           435:
        !           436:        for ( dc0 = 0, i = s, sgnt = 1; i >= 0; i--, sgnt *= sgn ) {
        !           437:                if ( !dc0 ) {
        !           438:                        NEWDC(dc0); dc = dc0;
        !           439:                } else {
        !           440:                        NEWDC(NEXT(dc)); dc = NEXT(dc);
        !           441:                }
        !           442:                STOQ(i*e,DEG(dc)); STOQ(sgnt,q),COEF(dc) = (P)q;
        !           443:        }
        !           444:        NEXT(dc) = 0; MKP(v,dc0,*r);
        !           445: }
        !           446:
        !           447: int iscycp(f)
        !           448: P f;
        !           449: {
        !           450:        DCP dc;
        !           451:        dc = DC(f);
        !           452:
        !           453:        if ( !UNIQ((Q)COEF(dc)) )
        !           454:                return ( 0 );
        !           455:        dc = NEXT(dc);
        !           456:        if ( NEXT(dc) || DEG(dc) || !UNIQ((Q)COEF(dc)) )
        !           457:                return ( 0 );
        !           458:        return ( 1 );
        !           459: }
        !           460:
        !           461: int iscycm(f)
        !           462: P f;
        !           463: {
        !           464:        DCP dc;
        !           465:
        !           466:        dc = DC(f);
        !           467:        if ( !UNIQ((Q)COEF(dc)) )
        !           468:                return ( 0 );
        !           469:        dc = NEXT(dc);
        !           470:        if ( NEXT(dc) || DEG(dc) || !MUNIQ((Q)COEF(dc)) )
        !           471:                return ( 0 );
        !           472:        return ( 1 );
        !           473: }
        !           474:
        !           475: void sortfs(dcp)
        !           476: DCP *dcp;
        !           477: {
        !           478:        int i,k,n,k0,d;
        !           479:        DCP dc,dct,t;
        !           480:        DCP *a;
        !           481:
        !           482:        dc = *dcp;
        !           483:        for ( n = 0, dct = dc; dct; dct = NEXT(dct), n++ );
        !           484:        a = (DCP *)ALLOCA((n+1)*(sizeof(DCP)));
        !           485:        for ( i = 0, dct = dc; dct; dct = NEXT(dct), i++ )
        !           486:                a[i] = dct;
        !           487:        a[n] = 0;
        !           488:
        !           489:        for ( i = 0; i < n; i++ ) {
        !           490:                for ( k0 = k = i, d = UDEG(COEF(a[i])); k < n; k++ )
        !           491:                        if ( (int)UDEG(COEF(a[k])) < d ) {
        !           492:                                k0 = k;
        !           493:                                d = UDEG(COEF(a[k]));
        !           494:                        }
        !           495:                if ( i != k0 ) {
        !           496:                        t = a[i]; a[i] = a[k0]; a[k0] = t;
        !           497:                }
        !           498:        }
        !           499:        for ( *dcp = dct = a[0], i = 1; i < n; i++ )
        !           500:                dct = NEXT(dct) = a[i];
        !           501:        NEXT(dct) = 0;
        !           502: }
        !           503:
        !           504: void sortfsrev(dcp)
        !           505: DCP *dcp;
        !           506: {
        !           507:        int i,k,n,k0,d;
        !           508:        DCP dc,dct,t;
        !           509:        DCP *a;
        !           510:
        !           511:        dc = *dcp;
        !           512:        for ( n = 0, dct = dc; dct; dct = NEXT(dct), n++ );
        !           513:        a = (DCP *)ALLOCA((n+1)*(sizeof(DCP)));
        !           514:        for ( i = 0, dct = dc; dct; dct = NEXT(dct), i++ )
        !           515:                a[i] = dct;
        !           516:        a[n] = 0;
        !           517:
        !           518:        for ( i = 0; i < n; i++ ) {
        !           519:                for ( k0 = k = i, d = UDEG(COEF(a[i])); k < n; k++ )
        !           520:                        if ( (int)UDEG(COEF(a[k])) > d ) {
        !           521:                                k0 = k;
        !           522:                                d = UDEG(COEF(a[k]));
        !           523:                        }
        !           524:                if ( i != k0 ) {
        !           525:                        t = a[i]; a[i] = a[k0]; a[k0] = t;
        !           526:                }
        !           527:        }
        !           528:        for ( *dcp = dct = a[0], i = 1; i < n; i++ )
        !           529:                dct = NEXT(dct) = a[i];
        !           530:        NEXT(dct) = 0;
        !           531: }
        !           532:
        !           533: void nthrootchk(f,dc,fp,dcp)
        !           534: P f;
        !           535: struct oDUM *dc;
        !           536: ML fp;
        !           537: DCP *dcp;
        !           538: {
        !           539:        register int i,k;
        !           540:        int e,n,dr,tmp,t;
        !           541:        int *tmpp,**tmppp;
        !           542:        int **pp,**wpp;
        !           543:        LUM fpa,tpa,f0l;
        !           544:        UM wt,wq,ws,dvr,f0,fe;
        !           545:        N lc;
        !           546:        int lcm;
        !           547:        int m,b;
        !           548:
        !           549:        m = fp->mod; b = fp->bound; fe = *((UM *)fp->c);
        !           550:        e = dc->n; f0 = dc->f; nthrootn(NM((Q)COEF(DC(f))),e,&lc);
        !           551:        if ( !lc ) {
        !           552:                *dcp = 0;
        !           553:                return;
        !           554:        }
        !           555:        lcm = rem(lc,m); W_LUMALLOC(DEG(f0),b,f0l);
        !           556:        for ( i = DEG(f0), tmppp = COEF(f0l), tmpp = COEF(f0);
        !           557:                i >= 0; i-- )
        !           558:                *(tmppp[i]) = dmb(m,tmpp[i],lcm,&tmp);
        !           559:        dtestroot(m,1,f,f0l,dc,dcp);
        !           560:        if ( *dcp )
        !           561:                return;
        !           562:        n = UDEG(f); W_LUMALLOC(n,b,fpa); W_LUMALLOC(n,b,tpa);
        !           563:        ptolum(m,b,f,fpa);
        !           564:        dvr = W_UMALLOC(n); wq = W_UMALLOC(n);
        !           565:        wt = W_UMALLOC(n); ws = W_UMALLOC(n);
        !           566:        cpyum(fe,dvr); divum(m,dvr,f0,wq);
        !           567:        t = dmb(m,pwrm(m,lcm,e-1),e,&tmp); DEG(dvr) = DEG(wq);
        !           568:        for ( k = 0; k <= DEG(wq); k++ )
        !           569:                COEF(dvr)[k] = dmb(m,COEF(wq)[k],t,&tmp);
        !           570:        for ( i = 1; i < b; i++ ) {
        !           571:                pwrlum(m,i+1,f0l,e,tpa);
        !           572:                for ( k = 0, pp = COEF(fpa), wpp = COEF(tpa);
        !           573:                        k <= n; k++ )
        !           574:                        COEF(wt)[k] = (pp[k][i]-wpp[k][i]+m)%m;
        !           575:                degum(wt,n); dr = divum(m,wt,dvr,ws);
        !           576:                if ( dr >= 0 ) {
        !           577:                        *dcp = 0;
        !           578:                        return;
        !           579:                }
        !           580:                for ( k = 0, pp = COEF(f0l); k <= DEG(ws); k++ )
        !           581:                        pp[k][i] = COEF(ws)[k];
        !           582:                dtestroot(m,i+1,f,f0l,dc,dcp);
        !           583:                if ( *dcp )
        !           584:                        return;
        !           585:        }
        !           586: }
        !           587:
        !           588: void sqfrp(vl,f,dcp)
        !           589: VL vl;
        !           590: P f;
        !           591: DCP *dcp;
        !           592: {
        !           593:        P c,p;
        !           594:        DCP dc,dc0;
        !           595:
        !           596:        if ( !f || NUM(f) ) {
        !           597:                NEWDC(dc0); *dcp = dc0; DEG(dc0) = ONE;
        !           598:                COEF(dc0) = f; NEXT(dc0) = 0;
        !           599:        } else if ( !qpcheck((Obj)f) )
        !           600:                error("sqfrp : invalid argument");
        !           601:        else {
        !           602:                NEWDC(dc0); *dcp = dc0; DEG(dc0) = ONE;
        !           603:                ptozp(f,1,(Q *)&c,&p); msqfr(vl,p,&dc);
        !           604:                COEF(dc0) = c; NEXT(dc0) = dc;
        !           605:                adjsgn(f,dc0);
        !           606:        }
        !           607: }
        !           608:
        !           609: /*
        !           610:  * f : must be a poly with int coef, ignore int content
        !           611:  */
        !           612: void msqfr(vl,f,dcp)
        !           613: VL vl;
        !           614: P f;
        !           615: DCP *dcp;
        !           616: {
        !           617:        DCP dc,dct,dcs;
        !           618:        P c,p,t,s,pc;
        !           619:        VL mvl;
        !           620:
        !           621:        ptozp(f,1,(Q *)&c,&t); monomialfctr(vl,t,&p,&dc);
        !           622:        if ( NUM(p) ) {
        !           623:                *dcp = dc;
        !           624:                return;
        !           625:        }
        !           626:        mindegp(vl,p,&mvl,&s);
        !           627: #if 0
        !           628:        minlcdegp(vl,p,&mvl,&s);
        !           629:        min_common_vars_in_coefp(vl,p,&mvl,&s);
        !           630: #endif
        !           631:        pcp(mvl,s,&p,&pc);
        !           632:        if ( !NUM(pc) ) {
        !           633:                msqfr(mvl,pc,&dcs);
        !           634:                if ( !dc )
        !           635:                        dc = dcs;
        !           636:                else {
        !           637:                        for ( dct = dc; NEXT(dct); dct = NEXT(dct) );
        !           638:                        NEXT(dct) = dcs;
        !           639:                }
        !           640:        }
        !           641:        msqfrmain(mvl,p,&dcs);
        !           642:        for ( dct = dcs; dct; dct = NEXT(dct) ) {
        !           643:                reorderp(vl,mvl,COEF(dct),&t); COEF(dct) = t;
        !           644:        }
        !           645:        if ( !dc )
        !           646:                *dcp = dcs;
        !           647:        else {
        !           648:                for ( dct = dc; NEXT(dct); dct = NEXT(dct) );
        !           649:                NEXT(dct) = dcs; *dcp = dc;
        !           650:        }
        !           651: }
        !           652:
        !           653: void usqp(f,dcp)
        !           654: P f;
        !           655: DCP *dcp;
        !           656: {
        !           657:        int index,nindex;
        !           658:        P g,c,h;
        !           659:        DCP dc;
        !           660:
        !           661:        ptozp(f,1,(Q *)&c,&h);
        !           662:        if ( SGN((Q)LC(h)) < 0 )
        !           663:                chsgnp(h,&g);
        !           664:        else
        !           665:                g = h;
        !           666:        for ( index = 0, dc = 0; !dc; index = nindex )
        !           667:                hsq(index,5,g,&nindex,&dc);
        !           668:        *dcp = dc;
        !           669: }
        !           670:
        !           671: void msqfrmain(vl,p,dcp)
        !           672: VL vl;
        !           673: P p;
        !           674: DCP *dcp;
        !           675: {
        !           676:        int i,j;
        !           677:        VL nvl,tvl;
        !           678:        VN vn,vnt,vn1;
        !           679:        P gg,tmp,p0,g;
        !           680:        DCP dc,dc0,dcr,dcr0;
        !           681:        int nv,d,d1;
        !           682:        int found;
        !           683:        VN svn1;
        !           684:        P sp0;
        !           685:        DCP sdc0;
        !           686:
        !           687:        if ( deg(VR(p),p) == 1 ) {
        !           688:                NEWDC(dc); DEG(dc) = ONE; COEF(dc) = p; NEXT(dc) = 0;
        !           689:                *dcp = dc;
        !           690:                return;
        !           691:        }
        !           692:        clctv(vl,p,&nvl);
        !           693:        for ( nv = 0, tvl = nvl; tvl; tvl = NEXT(tvl), nv++);
        !           694:        if ( nv == 1 ) {
        !           695:                usqp(p,dcp);
        !           696:                return;
        !           697:        }
        !           698: #if 0
        !           699:        if ( heusqfrchk(nvl,p) ) {
        !           700:                NEWDC(dc); DEG(dc) = ONE; COEF(dc) = p; NEXT(dc) = 0;
        !           701:                *dcp = dc;
        !           702:                return;
        !           703:        }
        !           704: #endif
        !           705:        W_CALLOC(nv,struct oVN,vn);
        !           706:        W_CALLOC(nv,struct oVN,vnt);
        !           707:        W_CALLOC(nv,struct oVN,vn1);
        !           708:        W_CALLOC(nv,struct oVN,svn1);
        !           709:        for ( i = 0, tvl = NEXT(nvl); tvl; tvl = NEXT(tvl), i++ )
        !           710:                vn1[i].v = vn[i].v = tvl->v;
        !           711:        vn1[i].v = vn[i].v = 0;
        !           712:
        !           713:        for  ( dcr0 = 0, g = p, d = deg(VR(g),g), found = 0; ; ) {
        !           714:                while ( 1 ) {
        !           715:                        for ( i = 0, j = 0; vn[i].v; i++ )
        !           716:                                if ( vn[i].n ) vnt[j++].v = (V)i;
        !           717:                        vnt[j].n = 0;
        !           718:
        !           719:                        mulsgn(vn,vnt,j,vn1);
        !           720:                        substvp(nvl,LC(g),vn1,&tmp);
        !           721:                        if ( tmp ) {
        !           722:                                substvp(nvl,g,vn1,&p0);
        !           723:                                usqp(p0,&dc0);
        !           724:                                for ( d1 = 0, dc = dc0; dc; dc = NEXT(dc) )
        !           725:                                        if ( DEG(dc) )
        !           726:                                                d1 += (QTOS(DEG(dc))-1)*UDEG(COEF(dc));
        !           727:
        !           728:                                if ( d1 == 0 ) {
        !           729:                                        NEWDC(dc); DEG(dc) = ONE; COEF(dc) = g; NEXT(dc) = 0;
        !           730:                                        if ( !dcr0 )
        !           731:                                                dcr0 = dc;
        !           732:                                        else
        !           733:                                                NEXT(dcr) = dc;
        !           734:                                        *dcp = dcr0;
        !           735:                                        return;
        !           736:                                }
        !           737:
        !           738:                                if ( d < d1 )
        !           739:                                        goto END;
        !           740:                                if ( d > d1 ) {
        !           741:                                        d = d1;
        !           742:                                        found = 1;
        !           743:                                        bcopy((char *)vn1,(char *)svn1,(int)(sizeof(struct oVN)*nv));
        !           744:                                        sp0 = p0; sdc0 = dc0;
        !           745:                                        goto END;
        !           746:                                }
        !           747:                                /* d1 == d */
        !           748:                                if ( found ) {
        !           749:                                        found = 0;
        !           750: #if 0
        !           751:                                if ( d > d1 ) {
        !           752:                                        d = d1;
        !           753:                                                        /*} */
        !           754: #endif
        !           755:                                        msqfrmainmain(nvl,g,svn1,sp0,sdc0,&dc,&gg); g = gg;
        !           756:                                        if ( dc ) {
        !           757:                                                if ( !dcr0 )
        !           758:                                                        dcr0 = dc;
        !           759:                                                else
        !           760:                                                        NEXT(dcr) = dc;
        !           761:                                                for ( dcr = dc; NEXT(dcr); dcr = NEXT(dcr) );
        !           762:                                                if ( NUM(g) ) {
        !           763:                                                        NEXT(dcr) = 0; *dcp = dcr0;
        !           764:                                                        return;
        !           765:                                                }
        !           766:                                                d = deg(VR(g),g);
        !           767:                                        }
        !           768:                                }
        !           769:                        }
        !           770: END:
        !           771:                        if ( nextbin(vnt,j) )
        !           772:                                break;
        !           773:                }
        !           774:                next(vn);
        !           775:        }
        !           776: }
        !           777:
        !           778: void msqfrmainmain(vl,p,vn,p0,dc0,dcp,pp)
        !           779: VL vl;
        !           780: P p;
        !           781: VN vn;
        !           782: P p0;
        !           783: DCP dc0;
        !           784: DCP *dcp;
        !           785: P *pp;
        !           786: {
        !           787:        int i,j,k,np;
        !           788:        DCP *a;
        !           789:        DCP dc,dcr,dcr0,dct;
        !           790:        P g,t,s,u,t0,f,f0,d,d0,g0,h0,x,xx;
        !           791:        Q q;
        !           792:        V v;
        !           793:
        !           794:        for ( np = 0, dc = dc0; dc; dc = NEXT(dc), np++ );
        !           795:        a = (DCP *)ALLOCA((np + 1)*sizeof(DCP));
        !           796:        for ( i = 0, dc = dc0; dc; i++, dc = NEXT(dc) )
        !           797:                a[np-i-1] = dc;
        !           798:
        !           799:        for ( i = 0, dcr0 = 0, f = p, f0 = p0, v = VR(p);
        !           800:                i < np; i++ ) {
        !           801:                if ( (i == (np-1))&&UNIQ(DEG(a[i])) ) {
        !           802:                        NEXTDC(dcr0,dcr);
        !           803:                        DEG(dcr) = DEG(a[i]);
        !           804:                        COEF(dcr) = f;
        !           805:                        f = (P)ONE;
        !           806:                } else if ( (i == (np-1))&&UNIQ(DEG(DC(COEF(a[i])))) ) {
        !           807:                        diffp(vl,f,v,&s); pcp(vl,s,&t,&u);
        !           808:                        if ( divtpz(vl,f,t,&s) ) {
        !           809:                                NEXTDC(dcr0,dcr);
        !           810:                                DEG(dcr) = DEG(a[i]);
        !           811:                                COEF(dcr) = s;
        !           812:                                f = (P)ONE;
        !           813:                        } else
        !           814:                                break;
        !           815:                } else {
        !           816:                        for ( t = f, t0 = f0,
        !           817:                                j = 0, k = QTOS(DEG(a[i]))-1; j < k; j++ ) {
        !           818:                                diffp(vl,t,v,&s); t = s;
        !           819:                                diffp(vl,t0,v,&s); t0 = s;
        !           820:                        }
        !           821:                        factorial(k,&q);
        !           822:                        divsp(vl,t,(P)q,&s);
        !           823:                        for ( dct = DC(s); NEXT(dct); dct = NEXT(dct) );
        !           824:                        if ( DEG(dct) ) {
        !           825:                                MKV(VR(s),x); pwrp(vl,x,DEG(dct),&xx);
        !           826:                                divsp(vl,s,xx,&d);
        !           827:                        } else {
        !           828:                                xx = (P)ONE; d = s;
        !           829:                        }
        !           830:                        divsp(vl,t0,xx,&t);
        !           831:                        divsp(vl,t,(P)q,&s);
        !           832:                        ptozp(s,1,(Q *)&t,&d0);
        !           833:
        !           834:                        for ( dct = DC(COEF(a[i])); NEXT(dct); dct = NEXT(dct) );
        !           835:                        if ( DEG(dct) )
        !           836:                                divsp(vl,COEF(a[i]),xx,&g0);
        !           837:                        else {
        !           838:                                xx = (P)ONE; g0 = COEF(a[i]);
        !           839:                        }
        !           840:
        !           841:                        pcp(vl,d,&t,&u); d = t;
        !           842:                        ptozp(g0,1,(Q *)&u,&t); g0 = t;
        !           843:
        !           844:                {
        !           845:                        DCP dca,dcb;
        !           846:
        !           847:                        fctrp(vl,LC(d),&dca);
        !           848:                        for ( dcb = dca, u = (P)ONE; dcb; dcb = NEXT(dcb) ) {
        !           849:                                if ( NUM(COEF(dcb)) ) {
        !           850:                                        mulp(vl,u,COEF(dcb),&t); u = t;
        !           851:                                } else {
        !           852:                                        Q qq;
        !           853:                                        P tt;
        !           854:
        !           855:                                        pwrp(vl,COEF(dcb),DEG(a[i]),&s);
        !           856:                                        for ( t = LC(f), j = 0; divtpz(vl,t,s,&tt); j++, t = tt );
        !           857:                                        STOQ(j,qq);
        !           858:                                        if ( cmpq(qq,DEG(dcb)) > 0 )
        !           859:                                                qq = DEG(dcb);
        !           860:                                        pwrp(vl,COEF(dcb),qq,&t); mulp(vl,u,t,&s); u = s;
        !           861:                                }
        !           862:                        }
        !           863:                        divsp(vl,d0,g0,&h0);
        !           864:                }
        !           865:                        mfctrhen2(vl,vn,d,d0,g0,h0,u,LC(d),&s);
        !           866:                        if ( s ) {
        !           867:                                mulp(vl,s,xx,&g);
        !           868:                                pwrp(vl,g,DEG(a[i]),&t);
        !           869:                                if ( divtpz(vl,f,t,&s) ) {
        !           870:                                        NEXTDC(dcr0,dcr);
        !           871:                                        DEG(dcr) = DEG(a[i]); COEF(dcr) = g;
        !           872:                                        f = s; substvp(vl,f,vn,&f0);
        !           873:                                } else
        !           874:                                        break;
        !           875:                        } else
        !           876:                                break;
        !           877:                }
        !           878:        }
        !           879:        *pp = f;
        !           880:        if ( dcr0 )
        !           881:                NEXT(dcr) = 0;
        !           882:        *dcp = dcr0;
        !           883: }
        !           884:
        !           885: void mfctrhen2(vl,vn,f,f0,g0,h0,lcg,lch,gp)
        !           886: VL vl;
        !           887: VN vn;
        !           888: P f;
        !           889: P f0,g0,h0,lcg,lch;
        !           890: P *gp;
        !           891: {
        !           892:        V v;
        !           893:        P f1,lc,lc0,lcg0,lch0;
        !           894:        P m,ff0,gg0,hh0,gk,hk,ggg,gggr,hhh,ak,bk,tmp;
        !           895:        Q bb,qk,s;
        !           896:        Q cbd;
        !           897:        int dbd;
        !           898:        int d;
        !           899:
        !           900:        if ( NUM(g0) ) {
        !           901:                *gp = (P)ONE;
        !           902:                return;
        !           903:        }
        !           904:
        !           905:        v = VR(f); d = deg(v,f);
        !           906:        if ( d == deg(v,g0) ) {
        !           907:                pcp(vl,f,gp,&tmp);
        !           908:                return;
        !           909:        }
        !           910:
        !           911:        mulp(vl,lcg,lch,&lc);
        !           912:        if ( !divtpz(vl,lc,LC(f),(P *)&s) ) {
        !           913:                *gp = 0;
        !           914:                return;
        !           915:        }
        !           916:        mulp(vl,(P)s,f,&f1);
        !           917:        dbd = dbound(VR(f1),f1) + 1; cbound(vl,f1,&cbd);
        !           918:
        !           919:        substvp(vl,lc,vn,&lc0);
        !           920:        divq((Q)lc0,(Q)LC(f0),(Q *)&m); mulp(vl,f0,m,&ff0);
        !           921:        substvp(vl,lcg,vn,&lcg0);
        !           922:        divq((Q)lcg0,(Q)LC(g0),(Q *)&m); mulp(vl,g0,m,&gg0);
        !           923:        substvp(vl,lch,vn,&lch0);
        !           924:        divq((Q)lch0,(Q)LC(h0),(Q *)&m); mulp(vl,h0,m,&hh0);
        !           925:        addq(cbd,cbd,&bb);
        !           926:        henzq1(gg0,hh0,bb,&bk,&ak,&qk); gk = gg0; hk = hh0;
        !           927:        henmv(vl,vn,f1,gk,hk,ak,bk,
        !           928:                lcg,lch,lcg0,lch0,qk,dbd,&ggg,&hhh);
        !           929:
        !           930:        if ( divtpz(vl,f1,ggg,&gggr) )
        !           931:                pcp(vl,ggg,gp,&tmp);
        !           932:        else
        !           933:                *gp = 0;
        !           934: }
        !           935:
        !           936: int sqfrchk(p)
        !           937: P p;
        !           938: {
        !           939:        Q c;
        !           940:        P f;
        !           941:        DCP dc;
        !           942:
        !           943:        ptozp(p,SGN((Q)UCOEF(p)),&c,&f); usqp(f,&dc);
        !           944:        if ( NEXT(dc) || !UNIQ(DEG(dc)) )
        !           945:                return ( 0 );
        !           946:        else
        !           947:                return ( 1 );
        !           948: }
        !           949:
        !           950: int cycchk(p)
        !           951: P p;
        !           952: {
        !           953:        Q c;
        !           954:        P f;
        !           955:
        !           956:        ptozp(p,SGN((Q)UCOEF(p)),&c,&f);
        !           957:        if ( iscycp(f) || iscycm(f) )
        !           958:                return 0;
        !           959:        else
        !           960:                return 1;
        !           961: }
        !           962:
        !           963: int zerovpchk(vl,p,vn)
        !           964: VL vl;
        !           965: P p;
        !           966: VN vn;
        !           967: {
        !           968:        P t;
        !           969:
        !           970:        substvp(vl,p,vn,&t);
        !           971:        if ( t )
        !           972:                return ( 0 );
        !           973:        else
        !           974:                return ( 1 );
        !           975: }
        !           976:
        !           977: int valideval(vl,dc,vn)
        !           978: VL vl;
        !           979: DCP dc;
        !           980: VN vn;
        !           981: {
        !           982:        DCP dct;
        !           983:        Q *a;
        !           984:        int i,j,n;
        !           985:        N q,r;
        !           986:
        !           987:        for ( dct = NEXT(dc), n = 0; dct; dct = NEXT(dct), n++ );
        !           988:        W_CALLOC(n,Q,a);
        !           989:        for ( dct = NEXT(dc), i = 0; dct; dct = NEXT(dct), i++ ) {
        !           990:                substvp(vl,COEF(dct),vn,(P *)&a[i]);
        !           991:                if ( !a[i] )
        !           992:                        return ( 0 );
        !           993:
        !           994:                for ( j = 0; j < i; j++ ) {
        !           995:                        divn(NM(a[j]),NM(a[i]),&q,&r);
        !           996:                        if ( !r )
        !           997:                                return ( 0 );
        !           998:                        divn(NM(a[i]),NM(a[j]),&q,&r);
        !           999:                        if ( !r )
        !          1000:                                return ( 0 );
        !          1001:                }
        !          1002:        }
        !          1003:        return ( 1 );
        !          1004: }
        !          1005:
        !          1006: void estimatelc(vl,c,dc,vn,lcp)
        !          1007: VL vl;
        !          1008: Q c;
        !          1009: DCP dc;
        !          1010: VN vn;
        !          1011: P *lcp;
        !          1012: {
        !          1013:        int i;
        !          1014:        DCP dct;
        !          1015:        P r,s,t;
        !          1016:        Q c0,c1,c2;
        !          1017:
        !          1018:        for ( dct = dc, r = (P)ONE; dct; dct = NEXT(dct) ) {
        !          1019:                if ( NUM(COEF(dct)) ) {
        !          1020:                        mulp(vl,r,COEF(dct),&s); r = s;
        !          1021:                } else {
        !          1022:                        substvp(vl,COEF(dct),vn,(P *)&c0);
        !          1023:                        for ( i = 0, c1 = c; i < (int)QTOS(DEG(dct)); i++ ) {
        !          1024:                                divq(c1,c0,&c2);
        !          1025:                                if ( !INT(c2) )
        !          1026:                                        break;
        !          1027:                                else
        !          1028:                                        c1 = c2;
        !          1029:                        }
        !          1030:                        if ( i ) {
        !          1031:                                STOQ(i,c1);
        !          1032:                                pwrp(vl,COEF(dct),c1,&s); mulp(vl,r,s,&t); r = t;
        !          1033:                        }
        !          1034:                }
        !          1035:        }
        !          1036:        *lcp = r;
        !          1037: }
        !          1038:
        !          1039: void monomialfctr(vl,p,pr,dcp)
        !          1040: VL vl;
        !          1041: P p;
        !          1042: P *pr;
        !          1043: DCP *dcp;
        !          1044: {
        !          1045:        VL nvl,avl;
        !          1046:        Q d;
        !          1047:        P f,t,s;
        !          1048:        DCP dc0,dc;
        !          1049:
        !          1050:        clctv(vl,p,&nvl);
        !          1051:        for ( dc0 = 0, avl = nvl, f = p; avl; avl = NEXT(avl) ) {
        !          1052:                getmindeg(avl->v,f,&d);
        !          1053:                if ( d ) {
        !          1054:                        MKV(avl->v,t); NEXTDC(dc0,dc); DEG(dc) = d; COEF(dc) = t;
        !          1055:                        pwrp(vl,t,d,&s); divsp(vl,f,s,&t); f = t;
        !          1056:                }
        !          1057:        }
        !          1058:        if ( dc0 )
        !          1059:                NEXT(dc) = 0;
        !          1060:        *pr = f; *dcp = dc0;
        !          1061: }
        !          1062:
        !          1063: void afctr(vl,p0,p,dcp)
        !          1064: VL vl;
        !          1065: P p,p0;
        !          1066: DCP *dcp;
        !          1067: {
        !          1068:        DCP dc,dc0,dcr,dct,dcs;
        !          1069:        P t;
        !          1070:        VL nvl;
        !          1071:
        !          1072:        if ( VR(p) == VR(p0) ) {
        !          1073:                NEWDC(dc);
        !          1074:                DEG(dc) = ONE;
        !          1075:                COEF(dc) = p;
        !          1076:                NEXT(dc) = 0;
        !          1077:                *dcp = dc;
        !          1078:                return;
        !          1079:        }
        !          1080:
        !          1081:        clctv(vl,p,&nvl);
        !          1082:        if ( !NEXT(nvl) )
        !          1083:                ufctr(p,1,&dc);
        !          1084:        else {
        !          1085:                sqa(vl,p0,p,&dc);
        !          1086:                for ( dct = dc; dct; dct = NEXT(dct) ) {
        !          1087:                        pmonic(vl,p0,COEF(dct),&t); COEF(dct) = t;
        !          1088:                }
        !          1089:        }
        !          1090:        if ( NUM(COEF(dc)) )
        !          1091:                dcr = NEXT(dc);
        !          1092:        else
        !          1093:                dcr = dc;
        !          1094:        for ( dc0 = 0; dcr; dcr = NEXT(dcr) ) {
        !          1095:                afctrmain(vl,p0,COEF(dcr),1,&dcs);
        !          1096:
        !          1097:                for ( dct = dcs; dct; dct = NEXT(dct) )
        !          1098:                        DEG(dct) = DEG(dcr);
        !          1099:                if ( !dc0 )
        !          1100:                        dc0 = dcs;
        !          1101:                else {
        !          1102:                        for ( dct = dc0; NEXT(dct); dct = NEXT(dct) );
        !          1103:                        NEXT(dct) = dcs;
        !          1104:                }
        !          1105:        }
        !          1106:        *dcp = dc0;
        !          1107: }
        !          1108:
        !          1109: void afctrmain(vl,p0,p,init,dcp)
        !          1110: VL vl;
        !          1111: P p,p0;
        !          1112: int init;
        !          1113: DCP *dcp;
        !          1114: {
        !          1115:        P x,y,s,m,a,t,u,pt,pt1,res,g;
        !          1116:        Q q;
        !          1117:        DCP dc,dc0,dcsq0,dcr0,dcr,dct,dcs;
        !          1118:        V v,v0;
        !          1119:
        !          1120:        if ( !cmpq(DEG(DC(p)),ONE) ) {
        !          1121:                NEWDC(dc); DEG(dc) = ONE; NEXT(dc) = 0;
        !          1122:                pmonic(vl,p0,p,&COEF(dc)); *dcp = dc;
        !          1123:                return;
        !          1124:        }
        !          1125:
        !          1126:        v = VR(p); MKV(v,x);
        !          1127:        v0 = VR(p0); MKV(v0,y);
        !          1128:        STOQ(init,q),s = (P)q;
        !          1129:        mulp(vl,s,y,&m); subp(vl,x,m,&t); addp(vl,x,m,&a);
        !          1130:        substp(vl,p,v,t,&pt);
        !          1131:        remsdcp(vl,pt,p0,&pt1);
        !          1132:
        !          1133: /*
        !          1134:        if ( ( deg(v0,p0) <= 3 ) || ( TCPQ(p0) <= 2 ) )
        !          1135:                resultp(vl,v0,p0,pt1,&res);
        !          1136:        else
        !          1137:                srcrnorm(vl,v0,pt1,p0,&res);
        !          1138: */
        !          1139: #if 0
        !          1140:        srcr(vl,v0,pt1,p0,&res);
        !          1141: #endif
        !          1142:        resultp(vl,v0,p0,pt1,&res);
        !          1143:        usqp(res,&dcsq0);
        !          1144:        for ( dc0 = 0, dct = dcsq0; dct; dct = NEXT(dct) ) {
        !          1145:                if ( UNIQ(DEG(dct)) )
        !          1146:                        ufctr(COEF(dct),deg(v0,p0),&dcs);
        !          1147:                else
        !          1148:                        ufctr(COEF(dct),1,&dcs);
        !          1149:                for ( dcr = dcs; dcr; dcr = NEXT(dcr) )
        !          1150:                        DEG(dcr) = DEG(dct);
        !          1151:                if ( !dc0 ) {
        !          1152:                        dc0 = NEXT(dcs);
        !          1153:                        dc = dc0;
        !          1154:                } else {
        !          1155:                        for ( ; NEXT(dc); dc = NEXT(dc) );
        !          1156:                        NEXT(dc) = NEXT(dcs);
        !          1157:                }
        !          1158:        }
        !          1159:        sortfs(&dc0);
        !          1160:
        !          1161:        for ( g = p, dcr = dcr0 = 0, dc = dc0; dc; dc = NEXT(dc) ) {
        !          1162:                if ( !UNIQ(DEG(dc)) ) {
        !          1163:                        substp(vl,COEF(dc),v,a,&pt); remsdcp(vl,pt,p0,&s);
        !          1164:                        gcda(vl,p0,s,g,&u);
        !          1165:                        if ( !NUM(u) && (VR(u) == v)) {
        !          1166:                                afctrmain(vl,p0,u,init+1,&dct);
        !          1167:                                for ( dcs = dct, t = (P)ONE; dcs; dcs = NEXT(dcs) ) {
        !          1168:                                        mulp(vl,t,COEF(dcs),&s); remsdcp(vl,s,p0,&t);
        !          1169:                                }
        !          1170:                                pdiva(vl,p0,g,t,&s); g = s;
        !          1171:                                if ( !dcr0 )
        !          1172:                                        dcr0 = dct;
        !          1173:                                else
        !          1174:                                        NEXT(dcr) = dct;
        !          1175:                                for ( dcr = dct; NEXT(dcr); dcr = NEXT(dcr) );
        !          1176:                        }
        !          1177:                } else {
        !          1178:                        substp(vl,COEF(dc),v,a,&pt); remsdcp(vl,pt,p0,&s);
        !          1179:                        gcda(vl,p0,s,g,&u);
        !          1180:                        if ( !NUM(u) && (VR(u) == v)) {
        !          1181:                                NEXTDC(dcr0,dcr);
        !          1182:                                DEG(dcr) = ONE;
        !          1183:                                COEF(dcr) = u;
        !          1184:                                pdiva(vl,p0,g,u,&t); g = t;
        !          1185:                        }
        !          1186:                }
        !          1187:        }
        !          1188:        if ( dcr0 )
        !          1189:                NEXT(dcr) = 0;
        !          1190:        *dcp = dcr0;
        !          1191: }

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