=================================================================== RCS file: /home/cvs/OpenXM/src/asir-contrib/testing/noro/module_syz.rr,v retrieving revision 1.3 retrieving revision 1.8 diff -u -p -r1.3 -r1.8 --- OpenXM/src/asir-contrib/testing/noro/module_syz.rr 2020/01/22 08:30:40 1.3 +++ OpenXM/src/asir-contrib/testing/noro/module_syz.rr 2020/02/11 01:43:56 1.8 @@ -1,11 +1,11 @@ module newsyz; -localf module_syz; +localf module_syz, module_syz_old; localf simplify_syz, icont, mod, remove_cont,ordcheck; localf complsb, complsb_sd, sortlsb, find_pos, find_pos, reduce, lres_setup, dpm_sort1, comp_pos; localf fres,minres,sres,minsres,lres, create_base_ord, simplify_k, simplify_by_k, remove_k, remove_k1, extract_nonzero; localf nonzero, phi, syz_check, renumber_pos, compress, compress_h; -localf syz_check0,phi0,todpmlist,dpmlisttollist; +localf syz_check0,phi0,todpmlist,dpmlisttollist,comp_lex; /* F : a list of (lists or polynomials), V : a variable list, H >1=> over GF(H), H=0,1=> over Q @@ -64,18 +64,29 @@ def module_syz(F,V,H,Ord) B = cons(F[I]+dpm_dptodpm(dp_ptod(1,V),N+I+1),B); } B = reverse(B); - if ( Weyl ) - G = nd_weyl_gr(B,V,0,[1,Ord]|dp=1,homo=H); - else if ( F4 ) { -// G = nd_f4(B,V,0,[1,Ord]|dp=1,homo=H,nora=1); - Ind = 0; - while ( 1 ) { - G = nd_f4_trace(B,V,H,-lprime(Ind),[1,Ord]|dp=1); - if ( G ) break; - else Ind++; + if ( H >= 2 ) { + // finite field + if ( Weyl ) + G = nd_weyl_gr(B,V,H,[1,Ord]|dp=1); + else if ( F4 ) + G = nd_f4(B,V,H,[1,Ord]|dp=1); + else + G = nd_gr(B,V,H,[1,Ord]|dp=1); + } else { + if ( Weyl ) + G = nd_weyl_gr(B,V,0,[1,Ord]|dp=1,homo=H); + else { + Ind = 0; + while ( 1 ) { + if ( F4 ) + G = nd_f4_trace(B,V,H,-lprime(Ind),[1,Ord]|dp=1); + else + G = nd_gr_trace(B,V,H,-lprime(Ind),[1,Ord]|dp=1); + if ( G ) break; + else Ind++; + } } - } else - G = nd_gr(B,V,0,[1,Ord]|dp=1,homo=H); + } G0 = []; S0 = []; Gen0 = []; for ( T = G; T != []; T = cdr(T) ) { H = car(T); @@ -96,6 +107,55 @@ def module_syz(F,V,H,Ord) return [S0,G0,Gen0]; } +def module_syz_old(F,V,H,O) +{ + Weyl = type(getopt(weyl)) != -1 ? 1 : 0; + K = length(F); + if ( type(F[0]) <= 2 ) { + for ( T = [], S = F; S != []; S = cdr(S) ) + T = cons([car(S)],T); + F = reverse(T); + } + N = length(F[0]); + B = []; + for ( I = 0; I < K; I++ ) { + E = vector(N+K); + for ( J = 0; J < N; J++ ) E[J] = F[I][J]; + E[N+I] = 1; + B = cons(vtol(E),B); + } + B = reverse(B); + if ( H >= 2 ) { + if ( Weyl ) + G = nd_weyl_gr(B,V,H,[1,O]); + else + G = nd_gr(B,V,H,[1,O]); + } else { + if ( Weyl ) + G = nd_weyl_gr_trace(B,V,H,-1,[1,O]); + else + G = nd_gr_trace(B,V,H,-1,[1,O]); + } + G0 = []; S0 = []; Gen0 = []; + for ( T = G; T != []; T = cdr(T) ) { + H = car(T); + for ( J = 0; J < N; J++ ) if ( H[J] ) break; + if ( J == N ) { + H1 = vector(K); + for ( J = 0; J < K; J++ ) H1[J] = H[N+J]; + S0 = cons(vtol(H1),S0); + } else { + H1 = vector(N); + for ( J = 0; J < N; J++ ) H1[J] = H[J]; + G0 = cons(vtol(H1),G0); + H1 = vector(K); + for ( J = 0; J < K; J++ ) H1[J] = H[N+J]; + Gen0 = cons(vtol(H1),Gen0); + } + } + return [S0,G0,Gen0]; +} + def fres(F,V,H,O) { if ( type(Weyl=getopt(weyl)) == -1 ) Weyl = 0; @@ -111,6 +171,7 @@ def fres(F,V,H,O) L = L[0]; L = ordcheck(L,V); if ( L == [] ) { + R = reverse(R); if ( DP ) return R; else return map(dpmlisttollist,R,V); } @@ -142,6 +203,7 @@ def minres(F,V,H,O) R = cdr(R); break; } } + R = reverse(R); if ( DP ) return R; else return map(dpmlisttollist,R,V); } @@ -162,17 +224,22 @@ def sres(F,V,H,Ord) if ( I == K ) return [[],[],[]]; L = todpmlist(F,V); F = L[0]; N = L[1]; +#if 0 G = nd_gr(F,V,H,[0,Ord]|dp=1); +#else + G = nd_gr_trace(F,V,H,1,[0,Ord]|dp=1); +#endif G = reverse(G); R = [G]; dp_ord([0,Ord]); while ( 1 ) { S = dpm_schreyer_base(R[0]); - print(["length",length(S)]); + if ( dp_gr_print() ) print(["length",length(S)]); if ( S == [] ) break; else R = cons(S,R); } dp_ord([0,0]); + R = reverse(R); if ( DP ) return R; else return map(dpmlisttollist,R,V); } @@ -181,7 +248,7 @@ def minsres(F,V,H,Ord) { if ( type(DP=getopt(dp)) == -1 ) DP = 0; R = sres(F,V,H,Ord|dp=1); - R = ltov(R); + R = ltov(reverse(R)); M = length(R); for ( I = 0; I < M; I++ ) R[I] = map(dpm_sort,R[I]); R = vtol(R); @@ -331,8 +398,17 @@ def reduce(D,B,Bpos,C,H,Z,K,Kind,G,One,Top) } } +def comp_lex(A,B) +{ + HA = dpm_hc(A); HB = dpm_hc(B); + if ( HA > HB ) return 1; + else if ( HA < HB ) return -1; + else return 0; +} + def lres_setup(F,V,H,Ord) { + if ( type(Lex=getopt(lex)) == -1 ) Lex = 0; dpm_set_schreyer(0); dp_ord(Ord); K = length(F); @@ -360,7 +436,17 @@ def lres_setup(F,V,H,Ord) } else { error("lres_setup: arugument type is invalid."); } + dp_ord([0,Ord]); + F = map(dpm_sort,F); +#if 0 G = nd_gr(F,V,H,[0,Ord]|dp=1); +#else + G = nd_gr_trace(F,V,H,1,[0,Ord]|dp=1); +#endif + if ( Lex ) { + dp_ord(2); + G = qsort(G,newsyz.comp_lex); + } G = reverse(G); dp_ord([0,Ord]); One = dp_ptod(1,V); @@ -384,13 +470,15 @@ def lres(F,V,H,Ord) { T0 = time(); if ( type(Top=getopt(top)) == -1 ) Top = 0; + if ( type(DP=getopt(dp)) == -1 ) DP = 0; if ( type(NoSimpK=getopt(nosimpk)) == -1 ) NoSimpK = 0; if ( type(NoPreProj=getopt(nopreproj)) == -1 ) NoPreProj = 0; + if ( type(Lex=getopt(lex)) == -1 ) Lex = 0; Rtime = Stime = Ptime = 0; L = lres_setup(F,V,H,Ord); G = L[0]; One = L[1]; - F = dpm_schreyer_frame(G); + F = dpm_schreyer_frame(G|lex=Lex); G = ltov(cons(0,L[0])); F = reverse(F); F = ltov(F); @@ -430,16 +518,20 @@ def lres(F,V,H,Ord) } T1 = time(); Ftime = T1[0]-T0[0]; R = ltov(R); Len = length(R); - print(["Len",Len]); + if ( dp_gr_print() ) print(["Len",Len]); for ( I = 0, NF = 0; I < Len; I++ ) { - if ( !((I+1)%100) ) print(".",2); - if ( !((I+1)%10000) ) print(I+1); + if ( dp_gr_print() ) { + if ( !((I+1)%100) ) print(".",2); + if ( !((I+1)%10000) ) print(I+1); + } if ( !R[I][3] ) continue; NF++; reduce(R[I],B,Bpos,C,H,Z,K,Kind,G,One,Top); } - print(""); - print(["NF",NF]); + if ( dp_gr_print() ) { + print(""); + print(["NF",NF]); + } T0 = time(); dpm_set_schreyer_level(0); D[1] = map(dpm_sort,H[1]); @@ -453,27 +545,28 @@ def lres(F,V,H,Ord) Tab = map(dpm_sort,Tab); TailTop = dpm_dptodpm(One,TailTopPos); if ( !NoSimpK ) { - print("simplify_k "+rtostr(I)+"...",2); + if ( dp_gr_print() ) print("simplify_k "+rtostr(I)+"...",2); simplify_k(Head,Tab,TailTop,One); - print("done"); + if ( dp_gr_print() ) print("done"); } HI = map(remove_k,map(dpm_sort,H[I]),Kind[I-1]); Len = length(HI); - print("simplify_by_k "+rtostr(I)+"...",2); + if ( dp_gr_print() ) print("simplify_by_k "+rtostr(I)+"...",2); D[I] = vector(Len); for ( J = 0; J < Len; J++ ) { D[I][J] = simplify_by_k(HI[J],Tab,TailTop,One); if ( NoPreProj ) D[I][J] = remove_k(D[I][J],Kind[I-1]); } - print("done"); + if ( dp_gr_print() ) print("done"); } dp_ord([1,0]); T1 = time(); - print(["Frame",Ftime,"Prep",Ptime,"Reduce",Rtime,"Search",Stime,"Minimalize",T1[0]-T0[0]]); + if ( dp_gr_print() ) print(["Frame",Ftime,"Prep",Ptime,"Reduce",Rtime,"Search",Stime,"Minimalize",T1[0]-T0[0]]); // return [C,H,K,Kind,D]; D = compress_h(D); - return D; + if ( DP ) return D; + else return vtol(map(dpmlisttollist,D,V)); } def create_base_ord(K,N) @@ -565,7 +658,7 @@ def phi(C,F) R = 0; for ( T = F; T; T = dpm_rest(T) ) { Coef = dpm_hc(T); Pos = dpm_hp(T); - R += Coef*C[Pos]; + R += Coef*C[Pos-1]; } return R; }