Changeset c66a53 in git for kernel


Ignore:
Timestamp:
Jul 16, 2016, 9:42:28 AM (8 years ago)
Author:
Adi Popescu <adi_popescum@…>
Branches:
(u'spielwiese', '4a9821a93ffdc22a6696668bd4f6b8c9de3e6c5f')
Children:
b6f42a8c2492312d1dd4f0c4c917fcf054636416
Parents:
1798a00a38186e92d8d8d6dc786ccdf6aad508cd34183abab486cee38d70559e5cdcfbc307938f64
Message:
Merge branch 'spielwiese' of github.com:Singular/Sources into SigDrop
Location:
kernel
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • kernel/GBEngine/f5gb.cc

    r1798a0 rc66a53  
    2929#include <kernel/GBEngine/f5data.h>
    3030#include <kernel/GBEngine/f5lists.h>
     31#include <kernel/oswrapper/timer.h>
     32
     33#define pDeg(A) p_Deg(A,currRing)
     34
    3135int notInG              =   0;
    3236int numberOfRules       =   0;
     
    4953====================================================================
    5054*/
    51 void qsortDegree(poly* left, poly* right) {
     55void qsortDegree(poly* left, poly* right)
     56{
    5257    poly* ptr1 = left;
    5358    poly* ptr2 = right;
    5459    poly p1,p2;
    5560    p2 = *(left + (right - left >> 1));
    56     do {
    57             while(pTotaldegree(*ptr1, currRing) < pTotaldegree(p2, currRing)) {
     61    do
     62    {
     63            while(p_Totaldegree(*ptr1, currRing) < p_Totaldegree(p2, currRing))
     64            {
    5865                    ptr1++;
    5966            }
    60             while(pTotaldegree(*ptr2, currRing) > pTotaldegree(p2,currRing)) {
     67            while(p_Totaldegree(*ptr2, currRing) > p_Totaldegree(p2,currRing))
     68            {
    6169                    ptr2--;
    6270            }
    63             if(ptr1 > ptr2) {
     71            if(ptr1 > ptr2)
     72            {
    6473                    break;
    6574            }
     
    6978    } while(++ptr1 <= --ptr2);
    7079
    71     if(left < ptr2) {
     80    if(left < ptr2)
     81    {
    7282            qsortDegree(left,ptr2);
    7383    }
    74     if(ptr1 < right) {
     84    if(ptr1 < right)
     85    {
    7586            qsortDegree(ptr1,right);
    7687    }
  • kernel/GBEngine/kspoly.cc

    r34183a rc66a53  
    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    if(rField_is_Ring(currRing))
     246    {
     247      pSetCoeff(sigMult,nMult(nDiv(pGetCoeff(PR->p),pGetCoeff(PW->p)), pGetCoeff(sigMult)));
     248    }
    237249//#if 1
    238250#ifdef DEBUGF5
     
    244256    printf("--------------\n");
    245257#endif
    246     int sigSafe = p_LmCmp(PR->sig,sigMult,currRing);
     258    int sigSafe;
     259    if(!rField_is_Ring(currRing))
     260      sigSafe = p_LmCmp(PR->sig,sigMult,currRing);
    247261    // now we can delete the copied polynomial data used for checking for
    248262    // sig-safeness of the reduction step
     
    252266
    253267#endif
     268    if(rField_is_Ring(currRing))
     269    {
     270      // Set the sig
     271      poly origsig = pCopy(PR->sig);
     272      PR->sig = pHead(pSub(PR->sig, sigMult));
     273      //The sigs have the same lm, have to substract
     274      //It may happen that now the signature is 0 (drop)
     275      if(PR->sig == NULL)
     276      {
     277        #if ADIDEBUG
     278        printf("\nPossible sigdrop in ksreducepolysig (lost signature)\n");
     279        #endif
     280        strat->sigdrop=TRUE;
     281      }
     282      else
     283      {
     284        if(pLtCmp(PR->sig,origsig) == 1)
     285        {
     286          // do not allow this reduction - it will increase it's signature
     287          // and the partially standard basis is just till the old sig, not the new one
     288          PR->is_redundant = TRUE;
     289          pDelete(&PR->sig);
     290          PR->sig = origsig;
     291          strat->blockred++;
     292          return 3;
     293        }
     294        if(pLtCmp(PR->sig,origsig) == -1)
     295        {
     296          #if ADIDEBUG
     297          printf("\nSigdrop in ksreducepolysig from * to *\n");pWrite(origsig);pWrite(PR->sig);
     298          #endif
     299          strat->sigdrop=TRUE;
     300        }
     301      }
     302      pDelete(&origsig);
     303    }
    254304    //pDelete(&f1);
    255     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;
     
    324373    }
    325374  }
    326 
    327375  // take care of coef buisness
    328   if (! n_IsOne(pGetCoeff(p2), tailRing))
    329   {
    330     number bn = pGetCoeff(lm);
    331     number an = pGetCoeff(p2);
    332     int ct = ksCheckCoeff(&an, &bn, tailRing->cf);    // Calculate special LC
    333     p_SetCoeff(lm, bn, tailRing);
    334     if ((ct == 0) || (ct == 2))
    335       PR->Tail_Mult_nn(an);
    336     if (coef != NULL) *coef = an;
    337     else n_Delete(&an, tailRing);
     376  if(rField_is_Ring(currRing))
     377  {
     378    p_SetCoeff(lm, nDiv(pGetCoeff(lm),pGetCoeff(p2)), tailRing);
     379    if (coef != NULL) *coef = n_Init(1, tailRing);
    338380  }
    339381  else
    340382  {
    341     if (coef != NULL) *coef = n_Init(1, tailRing);
    342   }
    343 
     383    if (! n_IsOne(pGetCoeff(p2), tailRing))
     384    {
     385      number bn = pGetCoeff(lm);
     386      number an = pGetCoeff(p2);
     387      int ct = ksCheckCoeff(&an, &bn, tailRing->cf);    // Calculate special LC
     388      p_SetCoeff(lm, bn, tailRing);
     389      if (((ct == 0) || (ct == 2)))
     390        PR->Tail_Mult_nn(an);
     391      if (coef != NULL) *coef = an;
     392      else n_Delete(&an, tailRing);
     393    }
     394    else
     395    {
     396      if (coef != NULL) *coef = n_Init(1, tailRing);
     397    }
     398  }
    344399
    345400  // and finally,
     
    361416  }
    362417#endif
    363 
    364418#if defined(KDEBUG) && defined(TEST_OPT_DEBUG_RED)
    365419  if (TEST_OPT_DEBUG)
  • kernel/GBEngine/kstd1.cc

    r34183a rc66a53  
    15081508    strat->red2 = redHomog;
    15091509  }
    1510 #if defined(HAVE_RINGS)
    15111510  if (rField_is_Ring(currRing))
    15121511  {
    15131512    if(rHasLocalOrMixedOrdering(currRing))
    1514       {strat->red = redRiloc;}
     1513      {strat->red2 = redRiloc;}
    15151514    else
    15161515      {strat->red2 = redRing;}
    15171516  }
    1518 #endif
    15191517  if (currRing->pLexOrder && strat->honey)
    15201518    strat->initEcart = initEcartNormal;
     
    24522450          int newIdeal, intvec *vw)
    24532451{
    2454   if(idIs0(F))
    2455     return idInit(1,F->rank);
    2456 
    2457   ideal r;
    2458   BOOLEAN b=currRing->pLexOrder,toReset=FALSE;
    2459   BOOLEAN delete_w=(w==NULL);
    2460   kStrategy strat=new skStrategy;
    2461   strat->sbaOrder = sbaOrder;
    2462   if (arri!=0)
    2463   {
    2464     strat->rewCrit1 = arriRewDummy;
    2465     strat->rewCrit2 = arriRewCriterion;
    2466     strat->rewCrit3 = arriRewCriterionPre;
     2452  if(!rField_is_Ring(currRing))
     2453  {
     2454    if(idIs0(F))
     2455      return idInit(1,F->rank);
     2456
     2457    ideal r;
     2458    BOOLEAN b=currRing->pLexOrder,toReset=FALSE;
     2459    BOOLEAN delete_w=(w==NULL);
     2460    kStrategy strat=new skStrategy;
     2461    strat->sbaOrder = sbaOrder;
     2462    if (arri!=0)
     2463    {
     2464      strat->rewCrit1 = arriRewDummy;
     2465      strat->rewCrit2 = arriRewCriterion;
     2466      strat->rewCrit3 = arriRewCriterionPre;
     2467    }
     2468    else
     2469    {
     2470      strat->rewCrit1 = faugereRewCriterion;
     2471      strat->rewCrit2 = faugereRewCriterion;
     2472      strat->rewCrit3 = faugereRewCriterion;
     2473    }
     2474
     2475    if(!TEST_OPT_RETURN_SB)
     2476      strat->syzComp = syzComp;
     2477    if (TEST_OPT_SB_1)
     2478      if(!rField_is_Ring(currRing))
     2479        strat->newIdeal = newIdeal;
     2480    if (rField_has_simple_inverse(currRing))
     2481      strat->LazyPass=20;
     2482    else
     2483      strat->LazyPass=2;
     2484    strat->LazyDegree = 1;
     2485    strat->enterOnePair=enterOnePairNormal;
     2486    strat->chainCrit=chainCritNormal;
     2487    if (TEST_OPT_SB_1) strat->chainCrit=chainCritOpt_1;
     2488    strat->ak = id_RankFreeModule(F,currRing);
     2489    strat->kModW=kModW=NULL;
     2490    strat->kHomW=kHomW=NULL;
     2491    if (vw != NULL)
     2492    {
     2493      currRing->pLexOrder=FALSE;
     2494      strat->kHomW=kHomW=vw;
     2495      strat->pOrigFDeg = currRing->pFDeg;
     2496      strat->pOrigLDeg = currRing->pLDeg;
     2497      pSetDegProcs(currRing,kHomModDeg);
     2498      toReset = TRUE;
     2499    }
     2500    if (h==testHomog)
     2501    {
     2502      if (strat->ak == 0)
     2503      {
     2504        h = (tHomog)idHomIdeal(F,Q);
     2505        w=NULL;
     2506      }
     2507      else if (!TEST_OPT_DEGBOUND)
     2508      {
     2509        h = (tHomog)idHomModule(F,Q,w);
     2510      }
     2511    }
     2512    currRing->pLexOrder=b;
     2513    if (h==isHomog)
     2514    {
     2515      if (strat->ak > 0 && (w!=NULL) && (*w!=NULL))
     2516      {
     2517        strat->kModW = kModW = *w;
     2518        if (vw == NULL)
     2519        {
     2520          strat->pOrigFDeg = currRing->pFDeg;
     2521          strat->pOrigLDeg = currRing->pLDeg;
     2522          pSetDegProcs(currRing,kModDeg);
     2523          toReset = TRUE;
     2524        }
     2525      }
     2526      currRing->pLexOrder = TRUE;
     2527      if (hilb==NULL) strat->LazyPass*=2;
     2528    }
     2529    strat->homog=h;
     2530  #ifdef KDEBUG
     2531    idTest(F);
     2532    if(Q != NULL)
     2533      idTest(Q);
     2534  #endif
     2535  #ifdef HAVE_PLURAL
     2536    if (rIsPluralRing(currRing))
     2537    {
     2538      const BOOLEAN bIsSCA  = rIsSCA(currRing) && strat->z2homog; // for Z_2 prod-crit
     2539      strat->no_prod_crit   = ! bIsSCA;
     2540      if (w!=NULL)
     2541        r = nc_GB(F, Q, *w, hilb, strat, currRing);
     2542      else
     2543        r = nc_GB(F, Q, NULL, hilb, strat, currRing);
     2544    }
     2545    else
     2546  #endif
     2547    {
     2548      if (rHasLocalOrMixedOrdering(currRing))
     2549      {
     2550        if (w!=NULL)
     2551          r=mora(F,Q,*w,hilb,strat);
     2552        else
     2553          r=mora(F,Q,NULL,hilb,strat);
     2554      }
     2555      else
     2556      {
     2557        if (w!=NULL)
     2558          r=sba(F,Q,*w,hilb,strat);
     2559        else
     2560          r=sba(F,Q,NULL,hilb,strat);
     2561      }
     2562    }
     2563  #ifdef KDEBUG
     2564    idTest(r);
     2565  #endif
     2566    if (toReset)
     2567    {
     2568      kModW = NULL;
     2569      pRestoreDegProcs(currRing,strat->pOrigFDeg, strat->pOrigLDeg);
     2570    }
     2571    currRing->pLexOrder = b;
     2572  //Print("%d reductions canceled \n",strat->cel);
     2573    HCord=strat->HCord;
     2574    //delete(strat);
     2575    if ((delete_w)&&(w!=NULL)&&(*w!=NULL)) delete *w;
     2576    return r;
    24672577  }
    24682578  else
    24692579  {
    2470     strat->rewCrit1 = faugereRewCriterion;
    2471     strat->rewCrit2 = faugereRewCriterion;
    2472     strat->rewCrit3 = faugereRewCriterion;
    2473   }
    2474 
    2475   if(!TEST_OPT_RETURN_SB)
    2476     strat->syzComp = syzComp;
    2477   if (TEST_OPT_SB_1)
    2478     if(!rField_is_Ring(currRing))
    2479       strat->newIdeal = newIdeal;
    2480   if (rField_has_simple_inverse(currRing))
    2481     strat->LazyPass=20;
    2482   else
    2483     strat->LazyPass=2;
    2484   strat->LazyDegree = 1;
    2485   strat->enterOnePair=enterOnePairNormal;
    2486   strat->chainCrit=chainCritNormal;
    2487   if (TEST_OPT_SB_1) strat->chainCrit=chainCritOpt_1;
    2488   strat->ak = id_RankFreeModule(F,currRing);
    2489   strat->kModW=kModW=NULL;
    2490   strat->kHomW=kHomW=NULL;
    2491   if (vw != NULL)
    2492   {
    2493     currRing->pLexOrder=FALSE;
    2494     strat->kHomW=kHomW=vw;
    2495     strat->pOrigFDeg = currRing->pFDeg;
    2496     strat->pOrigLDeg = currRing->pLDeg;
    2497     pSetDegProcs(currRing,kHomModDeg);
    2498     toReset = TRUE;
    2499   }
    2500   if (h==testHomog)
    2501   {
    2502     if (strat->ak == 0)
    2503     {
    2504       h = (tHomog)idHomIdeal(F,Q);
    2505       w=NULL;
    2506     }
    2507     else if (!TEST_OPT_DEGBOUND)
    2508     {
    2509       h = (tHomog)idHomModule(F,Q,w);
    2510     }
    2511   }
    2512   currRing->pLexOrder=b;
    2513   if (h==isHomog)
    2514   {
    2515     if (strat->ak > 0 && (w!=NULL) && (*w!=NULL))
    2516     {
    2517       strat->kModW = kModW = *w;
    2518       if (vw == NULL)
    2519       {
     2580    //--------------------------RING CASE-------------------------
     2581    if(idIs0(F))
     2582      return idInit(1,F->rank);
     2583    ideal r;
     2584    r = idCopy(F);
     2585    int sbaEnterS = -1;
     2586    bool sigdrop = TRUE;
     2587    #if ADIDEBUG
     2588    printf("\nEnter the nice kSba loop\n");
     2589    #endif
     2590    //This is how we set the SBA algorithm;
     2591    int totalsbaruns = 1,blockedreductions = 10,blockred = 0,loops = 0;
     2592    while(sigdrop && (loops < totalsbaruns || totalsbaruns == -1)
     2593                  && (blockred <= blockedreductions))
     2594    {
     2595      loops++;
     2596      if(loops == 1)
     2597        sigdrop = FALSE;
     2598      BOOLEAN b=currRing->pLexOrder,toReset=FALSE;
     2599      BOOLEAN delete_w=(w==NULL);
     2600      kStrategy strat=new skStrategy;
     2601      strat->sbaEnterS = sbaEnterS;
     2602      strat->sigdrop = sigdrop;
     2603      #if 0
     2604      strat->blockred = blockred;
     2605      #else
     2606      strat->blockred = 0;
     2607      #endif
     2608      strat->blockredmax = blockedreductions;
     2609      //printf("\nsbaEnterS beginning = %i\n",strat->sbaEnterS);
     2610      //printf("\nsigdrop beginning = %i\n",strat->sigdrop);
     2611      strat->sbaOrder = sbaOrder;
     2612      if (arri!=0)
     2613      {
     2614        strat->rewCrit1 = arriRewDummy;
     2615        strat->rewCrit2 = arriRewCriterion;
     2616        strat->rewCrit3 = arriRewCriterionPre;
     2617      }
     2618      else
     2619      {
     2620        strat->rewCrit1 = faugereRewCriterion;
     2621        strat->rewCrit2 = faugereRewCriterion;
     2622        strat->rewCrit3 = faugereRewCriterion;
     2623      }
     2624
     2625      if(!TEST_OPT_RETURN_SB)
     2626        strat->syzComp = syzComp;
     2627      if (TEST_OPT_SB_1)
     2628        if(!rField_is_Ring(currRing))
     2629          strat->newIdeal = newIdeal;
     2630      if (rField_has_simple_inverse(currRing))
     2631        strat->LazyPass=20;
     2632      else
     2633        strat->LazyPass=2;
     2634      strat->LazyDegree = 1;
     2635      strat->enterOnePair=enterOnePairNormal;
     2636      strat->chainCrit=chainCritNormal;
     2637      if (TEST_OPT_SB_1) strat->chainCrit=chainCritOpt_1;
     2638      strat->ak = id_RankFreeModule(F,currRing);
     2639      strat->kModW=kModW=NULL;
     2640      strat->kHomW=kHomW=NULL;
     2641      if (vw != NULL)
     2642      {
     2643        currRing->pLexOrder=FALSE;
     2644        strat->kHomW=kHomW=vw;
    25202645        strat->pOrigFDeg = currRing->pFDeg;
    25212646        strat->pOrigLDeg = currRing->pLDeg;
    2522         pSetDegProcs(currRing,kModDeg);
     2647        pSetDegProcs(currRing,kHomModDeg);
    25232648        toReset = TRUE;
    25242649      }
    2525     }
    2526     currRing->pLexOrder = TRUE;
    2527     if (hilb==NULL) strat->LazyPass*=2;
    2528   }
    2529   strat->homog=h;
    2530 #ifdef KDEBUG
    2531   idTest(F);
    2532   idTest(Q);
    2533 #endif
    2534 #ifdef HAVE_PLURAL
    2535   if (rIsPluralRing(currRing))
    2536   {
    2537     const BOOLEAN bIsSCA  = rIsSCA(currRing) && strat->z2homog; // for Z_2 prod-crit
    2538     strat->no_prod_crit   = ! bIsSCA;
    2539     if (w!=NULL)
    2540       r = nc_GB(F, Q, *w, hilb, strat, currRing);
    2541     else
    2542       r = nc_GB(F, Q, NULL, hilb, strat, currRing);
    2543   }
    2544   else
    2545 #endif
    2546   if (rField_is_Ring(currRing))
    2547     r=bba(F,Q,NULL,hilb,strat);
    2548   else
    2549   {
    2550     if (rHasLocalOrMixedOrdering(currRing))
    2551     {
    2552       if (w!=NULL)
    2553         r=mora(F,Q,*w,hilb,strat);
     2650      if (h==testHomog)
     2651      {
     2652        if (strat->ak == 0)
     2653        {
     2654          h = (tHomog)idHomIdeal(F,Q);
     2655          w=NULL;
     2656        }
     2657        else if (!TEST_OPT_DEGBOUND)
     2658        {
     2659          h = (tHomog)idHomModule(F,Q,w);
     2660        }
     2661      }
     2662      currRing->pLexOrder=b;
     2663      if (h==isHomog)
     2664      {
     2665        if (strat->ak > 0 && (w!=NULL) && (*w!=NULL))
     2666        {
     2667          strat->kModW = kModW = *w;
     2668          if (vw == NULL)
     2669          {
     2670            strat->pOrigFDeg = currRing->pFDeg;
     2671            strat->pOrigLDeg = currRing->pLDeg;
     2672            pSetDegProcs(currRing,kModDeg);
     2673            toReset = TRUE;
     2674          }
     2675        }
     2676        currRing->pLexOrder = TRUE;
     2677        if (hilb==NULL) strat->LazyPass*=2;
     2678      }
     2679      strat->homog=h;
     2680    #ifdef KDEBUG
     2681      idTest(F);
     2682      if(Q != NULL)
     2683        idTest(Q);
     2684    #endif
     2685    #ifdef HAVE_PLURAL
     2686      if (rIsPluralRing(currRing))
     2687      {
     2688        const BOOLEAN bIsSCA  = rIsSCA(currRing) && strat->z2homog; // for Z_2 prod-crit
     2689        strat->no_prod_crit   = ! bIsSCA;
     2690        if (w!=NULL)
     2691          r = nc_GB(F, Q, *w, hilb, strat, currRing);
     2692        else
     2693          r = nc_GB(F, Q, NULL, hilb, strat, currRing);
     2694      }
    25542695      else
    2555         r=mora(F,Q,NULL,hilb,strat);
    2556     }
    2557     else
    2558     {
    2559       if (w!=NULL)
    2560         r=sba(F,Q,*w,hilb,strat);
    2561       else
    2562         r=sba(F,Q,NULL,hilb,strat);
    2563     }
    2564   }
    2565 #ifdef KDEBUG
    2566   idTest(r);
    2567 #endif
    2568   if (toReset)
    2569   {
    2570     kModW = NULL;
    2571     pRestoreDegProcs(currRing,strat->pOrigFDeg, strat->pOrigLDeg);
    2572   }
    2573   currRing->pLexOrder = b;
    2574 //Print("%d reductions canceled \n",strat->cel);
    2575   HCord=strat->HCord;
    2576   delete(strat);
    2577   if ((delete_w)&&(w!=NULL)&&(*w!=NULL)) delete *w;
    2578   return r;
     2696    #endif
     2697      {
     2698        if (rHasLocalOrMixedOrdering(currRing))
     2699        {
     2700          if (w!=NULL)
     2701            r=mora(F,Q,*w,hilb,strat);
     2702          else
     2703            r=mora(F,Q,NULL,hilb,strat);
     2704        }
     2705        else
     2706        {
     2707          if (w!=NULL)
     2708            r=sba(r,Q,*w,hilb,strat);
     2709          else
     2710          {
     2711            r=sba(r,Q,NULL,hilb,strat);
     2712          }
     2713          #if ADIDEBUG
     2714          printf("\nSBA Run %i: %i elements (syzCrit = %i,rewCrit = %i)\n",loops,IDELEMS(r),strat->nrsyzcrit,strat->nrrewcrit);
     2715          idPrint(r);
     2716          getchar();
     2717          #endif
     2718        }
     2719      }
     2720    #ifdef KDEBUG
     2721      idTest(r);
     2722    #endif
     2723      if (toReset)
     2724      {
     2725        kModW = NULL;
     2726        pRestoreDegProcs(currRing,strat->pOrigFDeg, strat->pOrigLDeg);
     2727      }
     2728      currRing->pLexOrder = b;
     2729    //Print("%d reductions canceled \n",strat->cel);
     2730      HCord=strat->HCord;
     2731      sigdrop = strat->sigdrop;
     2732      sbaEnterS = strat->sbaEnterS;
     2733      blockred = strat->blockred;
     2734      #if ADIDEBUG
     2735      printf("\nsbaEnterS = %i\n",sbaEnterS);
     2736      #endif
     2737      delete(strat);
     2738      if ((delete_w)&&(w!=NULL)&&(*w!=NULL)) delete *w;
     2739    }
     2740    // Go to std
     2741    if(sigdrop || blockred > blockedreductions)
     2742    {
     2743      #if ADIDEBUG
     2744      printf("\nWent to std\n");
     2745      //idPrint(r);
     2746      //getchar();
     2747      #endif
     2748      r = kStd(r, Q, h, w, hilb, syzComp, newIdeal, vw);
     2749    }
     2750    return r;
     2751  }
    25792752}
    25802753
  • kernel/GBEngine/kstd2.cc

    r34183a rc66a53  
    88// #define PDEBUG 2
    99
    10 
    11 
    12 
    13 
    1410#include <kernel/mod2.h>
    1511
    1612#define ADIDEBUG 0
    1713#define ADIDEBUG_COUNT 0
     14#define GCD_SBA 1
    1815
    1916// define if no buckets should be used
     
    104101    pAssume(~not_sev == p_GetShortExpVector(p, r));
    105102
    106 #ifdef HAVE_RINGS
    107103    if(rField_is_Ring(r))
    108104    {
     
    147143      }
    148144    }
    149 #endif
    150145  }
    151146  else
     
    153148    const poly p=L->t_p;
    154149    const ring r=strat->tailRing;
    155 #ifdef HAVE_RINGS
    156150    if(rField_is_Ring(r))
    157151    {
     
    178172    }
    179173    else
    180 #endif
    181174    {
    182175      loop
     
    483476      }
    484477    }
     478    //printf("\nFound one: ");pWrite(strat->T[j].p);
    485479    //enterT(*h, strat);
    486480    ksReducePoly(h, &(strat->T[j]), NULL, NULL, strat); // with debug output
    487 
     481    //printf("\nAfter small red: ");pWrite(h->p);
    488482    if (h->GetLmTailRing() == NULL)
    489483    {
     
    668662}
    669663
    670 KINLINE int ksReducePolyTailSig(LObject* PR, TObject* PW, LObject* Red)
     664KINLINE int ksReducePolyTailSig(LObject* PR, TObject* PW, LObject* Red, kStrategy strat)
    671665{
    672666  BOOLEAN ret;
    673667  number coef;
    674 
    675668  assume(PR->GetLmCurrRing() != PW->GetLmCurrRing());
    676   Red->HeadNormalize();
     669  if(!rField_is_Ring(currRing))
     670    Red->HeadNormalize();
    677671  /*
    678672  printf("------------------------\n");
    679673  pWrite(Red->GetLmCurrRing());
    680674  */
    681   ret = ksReducePolySig(Red, PW, 1, NULL, &coef);
    682 
    683 
     675  ret = ksReducePolySig(Red, PW, 1, NULL, &coef, strat);
    684676  if (!ret)
    685677  {
    686     if (! n_IsOne(coef, currRing->cf))
     678    if (! n_IsOne(coef, currRing->cf) && !rField_is_Ring(currRing))
    687679    {
    688680      PR->Mult_nn(coef);
     
    706698int redSig (LObject* h,kStrategy strat)
    707699{
     700  //Since reduce is really bad for SBA we use the following idea:
     701  // We first check if we can build a gcd pair between h and S
     702  //where the sig remains the same and replace h by this gcd poly
     703  #if GCD_SBA
     704  #if ADIDEBUG
     705  printf("\nBefore sbaCheckGcdPair ");pWrite(h->p);
     706  #endif
     707  //sbaCheckGcdPair(h,strat);
     708  while(sbaCheckGcdPair(h,strat))
     709  {
     710    #if ADIDEBUG
     711    printf("\nIntermidiate sbaCheckGcdPair ");pWrite(h->p);
     712    #endif
     713    h->sev = pGetShortExpVector(h->p);
     714  }
     715  #if ADIDEBUG
     716  printf("\nAfter sbaCheckGcdPair ");pWrite(h->p);
     717  #endif
     718  #endif
     719  #ifdef HAVE_RINGS
     720  poly beforeredsig;
     721  if(rField_is_Ring(currRing))
     722    beforeredsig = pCopy(h->sig);
     723  #endif
    708724  if (strat->tl<0) return 1;
    709725  //if (h->GetLmTailRing()==NULL) return 0; // HS: SHOULD NOT BE NEEDED!
    710726  //printf("FDEGS: %ld -- %ld\n",h->FDeg, h->pFDeg());
    711727  assume(h->FDeg == h->pFDeg());
     728  #if ADIDEBUG
     729  printf("\n--------------------------redSig-------------------------------------\n");
     730  printf("\nBefore redSig:\n");
     731  p_Write(h->p,strat->tailRing);pWrite(h->sig);
     732  #endif
    712733//#if 1
    713734#ifdef DEBUGF5
     
    739760    if (j < 0)
    740761    {
    741       return 1;
     762      #if GCD_SBA
     763      #if ADIDEBUG
     764      printf("\nBefore sbaCheckGcdPair ");pWrite(h->p);
     765      #endif
     766      //sbaCheckGcdPair(h,strat);
     767      while(sbaCheckGcdPair(h,strat))
     768      {
     769        #if ADIDEBUG
     770        printf("\nIntermidiate sbaCheckGcdPair ");pWrite(h->p);
     771        #endif
     772        h->sev = pGetShortExpVector(h->p);
     773        h->is_redundant = FALSE;
     774        start = 0;
     775      }
     776      #if ADIDEBUG
     777      printf("\nAfter sbaCheckGcdPair ");pWrite(h->p);
     778      #endif
     779      #endif
     780      // over ZZ: cleanup coefficients by complete reduction with monomials
     781      postReduceByMonSig(h, strat);
     782      if(h->p == NULL || nIsZero(pGetCoeff(h->p))) return 2;
     783      j = kFindDivisibleByInT(strat, h,start);
     784      if(j < 0)
     785      {
     786        if(strat->tl >= 0)
     787            h->i_r1 = strat->tl;
     788        else
     789            h->i_r1 = -1;
     790        if (h->GetLmTailRing() == NULL)
     791        {
     792          if (h->lcm!=NULL) pLmDelete(h->lcm);
     793          h->Clear();
     794          return 0;
     795        }
     796        #ifdef HAVE_RINGS
     797        if(rField_is_Ring(currRing))
     798        {
     799          //Check for sigdrop after reduction
     800          if(pLtCmp(beforeredsig,h->sig) == 1)
     801          {
     802            #if ADIDEBUG
     803            printf("\nSigDrop after reduce\n");pWrite(beforeredsig);pWrite(h->sig);
     804            #endif
     805            strat->sigdrop = TRUE;
     806            //Reduce it as much as you can
     807            int red_result = redRing(h,strat);
     808            if(red_result == 0)
     809            {
     810              //It reduced to 0, cancel the sigdrop
     811              #if ADIDEBUG
     812              printf("\nReduced to 0 via redRing. Cancel sigdrop\n");
     813              #endif
     814              strat->sigdrop = FALSE;
     815              p_Delete(&h->sig,currRing);h->sig = NULL;
     816              return 0;
     817            }
     818            else
     819            {
     820              #if ADIDEBUG
     821              printf("\nReduced to this via redRing.SIGDROP\n");pWrite(h->p);
     822              #endif
     823              //strat->enterS(*h, strat->sl+1, strat, strat->tl);
     824              return 0;
     825            }
     826          }
     827          p_Delete(&beforeredsig,currRing);
     828        }
     829        #endif
     830        return 1;
     831      }
    742832    }
    743833
     
    749839     */
    750840    i = j;
    751 #if 1
    752841    if (TEST_OPT_LENGTH)
    753     loop
    754     {
    755       /*- search the shortest possible with respect to length -*/
    756       i++;
    757       if (i > strat->tl)
    758         break;
    759       if (li<=1)
    760         break;
    761       if ((strat->T[i].pLength < li)
    762          &&
    763           p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i],
    764                                h_p, not_sev, strat->tailRing))
    765       {
    766         /*
    767          * the polynomial to reduce with is now;
    768          */
    769         li = strat->T[i].pLength;
    770         ii = i;
     842    if(rField_is_Ring(currRing))
     843    {
     844      loop
     845      {
     846        /*- search the shortest possible with respect to length -*/
     847        i++;
     848        if (i > strat->tl)
     849          break;
     850        if (li<=1)
     851          break;
     852        if ((strat->T[i].pLength < li)
     853           && n_DivBy(pGetCoeff(h_p),pGetCoeff(strat->T[i].p),currRing->cf)
     854           && p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i],
     855                                 h_p, not_sev, strat->tailRing))
     856        {
     857          /*
     858           * the polynomial to reduce with is now;
     859           */
     860          li = strat->T[i].pLength;
     861          ii = i;
     862        }
     863      }
     864    }
     865    else
     866    {
     867      loop
     868      {
     869        /*- search the shortest possible with respect to length -*/
     870        i++;
     871        if (i > strat->tl)
     872          break;
     873        if (li<=1)
     874          break;
     875        if ((strat->T[i].pLength < li)
     876           && p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i],
     877                                 h_p, not_sev, strat->tailRing))
     878        {
     879          /*
     880           * the polynomial to reduce with is now;
     881           */
     882          li = strat->T[i].pLength;
     883          ii = i;
     884        }
    771885      }
    772886    }
    773887    start = ii+1;
    774 #endif
    775888
    776889    /*
     
    800913    printf("INDEX OF REDUCER T: %d\n",ii);
    801914#endif
     915    #if ADIDEBUG
     916    printf("\nWe reduce it with:\n");p_Write(strat->T[ii].p,strat->tailRing);pWrite(strat->T[ii].sig);
     917    #endif
    802918    sigSafe = ksReducePolySig(h, &(strat->T[ii]), strat->S_2_R[ii], NULL, NULL, strat);
     919    #if ADIDEBUG
     920    printf("\nAfter small reduction:\n");pWrite(h->p);pWrite(h->sig);
     921    #endif
     922    if(rField_is_Ring(currRing) && h->p == NULL && h->sig == NULL)
     923    {
     924      //Trivial case catch
     925      strat->sigdrop = FALSE;
     926    }
     927    #if 0
     928    //If the reducer has the same lt (+ or -) as the other one, reduce it via redRing
     929    //In some cases this proves to be very bad
     930    if(rField_is_Ring(currRing) && h->p != NULL && pLmCmp(h->p,strat->T[ii].p)==0)
     931    {
     932      #if ADIDEBUG
     933      printf("\nReducer and Original have same LT. Force it with redRing!\n");
     934      #endif
     935      int red_result = redRing(h,strat);
     936      if(red_result == 0)
     937      {
     938        #if ADIDEBUG
     939        printf("\nRedRing reduced it to 0. Perfect\n");
     940        #endif
     941        pDelete(&h->sig);h->sig = NULL;
     942        return 0;
     943      }
     944      else
     945      {
     946        #if ADIDEBUG
     947        printf("\nRedRing reduced it to *.\nHave to sigdrop now\n");pWrite(h->p);
     948        #endif
     949        strat->sigdrop = TRUE;
     950        return 1;
     951      }
     952    }
     953    #endif
     954    if(strat->sigdrop)
     955      return 1;
    803956#if SBA_PRINT_REDUCTION_STEPS
    804957    if (sigSafe != 3)
     
    9021055    loop
    9031056    {
     1057      if(rField_is_Ring(currRing) && strat->sigdrop)
     1058        break;
    9041059      Ln.SetShortExpVector();
    9051060      if (withT)
     
    9201075        cnt=REDTAIL_CANONICALIZE;
    9211076        /*poly tmp=*/Ln.CanonicalizeP();
    922         if (normalize)
     1077        if (normalize && !rField_is_Ring(currRing))
    9231078        {
    9241079          Ln.Normalize();
     
    9271082        }
    9281083      }
    929       if (normalize && (!TEST_OPT_INTSTRATEGY) && (!nIsOne(pGetCoeff(With->p))))
     1084      if (normalize && (!TEST_OPT_INTSTRATEGY) && !rField_is_Ring(currRing) && (!nIsOne(pGetCoeff(With->p))))
    9301085      {
    9311086        With->pNorm();
    9321087      }
    9331088      strat->redTailChange=TRUE;
    934       int ret = ksReducePolyTailSig(L, With, &Ln);
     1089      #if ADIDEBUG
     1090      printf("\nWill TAILreduce * with *:\n");pWrite(Ln.p);pWrite(Ln.sig);
     1091      pWrite(With->p);pWrite(With->sig);pWrite(L->sig);
     1092      #endif
     1093      int ret = ksReducePolyTailSig(L, With, &Ln, strat);
     1094      if(rField_is_Ring(currRing))
     1095        L->sig = Ln.sig;
     1096      //Because Ln.sig is set to L->sig, but in ksReducePolyTailSig -> ksReducePolySig
     1097      // I delete it an then set Ln.sig. Hence L->sig is lost
     1098      #if ADIDEBUG
     1099      printf("\nAfter small TAILreduce:\n");pWrite(Ln.p);pWrite(Ln.sig);pWrite(L->sig);
     1100      #endif
    9351101#if SBA_PRINT_REDUCTION_STEPS
    9361102      if (ret != 3)
     
    9571123      if (Ln.IsNull()) goto all_done;
    9581124      if (! withT) With_s.Init(currRing);
     1125      if(rField_is_Ring(currRing) && strat->sigdrop)
     1126      {
     1127        //Cannot break the loop here so easily
     1128        break;
     1129      }
    9591130    }
    9601131    pNext(h) = Ln.LmExtractAndIter();
    9611132    pIter(h);
    962     pNormalize(h);
     1133    if(!rField_is_Ring(currRing))
     1134      pNormalize(h);
    9631135    L->pLength++;
    9641136  }
    965 
    9661137  all_done:
    9671138  Ln.Delete();
     
    9721143    L->length = 0;
    9731144  }
    974 
    9751145  //if (TEST_OPT_PROT) { PrintS("N"); mflush(); }
    9761146  //L->Normalize(); // HANNES: should have a test
     
    15431713  while (strat->Ll >= 0)
    15441714  {
     1715    #if ADIDEBUG
     1716    printf("\n      ------------------------NEW LOOP\n");
     1717    printf("\nShdl = \n");
     1718    #if 0
     1719    idPrint(strat->Shdl);
     1720    #else
     1721    for(int ii = 0; ii<=strat->sl;ii++)
     1722        p_Write(strat->S[ii],strat->tailRing);
     1723    #endif
     1724    printf("\n   list   L\n");
     1725    int iii;
     1726    #if 1
     1727    for(iii = 0; iii<= strat->Ll; iii++)
     1728    {
     1729        printf("L[%i]:",iii);
     1730        p_Write(strat->L[iii].p, currRing);
     1731        p_Write(strat->L[iii].p1, currRing);
     1732        p_Write(strat->L[iii].p2, currRing);
     1733    }
     1734    #else
     1735    {
     1736        printf("L[%i]:",strat->Ll);
     1737        p_Write(strat->L[strat->Ll].p, strat->tailRing);
     1738        p_Write(strat->L[strat->Ll].p1, strat->tailRing);
     1739        p_Write(strat->L[strat->Ll].p2, strat->tailRing);
     1740    }
     1741    #endif
     1742    #if 0
     1743    for(iii = 0; iii<= strat->Bl; iii++)
     1744    {
     1745        printf("B[%i]:",iii);
     1746        p_Write(strat->B[iii].p, /*strat->tailRing*/currRing);
     1747        p_Write(strat->B[iii].p1, /*strat->tailRing*/currRing);
     1748        p_Write(strat->B[iii].p2, strat->tailRing);
     1749    }
     1750    #endif
     1751    //getchar();
     1752    #endif
    15451753    #ifdef KDEBUG
    15461754      if (TEST_OPT_DEBUG) messageSets(strat);
     
    16951903        // posInS only depends on the leading term
    16961904        strat->enterS(strat->P, pos, strat, strat->tl);
     1905        #if ADIDEBUG
     1906        printf("\nThis element has been added to S:\n");pWrite(strat->P.p);pWrite(strat->P.p1);pWrite(strat->P.p2);
     1907        #endif
    16971908#if 0
    16981909        int pl=pLength(strat->P.p);
     
    18552066  sba_interreduction_operations = 0;
    18562067#endif
    1857 
     2068 
    18582069  ideal F1 = F0;
    18592070  ring sRing, currRingOld;
     
    18682079    }
    18692080  }
     2081  ideal F;
    18702082  // sort ideal F
    1871   ideal F       = idInit(IDELEMS(F1),F1->rank);
    1872   intvec *sort  = idSort(F1);
    1873   for (int i=0; i<sort->length();++i)
    1874     F->m[i] = F1->m[(*sort)[i]-1];
     2083  //Put the SigDrop element on the correct position (think of sbaEnterS)
     2084  //We also sort them
     2085  if(rField_is_Ring(currRing) && strat->sigdrop)
     2086  {
     2087    #if 1
     2088    F = idInit(IDELEMS(F1),F1->rank);
     2089    for (int i=0; i<IDELEMS(F1);++i)
     2090      F->m[i] = F1->m[i];
     2091    if(strat->sbaEnterS >= 0)
     2092    {
     2093      poly dummy;
     2094      dummy = pCopy(F->m[0]); //the sigdrop element
     2095      for(int i = 0;i<strat->sbaEnterS;i++)
     2096        F->m[i] = F->m[i+1];
     2097      F->m[strat->sbaEnterS] = dummy;
     2098    }
     2099    #else
     2100    F = idInit(1,F1->rank);
     2101    //printf("\nBefore the initial block sorting:\n");idPrint(F1);
     2102    F->m[0] = F1->m[0];
     2103    int pos;
     2104    if(strat->sbaEnterS >= 0)
     2105    {
     2106      for(int i=1;i<=strat->sbaEnterS;i++)
     2107      {
     2108        pos = posInIdealMonFirst(F,F1->m[i],1,strat->sbaEnterS);
     2109        idInsertPolyOnPos(F,F1->m[i],pos);
     2110      }
     2111      for(int i=strat->sbaEnterS+1;i<IDELEMS(F1);i++)
     2112      {
     2113        pos = posInIdealMonFirst(F,F1->m[i],strat->sbaEnterS+1,IDELEMS(F));
     2114        idInsertPolyOnPos(F,F1->m[i],pos);
     2115      }
     2116      poly dummy;
     2117      dummy = pCopy(F->m[0]); //the sigdrop element
     2118      for(int i = 0;i<strat->sbaEnterS;i++)
     2119        F->m[i] = F->m[i+1];
     2120      F->m[strat->sbaEnterS] = dummy;
     2121    }
     2122    else
     2123    {
     2124      for(int i=1;i<IDELEMS(F1);i++)
     2125      {
     2126        pos = posInIdealMonFirst(F,F1->m[i],1,IDELEMS(F));
     2127        idInsertPolyOnPos(F,F1->m[i],pos);
     2128      }
     2129    }
     2130    #endif
     2131    //printf("\nAfter the initial block sorting:\n");idPrint(F);getchar();
     2132  }
     2133  else
     2134  {
     2135    F       = idInit(IDELEMS(F1),F1->rank);
     2136    intvec *sort  = idSort(F1);
     2137    for (int i=0; i<sort->length();++i)
     2138      F->m[i] = F1->m[(*sort)[i]-1];
     2139  // put the monomials after the sbaEnterS polynomials
     2140  //printf("\nThis is the ideal before sorting (sbaEnterS = %i)\n",strat->sbaEnterS);idPrint(F);
     2141  int nrmon = 0;
     2142  for(int i = IDELEMS(F)-1,j;i>strat->sbaEnterS+nrmon+1 ;i--)
     2143  {
     2144    //pWrite(F->m[i]);
     2145    if(F->m[i] != NULL && pNext(F->m[i]) == NULL)
     2146    {
     2147      poly mon = F->m[i];
     2148      for(j = i;j>strat->sbaEnterS+nrmon+1;j--)
     2149      {
     2150        F->m[j] = F->m[j-1];
     2151      }
     2152      F->m[j] = mon;
     2153      nrmon++;
     2154    }
     2155    //idPrint(F);
     2156  }
     2157  }
     2158    //printf("\nThis is the ideal after sorting\n");idPrint(F);getchar();
     2159  #ifdef HAVE_RINGS
     2160  if(rField_is_Ring(currRing))
     2161    strat->sigdrop = FALSE;
     2162  strat->nrsyzcrit = 0;
     2163  strat->nrrewcrit = 0;
     2164  #endif
    18752165#if SBA_INTERRED_START
    18762166  F = kInterRed(F,NULL);
     
    18882178  BOOLEAN withT     = TRUE;
    18892179  strat->max_lower_index = 0;
    1890 
    18912180  //initBuchMoraCrit(strat); /*set Gebauer, honey, sugarCrit*/
    18922181  initSbaCrit(strat); /*set Gebauer, honey, sugarCrit*/
     
    18992188  srmax = strat->sl;
    19002189  reduc = olddeg = lrmax = 0;
    1901 
    19022190#ifndef NO_BUCKETS
    19032191  if (!TEST_OPT_NOT_BUCKETS)
     
    19222210    kDebugPrint(strat);
    19232211  }
    1924 
    1925 
     2212  // We add the elements directly in S from the previous loop
     2213  if(rField_is_Ring(currRing) && strat->sbaEnterS >= 0)
     2214  {
     2215    for(int i = 0;i<strat->sbaEnterS;i++)
     2216    {
     2217      //Update: now the element is at the corect place
     2218      //i+1 because on the 0 position is the sigdrop element
     2219      enterT(strat->L[strat->Ll-(i)],strat);
     2220      strat->enterS(strat->L[strat->Ll-(i)], strat->sl+1, strat, strat->tl);
     2221    }
     2222    strat->Ll = strat->Ll - strat->sbaEnterS;
     2223    strat->sbaEnterS = -1;
     2224  }
     2225  kTest_TS(strat);
    19262226#ifdef KDEBUG
    19272227  //kDebugPrint(strat);
     
    19302230  while (strat->Ll >= 0)
    19312231  {
     2232    #if ADIDEBUG
     2233    printf("\n      ------------------------NEW LOOP\n");
     2234    printf("\nShdl = \n");
     2235    #if 0
     2236    idPrint(strat->Shdl);
     2237    #else
     2238    for(int ii = 0; ii<=strat->sl;ii++)
     2239    {
     2240      printf("\nS[%i]:  ",ii);p_Write(strat->S[ii],strat->tailRing);
     2241      printf("sig:   ");pWrite(strat->sig[ii]);
     2242    }
     2243    #endif
     2244    #if 0
     2245    for(int iii = 0; iii< strat->syzl; iii++)
     2246    {
     2247        printf("\nsyz[%i]:\n",iii);
     2248        p_Write(strat->syz[iii], currRing);
     2249    }
     2250    #endif
     2251    #if 0
     2252    for(int iii = 0; iii<= strat->tl; iii++)
     2253    {
     2254        printf("\nT[%i]:\n",iii);
     2255        p_Write(strat->T[iii].p, currRing);
     2256    }
     2257    #endif
     2258    printf("\n   list   L\n");
     2259    int iii;
     2260    #if 1
     2261    for(iii = 0; iii<= strat->Ll; iii++)
     2262    {
     2263        printf("\nL[%i]:\n",iii);
     2264        p_Write(strat->L[iii].p, currRing);
     2265        p_Write(strat->L[iii].p1, currRing);
     2266        p_Write(strat->L[iii].p2, currRing);
     2267        p_Write(strat->L[iii].sig, currRing);
     2268    }
     2269    #else
     2270    {
     2271        printf("L[%i]:",strat->Ll);
     2272        p_Write(strat->L[strat->Ll].p, strat->tailRing);
     2273        p_Write(strat->L[strat->Ll].p1, strat->tailRing);
     2274        p_Write(strat->L[strat->Ll].p2, strat->tailRing);
     2275        p_Write(strat->L[strat->Ll].sig, strat->tailRing);
     2276    }
     2277    #endif
     2278    //getchar();
     2279    #endif
    19322280    if (strat->Ll > lrmax) lrmax =strat->Ll;/*stat.*/
    19332281    #ifdef KDEBUG
     
    19652313      // initialize new syzygy rules for the next iteration step
    19662314      initSyzRules(strat);
    1967 
    19682315    }
    19692316    /*********************************************************************
     
    19742321    strat->P = strat->L[strat->Ll];
    19752322    strat->Ll--;
     2323   
     2324    #ifdef HAVE_RINGS
     2325    if(rField_is_Ring(currRing))
     2326      strat->sbaEnterS = pGetComp(strat->P.sig) - 1;
     2327    #endif
     2328   
     2329    #if ADIDEBUG
     2330    printf("\n-------------------------\nThis is the current element P\n");
     2331    pWrite(strat->P.p);
     2332    pWrite(strat->P.p1);
     2333    pWrite(strat->P.p2);
     2334    pWrite(strat->P.sig);
     2335    #endif
    19762336    /* reduction of the element chosen from L */
    1977 
    1978     if (!strat->rewCrit2(strat->P.sig, ~strat->P.sevSig, strat->P.GetLmCurrRing(), strat, strat->P.checked+1)) {
     2337    // We do not delete via RewCrit strong pairs or extended spolys over rings
     2338    // these should have .lcm = NULL
     2339    if (strat->P.lcm == NULL || !strat->rewCrit2(strat->P.sig, ~strat->P.sevSig, strat->P.GetLmCurrRing(), strat, strat->P.checked+1)) {
    19792340      //#if 1
    19802341#ifdef DEBUGF5
     
    20252386          strat->P.p2=p_Copy(strat->P.p, currRing, strat->tailRing);
    20262387        // for input polys, prepare reduction
    2027         strat->P.PrepareRed(strat->use_buckets);
     2388        if(!rField_is_Ring(currRing))
     2389          strat->P.PrepareRed(strat->use_buckets);
    20282390      }
    20292391      if (strat->P.p == NULL && strat->P.t_p == NULL)
     
    20632425      red_result = 2;
    20642426    }
     2427    if(rField_is_Ring(currRing))
     2428    {
     2429      if(strat->P.sig!= NULL && !nGreaterZero(pGetCoeff(strat->P.sig)))
     2430      {
     2431        strat->P.p = pNeg(strat->P.p);
     2432        strat->P.sig = pNeg(strat->P.sig);
     2433      }
     2434      strat->P.pLength = pLength(strat->P.p);
     2435      if(strat->P.sig != NULL)
     2436        strat->P.sevSig = pGetShortExpVector(strat->P.sig);
     2437      if(strat->P.p != NULL)
     2438        strat->P.sev = pGetShortExpVector(strat->P.p);
     2439    }
     2440    #if ADIDEBUG
     2441    printf("\nAfter reduce (redresult=%i): \n",red_result);pWrite(strat->P.p);pWrite(strat->P.sig);
     2442    #endif
     2443    //sigdrop case
     2444    if(rField_is_Ring(currRing) && strat->sigdrop)
     2445    {
     2446      //First reduce it as much as one can
     2447      #if ADIDEBUG
     2448      printf("\nSigdrop in the reduce. Trying redring\n");
     2449      #endif
     2450      red_result = redRing(&strat->P,strat);
     2451      if(red_result == 0)
     2452      {
     2453        #if ADIDEBUG
     2454        printf("\nSigdrop cancelled since redRing reduced to 0\n");
     2455        #endif
     2456        strat->sigdrop = FALSE;
     2457        pDelete(&strat->P.sig);
     2458        strat->P.sig = NULL;
     2459      }
     2460      else
     2461      {
     2462        #if ADIDEBUG
     2463        printf("\nStill Sigdrop - redRing reduced to:\n");pWrite(strat->P.p);
     2464        #endif
     2465        strat->enterS(strat->P, 0, strat, strat->tl);
     2466        if (TEST_OPT_PROT)
     2467          PrintS("-");
     2468        break;
     2469      }
     2470    }
     2471    if(strat->blockred > strat->blockredmax)
     2472    {
     2473      #if ADIDEBUG
     2474      printf("\nToo many blocked reductions\n");
     2475      #endif
     2476      strat->sigdrop = TRUE;
     2477      break;
     2478    }
     2479   
    20652480    if (errorreported)  break;
    20662481
     
    20752490    }
    20762491#endif
     2492    if (TEST_OPT_PROT)
     2493    {
     2494      if(strat->P.p != NULL)
     2495        message((strat->honey ? strat->P.ecart : 0) + strat->P.pFDeg(),
     2496                &olddeg,&reduc,strat, red_result);
     2497      else
     2498        message((strat->honey ? strat->P.ecart : 0),
     2499                &olddeg,&reduc,strat, red_result);
     2500    }
    20772501
    20782502    if (strat->overflow)
     
    20802504        if (!kStratChangeTailRing(strat)) { Werror("OVERFLOW.."); break;}
    20812505    }
    2082 
    20832506    // reduction to non-zero new poly
    20842507    if (red_result == 1)
     
    21062529      // in the ring case we cannot expect LC(f) = 1,
    21072530      // therefore we call pContent instead of pNorm
     2531      #ifdef HAVE_RINGS
     2532      poly beforetailred;
     2533      if(rField_is_Ring(currRing))
     2534        beforetailred = pCopy(strat->P.sig);
     2535      #endif
    21082536#if SBA_TAIL_RED
    2109       if (strat->sbaOrder != 2) {
    2110         if ((TEST_OPT_INTSTRATEGY) || (rField_is_Ring(currRing)))
    2111         {
    2112           strat->P.pCleardenom();
    2113           if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
     2537      if(rField_is_Ring(currRing))
     2538      { 
     2539        if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
     2540          strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT);
     2541      }
     2542      else
     2543      {
     2544        if (strat->sbaOrder != 2) {
     2545          if (TEST_OPT_INTSTRATEGY)
    21142546          {
    2115             strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT);
    21162547            strat->P.pCleardenom();
     2548            if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
     2549            {
     2550              strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT);
     2551              strat->P.pCleardenom();
     2552            }
    21172553          }
     2554          else
     2555          {
     2556            strat->P.pNorm();
     2557            if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
     2558              strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT);
     2559          }
     2560        }
     2561      }
     2562      // It may happen that we have lost the sig in redtailsba
     2563      // It cannot reduce to 0 since here we are doing just tail reduction.
     2564      // Best case scenerio: remains the leading term
     2565      if(rField_is_Ring(currRing) && strat->sigdrop)     
     2566      {
     2567        #if ADIDEBUG
     2568        printf("\n Still sigdrop after redtailSba - it reduced to \n");pWrite(strat->P.p);
     2569        #endif
     2570        strat->enterS(strat->P, 0, strat, strat->tl);
     2571        break;
     2572      }
     2573#endif
     2574    if(rField_is_Ring(currRing))
     2575    {
     2576      if(strat->P.sig == NULL || pLtCmp(beforetailred,strat->P.sig) == 1)
     2577      {
     2578        #if ADIDEBUG
     2579        printf("\nSigDrop after TAILred\n");pWrite(beforetailred);pWrite(strat->P.sig);
     2580        #endif
     2581        strat->sigdrop = TRUE;
     2582        //Reduce it as much as you can
     2583        red_result = redRing(&strat->P,strat);
     2584        if(red_result == 0)
     2585        {
     2586          //It reduced to 0, cancel the sigdrop
     2587          #if ADIDEBUG
     2588          printf("\nReduced to 0 via redRing. Cancel sigdrop\n");
     2589          #endif
     2590          strat->sigdrop = FALSE;
     2591          p_Delete(&strat->P.sig,currRing);strat->P.sig = NULL;
    21182592        }
    21192593        else
    21202594        {
    2121           strat->P.pNorm();
    2122           if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
    2123             strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT);
    2124         }
    2125       }
    2126 #endif
    2127 
     2595          #if ADIDEBUG
     2596          printf("\nReduced to this via redRing.SIGDROP\n");pWrite(strat->P.p);
     2597          #endif
     2598          strat->enterS(strat->P, 0, strat, strat->tl);
     2599          break;
     2600        }
     2601      }
     2602      p_Delete(&beforetailred,currRing);
     2603      // strat->P.p = NULL may appear if we had  a sigdrop above and reduced to 0 via redRing
     2604      if(strat->P.p == NULL)
     2605        goto case_when_red_result_changed;
     2606    }
     2607    #if ADIDEBUG
     2608    printf("\nNach redTailSba: \n");
     2609    pWrite(strat->P.p);pWrite(strat->P.sig);
     2610    #endif
    21282611    // remove sigsafe label since it is no longer valid for the next element to
    21292612    // be reduced
     
    21792662      pWrite(strat->P.sig);
    21802663      */
     2664      if (rField_is_Ring(currRing))
     2665        superenterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl);
     2666      else
     2667        enterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl);
     2668      #if ADIDEBUG
     2669        printf("\nThis element is added to S\n");
     2670        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);
     2671        getchar();
     2672        #endif
     2673      // posInS only depends on the leading term
     2674     
    21812675      #ifdef HAVE_RINGS
    2182       if (rField_is_Ring(currRing))
    2183         superenterpairs(strat->P.p,strat->sl,strat->P.ecart,pos,strat, strat->tl);
    2184       else
     2676      if(rField_is_Ring(currRing) && strat->sigdrop)
     2677        break;
    21852678      #endif
    2186         enterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl);
    2187       // posInS only depends on the leading term
     2679      strat->P.sevSig = p_GetShortExpVector(strat->P.sig,currRing);
    21882680      strat->enterS(strat->P, pos, strat, strat->tl);
     2681     
    21892682      if(strat->sbaOrder != 1)
    21902683      {
     
    23452838    else
    23462839    {
     2840      case_when_red_result_changed:
    23472841      // adds signature of the zero reduction to
    23482842      // strat->syz. This is the leading term of
     
    23542848        zeroreductions++;
    23552849#endif
    2356         int pos = posInSyz(strat, strat->P.sig);
    2357         enterSyz(strat->P, strat, pos);
    2358 //#if 1
    2359 #ifdef DEBUGF5
    2360         Print("ADDING STUFF TO SYZ :  ");
    2361         //pWrite(strat->P.p);
    2362         pWrite(strat->P.sig);
    2363 #endif
     2850        #ifdef HAVE_RINGS
     2851        if(rField_is_Ring(currRing) && strat->P.p == NULL && strat->P.sig == NULL)
     2852        {
     2853          //Catch the case when p = 0, sig = 0
     2854        }
     2855        else
     2856        #endif
     2857        {
     2858          int pos = posInSyz(strat, strat->P.sig);
     2859          enterSyz(strat->P, strat, pos);
     2860  //#if 1
     2861  #ifdef DEBUGF5
     2862          Print("ADDING STUFF TO SYZ :  ");
     2863          //pWrite(strat->P.p);
     2864          pWrite(strat->P.sig);
     2865  #endif
     2866        }
    23642867      }
    23652868      if (strat->P.p1 == NULL && strat->minim > 0)
     
    23742877    kTest_TS(strat);
    23752878  }
     2879  #if 0
     2880  if(strat->sigdrop)
     2881    printf("\nSigDrop!\n");
     2882  else
     2883    printf("\nEnded with no SigDrop\n");
     2884  #endif
     2885// Clean strat->P for the next sba call
     2886#ifdef HAVE_RINGS
     2887  if(rField_is_Ring(currRing) && strat->sigdrop)
     2888  {
     2889    //This is used to know how many elements can we directly add to S in the next run
     2890    if(strat->P.sig != NULL)
     2891      strat->sbaEnterS = pGetComp(strat->P.sig)-1;
     2892    //else we already set it at the beggining of the loop
     2893    #ifdef KDEBUG
     2894    memset(&(strat->P), 0, sizeof(strat->P));
     2895    #endif /* KDEBUG */
     2896  }
     2897#endif
    23762898#ifdef KDEBUG
    23772899  if (TEST_OPT_DEBUG) messageSets(strat);
     
    23972919    }
    23982920  }
    2399 
    24002921  /* complete reduction of the standard basis--------- */
    24012922  if (TEST_OPT_REDSB)
     
    24212942  size_syz = strat->syzl;
    24222943#endif
    2423   exitSba(strat);
    24242944//  if (TEST_OPT_WEIGHTM)
    24252945//  {
     
    24312951//    }
    24322952//  }
    2433   if (TEST_OPT_PROT) messageStat(hilbcount,strat);
     2953  if (TEST_OPT_PROT) messageStatSBA(hilbcount,strat);
    24342954  if (Q!=NULL) updateResult(strat->Shdl,Q,strat);
    2435 
    24362955#if SBA_PRINT_SIZE_G
    24372956  size_g_non_red  = IDELEMS(strat->Shdl);
    24382957#endif
     2958 
     2959  idTest(strat->Shdl);
     2960  // I have to add the initial input polynomials which where not used (p1 and p2 = NULL)
     2961  #ifdef HAVE_RINGS
     2962  int k;
     2963  if(rField_is_Ring(currRing))
     2964  {
     2965    //for(k = strat->sl;k>=0;k--)
     2966    //  {printf("\nS[%i] = %p\n",k,strat->Shdl->m[k]);pWrite(strat->Shdl->m[k]);}
     2967    k = strat->Ll;
     2968    #if 1
     2969    // 1 - adds just the unused ones, 0 - adds everthing
     2970    for(;k>=0 && (strat->L[k].p1 != NULL || strat->L[k].p2 != NULL);k--)
     2971    {
     2972      //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);
     2973      deleteInL(strat->L,&strat->Ll,k,strat);
     2974    }
     2975    #endif
     2976    //for(int kk = strat->sl;kk>=0;kk--)
     2977    //  {printf("\nS[%i] = %p\n",kk,strat->Shdl->m[kk]);pWrite(strat->Shdl->m[kk]);}
     2978    //idPrint(strat->Shdl);
     2979  idTest(strat->Shdl);
     2980    //printf("\nk = %i\n",k);
     2981    for(;k>=0 && strat->L[k].p1 == NULL && strat->L[k].p2 == NULL;k--)
     2982    {
     2983      //printf("\nAdded k = %i\n",k);
     2984      strat->enterS(strat->L[k], strat->sl+1, strat, strat->tl);
     2985      //printf("\nThis elements was added from L on pos %i\n",strat->sl);pWrite(strat->S[strat->sl]);pWrite(strat->sig[strat->sl]);
     2986    }
     2987  }
     2988  // 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
     2989  #if 0
     2990  if(strat->sigdrop && rField_is_Ring(currRing))
     2991  {
     2992    for(k=strat->sl;k>=0;k--)
     2993    {
     2994      printf("\nsig[%i] = ",i);pWrite(strat->sig[k]);
     2995      if(strat->sig[k] == NULL)
     2996        strat->sig[k] = pCopy(strat->sig[k-1]);
     2997    }
     2998  }
     2999  #endif
     3000  #endif
     3001  //Never do this - you will damage S
     3002  //idSkipZeroes(strat->Shdl);
     3003  //idPrint(strat->Shdl);
     3004  idTest(strat->Shdl);
     3005 
    24393006  if ((strat->sbaOrder == 1 || strat->sbaOrder == 3) && sRing!=currRingOld)
    24403007  {
     
    24423009    F0          = idrMoveR (F1, sRing, currRing);
    24433010    strat->Shdl = idrMoveR_NoSort (strat->Shdl, sRing, currRing);
     3011    rChangeCurrRing (sRing);
     3012    exitSba(strat);
     3013    rChangeCurrRing (currRingOld);
     3014    if(strat->tailRing == sRing)
     3015      strat->tailRing = currRing;
    24443016    rDelete (sRing);
    24453017  }
    2446   id_DelDiv(strat->Shdl, currRing);
     3018  #ifdef HAVE_RINGS
     3019  //if(nCoeff_is_Ring_Z(currRing->cf))
     3020  //  finalReduceByMon(strat);
     3021  if(rField_is_Ring(currRing) && !strat->sigdrop)
     3022  #endif
     3023    id_DelDiv(strat->Shdl, currRing);
    24473024  idSkipZeroes(strat->Shdl);
    24483025  idTest(strat->Shdl);
     
    27073284          }
    27083285          strat->initEcart(&h);
    2709           pos = strat->Ll+1;
     3286          if(rField_is_Ring(currRing))
     3287            pos = posInLF5CRing(strat->L, Ll_old+1,strat->Ll,&h,strat);
     3288          else
     3289            pos = strat->Ll+1;
    27103290          h.sev = pGetShortExpVector(h.p);
    27113291          enterL(&strat->L,&strat->Ll,&strat->Lmax,h,pos);
     
    27743354        strat->P.p2=p_Copy(strat->P.p, currRing, strat->tailRing);
    27753355      // for input polys, prepare reduction
    2776       strat->P.PrepareRed(strat->use_buckets);
     3356      if(!rField_is_Ring(currRing))
     3357        strat->P.PrepareRed(strat->use_buckets);
    27773358    }
    27783359
     
    28133394      /* statistic */
    28143395      if (TEST_OPT_PROT) PrintS("s");
    2815 
    2816       int pos=posInS(strat,strat->sl,strat->P.p,strat->P.ecart);
    2817 
     3396      int pos;
     3397      #if 1
     3398      if(!rField_is_Ring(currRing))
     3399        pos = posInS(strat,strat->sl,strat->P.p,strat->P.ecart);
     3400      else
     3401        pos = posInSMonFirst(strat,strat->sl,strat->P.p,strat->P.ecart);
     3402      #else
     3403      pos = posInS(strat,strat->sl,strat->P.p,strat->P.ecart);
     3404      #endif
    28183405      // reduce the tail and normalize poly
    28193406      // in the ring case we cannot expect LC(f) = 1,
     
    29263513  for (cc=strat->sl+1; cc<IDELEMS(strat->Shdl); ++cc)
    29273514    strat->Shdl->m[cc]  = NULL;
     3515  #if 0
     3516  printf("\nAfter f5c sorting\n");
     3517  for(int i=0;i<=strat->sl;i++)
     3518  pWrite(pHead(strat->S[i]));
     3519  getchar();
     3520  #endif
    29283521//#if 1
    29293522#if DEBUGF5
  • kernel/GBEngine/kutil.cc

    r34183a rc66a53  
    1313
    1414#define ADIDEBUG 0
     15//All vs Just strategy over rings:
     16// 1 - Just
     17// 0 - All
     18#define ALL_VS_JUST 0
     19//Extended Spoly Strategy:
     20// 0 - new gen sig
     21// 1 - ann*old sig
     22#define EXT_POLY_NEW 0
    1523
    1624#include <kernel/mod2.h>
     
    554562     pGetShallowCopyDeleteProc(strat->tailRing, currRing) :
    555563     NULL);
    556 
    557564  for (j=0; j<=strat->tl; j++)
    558565  {
     
    575582        }
    576583        else
    577           pDelete(&p);
     584        {
     585          //pDelete(&p);
     586          p = NULL;
     587        }
    578588        break;
    579589      }
     
    862872{
    863873  int i;
    864 
    865874  // test P
    866875  kFalseReturn(kTest_L(&(strat->P), strat->tailRing,
     
    12211230  assume(i<=strat->sl);
    12221231  assume(p!=NULL);
     1232  #if ALL_VS_JUST
     1233  //Over rings, if we construct the strong pair, do not add the spair
     1234  if(rField_is_Ring(currRing))
     1235  {
     1236    number s,t,d;
     1237    d = n_ExtGcd(pGetCoeff(p), pGetCoeff(strat->S[i]), &s, &t, currRing->cf);
     1238
     1239    if (!nIsZero(s) && !nIsZero(t))  // evtl. durch divBy tests ersetzen
     1240    {
     1241      nDelete(&d);
     1242      nDelete(&s);
     1243      nDelete(&t);
     1244      return;
     1245    }
     1246    nDelete(&d);
     1247    nDelete(&s);
     1248    nDelete(&t);
     1249  }
     1250  #endif
    12231251  int      l,j,compare,compareCoeff;
    12241252  LObject  h;
     
    15651593  return TRUE;
    15661594}
     1595
     1596BOOLEAN sbaCheckGcdPair (LObject* h,kStrategy strat)
     1597{
     1598  if(strat->sl < 0) return FALSE;
     1599  int i;
     1600  for(i=0;i<strat->sl;i++)
     1601  {
     1602    //Construct the gcd pair between h and S[i]
     1603    number d, s, t;
     1604    poly m1, m2, gcd;
     1605    d = n_ExtGcd(pGetCoeff(h->p), pGetCoeff(strat->S[i]), &s, &t, currRing->cf);
     1606    if (nIsZero(s) || nIsZero(t))  // evtl. durch divBy tests ersetzen
     1607    {
     1608      nDelete(&d);
     1609      nDelete(&s);
     1610      nDelete(&t);
     1611    }
     1612    else
     1613    {
     1614      k_GetStrongLeadTerms(h->p, strat->S[i], currRing, m1, m2, gcd, strat->tailRing);
     1615      pSetCoeff0(m1, s);
     1616      pSetCoeff0(m2, t);
     1617      pSetCoeff0(gcd, d);
     1618      pNext(gcd) = p_Add_q(pp_Mult_mm(pNext(h->p), m1, strat->tailRing), pp_Mult_mm(pNext(strat->S[i]), m2, strat->tailRing), strat->tailRing);
     1619      poly pSigMult = p_Copy(h->sig,currRing);
     1620      poly sSigMult = p_Copy(strat->sig[i],currRing);
     1621      pSigMult = p_Mult_mm(pSigMult,m1,currRing);
     1622      sSigMult = p_Mult_mm(sSigMult,m2,currRing);
     1623      p_LmDelete(m1, strat->tailRing);
     1624      p_LmDelete(m2, strat->tailRing);
     1625      poly pairsig = p_Add_q(pSigMult,sSigMult,currRing);
     1626      if(pairsig!= NULL && pLtCmp(pairsig,h->sig) == 0)
     1627      {
     1628        #if ADIDEBUG
     1629        printf("\nCan replace * (sig = *) with * (sig = *) since of * with sig *\n");
     1630        pWrite(h->p);pWrite(h->sig);pWrite(gcd);pWrite(pairsig);pWrite(strat->S[i]);pWrite(strat->sig[i]);
     1631        //getchar();
     1632        #endif
     1633        pDelete(&h->p);
     1634        h->p = gcd;
     1635        pDelete(&h->sig);
     1636        h->sig = pairsig;
     1637        pNext(h->sig) = NULL;
     1638        strat->initEcart(h);
     1639        h->sev = pGetShortExpVector(h->p);
     1640        h->sevSig = pGetShortExpVector(h->sig);
     1641        h->i_r1 = -1;h->i_r2 = -1;
     1642        if(h->lcm != NULL)
     1643        {
     1644          pDelete(&h->lcm);
     1645          h->lcm = NULL;
     1646        }
     1647        if (currRing!=strat->tailRing)
     1648          h->t_p = k_LmInit_currRing_2_tailRing(h->p, strat->tailRing);
     1649        return TRUE;
     1650      }
     1651      //Delete what you didn't use
     1652      pDelete(&gcd);
     1653      pDelete(&pairsig);
     1654    }
     1655  }
     1656  return FALSE;
     1657}
     1658
     1659BOOLEAN enterOneStrongPolySig (int i,poly p,poly sig,int /*ecart*/, int /*isFromQ*/,kStrategy strat, int atR)
     1660{
     1661  number d, s, t;
     1662  assume(atR >= 0);
     1663  poly m1, m2, gcd,si;
     1664  assume(i<=strat->sl);
     1665  si = strat->S[i];
     1666  //printf("\n--------------------------------\n");
     1667  //pWrite(p);pWrite(si);
     1668  d = n_ExtGcd(pGetCoeff(p), pGetCoeff(si), &s, &t, currRing->cf);
     1669
     1670  if (nIsZero(s) || nIsZero(t))  // evtl. durch divBy tests ersetzen
     1671  {
     1672    nDelete(&d);
     1673    nDelete(&s);
     1674    nDelete(&t);
     1675    return FALSE;
     1676  }
     1677
     1678  k_GetStrongLeadTerms(p, si, currRing, m1, m2, gcd, strat->tailRing);
     1679  //p_Test(m1,strat->tailRing);
     1680  //p_Test(m2,strat->tailRing);
     1681  /*if(!enterTstrong)
     1682  {
     1683    while (! kCheckStrongCreation(atR, m1, i, m2, strat) )
     1684    {
     1685      memset(&(strat->P), 0, sizeof(strat->P));
     1686      kStratChangeTailRing(strat);
     1687      strat->P = *(strat->R[atR]);
     1688      p_LmFree(m1, strat->tailRing);
     1689      p_LmFree(m2, strat->tailRing);
     1690      p_LmFree(gcd, currRing);
     1691      k_GetStrongLeadTerms(p, si, currRing, m1, m2, gcd, strat->tailRing);
     1692    }
     1693  }*/
     1694  pSetCoeff0(m1, s);
     1695  pSetCoeff0(m2, t);
     1696  pSetCoeff0(gcd, d);
     1697  p_Test(m1,strat->tailRing);
     1698  p_Test(m2,strat->tailRing);
     1699  //printf("\n===================================\n");
     1700  //pWrite(m1);pWrite(m2);pWrite(gcd);
     1701#ifdef KDEBUG
     1702  if (TEST_OPT_DEBUG)
     1703  {
     1704    // Print("t = %d; s = %d; d = %d\n", nInt(t), nInt(s), nInt(d));
     1705    PrintS("m1 = ");
     1706    p_wrp(m1, strat->tailRing);
     1707    PrintS(" ; m2 = ");
     1708    p_wrp(m2, strat->tailRing);
     1709    PrintS(" ; gcd = ");
     1710    wrp(gcd);
     1711    PrintS("\n--- create strong gcd poly: ");
     1712    Print("\n p: %d", i);
     1713    wrp(p);
     1714    Print("\n strat->S[%d]: ", i);
     1715    wrp(si);
     1716    PrintS(" ---> ");
     1717  }
     1718#endif
     1719
     1720  pNext(gcd) = p_Add_q(pp_Mult_mm(pNext(p), m1, strat->tailRing), pp_Mult_mm(pNext(si), m2, strat->tailRing), strat->tailRing);
     1721 
     1722#ifdef KDEBUG
     1723  if (TEST_OPT_DEBUG)
     1724  {
     1725    wrp(gcd);
     1726    PrintLn();
     1727  }
     1728#endif
     1729
     1730  //Check and set the signatures
     1731  poly pSigMult = p_Copy(sig,currRing);
     1732  poly sSigMult = p_Copy(strat->sig[i],currRing);
     1733  pSigMult = p_Mult_mm(pSigMult,m1,currRing);
     1734  sSigMult = p_Mult_mm(sSigMult,m2,currRing);
     1735  p_LmDelete(m1, strat->tailRing);
     1736  p_LmDelete(m2, strat->tailRing);
     1737  poly pairsig;
     1738  if(pLmCmp(pSigMult,sSigMult) == 0)
     1739  {
     1740    //Same lm, have to add them
     1741    pairsig = p_Add_q(pSigMult,sSigMult,currRing);
     1742    //This might be zero
     1743  }
     1744  else
     1745  {
     1746    //Set the sig to either pSigMult or sSigMult
     1747    if(pLtCmp(pSigMult,sSigMult)==1)
     1748    {
     1749      pairsig = pSigMult;
     1750      pDelete(&sSigMult);
     1751    }
     1752    else
     1753    {
     1754      pairsig = sSigMult;
     1755      pDelete(&pSigMult);
     1756    }
     1757  }
     1758
     1759  LObject h;
     1760  h.p = gcd;
     1761  h.tailRing = strat->tailRing;
     1762  h.sig = pairsig;
     1763  int posx;
     1764  h.pCleardenom();
     1765  strat->initEcart(&h);
     1766  h.sev = pGetShortExpVector(h.p);
     1767  h.i_r1 = -1;h.i_r2 = -1;
     1768  if (currRing!=strat->tailRing)
     1769    h.t_p = k_LmInit_currRing_2_tailRing(h.p, strat->tailRing);
     1770  if(h.sig == NULL)
     1771    {
     1772      #if ADIDEBUG
     1773      printf("\nPossible sigdrop in enterpairstrongSig (due to lost of sig)\n");
     1774      #endif
     1775      //sigdrop since we loose the signature
     1776      strat->sigdrop = TRUE;
     1777      //Try to reduce it as far as we can via redRing
     1778      int red_result = redRing(&h,strat);
     1779      #if ADIDEBUG
     1780      printf("\nAfter redRing reduce:\n");pWrite(h.p);
     1781      #endif
     1782      if(red_result == 0)
     1783      {
     1784        // Cancel the sigdrop
     1785        #if ADIDEBUG
     1786        printf("\nCancel the sigdrop. It reduced to 0\n");
     1787        #endif
     1788        p_Delete(&h.sig,currRing);h.sig = NULL;
     1789        strat->sigdrop = FALSE;
     1790        return FALSE;
     1791      }
     1792      else
     1793      {
     1794        #if ADIDEBUG
     1795        printf("\nSigdrop. end\n");
     1796        #endif
     1797        strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1);
     1798        #if 1
     1799        strat->enterS(h,0,strat,strat->tl);
     1800        #endif
     1801        return FALSE;
     1802      }
     1803    }
     1804  if(!nGreaterZero(pGetCoeff(h.sig)))
     1805  {
     1806    h.sig = pNeg(h.sig);
     1807    h.p = pNeg(h.p);
     1808  }
     1809  #ifdef HAVE_RINGS
     1810 
     1811    if(rField_is_Ring(currRing) &&
     1812      pLtCmp(h.sig,sig) == -1
     1813      )
     1814    {
     1815      #if ADIDEBUG
     1816      printf("\nSigDrop in enteronestrongpolySig\n");
     1817      pWrite(h.sig);
     1818      pWrite(p);pWrite(sig);
     1819      pWrite(strat->S[i]);pWrite(strat->sig[i]);
     1820      #endif
     1821      strat->sigdrop = TRUE;
     1822      // Completely reduce it
     1823      int red_result = redRing(&h,strat);
     1824      if(red_result == 0)
     1825      {
     1826        // Reduced to 0
     1827        #if ADIDEBUG
     1828        printf("\nCancel the sigdrop after redRing (=0)\n");
     1829        #endif
     1830        strat->sigdrop = FALSE;
     1831        p_Delete(&h.sig,currRing);h.sig = NULL;
     1832        return FALSE;
     1833      }
     1834      else
     1835      {
     1836        #if ADIDEBUG
     1837        printf("\nAfter redRing still sigdrop:\n");pWrite(h.p);
     1838        #endif
     1839        strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1);
     1840        // 0 - add just the original poly causing the sigdrop, 1 - add also this
     1841        #if 1
     1842        strat->enterS(h,0,strat, strat->tl+1);
     1843        #endif
     1844        return FALSE;
     1845      }
     1846    }
     1847    #endif
     1848  #if ADIDEBUG
     1849  printf("\nThis strong poly was added to L:\n");pWrite(h.p);pWrite(h.p1);pWrite(h.p2);pWrite(h.sig);
     1850  #endif
     1851  //Check for sigdrop
     1852  if(gcd != NULL && pLtCmp(sig,pairsig) > 0 && pLtCmp(strat->sig[i],pairsig) > 0)
     1853  {
     1854    #if ADIDEBUG
     1855    printf("\nSigDrop in strongpair\noriginals: ");pWrite(sig);pWrite(strat->sig[i]);
     1856    printf("\nnow: ");pWrite(pairsig);
     1857    #endif
     1858    strat->sigdrop = TRUE;
     1859    //Enter this element to S
     1860    strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1);
     1861    strat->enterS(h,strat->sl+1,strat,strat->tl+1);
     1862  }
     1863  #if 1
     1864  h.p1 = p;h.p2 = strat->S[i];
     1865  #endif
     1866  if (atR >= 0)
     1867  {
     1868    h.i_r2 = strat->S_2_R[i];
     1869    h.i_r1 = atR;
     1870  }
     1871  else
     1872  {
     1873    h.i_r1 = -1;
     1874    h.i_r2 = -1;
     1875  }
     1876  if (strat->Ll==-1)
     1877    posx =0;
     1878  else
     1879    posx = strat->posInLSba(strat->L,strat->Ll,&h,strat);
     1880  enterL(&strat->L,&strat->Ll,&strat->Lmax,h,posx);
     1881  return TRUE;
     1882}
    15671883#endif
    15681884
     
    20732389#endif
    20742390{
     2391  #if ADIDEBUG
     2392  printf("\nTrying to add p and S[%i]\n",i);
     2393  pWrite(p);pWrite(pSig);
     2394  pWrite(strat->S[i]);pWrite(strat->sig[i]);
     2395  #endif
     2396  #if ALL_VS_JUST
     2397  //Over rings, if we construct the strong pair, do not add the spair
     2398  if(rField_is_Ring(currRing))
     2399  {
     2400    number s,t,d;
     2401    d = n_ExtGcd(pGetCoeff(p), pGetCoeff(strat->S[i]), &s, &t, currRing->cf);
     2402
     2403    if (!nIsZero(s) && !nIsZero(t))  // evtl. durch divBy tests ersetzen
     2404    {
     2405      nDelete(&d);
     2406      nDelete(&s);
     2407      nDelete(&t);
     2408      return;
     2409    }
     2410    nDelete(&d);
     2411    nDelete(&s);
     2412    nDelete(&t);
     2413  }
     2414  #endif
    20752415  assume(i<=strat->sl);
    2076 
    20772416  int      l;
    20782417  poly m1 = NULL,m2 = NULL; // we need the multipliers for the s-polynomial to compute
     
    20992438
    21002439  // set coeffs of multipliers m1 and m2
    2101   pSetCoeff0(m1, nInit(1));
    2102   pSetCoeff0(m2, nInit(1));
    2103 //#if 1
     2440  #ifdef HAVE_RINGS
     2441  if(rField_is_Ring(currRing))
     2442  {
     2443    number s = nCopy(pGetCoeff(strat->S[i]));
     2444    number t = nCopy(pGetCoeff(p));
     2445    pSetCoeff0(Lp.lcm, n_Lcm(s, t, currRing->cf));
     2446    ksCheckCoeff(&s, &t, currRing->cf);
     2447    pSetCoeff0(m1,s);
     2448    pSetCoeff0(m2,t);
     2449    #if ADIDEBUG
     2450    printf("\nIn Spoly: m1, m2 :\n");pWrite(m1);pWrite(m2);
     2451    #endif
     2452  }
     2453  else
     2454  #endif
     2455  {
     2456    pSetCoeff0(m1, nInit(1));
     2457    pSetCoeff0(m2, nInit(1));
     2458  }
    21042459#ifdef DEBUGF5
    21052460  Print("P1  ");
     
    21122467  pWrite(m2);
    21132468#endif
     2469 
    21142470  // get multiplied signatures for testing
    2115   pSigMult = currRing->p_Procs->pp_Mult_mm(pSigMult,m1,currRing);
     2471  pSigMult = pp_Mult_mm(pSigMult,m1,currRing);
    21162472  pSigMultNegSev = ~p_GetShortExpVector(pSigMult,currRing);
    2117   sSigMult = currRing->p_Procs->pp_Mult_mm(sSigMult,m2,currRing);
     2473  sSigMult = pp_Mult_mm(sSigMult,m2,currRing);
    21182474  sSigMultNegSev = ~p_GetShortExpVector(sSigMult,currRing);
    2119 
    21202475//#if 1
    21212476#ifdef DEBUGF5
     
    21262481  Lp.checked  = 0;
    21272482#endif
    2128   int sigCmp = p_LmCmp(pSigMult,sSigMult,currRing);
     2483  int sigCmp;
     2484  #ifdef HAVE_RINGS
     2485  if(rField_is_Ring(currRing))
     2486    sigCmp = p_LtCmpNoAbs(pSigMult,sSigMult,currRing);
     2487  else
     2488  #endif
     2489    sigCmp = p_LmCmp(pSigMult,sSigMult,currRing);
    21292490//#if 1
    21302491#if DEBUGF5
     
    21332494  pWrite(sSigMult);
    21342495#endif
     2496  //In the ring case we already build the sig
     2497  if(rField_is_Ring(currRing))
     2498  {
     2499    //I have to test it not in absolute value
     2500    if(sigCmp == 0)
     2501    {
     2502      #if ADIDEBUG
     2503      printf("\nPossible sigdrop in enterpairSig (due to lost of sig)\n");
     2504      #endif
     2505      //sigdrop since we loose the signature
     2506      strat->sigdrop = TRUE;
     2507      //Try to reduce it as far as we can via redRing
     2508      if(rField_is_Ring(currRing))
     2509      {
     2510        poly p1 = p_Copy(p,currRing);
     2511        poly p2 = p_Copy(strat->S[i],currRing);
     2512        p1 = p_Mult_mm(p1,m1,currRing);
     2513        p2 = p_Mult_mm(p2,m2,currRing);
     2514        Lp.p = p_Sub(p1,p2,currRing);
     2515        if(Lp.p != NULL)
     2516          Lp.sev = p_GetShortExpVector(Lp.p,currRing);
     2517      }
     2518      int red_result = redRing(&Lp,strat);
     2519      #if ADIDEBUG
     2520      printf("\nAfter redRing reduce:\n");pWrite(Lp.p);
     2521      #endif
     2522      if(red_result == 0)
     2523      {
     2524        // Cancel the sigdrop
     2525        #if ADIDEBUG
     2526        printf("\nCancel the sigdrop. It reduced to 0\n");
     2527        #endif
     2528        p_Delete(&Lp.sig,currRing);Lp.sig = NULL;
     2529        strat->sigdrop = FALSE;
     2530        return;
     2531      }
     2532      else
     2533      {
     2534        #if ADIDEBUG
     2535        printf("\nSigdrop. end\n");
     2536        #endif
     2537        strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1);
     2538        #if 1
     2539        strat->enterS(Lp,0,strat,strat->tl);
     2540        #endif
     2541        return;
     2542      }
     2543    }
     2544    if(p_LmCmp(pSigMult,sSigMult,currRing) == 0)
     2545    {
     2546      //Same lm, have to substract
     2547      Lp.sig = p_Sub(pCopy(pSigMult),pCopy(sSigMult),currRing);
     2548    }
     2549    else
     2550    {
     2551      if(sigCmp == 1)
     2552      {
     2553        Lp.sig = pCopy(pSigMult);
     2554      }
     2555      if(sigCmp == -1)
     2556      {
     2557        Lp.sig = pNeg(pCopy(sSigMult));
     2558      }
     2559    }
     2560    Lp.sevSig = p_GetShortExpVector(Lp.sig,currRing);
     2561  }
     2562 
     2563  #if 0 
    21352564  if(sigCmp==0)
    21362565  {
     
    21482577    return;
    21492578  }
     2579  #endif
    21502580  // testing by syzCrit = F5 Criterion
    21512581  // testing by rewCrit1 = Rewritten Criterion
     
    21532583  if  ( strat->syzCrit(pSigMult,pSigMultNegSev,strat) ||
    21542584        strat->syzCrit(sSigMult,sSigMultNegSev,strat)
    2155         || strat->rewCrit1(sSigMult,sSigMultNegSev,Lp.lcm,strat,i+1)
     2585        // With this rewCrit activated i get a wrong deletion in sba_int_56.tst
     2586        //|| strat->rewCrit1(sSigMult,sSigMultNegSev,Lp.lcm,strat,i+1)
    21562587      )
    21572588  {
     2589    #if ADIDEBUG
     2590    printf("\nDELETED!\n");
     2591    #endif
    21582592    pDelete(&pSigMult);
    21592593    pDelete(&sSigMult);
     
    21812615  else
    21822616  {
    2183     #ifdef HAVE_PLURAL
    2184     if ( rIsPluralRing(currRing) )
    2185     {
    2186       if(pHasNotCF(p, strat->S[i]))
     2617    //Build p
     2618    if(rField_is_Ring(currRing))
     2619    {
     2620      poly p1 = p_Copy(p,currRing);
     2621      poly p2 = p_Copy(strat->S[i],currRing);
     2622      p1 = p_Mult_mm(p1,m1,currRing);
     2623      p2 = p_Mult_mm(p2,m2,currRing);
     2624      Lp.p = p_Sub(p1,p2,currRing);
     2625      if(Lp.p != NULL)
     2626        Lp.sev = p_GetShortExpVector(Lp.p,currRing);
     2627    }
     2628    else
     2629    {
     2630      #ifdef HAVE_PLURAL
     2631      if ( rIsPluralRing(currRing) )
    21872632      {
    21882633        if(ncRingType(currRing) == nc_lie)
     
    22092654      }
    22102655      else
    2211       {
    2212         Lp.p = // nc_CreateSpoly(strat->S[i],p,currRing);
    2213               nc_CreateShortSpoly(strat->S[i], p, currRing);
    2214 
    2215         assume(pNext(Lp.p)==NULL); // TODO: this may be violated whenever ext.prod.crit. for Lie alg. is used
    2216         pNext(Lp.p) = strat->tail; // !!!
    2217       }
    2218     }
    2219     else
    2220     #endif
    2221     {
    2222       assume(!rIsPluralRing(currRing));
    2223       Lp.p = ksCreateShortSpoly(strat->S[i], p, strat->tailRing);
     2656      #endif
     2657      {
     2658        assume(!rIsPluralRing(currRing));
     2659        Lp.p = ksCreateShortSpoly(strat->S[i], p, strat->tailRing);
     2660      }
    22242661    }
    22252662  }
    22262663  // store from which element this pair comes from for further tests
    22272664  //Lp.from = strat->sl+1;
    2228   if(sigCmp==currRing->OrdSgn)
    2229   {
    2230     // pSig > sSig
    2231     pDelete (&sSigMult);
    2232     Lp.sig    = pSigMult;
    2233     Lp.sevSig = ~pSigMultNegSev;
     2665  #ifdef HAVE_RINGS
     2666  if(rField_is_Ring(currRing))
     2667  {
     2668    //Put the sig to be > 0
     2669    if(!nGreaterZero(pGetCoeff(Lp.sig)))
     2670    {
     2671      Lp.sig = pNeg(Lp.sig);
     2672      Lp.p = pNeg(Lp.p);
     2673    }
    22342674  }
    22352675  else
    2236   {
    2237     // pSig < sSig
    2238     pDelete (&pSigMult);
    2239     Lp.sig    = sSigMult;
    2240     Lp.sevSig = ~sSigMultNegSev;
     2676  #endif
     2677  {
     2678    if(sigCmp==currRing->OrdSgn)
     2679    {
     2680      // pSig > sSig
     2681      pDelete (&sSigMult);
     2682      Lp.sig    = pSigMult;
     2683      Lp.sevSig = ~pSigMultNegSev;
     2684    }
     2685    else
     2686    {
     2687      // pSig < sSig
     2688      pDelete (&pSigMult);
     2689      Lp.sig    = sSigMult;
     2690      Lp.sevSig = ~sSigMultNegSev;
     2691    }
    22412692  }
    22422693  if (Lp.p == NULL)
     
    22522703    {
    22532704      pLmFree(Lp.lcm);
     2705      #if ADIDEBUG
     2706      printf("\nrewCrit3 deletes it!\n");
     2707      #endif
    22542708      pDelete(&Lp.sig);
    22552709      Lp.lcm=NULL;
     
    22942748        (!rIsPluralRing(currRing))
    22952749//      ||  (rIsPluralRing(currRing) && (ncRingType(currRing) != nc_lie))
     2750      #ifdef HAVE_RINGS
     2751      && !rField_is_Ring(currRing)
     2752      #endif
    22962753       )
    22972754    {
     
    23142771    if (TEST_OPT_INTSTRATEGY)
    23152772    {
    2316       if (!rIsPluralRing(currRing))
     2773      if (!rIsPluralRing(currRing)
     2774      #ifdef HAVE_RINGS
     2775      && !rField_is_Ring(currRing)
     2776      #endif
     2777      )
    23172778        nDelete(&(Lp.p->coef));
    23182779    }
    2319 
    2320     l = strat->posInLSba(strat->B,strat->Bl,&Lp,strat);
    2321     enterL(&strat->B,&strat->Bl,&strat->Bmax,Lp,l);
     2780    // Check for sigdrop
     2781    #ifdef HAVE_RINGS
     2782    if(rField_is_Ring(currRing) &&
     2783      pLtCmp(Lp.sig,pSig) == -1
     2784      )
     2785    {
     2786      #if ADIDEBUG
     2787      printf("\nSigDrop in enteronepairSig\n");pWrite(Lp.sig);
     2788      pWrite(p);pWrite(pSig);
     2789      pWrite(strat->S[i]);pWrite(strat->sig[i]);
     2790      #endif
     2791      strat->sigdrop = TRUE;
     2792      // Completely reduce it
     2793      int red_result = redRing(&Lp,strat);
     2794      if(red_result == 0)
     2795      {
     2796        // Reduced to 0
     2797        #if ADIDEBUG
     2798        printf("\nCancel the sigdrop after redRing (=0)\n");
     2799        #endif
     2800        strat->sigdrop = FALSE;
     2801        p_Delete(&Lp.sig,currRing);Lp.sig = NULL;
     2802        return;
     2803      }
     2804      else
     2805      {
     2806        #if ADIDEBUG
     2807        printf("\nAfter redRing still sigdrop:\n");pWrite(Lp.p);
     2808        #endif
     2809        strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1);
     2810        // 0 - add just the original poly causing the sigdrop, 1 - add also this
     2811        #if 1
     2812        strat->enterS(Lp,0,strat, strat->tl+1);
     2813        #endif
     2814        return;
     2815      }
     2816    }
     2817    #endif
     2818    #if ADIDEBUG
     2819    printf("\nThis spair was added to B:\n");
     2820    pWrite(Lp.p);
     2821    pWrite(Lp.p1);
     2822    pWrite(Lp.p2);
     2823    pWrite(Lp.sig);
     2824    #endif
     2825    l = strat->posInLSba(strat->L,strat->Ll,&Lp,strat);
     2826    enterL(&strat->L,&strat->Ll,&strat->Lmax,Lp,l);
    23222827  }
    23232828}
     
    31013606      if ((isFromQ)&&(strat->fromQ!=NULL))
    31023607      {
    3103         for (j=0; j<=k; j++)
     3608        for (j=0; j<=k && !strat->sigdrop; j++)
    31043609        {
    31053610          if (!strat->fromQ[j])
     
    31143619      {
    31153620        new_pair=TRUE;
    3116         for (j=0; j<=k; j++)
     3621        for (j=0; j<=k && !strat->sigdrop; j++)
    31173622        {
    31183623          enterOnePairSig(j,h,hSig,hFrom,ecart,isFromQ,strat, atR);
     
    31233628    else
    31243629    {
    3125       for (j=0; j<=k; j++)
     3630      for (j=0; j<=k && !strat->sigdrop; j++)
    31263631      {
    31273632        if ((pGetComp(h)==pGetComp(strat->S[j]))
     
    31353640    }
    31363641
     3642#if 0
    31373643    if (new_pair)
    31383644    {
     
    31443650      strat->chainCrit(h,ecart,strat);
    31453651    }
     3652#endif
    31463653  }
    31473654}
     
    37594266    }
    37604267  }
    3761 /*
    3762 ring r=256,(x,y,z),dp;
    3763 ideal I=12xz-133y, 2xy-z;
    3764 */
     4268}
     4269
     4270void initenterstrongPairsSig (poly h,poly hSig, int hFrom, int k,int ecart,int isFromQ,kStrategy strat, int atR = -1)
     4271{
     4272  const int iCompH = pGetComp(h);
     4273  if (!nIsOne(pGetCoeff(h)))
     4274  {
     4275    int j;
     4276
     4277    for (j=0; j<=k && !strat->sigdrop; j++)
     4278    {
     4279      // Print("j:%d, Ll:%d\n",j,strat->Ll);
     4280//      if (((unsigned long) pGetCoeff(h) % (unsigned long) pGetCoeff(strat->S[j]) != 0) &&
     4281//         ((unsigned long) pGetCoeff(strat->S[j]) % (unsigned long) pGetCoeff(h) != 0))
     4282      if (((iCompH == pGetComp(strat->S[j]))
     4283      || (0 == pGetComp(strat->S[j])))
     4284      && ((iCompH<=strat->syzComp)||(strat->syzComp==0)))
     4285      {
     4286        enterOneStrongPolySig(j,h,hSig,ecart,isFromQ,strat, atR);
     4287      }
     4288    }
     4289  }
    37654290}
    37664291#endif
     
    38224347      p = p_LmFreeAndNext(p, strat->tailRing);
    38234348      pNext(tmp) = p;
    3824       LObject h;
    3825       h.Init();
    3826       h.p = tmp;
    3827       h.tailRing = strat->tailRing;
     4349      LObject Lp;
     4350      Lp.Init();
     4351      Lp.p = tmp;
     4352      Lp.tailRing = strat->tailRing;
    38284353      int posx;
    3829       if (h.p!=NULL)
    3830       {
    3831         if (TEST_OPT_INTSTRATEGY)
    3832         {
    3833           //pContent(h.p);
    3834           h.pCleardenom(); // also does a pContent
    3835         }
    3836         else
    3837         {
    3838           h.pNorm();
    3839         }
    3840         strat->initEcart(&h);
     4354      if (Lp.p!=NULL)
     4355      {
     4356        strat->initEcart(&Lp);
    38414357        if (strat->Ll==-1)
    38424358          posx =0;
    38434359        else
    3844           posx = strat->posInL(strat->L,strat->Ll,&h,strat);
    3845         h.sev = pGetShortExpVector(h.p);
     4360          posx = strat->posInL(strat->L,strat->Ll,&Lp,strat);
     4361        Lp.sev = pGetShortExpVector(Lp.p);
    38464362        if (strat->tailRing != currRing)
    38474363        {
    3848           h.t_p = k_LmInit_currRing_2_tailRing(h.p, strat->tailRing);
     4364          Lp.t_p = k_LmInit_currRing_2_tailRing(Lp.p, strat->tailRing);
    38494365        }
    38504366#ifdef KDEBUG
     
    38554371        }
    38564372#endif
     4373        enterL(&strat->L,&strat->Ll,&strat->Lmax,Lp,posx);
     4374      }
     4375    }
     4376  }
     4377  nDelete(&gcd);
     4378}
     4379
     4380void enterExtendedSpolySig(poly h,poly hSig,kStrategy strat)
     4381{
     4382  if (nIsOne(pGetCoeff(h))) return;
     4383  number gcd;
     4384  bool go = false;
     4385  if (n_DivBy((number) 0, pGetCoeff(h), currRing->cf))
     4386  {
     4387    gcd = n_Ann(pGetCoeff(h),currRing->cf);
     4388    go = true;
     4389  }
     4390  else
     4391    gcd = n_Gcd((number) 0, pGetCoeff(h), strat->tailRing->cf);
     4392  if (go || !nIsOne(gcd))
     4393  {
     4394    poly p = h->next;
     4395    if (!go)
     4396    {
     4397      number tmp = gcd;
     4398      gcd = n_Ann(gcd,currRing->cf);
     4399      nDelete(&tmp);
     4400    }
     4401    p_Test(p,strat->tailRing);
     4402    p = pp_Mult_nn(p, gcd, strat->tailRing);
     4403
     4404    if (p != NULL)
     4405    {
     4406      if (TEST_OPT_PROT)
     4407      {
     4408        PrintS("Z");
     4409      }
     4410#ifdef KDEBUG
     4411      if (TEST_OPT_DEBUG)
     4412      {
     4413        PrintS("--- create zero spoly: ");
     4414        p_wrp(h,currRing,strat->tailRing);
     4415        PrintS(" ---> ");
     4416      }
     4417#endif
     4418      poly tmp = pInit();
     4419      pSetCoeff0(tmp, pGetCoeff(p));
     4420      for (int i = 1; i <= rVar(currRing); i++)
     4421      {
     4422        pSetExp(tmp, i, p_GetExp(p, i, strat->tailRing));
     4423      }
     4424      if (rRing_has_Comp(currRing) && rRing_has_Comp(strat->tailRing))
     4425      {
     4426        p_SetComp(tmp, p_GetComp(p, strat->tailRing), currRing);
     4427      }
     4428      p_Setm(tmp, currRing);
     4429      p = p_LmFreeAndNext(p, strat->tailRing);
     4430      pNext(tmp) = p;
     4431      LObject Lp;
     4432      Lp.Init();
     4433      Lp.p = tmp;
     4434      //printf("\nOld\n");pWrite(h);pWrite(hSig);
     4435      #if EXT_POLY_NEW
     4436      Lp.sig = pp_Mult_nn(hSig, gcd, currRing);
     4437      if(Lp.sig == NULL || nIsZero(pGetCoeff(Lp.sig)))
     4438      {
     4439        #if ADIDEBUG
     4440        printf("\nSigdrop in enterextended spoly\n");pWrite(h);pWrite(hSig);
     4441        #endif
     4442        strat->sigdrop = TRUE;
     4443        //Try to reduce it as far as we can via redRing
     4444        int red_result = redRing(&Lp,strat);
     4445        #if ADIDEBUG
     4446        printf("\nAfter redRing reduce:\n");pWrite(Lp.p);
     4447        #endif
     4448        if(red_result == 0)
     4449        {
     4450          // Cancel the sigdrop
     4451          #if ADIDEBUG
     4452          printf("\nCancel the sigdrop. It reduced to 0\n");
     4453          #endif
     4454          p_Delete(&Lp.sig,currRing);Lp.sig = NULL;
     4455          strat->sigdrop = FALSE;
     4456          return;
     4457        }
     4458        else
     4459        {
     4460          #if ADIDEBUG
     4461          printf("\nSigdrop. end\n");
     4462          #endif
     4463          strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1);
     4464          #if 1
     4465          strat->enterS(Lp,0,strat,strat->tl);
     4466          #endif
     4467          return;
     4468        }
     4469       
     4470      }
     4471      #else
     4472      Lp.sig = pOne();
     4473      if(strat->Ll >= 0)
     4474        p_SetComp(Lp.sig,pGetComp(strat->L[0].sig)+1,currRing);
     4475      else
     4476        p_SetComp(Lp.sig,pGetComp(hSig)+1,currRing);
     4477      #endif
     4478      Lp.tailRing = strat->tailRing;
     4479      int posx;
     4480      if (Lp.p!=NULL)
     4481      {
     4482        strat->initEcart(&Lp);
     4483        if (strat->Ll==-1)
     4484          posx =0;
     4485        else
     4486          posx = strat->posInLSba(strat->L,strat->Ll,&Lp,strat);
     4487        Lp.sev = pGetShortExpVector(Lp.p);
     4488        if (strat->tailRing != currRing)
     4489        {
     4490          Lp.t_p = k_LmInit_currRing_2_tailRing(Lp.p, strat->tailRing);
     4491        }
     4492#ifdef KDEBUG
     4493        if (TEST_OPT_DEBUG)
     4494        {
     4495          p_wrp(tmp,currRing,strat->tailRing);
     4496          PrintLn();
     4497        }
     4498#endif
    38574499        enterL(&strat->L,&strat->Ll,&strat->Lmax,h,posx);
    3858       }
    3859     }
     4500        enterL(&strat->L,&strat->Ll,&strat->Lmax,Lp,posx);
     4501      }
     4502    }
     4503    nDelete(&gcd);
    38604504  }
    38614505  nDelete(&gcd);
     
    38974541  initenterpairs(h, k, ecart, 0, strat, atR);
    38984542  initenterstrongPairs(h, k, ecart, 0, strat, atR);
     4543  clearSbatch(h, k, pos, strat);
     4544}
     4545
     4546void superenterpairsSig (poly h,poly hSig,int hFrom,int k,int ecart,int pos,kStrategy strat, int atR)
     4547{
     4548  assume (rField_is_Ring_Z(currRing));
     4549  // enter also zero divisor * poly, if this is non zero and of smaller degree
     4550  #if ADIDEBUG
     4551  printf("\n      Trying to add extended spolys\n");
     4552  #endif
     4553  if (!(rField_is_Domain(currRing))) enterExtendedSpolySig(h, hSig, strat);
     4554  if(strat->sigdrop) return;
     4555  #if ADIDEBUG
     4556  printf("\n      Trying to add spolys\n");
     4557  #endif
     4558  initenterpairsSig(h, hSig, hFrom, k, ecart, 0, strat, atR);
     4559  if(strat->sigdrop) return;
     4560  #if ADIDEBUG
     4561  printf("\n      Trying to add gcd-polys\n");
     4562  #endif
     4563  initenterstrongPairsSig(h, hSig, hFrom,k, ecart, 0, strat, atR);
     4564  if(strat->sigdrop) return;
    38994565  clearSbatch(h, k, pos, strat);
    39004566}
     
    41764842      }
    41774843    }
     4844  }
     4845}
     4846
     4847
     4848// sorts by degree and pLtCmp
     4849// but puts pure monomials at the beginning
     4850int posInSMonFirst (const kStrategy strat, const int length,const poly p,
     4851            const int ecart_p)
     4852{
     4853  if (length<0) return 0;
     4854  polyset set=strat->S;
     4855  if(pNext(p) == NULL)
     4856  {
     4857    int mon = 0;
     4858    for(int i = 0;i<=length;i++)
     4859    {
     4860      if(set[i] != NULL && pNext(set[i]) == NULL)
     4861        mon++;
     4862    }
     4863    int o = p_Deg(p,currRing);
     4864    int op = p_Deg(set[mon],currRing);
     4865   
     4866    if ((op < o)
     4867    || ((op == o) && (pLtCmp(set[mon],p) == -1)))
     4868      return length+1;
     4869    int i;
     4870    int an = 0;
     4871    int en= mon;
     4872    loop
     4873    {
     4874      if (an >= en-1)
     4875      {
     4876        op = p_Deg(set[an],currRing);
     4877        if ((op < o)
     4878        || ((op == o) && (pLtCmp(set[an],p) == -1)))
     4879          return en;
     4880        return an;
     4881      }
     4882      i=(an+en) / 2;
     4883      op = p_Deg(set[i],currRing);
     4884      if ((op < o)
     4885      || ((op == o) && (pLtCmp(set[i],p) == -1)))
     4886        an=i;
     4887      else
     4888        en=i;
     4889    }
     4890  }
     4891  if(pNext(p) != NULL)
     4892  {
     4893    int o = p_Deg(p,currRing);
     4894    int op = p_Deg(set[length],currRing);
     4895   
     4896    if ((op < o)
     4897    || ((op == o) && (pLtCmp(set[length],p) == -1)))
     4898      return length+1;
     4899    int i;
     4900    int an = 0;
     4901    for(i=0;i<=length;i++)
     4902      if(set[i] != NULL && pNext(set[i]) == NULL)
     4903        an++;
     4904    int en= length;
     4905    loop
     4906    {
     4907      if (an >= en-1)
     4908      {
     4909        op = p_Deg(set[an],currRing);
     4910        if ((op < o)
     4911        || ((op == o) && (pLtCmp(set[an],p) == -1)))
     4912          return en;
     4913        return an;
     4914      }
     4915      i=(an+en) / 2;
     4916      op = p_Deg(set[i],currRing);
     4917      if ((op < o)
     4918      || ((op == o) && (pLtCmp(set[i],p) == -1)))
     4919        an=i;
     4920      else
     4921        en=i;
     4922    }
     4923  }
     4924}
     4925
     4926// sorts by degree and pLtCmp in the block between start,end;
     4927// but puts pure monomials at the beginning
     4928int posInIdealMonFirst (const ideal F, const poly p,int start,int end)
     4929{
     4930  if(end < 0 || end >= IDELEMS(F))
     4931    end = IDELEMS(F);
     4932  if (end<0) return 0;
     4933  if(pNext(p) == NULL) return start;
     4934  polyset set=F->m;
     4935  int o = p_Deg(p,currRing);
     4936  int op;
     4937  int i;
     4938  int an = start;
     4939  for(i=start;i<end;i++)
     4940    if(set[i] != NULL && pNext(set[i]) == NULL)
     4941      an++;
     4942  if(an == end-1)
     4943    return end;
     4944  int en= end;
     4945  loop
     4946  {
     4947    if(an>=en)
     4948      return en;
     4949    if (an == en-1)
     4950    {
     4951      op = p_Deg(set[an],currRing);
     4952      if ((op < o)
     4953      || ((op == o) && (pLtCmp(set[an],p) == -1)))
     4954        return en;
     4955      return an;
     4956    }
     4957    i=(an+en) / 2;
     4958    op = p_Deg(set[i],currRing);
     4959    if ((op < o)
     4960    || ((op == o) && (pLtCmp(set[i],p) == -1)))
     4961      an=i;
     4962    else
     4963      en=i;
    41784964  }
    41794965}
     
    50535839               LObject* p,const kStrategy /*strat*/)
    50545840{
    5055 if (length<0) return 0;
    5056 if (pLmCmp(set[length].sig,p->sig)== currRing->OrdSgn)
    5057   return length+1;
    5058 
    5059 int i;
    5060 int an = 0;
    5061 int en= length;
    5062 loop
    5063 {
    5064   if (an >= en-1)
    5065   {
    5066     if (pLmCmp(set[an].sig,p->sig) == currRing->OrdSgn) return en;
    5067     return an;
    5068   }
    5069   i=(an+en) / 2;
    5070   if (pLmCmp(set[i].sig,p->sig) == currRing->OrdSgn) an=i;
    5071   else                                      en=i;
    5072   /*aend. fuer lazy == in !=- machen */
    5073 }
     5841  if (length<0) return 0;
     5842  if (pLtCmp(set[length].sig,p->sig)== currRing->OrdSgn)
     5843    return length+1;
     5844
     5845  int i;
     5846  int an = 0;
     5847  int en= length;
     5848  loop
     5849  {
     5850    if (an >= en-1)
     5851    {
     5852      if (pLtCmp(set[an].sig,p->sig) == currRing->OrdSgn) return en;
     5853      return an;
     5854    }
     5855    i=(an+en) / 2;
     5856    if (pLtCmp(set[i].sig,p->sig) == currRing->OrdSgn) an=i;
     5857    else                                      en=i;
     5858    /*aend. fuer lazy == in !=- machen */
     5859  }
     5860}
     5861//sorts the pair list in this order: pLtCmp on the sigs, FDeg, pLtCmp on the polys
     5862int posInLSigRing (const LSet set, const int length,
     5863               LObject* p,const kStrategy /*strat*/)
     5864{
     5865  assume(currRing->OrdSgn == 1 && rField_is_Ring(currRing));
     5866  if (length<0) return 0;
     5867  if (pLtCmp(set[length].sig,p->sig)== 1)
     5868    return length+1;
     5869
     5870  int an,en,i;
     5871  an = 0;
     5872  en = length+1;
     5873  int cmp;
     5874  loop
     5875  {
     5876    if (an >= en-1)
     5877    {
     5878      if(an == en)
     5879        return en;
     5880      cmp = pLtCmp(set[an].sig,p->sig);
     5881      if (cmp == 1)
     5882        return en;
     5883      if (cmp == -1)
     5884        return an;
     5885      if (cmp == 0)
     5886      {
     5887         if (set[an].FDeg > p->FDeg)
     5888          return en;
     5889         if (set[an].FDeg < p->FDeg)
     5890          return an;
     5891         if (set[an].FDeg == p->FDeg)
     5892         {
     5893            cmp = pLtCmp(set[an].p,p->p);
     5894            if(cmp == 1)
     5895              return en;
     5896            else
     5897              return an;
     5898         }
     5899      }
     5900    }
     5901    i=(an+en) / 2;
     5902    cmp = pLtCmp(set[i].sig,p->sig);
     5903    if (cmp == 1)
     5904      an = i;
     5905    if (cmp == -1)
     5906      en = i;
     5907    if (cmp == 0)
     5908    {
     5909       if (set[i].FDeg > p->FDeg)
     5910        an = i;
     5911       if (set[i].FDeg < p->FDeg)
     5912        en = i;
     5913       if (set[i].FDeg == p->FDeg)
     5914       {
     5915          cmp = pLtCmp(set[i].p,p->p);
     5916          if(cmp == 1)
     5917            an = i;
     5918          else
     5919            en = i;
     5920       }
     5921    }
     5922  }
    50745923}
    50755924
     
    51505999{
    51516000  if (strat->syzl==0) return 0;
    5152   if (pLmCmp(strat->syz[strat->syzl-1],sig) != currRing->OrdSgn)
     6001  if (pLtCmp(strat->syz[strat->syzl-1],sig) != currRing->OrdSgn)
    51536002    return strat->syzl;
    51546003  int i;
     
    51596008    if (an >= en-1)
    51606009    {
    5161       if (pLmCmp(strat->syz[an],sig) != currRing->OrdSgn) return en;
     6010      if (pLtCmp(strat->syz[an],sig) != currRing->OrdSgn) return en;
    51626011      return an;
    51636012    }
    51646013    i=(an+en) / 2;
    5165     if (pLmCmp(strat->syz[i],sig) != currRing->OrdSgn) an=i;
     6014    if (pLtCmp(strat->syz[i],sig) != currRing->OrdSgn) an=i;
    51666015    else                                      en=i;
    51676016    /*aend. fuer lazy == in !=- machen */
     
    52426091  int i;
    52436092  int an = 0;
     6093  int en= length;
     6094  loop
     6095  {
     6096    if (an >= en-1)
     6097    {
     6098      op = set[an].GetpFDeg();
     6099      if ((op > o)
     6100      || ((op == o) && (pLtCmpOrdSgnDiffM(set[an].p,p->p))))
     6101        return en;
     6102      return an;
     6103    }
     6104    i=(an+en) / 2;
     6105    op = set[i].GetpFDeg();
     6106    if ((op > o)
     6107    || ((op == o) && (pLtCmpOrdSgnDiffM(set[i].p,p->p))))
     6108      an=i;
     6109    else
     6110      en=i;
     6111  }
     6112}
     6113
     6114int posInLF5CRing (const LSet set, int start,const int length,
     6115              LObject* p,const kStrategy strat)
     6116{
     6117  if (length<0) return 0;
     6118  if(start == (length +1)) return (length+1);
     6119  int o = p->GetpFDeg();
     6120  int op = set[length].GetpFDeg();
     6121
     6122  if ((op > o)
     6123  || ((op == o) && (pLtCmpOrdSgnDiffM(set[length].p,p->p))))
     6124    return length+1;
     6125  int i;
     6126  int an = start;
    52446127  int en= length;
    52456128  loop
     
    58906773    pWrite(pHead(strat->syz[k]));
    58916774#endif
    5892     if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing))
     6775    if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing)
     6776    #ifdef HAVE_RINGS
     6777    && (!rField_is_Ring(currRing) ||
     6778    (n_DivBy(pGetCoeff(sig), pGetCoeff(strat->syz[k]),currRing) && pLtCmp(sig,strat->syz[k]) == 1))
     6779    #endif
     6780    )
    58936781    {
    58946782//#if 1
     
    58966784      PrintS("DELETE!\n");
    58976785#endif
     6786      #if ADIDEBUG
     6787      printf("\nsyzCrit:\n");pWrite(strat->syz[k]);pWrite(sig);
     6788      #endif
     6789      strat->nrsyzcrit++;
    58986790      //printf("- T -\n\n");
    58996791      return TRUE;
     
    59396831      pWrite(pHead(strat->syz[k]));
    59406832#endif
    5941       if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing))
     6833      if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing)
     6834      #ifdef HAVE_RINGS
     6835      && (!rField_is_Ring(currRing) ||
     6836      (n_DivBy(pGetCoeff(sig), pGetCoeff(strat->syz[k]),currRing) && pLtCmp(sig,strat->syz[k]) == 1))
     6837    #endif     
     6838      )
     6839      {
     6840        #if ADIDEBUG
     6841        printf("\nsyzCrit:\n");pWrite(strat->syz[k]);pWrite(sig);
     6842        #endif
     6843        strat->nrsyzcrit++;
    59426844        return TRUE;
     6845      }
    59436846    }
    59446847    return FALSE;
     
    59526855{
    59536856  //printf("Faugere Rewritten Criterion\n");
     6857  if(rField_is_Ring(currRing))
     6858    return FALSE;
    59546859//#if 1
    59556860#ifdef DEBUGF5
     
    59656870    pWrite(pHead(strat->S[k]));
    59666871#endif
    5967     if (p_LmShortDivisibleBy(strat->sig[k], strat->sevSig[k], sig, not_sevSig, currRing))
     6872    if (p_LmShortDivisibleBy(strat->sig[k], strat->sevSig[k], sig, not_sevSig, currRing)
     6873    #ifdef HAVE_RINGS
     6874    && (!rField_is_Ring(currRing) || (n_DivBy(pGetCoeff(sig),pGetCoeff(strat->sig[k]),currRing)  && pLmCmp(sig,strat->sig[k]) == 1 ))
     6875    #endif
     6876    )
    59686877    {
    59696878//#if 1
     
    59716880      PrintS("DELETE!\n");
    59726881#endif
     6882      #if ADIDEBUG
     6883      printf("\nFaugere RewCrit: * divisible by *\n");pWrite(sig);pWrite(strat->sig[k]);
     6884      #endif
     6885      strat->nrrewcrit++;
    59736886      return TRUE;
    59746887    }
     
    60076920BOOLEAN arriRewCriterion(poly /*sig*/, unsigned long /*not_sevSig*/, poly /*lm*/, kStrategy strat, int start=0)
    60086921{
     6922  return FALSE;
    60096923  poly p1 = pOne();
    60106924  poly p2 = pOne();
    60116925  for (int ii=strat->sl; ii>start; ii--)
    60126926  {
    6013     if (p_LmShortDivisibleBy(strat->sig[ii], strat->sevSig[ii], strat->P.sig, ~strat->P.sevSig, currRing))
     6927    if (p_LmShortDivisibleBy(strat->sig[ii], strat->sevSig[ii], strat->P.sig, ~strat->P.sevSig, currRing)
     6928    #ifdef HAVE_RINGS
     6929    && (!(rField_is_Ring(currRing)) || n_DivBy(pGetCoeff(strat->P.sig),pGetCoeff(strat->sig[ii]),currRing))
     6930    #endif
     6931    )
    60146932    {
    60156933      p_ExpVectorSum(p1,strat->P.sig,strat->S[ii],currRing);
    60166934      p_ExpVectorSum(p2,strat->sig[ii],strat->P.p,currRing);
     6935      #ifdef HAVE_RINGS
     6936      if((rField_is_Ring(currRing) && !(pLtCmp(p1,p2) == 1))
     6937        || (!rField_is_Ring(currRing) && !(pLmCmp(p1,p2) == 1)))
     6938      #else
    60176939      if (!(pLmCmp(p1,p2) == 1))
    6018       {
     6940      #endif
     6941      {
     6942        #if ADIDEBUG
     6943        printf("\narriRewCrit deleted: sig, P.sig\n");
     6944       
     6945        #endif
    60196946        pDelete(&p1);
    60206947        pDelete(&p2);
     
    60306957BOOLEAN arriRewCriterionPre(poly sig, unsigned long not_sevSig, poly lm, kStrategy strat, int /*start=0*/)
    60316958{
     6959  #ifdef HAVE_RINGS
     6960  //Over Rings, there are still some changes to do: considering coeffs
     6961  if(rField_is_Ring(currRing))
     6962    return FALSE;
     6963  #endif
    60326964  int found = -1;
    6033   for (int i=strat->Bl; i>-1; i--)
    6034   {
    6035     if (pLmEqual(strat->B[i].sig,sig))
     6965  for (int i=strat->Bl; i>-1; i--) {
     6966    if (pLmEqual(strat->B[i].sig,sig)
     6967    #ifdef HAVE_RINGS
     6968    && (rField_is_Ring(currRing) && n_Equal(pGetCoeff(strat->B[i].sig),pGetCoeff(sig),currRing))
     6969    #endif
     6970    )
    60366971    {
    60376972      found = i;
     
    65657500  //Print("%d/%d polynomials in set L (for lazy alg.)",lrmax+1,strat->Lmax);
    65667501  Print("product criterion:%d chain criterion:%d\n",strat->cp,strat->c3);
     7502  if (hilbcount!=0) Print("hilbert series criterion:%d\n",hilbcount);
     7503  /* in usual case strat->cv is 0, it gets changed only in shift routines */
     7504  if (strat->cv!=0) Print("shift V criterion:%d\n",strat->cv);
     7505  /*mflush();*/
     7506}
     7507
     7508void messageStatSBA (int hilbcount,kStrategy strat)
     7509{
     7510  //PrintS("\nUsage/Allocation of temporary storage:\n");
     7511  //Print("%d/%d polynomials in standard base\n",srmax,IDELEMS(Shdl));
     7512  //Print("%d/%d polynomials in set L (for lazy alg.)",lrmax+1,strat->Lmax);
     7513  Print("syz criterion:%d rew criterion:%d\n",strat->nrsyzcrit,strat->nrrewcrit);
     7514  //Print("product criterion:%d chain criterion:%d\n",strat->cp,strat->c3);
    65677515  if (hilbcount!=0) Print("hilbert series criterion:%d\n",hilbcount);
    65687516  /* in usual case strat->cv is 0, it gets changed only in shift routines */
     
    69747922  if( strat->S[0] )
    69757923  {
    6976     if( strat->S[1] )
     7924    if( strat->S[1] && !rField_is_Ring(currRing))
    69777925    {
    69787926      omFreeSize(strat->syzIdx,(strat->syzidxmax)*sizeof(int));
     
    70417989        {
    70427990          Q.sig          = pOne();
     7991          #ifdef HAVE_RINGS
     7992          if(rField_is_Ring(currRing))
     7993            p_SetCoeff(Q.sig,nCopy(p_GetCoeff(strat->S[k],currRing)),currRing);
     7994          #endif
    70437995          p_ExpVectorCopy(Q.sig,strat->S[k],currRing);
    70447996          p_SetCompP (Q.sig, comp, currRing);
    70457997          poly q          = p_One(currRing);
     7998          #ifdef HAVE_RINGS
     7999          if(rField_is_Ring(currRing))
     8000            p_SetCoeff(q,nCopy(p_GetCoeff(strat->S[i],currRing)),currRing);
     8001          #endif
    70468002          p_ExpVectorCopy(q,strat->S[i],currRing);
    70478003          q               = p_Neg (q, currRing);
     
    70818037    {
    70828038      Q.sig          = pOne();
     8039      #ifdef HAVE_RINGS
     8040      if(rField_is_Ring(currRing))
     8041        p_SetCoeff(Q.sig,nCopy(p_GetCoeff(strat->S[k],currRing)),currRing);
     8042      #endif
    70838043      p_ExpVectorCopy(Q.sig,strat->S[k],currRing);
    70848044      p_SetCompP (Q.sig, comp, currRing);
    70858045      poly q          = p_One(currRing);
     8046      #ifdef HAVE_RINGS
     8047      if(rField_is_Ring(currRing))
     8048        p_SetCoeff(q,nCopy(p_GetCoeff(strat->L[strat->Ll].p,currRing)),currRing);
     8049      #endif
    70868050      p_ExpVectorCopy(q,strat->L[strat->Ll].p,currRing);
    70878051      q               = p_Neg (q, currRing);
     
    79598923  // appear due to the fact that the critical pairs are already sorted
    79608924  // by increasing signature.
     8925  // True. However, in the case of integers we need to put the element
     8926  // that caused the signature drop on the first position
    79618927  if (atS <= strat->sl)
    79628928  {
     
    79648930    memmove(&(strat->S[atS+1]), &(strat->S[atS]),
    79658931            (strat->sl - atS + 1)*sizeof(poly));
     8932    memmove(&(strat->sig[atS+1]), &(strat->sig[atS]),
     8933            (strat->sl - atS + 1)*sizeof(poly));
     8934    memmove(&(strat->sevSig[atS+1]), &(strat->sevSig[atS]),
     8935            (strat->sl - atS + 1)*sizeof(unsigned long));
    79668936    memmove(&(strat->ecartS[atS+1]), &(strat->ecartS[atS]),
    79678937            (strat->sl - atS + 1)*sizeof(int));
     
    79838953      strat->sevS[i] = strat->sevS[i-1];
    79848954      strat->S_2_R[i] = strat->S_2_R[i-1];
     8955      strat->sig[i] = strat->sig[i-1];
     8956      strat->sevSig[i] = strat->sevSig[i-1];
    79858957    }
    79868958    if (strat->lenS!=NULL)
     
    81079079  #if ADIDEBUG
    81089080  printf("\nenterT: add in position %i\n",atT);
    8109   pWrite(p.p);
     9081  pWrite(p.p);pWrite(p.sig);
    81109082  #endif
    81119083  //printf("\nenterT: neue hingefÃŒgt: lÀnge = %i, ecart = %i\n",p.length,p.ecart);
     
    82429214void enterSyz(LObject &p, kStrategy strat, int atT)
    82439215{
     9216  #if ADIDEBUG
     9217  printf("\n  Entersyz:\n");pWrite(p.sig);
     9218  #endif
    82449219  int i;
    82459220  strat->newt = TRUE;
     
    82719246  //i = strat->syzl;
    82729247  i = atT;
     9248  //Makes sure the syz saves just the signature
     9249  #ifdef HAVE_RINGS
     9250  if(rField_is_Ring(currRing))
     9251    pNext(p.sig) = NULL;
     9252  #endif
    82739253  strat->syz[atT] = p.sig;
    82749254  strat->sevSyz[atT] = p.sevSig;
     
    82829262  while (cc>-1)
    82839263  {
     9264    //printf("\nCheck if syz is div by L\n");pWrite(strat->syz[atT]);pWrite(strat->L[cc].sig);
     9265    //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);
    82849266    if (p_LmShortDivisibleBy( strat->syz[atT], strat->sevSyz[atT],
    8285                               strat->L[cc].sig, ~strat->L[cc].sevSig, currRing))
    8286     {
     9267                              strat->L[cc].sig, ~strat->L[cc].sevSig, currRing)
     9268                              #ifdef HAVE_RINGS
     9269                              &&(rField_is_Ring(currRing))
     9270                              && n_DivBy(pGetCoeff(strat->L[cc].sig),pGetCoeff(strat->syz[atT]),currRing) && (pLtCmp(strat->L[cc].sig,strat->syz[atT])==1)
     9271                              #endif
     9272                              )
     9273    {
     9274      //printf("\nYES!\n");
     9275      #if ADIDEBUG
     9276      printf("\n syzCrit deleted!\n");pWrite(strat->L[cc].p);pWrite(strat->L[cc].sig);
     9277      #endif
    82879278      deleteInL(strat->L,&strat->Ll,cc,strat);
    82889279    }
     
    88259816  else if (BTEST1(12) || BTEST1(14) || BTEST1(16) || BTEST1(18))
    88269817    strat->posInT = posInT1;
    8827 #ifdef HAVE_RINGS
    88289818  if (rField_is_Ring(currRing))
    88299819  {
     
    88339823    strat->posInT = posInT11;
    88349824  }
    8835 #endif
    88369825  strat->posInLDependsOnLength = FALSE;
    88379826  strat->posInLSba  = posInLSig;
    88389827  //strat->posInL     = posInLSig;
    88399828  strat->posInL     = posInLF5C;
     9829  /*
     9830  if (rField_is_Ring(currRing))
     9831  {
     9832    strat->posInLSba  = posInLSigRing;
     9833    strat->posInL     = posInL11Ring;
     9834  }*/
    88409835  //strat->posInT     = posInTSig;
    88419836}
     
    89019896    else
    89029897    {
    8903       /*Shdl=*/initSLSba(F, Q,strat); /*sets also S, ecartS, fromQ */
    8904       // /*Shdl=*/initS(F, Q,strat); /*sets also S, ecartS, fromQ */
     9898      initSLSba(F, Q,strat); /*sets also S, ecartS, fromQ */
    89059899    }
    89069900  }
     
    89259919  omFreeSize((ADDRESS)strat->sevS,IDELEMS(strat->Shdl)*sizeof(unsigned long));
    89269920  omFreeSize((ADDRESS)strat->sevSig,IDELEMS(strat->Shdl)*sizeof(unsigned long));
    8927   omFreeSize((ADDRESS)strat->syz,(strat->syzmax)*sizeof(poly));
    8928   omFreeSize((ADDRESS)strat->sevSyz,(strat->syzmax)*sizeof(unsigned long));
    8929   if (strat->sbaOrder == 1)
    8930   {
    8931     omFreeSize(strat->syzIdx,(strat->syzidxmax)*sizeof(int));
     9921  if(strat->syzmax>0)
     9922  {
     9923    omFreeSize((ADDRESS)strat->syz,(strat->syzmax)*sizeof(poly));
     9924    omFreeSize((ADDRESS)strat->sevSyz,(strat->syzmax)*sizeof(unsigned long));
     9925    if (strat->sbaOrder == 1)
     9926    {
     9927      omFreeSize(strat->syzIdx,(strat->syzidxmax)*sizeof(int));
     9928    }
    89329929  }
    89339930  omFreeSize(strat->S_2_R,IDELEMS(strat->Shdl)*sizeof(int));
     
    959410591      //pWrite(p);
    959510592      //pWrite(strat->S[i]);
    9596       while(ok == FALSE)
     10593      while(ok == FALSE && p != NULL)
    959710594      {
    959810595        if(pLmDivisibleBy(strat->S[i], p))
     
    960410601        {
    960510602          pLmDelete(&p);
     10603          h->p = p;
    960610604          deleted = TRUE;
    960710605        }
     
    964210640    strat->initEcart(h);
    964310641}
    9644 #endif
    9645 
    9646 #ifdef HAVE_RINGS
     10642
     10643void postReduceByMonSig(LObject* h, kStrategy strat)
     10644{
     10645  if(!nCoeff_is_Ring_Z(currRing->cf))
     10646      return;
     10647  poly hSig = h->sig;
     10648  poly pH = h->GetP();
     10649  poly p,pp;
     10650  p = pH;
     10651  bool deleted = FALSE, ok = FALSE;
     10652  for(int i = 0; i<=strat->sl; i++)
     10653  {
     10654    p = pH;
     10655    if(pNext(strat->S[i]) == NULL)
     10656    {
     10657      while(ok == FALSE && p!=NULL)
     10658      {
     10659        if(pLmDivisibleBy(strat->S[i], p))
     10660        {
     10661          poly sigMult = pDivideM(pHead(p),pHead(strat->S[i]));
     10662          sigMult = ppMult_mm(sigMult,pCopy(strat->sig[i]));
     10663          if(sigMult!= NULL && pLtCmp(hSig,sigMult) == 1)
     10664          {
     10665            number dummy = n_IntMod(p->coef, strat->S[i]->coef, currRing->cf);
     10666            p_SetCoeff(p,dummy,currRing);
     10667          }
     10668          pDelete(&sigMult);
     10669        }
     10670        if(nIsZero(p->coef))
     10671        {
     10672          pLmDelete(&p);
     10673          h->p = p;
     10674          deleted = TRUE;
     10675        }
     10676        else
     10677        {
     10678          ok = TRUE;
     10679        }
     10680      }
     10681      pp = pNext(p);
     10682      while(pp != NULL)
     10683      {
     10684        if(pLmDivisibleBy(strat->S[i], pp))
     10685        {
     10686          poly sigMult = pDivideM(pHead(p),pHead(strat->S[i]));
     10687          sigMult = ppMult_mm(sigMult,pCopy(strat->sig[i]));
     10688          if(sigMult!= NULL && pLtCmp(hSig,sigMult) == 1)
     10689          {
     10690            number dummy = n_IntMod(pp->coef, strat->S[i]->coef, currRing->cf);
     10691            p_SetCoeff(pp,dummy,currRing);
     10692            if(nIsZero(pp->coef))
     10693            {
     10694              pLmDelete(&pNext(p));
     10695              pp = pNext(p);
     10696              deleted = TRUE;
     10697            }
     10698            else
     10699            {
     10700              p = pp;
     10701              pp = pNext(p);
     10702            }
     10703          }
     10704          else
     10705          {
     10706            p = pp;
     10707            pp = pNext(p);
     10708          }
     10709          pDelete(&sigMult);
     10710        }
     10711        else
     10712        {
     10713          p = pp;
     10714          pp = pNext(p);
     10715        }
     10716      }
     10717    }
     10718  }
     10719  h->SetLmCurrRing();
     10720  if(deleted)
     10721    strat->initEcart(h);
     10722 
     10723}
     10724
    964710725/*!
    964810726  used for GB over ZZ: final reduction by constant elements
     
    1008811166  if (lmBin != NULL)
    1008911167    omMergeStickyBinIntoBin(lmBin, currRing->PolyBin);
    10090   if (tailBin != NULL)
     11168  if (tailBin != NULL && !rField_is_Ring(currRing))
    1009111169    omMergeStickyBinIntoBin(tailBin,
    1009211170                            (tailRing != NULL ? tailRing->PolyBin:
  • kernel/GBEngine/kutil.h

    r34183a rc66a53  
    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 nrrewcrit; // counts how many pairs are deleted by FaugereRewCrit
     361  int sbaEnterS; // sba over Z strategy: if sigdrop element has _*gen(sbaEnterS+1), then
     362                 // add directly sbaEnterS elements into S
     363  int blockred;  // counter for blocked reductions in redSig
     364  int blockredmax;
     365  #endif
    357366  #ifdef HAVE_SHIFTBBA
    358367  int lV;
     
    419428int posInS (const kStrategy strat, const int length, const poly p,
    420429            const int ecart_p);
     430int posInSMonFirst (const kStrategy strat, const int length, const poly p,
     431            const int ecart_p);
     432int posInIdealMonFirst (const ideal F, const poly p,int start = 0,int end = -1);
    421433int posInT0 (const TSet set,const int length,LObject &p);
    422434int posInT1 (const TSet set,const int length,LObject &p);
     
    447459int posInLSig (const LSet set, const int length,
    448460               LObject* L,const kStrategy strat);
     461int posInLSigRing (const LSet set, const int length,
     462               LObject* L,const kStrategy strat);
    449463int posInLRing (const LSet set, const int length,
    450464               LObject* L,const kStrategy strat);
     
    455469             LObject* L,const kStrategy strat);
    456470int posInL11Ring (const LSet set, const int length,
     471             LObject* L,const kStrategy strat);
     472int posInLF5CRing (const LSet set, int start , const int length,
    457473             LObject* L,const kStrategy strat);
    458474int posInL11Ringls (const LSet set, const int length,
     
    492508int redRiloc (LObject* h,kStrategy strat);
    493509void enterExtendedSpoly(poly h,kStrategy strat);
     510void enterExtendedSpolySig(poly h,poly hSig,kStrategy strat);
    494511void superenterpairs (poly h,int k,int ecart,int pos,kStrategy strat, int atR = -1);
     512void superenterpairsSig (poly h,poly hSig,int hFrom,int k,int ecart,int pos,kStrategy strat, int atR = -1);
    495513poly kCreateZeroPoly(long exp[], long cabsind, poly* t_p, ring leadRing, ring tailRing);
    496514long ind2(long arg);
     
    509527void pairs ();
    510528BOOLEAN enterOneStrongPoly (int i,poly p,int /*ecart*/, int /*isFromQ*/,kStrategy strat, int atR = -1, bool enterTstrong = FALSE);
     529BOOLEAN sbaCheckGcdPair (LObject* h,kStrategy strat);
     530BOOLEAN enterOneStrongPolySig (int i,poly p,poly sig,int /*ecart*/, int /*isFromQ*/,kStrategy strat, int atR = -1);
    511531void message (int i,int* reduc,int* olddeg,kStrategy strat,int red_result);
    512532void messageStat (int hilbcount,kStrategy strat);
     533void messageStatSBA (int hilbcount,kStrategy strat);
    513534#ifdef KDEBUG
    514535void messageSets (kStrategy strat);
     
    751772poly preIntegerCheck(ideal F, ideal Q);
    752773void postReduceByMon(LObject* h, kStrategy strat);
     774void postReduceByMonSig(LObject* h, kStrategy strat);
    753775void finalReduceByMon(kStrategy strat);
    754776#endif
  • kernel/GBEngine/nc.cc

    r1798a0 rc66a53  
    306306    h2->m[j]=0;
    307307    }
    308     // W[1..idElems(I)]
     308    // W[1..IDELEMS(I)]
    309309    if (flag >0)
    310310    {
  • kernel/GBEngine/syz1.cc

    r1798a0 rc66a53  
    19921992      while ((k<syzstr->length) && (rr[k]!=NULL))
    19931993      {
    1994         (*resolution)[k+1] = idSize(rr[k]);
     1994        (*resolution)[k+1] = idElem(rr[k]);
    19951995        k++;
    19961996      }
  • kernel/GBEngine/syz3.cc

    r1798a0 rc66a53  
    238238* only for tests
    239239*/
    240 #ifdef SING_NDEBUG
    241 static void syTestPairs(SSet resPairs,int length,ideal /*old_generators*/)
    242 #else
    243240static void syTestPairs(SSet resPairs,int length,ideal old_generators)
    244 #endif
    245241{
    246242  int i=0;
  • kernel/ideals.h

    r1798a0 rc66a53  
    3838//int id_PosConstant(ideal id, const ring r)
    3939#define idPosConstant(I) id_PosConstant(I,currRing)
    40 
    41 /// Count the effective size of an ideal
    42 /// (without the trailing allocated zero-elements)
    43 /// deprecated! (use IDELEMS)
    44 static inline int idSize(const ideal id)
    45 {
    46   int j = IDELEMS(id) - 1;
    47   poly* mm = id->m;
    48   while ((j >= 0) && (mm[j] == NULL)) j--;
    49   return (j + 1);
    50 }
    51 
    5240
    5341//BOOLEAN id_IsConstant(ideal id, const ring r);
  • kernel/numeric/mpr_base.cc

    r1798a0 rc66a53  
    31223122    for ( i= tdg; i >= 0; i-- )
    31233123    {
    3124       //if ( piter ) Print("deg %d, pDeg(piter) %d\n",i,pTotaldegree(piter));
    31253124      if ( piter && pTotaldegree(piter) == i )
    31263125      {
  • kernel/polys.h

    r34183a rc66a53  
    122122
    123123#define pLtCmp(p,q)            p_LtCmp(p,q,currRing)
     124#define pLtCmpNoAbs(p,q)       p_LtCmpNoAbs(p,q,currRing)
    124125#define pLtCmpOrdSgnDiffM(p,q) p_LtCmpOrdSgnDiffM(p,q,currRing)
    125126#define pLtCmpOrdSgnDiffP(p,q) p_LtCmpOrdSgnDiffP(p,q,currRing)
Note: See TracChangeset for help on using the changeset viewer.