Changeset ff38ee in git for kernel/GBEngine


Ignore:
Timestamp:
May 13, 2016, 1:27:46 PM (8 years ago)
Author:
Adi Popescu <adi_popescum@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
4596097b8e3e6df729c105beb4dafc60320b218b
Parents:
978a8c14d698f02ec7d3aef83bbb6613f67c74951c1d660c7201e1779c8af50b3966da3a6e5cbe7c
Message:
Merge branch 'spielwiese' of github.com:Singular/Sources into SigDrop
Location:
kernel/GBEngine
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • kernel/GBEngine/kspoly.cc

    r1c1d660 rff38ee  
    2222#include <kernel/polys.h>
    2323#endif
     24
     25#define ADIDEBUG 0
    2426
    2527#ifdef KDEBUG
     
    180182                 kStrategy strat)
    181183{
     184#if ADIDEBUG
     185printf("\nksReducePolySig\n");
     186pWrite(PR->p);pWrite(PR->sig);
     187pWrite(PW->p);pWrite(PW->sig);
     188#endif
    182189#ifdef KDEBUG
    183190  red_count++;
     
    235242#endif
    236243    p_ExpVectorAddSub(sigMult,PR->GetLmCurrRing(),PW->GetLmCurrRing(),currRing);
     244    //I have also to set the leading coeficient for sigMult (in the case of rings)
     245    #ifdef HAVE_RINGS
     246    if(rField_is_Ring(currRing))
     247    {
     248      pSetCoeff(sigMult,nMult(nDiv(pGetCoeff(PR->p),pGetCoeff(PW->p)), pGetCoeff(sigMult)));
     249    }
     250    #endif
    237251//#if 1
    238252#ifdef DEBUGF5
     
    244258    printf("--------------\n");
    245259#endif
    246     int sigSafe = p_LmCmp(PR->sig,sigMult,currRing);
     260    int sigSafe;
     261    #ifdef HAVE_RINGS
     262    if(rField_is_Ring(currRing))
     263      sigSafe = p_LtCmp(PR->sig,sigMult,currRing);
     264    else
     265    #endif
     266      sigSafe = p_LmCmp(PR->sig,sigMult,currRing);
    247267    // now we can delete the copied polynomial data used for checking for
    248268    // sig-safeness of the reduction step
     
    252272
    253273#endif
     274    #ifdef HAVE_RINGS
     275    if(rField_is_Ring(currRing))
     276    {
     277      // Set the sig
     278      if(pLmCmp(PR->sig, sigMult) == 0)
     279      {
     280        //The sigs have the same lm, have to substract
     281        PR->sig = pSub(PR->sig, pCopy(sigMult));
     282        //It may happen that now the signature is 0 (drop)
     283        if(PR->sig == NULL)
     284        {
     285          #if ADIDEBUG
     286          printf("\nPossible sigdrop in ksreducepolysig (lost signature)\n");
     287          #endif
     288          strat->sigdrop=TRUE;
     289        }
     290      }
     291      else
     292      {
     293        if(sigSafe == -1)
     294        {
     295          // do not allow this reduction - it will increase it's signature
     296          // and the partially standard basis is just till the old sig, not the new one
     297          PR->is_redundant = TRUE;
     298          return 3;
     299        }
     300      }
     301    }
     302    #endif
    254303    //pDelete(&f1);
    255304    pDelete(&sigMult);
    256305    // go on with the computations only if the signature of p2 is greater than the
    257306    // signature of fm*p1
    258     if(sigSafe != 1)
     307    if(sigSafe != 1 && !rField_is_Ring(currRing))
    259308    {
    260309      PR->is_redundant = TRUE;
     
    361410  }
    362411#endif
    363 
    364412#if defined(KDEBUG) && defined(TEST_OPT_DEBUG_RED)
    365413  if (TEST_OPT_DEBUG)
  • kernel/GBEngine/kstd1.cc

    r1c1d660 rff38ee  
    25032503#ifdef KDEBUG
    25042504  idTest(F);
    2505   idTest(Q);
     2505  if(Q != NULL)
     2506    idTest(Q);
    25062507
    25072508#if MYTEST
     
    25262527  else
    25272528#endif
    2528 #ifdef HAVE_RINGS
    2529   if (rField_is_Ring(currRing))
    2530     r=bba(F,Q,NULL,hilb,strat);
    2531   else
    2532 #endif
    25332529  {
    25342530    if (rHasLocalOrMixedOrdering(currRing))
     
    25442540        r=sba(F,Q,*w,hilb,strat);
    25452541      else
     2542      {
     2543        //It is set to True, just to know that it is the first run
     2544        strat->sigdrop = FALSE;
     2545        strat->sbaEnterS = -1;
    25462546        r=sba(F,Q,NULL,hilb,strat);
     2547        #if ADIDEBUG
     2548        printf("\nSBA Run 1: %i elements (syzCrit = %i)\n",IDELEMS(r),strat->nrsyzcrit);
     2549        //idPrint(r);
     2550        //getchar();
     2551        #endif
     2552        int sbarun = 2;
     2553        while(strat->sigdrop)
     2554        {
     2555          r=sba(r,Q,NULL,hilb,strat);
     2556          #if ADIDEBUG
     2557          printf("SBA Run %i: %i elements (syzCrit = %i)\n",sbarun++,IDELEMS(r),strat->nrsyzcrit);
     2558          //idPrint(r);
     2559          //getchar();
     2560          #endif
     2561        }
     2562      }
    25472563    }
    25482564  }
     
    25582574//Print("%d reductions canceled \n",strat->cel);
    25592575  HCord=strat->HCord;
    2560   delete(strat);
     2576  //delete(strat);
    25612577  if ((delete_w)&&(w!=NULL)&&(*w!=NULL)) delete *w;
    25622578  return r;
  • kernel/GBEngine/kstd2.cc

    r1c1d660 rff38ee  
    2020#endif /* ifndef SING_NDEBUG */
    2121
    22 #define ADIDEBUG 0
     22#define ADIDEBUG 1
    2323#define ADIDEBUG_COUNT 0
     24#define REV_BLOCK_SBA 0
     25#define SIG_DROP_FIRST 1
    2426
    2527#if MYTEST
     
    640642}
    641643
    642 KINLINE int ksReducePolyTailSig(LObject* PR, TObject* PW, LObject* Red)
     644KINLINE int ksReducePolyTailSig(LObject* PR, TObject* PW, LObject* Red, kStrategy strat)
    643645{
    644646  BOOLEAN ret;
     
    651653  pWrite(Red->GetLmCurrRing());
    652654  */
    653   ret = ksReducePolySig(Red, PW, 1, NULL, &coef);
    654 
     655  ret = ksReducePolySig(Red, PW, 1, NULL, &coef, strat);
    655656
    656657  if (!ret)
     
    678679int redSig (LObject* h,kStrategy strat)
    679680{
     681  #ifdef HAVE_RINGS
     682  poly beforeredsig;
     683  if(rField_is_Ring(currRing))
     684    beforeredsig = pCopy(h->sig);
     685  #endif
    680686  if (strat->tl<0) return 1;
    681687  //if (h->GetLmTailRing()==NULL) return 0; // HS: SHOULD NOT BE NEEDED!
    682688  //printf("FDEGS: %ld -- %ld\n",h->FDeg, h->pFDeg());
    683689  assume(h->FDeg == h->pFDeg());
     690  #if ADIDEBUG
     691  printf("\n--------------------------redSig-------------------------------------\n");
     692  printf("\nBefore redSig:\n");
     693  p_Write(h->p,strat->tailRing);pWrite(h->sig);
     694  #endif
    684695//#if 1
    685696#ifdef DEBUGF5
     
    711722    if (j < 0)
    712723    {
    713       return 1;
     724      // over ZZ: cleanup coefficients by complete reduction with monomials
     725      postReduceByMonSig(h, strat);
     726      if(nIsZero(pGetCoeff(h->p))) return 2;
     727      j = kFindDivisibleByInT(strat, h,start);
     728      if(j < 0)
     729      {
     730        if(strat->tl >= 0)
     731            h->i_r1 = strat->tl;
     732        else
     733            h->i_r1 = -1;
     734        if (h->GetLmTailRing() == NULL)
     735        {
     736          if (h->lcm!=NULL) pLmDelete(h->lcm);
     737          h->Clear();
     738          return 0;
     739        }
     740        #ifdef HAVE_RINGS
     741        if(rField_is_Ring(currRing))
     742        {
     743          //Check for sigdrop after reduction
     744          if(pLtCmp(beforeredsig,h->sig) == 1)
     745          {
     746            #if ADIDEBUG
     747            printf("\nSigDrop after reduce\n");pWrite(beforeredsig);pWrite(h->sig);
     748            #endif
     749            strat->sigdrop = TRUE;
     750            //Reduce it as much as you can
     751            int red_result = redRing(h,strat);
     752            if(red_result == 0)
     753            {
     754              //It reduced to 0, cancel the sigdrop
     755              #if ADIDEBUG
     756              printf("\nReduced to 0 via redRing. Cancel sigdrop\n");
     757              #endif
     758              strat->sigdrop = FALSE;
     759              p_Delete(&h->sig,currRing);h->sig = NULL;
     760              return 0;
     761            }
     762            else
     763            {
     764              #if ADIDEBUG
     765              printf("\nReduced to this via redRing.SIGDROP\n");pWrite(h->p);
     766              #endif
     767              //strat->enterS(*h, strat->sl+1, strat, strat->tl);
     768              return 0;
     769            }
     770          }
     771          p_Delete(&beforeredsig,currRing);
     772        }
     773        #endif
     774        return 1;
     775      }
    714776    }
    715777
     
    732794        break;
    733795      if ((strat->T[i].pLength < li)
    734          &&
    735           p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i],
     796         #ifdef HAVE_RINGS
     797         && (!rField_is_Ring(currRing) || n_DivBy(pGetCoeff(h_p),pGetCoeff(strat->T[i].p),currRing->cf))
     798         #endif
     799         && p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i],
    736800                               h_p, not_sev, strat->tailRing))
    737801      {
     
    772836    printf("INDEX OF REDUCER T: %d\n",ii);
    773837#endif
     838    #if ADIDEBUG
     839    printf("\nWe reduce it with:\n");p_Write(strat->T[ii].p,strat->tailRing);pWrite(strat->T[ii].sig);
     840    #endif
    774841    sigSafe = ksReducePolySig(h, &(strat->T[ii]), strat->S_2_R[ii], NULL, NULL, strat);
     842    #if ADIDEBUG
     843    printf("\nAfter small reduction:\n");pWrite(h->p);pWrite(h->sig);
     844    #endif
     845    #ifdef HAVE_RINGS
     846    if(rField_is_Ring(currRing) && h->p == NULL && h->sig == NULL)
     847    {
     848      //Trivial case catch
     849      strat->sigdrop = FALSE;
     850    }
     851    if(rField_is_Ring(currRing) && strat->sigdrop)
     852    {
     853      return 1;
     854    }
     855    #endif
    775856#if SBA_PRINT_REDUCTION_STEPS
    776857    if (sigSafe != 3)
     
    874955    loop
    875956    {
     957      #ifdef HAVE_RINGS
     958      if(rField_is_Ring(currRing) && strat->sigdrop)
     959        break;
     960      #endif
    876961      Ln.SetShortExpVector();
    877962      if (withT)
     
    904989      }
    905990      strat->redTailChange=TRUE;
    906       int ret = ksReducePolyTailSig(L, With, &Ln);
     991      #if ADIDEBUG
     992      printf("\nWill TAILreduce * with *:\n");pWrite(Ln.p);pWrite(Ln.sig);
     993      pWrite(With->p);pWrite(With->sig);pWrite(L->sig);
     994      #endif
     995      int ret = ksReducePolyTailSig(L, With, &Ln, strat);
     996      #ifdef HAVE_RINGS
     997      if(rField_is_Ring(currRing) && strat->sigdrop)
     998      {
     999        //Cannot break the loop here so easily
     1000        break;
     1001      }
     1002      if(rField_is_Ring(currRing))
     1003        L->sig = Ln.sig;
     1004      //Because Ln.sig is set to L->sig, but in ksReducePolyTailSig -> ksReducePolySig
     1005      // I delete it an then set Ln.sig. Hence L->sig is lost
     1006      #endif
     1007      #if ADIDEBUG
     1008      printf("\nAfter small TAILreduce:\n");pWrite(Ln.p);pWrite(Ln.sig);pWrite(L->sig);
     1009      #endif
    9071010#if SBA_PRINT_REDUCTION_STEPS
    9081011      if (ret != 3)
     
    9351038    L->pLength++;
    9361039  }
    937 
    9381040  all_done:
    9391041  Ln.Delete();
     
    15601662    }
    15611663    #endif
    1562     getchar();
     1664    //getchar();
    15631665    #endif
    15641666    #ifdef KDEBUG
     
    19082010  sba_interreduction_operations = 0;
    19092011#endif
    1910 
     2012 
    19112013  ideal F1 = F0;
    19122014  ring sRing, currRingOld;
     
    19232025  // sort ideal F
    19242026  ideal F       = idInit(IDELEMS(F1),F1->rank);
    1925   intvec *sort  = idSort(F1);
    1926   for (int i=0; i<sort->length();++i)
    1927     F->m[i] = F1->m[(*sort)[i]-1];
     2027  #if REV_BLOCK_SBA || SIG_DROP_FIRST
     2028  //#ifdef HAVE_RINGS
     2029  if(rField_is_Ring(currRing) && strat->sigdrop)
     2030  {
     2031    #if REV_BLOCK_SBA
     2032    for (int i=0; i<IDELEMS(F1);++i)
     2033      F->m[i] = F1->m[i];
     2034    #else
     2035    //Now I put the element on pos 0 already with enterS
     2036    #if 0
     2037    for (int i=IDELEMS(F1)-1; i>0;i--)
     2038      F->m[i] = F1->m[i-1];
     2039    F->m[0] = F1->m[IDELEMS(F1)-1];
     2040    #else
     2041    for (int i=0; i<IDELEMS(F1);++i)
     2042      F->m[i] = F1->m[i];
     2043    //Put the SigDrop element on the correct position (think of sbaEnterS)
     2044    if(strat->sbaEnterS >= 0)
     2045    {
     2046      poly dummy;
     2047      dummy = pCopy(F->m[0]); //the sigdrop element
     2048      for(int i = 0;i<strat->sbaEnterS;i++)
     2049        F->m[i] = F->m[i+1];
     2050      F->m[strat->sbaEnterS] = dummy;
     2051    }
     2052    #endif
     2053    #endif
     2054  }
     2055  else
     2056  #endif
     2057  {
     2058    intvec *sort  = idSort(F1);
     2059    for (int i=0; i<sort->length();++i)
     2060      F->m[i] = F1->m[(*sort)[i]-1];
     2061  }
     2062  #ifdef HAVE_RINGS
     2063  if(rField_is_Ring(currRing))
     2064    strat->sigdrop = FALSE;
     2065  strat->nrsyzcrit = 0;
     2066  #endif
    19282067#if SBA_INTERRED_START
    19292068  F = kInterRed(F,NULL);
     
    19412080  BOOLEAN withT     = TRUE;
    19422081  strat->max_lower_index = 0;
    1943 
    19442082  //initBuchMoraCrit(strat); /*set Gebauer, honey, sugarCrit*/
    19452083  initSbaCrit(strat); /*set Gebauer, honey, sugarCrit*/
     
    19532091  srmax = strat->sl;
    19542092  reduc = olddeg = lrmax = 0;
    1955 
    19562093#ifndef NO_BUCKETS
    19572094  if (!TEST_OPT_NOT_BUCKETS)
     
    19642101
    19652102  // strat->posInT = posInT_pLength;
    1966   kTest_TS(strat);
    1967 
     2103 
    19682104#ifdef KDEBUG
    19692105#if MYTEST
     
    19892125  }
    19902126
    1991 
     2127  #if 1
     2128  if(rField_is_Ring(currRing) && strat->sbaEnterS >= 0)
     2129  {
     2130    for(int i = 0;i<strat->sbaEnterS;i++)
     2131    {
     2132      //Update: now the element is at the corect place
     2133      //i+1 because on the 0 position is the sigdrop element
     2134      enterT(strat->L[strat->Ll-(i)],strat);
     2135      strat->enterS(strat->L[strat->Ll-(i)], strat->sl+1, strat, strat->tl);
     2136    }
     2137    strat->Ll = strat->Ll - strat->sbaEnterS;
     2138    strat->sbaEnterS = -1;
     2139  }
     2140  #endif
     2141  kTest_TS(strat);
    19922142#ifdef KDEBUG
    19932143  //kDebugPrint(strat);
     
    19962146  while (strat->Ll >= 0)
    19972147  {
     2148    #if ADIDEBUG
     2149    printf("\n      ------------------------NEW LOOP\n");
     2150    printf("\nShdl = \n");
     2151    #if 0
     2152    idPrint(strat->Shdl);
     2153    #else
     2154    for(int ii = 0; ii<=strat->sl;ii++)
     2155    {
     2156      printf("\nS[%i]:  ",ii);p_Write(strat->S[ii],strat->tailRing);
     2157      printf("sig:   ");pWrite(strat->sig[ii]);
     2158    }
     2159    #endif
     2160    #if 0
     2161    for(int iii = 0; iii< strat->syzl; iii++)
     2162    {
     2163        printf("\nsyz[%i]:\n",iii);
     2164        p_Write(strat->syz[iii], currRing);
     2165    }
     2166    #endif
     2167    #if 0
     2168    for(int iii = 0; iii<= strat->tl; iii++)
     2169    {
     2170        printf("\nT[%i]:\n",iii);
     2171        p_Write(strat->T[iii].p, currRing);
     2172    }
     2173    #endif
     2174    printf("\n   list   L\n");
     2175    int iii;
     2176    #if 1
     2177    for(iii = 0; iii<= strat->Ll; iii++)
     2178    {
     2179        printf("\nL[%i]:\n",iii);
     2180        p_Write(strat->L[iii].p, currRing);
     2181        p_Write(strat->L[iii].p1, currRing);
     2182        p_Write(strat->L[iii].p2, currRing);
     2183        p_Write(strat->L[iii].sig, currRing);
     2184    }
     2185    #else
     2186    {
     2187        printf("L[%i]:",strat->Ll);
     2188        p_Write(strat->L[strat->Ll].p, strat->tailRing);
     2189        p_Write(strat->L[strat->Ll].p1, strat->tailRing);
     2190        p_Write(strat->L[strat->Ll].p2, strat->tailRing);
     2191        p_Write(strat->L[strat->Ll].sig, strat->tailRing);
     2192    }
     2193    #endif
     2194    //getchar();
     2195    #endif
    19982196    if (strat->Ll > lrmax) lrmax =strat->Ll;/*stat.*/
    19992197    #ifdef KDEBUG
     
    20312229      // initialize new syzygy rules for the next iteration step
    20322230      initSyzRules(strat);
    2033 
    20342231    }
    20352232    /*********************************************************************
     
    20402237    strat->P = strat->L[strat->Ll];
    20412238    strat->Ll--;
     2239   
     2240    #ifdef HAVE_RINGS
     2241    if(rField_is_Ring(currRing))
     2242      strat->sbaEnterS = pGetComp(strat->P.sig) - 1;
     2243    #endif
     2244   
     2245    #if ADIDEBUG
     2246    printf("\n-------------------------\nThis is the current element P\n");
     2247    pWrite(strat->P.p);
     2248    pWrite(strat->P.p1);
     2249    pWrite(strat->P.p2);
     2250    pWrite(strat->P.sig);
     2251    #endif
    20422252    /* reduction of the element chosen from L */
    20432253
     
    21312341      red_result = 2;
    21322342    }
     2343    #ifdef HAVE_RINGS
     2344    if(rField_is_Ring(currRing))
     2345    {
     2346      strat->P.pLength = pLength(strat->P.p);
     2347      if(strat->P.sig != NULL)
     2348        strat->P.sevSig = pGetShortExpVector(strat->P.sig);
     2349      if(strat->P.p != NULL)
     2350        strat->P.sev = pGetShortExpVector(strat->P.p);
     2351    }
     2352    #endif
     2353    #if ADIDEBUG
     2354    printf("\nAfter reduce (redresult=%i): \n",red_result);pWrite(strat->P.p);pWrite(strat->P.sig);
     2355    #endif
     2356    #ifdef HAVE_RINGS
     2357    //sigdrop case
     2358    if(rField_is_Ring(currRing) && strat->sigdrop)
     2359    {
     2360      //First reduce it as much as one can
     2361      #if ADIDEBUG
     2362      printf("\nSigdrop in the reduce. Trying redring\n");
     2363      #endif
     2364      red_result = redRing(&strat->P,strat);
     2365      if(red_result == 0)
     2366      {
     2367        #if ADIDEBUG
     2368        printf("\nSigdrop cancelled since redRing reduced to 0\n");
     2369        #endif
     2370        strat->sigdrop = FALSE;
     2371      }
     2372      else
     2373      {
     2374        #if ADIDEBUG
     2375        printf("\nStill Sigdrop - redRing reduced to:\n");pWrite(strat->P.p);
     2376        #endif
     2377        strat->enterS(strat->P, 0, strat, strat->tl);
     2378        break;
     2379      }
     2380    }
     2381    #endif
     2382   
    21332383    if (errorreported)  break;
    21342384
     
    21482398        if (!kStratChangeTailRing(strat)) { Werror("OVERFLOW.."); break;}
    21492399    }
    2150 
    21512400    // reduction to non-zero new poly
    21522401    if (red_result == 1)
     
    21702419      // the one with highest signature
    21712420      int pos = strat->sl+1;
    2172 
    21732421#ifdef KDEBUG
    21742422#if MYTEST
     
    21802428      // in the ring case we cannot expect LC(f) = 1,
    21812429      // therefore we call pContent instead of pNorm
     2430      #ifdef HAVE_RINGS
     2431      poly beforetailred;
     2432      if(rField_is_Ring(currRing))
     2433        beforetailred = pCopy(strat->P.sig);
     2434      #endif
    21822435#if SBA_TAIL_RED
    2183       if (strat->sbaOrder != 2) {
    2184         if ((TEST_OPT_INTSTRATEGY) || (rField_is_Ring(currRing)))
    2185         {
    2186           strat->P.pCleardenom();
    2187           if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
     2436#ifdef HAVE_RINGS
     2437      if(rField_is_Ring(currRing))
     2438      { 
     2439        if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
     2440          strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT);
     2441      }
     2442      else
     2443#endif
     2444      {
     2445        if (strat->sbaOrder != 2) {
     2446          if (TEST_OPT_INTSTRATEGY)
    21882447          {
    2189             strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT);
    21902448            strat->P.pCleardenom();
     2449            if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
     2450            {
     2451              strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT);
     2452              strat->P.pCleardenom();
     2453            }
    21912454          }
     2455          else
     2456          {
     2457            strat->P.pNorm();
     2458            if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
     2459              strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT);
     2460          }
     2461        }
     2462      }
     2463      // It may happen that we have lost the sig in redtailsba
     2464      // It cannot reduce to 0 since here we are doing just tail reduction.
     2465      // Best case scenerio: remains the leading term
     2466      #ifdef HAVE_RINGS
     2467      if(rField_is_Ring(currRing) && strat->sigdrop)     
     2468      {
     2469        #if ADIDEBUG
     2470        printf("\n Still sigdrop after redtailSba - it reduced to \n");pWrite(strat->P.p);
     2471        #endif
     2472        strat->enterS(strat->P, 0, strat, strat->tl);
     2473        break;
     2474      }
     2475      #endif
     2476#endif
     2477    #ifdef HAVE_RINGS
     2478    if(rField_is_Ring(currRing))
     2479    {
     2480      if(strat->P.sig == NULL || pLtCmp(beforetailred,strat->P.sig) == 1)
     2481      {
     2482        #if ADIDEBUG
     2483        printf("\nSigDrop after TAILred\n");pWrite(beforetailred);pWrite(strat->P.sig);
     2484        #endif
     2485        strat->sigdrop = TRUE;
     2486        //Reduce it as much as you can
     2487        red_result = redRing(&strat->P,strat);
     2488        if(red_result == 0)
     2489        {
     2490          //It reduced to 0, cancel the sigdrop
     2491          #if ADIDEBUG
     2492          printf("\nReduced to 0 via redRing. Cancel sigdrop\n");
     2493          #endif
     2494          strat->sigdrop = FALSE;
     2495          p_Delete(&strat->P.sig,currRing);strat->P.sig = NULL;
    21922496        }
    21932497        else
    21942498        {
    2195           strat->P.pNorm();
    2196           if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
    2197             strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT);
    2198         }
    2199       }
    2200 #endif
     2499          #if ADIDEBUG
     2500          printf("\nReduced to this via redRing.SIGDROP\n");pWrite(strat->P.p);
     2501          #endif
     2502          strat->enterS(strat->P, 0, strat, strat->tl);
     2503          break;
     2504        }
     2505      }
     2506      p_Delete(&beforetailred,currRing);
     2507      if(!nGreaterZero(pGetCoeff(strat->P.p)))
     2508      {
     2509        strat->P.p = pNeg(strat->P.p);
     2510        strat->P.sig = pNeg(strat->P.sig);
     2511      }
     2512    }
     2513    #endif
    22012514
    22022515    // remove sigsafe label since it is no longer valid for the next element to
     
    22592572#ifdef HAVE_RINGS
    22602573      if (rField_is_Ring(currRing))
    2261         superenterpairs(strat->P.p,strat->sl,strat->P.ecart,pos,strat, strat->tl);
     2574        superenterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl);
    22622575      else
    22632576#endif
    22642577        enterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl);
     2578      #if ADIDEBUG
     2579        printf("\nThis element is added to S\n");
     2580        p_Write(strat->P.p, strat->tailRing);p_Write(strat->P.p1, strat->tailRing);p_Write(strat->P.p2, strat->tailRing);pWrite(strat->P.sig);
     2581        #endif
    22652582      // posInS only depends on the leading term
     2583     
     2584      #ifdef HAVE_RINGS
     2585      if(rField_is_Ring(currRing) && strat->sigdrop)
     2586        break;
     2587      #endif
     2588      strat->P.sevSig = p_GetShortExpVector(strat->P.sig,currRing);
    22662589      strat->enterS(strat->P, pos, strat, strat->tl);
     2590     
    22672591      if(strat->sbaOrder != 1)
    22682592      {
     
    24322756        zeroreductions++;
    24332757#endif
    2434         int pos = posInSyz(strat, strat->P.sig);
    2435         enterSyz(strat->P, strat, pos);
    2436 //#if 1
    2437 #ifdef DEBUGF5
    2438         Print("ADDING STUFF TO SYZ :  ");
    2439         //pWrite(strat->P.p);
    2440         pWrite(strat->P.sig);
    2441 #endif
     2758        #ifdef HAVE_RINGS
     2759        if(rField_is_Ring(currRing) && strat->P.p == NULL && strat->P.sig == NULL)
     2760        {
     2761          //Catch the case when p = 0, sig = 0
     2762        }
     2763        else
     2764        #endif
     2765        {
     2766          int pos = posInSyz(strat, strat->P.sig);
     2767          enterSyz(strat->P, strat, pos);
     2768  //#if 1
     2769  #ifdef DEBUGF5
     2770          Print("ADDING STUFF TO SYZ :  ");
     2771          //pWrite(strat->P.p);
     2772          pWrite(strat->P.sig);
     2773  #endif
     2774        }
    24422775      }
    24432776      if (strat->P.p1 == NULL && strat->minim > 0)
     
    24522785    kTest_TS(strat);
    24532786  }
     2787  #if 0
     2788  if(strat->sigdrop)
     2789    printf("\nSigDrop!\n");
     2790  else
     2791    printf("\nEnded with no SigDrop\n");
     2792  #endif
     2793// Clean strat->P for the next sba call
     2794#ifdef HAVE_RINGS
     2795  if(rField_is_Ring(currRing) && strat->sigdrop)
     2796  {
     2797    //This is used to know how many elements can we directly add to S in the next run
     2798    if(strat->P.sig != NULL)
     2799      strat->sbaEnterS = pGetComp(strat->P.sig)-1;
     2800    //else we already set it at the beggining of the loop
     2801    #ifdef KDEBUG
     2802    memset(&(strat->P), 0, sizeof(strat->P));
     2803    #endif /* KDEBUG */
     2804  }
     2805#endif
    24542806#ifdef KDEBUG
    24552807#if MYTEST
    2456   PrintS("bba finish GB: currRing: "); rWrite(currRing);
     2808  PrintS("sba finish GB: currRing: "); rWrite(currRing);
    24572809#endif /* MYTEST */
    24582810  if (TEST_OPT_DEBUG) messageSets(strat);
     
    24802832    }
    24812833  }
    2482 
    24832834  /* complete reduction of the standard basis--------- */
    24842835  if (TEST_OPT_REDSB)
     
    25042855  size_syz = strat->syzl;
    25052856#endif
    2506   exitSba(strat);
    25072857//  if (TEST_OPT_WEIGHTM)
    25082858//  {
     
    25162866  if (TEST_OPT_PROT) messageStat(hilbcount,strat);
    25172867  if (Q!=NULL) updateResult(strat->Shdl,Q,strat);
    2518 
    25192868#ifdef KDEBUG
    25202869#if MYTEST
    2521   PrintS("bba_end: currRing: "); rWrite(currRing);
     2870  PrintS("sba_end: currRing: "); rWrite(currRing);
    25222871#endif /* MYTEST */
    25232872#endif /* KDEBUG */
     
    25252874  size_g_non_red  = IDELEMS(strat->Shdl);
    25262875#endif
     2876  //This is again done better at the beginning of the next loop because else damage S
     2877  //Put the element that caused the sigdrop ast the beginning
     2878  #if 0
     2879  //#if SIG_DROP_FIRST
     2880  poly dummy;
     2881  dummy = pCopy(strat->Shdl->m[strat->sl]);
     2882  for(int k=strat->sl;k>=1;k--)
     2883  {
     2884    strat->Shdl->m[k] = strat->Shdl->m[k-1];
     2885    strat->sig[k] = strat->sig[k-1];
     2886  }
     2887  strat->Shdl->m[0] = dummy;
     2888  #endif
     2889  idTest(strat->Shdl);
     2890  // I have to add the initial input polynomials which where not used (p1 and p2 = NULL)
     2891  #ifdef HAVE_RINGS
     2892  int k;
     2893  if(rField_is_Ring(currRing))
     2894  {
     2895    //for(k = strat->sl;k>=0;k--)
     2896    //  {printf("\nS[%i] = %p\n",k,strat->Shdl->m[k]);pWrite(strat->Shdl->m[k]);}
     2897    k = strat->Ll;
     2898    #if 1
     2899    // 1 - adds just the unused ones, 0 - adds everthing
     2900    for(;k>=0 && (strat->L[k].p1 != NULL || strat->L[k].p2 != NULL);k--)
     2901    {
     2902      //printf("\nDeleted k = %i, %p\n",k,strat->L[k].p);pWrite(strat->L[k].p);pWrite(strat->L[k].p1);pWrite(strat->L[k].p2);
     2903      deleteInL(strat->L,&strat->Ll,k,strat);
     2904    }
     2905    #endif
     2906    //for(int kk = strat->sl;kk>=0;kk--)
     2907    //  {printf("\nS[%i] = %p\n",kk,strat->Shdl->m[kk]);pWrite(strat->Shdl->m[kk]);}
     2908    //idPrint(strat->Shdl);
     2909  idTest(strat->Shdl);
     2910    //printf("\nk = %i\n",k);
     2911    for(;k>=0 && strat->L[k].p1 == NULL && strat->L[k].p2 == NULL;k--)
     2912    {
     2913      //printf("\nAdded k = %i\n",k);
     2914      strat->enterS(strat->L[k], strat->sl+1, strat, strat->tl);
     2915      //printf("\nThis elements was added from L on pos %i\n",strat->sl);pWrite(strat->S[strat->sl]);pWrite(strat->sig[strat->sl]);
     2916    }
     2917  }
     2918  // Find the "sigdrop element" and put the same signature as the previous one - do we really need this?? - now i put it on the 0 position - no more comparing needed
     2919  #if 0
     2920  if(strat->sigdrop && rField_is_Ring(currRing))
     2921  {
     2922    for(k=strat->sl;k>=0;k--)
     2923    {
     2924      printf("\nsig[%i] = ",i);pWrite(strat->sig[k]);
     2925      if(strat->sig[k] == NULL)
     2926        strat->sig[k] = pCopy(strat->sig[k-1]);
     2927    }
     2928  }
     2929  #endif
     2930  #endif
     2931  //Never do this - you will damage S
     2932  //idSkipZeroes(strat->Shdl);
     2933  //idPrint(strat->Shdl);
     2934  idTest(strat->Shdl);
     2935  #if REV_BLOCK_SBA
     2936  #if ADIDEBUG
     2937  printf("\nSBA Endrun before block reverse sigdrop sorting: \n");
     2938  for(k = 0; k<=strat->sl; k++)
     2939  {
     2940    printf("[%i]:",k);pWrite(strat->Shdl->m[k]);
     2941    if(strat->sig[k]!= NULL)
     2942      {printf("       ");pWrite(strat->sig[k]);}
     2943    else
     2944      printf("        0\n");
     2945  }
     2946  #endif
     2947  //Reverse Blockwise Sorting of output needed for the Sig Drop Problem
     2948  #ifdef HAVE_RINGS
     2949  if(rField_is_Ring(currRing) && strat->sigdrop)
     2950  {
     2951    poly dummy;
     2952    int i,j;
     2953    for(i=0;i<=strat->sl;)
     2954    {
     2955      k = pGetComp(strat->sig[i]);
     2956      for(j = i; j<=strat->sl && strat->sig[j]!= NULL && pGetComp(strat->sig[j]) == k;++j)
     2957      {
     2958        //printf("\n%i is ok",j);
     2959      }
     2960      if(j == strat->sl && strat->sig[j] == NULL)
     2961        j++;
     2962      j--;
     2963      //printf("\ni = %i, j = %i\n",i,j);
     2964      //getchar();
     2965      for(k=0;k<(j-i)/2;k++)
     2966      {
     2967        //printf("\n%i <> %i\n",i+k,j-k);
     2968        dummy = pCopy(strat->Shdl->m[i+k]);
     2969        strat->Shdl->m[i+k] = strat->Shdl->m[j-k];
     2970        strat->Shdl->m[j-k] = pCopy(dummy);
     2971        p_Delete(&dummy, currRing);
     2972        if(strat->sig[i+k]!= NULL)
     2973          dummy = pCopy(strat->sig[i+k]);
     2974        else
     2975          dummy = NULL;
     2976        strat->sig[i+k] = strat->sig[j-k];
     2977        if(dummy!= NULL)
     2978        {
     2979          strat->sig[j-k] = pCopy(dummy);
     2980          p_Delete(&dummy, currRing);
     2981        }
     2982      }
     2983      i = j+1;
     2984    }
     2985  }
     2986  #endif
     2987  #if ADIDEBUG
     2988  printf("\nSBA Endrun after block reverse sigdrop sorting: \n");
     2989  for(k = 0; k<=strat->sl; k++)
     2990  {
     2991    printf("[%i]:",k);pWrite(strat->Shdl->m[k]);
     2992    if(strat->sig[k]!= NULL)
     2993      {printf("       ");pWrite(strat->sig[k]);}
     2994    else
     2995      printf("        0\n");
     2996  }
     2997  #endif
     2998  #endif
    25272999  if ((strat->sbaOrder == 1 || strat->sbaOrder == 3) && sRing!=currRingOld)
    25283000  {
     
    25303002    F0          = idrMoveR (F1, sRing, currRing);
    25313003    strat->Shdl = idrMoveR_NoSort (strat->Shdl, sRing, currRing);
     3004    rChangeCurrRing (sRing);
     3005    exitSba(strat);
     3006    rChangeCurrRing (currRingOld);
    25323007    rDelete (sRing);
    25333008  }
    2534   id_DelDiv(strat->Shdl, currRing);
     3009  #ifdef HAVE_RINGS
     3010  if(rField_is_Ring(currRing) && !strat->sigdrop)
     3011  #endif
     3012    id_DelDiv(strat->Shdl, currRing);
    25353013  idSkipZeroes(strat->Shdl);
    25363014  idTest(strat->Shdl);
  • kernel/GBEngine/kutil.cc

    r1c1d660 rff38ee  
    1212#define MYTEST 0
    1313
    14 #define ADIDEBUG 0
     14#define ADIDEBUG 1
    1515
    1616#include <kernel/mod2.h>
     
    513513     pGetShallowCopyDeleteProc(strat->tailRing, currRing) :
    514514     NULL);
    515 
    516515  for (j=0; j<=strat->tl; j++)
    517516  {
     
    534533        }
    535534        else
    536           pDelete(&p);
     535        {
     536          //pDelete(&p);
     537          p = NULL;
     538        }
    537539        break;
    538540      }
     
    821823{
    822824  int i;
    823 
    824825  // test P
    825826  kFalseReturn(kTest_L(&(strat->P), strat->tailRing,
     
    15241525  return TRUE;
    15251526}
     1527
     1528
     1529BOOLEAN enterOneStrongPolySig (int i,poly p,poly sig,int /*ecart*/, int /*isFromQ*/,kStrategy strat, int atR)
     1530{
     1531  number d, s, t;
     1532  assume(atR >= 0);
     1533  poly m1, m2, gcd,si;
     1534  assume(i<=strat->sl);
     1535  si = strat->S[i];
     1536  //printf("\n--------------------------------\n");
     1537  //pWrite(p);pWrite(si);
     1538  d = n_ExtGcd(pGetCoeff(p), pGetCoeff(si), &s, &t, currRing->cf);
     1539
     1540  if (nIsZero(s) || nIsZero(t))  // evtl. durch divBy tests ersetzen
     1541  {
     1542    nDelete(&d);
     1543    nDelete(&s);
     1544    nDelete(&t);
     1545    return FALSE;
     1546  }
     1547
     1548  k_GetStrongLeadTerms(p, si, currRing, m1, m2, gcd, strat->tailRing);
     1549  //p_Test(m1,strat->tailRing);
     1550  //p_Test(m2,strat->tailRing);
     1551  /*if(!enterTstrong)
     1552  {
     1553    while (! kCheckStrongCreation(atR, m1, i, m2, strat) )
     1554    {
     1555      memset(&(strat->P), 0, sizeof(strat->P));
     1556      kStratChangeTailRing(strat);
     1557      strat->P = *(strat->R[atR]);
     1558      p_LmFree(m1, strat->tailRing);
     1559      p_LmFree(m2, strat->tailRing);
     1560      p_LmFree(gcd, currRing);
     1561      k_GetStrongLeadTerms(p, si, currRing, m1, m2, gcd, strat->tailRing);
     1562    }
     1563  }*/
     1564  pSetCoeff0(m1, s);
     1565  pSetCoeff0(m2, t);
     1566  pSetCoeff0(gcd, d);
     1567  p_Test(m1,strat->tailRing);
     1568  p_Test(m2,strat->tailRing);
     1569  //printf("\n===================================\n");
     1570  //pWrite(m1);pWrite(m2);pWrite(gcd);
     1571#ifdef KDEBUG
     1572  if (TEST_OPT_DEBUG)
     1573  {
     1574    // Print("t = %d; s = %d; d = %d\n", nInt(t), nInt(s), nInt(d));
     1575    PrintS("m1 = ");
     1576    p_wrp(m1, strat->tailRing);
     1577    PrintS(" ; m2 = ");
     1578    p_wrp(m2, strat->tailRing);
     1579    PrintS(" ; gcd = ");
     1580    wrp(gcd);
     1581    PrintS("\n--- create strong gcd poly: ");
     1582    Print("\n p: %d", i);
     1583    wrp(p);
     1584    Print("\n strat->S[%d]: ", i);
     1585    wrp(si);
     1586    PrintS(" ---> ");
     1587  }
     1588#endif
     1589
     1590  pNext(gcd) = p_Add_q(pp_Mult_mm(pNext(p), m1, strat->tailRing), pp_Mult_mm(pNext(si), m2, strat->tailRing), strat->tailRing);
     1591 
     1592#ifdef KDEBUG
     1593  if (TEST_OPT_DEBUG)
     1594  {
     1595    wrp(gcd);
     1596    PrintLn();
     1597  }
     1598#endif
     1599
     1600  //Check and set the signatures
     1601  poly pSigMult = p_Copy(sig,currRing);
     1602  poly sSigMult = p_Copy(strat->sig[i],currRing);
     1603  pSigMult = p_Mult_mm(pSigMult,m1,currRing);
     1604  sSigMult = p_Mult_mm(sSigMult,m2,currRing);
     1605  p_LmDelete(m1, strat->tailRing);
     1606  p_LmDelete(m2, strat->tailRing);
     1607  poly pairsig;
     1608  if(pLmCmp(pSigMult,sSigMult) == 0)
     1609  {
     1610    //Same lm, have to add them
     1611    pairsig = p_Add_q(pSigMult,sSigMult,currRing);
     1612    //This might be zero
     1613  }
     1614  else
     1615  {
     1616    //Set the sig to either pSigMult or sSigMult
     1617    if(pLtCmp(pSigMult,sSigMult)==1)
     1618    {
     1619      pairsig = pSigMult;
     1620      pDelete(&sSigMult);
     1621    }
     1622    else
     1623    {
     1624      pairsig = sSigMult;
     1625      pDelete(&pSigMult);
     1626    }
     1627  }
     1628
     1629  LObject h;
     1630  h.p = gcd;
     1631  h.tailRing = strat->tailRing;
     1632  h.sig = pairsig;
     1633  int posx;
     1634  h.pCleardenom();
     1635  strat->initEcart(&h);
     1636  h.sev = pGetShortExpVector(h.p);
     1637  h.i_r1 = -1;h.i_r2 = -1;
     1638  if (currRing!=strat->tailRing)
     1639    h.t_p = k_LmInit_currRing_2_tailRing(h.p, strat->tailRing);
     1640  if(h.sig == NULL)
     1641    {
     1642      #if ADIDEBUG
     1643      printf("\nPossible sigdrop in enterpairSig (due to lost of sig)\n");
     1644      #endif
     1645      //sigdrop since we loose the signature
     1646      strat->sigdrop = TRUE;
     1647      //Try to reduce it as far as we can via redRing
     1648      int red_result = redRing(&h,strat);
     1649      #if ADIDEBUG
     1650      printf("\nAfter redRing reduce:\n");pWrite(h.p);
     1651      #endif
     1652      if(red_result == 0)
     1653      {
     1654        // Cancel the sigdrop
     1655        #if ADIDEBUG
     1656        printf("\nCancel the sigdrop. It reduced to 0\n");
     1657        #endif
     1658        p_Delete(&h.sig,currRing);h.sig = NULL;
     1659        strat->sigdrop = FALSE;
     1660        return FALSE;
     1661      }
     1662      else
     1663      {
     1664        #if ADIDEBUG
     1665        printf("\nSigdrop. end\n");
     1666        #endif
     1667        strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1);
     1668        #if 1
     1669        strat->enterS(h,0,strat,strat->tl);
     1670        #endif
     1671        return FALSE;
     1672      }
     1673    }
     1674  if(!nGreaterZero(pGetCoeff(h.sig)))
     1675  {
     1676    h.sig = pNeg(h.sig);
     1677    h.p = pNeg(h.p);
     1678  }
     1679  #ifdef HAVE_RINGS
     1680 
     1681    if(rField_is_Ring(currRing) &&
     1682      pLtCmp(h.sig,sig) == -1
     1683      )
     1684    {
     1685      #if ADIDEBUG
     1686      printf("\nSigDrop in enteronestrongpolySig\n");
     1687      pWrite(h.sig);
     1688      pWrite(p);pWrite(sig);
     1689      pWrite(strat->S[i]);pWrite(strat->sig[i]);
     1690      #endif
     1691      strat->sigdrop = TRUE;
     1692      // Completely reduce it
     1693      int red_result = redRing(&h,strat);
     1694      if(red_result == 0)
     1695      {
     1696        // Reduced to 0
     1697        #if ADIDEBUG
     1698        printf("\nCancel the sigdrop after redRing (=0)\n");
     1699        #endif
     1700        strat->sigdrop = FALSE;
     1701        p_Delete(&h.sig,currRing);h.sig = NULL;
     1702        return FALSE;
     1703      }
     1704      else
     1705      {
     1706        #if ADIDEBUG
     1707        printf("\nAfter redRing still sigdrop:\n");pWrite(h.p);
     1708        #endif
     1709        strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1);
     1710        // 0 - add just the original poly causing the sigdrop, 1 - add also this
     1711        #if 1
     1712        strat->enterS(h,0,strat, strat->tl+1);
     1713        #endif
     1714        return FALSE;
     1715      }
     1716    }
     1717    #endif
     1718  #if ADIDEBUG
     1719  printf("\nThis strong poly was added to L:\n");pWrite(h.p);pWrite(h.p1);pWrite(h.p2);pWrite(h.sig);
     1720  #endif
     1721  //Check for sigdrop
     1722  if(gcd != NULL && pLtCmp(sig,pairsig) > 0 && pLtCmp(strat->sig[i],pairsig) > 0)
     1723  {
     1724    #if ADIDEBUG
     1725    printf("\nSigDrop in strongpair\noriginals: ");pWrite(sig);pWrite(strat->sig[i]);
     1726    printf("\nnow: ");pWrite(pairsig);
     1727    #endif
     1728    strat->sigdrop = TRUE;
     1729    //Enter this element to S
     1730    strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1);
     1731    strat->enterS(h,strat->sl+1,strat,strat->tl+1);
     1732  }
     1733  #if 1
     1734  h.p1 = p;h.p2 = strat->S[i];
     1735  #endif
     1736  if (atR >= 0)
     1737  {
     1738    h.i_r2 = strat->S_2_R[i];
     1739    h.i_r1 = atR;
     1740  }
     1741  else
     1742  {
     1743    h.i_r1 = -1;
     1744    h.i_r2 = -1;
     1745  }
     1746  if (strat->Ll==-1)
     1747    posx =0;
     1748  else
     1749    posx = strat->posInLSba(strat->L,strat->Ll,&h,strat);
     1750  enterL(&strat->L,&strat->Ll,&strat->Lmax,h,posx);
     1751  return TRUE;
     1752}
    15261753#endif
    15271754
     
    20542281#endif
    20552282{
     2283  #if ADIDEBUG
     2284  printf("\nTrying to add p and S[%i]\n",i);
     2285  pWrite(p);pWrite(pSig);
     2286  pWrite(strat->S[i]);pWrite(strat->sig[i]);
     2287  #endif
    20562288  assume(i<=strat->sl);
    2057 
    20582289  int      l;
    20592290  poly m1 = NULL,m2 = NULL; // we need the multipliers for the s-polynomial to compute
     
    20802311
    20812312  // set coeffs of multipliers m1 and m2
    2082   pSetCoeff0(m1, nInit(1));
    2083   pSetCoeff0(m2, nInit(1));
    2084 //#if 1
     2313  #ifdef HAVE_RINGS
     2314  if(rField_is_Ring(currRing))
     2315  {
     2316    number s = nCopy(pGetCoeff(strat->S[i]));
     2317    number t = nCopy(pGetCoeff(p));
     2318    pSetCoeff0(Lp.lcm, n_Lcm(s, t, currRing->cf));
     2319    ksCheckCoeff(&s, &t, currRing->cf);
     2320    pSetCoeff0(m1,s);
     2321    pSetCoeff0(m2,t);
     2322    #if ADIDEBUG
     2323    printf("\nIn Spoly: m1, m2 :\n");pWrite(m1);pWrite(m2);
     2324    #endif
     2325  }
     2326  else
     2327  #endif
     2328  {
     2329    pSetCoeff0(m1, nInit(1));
     2330    pSetCoeff0(m2, nInit(1));
     2331  }
    20852332#ifdef DEBUGF5
    20862333  Print("P1  ");
     
    20932340  pWrite(m2);
    20942341#endif
     2342 
    20952343  // get multiplied signatures for testing
    2096   pSigMult = currRing->p_Procs->pp_Mult_mm(pSigMult,m1,currRing);
     2344  pSigMult = pp_Mult_mm(pSigMult,m1,currRing);
    20972345  pSigMultNegSev = ~p_GetShortExpVector(pSigMult,currRing);
    2098   sSigMult = currRing->p_Procs->pp_Mult_mm(sSigMult,m2,currRing);
     2346  sSigMult = pp_Mult_mm(sSigMult,m2,currRing);
    20992347  sSigMultNegSev = ~p_GetShortExpVector(sSigMult,currRing);
    2100 
    21012348//#if 1
    21022349#ifdef DEBUGF5
     
    21072354  Lp.checked  = 0;
    21082355#endif
    2109   int sigCmp = p_LmCmp(pSigMult,sSigMult,currRing);
     2356  int sigCmp;
     2357  #ifdef HAVE_RINGS
     2358  if(rField_is_Ring(currRing))
     2359    sigCmp = p_LtCmp(pSigMult,sSigMult,currRing);
     2360  else
     2361  #endif
     2362    sigCmp = p_LmCmp(pSigMult,sSigMult,currRing);
    21102363//#if 1
    21112364#if DEBUGF5
     
    21142367  pWrite(sSigMult);
    21152368#endif
     2369  //In the ring case we already build the sig
     2370  #ifdef HAVE_RINGS
     2371  if(rField_is_Ring(currRing))
     2372  {
     2373    if(sigCmp == 0)
     2374    {
     2375      #if ADIDEBUG
     2376      printf("\nPossible sigdrop in enterpairSig (due to lost of sig)\n");
     2377      #endif
     2378      //sigdrop since we loose the signature
     2379      strat->sigdrop = TRUE;
     2380      //Try to reduce it as far as we can via redRing
     2381      Lp.p = pCopy(p);
     2382      int red_result = redRing(&Lp,strat);
     2383      #if ADIDEBUG
     2384      printf("\nAfter redRing reduce:\n");pWrite(Lp.p);
     2385      #endif
     2386      if(red_result == 0)
     2387      {
     2388        // Cancel the sigdrop
     2389        #if ADIDEBUG
     2390        printf("\nCancel the sigdrop. It reduced to 0\n");
     2391        #endif
     2392        p_Delete(&Lp.sig,currRing);Lp.sig = NULL;
     2393        strat->sigdrop = FALSE;
     2394        return;
     2395      }
     2396      else
     2397      {
     2398        #if ADIDEBUG
     2399        printf("\nSigdrop. end\n");
     2400        #endif
     2401        strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1);
     2402        #if 1
     2403        strat->enterS(Lp,0,strat,strat->tl);
     2404        #endif
     2405        return;
     2406      }
     2407    }
     2408    if(p_LmCmp(pSigMult,sSigMult,currRing) == 0)
     2409    {
     2410      //Same lm, have to substract
     2411      Lp.sig = p_Sub(pCopy(pSigMult),pCopy(sSigMult),currRing);
     2412    }
     2413    else
     2414    {
     2415      if(sigCmp == 1)
     2416      {
     2417        Lp.sig = pCopy(pSigMult);
     2418      }
     2419      if(sigCmp == -1)
     2420      {
     2421        Lp.sig = pNeg(pCopy(sSigMult));
     2422      }
     2423    }
     2424    Lp.sevSig = p_GetShortExpVector(Lp.sig,currRing);
     2425  }
     2426  #endif
     2427 
     2428  #if 0 
    21162429  if(sigCmp==0)
    21172430  {
     
    21312444    return;
    21322445  }
     2446  #endif
    21332447  // testing by syzCrit = F5 Criterion
    21342448  // testing by rewCrit1 = Rewritten Criterion
     
    21392453      )
    21402454  {
     2455    #if ADIDEBUG
     2456    printf("\nDELETED!\n");
     2457    #endif
    21412458    pDelete(&pSigMult);
    21422459    pDelete(&sSigMult);
     
    21662483  else
    21672484  {
    2168     #ifdef HAVE_PLURAL
    2169     if ( rIsPluralRing(currRing) )
    2170     {
    2171       if(pHasNotCF(p, strat->S[i]))
    2172       {
    2173          if(ncRingType(currRing) == nc_lie)
    2174          {
    2175              // generalized prod-crit for lie-type
    2176              strat->cp++;
    2177              Lp.p = nc_p_Bracket_qq(pCopy(p),strat->S[i], currRing);
    2178          }
    2179          else
    2180         if( ALLOW_PROD_CRIT(strat) )
    2181         {
    2182             // product criterion for homogeneous case in SCA
    2183             strat->cp++;
    2184             Lp.p = NULL;
     2485    //Build p
     2486    #ifdef HAVE_RINGS
     2487    if(rField_is_Ring(currRing))
     2488    {
     2489      poly p1 = p_Copy(p,currRing);
     2490      poly p2 = p_Copy(strat->S[i],currRing);
     2491      p1 = p_Mult_mm(p1,m1,currRing);
     2492      p2 = p_Mult_mm(p2,m2,currRing);
     2493      Lp.p = p_Sub(p1,p2,currRing);
     2494      if(Lp.p != NULL)
     2495        Lp.sev = p_GetShortExpVector(Lp.p,currRing);
     2496    }
     2497    else
     2498    #endif
     2499    {
     2500      #ifdef HAVE_PLURAL
     2501      if ( rIsPluralRing(currRing) )
     2502      {
     2503        if(pHasNotCF(p, strat->S[i]))
     2504        {
     2505           if(ncRingType(currRing) == nc_lie)
     2506           {
     2507               // generalized prod-crit for lie-type
     2508               strat->cp++;
     2509               Lp.p = nc_p_Bracket_qq(pCopy(p),strat->S[i], currRing);
     2510           }
     2511           else
     2512          if( ALLOW_PROD_CRIT(strat) )
     2513          {
     2514              // product criterion for homogeneous case in SCA
     2515              strat->cp++;
     2516              Lp.p = NULL;
     2517          }
     2518          else
     2519          {
     2520            Lp.p = // nc_CreateSpoly(strat->S[i],p,currRing);
     2521                  nc_CreateShortSpoly(strat->S[i], p, currRing);
     2522
     2523            assume(pNext(Lp.p)==NULL); // TODO: this may be violated whenever ext.prod.crit. for Lie alg. is used
     2524            pNext(Lp.p) = strat->tail; // !!!
     2525          }
    21852526        }
    21862527        else
     
    21912532          assume(pNext(Lp.p)==NULL); // TODO: this may be violated whenever ext.prod.crit. for Lie alg. is used
    21922533          pNext(Lp.p) = strat->tail; // !!!
    2193         }
     2534
     2535        }
     2536
     2537
     2538  #if MYTEST
     2539        if (TEST_OPT_DEBUG)
     2540        {
     2541          PrintS("enterOnePairNormal::\n strat->S[i]: "); pWrite(strat->S[i]);
     2542          PrintS("p: "); pWrite(p);
     2543          PrintS("SPoly: "); pWrite(Lp.p);
     2544        }
     2545  #endif
     2546
    21942547      }
    21952548      else
    2196       {
    2197         Lp.p = // nc_CreateSpoly(strat->S[i],p,currRing);
    2198               nc_CreateShortSpoly(strat->S[i], p, currRing);
    2199 
    2200         assume(pNext(Lp.p)==NULL); // TODO: this may be violated whenever ext.prod.crit. for Lie alg. is used
    2201         pNext(Lp.p) = strat->tail; // !!!
    2202 
    2203       }
    2204 
    2205 
    2206 #if MYTEST
    2207       if (TEST_OPT_DEBUG)
    2208       {
    2209         PrintS("enterOnePairNormal::\n strat->S[i]: "); pWrite(strat->S[i]);
    2210         PrintS("p: "); pWrite(p);
    2211         PrintS("SPoly: "); pWrite(Lp.p);
    2212       }
    2213 #endif
    2214 
    2215     }
    2216     else
    2217     #endif
    2218     {
    2219       assume(!rIsPluralRing(currRing));
    2220       Lp.p = ksCreateShortSpoly(strat->S[i], p, strat->tailRing);
    2221 #if MYTEST
    2222       if (TEST_OPT_DEBUG)
    2223       {
    2224         PrintS("enterOnePairNormal::\n strat->S[i]: "); pWrite(strat->S[i]);
    2225         PrintS("p: "); pWrite(p);
    2226         PrintS("commutative SPoly: "); pWrite(Lp.p);
    2227       }
    2228 #endif
    2229 
    2230       }
     2549      #endif
     2550      {
     2551        assume(!rIsPluralRing(currRing));
     2552        Lp.p = ksCreateShortSpoly(strat->S[i], p, strat->tailRing);
     2553  #if MYTEST
     2554        if (TEST_OPT_DEBUG)
     2555        {
     2556          PrintS("enterOnePairNormal::\n strat->S[i]: "); pWrite(strat->S[i]);
     2557          PrintS("p: "); pWrite(p);
     2558          PrintS("commutative SPoly: "); pWrite(Lp.p);
     2559        }
     2560  #endif
     2561
     2562        }
     2563    }
    22312564  }
    22322565  // store from which element this pair comes from for further tests
    22332566  //Lp.from = strat->sl+1;
    2234   if(sigCmp==currRing->OrdSgn)
    2235   {
    2236     // pSig > sSig
    2237     pDelete (&sSigMult);
    2238     Lp.sig    = pSigMult;
    2239     Lp.sevSig = ~pSigMultNegSev;
     2567  #ifdef HAVE_RINGS
     2568  if(rField_is_Ring(currRing))
     2569  {
     2570    //Put the sig to be > 0
     2571    if(!nGreaterZero(pGetCoeff(Lp.sig)))
     2572    {
     2573      Lp.sig = pNeg(Lp.sig);
     2574      Lp.p = pNeg(Lp.p);
     2575    }
    22402576  }
    22412577  else
    2242   {
    2243     // pSig < sSig
    2244     pDelete (&pSigMult);
    2245     Lp.sig    = sSigMult;
    2246     Lp.sevSig = ~sSigMultNegSev;
     2578  #endif
     2579  {
     2580    if(sigCmp==currRing->OrdSgn)
     2581    {
     2582      // pSig > sSig
     2583      pDelete (&sSigMult);
     2584      Lp.sig    = pSigMult;
     2585      Lp.sevSig = ~pSigMultNegSev;
     2586    }
     2587    else
     2588    {
     2589      // pSig < sSig
     2590      pDelete (&pSigMult);
     2591      Lp.sig    = sSigMult;
     2592      Lp.sevSig = ~sSigMultNegSev;
     2593    }
    22472594  }
    22482595  if (Lp.p == NULL)
     
    22572604    if (strat->rewCrit3(Lp.sig,~Lp.sevSig,Lp.p,strat,strat->sl+1)) {
    22582605      pLmFree(Lp.lcm);
     2606      #if ADIDEBUG
     2607      printf("\nrewCrit3 deletes it!\n");
     2608      #endif
    22592609      pDelete(&Lp.sig);
    22602610      Lp.lcm=NULL;
     
    22982648        (!rIsPluralRing(currRing))
    22992649//      ||  (rIsPluralRing(currRing) && (ncRingType(currRing) != nc_lie))
     2650      #ifdef HAVE_RINGS
     2651      && !rField_is_Ring(currRing)
     2652      #endif
    23002653       )
    23012654    {
     
    23182671    if (TEST_OPT_INTSTRATEGY)
    23192672    {
    2320       if (!rIsPluralRing(currRing))
     2673      if (!rIsPluralRing(currRing)
     2674      #ifdef HAVE_RINGS
     2675      && !rField_is_Ring(currRing)
     2676      #endif
     2677      )
    23212678        nDelete(&(Lp.p->coef));
    23222679    }
    2323 
    2324     l = strat->posInLSba(strat->B,strat->Bl,&Lp,strat);
    2325     enterL(&strat->B,&strat->Bl,&strat->Bmax,Lp,l);
     2680    // Check for sigdrop
     2681    #ifdef HAVE_RINGS
     2682    if(rField_is_Ring(currRing) &&
     2683      pLtCmp(Lp.sig,pSig) == -1
     2684      )
     2685    {
     2686      #if ADIDEBUG
     2687      printf("\nSigDrop in enteronepairSig\n");pWrite(Lp.sig);
     2688      pWrite(p);pWrite(pSig);
     2689      pWrite(strat->S[i]);pWrite(strat->sig[i]);
     2690      #endif
     2691      strat->sigdrop = TRUE;
     2692      // Completely reduce it
     2693      int red_result = redRing(&Lp,strat);
     2694      if(red_result == 0)
     2695      {
     2696        // Reduced to 0
     2697        #if ADIDEBUG
     2698        printf("\nCancel the sigdrop after redRing (=0)\n");
     2699        #endif
     2700        strat->sigdrop = FALSE;
     2701        p_Delete(&Lp.sig,currRing);Lp.sig = NULL;
     2702        return;
     2703      }
     2704      else
     2705      {
     2706        #if ADIDEBUG
     2707        printf("\nAfter redRing still sigdrop:\n");pWrite(Lp.p);
     2708        #endif
     2709        strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1);
     2710        // 0 - add just the original poly causing the sigdrop, 1 - add also this
     2711        #if 1
     2712        strat->enterS(Lp,0,strat, strat->tl+1);
     2713        #endif
     2714        return;
     2715      }
     2716    }
     2717    #endif
     2718    #if ADIDEBUG
     2719    printf("\nThis spair was added to B:\n");
     2720    pWrite(Lp.p);
     2721    pWrite(Lp.p1);
     2722    pWrite(Lp.p2);
     2723    pWrite(Lp.sig);
     2724    #endif
     2725    l = strat->posInLSba(strat->L,strat->Ll,&Lp,strat);
     2726    enterL(&strat->L,&strat->Ll,&strat->Lmax,Lp,l);
    23262727  }
    23272728}
     
    31093510      if ((isFromQ)&&(strat->fromQ!=NULL))
    31103511      {
    3111         for (j=0; j<=k; j++)
     3512        for (j=0; j<=k && !strat->sigdrop; j++)
    31123513        {
    31133514          if (!strat->fromQ[j])
     
    31223523      {
    31233524        new_pair=TRUE;
    3124         for (j=0; j<=k; j++)
     3525        for (j=0; j<=k && !strat->sigdrop; j++)
    31253526        {
    31263527          enterOnePairSig(j,h,hSig,hFrom,ecart,isFromQ,strat, atR);
     
    31313532    else
    31323533    {
    3133       for (j=0; j<=k; j++)
     3534      for (j=0; j<=k && !strat->sigdrop; j++)
    31343535      {
    31353536        if ((pGetComp(h)==pGetComp(strat->S[j]))
     
    31433544    }
    31443545
     3546#if 0
    31453547    if (new_pair)
    31463548    {
     
    31523554      strat->chainCrit(h,ecart,strat);
    31533555    }
     3556#endif
    31543557  }
    31553558}
     
    37674170    }
    37684171  }
    3769 /*
    3770 ring r=256,(x,y,z),dp;
    3771 ideal I=12xz-133y, 2xy-z;
    3772 */
     4172}
     4173
     4174void initenterstrongPairsSig (poly h,poly hSig, int hFrom, int k,int ecart,int isFromQ,kStrategy strat, int atR = -1)
     4175{
     4176  const int iCompH = pGetComp(h);
     4177  if (!nIsOne(pGetCoeff(h)))
     4178  {
     4179    int j;
     4180
     4181    for (j=0; j<=k && !strat->sigdrop; j++)
     4182    {
     4183      // Print("j:%d, Ll:%d\n",j,strat->Ll);
     4184//      if (((unsigned long) pGetCoeff(h) % (unsigned long) pGetCoeff(strat->S[j]) != 0) &&
     4185//         ((unsigned long) pGetCoeff(strat->S[j]) % (unsigned long) pGetCoeff(h) != 0))
     4186      if (((iCompH == pGetComp(strat->S[j]))
     4187      || (0 == pGetComp(strat->S[j])))
     4188      && ((iCompH<=strat->syzComp)||(strat->syzComp==0)))
     4189      {
     4190        enterOneStrongPolySig(j,h,hSig,ecart,isFromQ,strat, atR);
     4191      }
     4192    }
     4193  }
    37734194}
    37744195#endif
     
    39004321void superenterpairs (poly h,int k,int ecart,int pos,kStrategy strat, int atR)
    39014322{
    3902 #if ADIDEBUG
    3903   PrintS("\nEnter superenterpairs\n");
    3904   int iii = strat->Ll;
    3905   printf("\nstrat->tl = %i\n",strat->tl);
    3906 #endif
    39074323  assume (rField_is_Ring(currRing));
    39084324  // enter also zero divisor * poly, if this is non zero and of smaller degree
    39094325  if (!(rField_is_Domain(currRing))) enterExtendedSpoly(h, strat);
    3910 //#if ADIDEBUG
    3911   #if 0
    3912   if(iii==strat->Ll)
    3913   {
    3914     PrintS("\n                enterExtendedSpoly has not changed the list L.\n");
    3915   }
    3916   else
    3917   {
    3918     PrintLn();
    3919     PrintS("\n                enterExtendedSpoly changed the list L:\n");
    3920     for(iii=0;iii<=strat->Ll;iii++)
    3921     {
    3922       Print("\n                L[%d]:\n",iii);
    3923       PrintS("                     ");p_Write(strat->L[iii].p,strat->tailRing);
    3924       PrintS("                     ");p_Write(strat->L[iii].p1,strat->tailRing);
    3925       PrintS("                     ");p_Write(strat->L[iii].p2,strat->tailRing);
    3926     }
    3927   }
    3928   printf("\nstrat->tl = %i\n",strat->tl);
    3929   iii = strat->Ll;
    3930 #endif
    39314326  initenterpairs(h, k, ecart, 0, strat, atR);
    3932 //#if ADIDEBUG
    3933   #if 0
    3934   if(iii==strat->Ll)
    3935   {
    3936     PrintS("\n                initenterpairs has not changed the list L.\n");
    3937   }
    3938   else
    3939   {
    3940     PrintS("\n                initenterpairs changed the list L:\n");
    3941     for(iii=0;iii<=strat->Ll;iii++)
    3942     {
    3943       Print("\n                L[%d]:\n",iii);
    3944       PrintS("                     ");p_Write(strat->L[iii].p1,strat->tailRing);
    3945       PrintS("                     ");p_Write(strat->L[iii].p2,strat->tailRing);
    3946       PrintS("                     ");p_Write(strat->L[iii].p,strat->tailRing);
    3947     }
    3948   }
    3949   printf("\nstrat->tl = %i\n",strat->tl);
    3950   iii = strat->Ll;
    3951 #endif
    39524327  initenterstrongPairs(h, k, ecart, 0, strat, atR);
    3953 //#if ADIDEBUG
    3954   #if 0
    3955   if(iii==strat->Ll)
    3956   {
    3957     PrintS("\n                initenterstrongPairs has not changed the list L.\n");
    3958   }
    3959   else
    3960   {
    3961     PrintS("\n                initenterstrongPairs changed the list L:\n");
    3962     for(iii=0;iii<=strat->Ll;iii++)
    3963     {
    3964       Print("\n                L[%d]:\n",iii);
    3965       PrintS("                     ");p_Write(strat->L[iii].p1,strat->tailRing);
    3966       PrintS("                     ");p_Write(strat->L[iii].p2,strat->tailRing);
    3967       PrintS("                     ");p_Write(strat->L[iii].p,strat->tailRing);
    3968     }
    3969   }
    3970   printf("\nstrat->tl = %i\n",strat->tl);
    3971   PrintS("\nEnd of superenterpairs\n");
    3972 #endif
    39734328  clearSbatch(h, k, pos, strat);
    3974 #if ADIDEBUG
    3975   printf("\nstrat->tl = %i\n",strat->tl);
    3976 #endif
     4329}
     4330
     4331void superenterpairsSig (poly h,poly hSig,int hFrom,int k,int ecart,int pos,kStrategy strat, int atR)
     4332{
     4333  assume (rField_is_Ring_Z(currRing));
     4334  // enter also zero divisor * poly, if this is non zero and of smaller degree
     4335  //if (!(rField_is_Domain(currRing))) enterExtendedSpoly(h, strat);
     4336  #if ADIDEBUG
     4337  printf("\n      Trying to add spolys\n");
     4338  #endif
     4339  initenterpairsSig(h, hSig, hFrom, k, ecart, 0, strat, atR);
     4340  #if ADIDEBUG
     4341  printf("\n      Trying to add gcd-polys\n");
     4342  #endif
     4343  initenterstrongPairsSig(h, hSig, hFrom,k, ecart, 0, strat, atR);
     4344  clearSbatch(h, k, pos, strat);
    39774345}
    39784346#endif
     
    49385306{
    49395307if (length<0) return 0;
    4940 if (pLmCmp(set[length].sig,p->sig)== currRing->OrdSgn)
     5308if (pLtCmp(set[length].sig,p->sig)== currRing->OrdSgn)
    49415309  return length+1;
    49425310
     
    49485316  if (an >= en-1)
    49495317  {
    4950     if (pLmCmp(set[an].sig,p->sig) == currRing->OrdSgn) return en;
     5318    if (pLtCmp(set[an].sig,p->sig) == currRing->OrdSgn) return en;
    49515319    return an;
    49525320  }
    49535321  i=(an+en) / 2;
    4954   if (pLmCmp(set[i].sig,p->sig) == currRing->OrdSgn) an=i;
     5322  if (pLtCmp(set[i].sig,p->sig) == currRing->OrdSgn) an=i;
    49555323  else                                      en=i;
    49565324  /*aend. fuer lazy == in !=- machen */
     
    50425410{
    50435411if (strat->syzl==0) return 0;
    5044 if (pLmCmp(strat->syz[strat->syzl-1],sig) != currRing->OrdSgn)
     5412if (pLtCmp(strat->syz[strat->syzl-1],sig) != currRing->OrdSgn)
    50455413  return strat->syzl;
    50465414int i;
     
    50515419  if (an >= en-1)
    50525420  {
    5053     if (pLmCmp(strat->syz[an],sig) != currRing->OrdSgn) return en;
     5421    if (pLtCmp(strat->syz[an],sig) != currRing->OrdSgn) return en;
    50545422    return an;
    50555423  }
    50565424  i=(an+en) / 2;
    5057   if (pLmCmp(strat->syz[i],sig) != currRing->OrdSgn) an=i;
     5425  if (pLtCmp(strat->syz[i],sig) != currRing->OrdSgn) an=i;
    50585426  else                                      en=i;
    50595427  /*aend. fuer lazy == in !=- machen */
     
    56856053    pWrite(pHead(strat->syz[k]));
    56866054#endif
    5687     if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing))
     6055    if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing)
     6056    #ifdef HAVE_RINGS
     6057    && (!rField_is_Ring(currRing) ||
     6058    (n_DivBy(pGetCoeff(sig), pGetCoeff(strat->syz[k]),currRing) && pLtCmp(sig,strat->syz[k]) == 1))
     6059    #endif
     6060    )
    56886061    {
    56896062//#if 1
     
    56916064      PrintS("DELETE!\n");
    56926065#endif
     6066      #if ADIDEBUG
     6067      printf("\nsyzCrit:\n");pWrite(strat->syz[k]);pWrite(sig);
     6068      #endif
     6069      strat->nrsyzcrit++;
    56936070      //printf("- T -\n\n");
    56946071      return TRUE;
     
    57346111      pWrite(pHead(strat->syz[k]));
    57356112#endif
    5736       if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing))
     6113      if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing)
     6114      #ifdef HAVE_RINGS
     6115      && (!rField_is_Ring(currRing) ||
     6116      (n_DivBy(pGetCoeff(sig), pGetCoeff(strat->syz[k]),currRing) && pLtCmp(sig,strat->syz[k]) == 1))
     6117    #endif     
     6118      )
     6119      {
     6120        #if ADIDEBUG
     6121        printf("\nsyzCrit:\n");pWrite(strat->syz[k]);pWrite(sig);
     6122        #endif
     6123        strat->nrsyzcrit++;
    57376124        return TRUE;
     6125      }
    57386126    }
    57396127    return FALSE;
     
    57466134BOOLEAN faugereRewCriterion(poly sig, unsigned long not_sevSig, poly /*lm*/, kStrategy strat, int start=0)
    57476135{
     6136  //return FALSE;
    57486137  //printf("Faugere Rewritten Criterion\n");
    57496138//#if 1
     
    57606149    pWrite(pHead(strat->S[k]));
    57616150#endif
    5762     if (p_LmShortDivisibleBy(strat->sig[k], strat->sevSig[k], sig, not_sevSig, currRing))
     6151    if (p_LmShortDivisibleBy(strat->sig[k], strat->sevSig[k], sig, not_sevSig, currRing)
     6152    #ifdef HAVE_RINGS
     6153    && (!rField_is_Ring(currRing) || n_DivBy(pGetCoeff(sig),pGetCoeff(strat->sig[k]),currRing))
     6154    #endif
     6155    )
    57636156    {
    57646157//#if 1
     
    57666159      PrintS("DELETE!\n");
    57676160#endif
     6161printf("\nFaugere RewCrit: * divisible by *\n");pWrite(sig);pWrite(strat->sig[k]);
    57686162      return TRUE;
    57696163    }
     
    58026196BOOLEAN arriRewCriterion(poly /*sig*/, unsigned long /*not_sevSig*/, poly /*lm*/, kStrategy strat, int start=0)
    58036197{
     6198  return FALSE;
    58046199  poly p1 = pOne();
    58056200  poly p2 = pOne();
    58066201  for (int ii=strat->sl; ii>start; ii--)
    58076202  {
    5808     if (p_LmShortDivisibleBy(strat->sig[ii], strat->sevSig[ii], strat->P.sig, ~strat->P.sevSig, currRing))
     6203    if (p_LmShortDivisibleBy(strat->sig[ii], strat->sevSig[ii], strat->P.sig, ~strat->P.sevSig, currRing)
     6204    #ifdef HAVE_RINGS
     6205    && (!(rField_is_Ring(currRing)) || n_DivBy(pGetCoeff(strat->P.sig),pGetCoeff(strat->sig[ii]),currRing))
     6206    #endif
     6207    )
    58096208    {
    58106209      p_ExpVectorSum(p1,strat->P.sig,strat->S[ii],currRing);
    58116210      p_ExpVectorSum(p2,strat->sig[ii],strat->P.p,currRing);
     6211      #ifdef HAVE_RINGS
     6212      if((rField_is_Ring(currRing) && !(pLtCmp(p1,p2) == 1))
     6213        || (!rField_is_Ring(currRing) && !(pLmCmp(p1,p2) == 1)))
     6214      #else
    58126215      if (!(pLmCmp(p1,p2) == 1))
    5813       {
     6216      #endif
     6217      {
     6218        #if ADIDEBUG
     6219        printf("\narriRewCrit deleted: sig, P.sig\n");
     6220       
     6221        #endif
    58146222        pDelete(&p1);
    58156223        pDelete(&p2);
     
    58256233BOOLEAN arriRewCriterionPre(poly sig, unsigned long not_sevSig, poly lm, kStrategy strat, int /*start=0*/)
    58266234{
     6235  #ifdef HAVE_RINGS
     6236  //Over Rings, there are still some changes to do: considering coeffs
     6237  if(rField_is_Ring(currRing))
     6238    return FALSE;
     6239  #endif
    58276240  int found = -1;
    58286241  for (int i=strat->Bl; i>-1; i--) {
    5829     if (pLmEqual(strat->B[i].sig,sig)) {
     6242    if (pLmEqual(strat->B[i].sig,sig)
     6243    #ifdef HAVE_RINGS
     6244    && (rField_is_Ring(currRing) && n_Equal(pGetCoeff(strat->B[i].sig),pGetCoeff(sig),currRing))
     6245    #endif
     6246    )
     6247    {
    58306248      found = i;
    58316249      break;
     
    67357153  if( strat->S[0] )
    67367154  {
    6737     if( strat->S[1] )
     7155    if( strat->S[1] && !rField_is_Ring(currRing))
    67387156    {
    67397157      omFreeSize(strat->syzIdx,(strat->syzidxmax)*sizeof(int));
     
    68027220        {
    68037221          Q.sig          = pOne();
     7222          #ifdef HAVE_RINGS
     7223          if(rField_is_Ring(currRing))
     7224            p_SetCoeff(Q.sig,nCopy(p_GetCoeff(strat->S[k],currRing)),currRing);
     7225          #endif
    68047226          p_ExpVectorCopy(Q.sig,strat->S[k],currRing);
    68057227          p_SetCompP (Q.sig, comp, currRing);
    68067228          poly q          = p_One(currRing);
     7229          #ifdef HAVE_RINGS
     7230          if(rField_is_Ring(currRing))
     7231            p_SetCoeff(q,nCopy(p_GetCoeff(strat->S[i],currRing)),currRing);
     7232          #endif
    68077233          p_ExpVectorCopy(q,strat->S[i],currRing);
    68087234          q               = p_Neg (q, currRing);
     
    68427268    {
    68437269      Q.sig          = pOne();
     7270      #ifdef HAVE_RINGS
     7271      if(rField_is_Ring(currRing))
     7272        p_SetCoeff(Q.sig,nCopy(p_GetCoeff(strat->S[k],currRing)),currRing);
     7273      #endif
    68447274      p_ExpVectorCopy(Q.sig,strat->S[k],currRing);
    68457275      p_SetCompP (Q.sig, comp, currRing);
    68467276      poly q          = p_One(currRing);
     7277      #ifdef HAVE_RINGS
     7278      if(rField_is_Ring(currRing))
     7279        p_SetCoeff(q,nCopy(p_GetCoeff(strat->L[strat->Ll].p,currRing)),currRing);
     7280      #endif
    68477281      p_ExpVectorCopy(q,strat->L[strat->Ll].p,currRing);
    68487282      q               = p_Neg (q, currRing);
     
    77208154  // appear due to the fact that the critical pairs are already sorted
    77218155  // by increasing signature.
     8156  // True. However, in the case of integers we need to put the element
     8157  // that caused the signature drop on the first position
    77228158  if (atS <= strat->sl)
    77238159  {
     
    77268162    memmove(&(strat->S[atS+1]), &(strat->S[atS]),
    77278163            (strat->sl - atS + 1)*sizeof(poly));
     8164    memmove(&(strat->sig[atS+1]), &(strat->sig[atS]),
     8165            (strat->sl - atS + 1)*sizeof(poly));
     8166    memmove(&(strat->sevSig[atS+1]), &(strat->sevSig[atS]),
     8167            (strat->sl - atS + 1)*sizeof(unsigned long));
    77288168    memmove(&(strat->ecartS[atS+1]), &(strat->ecartS[atS]),
    77298169            (strat->sl - atS + 1)*sizeof(int));
     
    77458185      strat->sevS[i] = strat->sevS[i-1];
    77468186      strat->S_2_R[i] = strat->S_2_R[i-1];
     8187      strat->sig[i] = strat->sig[i-1];
     8188      strat->sevSig[i] = strat->sevSig[i-1];
    77478189    }
    77488190    if (strat->lenS!=NULL)
     
    78698311  #if ADIDEBUG
    78708312  printf("\nenterT: add in position %i\n",atT);
    7871   pWrite(p.p);
     8313  pWrite(p.p);pWrite(p.sig);
    78728314  #endif
    78738315  //printf("\nenterT: neue hingefÃŒgt: lÀnge = %i, ecart = %i\n",p.length,p.ecart);
     
    80038445void enterSyz(LObject &p, kStrategy strat, int atT)
    80048446{
     8447  #if ADIDEBUG
     8448  printf("\n  Entersyz:\n");pWrite(p.sig);
     8449  #endif
    80058450  int i;
    80068451  strat->newt = TRUE;
     
    80328477  //i = strat->syzl;
    80338478  i = atT;
     8479  //Makes sure the syz saves just the signature
     8480  #ifdef HAVE_RINGS
     8481  if(rField_is_Ring(currRing))
     8482    pNext(p.sig) = NULL;
     8483  #endif
    80348484  strat->syz[atT] = p.sig;
    80358485  strat->sevSyz[atT] = p.sevSig;
     
    80438493  while (cc>-1)
    80448494  {
     8495    //printf("\nCheck if syz is div by L\n");pWrite(strat->syz[atT]);pWrite(strat->L[cc].sig);
     8496    //printf("\npLmShDivBy(syz,L) = %i\nn_DivBy(L,syz) = %i\n pLtCmp(L,syz) = %i",p_LmShortDivisibleBy( strat->syz[atT], strat->sevSyz[atT],strat->L[cc].sig, ~strat->L[cc].sevSig, currRing), n_DivBy(pGetCoeff(strat->L[cc].sig),pGetCoeff(strat->syz[atT]),currRing), pLtCmp(strat->L[cc].sig,strat->syz[atT])==1);
    80458497    if (p_LmShortDivisibleBy( strat->syz[atT], strat->sevSyz[atT],
    8046                               strat->L[cc].sig, ~strat->L[cc].sevSig, currRing))
    8047     {
     8498                              strat->L[cc].sig, ~strat->L[cc].sevSig, currRing)
     8499                              #ifdef HAVE_RINGS
     8500                              &&(rField_is_Ring(currRing))
     8501                              && n_DivBy(pGetCoeff(strat->L[cc].sig),pGetCoeff(strat->syz[atT]),currRing) && (pLtCmp(strat->L[cc].sig,strat->syz[atT])==1)
     8502                              #endif
     8503                              )
     8504    {
     8505      //printf("\nYES!\n");
     8506      #if ADIDEBUG
     8507      printf("\n syzCrit deleted!\n");pWrite(strat->L[cc].p);pWrite(strat->L[cc].sig);
     8508      #endif
    80488509      deleteInL(strat->L,&strat->Ll,cc,strat);
    80498510    }
     
    85919052    else
    85929053    {
    8593       /*Shdl=*/initSLSba(F, Q,strat); /*sets also S, ecartS, fromQ */
    8594       // /*Shdl=*/initS(F, Q,strat); /*sets also S, ecartS, fromQ */
     9054      initSLSba(F, Q,strat); /*sets also S, ecartS, fromQ */
    85959055    }
    85969056  }
     
    86189078  omFreeSize((ADDRESS)strat->sevS,IDELEMS(strat->Shdl)*sizeof(unsigned long));
    86199079  omFreeSize((ADDRESS)strat->sevSig,IDELEMS(strat->Shdl)*sizeof(unsigned long));
    8620   omFreeSize((ADDRESS)strat->syz,(strat->syzmax)*sizeof(poly));
    8621   omFreeSize((ADDRESS)strat->sevSyz,(strat->syzmax)*sizeof(unsigned long));
    8622   if (strat->sbaOrder == 1)
    8623   {
    8624     omFreeSize(strat->syzIdx,(strat->syzidxmax)*sizeof(int));
     9080  if(strat->syzmax>0)
     9081  {
     9082    omFreeSize((ADDRESS)strat->syz,(strat->syzmax)*sizeof(poly));
     9083    omFreeSize((ADDRESS)strat->sevSyz,(strat->syzmax)*sizeof(unsigned long));
     9084    if (strat->sbaOrder == 1)
     9085    {
     9086      omFreeSize(strat->syzIdx,(strat->syzidxmax)*sizeof(int));
     9087    }
    86259088  }
    86269089  omFreeSize(strat->S_2_R,IDELEMS(strat->Shdl)*sizeof(int));
     
    92389701        if(pLmDivisibleBy(strat->S[i], p))
    92399702        {
     9703          number dummy = n_IntMod(p->coef, strat->S[i]->coef, currRing->cf);
     9704          p_SetCoeff(p,dummy,currRing);
     9705        }
     9706        if(nIsZero(p->coef))
     9707        {
     9708          pLmDelete(&p);
     9709          deleted = TRUE;
     9710        }
     9711        else
     9712        {
     9713          ok = TRUE;
     9714        }
     9715      }
     9716      pp = pNext(p);
     9717      while(pp != NULL)
     9718      {
     9719        if(pLmDivisibleBy(strat->S[i], pp))
     9720        {
     9721          number dummy = n_IntMod(pp->coef, strat->S[i]->coef, currRing->cf);
     9722          p_SetCoeff(pp,dummy,currRing);
     9723          if(nIsZero(pp->coef))
     9724          {
     9725            pLmDelete(&pNext(p));
     9726            pp = pNext(p);
     9727            deleted = TRUE;
     9728          }
     9729          else
     9730          {
     9731            p = pp;
     9732            pp = pNext(p);
     9733          }
     9734        }
     9735        else
     9736        {
     9737          p = pp;
     9738          pp = pNext(p);
     9739        }
     9740      }
     9741    }
     9742  }
     9743  h->SetLmCurrRing();
     9744  if(deleted)
     9745    strat->initEcart(h);
     9746}
     9747
     9748void postReduceByMonSig(LObject* h, kStrategy strat)
     9749{
     9750  if(!nCoeff_is_Ring_Z(currRing->cf))
     9751      return;
     9752  printf("\npostreducebymon\n");
     9753  poly hSig = h->sig;
     9754  poly pH = h->GetP();
     9755  poly p,pp;
     9756  p = pH;
     9757  bool deleted = FALSE, ok = FALSE;
     9758  for(int i = 0; i<=strat->sl; i++)
     9759  {
     9760    p = pH;
     9761    if(pNext(strat->S[i]) == NULL)
     9762    {
     9763      printf("\n------------------\n");
     9764      pWrite(p);
     9765      pWrite(strat->S[i]);
     9766      while(ok == FALSE)
     9767      {
     9768        if(pLmDivisibleBy(strat->S[i], p))
     9769        {
     9770          poly dum = pDivideM(pHead(p),pHead(strat->S[i]));
     9771          pWrite(dum);getchar();
    92409772          number dummy = n_IntMod(p->coef, strat->S[i]->coef, currRing->cf);
    92419773          p_SetCoeff(p,dummy,currRing);
  • kernel/GBEngine/kutil.h

    r1c1d660 rff38ee  
    355355  int newIdeal;
    356356  int minim;
     357  #ifdef HAVE_RINGS
     358  bool sigdrop; //This is used to check sigdrop in sba over Z
     359  int nrsyzcrit; // counts how many pairs are deleted by SyzCrit
     360  int sbaEnterS; // sba over Z strategy: if sigdrop element has _*gen(sbaEnterS+1), then
     361                 // add directly sbaEnterS elements into S
     362  #endif
    357363  #ifdef HAVE_SHIFTBBA
    358364  int lV;
     
    485491void enterExtendedSpoly(poly h,kStrategy strat);
    486492void superenterpairs (poly h,int k,int ecart,int pos,kStrategy strat, int atR = -1);
     493void superenterpairsSig (poly h,poly hSig,int hFrom,int k,int ecart,int pos,kStrategy strat, int atR = -1);
    487494poly kCreateZeroPoly(long exp[], long cabsind, poly* t_p, ring leadRing, ring tailRing);
    488495long ind2(long arg);
     
    501508void pairs ();
    502509BOOLEAN enterOneStrongPoly (int i,poly p,int /*ecart*/, int /*isFromQ*/,kStrategy strat, int atR = -1, bool enterTstrong = FALSE);
     510BOOLEAN enterOneStrongPolySig (int i,poly p,poly sig,int /*ecart*/, int /*isFromQ*/,kStrategy strat, int atR = -1);
    503511void message (int i,int* reduc,int* olddeg,kStrategy strat,int red_result);
    504512void messageStat (int hilbcount,kStrategy strat);
     
    740748poly preIntegerCheck(ideal F, ideal Q);
    741749void postReduceByMon(LObject* h, kStrategy strat);
     750void postReduceByMonSig(LObject* h, kStrategy strat);
    742751void finalReduceByMon(kStrategy strat);
    743752#endif
  • kernel/GBEngine/syz.cc

    r978a8c rff38ee  
    865865      {
    866866        if ((pGetComp(res[i]->m[j])>l)
    867         || ((i>1) && (res[i-1]->m[pGetComp(res[i]->m[j])-1]==NULL)))
     867        // usual resolutions do not the following, but artifulal built may: (tr. #763)
     868        //|| ((i>1) && (res[i-1]->m[pGetComp(res[i]->m[j])-1]==NULL))
     869        )
    868870        {
    869871          WerrorS("input not a resolvent");
Note: See TracChangeset for help on using the changeset viewer.