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

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

1.4     ! kimura      1: load("solve")$
        !             2: load("gr")$
        !             3:
        !             4: def nonposdegchk(Res){
        !             5:
        !             6:        for(I=0;I<length(Res);I++)
        !             7:                if(Res[I][1]<=0)
        !             8:                        return 0$
        !             9:
        !            10:        return 1$
        !            11: }
        !            12:
        !            13: def resvars(Res,Vars){
        !            14:
        !            15:        ResVars=newvect(length(Vars),Vars)$
        !            16:        for(I=0;I<length(Res);I++){
        !            17:
        !            18:                for(J=0;J<size(ResVars)[0];J++)
        !            19:                        if(Res[I][0]==ResVars[J])
        !            20:                                break$
        !            21:
        !            22:                if(J<size(ResVars)[0])
        !            23:                        ResVars[J]=Res[I][1]$
        !            24:        }
        !            25:        return(ResVars)$
        !            26: }
        !            27:
        !            28: def makeret1(Res,Vars){
        !            29:
        !            30:        VarsNum=length(Vars)$
        !            31:
        !            32:        ResVec=newvect(VarsNum,Vars)$
        !            33:
        !            34:        for(I=0,M=0;I<length(Res);I++){
        !            35:
        !            36:                for(J=0;J<VarsNum;J++)
        !            37:                        if(Res[I][0]==Vars[J])
        !            38:                                break$
        !            39:
        !            40:                if(J<VarsNum){
        !            41:                        ResVec[J]=Res[I][1]$
        !            42:
        !            43:                        if(type(ResVec[J])==1){
        !            44:                                if(M==0)
        !            45:                                        M=ResVec[J]$
        !            46:                                else
        !            47:                                        if(ResVec[J]<M)
        !            48:                                                M=ResVec[J]$
        !            49:                        }
        !            50:                }
        !            51:
        !            52:        }
        !            53:
        !            54:        for(F=0,I=0;I<VarsNum;I++)
        !            55:                if(type(ResVec[I])!=1){
        !            56:                        F=1$
        !            57:                        break$
        !            58:                }
        !            59:
        !            60:        if(F==0)
        !            61:                for(I=0;I<VarsNum;I++)
        !            62:                        ResVec[I]=ResVec[I]/M*1.0$
        !            63:
        !            64:        for(I=0;I<VarsNum;I++)
        !            65:                for(J=0;J<length(Vars);J++)
        !            66:                        ResVec[I]=subst(ResVec[I],Vars[J],
        !            67:                                strtov(rtostr(Vars[J])+"_deg"))$
        !            68:
        !            69:        ResVec=cons(F,vtol(ResVec))$
        !            70:        return ResVec$
        !            71: }
        !            72:
        !            73: def junban1(A,B){
        !            74:        return (nmono(A)<nmono(B) ? -1:(nmono(A)>nmono(B) ? 1:0))$
        !            75: }
        !            76:
        !            77: def junban2(A,B){
        !            78:
        !            79:        for(I=0;I<size(A)[0];I++){
        !            80:                if(A[I]<B[I])
        !            81:                        return 1$
        !            82:
        !            83:                if(A[I]>B[I])
        !            84:                        return -1$
        !            85:        }
        !            86:
        !            87:        return 0$
        !            88: }
        !            89:
        !            90: def roundret(V){
        !            91:
        !            92:        VN=length(V)$
        !            93:        RET0=newvect(VN,V)$
        !            94:
        !            95:        for(I=1;I<1000;I++){
        !            96:                RET1=I*RET0$
        !            97:                for(J=0;J<VN;J++){
        !            98:                        X=drint(RET1[J])$
        !            99:                        if(dabs(X-RET1[J])<0.2)
        !           100:                                RET1[J]=X$
        !           101:                        else
        !           102:                                break$
        !           103:                }
        !           104:                if(J==VN)
        !           105:                        break$
        !           106:        }
        !           107:
        !           108:        if(I==1000)
        !           109:                return []$
        !           110:        else
        !           111:                return RET1$
        !           112: }
        !           113:
        !           114: def chkou(L,ExpMat,CHAGORD){
        !           115:
        !           116:        P=1$
        !           117:        F=ExpMat[L]$
        !           118:
        !           119:        for(I=0;I<L;I++){
        !           120:                Q=ExpMat[L][CHAGORD[I]]$
        !           121:                for(J=0;J<size(ExpMat[0])[0];J++){
        !           122:                        ExpMat[L][CHAGORD[J]]=red((ExpMat[I][CHAGORD[I]]
        !           123:                                *ExpMat[L][CHAGORD[J]]-
        !           124:                                        Q*ExpMat[I][CHAGORD[J]])/P)$
        !           125:                }
        !           126:
        !           127:                P=ExpMat[I][CHAGORD[I]]$
        !           128:        }
        !           129:
        !           130:        for(J=0;J<size(ExpMat[0])[0];J++)
        !           131:                if(ExpMat[L][CHAGORD[J]]!=0)
        !           132:                        break$
        !           133:
        !           134:        if(J==size(ExpMat[0])[0])
        !           135:                return L$
        !           136:        else{
        !           137:                TMP=CHAGORD[L]$
        !           138:                CHAGORD[L]=CHAGORD[J]$
        !           139:                CHAGORD[J]=TMP$
        !           140:                return (L+1)$
        !           141:        }
        !           142: }
        !           143:
        !           144: def qcheck0(PolyList,Vars){
        !           145:
        !           146:        RET=[]$
        !           147:        PolyListNum=length(PolyList)$
        !           148:        VarsNum=length(Vars)$
        !           149:
        !           150:        ExpMat=newvect(VarsNum)$
        !           151:        CHAGORD=newvect(VarsNum)$
        !           152:        for(I=0;I<VarsNum;I++)
        !           153:                CHAGORD[I]=I$
        !           154:
        !           155:        L=0$
        !           156:        for(I=0;I<PolyListNum;I++){
        !           157:                Poly=dp_ptod(PolyList[I],Vars)$
        !           158:                BASE0=dp_etov(dp_ht(Poly))$
        !           159:                Poly=dp_rest(Poly)$
        !           160:                for(;Poly!=0;Poly=dp_rest(Poly)){
        !           161:                        ExpMat[L]=dp_etov(dp_ht(Poly))-BASE0$
        !           162:                        L=chkou(L,ExpMat,CHAGORD)$
        !           163:                        if(L==VarsNum-1){
        !           164:                                RET=cons(ExpMat,RET)$
        !           165:                                RET=cons(CHAGORD,RET)$
        !           166:                                RET=cons(L,RET)$
        !           167:                                return RET$
        !           168:                        }
        !           169:                }
        !           170:        }
        !           171:
        !           172:        RET=cons(ExpMat,RET)$
        !           173:        RET=cons(CHAGORD,RET)$
        !           174:        RET=cons(L,RET)$
        !           175:        return RET$
        !           176: }
        !           177:
        !           178: def inner(A,B){
        !           179:
        !           180:        SUM=0$
        !           181:        for(I=0;I<size(A)[0];I++)
        !           182:                SUM+=A[I]*B[I]$
        !           183:
        !           184:        return SUM$
        !           185: }
        !           186:
        !           187: def checktd(PolyList,Vars,ResVars){
        !           188:
        !           189:        PolyListNum=length(PolyList)$
        !           190:        VarsNum=length(Vars)$
        !           191:
        !           192:        L=0$
        !           193:        for(I=0;I<PolyListNum;I++){
        !           194:                Poly=dp_ptod(PolyList[I],Vars)$
        !           195:                J0=inner(dp_etov(dp_ht(Poly)),ResVars)$
        !           196:                Poly=dp_rest(Poly)$
        !           197:                for(;Poly!=0;Poly=dp_rest(Poly))
        !           198:                        if(J0!=inner(dp_etov(dp_ht(Poly)),ResVars))
        !           199:                                return 0$
        !           200:        }
        !           201:
        !           202:        return 1$
        !           203: }
        !           204:
        !           205: def getgcd(A,B){
        !           206:
        !           207:        VarsNumA=length(A)$
        !           208:        VarsNumB=length(B)$
        !           209:
        !           210:        C=newvect(VarsNumB,B)$
        !           211:
        !           212:        for(I=0;I<VarsNumA;I++){
        !           213:
        !           214:                for(J=0;J<VarsNumB;J++)
        !           215:                        if(C[J]==A[I][0])
        !           216:                                break$
        !           217:
        !           218:                C[J]=A[I][1]$
        !           219:        }
        !           220:
        !           221:        D=0$
        !           222:        for(I=0;I<VarsNumB;I++)
        !           223:                D=gcd(D,C[I])$
        !           224:
        !           225:        if(D!=0){
        !           226:
        !           227:                for(I=0;I<VarsNumB;I++)
        !           228:                        C[I]=red(C[I]/D)$
        !           229:
        !           230:        }
        !           231:
        !           232:        for(L=1,D=0,I=0;I<VarsNumB;I++)
        !           233:                if(type(C[I])==1){
        !           234:                        L=ilcm(L,dn(C[I]))$
        !           235:                        D=igcd(D,nm(C[I]))$
        !           236:                }
        !           237:
        !           238:        for(I=0;I<VarsNumB;I++)
        !           239:                C[I]=C[I]*L$
        !           240:
        !           241:        if(D!=0)
        !           242:                for(I=0;I<VarsNumB;I++)
        !           243:                        C[I]=C[I]/D$
        !           244:
        !           245:
        !           246:        RET=newvect(VarsNumB)$
        !           247:        for(I=0;I<VarsNumB;I++){
        !           248:                RET[I]=newvect(2)$
        !           249:                RET[I][0]=B[I]$
        !           250:                RET[I][1]=C[I]$
        !           251:        }
        !           252:
        !           253:        return vtol(map(vtol,RET))$
        !           254: }
        !           255:
        !           256: def qcheck(PolyList,Vars){
        !           257:
        !           258:        RET=[]$
        !           259:        Res=qcheck0(PolyList,Vars)$
        !           260:        VarsNum=length(Vars)$
        !           261:
        !           262:        IndNum=Res[0]$
        !           263:        CHAGORD=Res[1]$
        !           264:        ExpMat=Res[2]$
        !           265:
        !           266:        SolveList=[]$
        !           267:        for(I=0;I<IndNum;I++){
        !           268:                TMP=0$
        !           269:                for(J=0;J<VarsNum;J++)
        !           270:                        TMP+=ExpMat[I][CHAGORD[J]]*Vars[CHAGORD[J]]$
        !           271:
        !           272:                SolveList=cons(TMP,SolveList)$
        !           273:        }
        !           274:
        !           275:        VarsList=[]$
        !           276:        for(I=0;I<VarsNum;I++)
        !           277:                VarsList=cons(Vars[CHAGORD[I]],VarsList)$
        !           278:
        !           279:        Rea=vars(SolveList)$
        !           280:        Res=solve(reverse(SolveList),reverse(VarsList))$
        !           281:
        !           282:        if(nonposdegchk(Res)){
        !           283:
        !           284:                Res=getgcd(Res,Rea)$
        !           285:                ResVars=resvars(Res,Vars)$
        !           286:
        !           287:                if(checktd(PolyList,Vars,ResVars)==1){
        !           288:
        !           289:                        for(J=0;J<length(Vars);J++)
        !           290:                                ResVars=map(subst,ResVars,Vars[J],
        !           291:                                        strtov(rtostr(Vars[J])+"_deg"))$
        !           292:
        !           293:                        RET=cons([vtol(ResVars),ResVars,[]],RET)$
        !           294:                        return cons(1,RET)$
        !           295:                }
        !           296:                else
        !           297:                        return cons(0,RET)$
        !           298:        }
        !           299:        else
        !           300:                return cons(0,RET)$
        !           301:
        !           302: }
        !           303:
        !           304: def weight(PolyList,Vars){
        !           305:
        !           306:        Vars0=vars(PolyList)$
        !           307:        Vars1=[]$
        !           308:        for(I=0;I<length(Vars);I++)
        !           309:                if(member(Vars[I],Vars0))
        !           310:                        Vars1=cons(Vars[I],Vars1)$
        !           311:
        !           312:        Vars=reverse(Vars1)$
        !           313:
        !           314:        RET=[]$
        !           315:
        !           316:        TMP=qcheck(PolyList,Vars)$
        !           317:
        !           318:        if(car(TMP)==1){
        !           319:                RET=cdr(TMP)$
        !           320:                RET=cons(Vars,RET)$
        !           321:                RET=cons(1,RET)$
        !           322:                return RET$
        !           323:        }
        !           324:
        !           325:        dp_ord(2)$
        !           326:
        !           327:        PolyListNum=length(PolyList)$
        !           328:        VPolyList=qsort(newvect(PolyListNum,PolyList),junban1)$
        !           329:        VPolyList=vtol(VPolyList)$
        !           330:
        !           331:        ExpMat=[]$
        !           332:        for(I=0;I<PolyListNum;I++)
        !           333:                for(Poly=dp_ptod(VPolyList[I],Vars);Poly!=0;Poly=dp_rest(Poly))
        !           334:                        ExpMat=cons(dp_etov(dp_ht(Poly)),ExpMat)$
        !           335:
        !           336:        ExpMat=reverse(ExpMat)$
        !           337:        ExpMat=newvect(length(ExpMat),ExpMat)$
        !           338:
        !           339:
        !           340: /* first */
        !           341:
        !           342:        ExpMatRowNum=size(ExpMat)[0]$
        !           343:        ExpMatColNum=size(ExpMat[0])[0]$
        !           344:        ExtMatColNum=ExpMatColNum+PolyListNum$
        !           345:
        !           346:        OneMat=newvect(PolyListNum+1,[0])$
        !           347:        for(I=0,SUM=0;I<PolyListNum;I++){
        !           348:                SUM+=nmono(VPolyList[I])$
        !           349:                OneMat[I+1]=SUM$
        !           350:        }
        !           351:
        !           352:        RevOneMat=newvect(ExpMatRowNum)$
        !           353:        for(I=0;I<PolyListNum;I++)
        !           354:                for(J=OneMat[I];J<OneMat[I+1];J++)
        !           355:                        RevOneMat[J]=I$
        !           356:
        !           357:        NormMat=newmat(ExpMatColNum,ExtMatColNum)$
        !           358:
        !           359:        for(I=0;I<ExpMatColNum;I++)
        !           360:                for(J=0;J<ExpMatColNum;J++)
        !           361:                        for(K=0;K<ExpMatRowNum;K++)
        !           362:                                NormMat[I][J]+=ExpMat[K][I]*ExpMat[K][J]$
        !           363:
        !           364:        for(I=0;I<ExpMatColNum;I++)
        !           365:                for(J=0;J<PolyListNum-1;J++)
        !           366:                        for(K=OneMat[J];K<OneMat[J+1];K++)
        !           367:                                NormMat[I][J+ExpMatColNum]-=ExpMat[K][I]$
        !           368:
        !           369:        for(I=0;I<ExpMatColNum;I++)
        !           370:                for(J=OneMat[PolyListNum-1];J<OneMat[PolyListNum];J++)
        !           371:                        NormMat[I][ExtMatColNum-1]+=ExpMat[J][I]$
        !           372:
        !           373:        NormMat2=newmat(PolyListNum-1,ExpMatColNum+1)$
        !           374:
        !           375:        for(I=0;I<PolyListNum-1;I++)
        !           376:                for(J=0;J<ExpMatColNum;J++)
        !           377:                        for(K=OneMat[I];K<OneMat[I+1];K++)
        !           378:                                NormMat2[I][J]-=ExpMat[K][J]$
        !           379:
        !           380:        for(I=0;I<PolyListNum-1;I++)
        !           381:                NormMat2[I][ExpMatColNum]=OneMat[I+1]-OneMat[I]$
        !           382:
        !           383:        ExtVars=Vars$
        !           384:        for(I=0;I<PolyListNum-1;I++)
        !           385:                ExtVars=append(ExtVars,[uc()])$
        !           386:
        !           387:        SolveList=[]$
        !           388:        for(I=0;I<ExpMatColNum;I++){
        !           389:                TMP=0$
        !           390:                for(J=0;J<ExtMatColNum-1;J++)
        !           391:                        TMP+=NormMat[I][J]*ExtVars[J]$
        !           392:
        !           393:                TMP-=NormMat[I][ExtMatColNum-1]$
        !           394:                SolveList=cons(TMP,SolveList)$
        !           395:        }
        !           396:
        !           397:        for(I=0;I<PolyListNum-1;I++){
        !           398:                TMP=0$
        !           399:                for(J=0;J<ExpMatColNum;J++)
        !           400:                        TMP+=NormMat2[I][J]*ExtVars[J]$
        !           401:
        !           402:                TMP+=NormMat2[I][ExpMatColNum]*ExtVars[I+ExpMatColNum]$
        !           403:
        !           404:                SolveList=cons(TMP,SolveList)$
        !           405:        }
        !           406:
        !           407:        Rea=vars(SolveList)$
        !           408:        Res=solve(SolveList,reverse(ExtVars))$
        !           409:
        !           410:        if(nonposdegchk(Res)){
        !           411:                Res=getgcd(Res,Rea)$
        !           412:                TMP1=makeret1(Res,Vars);
        !           413:                if(car(TMP1)==0){
        !           414:                        TMP2=roundret(cdr(TMP1));
        !           415:                        TMP3=map(drint,cdr(TMP1))$
        !           416:                        RET=cons([cdr(TMP1),newvect(length(TMP3),TMP3),TMP2],RET)$
        !           417:                }
        !           418:                else
        !           419:                        RET=cons([cdr(TMP1),[],[]],RET)$
        !           420:        }
        !           421:
        !           422: /* second */
        !           423:
        !           424:        NormMat=newmat(ExpMatColNum,ExpMatColNum+1)$
        !           425:
        !           426:        for(I=0;I<ExpMatColNum;I++)
        !           427:                for(J=0;J<ExpMatColNum;J++)
        !           428:                        for(K=0;K<ExpMatRowNum;K++)
        !           429:                                NormMat[I][J]+=ExpMat[K][I]*ExpMat[K][J]$
        !           430:
        !           431:        for(I=0;I<ExpMatColNum;I++)
        !           432:                for(J=0;J<ExpMatRowNum;J++)
        !           433:                        NormMat[I][ExpMatColNum]+=ExpMat[J][I]$
        !           434:
        !           435:        SolveList=[]$
        !           436:        for(I=0;I<ExpMatColNum;I++){
        !           437:                TMP=0$
        !           438:                for(J=0;J<ExpMatColNum;J++)
        !           439:                        TMP+=NormMat[I][J]*Vars[J]$
        !           440:
        !           441:                TMP-=NormMat[I][ExpMatColNum]$
        !           442:                SolveList=cons(TMP,SolveList)$
        !           443:        }
        !           444:
        !           445:        Rea=vars(SolveList)$
        !           446:        Res=solve(SolveList,Vars)$
        !           447:
        !           448:        if(nonposdegchk(Res)){
        !           449:                Res=getgcd(Res,Rea)$
        !           450:                TMP1=makeret1(Res,Vars);
        !           451:                if(car(TMP1)==0){
        !           452:                        TMP2=roundret(cdr(TMP1));
        !           453:                        TMP3=map(drint,cdr(TMP1))$
        !           454:                        RET=cons([cdr(TMP1),newvect(length(TMP3),TMP3),TMP2],RET)$
        !           455:                }
        !           456:                else
        !           457:                        RET=cons([cdr(TMP1),[],[]],RET)$
        !           458:        }
        !           459:
        !           460: /* third */
        !           461:
        !           462:        ExpMat=qsort(ExpMat,junban2)$
        !           463:        ExpMat2=[]$
        !           464:        for(I=0;I<size(ExpMat)[0];I++)
        !           465:                if(car(ExpMat2)!=ExpMat[I])
        !           466:                        ExpMat2=cons(ExpMat[I],ExpMat2)$
        !           467:
        !           468:        ExpMat=newvect(length(ExpMat2),ExpMat2)$
        !           469:        ExpMatRowNum=size(ExpMat)[0]$
        !           470:        ExpMatColNum=size(ExpMat[0])[0]$
        !           471:
        !           472:        NormMat=newmat(ExpMatColNum,ExpMatColNum+1)$
        !           473:
        !           474:        for(I=0;I<ExpMatColNum;I++)
        !           475:                for(J=0;J<ExpMatColNum;J++)
        !           476:                        for(K=0;K<ExpMatRowNum;K++)
        !           477:                                NormMat[I][J]+=ExpMat[K][I]*ExpMat[K][J]$
        !           478:
        !           479:        for(I=0;I<ExpMatColNum;I++)
        !           480:                for(J=0;J<ExpMatRowNum;J++)
        !           481:                        NormMat[I][ExpMatColNum]+=ExpMat[J][I]$
        !           482:
        !           483:        SolveList=[]$
        !           484:        for(I=0;I<ExpMatColNum;I++){
        !           485:                TMP=0$
        !           486:                for(J=0;J<ExpMatColNum;J++)
        !           487:                        TMP+=NormMat[I][J]*Vars[J]$
        !           488:
        !           489:                TMP-=NormMat[I][ExpMatColNum]$
        !           490:                SolveList=cons(TMP,SolveList)$
        !           491:        }
        !           492:
        !           493:        Rea=vars(SolveList)$
        !           494:        Res=solve(SolveList,Vars)$
        !           495:
        !           496:        if(nonposdegchk(Res)){
        !           497:                Res=getgcd(Res,Rea)$
        !           498:                TMP1=makeret1(Res,Vars);
        !           499:                if(car(TMP1)==0){
        !           500:                        TMP2=roundret(cdr(TMP1));
        !           501:                        TMP3=map(drint,cdr(TMP1))$
        !           502:                        RET=cons([cdr(TMP1),newvect(length(TMP3),TMP3),TMP2],RET)$
        !           503:                }
        !           504:                else
        !           505:                        RET=cons([cdr(TMP1),[],[]],RET)$
        !           506:        }
        !           507:
        !           508:        RET=cons(Vars,reverse(RET))$
        !           509:        RET=cons(0,RET)$
        !           510:        return RET$
        !           511: }
        !           512:
        !           513: def average(PolyList,Vars){
        !           514:
        !           515:        RET=[]$
        !           516:        dp_ord(2)$
        !           517:
        !           518:        PolyListNum=length(PolyList)$
        !           519:
        !           520:        ExpMat=[]$
        !           521:        for(I=0;I<PolyListNum;I++)
        !           522:                for(Poly=dp_ptod(PolyList[I],Vars);Poly!=0;Poly=dp_rest(Poly))
        !           523:                        ExpMat=cons(dp_etov(dp_ht(Poly)),ExpMat)$
        !           524:
        !           525:        ExpMat=reverse(ExpMat)$
        !           526:        ExpMat=newvect(length(ExpMat),ExpMat)$
        !           527:
        !           528:        ExpMat=qsort(ExpMat,junban2)$
        !           529:        ExpMat2=[]$
        !           530:        for(I=0;I<size(ExpMat)[0];I++)
        !           531:                if(car(ExpMat2)!=ExpMat[I])
        !           532:                        ExpMat2=cons(ExpMat[I],ExpMat2)$
        !           533:
        !           534:        ExpMat=newvect(length(ExpMat2),ExpMat2)$
        !           535:        ExpMatRowNum=size(ExpMat)[0]$
        !           536:        ExpMatColNum=size(ExpMat[0])[0]$
        !           537:
        !           538:        Res=newvect(ExpMatColNum);
        !           539:        for(I=0;I<ExpMatColNum;I++)
        !           540:                Res[I]=newvect(2,[Vars[I]])$
        !           541:
        !           542:        for(I=0;I<ExpMatRowNum;I++)
        !           543:                for(J=0;J<ExpMatColNum;J++)
        !           544:                        Res[J][1]+=ExpMat[I][J]$
        !           545:
        !           546:        for(I=0;I<ExpMatColNum;I++)
        !           547:                if(Res[I][1]==0)
        !           548:                        Res[I][1]=1$
        !           549:                else
        !           550:                        Res[I][1]=1/Res[I][1]$
        !           551:
        !           552:        RET=cons(makeret(vtol(Res),Vars,1),RET)$
        !           553:        RET=cons(Vars,RET)$
        !           554:
        !           555:        return RET$
        !           556: }
        !           557:
        !           558: end$

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