[BACK]Return to weight CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / lib

Annotation of OpenXM_contrib2/asir2000/lib/weight, Revision 1.26

1.4       kimura      1: load("solve")$
                      2: load("gr")$
                      3:
1.18      kimura      4: #define EPS 1E-6
                      5: #define TINY 1E-20
                      6: #define MAX_ITER 100
1.19      noro        7: #define ROUND_THRESHOLD 0.4
1.18      kimura      8:
                      9: def rotate(A,I,J,K,L,C,S){
                     10:
                     11:        X=A[I][J];
                     12:        Y=A[K][L];
                     13:        A[I][J]=X*C-Y*S;
                     14:        A[K][L]=X*S+Y*C;
                     15:
                     16:        return 1;
                     17: }
                     18:
                     19: def jacobi(N,A,W){
                     20:
                     21:        S=OFFDIAG=0.0;
                     22:
                     23:        for(J=0;J<N;J++){
                     24:
                     25:                for(K=0;K<N;K++)
                     26:                        W[J][K]=0.0;
                     27:
                     28:                W[J][J]=1.0;
                     29:                S+=A[J][J]*A[J][J];
                     30:
                     31:                for(K=J+1;K<N;K++)
                     32:                        OFFDIAG+=A[J][K]*A[J][K];
                     33:        }
                     34:
                     35:        TOLERANCE=EPS*EPS*(S/2+OFFDIAG);
                     36:
                     37:        for(ITER=1;ITER<=MAX_ITER;ITER++){
                     38:
                     39:                OFFDIAG=0.0;
                     40:                for(J=0;J<N-1;J++)
                     41:                        for(K=J+1;K<N;K++)
                     42:                                OFFDIAG+=A[J][K]*A[J][K];
                     43:
                     44:                if(OFFDIAG < TOLERANCE)
                     45:                        break;
                     46:
                     47:                for(J=0;J<N-1;J++){
                     48:                        for(K=J+1;K<N;K++){
                     49:
                     50:                                if(dabs(A[J][K])<TINY)
                     51:                                        continue;
                     52:
                     53:                                T=(A[K][K]-A[J][J])/(2.0*A[J][K]);
                     54:
                     55:                                if(T>=0.0)
                     56:                                        T=1.0/(T+dsqrt(T*T+1));
                     57:                                else
                     58:                                        T=1.0/(T-dsqrt(T*T+1));
                     59:
                     60:                                C=1.0/dsqrt(T*T+1);
                     61:
                     62:                                S=T*C;
                     63:
                     64:                                T*=A[J][K];
                     65:
                     66:                                A[J][J]-=T;
                     67:                                A[K][K]+=T;
                     68:                                A[J][K]=0.0;
                     69:
                     70:                                for(I=0;I<J;I++)
                     71:                                        rotate(A,I,J,I,K,C,S);
                     72:
                     73:                                for(I=J+1;I<K;I++)
                     74:                                        rotate(A,J,I,I,K,C,S);
                     75:
                     76:                                for(I=K+1;I<N;I++)
                     77:                                        rotate(A,J,I,K,I,C,S);
                     78:
                     79:                                for(I=0;I<N;I++)
                     80:                                        rotate(W,J,I,K,I,C,S);
                     81:
                     82:                        }
                     83:                }
                     84:        }
                     85:
                     86:        if (ITER > MAX_ITER)
                     87:                return 0;
                     88:
                     89:        for(I=0;I<N-1;I++){
                     90:
                     91:                K=I;
                     92:
                     93:                T=A[K][K];
                     94:
                     95:                for(J=I+1;J<N;J++)
                     96:                        if(A[J][J]>T){
                     97:                                K=J;
                     98:                                T=A[K][K];
                     99:                        }
                    100:
                    101:                A[K][K]=A[I][I];
                    102:
                    103:                A[I][I]=T;
                    104:
                    105:                V=W[K];
                    106:
                    107:                W[K]=W[I];
                    108:
                    109:                W[I]=V;
                    110:        }
                    111:
                    112:        return 1;
                    113: }
                    114:
1.24      kimura    115: def interval2value(A,Vars){
                    116:
                    117:        B=atl(A)$
                    118:
                    119:        if(length(B)>2){
                    120:                print("bug")$
                    121:                return []$
                    122:        }
1.26    ! kimura    123:        else if(length(B)==0){
        !           124:                if(fop(A)==0)
1.24      kimura    125:                        return [Vars,1]$
                    126:                else
                    127:                        return []$
                    128:        }
                    129:        else if(length(B)==1){
                    130:
                    131:                C=fargs(B[0])$
                    132:                D=vars(C)$
                    133:                E=solve(C,D)$
                    134:
                    135:                if(fop(B[0])==15)
                    136:                        return [Vars,E[0][1]+1]$
                    137:                else if(fop(B[0])==11)
                    138:                        return [Vars,E[0][1]-1]$
1.25      kimura    139:                else if(fop(B[0])==8)
                    140:                        return [Vars,E[0][1]]$
1.24      kimura    141:                else
                    142:                        return []$
                    143:        }
                    144:        else{
                    145:
                    146:                C=fargs(B[0])$
                    147:                D=vars(C)$
                    148:                E=solve(C,D)$
                    149:
                    150:                C=fargs(B[1])$
                    151:                D=vars(C)$
                    152:                F=solve(C,D)$
                    153:
                    154:                return [Vars,(E[0][1]+F[0][1])/2]$
                    155:        }
                    156:
                    157: }
                    158:
                    159: def fixpointmain(F,Vars){
                    160:
                    161:        RET=[]$
                    162:        for(I=length(Vars)-1;I>=1;I--){
                    163:
                    164:                for(H=[],J=0;J<I;J++)
                    165:                        H=cons(Vars[J],H)$
                    166:
                    167:                G=interval2value(qe(ex(H,F)),Vars[I])$
                    168:
                    169:                if(G==[])
                    170:                        return RET$
                    171:                else
                    172:                        RET=cons(G,RET)$
                    173:
                    174:                F=subf(F,G[0],G[1])$
                    175:        }
                    176:
                    177:        G=interval2value(simpl(F),Vars[0])$
                    178:
                    179:        if(G==[])
                    180:                return RET$
                    181:        else
                    182:                RET=cons(G,RET)$
                    183:
                    184:        return RET$
                    185: }
                    186:
                    187:
                    188: def fixedpoint(A,FLAG){
                    189:
                    190:        Vars=vars(A)$
                    191:
                    192:        N=length(A)$
                    193:
                    194:        if (FLAG==0)
                    195:                for(F=@true,I=0;I < N; I++ ) { F = F @&& A[I] @> 0$ }
                    196:        else if (FLAG==1)
                    197:                for(F=@true,I=0;I < N; I++ ) { F = F @&& A[I] @< 0$ }
                    198:
                    199:        return fixpointmain(F,Vars)$
                    200: }
                    201:
1.9       kimura    202: def nonzerovec(A){
                    203:
                    204:        for(I=0;I<size(A)[0];I++)
                    205:                if(A[I]!=0)
                    206:                        return 1$
                    207:
                    208:        return 0$
                    209: }
                    210:
1.8       kimura    211: def junban(A,B){
                    212:        return (A<B ? 1:(A>B ? -1:0))$
                    213: }
                    214:
                    215: def worder(A,B){
                    216:        return (A[0]<B[0] ? 1:(A[0]>B[0] ? -1:0))$
                    217: }
                    218:
1.10      kimura    219: def bsort(A){
1.8       kimura    220:
1.10      kimura    221:        K=size(A)[0]-1$
                    222:        while(K>=0){
                    223:                J=-1$
                    224:                for(I=1;I<=K;I++)
                    225:                        if(A[I-1][0]<A[I][0]){
                    226:                                J=I-1$
                    227:                                X=A[J]$
                    228:                                A[J]=A[I]$
                    229:                                A[I]=X$
                    230:                        }
                    231:                K=J$
                    232:        }
                    233:        return A$
                    234: }
                    235:
1.26    ! kimura    236: def wsort(A,B,C,ID){
1.10      kimura    237:
1.26    ! kimura    238:        D=newvect(length(B))$
        !           239:        for(I=0;I<length(B);I++)
        !           240:                D[I]=[A[I],B[I],C[I]]$
1.10      kimura    241:
1.26    ! kimura    242:        D=bsort(D)$
1.10      kimura    243:
1.26    ! kimura    244:        for(E=[],I=0;I<length(B);I++)
        !           245:                E=cons(D[I][1],E)$
        !           246:        E=reverse(E)$
1.10      kimura    247:
1.26    ! kimura    248:        for(F=[],I=0;I<length(B);I++)
        !           249:                F=cons(D[I][2],F)$
        !           250:        F=reverse(F)$
1.8       kimura    251:
1.26    ! kimura    252:        return [[ID,E,F]]$
1.8       kimura    253: }
                    254:
1.4       kimura    255: def nonposdegchk(Res){
                    256:
                    257:        for(I=0;I<length(Res);I++)
                    258:                if(Res[I][1]<=0)
                    259:                        return 0$
                    260:
                    261:        return 1$
                    262: }
                    263:
1.8       kimura    264: def getgcd(A,B){
                    265:
                    266:        VarsNumA=length(A)$
                    267:        VarsNumB=length(B)$
                    268:
                    269:        C=newvect(VarsNumB,B)$
                    270:
                    271:        for(I=0;I<VarsNumA;I++){
                    272:
                    273:                for(J=0;J<VarsNumB;J++)
1.16      kimura    274:                        if(B[J]==A[I][0])
1.8       kimura    275:                                break$
                    276:
                    277:                if(J<VarsNumB)
                    278:                        C[J]=A[I][1]$
                    279:        }
                    280:
                    281:        D=0$
                    282:        for(I=0;I<VarsNumB;I++)
                    283:                D=gcd(D,C[I])$
                    284:
                    285:        if(D!=0){
                    286:                C=C/D$
                    287:                C=map(red,C)$
                    288:        }
1.6       kimura    289:
1.8       kimura    290:        for(L=1,D=0,I=0;I<VarsNumB;I++){
                    291:                if(type(TMP=dn(C[I]))==1)
                    292:                        L=ilcm(L,TMP)$
                    293:
                    294:                if(type(TMP=nm(C[I]))==1)
                    295:                        D=igcd(D,TMP)$
                    296:        }
                    297:
                    298:        C=C*L$
                    299:        if(D!=0)
                    300:                C=C/D$
1.6       kimura    301:
1.8       kimura    302:        RET=[]$
                    303:        for(I=0;I<VarsNumB;I++)
                    304:                RET=cons([B[I],C[I]],RET)$
1.6       kimura    305:
1.8       kimura    306:        return RET$
1.6       kimura    307: }
                    308:
1.10      kimura    309: def makeret(Res,Vars,FLAG){
1.4       kimura    310:
1.8       kimura    311:        ResNum=length(Res)$
1.4       kimura    312:        VarsNum=length(Vars)$
                    313:
1.17      kimura    314:        ResVec=newvect(ResNum)$
1.4       kimura    315:
1.17      kimura    316:         for(M=0,I=0;I<ResNum;I++){
                    317:                 if(member(Res[I][0],Vars)){
                    318:                         ResVec[I]=Res[I][1]$
1.16      kimura    319:
1.17      kimura    320:                         if(FLAG && type(ResVec[I])==1){
                    321:                                 if(M==0)
                    322:                                         M=ResVec[I]$
                    323:                                 else
                    324:                                         if(ResVec[I]<M)
                    325:                                                 M=ResVec[I]$
                    326:                         }
                    327:                 }
                    328:         }
1.16      kimura    329:
1.8       kimura    330:        if(M!=0)
                    331:                ResVec=ResVec/M;
1.4       kimura    332:
1.17      kimura    333:        RET=newvect(VarsNum,Vars)$
1.4       kimura    334:
1.8       kimura    335:        for(I=0;I<ResNum;I++){
                    336:                for(J=0;J<VarsNum;J++)
                    337:                        if(Vars[J]==Res[I][0])
                    338:                                break$
1.4       kimura    339:
1.8       kimura    340:                if(J<VarsNum)
                    341:                        RET[J]=ResVec[I]$
                    342:        }
                    343:
1.10      kimura    344:
                    345:        for(J=0;J<length(Vars);J++)
                    346:                RET=map(subst,RET,Vars[J],
                    347:                        strtov(rtostr(Vars[J])+"_deg"))$
                    348:
1.4       kimura    349:        for(I=0;I<VarsNum;I++)
1.8       kimura    350:                if(type(RET[I])!=1)
                    351:                        return [1,RET]$
1.4       kimura    352:
1.8       kimura    353:        return [0,RET]$
1.4       kimura    354: }
                    355:
                    356: def roundret(V){
                    357:
1.8       kimura    358:        VN=size(V)[0]$
1.4       kimura    359:
1.8       kimura    360:        RET0=V$
1.13      kimura    361:        for(I=1;I<1000;I++){
1.4       kimura    362:                RET1=I*RET0$
                    363:                for(J=0;J<VN;J++){
                    364:                        X=drint(RET1[J])$
1.19      noro      365:                        if(dabs(X-RET1[J])<ROUND_THRESHOLD)
1.4       kimura    366:                                RET1[J]=X$
                    367:                        else
                    368:                                break$
                    369:                }
                    370:                if(J==VN)
                    371:                        break$
                    372:        }
                    373:
                    374:        if(I==1000)
                    375:                return []$
                    376:        else
                    377:                return RET1$
                    378: }
                    379:
                    380: def chkou(L,ExpMat,CHAGORD){
                    381:
1.8       kimura    382:        for(P=1,I=0;I<L;I++){
1.4       kimura    383:                Q=ExpMat[L][CHAGORD[I]]$
                    384:                for(J=0;J<size(ExpMat[0])[0];J++){
                    385:                        ExpMat[L][CHAGORD[J]]=red((ExpMat[I][CHAGORD[I]]
                    386:                                *ExpMat[L][CHAGORD[J]]-
                    387:                                        Q*ExpMat[I][CHAGORD[J]])/P)$
                    388:                }
                    389:
                    390:                P=ExpMat[I][CHAGORD[I]]$
                    391:        }
                    392:
                    393:        for(J=0;J<size(ExpMat[0])[0];J++)
                    394:                if(ExpMat[L][CHAGORD[J]]!=0)
                    395:                        break$
                    396:
                    397:        if(J==size(ExpMat[0])[0])
                    398:                return L$
                    399:        else{
                    400:                TMP=CHAGORD[L]$
                    401:                CHAGORD[L]=CHAGORD[J]$
                    402:                CHAGORD[J]=TMP$
                    403:                return (L+1)$
                    404:        }
                    405: }
                    406:
1.8       kimura    407: def qcheckmain(PolyList,Vars){
1.4       kimura    408:
                    409:        RET=[]$
                    410:        PolyListNum=length(PolyList)$
                    411:        VarsNum=length(Vars)$
                    412:
                    413:        ExpMat=newvect(VarsNum)$
                    414:        CHAGORD=newvect(VarsNum)$
                    415:        for(I=0;I<VarsNum;I++)
                    416:                CHAGORD[I]=I$
                    417:
                    418:        L=0$
                    419:        for(I=0;I<PolyListNum;I++){
                    420:                Poly=dp_ptod(PolyList[I],Vars)$
                    421:                BASE0=dp_etov(dp_ht(Poly))$
                    422:                Poly=dp_rest(Poly)$
                    423:                for(;Poly!=0;Poly=dp_rest(Poly)){
                    424:                        ExpMat[L]=dp_etov(dp_ht(Poly))-BASE0$
                    425:                        L=chkou(L,ExpMat,CHAGORD)$
1.8       kimura    426:                        if(L==VarsNum-1)
                    427:                                return [L,CHAGORD,ExpMat]$
1.4       kimura    428:                }
                    429:        }
                    430:
1.8       kimura    431:        return [L,CHAGORD,ExpMat]$
1.4       kimura    432: }
                    433:
                    434: def inner(A,B){
                    435:
                    436:        SUM=0$
                    437:        for(I=0;I<size(A)[0];I++)
                    438:                SUM+=A[I]*B[I]$
                    439:
                    440:        return SUM$
                    441: }
                    442:
                    443: def checktd(PolyList,Vars,ResVars){
                    444:
                    445:        PolyListNum=length(PolyList)$
                    446:        VarsNum=length(Vars)$
                    447:
                    448:        L=0$
                    449:        for(I=0;I<PolyListNum;I++){
                    450:                Poly=dp_ptod(PolyList[I],Vars)$
                    451:                J0=inner(dp_etov(dp_ht(Poly)),ResVars)$
                    452:                Poly=dp_rest(Poly)$
                    453:                for(;Poly!=0;Poly=dp_rest(Poly))
                    454:                        if(J0!=inner(dp_etov(dp_ht(Poly)),ResVars))
                    455:                                return 0$
                    456:        }
                    457:
                    458:        return 1$
                    459: }
                    460:
1.24      kimura    461: def value2(Vars,Ans){
                    462:
                    463:        N=length(Vars)$
                    464:        Res=newvect(N)$
                    465:        for(I=0;I<N;I++){
                    466:                Res[I]=newvect(2)$
                    467:                Res[I][0]=Vars[I]$
                    468:                Res[I][1]=Ans[I]$
                    469:        }
                    470:
                    471:        Res=getgcd(Res,Vars)$
                    472:
                    473:        if(nonposdegchk(Res)){
                    474:                TMP1=makeret(Res,Vars,1)$
                    475:                return vtol(TMP1[1])$
                    476:        }
                    477:        else
                    478:                return []$
                    479: }
                    480:
1.10      kimura    481: def qcheck(PolyList,Vars,FLAG){
1.4       kimura    482:
1.10      kimura    483:        RET=[]$
1.8       kimura    484:        Res=qcheckmain(PolyList,Vars)$
1.4       kimura    485:        VarsNum=length(Vars)$
                    486:
                    487:        IndNum=Res[0]$
                    488:        CHAGORD=Res[1]$
                    489:        ExpMat=Res[2]$
                    490:
                    491:        SolveList=[]$
                    492:        for(I=0;I<IndNum;I++){
                    493:                TMP=0$
                    494:                for(J=0;J<VarsNum;J++)
                    495:                        TMP+=ExpMat[I][CHAGORD[J]]*Vars[CHAGORD[J]]$
                    496:
                    497:                SolveList=cons(TMP,SolveList)$
                    498:        }
                    499:
1.8       kimura    500:        Rea=vars(SolveList)$
                    501:
1.4       kimura    502:        VarsList=[]$
                    503:        for(I=0;I<VarsNum;I++)
1.8       kimura    504:                if(member(Vars[CHAGORD[I]],Rea))
                    505:                        VarsList=cons(Vars[CHAGORD[I]],VarsList)$
1.4       kimura    506:
                    507:        Res=solve(reverse(SolveList),reverse(VarsList))$
1.8       kimura    508:        Res=getgcd(Res,Rea)$
1.4       kimura    509:
                    510:        if(nonposdegchk(Res)){
                    511:
1.26    ! kimura    512:                TMP1=makeret(Res,Vars,0)$
1.4       kimura    513:
1.26    ! kimura    514:                if(checktd(PolyList,Vars,TMP1[1])==1){
1.18      kimura    515:
1.26    ! kimura    516:                        if(FLAG==0){
1.24      kimura    517:
1.26    ! kimura    518:                                if(TMP1[0]==0)
        !           519:                                        RET=append(RET,wsort(TMP1[1],Vars,TMP1[1],0))$
        !           520:                                else{
1.24      kimura    521:
1.26    ! kimura    522:                                        TMP=vtol(TMP1[1])$
1.24      kimura    523:
1.26    ! kimura    524:                                        if((TMP0=fixedpoint(TMP,0))!=[]){
1.24      kimura    525:
1.26    ! kimura    526:                                                for(I=0;I<length(TMP0);I++)
        !           527:                                                        TMP=map(subst,TMP,TMP0[I][0],TMP0[I][1])$
1.24      kimura    528:
1.26    ! kimura    529:                                                TMP=value2(Vars,TMP)$
1.24      kimura    530:
1.26    ! kimura    531:                                                if(TMP!=[])
        !           532:                                                        RET=append(RET,wsort(TMP,Vars,TMP,1/10))$
        !           533:                                        }
        !           534:                                        else if((TMP0=fixedpoint(TMP,1))!=[]){
1.24      kimura    535:
1.26    ! kimura    536:                                                for(I=0;I<length(TMP0);I++)
        !           537:                                                        TMP=map(subst,TMP,TMP0[I][0],TMP0[I][1])$
1.24      kimura    538:
1.26    ! kimura    539:                                                TMP=value2(Vars,TMP)$
        !           540:
        !           541:                                                if(TMP!=[])
        !           542:                                                        RET=append(RET,wsort(TMP,Vars,TMP,1/10))$
        !           543:                                        }
        !           544:                                }
1.10      kimura    545:                        }
1.26    ! kimura    546:                        else if(FLAG==1)
        !           547:                                RET=append(RET,[[0,Vars,vtol(TMP1[1])]])$
1.4       kimura    548:                }
                    549:        }
                    550:
1.26    ! kimura    551:        return RET$
1.4       kimura    552: }
                    553:
1.18      kimura    554: def leastsq(NormMat,ExpMat,Vars,FLAG,ID){
1.8       kimura    555:
                    556:        RET=[]$
1.4       kimura    557:
                    558:        ExpMatRowNum=size(ExpMat)[0]$
                    559:        ExpMatColNum=size(ExpMat[0])[0]$
                    560:
1.8       kimura    561:        if(NormMat==0){
                    562:                NormMat=newmat(ExpMatColNum,ExpMatColNum)$
                    563:
                    564:                for(I=0;I<ExpMatColNum;I++)
                    565:                        for(J=I;J<ExpMatColNum;J++)
                    566:                                for(K=0;K<ExpMatRowNum;K++)
                    567:                                        NormMat[I][J]+=
                    568:                                                ExpMat[K][I]*ExpMat[K][J]$
                    569:        }
1.4       kimura    570:
1.8       kimura    571:        BVec=newvect(ExpMatColNum)$
1.4       kimura    572:
                    573:        for(I=0;I<ExpMatColNum;I++)
                    574:                for(J=0;J<ExpMatRowNum;J++)
1.8       kimura    575:                        BVec[I]+=ExpMat[J][I]$
1.4       kimura    576:
                    577:        SolveList=[]$
                    578:        for(I=0;I<ExpMatColNum;I++){
                    579:                TMP=0$
1.8       kimura    580:                for(J=0;J<I;J++)
                    581:                        TMP+=NormMat[J][I]*Vars[J]$
                    582:
                    583:                for(J=I;J<ExpMatColNum;J++)
1.4       kimura    584:                        TMP+=NormMat[I][J]*Vars[J]$
                    585:
1.8       kimura    586:                TMP-=BVec[I]$
1.4       kimura    587:                SolveList=cons(TMP,SolveList)$
                    588:        }
                    589:
                    590:        Rea=vars(SolveList)$
1.8       kimura    591:
                    592:        VarsList=[]$
                    593:        for(I=0;I<length(Vars);I++)
                    594:                if(member(Vars[I],Rea))
                    595:                        VarsList=cons(Vars[I],VarsList)$
                    596:
                    597:        Res=solve(SolveList,VarsList)$
                    598:        Res=getgcd(Res,Rea)$
1.4       kimura    599:
                    600:        if(nonposdegchk(Res)){
1.16      kimura    601:
1.10      kimura    602:                TMP1=makeret(Res,Vars,1)$
1.16      kimura    603:
1.26    ! kimura    604:                if(FLAG==0){
1.24      kimura    605:
1.26    ! kimura    606:                        if(TMP1[0]==0){
1.8       kimura    607:
1.26    ! kimura    608:                                TMP=roundret(TMP1[1])$
1.18      kimura    609:
1.26    ! kimura    610:                                RET=append(RET,wsort(TMP1[1],Vars,map(drint,TMP1[1]*1.0),ID))$
1.8       kimura    611:
1.26    ! kimura    612:                                if(TMP!=[])
        !           613:                                        RET=append(RET,wsort(TMP1[1],Vars,TMP,ID+1))$
        !           614:                        }
        !           615:                        else{
1.24      kimura    616:
1.26    ! kimura    617:                                TMP=vtol(TMP1[1])$
1.24      kimura    618:
1.26    ! kimura    619:                                if((TMP0=fixedpoint(TMP1[1],0))!=[]){
1.24      kimura    620:
1.26    ! kimura    621:                                        for(I=0;I<length(TMP0);I++)
        !           622:                                                TMP=map(subst,TMP,TMP0[I][0],TMP0[I][1])$
1.24      kimura    623:
1.26    ! kimura    624:                                        TMP=value2(Vars,TMP)$
1.24      kimura    625:
1.26    ! kimura    626:                                        if(TMP!=[])
        !           627:                                                RET=append(RET,wsort(TMP,Vars,TMP,ID+1/10))$
        !           628:                                }
        !           629:                                else if((TMP0=fixedpoint(TMP1[1],1))!=[]){
1.24      kimura    630:
1.26    ! kimura    631:                                        for(I=0;I<length(TMP0);I++)
        !           632:                                                TMP=map(subst,TMP,TMP0[I][0],TMP0[I][1])$
1.24      kimura    633:
1.26    ! kimura    634:                                        TMP=value2(Vars,TMP)$
1.24      kimura    635:
1.26    ! kimura    636:                                        if(TMP!=[])
        !           637:                                                RET=append(RET,wsort(TMP,Vars,TMP,ID+1/10))$
        !           638:                                }
        !           639:                        }
1.24      kimura    640:
1.8       kimura    641:                }
1.26    ! kimura    642:                else if(FLAG==1)
        !           643:                        RET=append(RET,[[ID,Vars,vtol(TMP1[1])]])$
1.8       kimura    644:        }
                    645:
1.26    ! kimura    646:        return RET$
1.8       kimura    647: }
                    648:
1.18      kimura    649: def unitweight(ExpMat,Vars,PolyListNum,OneMat,FLAG){
1.8       kimura    650:
                    651:        RET=[]$
                    652:
                    653:        ExpMatRowNum=size(ExpMat)[0]$
                    654:        ExpMatColNum=size(ExpMat[0])[0]$
                    655:        ExtMatColNum=ExpMatColNum+PolyListNum$
                    656:
                    657:        ExtVars=reverse(Vars)$
                    658:        for(I=0;I<PolyListNum;I++)
                    659:                ExtVars=cons(uc(),ExtVars)$
                    660:
                    661:        ExtVars=reverse(ExtVars)$
                    662:
1.18      kimura    663:        NormMat0=newvect(ExpMatColNum)$
                    664:        for(I=0;I<ExpMatColNum;I++)
                    665:                NormMat0[I]=newvect(ExpMatColNum)$
1.8       kimura    666:
                    667:        for(I=0;I<ExpMatColNum;I++)
                    668:                for(J=I;J<ExpMatColNum;J++)
                    669:                        for(K=0;K<ExpMatRowNum;K++)
1.18      kimura    670:                                NormMat0[I][J]+=
1.8       kimura    671:                                        ExpMat[K][I]*
                    672:                                        ExpMat[K][J]$
                    673:
1.18      kimura    674:        NormMat1=newvect(ExtMatColNum)$
                    675:        for(I=0;I<ExtMatColNum;I++)
                    676:                NormMat1[I]=newvect(ExtMatColNum)$
                    677:
                    678:
                    679:        WorkMat=newvect(ExtMatColNum)$
                    680:        for(I=0;I<ExtMatColNum;I++)
                    681:                WorkMat[I]=newvect(ExtMatColNum)$
                    682:
                    683:
                    684:        for(I=0;I<ExpMatColNum;I++)
                    685:                for(J=I;J<ExpMatColNum;J++)
                    686:                        NormMat1[I][J]=NormMat0[I][J]$
                    687:
1.8       kimura    688:        for(I=0;I<ExpMatColNum;I++)
                    689:                for(J=0;J<PolyListNum;J++)
                    690:                        for(K=OneMat[J];K<OneMat[J+1];K++)
1.26    ! kimura    691:                                NormMat1[I][J+ExpMatColNum]-=ExpMat[K][I]$
1.8       kimura    692:
                    693:        for(I=0;I<PolyListNum;I++)
1.18      kimura    694:                NormMat1[I+ExpMatColNum][I+ExpMatColNum]=OneMat[I+1]-OneMat[I]$
                    695:
                    696:        if(jacobi(ExtMatColNum,NormMat1,WorkMat)){
1.8       kimura    697:
1.18      kimura    698:                Res=newvect(ExpMatColNum)$
1.8       kimura    699:                for(I=0;I<ExpMatColNum;I++){
1.18      kimura    700:                        Res[I]=newvect(2)$
                    701:                        Res[I][0]=Vars[I]$
                    702:                        Res[I][1]=WorkMat[ExtMatColNum-1][I]$
                    703:                }
1.8       kimura    704:
                    705:                if(nonposdegchk(Res)){
                    706:
1.10      kimura    707:                        TMP1=makeret(Res,Vars,1)$
1.16      kimura    708:
1.26    ! kimura    709:                        if(FLAG==0){
        !           710:                                TMP=roundret(TMP1[1])$
1.8       kimura    711:
1.26    ! kimura    712:                                RET=append(RET,wsort(TMP1[1],Vars,map(drint,TMP1[1]*1.0),1))$
1.18      kimura    713:
1.26    ! kimura    714:                                if(TMP!=[])
        !           715:                                        RET=append(RET,wsort(TMP1[1],Vars,TMP,2))$
        !           716:                        }
        !           717:
        !           718:                        if(FLAG==1)
        !           719:                                RET=append(RET,[[1,Vars,vtol(TMP1[1])]])$
1.4       kimura    720:                }
1.18      kimura    721:        }
                    722:
                    723:        return [NormMat0,RET]$
1.6       kimura    724: }
                    725:
1.18      kimura    726: def weight(PolyList,Vars,FLAG){
1.6       kimura    727:
                    728:        Vars0=vars(PolyList)$
                    729:        Vars1=[]$
                    730:        for(I=0;I<length(Vars);I++)
                    731:                if(member(Vars[I],Vars0))
                    732:                        Vars1=cons(Vars[I],Vars1)$
                    733:
                    734:        Vars=reverse(Vars1)$
                    735:
                    736:        RET=[]$
                    737:
1.18      kimura    738:        TMP=qcheck(PolyList,Vars,FLAG)$
1.6       kimura    739:
1.8       kimura    740:        if(TMP!=[]){
                    741:                RET=append(RET,TMP)$
1.18      kimura    742:                return RET$
1.6       kimura    743:        }
1.4       kimura    744:
1.6       kimura    745:        dp_ord(2)$
1.4       kimura    746:
1.6       kimura    747:        PolyListNum=length(PolyList)$
1.4       kimura    748:
1.18      kimura    749:        OneMat=newvect(PolyListNum+1,[0])$
                    750:        ExpMat=[]$
                    751:        for(I=0;I<PolyListNum;I++){
                    752:                for(Poly=dp_ptod(PolyList[I],Vars);
                    753:                        Poly!=0;Poly=dp_rest(Poly)){
                    754:                        ExpMat=cons(dp_etov(dp_ht(Poly)),ExpMat)$
1.8       kimura    755:                }
1.18      kimura    756:                OneMat[I+1]=length(ExpMat)$
                    757:        }
1.4       kimura    758:
1.18      kimura    759:        ExpMat=reverse(ExpMat)$
                    760:        ExpMat=newvect(length(ExpMat),ExpMat)$
1.4       kimura    761:
1.18      kimura    762:        TMP=unitweight(ExpMat,Vars,PolyListNum,OneMat,FLAG)$
1.8       kimura    763:
1.18      kimura    764:        RET=append(RET,TMP[1])$
1.4       kimura    765:
1.20      kimura    766:        TMP0=leastsq(TMP[0],ExpMat,Vars,FLAG,3)$
                    767:
                    768:        RET=append(RET,TMP0)$
1.4       kimura    769:
1.6       kimura    770:        ExpMat=qsort(ExpMat,junban)$
1.8       kimura    771:
1.6       kimura    772:        ExpMat2=[]$
                    773:        for(I=0;I<size(ExpMat)[0];I++)
                    774:                if(car(ExpMat2)!=ExpMat[I])
                    775:                        ExpMat2=cons(ExpMat[I],ExpMat2)$
1.4       kimura    776:
1.6       kimura    777:        if(size(ExpMat)[0]!=length(ExpMat2)){
                    778:                ExpMat=newvect(length(ExpMat2),ExpMat2)$
1.18      kimura    779:                RET=append(RET,leastsq(0,ExpMat,Vars,FLAG,5))$
1.20      kimura    780:        }
                    781:        else{
                    782:                TMP0=map(ltov,TMP0)$
                    783:
                    784:                for(I=0;I<length(TMP0);I++)
1.24      kimura    785:                        if(TMP0[I][0]==3)
                    786:                                TMP0[I][0]=5$
                    787:                        else if(TMP0[I][0]==4)
                    788:                                TMP0[I][0]=6$
1.20      kimura    789:
                    790:                TMP0=map(vtol,TMP0)$
                    791:
                    792:                RET=append(RET,TMP0)$
1.4       kimura    793:        }
                    794:
1.18      kimura    795:        return RET$
1.4       kimura    796: }
                    797:
                    798: end$

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