===================================================================
RCS file: /home/cvs/OpenXM_contrib2/asir2000/lib/gr,v
retrieving revision 1.1
retrieving revision 1.10
diff -u -p -r1.1 -r1.10
--- OpenXM_contrib2/asir2000/lib/gr	1999/12/03 07:39:11	1.1
+++ OpenXM_contrib2/asir2000/lib/gr	2001/09/06 00:24:07	1.10
@@ -1,4 +1,52 @@
-/* $OpenXM: OpenXM/src/asir99/lib/gr,v 1.1.1.1 1999/11/10 08:12:31 noro Exp $ */
+/*
+ * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED 
+ * All rights reserved.
+ * 
+ * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
+ * non-exclusive and royalty-free license to use, copy, modify and
+ * redistribute, solely for non-commercial and non-profit purposes, the
+ * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
+ * conditions of this Agreement. For the avoidance of doubt, you acquire
+ * only a limited right to use the SOFTWARE hereunder, and FLL or any
+ * third party developer retains all rights, including but not limited to
+ * copyrights, in and to the SOFTWARE.
+ * 
+ * (1) FLL does not grant you a license in any way for commercial
+ * purposes. You may use the SOFTWARE only for non-commercial and
+ * non-profit purposes only, such as academic, research and internal
+ * business use.
+ * (2) The SOFTWARE is protected by the Copyright Law of Japan and
+ * international copyright treaties. If you make copies of the SOFTWARE,
+ * with or without modification, as permitted hereunder, you shall affix
+ * to all such copies of the SOFTWARE the above copyright notice.
+ * (3) An explicit reference to this SOFTWARE and its copyright owner
+ * shall be made on your publication or presentation in any form of the
+ * results obtained by use of the SOFTWARE.
+ * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
+ * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
+ * for such modification or the source code of the modified part of the
+ * SOFTWARE.
+ * 
+ * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
+ * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
+ * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
+ * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
+ * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
+ * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
+ * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
+ * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
+ * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
+ * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
+ * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
+ * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
+ * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
+ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
+ * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
+ *
+ * $OpenXM: OpenXM_contrib2/asir2000/lib/gr,v 1.9 2001/09/05 08:09:10 noro Exp $ 
+*/
 extern INIT_COUNT,ITOR_FAIL$
 extern REMOTE_MATRIX,REMOTE_NF,REMOTE_VARS$
 
@@ -206,7 +254,8 @@ def tolex_gsl_main(G0,V,O,W,NFL,NPOSV,GM,M,MB)
 			R += B[0][K]*TERMS[K];
 		LCM *= B[1];
 		SL = cons(cons(V1,[R,LCM]),SL);
-		print(["DN",B[1]]);
+		if ( dp_gr_print() )
+			print(["DN",B[1]]);
 	}
 	return SL;
 }
@@ -217,7 +266,8 @@ def hen_ttob_gsl(LHS,RHS,TERMS,M)
 	L1 = idiv(LCM,LDN); R1 = idiv(LCM,RDN);
 	T0 = time()[0];
 	S = henleq_gsl(RHS[0],LHS[0]*L1,M);
-	print(["henleq_gsl",time()[0]-T0]);
+	if ( dp_gr_print() )
+		print(["henleq_gsl",time()[0]-T0]);
 	N = length(TERMS);
 	return [S[0],S[1]*R1];
 }
@@ -282,7 +332,8 @@ def tolex_main(V,O,NF,GM,M,MB)
 			U += B[0][I-1]*S[I];
 		R = ptozp(U);
 		SL = cons(R,SL);
-		print(["DN",B[1]]);
+		if ( dp_gr_print() )
+			print(["DN",B[1]]);
 	}
 	return SL;
 }
@@ -351,7 +402,8 @@ def gennf(G,TL,V,O,V0,FLAG)
 			if ( dp_gr_print() )
 				print(".",2);
 		}
-		print("");
+		if ( dp_gr_print() )
+			print("");
 		TTAB = time()[0]-T0;
 	}
 
@@ -506,7 +558,8 @@ def tolexm_main(PS,HL,V,W,M,FLAG)
 			print(".",2);
 		UTAB[I] = [MB[I],dp_nf_mod(GI,U*dp_mod(MB[I],M,[]),PS,1,M)];
 	}
-	print("");
+	if ( dp_gr_print() )
+		print("");
 	T = dp_mod(dp_ptod(dp_dtop(dp_vtoe(D),W),V),M,[]);
 	H = G = [[T,T]];
 	DL = []; G2 = [];
@@ -882,14 +935,16 @@ def dp_terms(D,V)
 
 def gb_comp(A,B)
 {
-	for ( T = A; T != []; T = cdr(T) ) {
-		for ( S = B, M = car(T), N = -M; S != []; S = cdr(S) )
-			if ( car(S) == M || car(S) == N )
-				break;
-		if ( S == [] )
+	LA = length(A);
+	LB = length(B);
+	if ( LA != LB )
+		return 0;
+	A1 = qsort(newvect(LA,A));
+	B1 = qsort(newvect(LB,B));
+	for ( I = 0; I < LA; I++ )
+		if ( A1[I] != B1[I] && A1[I] != -B1[I] )
 			break;
-	}
-	return T == [] ? 1 : 0;
+	return I == LA ? 1 : 0;
 }
 
 def zero_dim(G,V,O) {
@@ -1086,7 +1141,8 @@ def henleq_gsl(L,B,MOD)
 	if ( !COUNT )
 		COUNT = 1;
 	MOD2 = idiv(MOD,2);
-	for ( I = 0, C = BB, X = 0, PK = 1, CCC = 0, ITOR_FAIL = -1; ;
+	X = newvect(size(AA)[0]);
+	for ( I = 0, C = BB, PK = 1, CCC = 0, ITOR_FAIL = -1; ;
 		I++, PK *= MOD ) {
 		if ( zerovector(C) )
 			if ( zerovector(RESTA*X+RESTB) ) {
@@ -1258,15 +1314,27 @@ def vs_dim(G,V,O)
 		error("vs_dim : ideal is not zero-dimensional!");
 }
 
-def dgr(G,V,O,P)
+def dgr(G,V,O)
 {
+	P = getopt(proc);
+	if ( type(P) == -1 )
+		return gr(G,V,O);
 	P0 = P[0]; P1 = P[1]; P = [P0,P1];
-	flush(P0); flush(P1);
-	rpc(P0,"dp_gr_main",G,V,0,1,O);
-	rpc(P1,"dp_gr_main",G,V,1,1,O);
-	F = select(P);
-	R = rpcrecv(F[0]); flush(P0); flush(P1);
-	return R;
+	map(ox_reset,P);
+	ox_cmo_rpc(P0,"dp_gr_main",G,V,0,1,O);
+	ox_cmo_rpc(P1,"dp_gr_main",G,V,1,1,O);
+	map(ox_push_cmd,P,262); /* 262 = OX_popCMO */
+	F = ox_select(P);
+	R = ox_get(F[0]);
+	if ( F[0] == P0 ) {
+		Win = "nonhomo";
+		Lose = P1;
+	} else {
+		Win = "nhomo";
+		Lose = P0;
+	}
+	ox_reset(Lose);
+	return [Win,R];
 }
 
 /* functions for rpc */
@@ -1294,5 +1362,159 @@ def r_ttob_gsl(L,M)
 def get_matrix()
 {
 	REMOTE_MATRIX;
+}
+
+extern NFArray$
+
+/*
+ * HL = [[c,i,m,d],...]
+ * if c != 0
+ *   g = 0
+ *   g = (c*g + m*gi)/d
+ *   ...
+ *   finally compare g with NF
+ *   if g == NF then NFArray[NFIndex] = g
+ *
+ * if c = 0 then HL consists of single history [0,i,0,0],
+ * which means that dehomogenization of NFArray[i] should be 
+ * eqall to NF.
+ */
+
+def check_trace(NF,NFIndex,HL)
+{
+	if ( !car(HL)[0] ) {
+		/* dehomogenization */
+		DH = dp_dehomo(NFArray[car(HL)[1]]);
+		if ( NF == DH ) {
+			realloc_NFArray(NFIndex);
+			NFArray[NFIndex] = NF;
+			return 0;
+		} else
+			error("check_trace(dehomo)");
+	}
+
+	for ( G = 0, T = HL; T != []; T = cdr(T) ) {
+		H = car(T);
+
+		Coeff = H[0];
+		Index = H[1];
+		Monomial = H[2];
+		Denominator = H[3];
+
+		Reducer = NFArray[Index];
+		G = (Coeff*G+Monomial*Reducer)/Denominator;
+	}
+	if ( NF == G ) {
+		realloc_NFArray(NFIndex);
+		NFArray[NFIndex] = NF;
+		return 0;
+	} else
+		error("check_trace");
+}
+
+/*
+ * realloc NFArray so that it can hold * an element as NFArray[Ind].
+ */
+
+def realloc_NFArray(Ind)
+{
+	if ( Ind == size(NFArray)[0] ) {
+		New = newvect(Ind + 100);
+		for ( I = 0; I < Ind; I++ )
+			New[I] = NFArray[I];
+		NFArray = New;
+	}
+}
+
+/*
+ * create NFArray and initialize it by List.
+ */
+
+def register_input(List)
+{
+	Len = length(List);
+	NFArray = newvect(Len+100,List);
+}
+
+/*
+	tracetogen(): preliminary version
+
+	dp_gr_main() returns  [GB,GBIndex,Trace].
+	GB : groebner basis
+	GBIndex : IndexList (corresponding to Trace)
+	Trace : [InputList,Trace0,Trace1,...]
+	TraceI : [Index,TraceList]
+	TraceList : [[Coef,Index,Monomial,Denominator],...]
+	Poly <- 0
+	Poly <- (Coef*Poly+Monomial*PolyList[Index])/Denominator
+*/
+
+def tracetogen(G)
+{
+	GB = G[0]; GBIndex = G[1]; Trace = G[2];
+
+	InputList = Trace[0];
+	Trace = cdr(Trace);
+
+	/* number of initial basis */
+	Nini = length(InputList);
+
+	/* number of generated basis */
+	Ngen = length(Trace);
+	
+	N = Nini + Ngen;
+
+	/* stores traces */
+	Tr = vector(N);
+
+	/* stores coeffs */
+	Coef = vector(N);
+
+	/* XXX create dp_ptod(1,V) */
+	HT = dp_ht(InputList[0]);
+	One = dp_subd(HT,HT);
+
+	for ( I = 0; I < Nini; I++ ) {
+		Tr[I] = [1,I,One,1];
+		C = vector(Nini);
+		C[I] = One;
+		Coef[I] = C; 
+	}
+	for ( ; I < N; I++ )
+		Tr[I] = Trace[I-Nini][1];
+
+	for ( T = GBIndex; T != []; T = cdr(T) )
+		compute_coef_by_trace(car(T),Tr,Coef);
+	return Coef;
+}
+
+def compute_coef_by_trace(I,Tr,Coef)
+{
+	if ( Coef[I] )
+		return;
+
+	/* XXX */
+	Nini = size(Coef[0])[0];
+
+	/* initialize coef vector */
+	CI = vector(Nini);
+
+	for ( T = Tr[I]; T != []; T = cdr(T) ) {
+		/*	Trace = [Coef,Index,Monomial,Denominator] */
+		Trace = car(T);
+		C = Trace[0];
+		Ind = Trace[1];
+		Mon = Trace[2];
+		Den = Trace[3];
+		if ( !Coef[Ind] )
+			compute_coef_by_trace(Ind,Tr,Coef);
+
+		/* XXX */
+		CT = newvect(Nini);
+		for ( J = 0; J < Nini; J++ )
+			CT[J] = (C*CI[J]+Mon*Coef[Ind][J])/Den;
+		CI = CT;
+	}
+	Coef[I] = CI;
 }
 end$