=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/lib/gr,v retrieving revision 1.22 retrieving revision 1.26 diff -u -p -r1.22 -r1.26 --- OpenXM_contrib2/asir2000/lib/gr 2006/07/24 06:36:01 1.22 +++ OpenXM_contrib2/asir2000/lib/gr 2007/07/17 08:17:42 1.26 @@ -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.21 2005/08/02 07:21:48 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/lib/gr,v 1.25 2007/01/18 08:09:02 noro Exp $ */ module gr $ @@ -153,7 +153,14 @@ def tolex(G0,V,O,W) TL = cons(dp_dtop(dp_vtoe(D),W),TL); while ( nextm(D,DL,N) ); } else { - GM = dp_gr_mod_main(G0,W,0,M,2); + HVN = "h"; + WN = map(rtostr,W); + while ( member(HVN,WN) ) HVN += "h"; + HV = strtov(HVN); + G0H = map(homogenize,G0,W,HV); + GMH = nd_gr(G0H,append(W,[HV]),M,1); + GMH=map(subst,GMH,HV,1); + GM = nd_gr_postproc(GMH,W,M,2,0); dp_ord(2); for ( T = GM, S = 0; T != []; T = cdr(T) ) for ( D = dp_ptod(car(T),V); D; D = dp_rest(D) ) @@ -197,6 +204,7 @@ def tolex_gsl(G0,V,O,W) while ( nextm(D,DL,N) ); L = npos_check(DL); NPOSV = L[0]; DIM = L[1]; if ( NPOSV >= 0 ) { + if ( dp_gr_print() ) print("shape base"); V0 = W[NPOSV]; T0 = time()[0]; NFL = gennf(G0,TL,V,O,V0,1); TNF += time()[0] - T0; @@ -1115,7 +1123,7 @@ def p_nf(P,B,V,O) { N = length(B); DB = newvect(N); for ( I = N-1, IL = []; I >= 0; I-- ) { DB[I] = dp_ptod(B[I],V); - IL = cons(I,IL); + if ( DB[I] ) IL = cons(I,IL); } return dp_dtop(dp_nf(IL,DP,DB,1),V); } @@ -1125,7 +1133,7 @@ def p_true_nf(P,B,V,O) { N = length(B); DB = newvect(N); for ( I = N-1, IL = []; I >= 0; I-- ) { DB[I] = dp_ptod(B[I],V); - IL = cons(I,IL); + if ( DB[I] ) IL = cons(I,IL); } L = dp_true_nf(IL,DP,DB,1); return [dp_dtop(L[0],V),L[1]]; @@ -1766,7 +1774,38 @@ def generating_relation(Trace,V) return Tab; } -end$ +def generating_relation_mod(Trace,V,M) +{ + Trace = cdr(Trace); + Tab = []; + for ( T = Trace; T != []; T = cdr(T) ) { + HL = car(T); + J = car(HL); HL = HL[1]; + L = length(HL); + LHS = strtov("f"+rtostr(J)); + Dn = 1; + for ( First = 1, S = HL; S != []; S = cdr(S) ) { + H = car(S); + + Coeff = H[0]; + Index = H[1]; + Monomial = type(H[2])==9?dp_dtop(H[2],V):H[2]; + F = strtov("f"+rtostr(Index)); + for ( Z = Tab; Z != []; Z = cdr(Z) ) + if ( Z[0][0] == F ) break; + if ( Z != [] ) Value = Z[0][1]; + else Value = F; + if ( First ) { + RHS = (Monomial*Value)%M; + } else { + RHS = ((RHS*Coeff+Value*Monomial)*inv(H[3],M))%M; + } + if ( First ) First = 0; + } + Tab = cons([LHS,RHS],Tab); + } + return Tab; +} /* * realloc NFArray so that it can hold * an element as NFArray[Ind]. */