===================================================================
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$
 }