=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/lib/weight,v retrieving revision 1.4 retrieving revision 1.33 diff -u -p -r1.4 -r1.33 --- OpenXM_contrib2/asir2000/lib/weight 2003/11/11 05:10:24 1.4 +++ OpenXM_contrib2/asir2000/lib/weight 2004/02/29 13:20:47 1.33 @@ -1,6 +1,243 @@ load("solve")$ load("gr")$ +#define EPS 1E-6 +#define TINY 1E-20 +#define MAX_ITER 100 + +def rotate(A,I,J,K,L,C,S){ + + X=A[I][J]; + Y=A[K][L]; + A[I][J]=X*C-Y*S; + A[K][L]=X*S+Y*C; + + return 1; +} + +def jacobi(N,A,W){ + + S=OFFDIAG=0.0; + + for(J=0;J<N;J++){ + + for(K=0;K<N;K++) + W[J][K]=0.0; + + W[J][J]=1.0; + S+=A[J][J]*A[J][J]; + + for(K=J+1;K<N;K++) + OFFDIAG+=A[J][K]*A[J][K]; + } + + TOLERANCE=EPS*EPS*(S/2+OFFDIAG); + + for(ITER=1;ITER<=MAX_ITER;ITER++){ + + OFFDIAG=0.0; + for(J=0;J<N-1;J++) + for(K=J+1;K<N;K++) + OFFDIAG+=A[J][K]*A[J][K]; + + if(OFFDIAG < TOLERANCE) + break; + + for(J=0;J<N-1;J++){ + for(K=J+1;K<N;K++){ + + if(dabs(A[J][K])<TINY) + continue; + + T=(A[K][K]-A[J][J])/(2.0*A[J][K]); + + if(T>=0.0) + T=1.0/(T+dsqrt(T*T+1)); + else + T=1.0/(T-dsqrt(T*T+1)); + + C=1.0/dsqrt(T*T+1); + + S=T*C; + + T*=A[J][K]; + + A[J][J]-=T; + A[K][K]+=T; + A[J][K]=0.0; + + for(I=0;I<J;I++) + rotate(A,I,J,I,K,C,S); + + for(I=J+1;I<K;I++) + rotate(A,J,I,I,K,C,S); + + for(I=K+1;I<N;I++) + rotate(A,J,I,K,I,C,S); + + for(I=0;I<N;I++) + rotate(W,J,I,K,I,C,S); + + } + } + } + + if (ITER > MAX_ITER) + return 0; + + for(I=0;I<N-1;I++){ + + K=I; + + T=A[K][K]; + + for(J=I+1;J<N;J++) + if(A[J][J]>T){ + K=J; + T=A[K][K]; + } + + A[K][K]=A[I][I]; + + A[I][I]=T; + + V=W[K]; + + W[K]=W[I]; + + W[I]=V; + } + + return 1; +} + +def interval2value(A,Vars){ + + B=atl(A)$ + + if(length(B)>2){ + print("bug")$ + return []$ + } + else if(length(B)==0){ + if(fop(A)==0) + return [Vars,1]$ + else + return []$ + } + else if(length(B)==1){ + + C=fargs(B[0])$ + D=vars(C)$ + E=solve(C,D)$ + + if(fop(B[0])==15) + return [Vars,E[0][1]+1]$ + else if(fop(B[0])==11) + return [Vars,E[0][1]-1]$ + else if(fop(B[0])==8) + return [Vars,E[0][1]]$ + else + return []$ + } + else{ + + C=fargs(B[0])$ + D=vars(C)$ + E=solve(C,D)$ + + C=fargs(B[1])$ + D=vars(C)$ + F=solve(C,D)$ + + return [Vars,(E[0][1]+F[0][1])/2]$ + } + +} + +def fixpointmain(F,Vars){ + + RET=[]$ + for(I=length(Vars)-1;I>=1;I--){ + + for(H=[],J=0;J<I;J++) + H=cons(Vars[J],H)$ + + G=interval2value(qe(ex(H,F)),Vars[I])$ + + if(G==[]) + return RET$ + else + RET=cons(G,RET)$ + + F=subf(F,G[0],G[1])$ + } + + G=interval2value(simpl(F),Vars[0])$ + + if(G==[]) + return RET$ + else + RET=cons(G,RET)$ + + return RET$ +} + + +def fixedpoint(A,FLAG){ + + Vars=vars(A)$ + + N=length(A)$ + + if (FLAG==0) + for(F=@true,I=0;I < N; I++ ) { F = F @&& A[I] @> 0$ } + else if (FLAG==1) + for(F=@true,I=0;I < N; I++ ) { F = F @&& A[I] @< 0$ } + + return fixpointmain(F,Vars)$ +} + +def junban(A,B){ + return (A<B ? 1:(A>B ? -1:0))$ +} + +def bsort(A){ + + K=size(A)[0]-1$ + while(K>=0){ + J=-1$ + for(I=1;I<=K;I++) + if(A[I-1][0]<A[I][0]){ + J=I-1$ + X=A[J]$ + A[J]=A[I]$ + A[I]=X$ + } + K=J$ + } + return A$ +} + +def wsort(A,B,C,ID){ + + D=newvect(length(B))$ + for(I=0;I<length(B);I++) + D[I]=[A[I],B[I],C[I]]$ + + D=bsort(D)$ + + for(E=[],I=0;I<length(B);I++) + E=cons(D[I][1],E)$ + E=reverse(E)$ + + for(F=[],I=0;I<length(B);I++) + F=cons(D[I][2],F)$ + F=reverse(F)$ + + return [[ID,E,F]]$ +} + def nonposdegchk(Res){ for(I=0;I<length(Res);I++) @@ -10,113 +247,136 @@ def nonposdegchk(Res){ return 1$ } -def resvars(Res,Vars){ +def getgcd(A,B){ - ResVars=newvect(length(Vars),Vars)$ - for(I=0;I<length(Res);I++){ - - for(J=0;J<size(ResVars)[0];J++) - if(Res[I][0]==ResVars[J]) - break$ + Anum=length(A)$ - if(J<size(ResVars)[0]) - ResVars[J]=Res[I][1]$ + TMP=[]$ + for(I=0;I<length(B);I++){ + + for(J=0;J<Anum;J++) + if(B[I]==A[J][0]) + break; + + if(J==Anum) + TMP=cons([B[I],B[I]],TMP)$ } - return(ResVars)$ + A=append(A,TMP)$ + + Anum=length(A)$ + A=map(ltov,A)$ + + for(D=0,I=0;I<Anum;I++) + D=gcd(D,A[I][1])$ + + if(D!=0){ + for(I=0;I<Anum;I++) + A[I][1]=red(A[I][1]/D)$ + } + + for(L=1,D=0,I=0;I<Anum;I++){ + if(type(TMP=dn(A[I][1]))==1) + L=ilcm(L,TMP)$ + + if(type(TMP=nm(A[I][1]))==1) + D=igcd(D,TMP)$ + } + + for(I=0;I<Anum;I++) + A[I][1]=A[I][1]*L$ + + if(D!=0){ + + for(I=0;I<Anum;I++) + A[I][1]=A[I][1]/D$ + } + + return map(vtol,A)$ } -def makeret1(Res,Vars){ +def makeret(Res,Vars,FLAG){ + ResNum=length(Res)$ VarsNum=length(Vars)$ - ResVec=newvect(VarsNum,Vars)$ + ResVec=newvect(ResNum)$ - for(I=0,M=0;I<length(Res);I++){ + if(FLAG) + M=0$ + else + M=-1$ - for(J=0;J<VarsNum;J++) - if(Res[I][0]==Vars[J]) - break$ + for(I=0;I<ResNum;I++){ + if(member(Res[I][0],Vars)){ + ResVec[I]=Res[I][1]$ - if(J<VarsNum){ - ResVec[J]=Res[I][1]$ - - if(type(ResVec[J])==1){ - if(M==0) - M=ResVec[J]$ + if(FLAG){ + if(type(ResVec[I])==1){ + if(M==0) + M=ResVec[I]$ + else + if(ResVec[I]<M) + M=ResVec[I]$ + } else - if(ResVec[J]<M) - M=ResVec[J]$ + M=-1$ } } + } - } - for(F=0,I=0;I<VarsNum;I++) - if(type(ResVec[I])!=1){ - F=1$ - break$ - } + if(M!=-1) + ResVec=ResVec/M; - if(F==0) - for(I=0;I<VarsNum;I++) - ResVec[I]=ResVec[I]/M*1.0$ + RET=newvect(VarsNum,Vars)$ + for(I=0;I<ResNum;I++){ + for(J=0;J<VarsNum;J++) + if(Vars[J]==Res[I][0]) + break$ + + if(J<VarsNum) + RET[J]=ResVec[I]$ + } + for(I=0;I<VarsNum;I++) - for(J=0;J<length(Vars);J++) - ResVec[I]=subst(ResVec[I],Vars[J], - strtov(rtostr(Vars[J])+"_deg"))$ + if(type(RET[I])!=1) + return [1,RET]$ - ResVec=cons(F,vtol(ResVec))$ - return ResVec$ + return [0,RET]$ } -def junban1(A,B){ - return (nmono(A)<nmono(B) ? -1:(nmono(A)>nmono(B) ? 1:0))$ -} +def roundret(V){ -def junban2(A,B){ + VN=size(V)[0]$ - for(I=0;I<size(A)[0];I++){ - if(A[I]<B[I]) - return 1$ - - if(A[I]>B[I]) - return -1$ - } + K=1$ + RET0=V$ + RET1=map(drint,RET0)$ + S=0$ + for(J=0;J<VN;J++) + S+=(RET0[J]-RET1[J])^2$ - return 0$ -} + for(I=2;I<10;I++){ + RET0=I*V$ + RET1=map(drint,RET0)$ -def roundret(V){ + T=0$ + for(J=0;J<VN;J++) + T+=(RET0[J]-RET1[J])^2$ - VN=length(V)$ - RET0=newvect(VN,V)$ - - for(I=1;I<1000;I++){ - RET1=I*RET0$ - for(J=0;J<VN;J++){ - X=drint(RET1[J])$ - if(dabs(X-RET1[J])<0.2) - RET1[J]=X$ - else - break$ - } - if(J==VN) - break$ + if(T<S){ + K=I$ + S=T$ + } } - if(I==1000) - return []$ - else - return RET1$ + return map(drint,K*V)$ } def chkou(L,ExpMat,CHAGORD){ - P=1$ - F=ExpMat[L]$ - - for(I=0;I<L;I++){ + for(P=1,I=0;I<L;I++){ Q=ExpMat[L][CHAGORD[I]]$ for(J=0;J<size(ExpMat[0])[0];J++){ ExpMat[L][CHAGORD[J]]=red((ExpMat[I][CHAGORD[I]] @@ -141,7 +401,7 @@ def chkou(L,ExpMat,CHAGORD){ } } -def qcheck0(PolyList,Vars){ +def qcheckmain(PolyList,Vars){ RET=[]$ PolyListNum=length(PolyList)$ @@ -160,19 +420,12 @@ def qcheck0(PolyList,Vars){ for(;Poly!=0;Poly=dp_rest(Poly)){ ExpMat[L]=dp_etov(dp_ht(Poly))-BASE0$ L=chkou(L,ExpMat,CHAGORD)$ - if(L==VarsNum-1){ - RET=cons(ExpMat,RET)$ - RET=cons(CHAGORD,RET)$ - RET=cons(L,RET)$ - return RET$ - } + if(L==VarsNum-1) + return [L,CHAGORD,ExpMat]$ } } - RET=cons(ExpMat,RET)$ - RET=cons(CHAGORD,RET)$ - RET=cons(L,RET)$ - return RET$ + return [L,CHAGORD,ExpMat]$ } def inner(A,B){ @@ -202,61 +455,32 @@ def checktd(PolyList,Vars,ResVars){ return 1$ } -def getgcd(A,B){ +def value2(Vars,Ans,Ba){ - VarsNumA=length(A)$ - VarsNumB=length(B)$ - - C=newvect(VarsNumB,B)$ - - for(I=0;I<VarsNumA;I++){ - - for(J=0;J<VarsNumB;J++) - if(C[J]==A[I][0]) - break$ - - C[J]=A[I][1]$ + N=length(Vars)$ + Res=newvect(N)$ + for(I=0;I<N;I++){ + Res[I]=newvect(2)$ + Res[I][0]=Vars[I]$ + Res[I][1]=Ba*Ans[I]$ } + Res=map(vtol,Res)$ + Res=vtol(Res)$ - D=0$ - for(I=0;I<VarsNumB;I++) - D=gcd(D,C[I])$ + Res=getgcd(Res,Vars)$ - if(D!=0){ - - for(I=0;I<VarsNumB;I++) - C[I]=red(C[I]/D)$ - + if(nonposdegchk(Res)){ + TMP1=makeret(Res,Vars,1)$ + return vtol(TMP1[1])$ } - - for(L=1,D=0,I=0;I<VarsNumB;I++) - if(type(C[I])==1){ - L=ilcm(L,dn(C[I]))$ - D=igcd(D,nm(C[I]))$ - } - - for(I=0;I<VarsNumB;I++) - C[I]=C[I]*L$ - - if(D!=0) - for(I=0;I<VarsNumB;I++) - C[I]=C[I]/D$ - - - RET=newvect(VarsNumB)$ - for(I=0;I<VarsNumB;I++){ - RET[I]=newvect(2)$ - RET[I][0]=B[I]$ - RET[I][1]=C[I]$ - } - - return vtol(map(vtol,RET))$ + else + return []$ } -def qcheck(PolyList,Vars){ +def qcheck(PolyList,Vars,FLAG){ RET=[]$ - Res=qcheck0(PolyList,Vars)$ + Res=qcheckmain(PolyList,Vars)$ VarsNum=length(Vars)$ IndNum=Res[0]$ @@ -272,285 +496,265 @@ def qcheck(PolyList,Vars){ SolveList=cons(TMP,SolveList)$ } + Rea=vars(SolveList)$ + VarsList=[]$ for(I=0;I<VarsNum;I++) - VarsList=cons(Vars[CHAGORD[I]],VarsList)$ + if(member(TMP0=Vars[CHAGORD[I]],Rea)) + VarsList=cons(Vars[CHAGORD[I]],VarsList)$ - Rea=vars(SolveList)$ Res=solve(reverse(SolveList),reverse(VarsList))$ + Res=getgcd(Res,Rea)$ if(nonposdegchk(Res)){ - Res=getgcd(Res,Rea)$ - ResVars=resvars(Res,Vars)$ + TMP1=makeret(Res,Vars,0)$ - if(checktd(PolyList,Vars,ResVars)==1){ + if(checktd(PolyList,Vars,TMP1[1])==1){ - for(J=0;J<length(Vars);J++) - ResVars=map(subst,ResVars,Vars[J], - strtov(rtostr(Vars[J])+"_deg"))$ + if(FLAG==0){ - RET=cons([vtol(ResVars),ResVars,[]],RET)$ - return cons(1,RET)$ + if(TMP1[0]==0) + RET=append(RET,wsort(TMP1[1],Vars,TMP1[1],0))$ + else{ + + TMP=vtol(TMP1[1])$ + RET0=[]$ + if((TMP0=fixedpoint(TMP,0))!=[]){ + + for(I=0;I<length(TMP0);I++) + TMP=map(subst,TMP,TMP0[I][0],TMP0[I][1])$ + RET0=value2(Vars,TMP,1)$ + if(RET0!=[]) + RET0=wsort(RET0,Vars,RET0,-1)$ + } + + TMP=vtol(TMP1[1])$ + if(RET0==[] && (TMP0=fixedpoint(TMP,1))!=[]){ + + for(I=0;I<length(TMP0);I++) + TMP=map(subst,TMP,TMP0[I][0],TMP0[I][1])$ + RET0=value2(Vars,TMP,-1)$ + + if(RET0!=[]) + RET0=wsort(RET0,Vars,RET0,-1)$ + } + RET=append(RET,RET0)$ + } + } + else if(FLAG==1) + RET=append(RET,[[0,Vars,vtol(TMP1[1])]])$ } - else - return cons(0,RET)$ } - else - return cons(0,RET)$ + return RET$ } -def weight(PolyList,Vars){ +def unitweight2(NormMat0,ExpMat,Vars,FLAG,ID){ - Vars0=vars(PolyList)$ - Vars1=[]$ - for(I=0;I<length(Vars);I++) - if(member(Vars[I],Vars0)) - Vars1=cons(Vars[I],Vars1)$ - - Vars=reverse(Vars1)$ - RET=[]$ - TMP=qcheck(PolyList,Vars)$ - - if(car(TMP)==1){ - RET=cdr(TMP)$ - RET=cons(Vars,RET)$ - RET=cons(1,RET)$ - return RET$ - } - - dp_ord(2)$ - - PolyListNum=length(PolyList)$ - VPolyList=qsort(newvect(PolyListNum,PolyList),junban1)$ - VPolyList=vtol(VPolyList)$ - - ExpMat=[]$ - for(I=0;I<PolyListNum;I++) - for(Poly=dp_ptod(VPolyList[I],Vars);Poly!=0;Poly=dp_rest(Poly)) - ExpMat=cons(dp_etov(dp_ht(Poly)),ExpMat)$ - - ExpMat=reverse(ExpMat)$ - ExpMat=newvect(length(ExpMat),ExpMat)$ - - -/* first */ - ExpMatRowNum=size(ExpMat)[0]$ ExpMatColNum=size(ExpMat[0])[0]$ - ExtMatColNum=ExpMatColNum+PolyListNum$ + ExtMatColNum=ExpMatColNum+1$ - OneMat=newvect(PolyListNum+1,[0])$ - for(I=0,SUM=0;I<PolyListNum;I++){ - SUM+=nmono(VPolyList[I])$ - OneMat[I+1]=SUM$ - } + ExtVars=append(Vars,[uc()])$ - RevOneMat=newvect(ExpMatRowNum)$ - for(I=0;I<PolyListNum;I++) - for(J=OneMat[I];J<OneMat[I+1];J++) - RevOneMat[J]=I$ + if(NormMat==0){ - NormMat=newmat(ExpMatColNum,ExtMatColNum)$ + NormMat0=newvect(ExtMatColNum)$ + for(I=0;I<ExtMatColNum;I++) + NormMat0[I]=newvect(ExtMatColNum)$ - for(I=0;I<ExpMatColNum;I++) - for(J=0;J<ExpMatColNum;J++) - for(K=0;K<ExpMatRowNum;K++) - NormMat[I][J]+=ExpMat[K][I]*ExpMat[K][J]$ + for(I=0;I<ExpMatColNum;I++) + for(J=I;J<ExpMatColNum;J++) + for(K=0;K<ExpMatRowNum;K++) + NormMat0[I][J]+= + ExpMat[K][I]* + ExpMat[K][J]$ + } for(I=0;I<ExpMatColNum;I++) - for(J=0;J<PolyListNum-1;J++) - for(K=OneMat[J];K<OneMat[J+1];K++) - NormMat[I][J+ExpMatColNum]-=ExpMat[K][I]$ + for(K=0;K<ExpMatRowNum;K++) + NormMat0[I][ExpMatColNum]-=ExpMat[K][I]$ - for(I=0;I<ExpMatColNum;I++) - for(J=OneMat[PolyListNum-1];J<OneMat[PolyListNum];J++) - NormMat[I][ExtMatColNum-1]+=ExpMat[J][I]$ + NormMat0[ExpMatColNum][ExpMatColNum]=ExpMatRowNum$ - NormMat2=newmat(PolyListNum-1,ExpMatColNum+1)$ + WorkMat=newvect(ExtMatColNum)$ + for(I=0;I<ExtMatColNum;I++) + WorkMat[I]=newvect(ExtMatColNum)$ - for(I=0;I<PolyListNum-1;I++) - for(J=0;J<ExpMatColNum;J++) - for(K=OneMat[I];K<OneMat[I+1];K++) - NormMat2[I][J]-=ExpMat[K][J]$ + if(jacobi(ExtMatColNum,NormMat0,WorkMat)){ - for(I=0;I<PolyListNum-1;I++) - NormMat2[I][ExpMatColNum]=OneMat[I+1]-OneMat[I]$ + Res=newvect(ExtMatColNum)$ + for(I=0;I<ExtMatColNum;I++){ + Res[I]=newvect(2)$ + Res[I][0]=ExtVars[I]$ + Res[I][1]=WorkMat[ExtMatColNum-1][I]$ + } - ExtVars=Vars$ - for(I=0;I<PolyListNum-1;I++) - ExtVars=append(ExtVars,[uc()])$ + if(nonposdegchk(Res)){ - SolveList=[]$ - for(I=0;I<ExpMatColNum;I++){ - TMP=0$ - for(J=0;J<ExtMatColNum-1;J++) - TMP+=NormMat[I][J]*ExtVars[J]$ + TMP1=makeret(Res,Vars,1)$ - TMP-=NormMat[I][ExtMatColNum-1]$ - SolveList=cons(TMP,SolveList)$ - } + if(FLAG==0){ + TMP=roundret(TMP1[1])$ - for(I=0;I<PolyListNum-1;I++){ - TMP=0$ - for(J=0;J<ExpMatColNum;J++) - TMP+=NormMat2[I][J]*ExtVars[J]$ + RET=append(RET,wsort(TMP1[1],Vars,map(drint,TMP1[1]*1.0),ID))$ - TMP+=NormMat2[I][ExpMatColNum]*ExtVars[I+ExpMatColNum]$ + if(TMP!=[]) + RET=append(RET,wsort(TMP1[1],Vars,TMP,ID+1))$ + } + else if(FLAG==1) + RET=append(RET,[[ID,Vars,vtol(TMP1[1])]])$ + } + } + + return RET$ +} - SolveList=cons(TMP,SolveList)$ - } +def unitweight1(ExpMat,Vars,PolyListNum,OneMat,FLAG){ - Rea=vars(SolveList)$ - Res=solve(SolveList,reverse(ExtVars))$ + RET=[]$ - if(nonposdegchk(Res)){ - Res=getgcd(Res,Rea)$ - TMP1=makeret1(Res,Vars); - if(car(TMP1)==0){ - TMP2=roundret(cdr(TMP1)); - TMP3=map(drint,cdr(TMP1))$ - RET=cons([cdr(TMP1),newvect(length(TMP3),TMP3),TMP2],RET)$ - } - else - RET=cons([cdr(TMP1),[],[]],RET)$ - } + ExpMatRowNum=size(ExpMat)[0]$ + ExpMatColNum=size(ExpMat[0])[0]$ + ExtMatColNum=ExpMatColNum+PolyListNum$ -/* second */ + ExtVars=reverse(Vars)$ + for(I=0;I<PolyListNum;I++) + ExtVars=cons(uc(),ExtVars)$ - NormMat=newmat(ExpMatColNum,ExpMatColNum+1)$ + ExtVars=reverse(ExtVars)$ + NormMat0=newvect(ExpMatColNum+1)$ for(I=0;I<ExpMatColNum;I++) - for(J=0;J<ExpMatColNum;J++) + NormMat0[I]=newvect(ExpMatColNum+1)$ + + for(I=0;I<ExpMatColNum;I++) + for(J=I;J<ExpMatColNum;J++) for(K=0;K<ExpMatRowNum;K++) - NormMat[I][J]+=ExpMat[K][I]*ExpMat[K][J]$ + NormMat0[I][J]+= + ExpMat[K][I]* + ExpMat[K][J]$ + NormMat1=newvect(ExtMatColNum)$ + for(I=0;I<ExtMatColNum;I++) + NormMat1[I]=newvect(ExtMatColNum)$ + + WorkMat=newvect(ExtMatColNum)$ + for(I=0;I<ExtMatColNum;I++) + WorkMat[I]=newvect(ExtMatColNum)$ + for(I=0;I<ExpMatColNum;I++) - for(J=0;J<ExpMatRowNum;J++) - NormMat[I][ExpMatColNum]+=ExpMat[J][I]$ + for(J=I;J<ExpMatColNum;J++) + NormMat1[I][J]=NormMat0[I][J]$ - SolveList=[]$ - for(I=0;I<ExpMatColNum;I++){ - TMP=0$ - for(J=0;J<ExpMatColNum;J++) - TMP+=NormMat[I][J]*Vars[J]$ + for(I=0;I<ExpMatColNum;I++) + for(J=0;J<PolyListNum;J++) + for(K=OneMat[J];K<OneMat[J+1];K++) + NormMat1[I][J+ExpMatColNum]-=ExpMat[K][I]$ - TMP-=NormMat[I][ExpMatColNum]$ - SolveList=cons(TMP,SolveList)$ - } + for(I=0;I<PolyListNum;I++) + NormMat1[I+ExpMatColNum][I+ExpMatColNum]=OneMat[I+1]-OneMat[I]$ - Rea=vars(SolveList)$ - Res=solve(SolveList,Vars)$ + if(jacobi(ExtMatColNum,NormMat1,WorkMat)){ - if(nonposdegchk(Res)){ - Res=getgcd(Res,Rea)$ - TMP1=makeret1(Res,Vars); - if(car(TMP1)==0){ - TMP2=roundret(cdr(TMP1)); - TMP3=map(drint,cdr(TMP1))$ - RET=cons([cdr(TMP1),newvect(length(TMP3),TMP3),TMP2],RET)$ + Res=newvect(ExtMatColNum)$ + for(I=0;I<ExtMatColNum;I++){ + Res[I]=newvect(2)$ + Res[I][0]=ExtVars[I]$ + Res[I][1]=WorkMat[ExtMatColNum-1][I]$ } - else - RET=cons([cdr(TMP1),[],[]],RET)$ - } -/* third */ + if(nonposdegchk(Res)){ - ExpMat=qsort(ExpMat,junban2)$ - ExpMat2=[]$ - for(I=0;I<size(ExpMat)[0];I++) - if(car(ExpMat2)!=ExpMat[I]) - ExpMat2=cons(ExpMat[I],ExpMat2)$ + TMP1=makeret(Res,Vars,1)$ - ExpMat=newvect(length(ExpMat2),ExpMat2)$ - ExpMatRowNum=size(ExpMat)[0]$ - ExpMatColNum=size(ExpMat[0])[0]$ + if(FLAG==0){ + TMP=roundret(TMP1[1])$ - NormMat=newmat(ExpMatColNum,ExpMatColNum+1)$ + RET=append(RET,wsort(TMP1[1],Vars,map(drint,TMP1[1]*1.0),1))$ - for(I=0;I<ExpMatColNum;I++) - for(J=0;J<ExpMatColNum;J++) - for(K=0;K<ExpMatRowNum;K++) - NormMat[I][J]+=ExpMat[K][I]*ExpMat[K][J]$ + if(TMP!=[]) + RET=append(RET,wsort(TMP1[1],Vars,TMP,2))$ + } + else if(FLAG==1) + RET=append(RET,[[1,Vars,vtol(TMP1[1])]])$ + } + } + + return [NormMat0,RET]$ +} - for(I=0;I<ExpMatColNum;I++) - for(J=0;J<ExpMatRowNum;J++) - NormMat[I][ExpMatColNum]+=ExpMat[J][I]$ +def weight(PolyList,Vars,FLAG){ - SolveList=[]$ - for(I=0;I<ExpMatColNum;I++){ - TMP=0$ - for(J=0;J<ExpMatColNum;J++) - TMP+=NormMat[I][J]*Vars[J]$ + Vars0=vars(PolyList)$ + Vars1=[]$ + for(I=0;I<length(Vars);I++) + if(member(Vars[I],Vars0)) + Vars1=cons(Vars[I],Vars1)$ - TMP-=NormMat[I][ExpMatColNum]$ - SolveList=cons(TMP,SolveList)$ - } + Vars=reverse(Vars1)$ - Rea=vars(SolveList)$ - Res=solve(SolveList,Vars)$ + RET=[]$ - if(nonposdegchk(Res)){ - Res=getgcd(Res,Rea)$ - TMP1=makeret1(Res,Vars); - if(car(TMP1)==0){ - TMP2=roundret(cdr(TMP1)); - TMP3=map(drint,cdr(TMP1))$ - RET=cons([cdr(TMP1),newvect(length(TMP3),TMP3),TMP2],RET)$ - } - else - RET=cons([cdr(TMP1),[],[]],RET)$ + TMP=qcheck(PolyList,Vars,FLAG)$ + + if(TMP!=[]){ + RET=append(RET,TMP)$ + return RET$ } - RET=cons(Vars,reverse(RET))$ - RET=cons(0,RET)$ - return RET$ -} - -def average(PolyList,Vars){ - - RET=[]$ dp_ord(2)$ PolyListNum=length(PolyList)$ + OneMat=newvect(PolyListNum+1,[0])$ ExpMat=[]$ - for(I=0;I<PolyListNum;I++) - for(Poly=dp_ptod(PolyList[I],Vars);Poly!=0;Poly=dp_rest(Poly)) + for(I=0;I<PolyListNum;I++){ + for(Poly=dp_ptod(PolyList[I],Vars); + Poly!=0;Poly=dp_rest(Poly)){ ExpMat=cons(dp_etov(dp_ht(Poly)),ExpMat)$ + } + OneMat[I+1]=length(ExpMat)$ + } ExpMat=reverse(ExpMat)$ ExpMat=newvect(length(ExpMat),ExpMat)$ - ExpMat=qsort(ExpMat,junban2)$ + TMP=unitweight1(ExpMat,Vars,PolyListNum,OneMat,FLAG)$ + + RET=append(RET,TMP[1])$ + + TMP=unitweight2(TMP[0],ExpMat,Vars,FLAG,3)$ + + RET=append(RET,TMP)$ + + ExpMat=qsort(ExpMat,junban)$ + ExpMat2=[]$ for(I=0;I<size(ExpMat)[0];I++) if(car(ExpMat2)!=ExpMat[I]) ExpMat2=cons(ExpMat[I],ExpMat2)$ - ExpMat=newvect(length(ExpMat2),ExpMat2)$ - ExpMatRowNum=size(ExpMat)[0]$ - ExpMatColNum=size(ExpMat[0])[0]$ + if(size(ExpMat)[0]!=length(ExpMat2)){ + ExpMat=newvect(length(ExpMat2),ExpMat2)$ + RET=append(RET,unitweight2(0,ExpMat,Vars,FLAG,5))$ + } + else{ + TMP0=map(ltov,TMP0)$ - Res=newvect(ExpMatColNum); - for(I=0;I<ExpMatColNum;I++) - Res[I]=newvect(2,[Vars[I]])$ + for(I=0;I<length(TMP0);I++) + if(TMP0[I][0]==3) + TMP0[I][0]=5$ + else if(TMP0[I][0]==4) + TMP0[I][0]=6$ - for(I=0;I<ExpMatRowNum;I++) - for(J=0;J<ExpMatColNum;J++) - Res[J][1]+=ExpMat[I][J]$ + TMP0=map(vtol,TMP0)$ - for(I=0;I<ExpMatColNum;I++) - if(Res[I][1]==0) - Res[I][1]=1$ - else - Res[I][1]=1/Res[I][1]$ - - RET=cons(makeret(vtol(Res),Vars,1),RET)$ - RET=cons(Vars,RET)$ + RET=append(RET,TMP0)$ + } return RET$ }