=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/lib/gr,v retrieving revision 1.7 retrieving revision 1.12 diff -u -p -r1.7 -r1.12 --- OpenXM_contrib2/asir2000/lib/gr 2000/09/07 23:59:55 1.7 +++ OpenXM_contrib2/asir2000/lib/gr 2001/11/01 10:00:19 1.12 @@ -45,7 +45,7 @@ * 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.6 2000/08/22 05:04:22 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/lib/gr,v 1.11 2001/09/28 00:41:16 noro Exp $ */ extern INIT_COUNT,ITOR_FAIL$ extern REMOTE_MATRIX,REMOTE_NF,REMOTE_VARS$ @@ -918,6 +918,17 @@ def p_true_nf(P,B,V,O) { return [dp_dtop(L[0],V),L[1]]; } +def p_nf_mod(P,B,V,O,Mod) { + setmod(Mod); + dp_ord(O); DP = dp_mod(dp_ptod(P,V),Mod,[]); + N = length(B); DB = newvect(N); + for ( I = N-1, IL = []; I >= 0; I-- ) { + DB[I] = dp_mod(dp_ptod(B[I],V),Mod,[]); + IL = cons(I,IL); + } + return dp_dtop(dp_nf_mod(IL,DP,DB,1,Mod),V); +} + def p_terms(D,V,O) { dp_ord(O); @@ -935,14 +946,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) { @@ -1328,13 +1341,39 @@ def dgr(G,V,O) Win = "nonhomo"; Lose = P1; } else { - Win = "nhomo"; + Win = "homo"; Lose = P0; } ox_reset(Lose); return [Win,R]; } +/* competitive Gbase computation : F4 vs. Bucbberger */ +/* P : process list */ + +def dgrf4mod(G,V,M,O) +{ + P = getopt(proc); + if ( type(P) == -1 ) + return dp_f4_mod_main(G,V,M,O); + P0 = P[0]; P1 = P[1]; P = [P0,P1]; + map(ox_reset,P); + ox_cmo_rpc(P0,"dp_f4_mod_main",G,V,M,O); + ox_cmo_rpc(P1,"dp_gr_mod_main",G,V,0,M,O); + map(ox_push_cmd,P,262); /* 262 = OX_popCMO */ + F = ox_select(P); + R = ox_get(F[0]); + if ( F[0] == P0 ) { + Win = "F4"; + Lose = P1; + } else { + Win = "Buchberger"; + Lose = P0; + } + ox_reset(Lose); + return [Win,R]; +} + /* functions for rpc */ def register_matrix(M) @@ -1432,5 +1471,87 @@ 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$