| version 1.3, 2003/11/05 08:26:57 | version 1.25, 2004/01/08 15:58:58 | 
|  |  | 
| load("solve")$ | load("solve")$ | 
| load("gr")$ | load("gr")$ | 
|  |  | 
| def nonposdegchk(Res){ | #define EPS 1E-6 | 
|  | #define TINY 1E-20 | 
| for(I=0;I<length(Res);I++) | #define MAX_ITER 100 | 
| if(Res[I][1]<=0) | #define ROUND_THRESHOLD 0.4 | 
| return 0$ |  | 
|  | def rotate(A,I,J,K,L,C,S){ | 
| return 1$ |  | 
| } | X=A[I][J]; | 
|  | Y=A[K][L]; | 
| def resvars(Res,Vars){ | A[I][J]=X*C-Y*S; | 
|  | A[K][L]=X*S+Y*C; | 
| ResVars=newvect(length(Vars),Vars)$ |  | 
|  | return 1; | 
| for(I=0;I<length(Res);I++){ | } | 
|  |  | 
| for(J=0;J<size(ResVars)[0];J++) | def jacobi(N,A,W){ | 
| if(Res[I][0]==ResVars[J]) |  | 
| break$ | S=OFFDIAG=0.0; | 
|  |  | 
| ResVars[J]=Res[I][1]$ | for(J=0;J<N;J++){ | 
| } |  | 
|  | for(K=0;K<N;K++) | 
| return(ResVars)$ | W[J][K]=0.0; | 
| } |  | 
|  | W[J][J]=1.0; | 
| def makeret1(Res,Vars){ | S+=A[J][J]*A[J][J]; | 
|  |  | 
| VarsNum=length(Vars)$ | for(K=J+1;K<N;K++) | 
|  | OFFDIAG+=A[J][K]*A[J][K]; | 
| ResVec=newvect(VarsNum,Vars)$ | } | 
|  |  | 
| for(I=0,M=0;I<length(Res);I++){ | TOLERANCE=EPS*EPS*(S/2+OFFDIAG); | 
|  |  | 
| for(J=0;J<VarsNum;J++) | for(ITER=1;ITER<=MAX_ITER;ITER++){ | 
| if(Res[I][0]==Vars[J]) |  | 
| break$ | OFFDIAG=0.0; | 
|  | for(J=0;J<N-1;J++) | 
| if(J<VarsNum){ | for(K=J+1;K<N;K++) | 
| ResVec[J]=Res[I][1]$ | OFFDIAG+=A[J][K]*A[J][K]; | 
|  |  | 
| if(type(ResVec[J])==1){ | if(OFFDIAG < TOLERANCE) | 
| if(M==0) | break; | 
| M=ResVec[J]$ |  | 
| else | for(J=0;J<N-1;J++){ | 
| if(ResVec[J]<M) | for(K=J+1;K<N;K++){ | 
| M=ResVec[J]$ |  | 
| } | if(dabs(A[J][K])<TINY) | 
| } | continue; | 
|  |  | 
| } | T=(A[K][K]-A[J][J])/(2.0*A[J][K]); | 
|  |  | 
| for(F=0,I=0;I<VarsNum;I++) | if(T>=0.0) | 
| if(type(ResVec[I])!=1){ | T=1.0/(T+dsqrt(T*T+1)); | 
| F=1$ | else | 
| break$ | T=1.0/(T-dsqrt(T*T+1)); | 
| } |  | 
|  | C=1.0/dsqrt(T*T+1); | 
| if(F==0) |  | 
| for(I=0;I<VarsNum;I++) | S=T*C; | 
| ResVec[I]=ResVec[I]/M*1.0$ |  | 
|  | T*=A[J][K]; | 
| for(I=0;I<VarsNum;I++) |  | 
| for(J=0;J<length(Vars);J++) | A[J][J]-=T; | 
| ResVec[I]=subst(ResVec[I],Vars[J], | A[K][K]+=T; | 
| strtov(rtostr(Vars[J])+"_deg"))$ | A[J][K]=0.0; | 
|  |  | 
| ResVec=cons(F,vtol(ResVec))$ | for(I=0;I<J;I++) | 
| return ResVec$ | rotate(A,I,J,I,K,C,S); | 
| } |  | 
|  | for(I=J+1;I<K;I++) | 
| def junban1(A,B){ | rotate(A,J,I,I,K,C,S); | 
| return (nmono(A)<nmono(B) ? -1:(nmono(A)>nmono(B) ? 1:0))$ |  | 
| } | for(I=K+1;I<N;I++) | 
|  | rotate(A,J,I,K,I,C,S); | 
| def junban2(A,B){ |  | 
|  | for(I=0;I<N;I++) | 
| for(I=0;I<size(A)[0];I++){ | rotate(W,J,I,K,I,C,S); | 
| if(A[I]<B[I]) |  | 
| return 1$ | } | 
|  | } | 
| if(A[I]>B[I]) | } | 
| return -1$ |  | 
| } | if (ITER > MAX_ITER) | 
|  | return 0; | 
| return 0$ |  | 
| } | for(I=0;I<N-1;I++){ | 
|  |  | 
| def roundret(V){ | K=I; | 
|  |  | 
| VN=length(V)$ | T=A[K][K]; | 
| RET0=newvect(VN,V)$ |  | 
|  | for(J=I+1;J<N;J++) | 
| for(I=1;I<1000;I++){ | if(A[J][J]>T){ | 
| RET1=I*RET0$ | K=J; | 
| for(J=0;J<VN;J++){ | T=A[K][K]; | 
| X=drint(RET1[J])$ | } | 
| if(dabs(X-RET1[J])<0.2) |  | 
| RET1[J]=X$ | A[K][K]=A[I][I]; | 
| else |  | 
| break$ | A[I][I]=T; | 
| } |  | 
| if(J==VN) | V=W[K]; | 
| break$ |  | 
| } | W[K]=W[I]; | 
|  |  | 
| if(I==1000) | W[I]=V; | 
| return []$ | } | 
| else |  | 
| return RET1$ | return 1; | 
| } | } | 
|  |  | 
| def chkou(L,ExpMat,CHAGORD){ | def interval2value(A,Vars){ | 
|  |  | 
| P=1$ | B=atl(A)$ | 
| F=ExpMat[L]$ |  | 
|  | if(length(B)>2){ | 
| for(I=0;I<L;I++){ | print("bug")$ | 
| Q=ExpMat[L][CHAGORD[I]]$ | return []$ | 
| for(J=0;J<size(ExpMat[0])[0];J++){ | } | 
| ExpMat[L][CHAGORD[J]]=red((ExpMat[I][CHAGORD[I]] |  | 
| *ExpMat[L][CHAGORD[J]]- | if(length(B)==0){ | 
| Q*ExpMat[I][CHAGORD[J]])/P)$ | if(A) | 
| } | return [Vars,1]$ | 
|  | else | 
| P=ExpMat[I][CHAGORD[I]]$ | return []$ | 
| } | } | 
|  | else if(length(B)==1){ | 
| for(J=0;J<size(ExpMat[0])[0];J++) |  | 
| if(ExpMat[L][CHAGORD[J]]!=0) | C=fargs(B[0])$ | 
| break$ | D=vars(C)$ | 
|  | E=solve(C,D)$ | 
| if(J==size(ExpMat[0])[0]) |  | 
| return L$ | if(fop(B[0])==15) | 
| else{ | return [Vars,E[0][1]+1]$ | 
| TMP=CHAGORD[L]$ | else if(fop(B[0])==11) | 
| CHAGORD[L]=CHAGORD[J]$ | return [Vars,E[0][1]-1]$ | 
| CHAGORD[J]=TMP$ | else if(fop(B[0])==8) | 
| return (L+1)$ | return [Vars,E[0][1]]$ | 
| } | else | 
| } | return []$ | 
|  | } | 
| def qcheck0(PolyList,Vars){ | else{ | 
|  |  | 
| RET=[]$ | C=fargs(B[0])$ | 
| PolyListNum=length(PolyList)$ | D=vars(C)$ | 
| VarsNum=length(Vars)$ | E=solve(C,D)$ | 
|  |  | 
| ExpMat=newvect(VarsNum)$ | C=fargs(B[1])$ | 
| CHAGORD=newvect(VarsNum)$ | D=vars(C)$ | 
| for(I=0;I<VarsNum;I++) | F=solve(C,D)$ | 
| CHAGORD[I]=I$ |  | 
|  | return [Vars,(E[0][1]+F[0][1])/2]$ | 
| L=0$ | } | 
| for(I=0;I<PolyListNum;I++){ |  | 
| Poly=dp_ptod(PolyList[I],Vars)$ | } | 
| BASE0=dp_etov(dp_ht(Poly))$ |  | 
| Poly=dp_rest(Poly)$ | def fixpointmain(F,Vars){ | 
| for(;Poly!=0;Poly=dp_rest(Poly)){ |  | 
| ExpMat[L]=dp_etov(dp_ht(Poly))-BASE0$ | RET=[]$ | 
| L=chkou(L,ExpMat,CHAGORD)$ | for(I=length(Vars)-1;I>=1;I--){ | 
| if(L==VarsNum-1){ |  | 
| RET=cons(ExpMat,RET)$ | for(H=[],J=0;J<I;J++) | 
| RET=cons(CHAGORD,RET)$ | H=cons(Vars[J],H)$ | 
| RET=cons(L,RET)$ |  | 
| return RET$ | G=interval2value(qe(ex(H,F)),Vars[I])$ | 
| } |  | 
| } | if(G==[]) | 
| } | return RET$ | 
|  | else | 
| RET=cons(ExpMat,RET)$ | RET=cons(G,RET)$ | 
| RET=cons(CHAGORD,RET)$ |  | 
| RET=cons(L,RET)$ | F=subf(F,G[0],G[1])$ | 
| return RET$ | } | 
| } |  | 
|  | G=interval2value(simpl(F),Vars[0])$ | 
| def inner(A,B){ |  | 
|  | if(G==[]) | 
| SUM=0$ | return RET$ | 
| for(I=0;I<size(A)[0];I++) | else | 
| SUM+=A[I]*B[I]$ | RET=cons(G,RET)$ | 
|  |  | 
| return SUM$ | return RET$ | 
| } | } | 
|  |  | 
| def checktd(PolyList,Vars,ResVars){ |  | 
|  | def fixedpoint(A,FLAG){ | 
| PolyListNum=length(PolyList)$ |  | 
| VarsNum=length(Vars)$ | Vars=vars(A)$ | 
|  |  | 
| L=0$ | N=length(A)$ | 
| for(I=0;I<PolyListNum;I++){ |  | 
| Poly=dp_ptod(PolyList[I],Vars)$ | if (FLAG==0) | 
| J0=inner(dp_etov(dp_ht(Poly)),ResVars)$ | for(F=@true,I=0;I < N; I++ ) { F = F @&& A[I] @> 0$ } | 
| Poly=dp_rest(Poly)$ | else if (FLAG==1) | 
| for(;Poly!=0;Poly=dp_rest(Poly)) | for(F=@true,I=0;I < N; I++ ) { F = F @&& A[I] @< 0$ } | 
| if(J0!=inner(dp_etov(dp_ht(Poly)),ResVars)) |  | 
| return 0$ | return fixpointmain(F,Vars)$ | 
| } | } | 
|  |  | 
| return 1$ | def nonzerovec(A){ | 
| } |  | 
|  | for(I=0;I<size(A)[0];I++) | 
| def getgcd(A,B){ | if(A[I]!=0) | 
|  | return 1$ | 
| VarsNumA=length(A)$ |  | 
| VarsNumB=length(B)$ | return 0$ | 
|  | } | 
| C=newvect(VarsNumB,B)$ |  | 
|  | def junban(A,B){ | 
| for(I=0;I<VarsNumA;I++){ | return (A<B ? 1:(A>B ? -1:0))$ | 
|  | } | 
| for(J=0;J<VarsNumB;J++) |  | 
| if(C[J]==A[I][0]) | def worder(A,B){ | 
| break$ | return (A[0]<B[0] ? 1:(A[0]>B[0] ? -1:0))$ | 
|  | } | 
| C[J]=A[I][1]$ |  | 
| } | def bsort(A){ | 
|  |  | 
| D=0$ | K=size(A)[0]-1$ | 
| for(I=0;I<VarsNumB;I++) | while(K>=0){ | 
| D=gcd(D,C[I])$ | J=-1$ | 
|  | for(I=1;I<=K;I++) | 
| if(D!=0){ | if(A[I-1][0]<A[I][0]){ | 
|  | J=I-1$ | 
| for(I=0;I<VarsNumB;I++) | X=A[J]$ | 
| C[I]=red(C[I]/D)$ | A[J]=A[I]$ | 
|  | A[I]=X$ | 
| } | } | 
|  | K=J$ | 
| for(L=1,D=0,I=0;I<VarsNumB;I++){ | } | 
|  | return A$ | 
| if(type(C[I])==1){ | } | 
| L=ilcm(L,dn(C[I]))$ |  | 
| D=igcd(D,nm(C[I]))$ | def perm(I,P,TMP){ | 
| } |  | 
| else | if(I>0){ | 
| break$ | TMP=perm(I-1,P,TMP)$ | 
|  | for(J=I-1;J>=0;J--){ | 
| } | T=P[I]$ | 
|  | P[I]=P[J]$ | 
| if(I==VarsNumB) | P[J]=T$ | 
| for(I=0;I<VarsNumB;I++) | TMP=perm(I-1,P,TMP)$ | 
| C[I]=C[I]*L/D$ | T=P[I]$ | 
|  | P[I]=P[J]$ | 
| RET=newvect(VarsNumB)$ | P[J]=T$ | 
| for(I=0;I<VarsNumB;I++){ | } | 
| RET[I]=newvect(2)$ |  | 
| RET[I][0]=B[I]$ | return TMP$ | 
| RET[I][1]=C[I]$ | } | 
| } | else{ | 
|  | for(TMP0=[],K=0;K<size(P)[0];K++) | 
| return vtol(map(vtol,RET))$ | TMP0=cons(P[K],TMP0)$ | 
| } |  | 
|  | TMP=cons(TMP0,TMP)$ | 
| def qcheck(PolyList,Vars){ | return TMP$ | 
|  | } | 
| RET=[]$ | } | 
| Res=qcheck0(PolyList,Vars)$ |  | 
| VarsNum=length(Vars)$ | def marge(A,B){ | 
|  |  | 
| IndNum=Res[0]$ | RET=[]$ | 
| CHAGORD=Res[1]$ | for(I=0;I<length(A);I++) | 
| ExpMat=Res[2]$ | for(J=0;J<length(B);J++) | 
|  | RET=cons(append(A[I],B[J]),RET)$ | 
| SolveList=[]$ |  | 
| for(I=0;I<IndNum;I++){ | return RET$ | 
| TMP=0$ | } | 
| for(J=0;J<VarsNum;J++) |  | 
| TMP+=ExpMat[I][CHAGORD[J]]*Vars[CHAGORD[J]]$ | def wsort(A,B,C,FLAG,ID){ | 
|  |  | 
| SolveList=cons(TMP,SolveList)$ | if(FLAG==0){ | 
| } | D=newvect(length(B))$ | 
|  | for(I=0;I<length(B);I++) | 
| VarsList=[]$ | D[I]=[A[I],B[I],C[I]]$ | 
| for(I=0;I<VarsNum;I++) |  | 
| VarsList=cons(Vars[CHAGORD[I]],VarsList)$ | D=bsort(D)$ | 
|  | E=[]$ | 
| Rea=vars(SolveList)$ | for(I=0;I<length(B);I++) | 
| Res=solve(reverse(SolveList),reverse(VarsList))$ | E=cons(D[I][1],E)$ | 
|  | E=reverse(E)$ | 
| if(nonposdegchk(Res)){ | F=[]$ | 
|  | for(I=0;I<length(B);I++) | 
| Res=getgcd(Res,Rea)$ | F=cons(D[I][2],F)$ | 
| ResVars=resvars(Res,Vars)$ | F=reverse(F)$ | 
|  |  | 
| if(checktd(PolyList,Vars,ResVars)==1){ | return [[ID,E,F]]$ | 
|  | } | 
| for(J=0;J<length(Vars);J++) | else{ | 
| ResVars=map(subst,ResVars,Vars[J], | D=newvect(length(B))$ | 
| strtov(rtostr(Vars[J])+"_deg"))$ | for(I=0;I<length(B);I++) | 
|  | D[I]=[A[I],B[I],C[I]]$ | 
| RET=cons([vtol(ResVars),ResVars,[]],RET)$ |  | 
| return cons(1,RET)$ | D=qsort(D,worder)$ | 
| } | D0=[]$ | 
| else |  | 
| return cons(0,RET)$ | for(I=0,J=0,TMP=[],X=0;I<size(D)[0];I++){ | 
| } | if(X==D[I][0]) | 
| else | TMP=cons(cdr(D[I]),TMP)$ | 
| return cons(0,RET)$ | else{ | 
|  | D0=cons(TMP,D0)$ | 
| } | TMP=[]$ | 
|  | TMP=cons(cdr(D[I]),TMP)$ | 
| def weight(PolyList,Vars){ | X=car(D[I])$ | 
|  | } | 
| Vars0=vars(PolyList)$ | } | 
| Vars1=[]$ | D0=cdr(reverse(cons(TMP,D0)))$ | 
| for(I=0;I<length(Vars);I++) | D0=map(ltov,D0)$ | 
| if(member(Vars[I],Vars0)) | for(I=0,TMP=[[]];I<length(D0);I++){ | 
| Vars1=cons(Vars[I],Vars1)$ | TMP0=perm(length(D0[I])-1,D0[I],[])$ | 
|  | TMP=marge(TMP,TMP0)$ | 
| Vars=reverse(Vars1)$ | } | 
|  |  | 
| RET=[]$ | RET=[]$ | 
|  | for(I=0;I<length(TMP);I++){ | 
| TMP=qcheck(PolyList,Vars)$ | TMP0=[]$ | 
|  | TMP1=[]$ | 
| if(car(TMP)==1){ | for(J=0;J<length(TMP[I]);J++){ | 
| RET=cdr(TMP)$ | TMP0=cons(TMP[I][J][0],TMP0)$ | 
| RET=cons(Vars,RET)$ | TMP1=cons(TMP[I][J][1],TMP1)$ | 
| RET=cons(1,RET)$ | } | 
| return RET$ | TMP0=reverse(TMP0)$ | 
| } | TMP1=reverse(TMP1)$ | 
|  |  | 
| dp_ord(2)$ | RET=cons([ID,TMP0,TMP1],RET)$ | 
|  | } | 
| PolyListNum=length(PolyList)$ |  | 
| VPolyList=qsort(newvect(PolyListNum,PolyList),junban1)$ | return RET$ | 
| VPolyList=vtol(VPolyList)$ | } | 
|  | } | 
| ExpMat=[]$ |  | 
| for(I=0;I<PolyListNum;I++) | def nonposdegchk(Res){ | 
| for(Poly=dp_ptod(VPolyList[I],Vars);Poly!=0;Poly=dp_rest(Poly)) |  | 
| ExpMat=cons(dp_etov(dp_ht(Poly)),ExpMat)$ | for(I=0;I<length(Res);I++) | 
|  | if(Res[I][1]<=0) | 
| ExpMat=reverse(ExpMat)$ | return 0$ | 
| ExpMat=newvect(length(ExpMat),ExpMat)$ |  | 
|  | return 1$ | 
|  | } | 
| /* first */ |  | 
|  | def getgcd(A,B){ | 
| ExpMatRowNum=size(ExpMat)[0]$ |  | 
| ExpMatColNum=size(ExpMat[0])[0]$ | VarsNumA=length(A)$ | 
| ExtMatColNum=ExpMatColNum+PolyListNum$ | VarsNumB=length(B)$ | 
|  |  | 
| OneMat=newvect(PolyListNum+1,[0])$ | C=newvect(VarsNumB,B)$ | 
| for(I=0,SUM=0;I<PolyListNum;I++){ |  | 
| SUM+=nmono(VPolyList[I])$ | for(I=0;I<VarsNumA;I++){ | 
| OneMat[I+1]=SUM$ |  | 
| } | for(J=0;J<VarsNumB;J++) | 
|  | if(B[J]==A[I][0]) | 
| RevOneMat=newvect(ExpMatRowNum)$ | break$ | 
| for(I=0;I<PolyListNum;I++) |  | 
| for(J=OneMat[I];J<OneMat[I+1];J++) | if(J<VarsNumB) | 
| RevOneMat[J]=I$ | C[J]=A[I][1]$ | 
|  | } | 
| NormMat=newmat(ExpMatColNum,ExtMatColNum)$ |  | 
|  | D=0$ | 
| for(I=0;I<ExpMatColNum;I++) | for(I=0;I<VarsNumB;I++) | 
| for(J=0;J<ExpMatColNum;J++) | D=gcd(D,C[I])$ | 
| for(K=0;K<ExpMatRowNum;K++) |  | 
| NormMat[I][J]+=ExpMat[K][I]*ExpMat[K][J]$ | if(D!=0){ | 
|  | C=C/D$ | 
| for(I=0;I<ExpMatColNum;I++) | C=map(red,C)$ | 
| for(J=0;J<PolyListNum-1;J++) | } | 
| for(K=OneMat[J];K<OneMat[J+1];K++) |  | 
| NormMat[I][J+ExpMatColNum]-=ExpMat[K][I]$ | for(L=1,D=0,I=0;I<VarsNumB;I++){ | 
|  | if(type(TMP=dn(C[I]))==1) | 
| for(I=0;I<ExpMatColNum;I++) | L=ilcm(L,TMP)$ | 
| for(J=OneMat[PolyListNum-1];J<OneMat[PolyListNum];J++) |  | 
| NormMat[I][ExtMatColNum-1]+=ExpMat[J][I]$ | if(type(TMP=nm(C[I]))==1) | 
|  | D=igcd(D,TMP)$ | 
| NormMat2=newmat(PolyListNum-1,ExpMatColNum+1)$ | } | 
|  |  | 
| for(I=0;I<PolyListNum-1;I++) | C=C*L$ | 
| for(J=0;J<ExpMatColNum;J++) | if(D!=0) | 
| for(K=OneMat[I];K<OneMat[I+1];K++) | C=C/D$ | 
| NormMat2[I][J]-=ExpMat[K][J]$ |  | 
|  | RET=[]$ | 
| for(I=0;I<PolyListNum-1;I++) | for(I=0;I<VarsNumB;I++) | 
| NormMat2[I][ExpMatColNum]=OneMat[I+1]-OneMat[I]$ | RET=cons([B[I],C[I]],RET)$ | 
|  |  | 
| ExtVars=Vars$ | return RET$ | 
| for(I=0;I<PolyListNum-1;I++) | } | 
| ExtVars=append(ExtVars,[uc()])$ |  | 
|  | def makeret(Res,Vars,FLAG){ | 
| SolveList=[]$ |  | 
| for(I=0;I<ExpMatColNum;I++){ | ResNum=length(Res)$ | 
| TMP=0$ | VarsNum=length(Vars)$ | 
| for(J=0;J<ExtMatColNum-1;J++) |  | 
| TMP+=NormMat[I][J]*ExtVars[J]$ | ResVec=newvect(ResNum)$ | 
|  |  | 
| TMP-=NormMat[I][ExtMatColNum-1]$ | for(M=0,I=0;I<ResNum;I++){ | 
| SolveList=cons(TMP,SolveList)$ | if(member(Res[I][0],Vars)){ | 
| } | ResVec[I]=Res[I][1]$ | 
|  |  | 
| for(I=0;I<PolyListNum-1;I++){ | if(FLAG && type(ResVec[I])==1){ | 
| TMP=0$ | if(M==0) | 
| for(J=0;J<ExpMatColNum;J++) | M=ResVec[I]$ | 
| TMP+=NormMat2[I][J]*ExtVars[J]$ | else | 
|  | if(ResVec[I]<M) | 
| TMP+=NormMat2[I][ExpMatColNum]*ExtVars[I+ExpMatColNum]$ | M=ResVec[I]$ | 
|  | } | 
| SolveList=cons(TMP,SolveList)$ | } | 
| } | } | 
|  |  | 
| Rea=vars(SolveList)$ | if(M!=0) | 
| Res=solve(SolveList,reverse(ExtVars))$ | ResVec=ResVec/M; | 
|  |  | 
| if(nonposdegchk(Res)){ | RET=newvect(VarsNum,Vars)$ | 
| Res=getgcd(Res,Rea)$ |  | 
| TMP1=makeret1(Res,Vars); | for(I=0;I<ResNum;I++){ | 
| if(car(TMP1)==0){ | for(J=0;J<VarsNum;J++) | 
| TMP2=roundret(cdr(TMP1)); | if(Vars[J]==Res[I][0]) | 
| TMP3=map(drint,cdr(TMP1))$ | break$ | 
| RET=cons([cdr(TMP1),newvect(length(TMP3),TMP3),TMP2],RET)$ |  | 
| } | if(J<VarsNum) | 
| else | RET[J]=ResVec[I]$ | 
| RET=cons([cdr(TMP1),[],[]],RET)$ | } | 
| } |  | 
|  |  | 
| /* second */ | for(J=0;J<length(Vars);J++) | 
|  | RET=map(subst,RET,Vars[J], | 
| NormMat=newmat(ExpMatColNum,ExpMatColNum+1)$ | strtov(rtostr(Vars[J])+"_deg"))$ | 
|  |  | 
| for(I=0;I<ExpMatColNum;I++) | for(I=0;I<VarsNum;I++) | 
| for(J=0;J<ExpMatColNum;J++) | if(type(RET[I])!=1) | 
| for(K=0;K<ExpMatRowNum;K++) | return [1,RET]$ | 
| NormMat[I][J]+=ExpMat[K][I]*ExpMat[K][J]$ |  | 
|  | return [0,RET]$ | 
| for(I=0;I<ExpMatColNum;I++) | } | 
| for(J=0;J<ExpMatRowNum;J++) |  | 
| NormMat[I][ExpMatColNum]+=ExpMat[J][I]$ | def roundret(V){ | 
|  |  | 
| SolveList=[]$ | VN=size(V)[0]$ | 
| for(I=0;I<ExpMatColNum;I++){ |  | 
| TMP=0$ | RET0=V$ | 
| for(J=0;J<ExpMatColNum;J++) | for(I=1;I<1000;I++){ | 
| TMP+=NormMat[I][J]*Vars[J]$ | RET1=I*RET0$ | 
|  | for(J=0;J<VN;J++){ | 
| TMP-=NormMat[I][ExpMatColNum]$ | X=drint(RET1[J])$ | 
| SolveList=cons(TMP,SolveList)$ | if(dabs(X-RET1[J])<ROUND_THRESHOLD) | 
| } | RET1[J]=X$ | 
|  | else | 
| Rea=vars(SolveList)$ | break$ | 
| Res=solve(SolveList,Vars)$ | } | 
|  | if(J==VN) | 
| if(nonposdegchk(Res)){ | break$ | 
| Res=getgcd(Res,Rea)$ | } | 
| TMP1=makeret1(Res,Vars); |  | 
| if(car(TMP1)==0){ | if(I==1000) | 
| TMP2=roundret(cdr(TMP1)); | return []$ | 
| TMP3=map(drint,cdr(TMP1))$ | else | 
| RET=cons([cdr(TMP1),newvect(length(TMP3),TMP3),TMP2],RET)$ | return RET1$ | 
| } | } | 
| else |  | 
| RET=cons([cdr(TMP1),[],[]],RET)$ | def chkou(L,ExpMat,CHAGORD){ | 
| } |  | 
|  | for(P=1,I=0;I<L;I++){ | 
| /* third */ | Q=ExpMat[L][CHAGORD[I]]$ | 
|  | for(J=0;J<size(ExpMat[0])[0];J++){ | 
| ExpMat=qsort(ExpMat,junban2)$ | ExpMat[L][CHAGORD[J]]=red((ExpMat[I][CHAGORD[I]] | 
| ExpMat2=[]$ | *ExpMat[L][CHAGORD[J]]- | 
| for(I=0;I<size(ExpMat)[0];I++) | Q*ExpMat[I][CHAGORD[J]])/P)$ | 
| if(car(ExpMat2)!=ExpMat[I]) | } | 
| ExpMat2=cons(ExpMat[I],ExpMat2)$ |  | 
|  | P=ExpMat[I][CHAGORD[I]]$ | 
| ExpMat=newvect(length(ExpMat2),ExpMat2)$ | } | 
| ExpMatRowNum=size(ExpMat)[0]$ |  | 
| ExpMatColNum=size(ExpMat[0])[0]$ | for(J=0;J<size(ExpMat[0])[0];J++) | 
|  | if(ExpMat[L][CHAGORD[J]]!=0) | 
| NormMat=newmat(ExpMatColNum,ExpMatColNum+1)$ | break$ | 
|  |  | 
| for(I=0;I<ExpMatColNum;I++) | if(J==size(ExpMat[0])[0]) | 
| for(J=0;J<ExpMatColNum;J++) | return L$ | 
| for(K=0;K<ExpMatRowNum;K++) | else{ | 
| NormMat[I][J]+=ExpMat[K][I]*ExpMat[K][J]$ | TMP=CHAGORD[L]$ | 
|  | CHAGORD[L]=CHAGORD[J]$ | 
| for(I=0;I<ExpMatColNum;I++) | CHAGORD[J]=TMP$ | 
| for(J=0;J<ExpMatRowNum;J++) | return (L+1)$ | 
| NormMat[I][ExpMatColNum]+=ExpMat[J][I]$ | } | 
|  | } | 
| SolveList=[]$ |  | 
| for(I=0;I<ExpMatColNum;I++){ | def qcheckmain(PolyList,Vars){ | 
| TMP=0$ |  | 
| for(J=0;J<ExpMatColNum;J++) | RET=[]$ | 
| TMP+=NormMat[I][J]*Vars[J]$ | PolyListNum=length(PolyList)$ | 
|  | VarsNum=length(Vars)$ | 
| TMP-=NormMat[I][ExpMatColNum]$ |  | 
| SolveList=cons(TMP,SolveList)$ | ExpMat=newvect(VarsNum)$ | 
| } | CHAGORD=newvect(VarsNum)$ | 
|  | for(I=0;I<VarsNum;I++) | 
| Rea=vars(SolveList)$ | CHAGORD[I]=I$ | 
| Res=solve(SolveList,Vars)$ |  | 
|  | L=0$ | 
| if(nonposdegchk(Res)){ | for(I=0;I<PolyListNum;I++){ | 
| Res=getgcd(Res,Rea)$ | Poly=dp_ptod(PolyList[I],Vars)$ | 
| TMP1=makeret1(Res,Vars); | BASE0=dp_etov(dp_ht(Poly))$ | 
| if(car(TMP1)==0){ | Poly=dp_rest(Poly)$ | 
| TMP2=roundret(cdr(TMP1)); | for(;Poly!=0;Poly=dp_rest(Poly)){ | 
| TMP3=map(drint,cdr(TMP1))$ | ExpMat[L]=dp_etov(dp_ht(Poly))-BASE0$ | 
| RET=cons([cdr(TMP1),newvect(length(TMP3),TMP3),TMP2],RET)$ | L=chkou(L,ExpMat,CHAGORD)$ | 
| } | if(L==VarsNum-1) | 
| else | return [L,CHAGORD,ExpMat]$ | 
| RET=cons([cdr(TMP1),[],[]],RET)$ | } | 
| } | } | 
|  |  | 
| RET=cons(Vars,reverse(RET))$ | return [L,CHAGORD,ExpMat]$ | 
| RET=cons(0,RET)$ | } | 
| return RET$ |  | 
| } | def inner(A,B){ | 
|  |  | 
| def average(PolyList,Vars){ | SUM=0$ | 
|  | for(I=0;I<size(A)[0];I++) | 
| RET=[]$ | SUM+=A[I]*B[I]$ | 
| dp_ord(2)$ |  | 
|  | return SUM$ | 
| PolyListNum=length(PolyList)$ | } | 
|  |  | 
| ExpMat=[]$ | def checktd(PolyList,Vars,ResVars){ | 
| for(I=0;I<PolyListNum;I++) |  | 
| for(Poly=dp_ptod(PolyList[I],Vars);Poly!=0;Poly=dp_rest(Poly)) | PolyListNum=length(PolyList)$ | 
| ExpMat=cons(dp_etov(dp_ht(Poly)),ExpMat)$ | VarsNum=length(Vars)$ | 
|  |  | 
| ExpMat=reverse(ExpMat)$ | L=0$ | 
| ExpMat=newvect(length(ExpMat),ExpMat)$ | for(I=0;I<PolyListNum;I++){ | 
|  | Poly=dp_ptod(PolyList[I],Vars)$ | 
| ExpMat=qsort(ExpMat,junban2)$ | J0=inner(dp_etov(dp_ht(Poly)),ResVars)$ | 
| ExpMat2=[]$ | Poly=dp_rest(Poly)$ | 
| for(I=0;I<size(ExpMat)[0];I++) | for(;Poly!=0;Poly=dp_rest(Poly)) | 
| if(car(ExpMat2)!=ExpMat[I]) | if(J0!=inner(dp_etov(dp_ht(Poly)),ResVars)) | 
| ExpMat2=cons(ExpMat[I],ExpMat2)$ | return 0$ | 
|  | } | 
| ExpMat=newvect(length(ExpMat2),ExpMat2)$ |  | 
| ExpMatRowNum=size(ExpMat)[0]$ | return 1$ | 
| ExpMatColNum=size(ExpMat[0])[0]$ | } | 
|  |  | 
| Res=newvect(ExpMatColNum); | def value2(Vars,Ans){ | 
| for(I=0;I<ExpMatColNum;I++) |  | 
| Res[I]=newvect(2,[Vars[I]])$ | N=length(Vars)$ | 
|  | Res=newvect(N)$ | 
| for(I=0;I<ExpMatRowNum;I++) | for(I=0;I<N;I++){ | 
| for(J=0;J<ExpMatColNum;J++) | Res[I]=newvect(2)$ | 
| Res[J][1]+=ExpMat[I][J]$ | Res[I][0]=Vars[I]$ | 
|  | Res[I][1]=Ans[I]$ | 
| for(I=0;I<ExpMatColNum;I++) | } | 
| if(Res[I][1]==0) |  | 
| Res[I][1]=1$ | Res=getgcd(Res,Vars)$ | 
| else |  | 
| Res[I][1]=1/Res[I][1]$ | if(nonposdegchk(Res)){ | 
|  | TMP1=makeret(Res,Vars,1)$ | 
| RET=cons(makeret(vtol(Res),Vars,1),RET)$ | return vtol(TMP1[1])$ | 
| RET=cons(Vars,RET)$ | } | 
|  | else | 
| return RET$ | return []$ | 
| } | } | 
|  |  | 
| end$ | def qcheck(PolyList,Vars,FLAG){ | 
|  |  | 
|  | RET=[]$ | 
|  | Res=qcheckmain(PolyList,Vars)$ | 
|  | VarsNum=length(Vars)$ | 
|  |  | 
|  | IndNum=Res[0]$ | 
|  | CHAGORD=Res[1]$ | 
|  | ExpMat=Res[2]$ | 
|  |  | 
|  | SolveList=[]$ | 
|  | for(I=0;I<IndNum;I++){ | 
|  | TMP=0$ | 
|  | for(J=0;J<VarsNum;J++) | 
|  | TMP+=ExpMat[I][CHAGORD[J]]*Vars[CHAGORD[J]]$ | 
|  |  | 
|  | SolveList=cons(TMP,SolveList)$ | 
|  | } | 
|  |  | 
|  | Rea=vars(SolveList)$ | 
|  |  | 
|  | VarsList=[]$ | 
|  | for(I=0;I<VarsNum;I++) | 
|  | if(member(Vars[CHAGORD[I]],Rea)) | 
|  | VarsList=cons(Vars[CHAGORD[I]],VarsList)$ | 
|  |  | 
|  | Res=solve(reverse(SolveList),reverse(VarsList))$ | 
|  | Res=getgcd(Res,Rea)$ | 
|  |  | 
|  | if(nonposdegchk(Res)){ | 
|  |  | 
|  | ResVars=makeret(Res,Vars,0)$ | 
|  |  | 
|  | if(checktd(PolyList,Vars,ResVars[1])==1){ | 
|  | if(ResVars[0]==0){ | 
|  | RET=append(RET,wsort(ResVars[1],Vars, | 
|  | ResVars[1],FLAG,0))$ | 
|  |  | 
|  | return RET$ | 
|  | } | 
|  | else{ | 
|  |  | 
|  | TMP=vtol(ResVars[1])$ | 
|  |  | 
|  | /* | 
|  | RET=append(RET,[[0,Vars,TMP]])$ | 
|  | */ | 
|  |  | 
|  | if((TMP0=fixedpoint(TMP,0))!=[]){ | 
|  |  | 
|  | for(I=0;I<length(TMP0);I++) | 
|  | TMP=map(subst,TMP,TMP0[I][0], | 
|  | TMP0[I][1])$ | 
|  |  | 
|  | TMP=value2(Vars,TMP)$ | 
|  |  | 
|  | if(TMP!=[]) | 
|  | RET=append(RET,wsort(TMP,Vars, | 
|  | TMP,FLAG,1/10))$ | 
|  | } | 
|  | else if((TMP0=fixedpoint(TMP,1))!=[]){ | 
|  |  | 
|  | for(I=0;I<length(TMP0);I++) | 
|  | TMP=map(subst,TMP,TMP0[I][0], | 
|  | TMP0[I][1])$ | 
|  |  | 
|  | TMP=value2(Vars,TMP)$ | 
|  |  | 
|  | if(TMP!=[]) | 
|  | RET=append(RET,wsort(TMP,Vars, | 
|  | TMP,FLAG,1/10))$ | 
|  | } | 
|  |  | 
|  | return RET$ | 
|  | } | 
|  | } | 
|  | else | 
|  | return []$ | 
|  | } | 
|  | else | 
|  | return []$ | 
|  |  | 
|  | } | 
|  |  | 
|  | def leastsq(NormMat,ExpMat,Vars,FLAG,ID){ | 
|  |  | 
|  | RET=[]$ | 
|  |  | 
|  | ExpMatRowNum=size(ExpMat)[0]$ | 
|  | ExpMatColNum=size(ExpMat[0])[0]$ | 
|  |  | 
|  | if(NormMat==0){ | 
|  | NormMat=newmat(ExpMatColNum,ExpMatColNum)$ | 
|  |  | 
|  | 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]$ | 
|  | } | 
|  |  | 
|  | BVec=newvect(ExpMatColNum)$ | 
|  |  | 
|  | for(I=0;I<ExpMatColNum;I++) | 
|  | for(J=0;J<ExpMatRowNum;J++) | 
|  | BVec[I]+=ExpMat[J][I]$ | 
|  |  | 
|  | SolveList=[]$ | 
|  | for(I=0;I<ExpMatColNum;I++){ | 
|  | TMP=0$ | 
|  | for(J=0;J<I;J++) | 
|  | TMP+=NormMat[J][I]*Vars[J]$ | 
|  |  | 
|  | for(J=I;J<ExpMatColNum;J++) | 
|  | TMP+=NormMat[I][J]*Vars[J]$ | 
|  |  | 
|  | TMP-=BVec[I]$ | 
|  | SolveList=cons(TMP,SolveList)$ | 
|  | } | 
|  |  | 
|  | Rea=vars(SolveList)$ | 
|  |  | 
|  | VarsList=[]$ | 
|  | for(I=0;I<length(Vars);I++) | 
|  | if(member(Vars[I],Rea)) | 
|  | VarsList=cons(Vars[I],VarsList)$ | 
|  |  | 
|  | Res=solve(SolveList,VarsList)$ | 
|  | Res=getgcd(Res,Rea)$ | 
|  |  | 
|  | if(nonposdegchk(Res)){ | 
|  |  | 
|  | TMP1=makeret(Res,Vars,1)$ | 
|  |  | 
|  | if(TMP1[0]==0){ | 
|  |  | 
|  | TMP=roundret(TMP1[1])$ | 
|  |  | 
|  | RET=append(RET,wsort(TMP1[1],Vars, | 
|  | map(drint,TMP1[1]*1.0),FLAG,ID))$ | 
|  |  | 
|  | if(TMP!=[]) | 
|  | RET=append(RET,wsort(TMP1[1],Vars, | 
|  | TMP,FLAG,ID+1))$ | 
|  |  | 
|  | return RET$ | 
|  | } | 
|  | else{ | 
|  |  | 
|  | TMP=vtol(TMP1[1])$ | 
|  |  | 
|  | /* | 
|  | RET=append(RET,[[ID,Vars,vtol(TMP1[1])]])$ | 
|  | */ | 
|  |  | 
|  | if((TMP0=fixedpoint(TMP1[1],0))!=[]){ | 
|  |  | 
|  | for(I=0;I<length(TMP0);I++) | 
|  | TMP=map(subst,TMP,TMP0[I][0],TMP0[I][1])$ | 
|  |  | 
|  | TMP=value2(Vars,TMP)$ | 
|  |  | 
|  | if(TMP!=[]) | 
|  | RET=append(RET, | 
|  | wsort(TMP,Vars,TMP,FLAG,ID+1/10))$ | 
|  |  | 
|  | } | 
|  | else if((TMP0=fixedpoint(TMP1[1],1))!=[]){ | 
|  |  | 
|  | for(I=0;I<length(TMP0);I++) | 
|  | TMP=map(subst,TMP,TMP0[I][0],TMP0[I][1])$ | 
|  |  | 
|  | TMP=value2(Vars,TMP)$ | 
|  |  | 
|  | if(TMP!=[]) | 
|  | RET=append(RET, | 
|  | wsort(TMP,Vars,TMP,FLAG,ID+1/10))$ | 
|  | } | 
|  |  | 
|  | return RET$ | 
|  | } | 
|  | } | 
|  | else | 
|  | return RET$ | 
|  |  | 
|  | } | 
|  |  | 
|  | def unitweight(ExpMat,Vars,PolyListNum,OneMat,FLAG){ | 
|  |  | 
|  | RET=[]$ | 
|  |  | 
|  | ExpMatRowNum=size(ExpMat)[0]$ | 
|  | ExpMatColNum=size(ExpMat[0])[0]$ | 
|  | ExtMatColNum=ExpMatColNum+PolyListNum$ | 
|  |  | 
|  | ExtVars=reverse(Vars)$ | 
|  | for(I=0;I<PolyListNum;I++) | 
|  | ExtVars=cons(uc(),ExtVars)$ | 
|  |  | 
|  | ExtVars=reverse(ExtVars)$ | 
|  |  | 
|  | NormMat0=newvect(ExpMatColNum)$ | 
|  | for(I=0;I<ExpMatColNum;I++) | 
|  | NormMat0[I]=newvect(ExpMatColNum)$ | 
|  |  | 
|  | 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]$ | 
|  |  | 
|  | 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=I;J<ExpMatColNum;J++) | 
|  | NormMat1[I][J]=NormMat0[I][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]$ | 
|  |  | 
|  | for(I=0;I<PolyListNum;I++) | 
|  | NormMat1[I+ExpMatColNum][I+ExpMatColNum]=OneMat[I+1]-OneMat[I]$ | 
|  |  | 
|  | if(jacobi(ExtMatColNum,NormMat1,WorkMat)){ | 
|  |  | 
|  | Res=newvect(ExpMatColNum)$ | 
|  | for(I=0;I<ExpMatColNum;I++){ | 
|  | Res[I]=newvect(2)$ | 
|  | Res[I][0]=Vars[I]$ | 
|  | Res[I][1]=WorkMat[ExtMatColNum-1][I]$ | 
|  | } | 
|  |  | 
|  | if(nonposdegchk(Res)){ | 
|  |  | 
|  | TMP1=makeret(Res,Vars,1)$ | 
|  |  | 
|  | TMP=roundret(TMP1[1])$ | 
|  |  | 
|  | RET=append(RET,wsort(TMP1[1],Vars, | 
|  | map(drint,TMP1[1]*1.0),FLAG,1))$ | 
|  |  | 
|  | if(TMP!=[]) | 
|  | RET=append(RET,wsort(TMP1[1],Vars, | 
|  | TMP,FLAG,2))$ | 
|  | } | 
|  |  | 
|  | } | 
|  |  | 
|  | return [NormMat0,RET]$ | 
|  | } | 
|  |  | 
|  | def weight(PolyList,Vars,FLAG){ | 
|  |  | 
|  | 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,FLAG)$ | 
|  |  | 
|  | if(TMP!=[]){ | 
|  | RET=append(RET,TMP)$ | 
|  | return 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)){ | 
|  | ExpMat=cons(dp_etov(dp_ht(Poly)),ExpMat)$ | 
|  | } | 
|  | OneMat[I+1]=length(ExpMat)$ | 
|  | } | 
|  |  | 
|  | ExpMat=reverse(ExpMat)$ | 
|  | ExpMat=newvect(length(ExpMat),ExpMat)$ | 
|  |  | 
|  | TMP=unitweight(ExpMat,Vars,PolyListNum,OneMat,FLAG)$ | 
|  |  | 
|  | RET=append(RET,TMP[1])$ | 
|  |  | 
|  | TMP0=leastsq(TMP[0],ExpMat,Vars,FLAG,3)$ | 
|  |  | 
|  | RET=append(RET,TMP0)$ | 
|  |  | 
|  | ExpMat=qsort(ExpMat,junban)$ | 
|  |  | 
|  | ExpMat2=[]$ | 
|  | for(I=0;I<size(ExpMat)[0];I++) | 
|  | if(car(ExpMat2)!=ExpMat[I]) | 
|  | ExpMat2=cons(ExpMat[I],ExpMat2)$ | 
|  |  | 
|  | if(size(ExpMat)[0]!=length(ExpMat2)){ | 
|  | ExpMat=newvect(length(ExpMat2),ExpMat2)$ | 
|  | RET=append(RET,leastsq(0,ExpMat,Vars,FLAG,5))$ | 
|  | } | 
|  | else{ | 
|  | TMP0=map(ltov,TMP0)$ | 
|  |  | 
|  | 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$ | 
|  |  | 
|  | TMP0=map(vtol,TMP0)$ | 
|  |  | 
|  | RET=append(RET,TMP0)$ | 
|  | } | 
|  |  | 
|  | return RET$ | 
|  | } | 
|  |  | 
|  | end$ |