[BACK]Return to gr CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / lib

Diff for /OpenXM_contrib2/asir2000/lib/gr between version 1.9 and 1.16

version 1.9, 2001/09/05 08:09:10 version 1.16, 2002/09/03 08:12:25
Line 45 
Line 45 
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  *   *
  * $OpenXM: OpenXM_contrib2/asir2000/lib/gr,v 1.8 2001/04/09 02:42:29 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/lib/gr,v 1.15 2002/06/12 08:19:04 noro Exp $
 */  */
 extern INIT_COUNT,ITOR_FAIL$  extern INIT_COUNT,ITOR_FAIL$
 extern REMOTE_MATRIX,REMOTE_NF,REMOTE_VARS$  extern REMOTE_MATRIX,REMOTE_NF,REMOTE_VARS$
Line 128  def tolex(G0,V,O,W)
Line 128  def tolex(G0,V,O,W)
 {  {
         TM = TE = TNF = 0;          TM = TE = TNF = 0;
         N = length(V); HM = hmlist(G0,V,O); ZD = zero_dim(HM,V,O);          N = length(V); HM = hmlist(G0,V,O); ZD = zero_dim(HM,V,O);
         if ( !ZD )          if ( ZD )
                 error("tolex : ideal is not zero-dimensional!");                  MB = dp_mbase(map(dp_ptod,HM,V));
         MB = dp_mbase(map(dp_ptod,HM,V));          else
                   MB = 0;
         for ( J = 0; ; J++ ) {          for ( J = 0; ; J++ ) {
                 M = lprime(J);                  M = lprime(J);
                 if ( !valid_modulus(HM,M) )                  if ( !valid_modulus(HM,M) )
                         continue;                          continue;
                 T0 = time()[0]; GM = tolexm(G0,V,O,W,M); TM += time()[0] - T0;                  T0 = time()[0];
                 dp_ord(2);                  if ( ZD ) {
                 DL = map(dp_etov,map(dp_ht,map(dp_ptod,GM,W)));                          GM = tolexm(G0,V,O,W,M);
                 D = newvect(N); TL = [];                          dp_ord(2);
                 do                          DL = map(dp_etov,map(dp_ht,map(dp_ptod,GM,W)));
                         TL = cons(dp_dtop(dp_vtoe(D),W),TL);                          D = newvect(N); TL = [];
                 while ( nextm(D,DL,N) );                          do
                 L = npos_check(DL); NPOSV = L[0]; DIM = L[1];                                  TL = cons(dp_dtop(dp_vtoe(D),W),TL);
                 T0 = time()[0]; NF = gennf(G0,TL,V,O,W[N-1],1)[0];                          while ( nextm(D,DL,N) );
                   } else {
                           GM = dp_gr_mod_main(G0,W,0,M,2);
                           dp_ord(2);
                           for ( T = GM, S = 0; T != []; T = cdr(T) )
                                   for ( D = dp_ptod(car(T),V); D; D = dp_rest(D) )
                                           S += dp_ht(D);
                           TL = dp_terms(S,V);
                   }
                   TM += time()[0] - T0;
                   T0 = time()[0]; NF = gennf(G0,TL,V,O,W[N-1],ZD)[0];
                 TNF += time()[0] - T0;                  TNF += time()[0] - T0;
                 T0 = time()[0];                  T0 = time()[0];
                 R = tolex_main(V,O,NF,GM,M,MB);                  R = tolex_main(V,O,NF,GM,M,MB);
Line 316  def dptov(P,W,MB)
Line 327  def dptov(P,W,MB)
   
 def tolex_main(V,O,NF,GM,M,MB)  def tolex_main(V,O,NF,GM,M,MB)
 {  {
         DIM = length(MB);          if ( MB ) {
         DV = newvect(DIM);                  PosDim = 0;
                   DIM = length(MB);
                   DV = newvect(DIM);
           } else
                   PosDim = 1;
         for ( T = GM, SL = [], LCM = 1; T != []; T = cdr(T) ) {          for ( T = GM, SL = [], LCM = 1; T != []; T = cdr(T) ) {
                 S = p_terms(car(T),V,2);                  S = p_terms(car(T),V,2);
                   if ( PosDim ) {
                           MB = gather_nf_terms(S,NF,V,O);
                           DV = newvect(length(MB));
                   }
                 dp_ord(O); RHS = termstomat(NF,map(dp_ptod,cdr(S),V),MB,M);                  dp_ord(O); RHS = termstomat(NF,map(dp_ptod,cdr(S),V),MB,M);
                 dp_ord(0); NHT = nf_tab_gsl(dp_ptod(LCM*car(S),V),NF);                  dp_ord(O); NHT = nf_tab_gsl(dp_ptod(LCM*car(S),V),NF);
                 dptov(NHT[0],DV,MB);                  dptov(NHT[0],DV,MB);
                 dp_ord(O); B = hen_ttob_gsl([DV,NHT[1]],RHS,cdr(S),M);                  dp_ord(O); B = hen_ttob_gsl([DV,NHT[1]],RHS,cdr(S),M);
                 if ( !B )                  if ( !B )
Line 338  def tolex_main(V,O,NF,GM,M,MB)
Line 357  def tolex_main(V,O,NF,GM,M,MB)
         return SL;          return SL;
 }  }
   
   /*
    * NF = [Pairs,DN]
    *  Pairs = [[NF1,T1],[NF2,T2],...]
    */
   
   def gather_nf_terms(S,NF,V,O)
   {
           R = 0;
           for ( T = S; T != []; T = cdr(T) ) {
                   DT = dp_ptod(car(T),V);
                   for ( U = NF[0]; U != []; U = cdr(U) )
                           if ( car(U)[1] == DT ) {
                                   R += tpoly(dp_terms(car(U)[0],V));
                                   break;
                           }
           }
           return map(dp_ptod,p_terms(R,V,O),V);
   }
   
 def reduce_dn(L)  def reduce_dn(L)
 {  {
         NM = L[0]; DN = L[1]; V = vars(NM);          NM = L[0]; DN = L[1]; V = vars(NM);
Line 352  def minipoly(G0,V,O,P,V0)
Line 390  def minipoly(G0,V,O,P,V0)
         if ( !zero_dim(hmlist(G0,V,O),V,O) )          if ( !zero_dim(hmlist(G0,V,O),V,O) )
                 error("tolex : ideal is not zero-dimensional!");                  error("tolex : ideal is not zero-dimensional!");
   
           Pin = P;
           P = ptozp(P);
           CP = sdiv(P,Pin);
         G1 = cons(V0-P,G0);          G1 = cons(V0-P,G0);
         O1 = [[0,1],[O,length(V)]];          O1 = [[0,1],[O,length(V)]];
         V1 = cons(V0,V);          V1 = cons(V0,V);
Line 372  def minipoly(G0,V,O,P,V0)
Line 413  def minipoly(G0,V,O,P,V0)
                         TL = cons(V0^J,TL);                          TL = cons(V0^J,TL);
                 NF = gennf(G1,TL,V1,O1,V0,1)[0];                  NF = gennf(G1,TL,V1,O1,V0,1)[0];
                 R = tolex_main(V1,O1,NF,[MP],M,MB);                  R = tolex_main(V1,O1,NF,[MP],M,MB);
                 return R[0];                  return ptozp(subst(R[0],V0,CP*V0));
         }          }
 }  }
   
Line 462  def vtop(S,L,GSL)
Line 503  def vtop(S,L,GSL)
         }          }
 }  }
   
   /* broken */
   
 def leq_nf(TL,NF,LHS,V)  def leq_nf(TL,NF,LHS,V)
 {  {
         TLen = length(NF);          TLen = length(NF);
Line 918  def p_true_nf(P,B,V,O) {
Line 961  def p_true_nf(P,B,V,O) {
         return [dp_dtop(L[0],V),L[1]];          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)  def p_terms(D,V,O)
 {  {
         dp_ord(O);          dp_ord(O);
Line 1330  def dgr(G,V,O)
Line 1384  def dgr(G,V,O)
                 Win = "nonhomo";                  Win = "nonhomo";
                 Lose = P1;                  Lose = P1;
         } else {          } else {
                 Win = "nhomo";                  Win = "homo";
                 Lose = P0;                  Lose = P0;
         }          }
         ox_reset(Lose);          ox_reset(Lose);
         return [Win,R];          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 */  /* functions for rpc */
   
 def register_matrix(M)  def register_matrix(M)
Line 1449  def register_input(List)
Line 1529  def register_input(List)
         Poly <- (Coef*Poly+Monomial*PolyList[Index])/Denominator          Poly <- (Coef*Poly+Monomial*PolyList[Index])/Denominator
 */  */
   
 def tracetogen(GBIndex,Trace)  def tracetogen(G)
 {  {
           GB = G[0]; GBIndex = G[1]; Trace = G[2];
   
         InputList = Trace[0];          InputList = Trace[0];
         Trace = cdr(Trace);          Trace = cdr(Trace);
   
Line 1468  def tracetogen(GBIndex,Trace)
Line 1550  def tracetogen(GBIndex,Trace)
         /* stores coeffs */          /* stores coeffs */
         Coef = vector(N);          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++ ) {          for ( I = 0; I < Nini; I++ ) {
                 Tr[I] = [1,I,1,1];                  Tr[I] = [1,I,One,1];
                 C = vector(Nini);                  C = vector(Nini);
                 C[I] = 1;                  C[I] = One;
                 Coef[I] = C;                  Coef[I] = C;
         }          }
         for ( ; I < N; I++ )          for ( ; I < N; I++ )
Line 1511  def compute_coef_by_trace(I,Tr,Coef)
Line 1597  def compute_coef_by_trace(I,Tr,Coef)
         }          }
         Coef[I] = CI;          Coef[I] = CI;
 }  }
 end$  
   extern Gbcheck_DP,Gbcheck_IL$
   
   def register_data_for_gbcheck(DPL)
   {
           for ( IL = [], I = length(DPL)-1; I >= 0; I-- )
                   IL = cons(I,IL);
           Gbcheck_DP = newvect(length(DPL),DPL);
           Gbcheck_IL = IL;
   }
   
   def sp_nf_for_gbcheck(Pair)
   {
           SP = dp_sp(Gbcheck_DP[Pair[0]],Gbcheck_DP[Pair[1]]);
           return dp_nf(Gbcheck_IL,SP,Gbcheck_DP,1);
   }
   
   def gbcheck(B,V,O)
   {
           dp_ord(O);
           D = map(dp_ptod,B,V);
           L = dp_gr_checklist(D,length(V));
           DP = L[0]; Plist = L[1];
           for ( IL = [], I = size(DP)[0]-1; I >= 0; I-- )
                   IL = cons(I,IL);
           Procs = getopt(proc);
           if ( type(Procs) == 4 ) {
                   map(ox_reset,Procs);
                   /* register DP in servers */
                   map(ox_cmo_rpc,Procs,"register_data_for_gbcheck",vtol(DP));
                   /* discard return value in stack */
                   map(ox_pop_cmo,Procs);
                   Free = Procs;
                   Busy = [];
                   T = Plist;
                   while ( T != [] || Busy != []  ){
                           if ( Free == [] || T == [] ) {
                                   /* someone is working; wait for data */
                                   Ready = ox_select(Busy);
                                   Busy = setminus(Busy,Ready);
                                   Free = append(Ready,Free);
                                   for ( ; Ready != []; Ready = cdr(Ready) ) {
                                           if ( ox_get(car(Ready)) ) {
                                                   map(ox_reset,Procs);
                                                   return 0;
                                           }
                                   }
                           } else {
                                   P = car(Free);
                                   Free = cdr(Free);
                                   Busy = cons(P,Busy);
                                   Pair = car(T);
                                   T = cdr(T);
                                   ox_cmo_rpc(P,"sp_nf_for_gbcheck",Pair);
                                   ox_push_cmd(P,262); /* 262 = OX_popCMO */
                           }
                   }
                   map(ox_reset,Procs);
                   return 1;
           } else {
                   for ( T = Plist; T != []; T = cdr(T) ) {
                           Pair = T[0];
                           SP = dp_sp(DP[Pair[0]],DP[Pair[1]]);
                           if ( dp_nf(IL,SP,DP,1) )
                                   return 0;
                   }
                   return 1;
           }
   }
 end$  end$

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.16

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>