source: git/kernel/kstd2.cc @ 9f34ee

fieker-DuValspielwiese
Last change on this file since 9f34ee was e81572c, checked in by Hans Schoenemann <hannes@…>, 13 years ago
code cleanup: kFindDivisibleByZeroPoly git-svn-id: file:///usr/local/Singular/svn/trunk@13695 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 50.2 KB
RevLine 
[35aab3]1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
[341696]4/* $Id$ */
[35aab3]5/*
6*  ABSTRACT -  Kernel: alg. of Buchberger
7*/
8
9// #define PDEBUG 2
[645a19]10
11// TODO: why the following is here instead of mod2.h???
12
[35aab3]13// define to enable tailRings
[60eb1d]14#define HAVE_TAIL_RING
[645a19]15
[599326]16#include <kernel/mod2.h>
[645a19]17
18#ifndef NDEBUG
19# define MYTEST 0
20#else /* ifndef NDEBUG */
21# define MYTEST 0
22#endif /* ifndef NDEBUG */
23
[8d679fd]24#if MYTEST
[645a19]25# ifdef HAVE_TAIL_RING
26#  undef HAVE_TAIL_RING
27# endif // ifdef HAVE_TAIL_RING
28#endif
29
[35aab3]30// define if no buckets should be used
31// #define NO_BUCKETS
32
[cbc616]33#ifdef HAVE_PLURAL
34#define PLURAL_INTERNAL_DECLARATIONS 1
35#endif
[599326]36#include <kernel/kutil.h>
37#include <kernel/options.h>
[b1dfaf]38#include <omalloc/omalloc.h>
[599326]39#include <kernel/polys.h>
40#include <kernel/ideals.h>
41#include <kernel/febase.h>
42#include <kernel/kstd1.h>
43#include <kernel/khstd.h>
44#include <kernel/kbuckets.h>
[35aab3]45//#include "cntrlc.h"
[599326]46#include <kernel/weight.h>
47#include <kernel/intvec.h>
[35aab3]48#ifdef HAVE_PLURAL
[599326]49#include <kernel/gring.h>
[35aab3]50#endif
51// #include "timer.h"
52
[cb0fbe]53/* shiftgb stuff */
[599326]54#include <kernel/shiftgb.h>
[cb0fbe]55
[57fad3a]56  int (*test_PosInT)(const TSet T,const int tl,LObject &h);
57  int (*test_PosInL)(const LSet set, const int length,
58                LObject* L,const kStrategy strat);
59
[35aab3]60// return -1 if no divisor is found
61//        number of first divisor, otherwise
62int kFindDivisibleByInT(const TSet &T, const unsigned long* sevT,
63                        const int tl, const LObject* L, const int start)
64{
65  unsigned long not_sev = ~L->sev;
66  int j = start;
[dd2855]67  poly p=L->p;
68  ring r=currRing;
69  if (p==NULL)  { r=L->tailRing; p=L->t_p; }
[35aab3]70  L->GetLm(p, r);
71
72  pAssume(~not_sev == p_GetShortExpVector(p, r));
73
74  if (r == currRing)
75  {
76    loop
77    {
78      if (j > tl) return -1;
79#if defined(PDEBUG) || defined(PDIV_DEBUG)
80      if (p_LmShortDivisibleBy(T[j].p, sevT[j],
81                               p, not_sev, r))
82        return j;
83#else
84      if (!(sevT[j] & not_sev) &&
85          p_LmDivisibleBy(T[j].p, p, r))
86        return j;
87#endif
88      j++;
89    }
90  }
91  else
92  {
93    loop
94    {
95      if (j > tl) return -1;
96#if defined(PDEBUG) || defined(PDIV_DEBUG)
97      if (p_LmShortDivisibleBy(T[j].t_p, sevT[j],
98                               p, not_sev, r))
99        return j;
100#else
101      if (!(sevT[j] & not_sev) &&
102          p_LmDivisibleBy(T[j].t_p, p, r))
103        return j;
104#endif
105      j++;
106    }
107  }
108}
109
110// same as above, only with set S
[391323]111int kFindDivisibleByInS(const kStrategy strat, int* max_ind, LObject* L)
[35aab3]112{
113  unsigned long not_sev = ~L->sev;
114  poly p = L->GetLmCurrRing();
115  int j = 0;
116
117  pAssume(~not_sev == p_GetShortExpVector(p, currRing));
[dd60f3c]118#if 1
119  int ende;
[24ed65]120  if ((strat->ak>0) || pLexOrder) ende=strat->sl;
[dd60f3c]121  else ende=posInS(strat,*max_ind,p,0)+1;
[f41bd9]122  if (ende>(*max_ind)) ende=(*max_ind);
123#else
[e690a91]124  int ende=strat->sl;
[b2c236]125#endif
[391323]126  (*max_ind)=ende;
[35aab3]127  loop
128  {
[efb860]129    if (j > ende) return -1;
[35aab3]130#if defined(PDEBUG) || defined(PDIV_DEBUG)
[efb860]131    if (p_LmShortDivisibleBy(strat->S[j], strat->sevS[j],
[35aab3]132                             p, not_sev, currRing))
133        return j;
134#else
[efb860]135    if ( !(strat->sevS[j] & not_sev) &&
136         p_LmDivisibleBy(strat->S[j], p, currRing))
[35aab3]137      return j;
138#endif
139    j++;
140  }
141}
142
[7ba059]143int kFindNextDivisibleByInS(const kStrategy strat, int start,int max_ind, LObject* L)
144{
145  unsigned long not_sev = ~L->sev;
146  poly p = L->GetLmCurrRing();
147  int j = start;
148
149  pAssume(~not_sev == p_GetShortExpVector(p, currRing));
150#if 1
151  int ende=max_ind;
152#else
153  int ende=strat->sl;
154#endif
155  loop
156  {
157    if (j > ende) return -1;
158#if defined(PDEBUG) || defined(PDIV_DEBUG)
159    if (p_LmShortDivisibleBy(strat->S[j], strat->sevS[j],
160                             p, not_sev, currRing))
161        return j;
162#else
163    if ( !(strat->sevS[j] & not_sev) &&
164         p_LmDivisibleBy(strat->S[j], p, currRing))
165      return j;
166#endif
167    j++;
168  }
169}
170
[c90b43]171#ifdef HAVE_RINGS
[a09a42]172poly kFindZeroPoly(poly input_p, ring leadRing, ring tailRing)
173{
[cea6f3]174  // m = currRing->ch
175
[a6889e]176  if (input_p == NULL) return NULL;
177
178  poly p = input_p;
[cea6f3]179  poly zeroPoly = NULL;
[994445]180  NATNUMBER a = (NATNUMBER) pGetCoeff(p);
[cea6f3]181
[fe7f527]182  int k_ind2 = 0;
183  int a_ind2 = ind2(a);
[cea6f3]184
[994445]185  NATNUMBER k = 1;
[6d09f28]186  // of interest is only k_ind2, special routine for improvement ... TODO OLIVER
[fe7f527]187  for (int i = 1; i <= leadRing->N; i++)
[a09a42]188  {
[fe7f527]189    k_ind2 = k_ind2 + ind_fact_2(p_GetExp(p, i, leadRing));
[cea6f3]190  }
[fe7f527]191
[994445]192  a = (NATNUMBER) pGetCoeff(p);
[cea6f3]193
194  number tmp1;
195  poly tmp2, tmp3;
[fe7f527]196  poly lead_mult = p_ISet(1, tailRing);
[a09a42]197  if (leadRing->ch <= k_ind2 + a_ind2)
198  {
[fe7f527]199    int too_much = k_ind2 + a_ind2 - leadRing->ch;
200    int s_exp;
[a6889e]201    zeroPoly = p_ISet(a, tailRing);
[a09a42]202    for (int i = 1; i <= leadRing->N; i++)
203    {
[fe7f527]204      s_exp = p_GetExp(p, i,leadRing);
[388f91e]205      if (s_exp % 2 != 0)
[fe7f527]206      {
207        s_exp = s_exp - 1;
208      }
209      while ( (0 < ind2(s_exp)) && (ind2(s_exp) <= too_much) )
210      {
211        too_much = too_much - ind2(s_exp);
212        s_exp = s_exp - 2;
213      }
[388f91e]214      p_SetExp(lead_mult, i, p_GetExp(p, i,leadRing) - s_exp, tailRing);
[994445]215      for (NATNUMBER j = 1; j <= s_exp; j++)
[a09a42]216      {
[cea6f3]217        tmp1 = nInit(j);
[a6889e]218        tmp2 = p_ISet(1, tailRing);
219        p_SetExp(tmp2, i, 1, tailRing);
220        p_Setm(tmp2, tailRing);
[a09a42]221        if (nIsZero(tmp1))
[fe7f527]222        { // should nowbe obsolet, test ! TODO OLIVER
[a6889e]223          zeroPoly = p_Mult_q(zeroPoly, tmp2, tailRing);
[cea6f3]224        }
[a09a42]225        else
226        {
[f92547]227          tmp3 = p_NSet(nCopy(tmp1), tailRing);
[fe7f527]228          zeroPoly = p_Mult_q(zeroPoly, p_Add_q(tmp3, tmp2, tailRing), tailRing);
[cea6f3]229        }
230      }
231    }
[fe7f527]232    p_Setm(lead_mult, tailRing);
[388f91e]233    zeroPoly = p_Mult_mm(zeroPoly, lead_mult, tailRing);
[f92547]234    tmp2 = p_NSet(nCopy(pGetCoeff(zeroPoly)), leadRing);
[977f94]235    for (int i = 1; i <= leadRing->N; i++)
236    {
[a725dae]237      pSetExp(tmp2, i, p_GetExp(zeroPoly, i, tailRing));
[cea6f3]238    }
[7f06cca]239    p_Setm(tmp2, leadRing);
240    zeroPoly = p_LmDeleteAndNext(zeroPoly, tailRing);
[cea6f3]241    pNext(tmp2) = zeroPoly;
242    return tmp2;
243  }
[994445]244/*  NATNUMBER alpha_k = twoPow(leadRing->ch - k_ind2);
[977f94]245  if (1 == 0 && alpha_k <= a)
246  {  // Temporarly disabled, reducing coefficients not compatible with std TODO Oliver
[7f06cca]247    zeroPoly = p_ISet((a / alpha_k)*alpha_k, tailRing);
[977f94]248    for (int i = 1; i <= leadRing->N; i++)
249    {
[994445]250      for (NATNUMBER j = 1; j <= p_GetExp(p, i, leadRing); j++)
[977f94]251      {
[7f06cca]252        tmp1 = nInit(j);
253        tmp2 = p_ISet(1, tailRing);
254        p_SetExp(tmp2, i, 1, tailRing);
255        p_Setm(tmp2, tailRing);
[977f94]256        if (nIsZero(tmp1))
257        {
[7f06cca]258          zeroPoly = p_Mult_q(zeroPoly, tmp2, tailRing);
259        }
[977f94]260        else
261        {
[994445]262          tmp3 = p_ISet((NATNUMBER) tmp1, tailRing);
[7f06cca]263          zeroPoly = p_Mult_q(zeroPoly, p_Add_q(tmp2, tmp3, tailRing), tailRing);
264        }
265      }
266    }
[994445]267    tmp2 = p_ISet((NATNUMBER) pGetCoeff(zeroPoly), leadRing);
[977f94]268    for (int i = 1; i <= leadRing->N; i++)
269    {
[a725dae]270      pSetExp(tmp2, i, p_GetExp(zeroPoly, i, tailRing));
[7f06cca]271    }
272    p_Setm(tmp2, leadRing);
273    zeroPoly = p_LmDeleteAndNext(zeroPoly, tailRing);
274    pNext(tmp2) = zeroPoly;
275    return tmp2;
[6d09f28]276  } */
[cea6f3]277  return NULL;
278}
[206e158]279#endif
[a6889e]280
[206e158]281
282#ifdef HAVE_RINGS
[585bbcb]283/*2
284*  reduction procedure for the ring Z/2^m
285*/
[093f30e]286int redRing (LObject* h,kStrategy strat)
[585bbcb]287{
[8d679fd]288  if (h->IsNull()) return 0; // spoly is zero (can only occure with zero divisors)
289  if (strat->tl<0) return 1;
[cea6f3]290
[d5564f8]291  int at,i;
292  long d;
[585bbcb]293  int j = 0;
294  int pass = 0;
[e342a2]295  poly zeroPoly = NULL;
[cea6f3]296
[388f91e]297// TODO warum SetpFDeg notwendig?
[cea6f3]298  h->SetpFDeg();
299  assume(h->pFDeg() == h->FDeg);
[388f91e]300  long reddeg = h->GetpFDeg();
[585bbcb]301
[fe7f527]302  h->SetShortExpVector();
[585bbcb]303  loop
304  {
[8d679fd]305    j = kFindDivisibleByInT(strat->T, strat->sevT, strat->tl, h);
306    if (j < 0) return 1;
[585bbcb]307
[94ebce]308    ksReducePoly(h, &(strat->T[j]), NULL, NULL, strat); // with debug output
[585bbcb]309
310    if (h->GetLmTailRing() == NULL)
311    {
[a539ad]312      if (h->lcm!=NULL) pLmDelete(h->lcm);
[585bbcb]313#ifdef KDEBUG
314      h->lcm=NULL;
315#endif
[8d679fd]316      h->Clear();
[585bbcb]317      return 0;
318    }
319    h->SetShortExpVector();
320    d = h->SetpFDeg();
321    /*- try to reduce the s-polynomial -*/
322    pass++;
[228b631]323    if (!TEST_OPT_REDTHROUGH &&
[585bbcb]324        (strat->Ll >= 0) && ((d > reddeg) || (pass > strat->LazyPass)))
325    {
326      h->SetLmCurrRing();
[8d679fd]327      if (strat->posInLDependsOnLength)
328        h->SetLength(strat->length_pLength);
[585bbcb]329      at = strat->posInL(strat->L,strat->Ll,h,strat);
330      if (at <= strat->Ll)
331      {
332#ifdef KDEBUG
333        if (TEST_OPT_DEBUG) Print(" ->L[%d]\n",at);
334#endif
[cea6f3]335        enterL(&strat->L,&strat->Ll,&strat->Lmax,*h,at);     // NOT RING CHECKED OLIVER
[585bbcb]336        h->Clear();
337        return -1;
338      }
339    }
[8d679fd]340    if (d != reddeg)
[585bbcb]341    {
[d5564f8]342      if (d >= strat->tailRing->bitmask)
[f7feb7]343      {
[8d679fd]344        if (h->pTotalDeg() >= strat->tailRing->bitmask)
345        {
346          strat->overflow=TRUE;
[d5564f8]347          //Print("OVERFLOW in redRing d=%ld, max=%ld\n",d,strat->tailRing->bitmask);
[8d679fd]348          h->GetP();
349          at = strat->posInL(strat->L,strat->Ll,h,strat);
350          enterL(&strat->L,&strat->Ll,&strat->Lmax,*h,at);
351          h->Clear();
[d5564f8]352          return -1;
353        }
[f7feb7]354      }
355      else if ((TEST_OPT_PROT) && (strat->Ll < 0))
356      {
[dd8a7d]357        Print(".%ld",d);mflush();
[f7feb7]358        reddeg = d;
359      }
[585bbcb]360    }
361  }
362}
363#endif
364
[35aab3]365/*2
366*  reduction procedure for the homogeneous case
367*  and the case of a degree-ordering
368*/
369int redHomog (LObject* h,kStrategy strat)
370{
[bdde4f4]371  if (strat->tl<0) return 1;
372  //if (h->GetLmTailRing()==NULL) return 0; // HS: SHOULD NOT BE NEEDED!
373  assume(h->FDeg == h->pFDeg());
374
375  poly h_p;
[225d94]376  int i,j,at,pass, ii;
[bdde4f4]377  unsigned long not_sev;
378  long reddeg,d;
379
380  pass = j = 0;
381  d = reddeg = h->GetpFDeg();
382  h->SetShortExpVector();
383  int li;
384  h_p = h->GetLmTailRing();
385  not_sev = ~ h->sev;
[35aab3]386  loop
387  {
388    j = kFindDivisibleByInT(strat->T, strat->sevT, strat->tl, h);
[bdde4f4]389    if (j < 0) return 1;
390
391    li = strat->T[j].pLength;
392    ii = j;
393    /*
394     * the polynomial to reduce with (up to the moment) is;
395     * pi with length li
396     */
397    i = j;
398#if 1
[8c36a9]399    if (TEST_OPT_LENGTH)
[bdde4f4]400    loop
[35aab3]401    {
[bdde4f4]402      /*- search the shortest possible with respect to length -*/
403      i++;
404      if (i > strat->tl)
405        break;
406      if (li<=1)
407        break;
408      if ((strat->T[i].pLength < li)
409         &&
410          p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i],
411                               h_p, not_sev, strat->tailRing))
412      {
413        /*
414         * the polynomial to reduce with is now;
415         */
416        li = strat->T[i].pLength;
417        ii = i;
418      }
[35aab3]419    }
[bdde4f4]420#endif
[35aab3]421
[bdde4f4]422    /*
423     * end of search: have to reduce with pi
424     */
425#ifdef KDEBUG
426    if (TEST_OPT_DEBUG)
427    {
428      PrintS("red:");
429      h->wrp();
430      PrintS(" with ");
431      strat->T[ii].wrp();
432    }
433#endif
434    assume(strat->fromT == FALSE);
435
436    ksReducePoly(h, &(strat->T[ii]), NULL, NULL, strat);
[35aab3]437
438#ifdef KDEBUG
439    if (TEST_OPT_DEBUG)
440    {
[bdde4f4]441      PrintS("\nto ");
[35aab3]442      h->wrp();
443      PrintLn();
444    }
445#endif
[bdde4f4]446
447    h_p = h->GetLmTailRing();
448    if (h_p == NULL)
[35aab3]449    {
450      if (h->lcm!=NULL) pLmFree(h->lcm);
451#ifdef KDEBUG
452      h->lcm=NULL;
453#endif
454      return 0;
455    }
[bdde4f4]456    h->SetShortExpVector();
457    not_sev = ~ h->sev;
458    /*
459     * try to reduce the s-polynomial h
460     *test first whether h should go to the lazyset L
461     *-if the degree jumps
462     *-if the number of pre-defined reductions jumps
463     */
464    pass++;
[228b631]465    if (!TEST_OPT_REDTHROUGH && (strat->Ll >= 0) && (pass > strat->LazyPass))
[0188fa]466    {
467      h->SetLmCurrRing();
[bdde4f4]468      at = strat->posInL(strat->L,strat->Ll,h,strat);
[0188fa]469      if (at <= strat->Ll)
470      {
[bdde4f4]471        int dummy=strat->sl;
472        if (kFindDivisibleByInS(strat, &dummy, h) < 0)
473          return 1;
474        enterL(&strat->L,&strat->Ll,&strat->Lmax,*h,at);
[0188fa]475#ifdef KDEBUG
[bdde4f4]476        if (TEST_OPT_DEBUG)
477          Print(" lazy: -> L%d\n",at);
[0188fa]478#endif
479        h->Clear();
480        return -1;
481      }
482    }
[35aab3]483  }
484}
485
486/*2
487*  reduction procedure for the inhomogeneous case
488*  and not a degree-ordering
489*/
490int redLazy (LObject* h,kStrategy strat)
491{
492  if (strat->tl<0) return 1;
[d5564f8]493  int at,i,ii,li;
[35aab3]494  int j = 0;
495  int pass = 0;
496  assume(h->pFDeg() == h->FDeg);
497  long reddeg = h->GetpFDeg();
[d5564f8]498  long d;
[225d94]499  unsigned long not_sev;
[35aab3]500
501  h->SetShortExpVector();
[225d94]502  poly h_p = h->GetLmTailRing();
503  not_sev = ~ h->sev;
[35aab3]504  loop
505  {
506    j = kFindDivisibleByInT(strat->T, strat->sevT, strat->tl, h);
507    if (j < 0) return 1;
[533634]508
[225d94]509    li = strat->T[j].pLength;
[f0b6c9]510    #if 0
511    if (li==0)
512    {
513      li=strat->T[j].pLength=pLength(strat->T[j].p);
514    }
515    #endif
[225d94]516    ii = j;
517    /*
518     * the polynomial to reduce with (up to the moment) is;
519     * pi with length li
520     */
521
522    i = j;
523#if 1
[8c36a9]524    if (TEST_OPT_LENGTH)
[225d94]525    loop
526    {
527      /*- search the shortest possible with respect to length -*/
528      i++;
529      if (i > strat->tl)
530        break;
531      if (li<=1)
532        break;
[f0b6c9]533    #if 0
534      if (strat->T[i].pLength==0)
535      {
536        PrintS("!");
537        strat->T[i].pLength=pLength(strat->T[i].p);
538      }
539   #endif
[225d94]540      if ((strat->T[i].pLength < li)
541         &&
542          p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i],
543                               h_p, not_sev, strat->tailRing))
544      {
545        /*
546         * the polynomial to reduce with is now;
547         */
[533634]548        PrintS("+");
[225d94]549        li = strat->T[i].pLength;
550        ii = i;
551      }
552    }
553#endif
554
555    /*
556     * end of search: have to reduce with pi
557     */
558
[35aab3]559
560#ifdef KDEBUG
561    if (TEST_OPT_DEBUG)
562    {
563      PrintS("red:");
564      h->wrp();
565      PrintS(" with ");
[225d94]566      strat->T[ii].wrp();
[35aab3]567    }
568#endif
569
[225d94]570    ksReducePoly(h, &(strat->T[ii]), NULL, NULL, strat);
[35aab3]571
572#ifdef KDEBUG
573    if (TEST_OPT_DEBUG)
574    {
575      PrintS("\nto ");
576      h->wrp();
577      PrintLn();
578    }
579#endif
580
[225d94]581    h_p=h->GetLmTailRing();
582
583    if (h_p == NULL)
[35aab3]584    {
585      if (h->lcm!=NULL) pLmFree(h->lcm);
586#ifdef KDEBUG
587      h->lcm=NULL;
588#endif
589      return 0;
590    }
591    h->SetShortExpVector();
[225d94]592    not_sev = ~ h->sev;
[35aab3]593    d = h->SetpFDeg();
594    /*- try to reduce the s-polynomial -*/
595    pass++;
[228b631]596    if (//!TEST_OPT_REDTHROUGH &&
[35aab3]597        (strat->Ll >= 0) && ((d > reddeg) || (pass > strat->LazyPass)))
598    {
599      h->SetLmCurrRing();
[0188fa]600      at = strat->posInL(strat->L,strat->Ll,h,strat);
[35aab3]601      if (at <= strat->Ll)
602      {
[e690a91]603#if 1
604        int dummy=strat->sl;
605        if (kFindDivisibleByInS(strat, &dummy, h) < 0)
[35aab3]606          return 1;
[0188fa]607#endif
[35aab3]608#ifdef KDEBUG
609        if (TEST_OPT_DEBUG) Print(" ->L[%d]\n",at);
610#endif
611        enterL(&strat->L,&strat->Ll,&strat->Lmax,*h,at);
612        h->Clear();
613        return -1;
614      }
615    }
[f7feb7]616    else if (d != reddeg)
[35aab3]617    {
[f7feb7]618      if (d>=strat->tailRing->bitmask)
619      {
[8d679fd]620        if (h->pTotalDeg() >= strat->tailRing->bitmask)
621        {
622          strat->overflow=TRUE;
[d5564f8]623          //Print("OVERFLOW in redLazy d=%ld, max=%ld\n",d,strat->tailRing->bitmask);
[8d679fd]624          h->GetP();
625          at = strat->posInL(strat->L,strat->Ll,h,strat);
626          enterL(&strat->L,&strat->Ll,&strat->Lmax,*h,at);
627          h->Clear();
[d5564f8]628          return -1;
629        }
[f7feb7]630      }
631      else if ((TEST_OPT_PROT) && (strat->Ll < 0))
632      {
[dd8a7d]633        Print(".%ld",d);mflush();
[f7feb7]634        reddeg = d;
635      }
[35aab3]636    }
637  }
638}
639/*2
640*  reduction procedure for the sugar-strategy (honey)
641* reduces h with elements from T choosing first possible
642* element in T with respect to the given ecart
643*/
644int redHoney (LObject* h, kStrategy strat)
645{
646  if (strat->tl<0) return 1;
[c5f67b5]647  //if (h->GetLmTailRing()==NULL) return 0; // HS: SHOULD NOT BE NEEDED!
[35aab3]648  assume(h->FDeg == h->pFDeg());
649  poly h_p;
650  int i,j,at,pass,ei, ii, h_d;
651  unsigned long not_sev;
652  long reddeg,d;
653
654  pass = j = 0;
655  d = reddeg = h->GetpFDeg() + h->ecart;
656  h->SetShortExpVector();
[b2c236]657  int li;
[35aab3]658  h_p = h->GetLmTailRing();
659  not_sev = ~ h->sev;
[f53fdf]660
661  h->PrepareRed(strat->use_buckets);
[35aab3]662  loop
663  {
[f53fdf]664    j=kFindDivisibleByInT(strat->T, strat->sevT, strat->tl, h);
[35aab3]665    if (j < 0) return 1;
666
667    ei = strat->T[j].ecart;
[b2c236]668    li = strat->T[j].pLength;
[35aab3]669    ii = j;
670    /*
671     * the polynomial to reduce with (up to the moment) is;
672     * pi with ecart ei
673     */
674    i = j;
[8c36a9]675    if (TEST_OPT_LENGTH)
[35aab3]676    loop
677    {
678      /*- takes the first possible with respect to ecart -*/
679      i++;
680      if (i > strat->tl)
681        break;
[f0b6c9]682      //if (ei < h->ecart)
683      //  break;
[bdde4f4]684      if (li<=1)
[35aab3]685        break;
[f0b6c9]686      if ((((strat->T[i].ecart < ei) && (ei> h->ecart))
[b2c236]687         || ((strat->T[i].ecart <= h->ecart) && (strat->T[i].pLength < li)))
688         &&
[35aab3]689          p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i],
690                               h_p, not_sev, strat->tailRing))
691      {
692        /*
693         * the polynomial to reduce with is now;
694         */
695        ei = strat->T[i].ecart;
[b2c236]696        li = strat->T[i].pLength;
[35aab3]697        ii = i;
698      }
699    }
700
701    /*
702     * end of search: have to reduce with pi
703     */
[228b631]704    if (!TEST_OPT_REDTHROUGH && (pass!=0) && (ei > h->ecart))
[35aab3]705    {
[f53fdf]706      h->GetTP(); // clears bucket
[35aab3]707      h->SetLmCurrRing();
708      /*
709       * It is not possible to reduce h with smaller ecart;
710       * if possible h goes to the lazy-set L,i.e
711       * if its position in L would be not the last one
712       */
713      if (strat->Ll >= 0) /* L is not empty */
714      {
715        at = strat->posInL(strat->L,strat->Ll,h,strat);
716        if(at <= strat->Ll)
717          /*- h will not become the next element to reduce -*/
718        {
719          enterL(&strat->L,&strat->Ll,&strat->Lmax,*h,at);
720#ifdef KDEBUG
721          if (TEST_OPT_DEBUG) Print(" ecart too big: -> L%d\n",at);
722#endif
723          h->Clear();
724          return -1;
725        }
726      }
727    }
728#ifdef KDEBUG
729    if (TEST_OPT_DEBUG)
730    {
731      PrintS("red:");
732      h->wrp();
733      PrintS(" with ");
734      strat->T[ii].wrp();
735    }
736#endif
737    assume(strat->fromT == FALSE);
738
[f53fdf]739    number coef;
740    ksReducePoly(h,&(strat->T[ii]),strat->kNoetherTail(),&coef,strat);
[35aab3]741#ifdef KDEBUG
742    if (TEST_OPT_DEBUG)
743    {
[f53fdf]744      PrintS("\nto:");
[35aab3]745      h->wrp();
746      PrintLn();
747    }
748#endif
[f53fdf]749    if(h->IsNull())
[35aab3]750    {
[f53fdf]751      h->Clear();
[35aab3]752      if (h->lcm!=NULL) pLmFree(h->lcm);
[f53fdf]753      #ifdef KDEBUG
[35aab3]754      h->lcm=NULL;
[f53fdf]755      #endif
[35aab3]756      return 0;
757    }
758    h->SetShortExpVector();
759    not_sev = ~ h->sev;
760    h_d = h->SetpFDeg();
761    /* compute the ecart */
762    if (ei <= h->ecart)
763      h->ecart = d-h_d;
[822aa3a]764    else
[35aab3]765      h->ecart = d-h_d+ei-h->ecart;
[f53fdf]766
[35aab3]767    /*
768     * try to reduce the s-polynomial h
769     *test first whether h should go to the lazyset L
770     *-if the degree jumps
771     *-if the number of pre-defined reductions jumps
772     */
773    pass++;
774    d = h_d + h->ecart;
[228b631]775    if (!TEST_OPT_REDTHROUGH && (strat->Ll >= 0) && ((d > reddeg) || (pass > strat->LazyPass)))
[35aab3]776    {
[f53fdf]777      h->GetTP(); // clear bucket
[35aab3]778      h->SetLmCurrRing();
779      at = strat->posInL(strat->L,strat->Ll,h,strat);
780      if (at <= strat->Ll)
781      {
[391323]782        int dummy=strat->sl;
783        if (kFindDivisibleByInS(strat, &dummy, h) < 0)
[35aab3]784          return 1;
785        enterL(&strat->L,&strat->Ll,&strat->Lmax,*h,at);
786#ifdef KDEBUG
787        if (TEST_OPT_DEBUG)
788          Print(" degree jumped: -> L%d\n",at);
789#endif
790        h->Clear();
791        return -1;
792      }
793    }
[f7feb7]794    else if (d > reddeg)
[35aab3]795    {
[f7feb7]796      if (d>=strat->tailRing->bitmask)
797      {
[8d679fd]798        if (h->pTotalDeg()+h->ecart >= strat->tailRing->bitmask)
799        {
800          strat->overflow=TRUE;
[d5564f8]801          //Print("OVERFLOW in redHoney d=%ld, max=%ld\n",d,strat->tailRing->bitmask);
[8d679fd]802          h->GetP();
803          at = strat->posInL(strat->L,strat->Ll,h,strat);
804          enterL(&strat->L,&strat->Ll,&strat->Lmax,*h,at);
805          h->Clear();
[d5564f8]806          return -1;
807        }
[f7feb7]808      }
809      else if (TEST_OPT_PROT && (strat->Ll < 0) )
810      {
811        //h->wrp(); Print("<%d>\n",h->GetpLength());
812        reddeg = d;
813        Print(".%ld",d); mflush();
814      }
[35aab3]815    }
816  }
817}
818/*2
819*  reduction procedure for the normal form
820*/
821
[ab1c36]822poly redNF (poly h,int &max_ind,int nonorm,kStrategy strat)
[35aab3]823{
824  if (h==NULL) return NULL;
825  int j;
[391323]826  max_ind=strat->sl;
[35aab3]827
828  if (0 > strat->sl)
829  {
830    return h;
831  }
832  LObject P(h);
833  P.SetShortExpVector();
834  P.bucket = kBucketCreate(currRing);
835  kBucketInit(P.bucket,P.p,pLength(P.p));
[c5f67b5]836  kbTest(P.bucket);
[40d3462]837#ifdef HAVE_RINGS
838  BOOLEAN is_ring = rField_is_Ring(currRing);
839#endif
[35aab3]840  loop
841  {
[d772c3]842    j=kFindDivisibleByInS(strat,&max_ind,&P);
[35aab3]843    if (j>=0)
844    {
[40d3462]845#ifdef HAVE_RINGS
846      if (!is_ring)
847      {
848#endif
[ab1c36]849        int sl=pSize(strat->S[j]);
850        int jj=j;
851        loop
[7ba059]852        {
[ab1c36]853          int sll;
854          jj=kFindNextDivisibleByInS(strat,jj+1,max_ind,&P);
855          if (jj<0) break;
856          sll=pSize(strat->S[jj]);
[08ab82]857          if (sll<sl)
858          {
859            #ifdef KDEBUG
860            if (TEST_OPT_DEBUG) Print("better(S%d:%d -> S%d:%d)\n",j,sl,jj,sll);
861            #endif
[a589e6]862            //else if (TEST_OPT_PROT) { PrintS("b"); mflush(); }
[19408c]863            j=jj;
864            sl=sll;
[08ab82]865          }
[7ba059]866        }
[1863d8]867        if ((nonorm==0) && (!nIsOne(pGetCoeff(strat->S[j]))))
[ab1c36]868        {
869          pNorm(strat->S[j]);
870          //if (TEST_OPT_PROT) { PrintS("n"); mflush(); }
871        }
[40d3462]872#ifdef HAVE_RINGS
873      }
874#endif
[35aab3]875      nNormalize(pGetCoeff(P.p));
876#ifdef KDEBUG
877      if (TEST_OPT_DEBUG)
878      {
879        PrintS("red:");
880        wrp(h);
881        PrintS(" with ");
882        wrp(strat->S[j]);
883      }
884#endif
885#ifdef HAVE_PLURAL
886      if (rIsPluralRing(currRing))
887      {
[c5f67b5]888        number coef;
[19370c]889        nc_kBucketPolyRed(P.bucket,strat->S[j],&coef);
[c5f67b5]890        nDelete(&coef);
[35aab3]891      }
892      else
893#endif
894      {
895        number coef;
896        coef=kBucketPolyRed(P.bucket,strat->S[j],pLength(strat->S[j]),strat->kNoether);
897        nDelete(&coef);
898      }
[cea6f3]899      h = kBucketGetLm(P.bucket);   // FRAGE OLIVER
[35aab3]900      if (h==NULL)
901      {
902        kBucketDestroy(&P.bucket);
903        return NULL;
904      }
[c5f67b5]905      kbTest(P.bucket);
[35aab3]906      P.p=h;
907      P.t_p=NULL;
908      P.SetShortExpVector();
909#ifdef KDEBUG
910      if (TEST_OPT_DEBUG)
911      {
912        PrintS("\nto:");
913        wrp(h);
914        PrintLn();
915      }
916#endif
917    }
918    else
919    {
920      P.p=kBucketClear(P.bucket);
921      kBucketDestroy(&P.bucket);
922      pNormalize(P.p);
923      return P.p;
924    }
925  }
926}
927
928#ifdef KDEBUG
929static int bba_count = 0;
[645a19]930#endif /* KDEBUG */
[79d3879]931void kDebugPrint(kStrategy strat);
[35aab3]932
933ideal bba (ideal F, ideal Q,intvec *w,intvec *hilb,kStrategy strat)
934{
935#ifdef KDEBUG
936  bba_count++;
937  int loop_count = 0;
[645a19]938#endif /* KDEBUG */
[35aab3]939  om_Opts.MinTrack = 5;
940  int   srmax,lrmax, red_result = 1;
941  int   olddeg,reduc;
942  int hilbeledeg=1,hilbcount=0,minimcnt=0;
943  BOOLEAN withT = FALSE;
944
945  initBuchMoraCrit(strat); /*set Gebauer, honey, sugarCrit*/
946  initBuchMoraPos(strat);
947  initHilbCrit(F,Q,&hilb,strat);
948  initBba(F,strat);
949  /*set enterS, spSpolyShort, reduce, red, initEcart, initEcartPair*/
950  /*Shdl=*/initBuchMora(F, Q,strat);
951  if (strat->minim>0) strat->M=idInit(IDELEMS(F),F->rank);
952  srmax = strat->sl;
953  reduc = olddeg = lrmax = 0;
954
955#ifndef NO_BUCKETS
956  if (!TEST_OPT_NOT_BUCKETS)
957    strat->use_buckets = 1;
958#endif
959
960  // redtailBBa against T for inhomogenous input
[228b631]961  if (!TEST_OPT_OLDSTD)
[35aab3]962    withT = ! strat->homog;
963
964  // strat->posInT = posInT_pLength;
965  kTest_TS(strat);
966
[645a19]967#ifdef KDEBUG
968#if MYTEST
[9982049]969  if (TEST_OPT_DEBUG)
[8d679fd]970  {
[9982049]971    PrintS("bba start GB: currRing: ");
972    // rWrite(currRing);PrintLn();
973    rDebugPrint(currRing);
974    PrintLn();
[645a19]975  }
976#endif /* MYTEST */
977#endif /* KDEBUG */
978
[35aab3]979#ifdef HAVE_TAIL_RING
[94ebce]980  if(!idIs0(F) &&(!rField_is_Ring()))  // create strong gcd poly computes with tailring and S[i] ->to be fixed
[645a19]981    kStratInitChangeTailRing(strat);
[35aab3]982#endif
[d5564f8]983  if (BVERBOSE(23))
[57fad3a]984  {
985    if (test_PosInT!=NULL) strat->posInT=test_PosInT;
986    if (test_PosInL!=NULL) strat->posInL=test_PosInL;
987    kDebugPrint(strat);
988  }
989
[35aab3]990
[8d679fd]991#ifdef KDEBUG
992  //kDebugPrint(strat);
993#endif
[35aab3]994  /* compute------------------------------------------------------- */
995  while (strat->Ll >= 0)
996  {
997    if (strat->Ll > lrmax) lrmax =strat->Ll;/*stat.*/
[08ab82]998    #ifdef KDEBUG
999      loop_count++;
1000      if (TEST_OPT_DEBUG) messageSets(strat);
1001    #endif
[35aab3]1002    if (strat->Ll== 0) strat->interpt=TRUE;
1003    if (TEST_OPT_DEGBOUND
[b130fb]1004        && ((strat->honey && (strat->L[strat->Ll].ecart+pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg))
1005            || ((!strat->honey) && (pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg))))
[35aab3]1006    {
1007      /*
1008       *stops computation if
1009       * 24 IN test and the degree +ecart of L[strat->Ll] is bigger then
1010       *a predefined number Kstd1_deg
1011       */
[939847]1012      while ((strat->Ll >= 0)
[977f94]1013        && (strat->L[strat->Ll].p1!=NULL) && (strat->L[strat->Ll].p2!=NULL)
[939847]1014        && ((strat->honey && (strat->L[strat->Ll].ecart+pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg))
1015            || ((!strat->honey) && (pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg)))
[977f94]1016        )
[019649]1017        deleteInL(strat->L,&strat->Ll,strat->Ll,strat);
1018      if (strat->Ll<0) break;
[3957e37]1019      else strat->noClearS=TRUE;
[35aab3]1020    }
1021    /* picks the last element from the lazyset L */
1022    strat->P = strat->L[strat->Ll];
1023    strat->Ll--;
1024
1025    if (pNext(strat->P.p) == strat->tail)
1026    {
1027      // deletes the short spoly
[a539ad]1028#ifdef HAVE_RINGS
1029      if (rField_is_Ring(currRing))
1030        pLmDelete(strat->P.p);
1031      else
1032#endif
1033        pLmFree(strat->P.p);
[35aab3]1034      strat->P.p = NULL;
1035      poly m1 = NULL, m2 = NULL;
1036
1037      // check that spoly creation is ok
1038      while (strat->tailRing != currRing &&
1039             !kCheckSpolyCreation(&(strat->P), strat, m1, m2))
1040      {
1041        assume(m1 == NULL && m2 == NULL);
1042        // if not, change to a ring where exponents are at least
1043        // large enough
[7ae94b]1044        if (!kStratChangeTailRing(strat))
1045        {
[8d679fd]1046          WerrorS("OVERFLOW...");
[7ae94b]1047          break;
1048        }
[35aab3]1049      }
1050      // create the real one
1051      ksCreateSpoly(&(strat->P), NULL, strat->use_buckets,
1052                    strat->tailRing, m1, m2, strat->R);
1053    }
1054    else if (strat->P.p1 == NULL)
1055    {
1056      if (strat->minim > 0)
1057        strat->P.p2=p_Copy(strat->P.p, currRing, strat->tailRing);
1058      // for input polys, prepare reduction
1059      strat->P.PrepareRed(strat->use_buckets);
1060    }
1061
[977f94]1062    if (strat->P.p == NULL && strat->P.t_p == NULL)
1063    {
[cea6f3]1064      red_result = 0;
1065    }
1066    else
1067    {
1068      if (TEST_OPT_PROT)
1069        message((strat->honey ? strat->P.ecart : 0) + strat->P.pFDeg(),
1070                &olddeg,&reduc,strat, red_result);
[35aab3]1071
[cea6f3]1072      /* reduction of the element choosen from L */
1073      red_result = strat->red(&strat->P,strat);
[d5564f8]1074      if (errorreported)  break;
1075    }
1076
1077    if (strat->overflow)
1078    {
1079        if (!kStratChangeTailRing(strat)) { Werror("OVERFLOW.."); break;}
[cea6f3]1080    }
[35aab3]1081
1082    // reduction to non-zero new poly
1083    if (red_result == 1)
1084    {
1085      // get the polynomial (canonicalize bucket, make sure P.p is set)
1086      strat->P.GetP(strat->lmBin);
1087
[d5564f8]1088      /* statistic */
1089      if (TEST_OPT_PROT) PrintS("s");
1090
[35aab3]1091      int pos=posInS(strat,strat->sl,strat->P.p,strat->P.ecart);
1092
[645a19]1093#ifdef KDEBUG
1094#if MYTEST
1095      PrintS("New S: "); pDebugPrint(strat->P.p); PrintLn();
1096#endif /* MYTEST */
1097#endif /* KDEBUG */
1098
[35aab3]1099      // reduce the tail and normalize poly
[521349]1100      // in the ring case we cannot expect LC(f) = 1,
1101      // therefore we call pContent instead of pNorm
1102      if ((TEST_OPT_INTSTRATEGY) || (rField_is_Ring(currRing)))
[35aab3]1103      {
1104        strat->P.pCleardenom();
1105        if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
1106        {
1107          strat->P.p = redtailBba(&(strat->P),pos-1,strat, withT);
1108          strat->P.pCleardenom();
1109        }
1110      }
1111      else
1112      {
1113        strat->P.pNorm();
1114        if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
1115          strat->P.p = redtailBba(&(strat->P),pos-1,strat, withT);
1116      }
1117
1118#ifdef KDEBUG
1119      if (TEST_OPT_DEBUG){PrintS("new s:");strat->P.wrp();PrintLn();}
[645a19]1120#if MYTEST
1121      PrintS("New (reduced) S: "); pDebugPrint(strat->P.p); PrintLn();
1122#endif /* MYTEST */
1123#endif /* KDEBUG */
[35aab3]1124
1125      // min_std stuff
1126      if ((strat->P.p1==NULL) && (strat->minim>0))
1127      {
1128        if (strat->minim==1)
1129        {
1130          strat->M->m[minimcnt]=p_Copy(strat->P.p,currRing,strat->tailRing);
1131          p_Delete(&strat->P.p2, currRing, strat->tailRing);
1132        }
1133        else
1134        {
1135          strat->M->m[minimcnt]=strat->P.p2;
1136          strat->P.p2=NULL;
1137        }
1138        if (strat->tailRing!=currRing && pNext(strat->M->m[minimcnt])!=NULL)
1139          pNext(strat->M->m[minimcnt])
1140            = strat->p_shallow_copy_delete(pNext(strat->M->m[minimcnt]),
1141                                           strat->tailRing, currRing,
1142                                           currRing->PolyBin);
1143        minimcnt++;
1144      }
1145
1146      // enter into S, L, and T
[b981502]1147      //if ((!TEST_OPT_IDLIFT) || (pGetComp(strat->P.p) <= strat->syzComp))
[f0b6c9]1148        enterT(strat->P, strat);
[206e158]1149#ifdef HAVE_RINGS
1150      if (rField_is_Ring(currRing))
[f92547]1151        superenterpairs(strat->P.p,strat->sl,strat->P.ecart,pos,strat, strat->tl);
1152      else
1153#endif
1154        enterpairs(strat->P.p,strat->sl,strat->P.ecart,pos,strat, strat->tl);
[35aab3]1155      // posInS only depends on the leading term
1156      strat->enterS(strat->P, pos, strat, strat->tl);
[f0b6c9]1157#if 0
[b2c236]1158      int pl=pLength(strat->P.p);
1159      if (pl==1)
1160      {
1161        //if (TEST_OPT_PROT)
1162        //PrintS("<1>");
1163      }
1164      else if (pl==2)
1165      {
1166        //if (TEST_OPT_PROT)
1167        //PrintS("<2>");
1168      }
[f0b6c9]1169#endif
[35aab3]1170      if (hilb!=NULL) khCheck(Q,w,hilb,hilbeledeg,hilbcount,strat);
1171//      Print("[%d]",hilbeledeg);
[1e36c5]1172      if (strat->P.lcm!=NULL)
1173#ifdef HAVE_RINGS
1174        pLmDelete(strat->P.lcm);
1175#else
1176        pLmFree(strat->P.lcm);
1177#endif
[35aab3]1178      if (strat->sl>srmax) srmax = strat->sl;
1179    }
1180    else if (strat->P.p1 == NULL && strat->minim > 0)
1181    {
1182      p_Delete(&strat->P.p2, currRing, strat->tailRing);
1183    }
[a539ad]1184
[35aab3]1185#ifdef KDEBUG
1186    memset(&(strat->P), 0, sizeof(strat->P));
[645a19]1187#endif /* KDEBUG */
[35aab3]1188    kTest_TS(strat);
1189  }
1190#ifdef KDEBUG
[645a19]1191#if MYTEST
1192  PrintS("bba finish GB: currRing: "); rWrite(currRing);
1193#endif /* MYTEST */
[35aab3]1194  if (TEST_OPT_DEBUG) messageSets(strat);
[645a19]1195#endif /* KDEBUG */
1196
[07b1cf]1197  if (TEST_OPT_SB_1)
1198  {
1199    int k=1;
1200    int j;
1201    while(k<=strat->sl)
1202    {
1203      j=0;
1204      loop
1205      {
1206        if (j>=k) break;
1207        clearS(strat->S[j],strat->sevS[j],&k,&j,strat);
1208        j++;
1209      }
1210      k++;
1211    }
1212  }
1213
[93f4bb]1214  /* complete reduction of the standard basis--------- */
[533634]1215  if (TEST_OPT_REDSB)
[b57694]1216  {
[533634]1217    completeReduce(strat);
[cbc616]1218#ifdef HAVE_TAIL_RING
[b57694]1219    if (strat->completeReduce_retry)
1220    {
[533634]1221      // completeReduce needed larger exponents, retry
1222      // to reduce with S (instead of T)
1223      // and in currRing (instead of strat->tailRing)
[b57694]1224      cleanT(strat);strat->tailRing=currRing;
1225      int i;
1226      for(i=strat->sl;i>=0;i--) strat->S_2_R[i]=-1;
1227      completeReduce(strat);
1228    }
[cbc616]1229#endif
[b57694]1230  }
[5accf0]1231  else if (TEST_OPT_PROT) PrintLn();
[533634]1232
[35aab3]1233  /* release temp data-------------------------------- */
1234  exitBuchMora(strat);
1235  if (TEST_OPT_WEIGHTM)
1236  {
1237    pRestoreDegProcs(pFDegOld, pLDegOld);
1238    if (ecartWeights)
1239    {
1240      omFreeSize((ADDRESS)ecartWeights,(pVariables+1)*sizeof(short));
1241      ecartWeights=NULL;
1242    }
1243  }
1244  if (TEST_OPT_PROT) messageStat(srmax,lrmax,hilbcount,strat);
1245  if (Q!=NULL) updateResult(strat->Shdl,Q,strat);
[645a19]1246
1247#ifdef KDEBUG
1248#if MYTEST
1249  PrintS("bba_end: currRing: "); rWrite(currRing);
1250#endif /* MYTEST */
1251#endif /* KDEBUG */
1252  idTest(strat->Shdl);
1253
[35aab3]1254  return (strat->Shdl);
1255}
[cbc616]1256
[35aab3]1257poly kNF2 (ideal F,ideal Q,poly q,kStrategy strat, int lazyReduce)
1258{
[822aa3a]1259  assume(q!=NULL);
[645a19]1260  assume(!(idIs0(F)&&(Q==NULL))); // NF(q, std(0) in polynomial ring?
[822aa3a]1261
[93f4bb]1262// lazy_reduce flags: can be combined by |
1263//#define KSTD_NF_LAZY   1
1264  // do only a reduction of the leading term
1265//#define KSTD_NF_NONORM 4
1266  // only global: avoid normalization, return a multiply of NF
[35aab3]1267  poly   p;
1268  int   i;
1269
[822aa3a]1270  //if ((idIs0(F))&&(Q==NULL))
1271  //  return pCopy(q); /*F=0*/
[1ee19dc]1272  //strat->ak = idRankFreeModule(F);
[35aab3]1273  /*- creating temp data structures------------------- -*/
1274  BITSET save_test=test;
1275  test|=Sy_bit(OPT_REDTAIL);
1276  initBuchMoraCrit(strat);
1277  strat->initEcart = initEcartBBA;
1278  strat->enterS = enterSBba;
[6ad5ce]1279#ifndef NO_BUCKETS
1280  strat->use_buckets = (!TEST_OPT_NOT_BUCKETS) && (!rIsPluralRing(currRing));
1281#endif
[35aab3]1282  /*- set S -*/
1283  strat->sl = -1;
1284  /*- init local data struct.---------------------------------------- -*/
1285  /*Shdl=*/initS(F,Q,strat);
1286  /*- compute------------------------------------------------------- -*/
1287  //if ((TEST_OPT_INTSTRATEGY)&&(lazyReduce==0))
[78b904]1288  //{
1289  //  for (i=strat->sl;i>=0;i--)
1290  //    pNorm(strat->S[i]);
1291  //}
[35aab3]1292  kTest(strat);
1293  if (TEST_OPT_PROT) { PrintS("r"); mflush(); }
[391323]1294  int max_ind;
[ab1c36]1295  p = redNF(pCopy(q),max_ind,lazyReduce & KSTD_NF_NONORM,strat);
[18ff4c]1296  if ((p!=NULL)&&((lazyReduce & KSTD_NF_LAZY)==0))
[35aab3]1297  {
1298    if (TEST_OPT_PROT) { PrintS("t"); mflush(); }
[5eb865]1299    #ifdef HAVE_RINGS
1300    if (rField_is_Ring())
1301    {
1302      p = redtailBba_Z(p,max_ind,strat);
1303    }
1304    else
1305    #endif
1306    {
1307      BITSET save=test;
1308      test &= ~Sy_bit(OPT_INTSTRATEGY);
1309      p = redtailBba(p,max_ind,strat,(lazyReduce & KSTD_NF_NONORM)==0);
1310      test=save;
1311    }
[35aab3]1312  }
1313  /*- release temp data------------------------------- -*/
1314  omfree(strat->sevS);
1315  omfree(strat->ecartS);
1316  omfree(strat->T);
1317  omfree(strat->sevT);
1318  omfree(strat->R);
1319  omfree(strat->S_2_R);
1320  omfree(strat->L);
1321  omfree(strat->B);
1322  omfree(strat->fromQ);
1323  idDelete(&strat->Shdl);
1324  test=save_test;
1325  if (TEST_OPT_PROT) PrintLn();
1326  return p;
1327}
1328
1329ideal kNF2 (ideal F,ideal Q,ideal q,kStrategy strat, int lazyReduce)
1330{
[822aa3a]1331  assume(!idIs0(q));
1332  assume(!(idIs0(F)&&(Q==NULL)));
[93f4bb]1333// lazy_reduce flags: can be combined by |
1334//#define KSTD_NF_LAZY   1
1335  // do only a reduction of the leading term
1336//#define KSTD_NF_NONORM 4
1337  // only global: avoid normalization, return a multiply of NF
[35aab3]1338  poly   p;
1339  int   i;
1340  ideal res;
[391323]1341  int max_ind;
[35aab3]1342
[822aa3a]1343  //if (idIs0(q))
1344  //  return idInit(IDELEMS(q),si_max(q->rank,F->rank));
1345  //if ((idIs0(F))&&(Q==NULL))
1346  //  return idCopy(q); /*F=0*/
[1ee19dc]1347  //strat->ak = idRankFreeModule(F);
[35aab3]1348  /*- creating temp data structures------------------- -*/
1349  BITSET save_test=test;
1350  test|=Sy_bit(OPT_REDTAIL);
1351  initBuchMoraCrit(strat);
1352  strat->initEcart = initEcartBBA;
1353  strat->enterS = enterSBba;
1354  /*- set S -*/
1355  strat->sl = -1;
[6ad5ce]1356#ifndef NO_BUCKETS
1357  strat->use_buckets = (!TEST_OPT_NOT_BUCKETS) && (!rIsPluralRing(currRing));
1358#endif
[35aab3]1359  /*- init local data struct.---------------------------------------- -*/
1360  /*Shdl=*/initS(F,Q,strat);
1361  /*- compute------------------------------------------------------- -*/
[baa72c5]1362  res=idInit(IDELEMS(q),si_max(q->rank,F->rank));
[5eb865]1363  BITSET save=test;
1364  test &= ~Sy_bit(OPT_INTSTRATEGY);
[35aab3]1365  for (i=IDELEMS(q)-1; i>=0; i--)
1366  {
1367    if (q->m[i]!=NULL)
1368    {
1369      if (TEST_OPT_PROT) { PrintS("r");mflush(); }
[ab1c36]1370      p = redNF(pCopy(q->m[i]),max_ind,lazyReduce & KSTD_NF_NONORM,strat);
[18ff4c]1371      if ((p!=NULL)&&((lazyReduce & KSTD_NF_LAZY)==0))
[35aab3]1372      {
1373        if (TEST_OPT_PROT) { PrintS("t"); mflush(); }
[5eb865]1374        #ifdef HAVE_RINGS
1375        if (rField_is_Ring())
1376        {
1377          p = redtailBba_Z(p,max_ind,strat);
1378        }
1379        else
1380        #endif
1381        {
1382          p = redtailBba(p,max_ind,strat,(lazyReduce & KSTD_NF_NONORM)==0);
1383        }
[35aab3]1384      }
1385      res->m[i]=p;
1386    }
1387    //else
1388    //  res->m[i]=NULL;
1389  }
1390  /*- release temp data------------------------------- -*/
[5eb865]1391  test=save;
[35aab3]1392  omfree(strat->sevS);
1393  omfree(strat->ecartS);
1394  omfree(strat->T);
1395  omfree(strat->sevT);
1396  omfree(strat->R);
1397  omfree(strat->S_2_R);
1398  omfree(strat->L);
1399  omfree(strat->B);
1400  omfree(strat->fromQ);
1401  idDelete(&strat->Shdl);
1402  test=save_test;
1403  if (TEST_OPT_PROT) PrintLn();
1404  return res;
1405}
[dd2855]1406
[cb0fbe]1407/* shiftgb stuff */
[037df4]1408#ifdef HAVE_SHIFTBBA
[37a4c3]1409
[07625cb]1410
[cb0fbe]1411ideal bbaShift(ideal F, ideal Q,intvec *w,intvec *hilb,kStrategy strat, int uptodeg, int lV)
1412{
1413#ifdef KDEBUG
1414  bba_count++;
1415  int loop_count = 0;
1416#endif
1417  om_Opts.MinTrack = 5;
1418  int   srmax,lrmax, red_result = 1;
1419  int   olddeg,reduc;
1420  int hilbeledeg=1,hilbcount=0,minimcnt=0;
[4d43ff]1421  BOOLEAN withT = TRUE; // very important for shifts
[cb0fbe]1422
[37a4c3]1423  initBuchMoraCrit(strat); /*set Gebauer, honey, sugarCrit, NO CHANGES */
1424  initBuchMoraPos(strat); /*NO CHANGES YET: perhaps later*/
1425  initHilbCrit(F,Q,&hilb,strat); /*NO CHANGES*/
1426  initBbaShift(F,strat); /* DONE */
[cb0fbe]1427  /*set enterS, spSpolyShort, reduce, red, initEcart, initEcartPair*/
[37a4c3]1428  /*Shdl=*/initBuchMoraShift(F, Q,strat); /* updateS with no toT, i.e. no init for T */
1429  updateSShift(strat,uptodeg,lV); /* initializes T */
1430
[cb0fbe]1431  if (strat->minim>0) strat->M=idInit(IDELEMS(F),F->rank);
1432  srmax = strat->sl;
1433  reduc = olddeg = lrmax = 0;
[bbf50e]1434  strat->lV=lV;
[cb0fbe]1435
1436#ifndef NO_BUCKETS
1437  if (!TEST_OPT_NOT_BUCKETS)
1438    strat->use_buckets = 1;
1439#endif
1440
1441  // redtailBBa against T for inhomogenous input
[228b631]1442  //  if (!TEST_OPT_OLDSTD)
[37a4c3]1443  //    withT = ! strat->homog;
[cb0fbe]1444
1445  // strat->posInT = posInT_pLength;
1446  kTest_TS(strat);
1447
1448#ifdef HAVE_TAIL_RING
1449  kStratInitChangeTailRing(strat);
1450#endif
1451
1452  /* compute------------------------------------------------------- */
1453  while (strat->Ll >= 0)
1454  {
1455    if (strat->Ll > lrmax) lrmax =strat->Ll;/*stat.*/
1456#ifdef KDEBUG
1457    loop_count++;
1458    if (TEST_OPT_DEBUG) messageSets(strat);
1459#endif
1460    if (strat->Ll== 0) strat->interpt=TRUE;
1461    if (TEST_OPT_DEGBOUND
1462        && ((strat->honey && (strat->L[strat->Ll].ecart+pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg))
1463            || ((!strat->honey) && (pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg))))
1464    {
1465      /*
1466       *stops computation if
1467       * 24 IN test and the degree +ecart of L[strat->Ll] is bigger then
1468       *a predefined number Kstd1_deg
1469       */
1470      while ((strat->Ll >= 0)
1471        && (strat->L[strat->Ll].p1!=NULL) && (strat->L[strat->Ll].p2!=NULL)
1472        && ((strat->honey && (strat->L[strat->Ll].ecart+pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg))
1473            || ((!strat->honey) && (pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg)))
1474        )
1475        deleteInL(strat->L,&strat->Ll,strat->Ll,strat);
1476      if (strat->Ll<0) break;
1477      else strat->noClearS=TRUE;
1478    }
1479    /* picks the last element from the lazyset L */
1480    strat->P = strat->L[strat->Ll];
1481    strat->Ll--;
1482
1483    if (pNext(strat->P.p) == strat->tail)
1484    {
1485      // deletes the short spoly
1486      pLmFree(strat->P.p);
1487      strat->P.p = NULL;
1488      poly m1 = NULL, m2 = NULL;
1489
1490      // check that spoly creation is ok
1491      while (strat->tailRing != currRing &&
1492             !kCheckSpolyCreation(&(strat->P), strat, m1, m2))
1493      {
1494        assume(m1 == NULL && m2 == NULL);
1495        // if not, change to a ring where exponents are at least
1496        // large enough
1497        kStratChangeTailRing(strat);
1498      }
1499      // create the real one
1500      ksCreateSpoly(&(strat->P), NULL, strat->use_buckets,
1501                    strat->tailRing, m1, m2, strat->R);
1502    }
1503    else if (strat->P.p1 == NULL)
1504    {
1505      if (strat->minim > 0)
1506        strat->P.p2=p_Copy(strat->P.p, currRing, strat->tailRing);
1507      // for input polys, prepare reduction
1508      strat->P.PrepareRed(strat->use_buckets);
1509    }
1510
[ad1c3b]1511    poly qq;
1512
1513    /* here in the nonhomog case we shrink the new spoly */
[eed827]1514
[ad1c3b]1515    if ( ! strat->homog)
1516    {
1517      strat->P.GetP(strat->lmBin); // because shifts are counted with .p structure
1518      /* in the nonhomog case we have to shrink the polynomial */
1519      assume(strat->P.t_p!=NULL);
1520      qq = p_Shrink(strat->P.t_p, lV, strat->tailRing); // direct shrink
1521      if (qq != NULL)
1522      {
1523         /* we're here if Shrink is nonzero */
1524        //         strat->P.p =  NULL;
[eed827]1525        //        strat->P.Delete(); /* deletes P.p and P.t_p */ //error
[ad1c3b]1526        strat->P.p   =  NULL; // is not set by Delete
1527        strat->P.t_p =  qq;
1528        strat->P.GetP(strat->lmBin);
1529        // update sev and length
1530        strat->initEcart(&(strat->P));
1531        strat->P.sev = pGetShortExpVector(strat->P.p);
1532//         strat->P.FDeg = strat->P.pFDeg();
1533//         strat->P.length = strat->P.pLDeg();
1534//         strat->P.pLength =strat->P.GetpLength(); //pLength(strat->P.p);
1535      }
1536      else
1537      {
1538         /* Shrink is zero, like y(1)*y(2) - y(1)*y(3)*/
1539#ifdef KDEBUG
1540         if (TEST_OPT_DEBUG){PrintS("nonzero s shrinks to 0");PrintLn();}
1541#endif
[eed827]1542         //         strat->P.Delete();  // cause error
1543         strat->P.p = NULL;
1544         strat->P.t_p = NULL;
[ad1c3b]1545           //         strat->P.p = NULL; // or delete strat->P.p ?
1546       }
1547    }
1548      /* end shrinking poly in the nonhomog case */
1549
[cb0fbe]1550    if (strat->P.p == NULL && strat->P.t_p == NULL)
1551    {
1552      red_result = 0;
1553    }
1554    else
1555    {
1556      if (TEST_OPT_PROT)
1557        message((strat->honey ? strat->P.ecart : 0) + strat->P.pFDeg(),
1558                &olddeg,&reduc,strat, red_result);
1559
1560      /* reduction of the element choosen from L */
1561      red_result = strat->red(&strat->P,strat);
1562    }
1563
1564    // reduction to non-zero new poly
1565    if (red_result == 1)
1566    {
1567      /* statistic */
1568      if (TEST_OPT_PROT) PrintS("s");
1569
1570      // get the polynomial (canonicalize bucket, make sure P.p is set)
1571      strat->P.GetP(strat->lmBin);
1572
1573      int pos=posInS(strat,strat->sl,strat->P.p,strat->P.ecart);
1574
1575      // reduce the tail and normalize poly
1576      if (TEST_OPT_INTSTRATEGY)
1577      {
1578        strat->P.pCleardenom();
1579        if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
1580        {
1581          strat->P.p = redtailBba(&(strat->P),pos-1,strat, withT);
1582          strat->P.pCleardenom();
1583        }
1584      }
1585      else
1586      {
1587        strat->P.pNorm();
1588        if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
1589          strat->P.p = redtailBba(&(strat->P),pos-1,strat, withT);
1590      }
1591
[ad1c3b]1592      // here we must shrink again! and optionally reduce again
1593      // or build shrink into redtailBba!
1594
[cb0fbe]1595#ifdef KDEBUG
1596      if (TEST_OPT_DEBUG){PrintS("new s:");strat->P.wrp();PrintLn();}
1597#endif
1598
1599      // min_std stuff
1600      if ((strat->P.p1==NULL) && (strat->minim>0))
1601      {
1602        if (strat->minim==1)
1603        {
1604          strat->M->m[minimcnt]=p_Copy(strat->P.p,currRing,strat->tailRing);
1605          p_Delete(&strat->P.p2, currRing, strat->tailRing);
1606        }
1607        else
1608        {
1609          strat->M->m[minimcnt]=strat->P.p2;
1610          strat->P.p2=NULL;
1611        }
1612        if (strat->tailRing!=currRing && pNext(strat->M->m[minimcnt])!=NULL)
1613          pNext(strat->M->m[minimcnt])
1614            = strat->p_shallow_copy_delete(pNext(strat->M->m[minimcnt]),
1615                                           strat->tailRing, currRing,
1616                                           currRing->PolyBin);
1617        minimcnt++;
1618      }
1619
[ad1c3b]1620    /* here in the nonhomog case we shrink the reduced poly AGAIN */
[eed827]1621
[ad1c3b]1622    if ( ! strat->homog)
1623    {
1624      strat->P.GetP(strat->lmBin); // because shifts are counted with .p structure
1625      /* assume strat->P.t_p != NULL */
1626      /* in the nonhomog case we have to shrink the polynomial */
1627      assume(strat->P.t_p!=NULL); // poly qq defined above
1628      qq = p_Shrink(strat->P.t_p, lV, strat->tailRing); // direct shrink
1629      if (qq != NULL)
1630      {
1631         /* we're here if Shrink is nonzero */
1632        //         strat->P.p =  NULL;
[eed827]1633        //        strat->P.Delete(); /* deletes P.p and P.t_p */ //error
[ad1c3b]1634        strat->P.p   =  NULL; // is not set by Delete
1635        strat->P.t_p =  qq;
1636        strat->P.GetP(strat->lmBin);
1637        // update sev and length
1638        strat->initEcart(&(strat->P));
1639        strat->P.sev = pGetShortExpVector(strat->P.p);
1640      }
1641      else
1642      {
1643         /* Shrink is zero, like y(1)*y(2) - y(1)*y(3)*/
1644#ifdef PDEBUG
1645         if (TEST_OPT_DEBUG){PrintS("nonzero s shrinks to 0");PrintLn();}
1646#endif
[eed827]1647         //         strat->P.Delete();  // cause error
1648         strat->P.p = NULL;
1649         strat->P.t_p = NULL;
[ad1c3b]1650           //         strat->P.p = NULL; // or delete strat->P.p ?
[eed827]1651         goto     red_shrink2zero;
[ad1c3b]1652       }
1653    }
1654      /* end shrinking poly AGAIN in the nonhomog case */
1655
1656
[cb0fbe]1657      // enter into S, L, and T
1658      //if ((!TEST_OPT_IDLIFT) || (pGetComp(strat->P.p) <= strat->syzComp))
[37a4c3]1659      //        enterT(strat->P, strat); // this was here before Shift stuff
1660      //enterTShift(LObject p, kStrategy strat, int atT, int uptodeg, int lV); // syntax
[4d2ab5c]1661      // the default value for atT = -1 as in bba
[eed827]1662      /*   strat->P.GetP(); */
[ad1c3b]1663      // because shifts are counted with .p structure // done before, but ?
[37a4c3]1664      enterTShift(strat->P,strat,-1,uptodeg, lV);
1665      enterpairsShift(strat->P.p,strat->sl,strat->P.ecart,pos,strat, strat->tl,uptodeg,lV);
[4d2ab5c]1666      //      enterpairsShift(vw,strat->sl,strat->P.ecart,pos,strat, strat->tl,uptodeg,lV);
[cb0fbe]1667      // posInS only depends on the leading term
[1c35568]1668      strat->enterS(strat->P, pos, strat, strat->tl);
[ad1c3b]1669
[cb0fbe]1670      if (hilb!=NULL) khCheck(Q,w,hilb,hilbeledeg,hilbcount,strat);
1671//      Print("[%d]",hilbeledeg);
1672      if (strat->P.lcm!=NULL) pLmFree(strat->P.lcm);
1673      if (strat->sl>srmax) srmax = strat->sl;
1674    }
[eed827]1675    else
[cb0fbe]1676    {
[ad1c3b]1677    red_shrink2zero:
1678      if (strat->P.p1 == NULL && strat->minim > 0)
1679      {
[eed827]1680        p_Delete(&strat->P.p2, currRing, strat->tailRing);
[ad1c3b]1681      }
[cb0fbe]1682    }
1683#ifdef KDEBUG
1684    memset(&(strat->P), 0, sizeof(strat->P));
1685#endif
1686    kTest_TS(strat);
1687  }
1688#ifdef KDEBUG
1689  if (TEST_OPT_DEBUG) messageSets(strat);
1690#endif
1691  /* complete reduction of the standard basis--------- */
[d5564f8]1692  /*  shift case: look for elt's in S such that they are divisible by elt in T */
[4c4979]1693  //  if (TEST_OPT_SB_1)
1694  if (TEST_OPT_REDSB)
[cb0fbe]1695  {
[4c4979]1696    int k=0;
1697    int j=-1;
[cb0fbe]1698    while(k<=strat->sl)
1699    {
[4c4979]1700//       loop
1701//       {
1702//         if (j>=k) break;
1703//         clearS(strat->S[j],strat->sevS[j],&k,&j,strat);
1704//         j++;
1705//       }
1706      LObject Ln (strat->S[k],currRing, strat->tailRing);
1707      Ln.SetShortExpVector();
1708      j = kFindDivisibleByInT(strat->T, strat->sevT, strat->tl, &Ln, j+1);
1709      if (j<0) {  k++; j=-1;}
1710      else
[cb0fbe]1711      {
[4c4979]1712        if ( pLmCmp(strat->S[k],strat->T[j].p) == 0)
1713        {
1714          j = kFindDivisibleByInT(strat->T, strat->sevT, strat->tl, &Ln, j+1);
1715          if (j<0) {  k++; j=-1;}
1716          else
1717          {
1718            deleteInS(k,strat);
1719          }
1720        }
1721        else
1722        {
1723          deleteInS(k,strat);
1724        }
[cb0fbe]1725      }
1726    }
1727  }
1728
1729  if (TEST_OPT_REDSB)
[4c4979]1730  {    completeReduce(strat, TRUE); //shift: withT = TRUE
[cb0fbe]1731    if (strat->completeReduce_retry)
1732    {
1733      // completeReduce needed larger exponents, retry
1734      // to reduce with S (instead of T)
1735      // and in currRing (instead of strat->tailRing)
1736      cleanT(strat);strat->tailRing=currRing;
1737      int i;
1738      for(i=strat->sl;i>=0;i--) strat->S_2_R[i]=-1;
[4d43ff]1739      completeReduce(strat, TRUE);
[cb0fbe]1740    }
1741  }
[5accf0]1742  else if (TEST_OPT_PROT) PrintLn();
[cb0fbe]1743
1744  /* release temp data-------------------------------- */
1745  exitBuchMora(strat);
1746  if (TEST_OPT_WEIGHTM)
1747  {
1748    pRestoreDegProcs(pFDegOld, pLDegOld);
1749    if (ecartWeights)
1750    {
1751      omFreeSize((ADDRESS)ecartWeights,(pVariables+1)*sizeof(short));
1752      ecartWeights=NULL;
1753    }
1754  }
1755  if (TEST_OPT_PROT) messageStat(srmax,lrmax,hilbcount,strat);
1756  if (Q!=NULL) updateResult(strat->Shdl,Q,strat);
1757  return (strat->Shdl);
1758}
1759
[1c473f]1760
[cb0fbe]1761ideal freegb(ideal I, int uptodeg, int lVblock)
1762{
1763  /* todo main call */
1764
[37a4c3]1765  /* assume: ring is prepared, ideal is copied into shifted ring */
1766  /* uptodeg and lVblock are correct - test them! */
1767
[dabe365]1768  /* check whether the ideal is in V */
[9f5fca]1769
[db0c264]1770//  if (0)
1771  if (! ideal_isInV(I,lVblock) )
[dabe365]1772  {
[9f5fca]1773    WerrorS("The input ideal contains incorrectly encoded elements! ");
[dabe365]1774    return(NULL);
1775  }
1776
[1c473f]1777  //  kStrategy strat = new skStrategy;
[cb0fbe]1778  /* ideal bbaShift(ideal F, ideal Q,intvec *w,intvec *hilb,kStrategy strat, int uptodeg, int lV) */
1779  /* at the moment:
1780- no quotient (check)
1781- no *w, no *hilb
1782  */
[1c473f]1783  /* ideal F, ideal Q, tHomog h,intvec ** w, intvec *hilb,int syzComp,
1784     int newIdeal, intvec *vw) */
1785  ideal RS = kStdShift(I,NULL, testHomog, NULL,NULL,0,0,NULL, uptodeg, lVblock);
1786    //bbaShift(I,NULL, NULL, NULL, strat, uptodeg, lVblock);
[4d2ab5c]1787  idSkipZeroes(RS);
[cb0fbe]1788  return(RS);
1789}
[37a4c3]1790
1791/*2
1792*reduces h with elements from T choosing  the first possible
1793* element in t with respect to the given pDivisibleBy
1794*/
1795int redFirstShift (LObject* h,kStrategy strat)
1796{
1797  if (h->IsNull()) return 0;
1798
1799  int at, reddeg,d;
1800  int pass = 0;
1801  int j = 0;
1802
1803  if (! strat->homog)
1804  {
1805    d = h->GetpFDeg() + h->ecart;
1806    reddeg = strat->LazyDegree+d;
1807  }
1808  h->SetShortExpVector();
1809  loop
1810  {
1811    j = kFindDivisibleByInT(strat->T, strat->sevT, strat->tl, h);
1812    if (j < 0)
1813    {
1814      h->SetDegStuffReturnLDeg(strat->LDegLast);
1815      return 1;
1816    }
1817
1818    if (!TEST_OPT_INTSTRATEGY)
1819      strat->T[j].pNorm();
1820#ifdef KDEBUG
1821    if (TEST_OPT_DEBUG)
1822    {
1823      PrintS("reduce ");
1824      h->wrp();
1825      PrintS(" with ");
1826      strat->T[j].wrp();
1827    }
1828#endif
1829    ksReducePoly(h, &(strat->T[j]), strat->kNoetherTail(), NULL, strat);
[0724284]1830    if (!h->IsNull())
1831    {
1832      poly qq=p_Shrink(h->GetTP(),strat->lV,strat->tailRing);
1833      h->p=NULL;
1834      h->t_p=qq;
1835      if (qq!=NULL) h->GetP(strat->lmBin);
1836    }
[d5564f8]1837
[37a4c3]1838#ifdef KDEBUG
1839    if (TEST_OPT_DEBUG)
1840    {
1841      PrintS(" to ");
1842      wrp(h->p);
1843      PrintLn();
1844    }
1845#endif
1846    if (h->IsNull())
1847    {
1848      if (h->lcm!=NULL) pLmFree(h->lcm);
1849      h->Clear();
1850      return 0;
1851    }
1852    h->SetShortExpVector();
1853
1854#if 0
1855    if ((strat->syzComp!=0) && !strat->honey)
1856    {
1857      if ((strat->syzComp>0) &&
1858          (h->Comp() > strat->syzComp))
1859      {
1860        assume(h->MinComp() > strat->syzComp);
1861#ifdef KDEBUG
1862        if (TEST_OPT_DEBUG) PrintS(" > syzComp\n");
1863#endif
1864        if (strat->homog)
1865          h->SetDegStuffReturnLDeg(strat->LDegLast);
1866        return -2;
1867      }
1868    }
1869#endif
1870    if (!strat->homog)
1871    {
[228b631]1872      if (!TEST_OPT_OLDSTD && strat->honey)
[37a4c3]1873      {
1874        h->SetpFDeg();
1875        if (strat->T[j].ecart <= h->ecart)
1876          h->ecart = d - h->GetpFDeg();
1877        else
1878          h->ecart = d - h->GetpFDeg() + strat->T[j].ecart - h->ecart;
1879
1880        d = h->GetpFDeg() + h->ecart;
1881      }
1882      else
1883        d = h->SetDegStuffReturnLDeg(strat->LDegLast);
1884      /*- try to reduce the s-polynomial -*/
1885      pass++;
1886      /*
1887       *test whether the polynomial should go to the lazyset L
1888       *-if the degree jumps
1889       *-if the number of pre-defined reductions jumps
1890       */
[228b631]1891      if (!TEST_OPT_REDTHROUGH && (strat->Ll >= 0)
[37a4c3]1892          && ((d >= reddeg) || (pass > strat->LazyPass)))
1893      {
1894        h->SetLmCurrRing();
1895        if (strat->posInLDependsOnLength)
1896          h->SetLength(strat->length_pLength);
1897        at = strat->posInL(strat->L,strat->Ll,h,strat);
1898        if (at <= strat->Ll)
1899        {
1900          int dummy=strat->sl;
[eed827]1901          /*          if (kFindDivisibleByInS(strat,&dummy, h) < 0) */
[37a4c3]1902          if (kFindDivisibleByInT(strat->T,strat->sevT, dummy, h) < 0)
1903            return 1;
1904          enterL(&strat->L,&strat->Ll,&strat->Lmax,*h,at);
1905#ifdef KDEBUG
1906          if (TEST_OPT_DEBUG) Print(" degree jumped; ->L%d\n",at);
[07625cb]1907#endif
[37a4c3]1908          h->Clear();
1909          return -1;
1910        }
1911      }
1912      if ((TEST_OPT_PROT) && (strat->Ll < 0) && (d >= reddeg))
1913      {
1914        reddeg = d+1;
1915        Print(".%d",d);mflush();
1916      }
1917    }
1918  }
1919}
1920
1921void initBbaShift(ideal F,kStrategy strat)
1922{
1923  int i;
1924  idhdl h;
1925 /* setting global variables ------------------- */
1926  strat->enterS = enterSBba; /* remains as is, we change enterT! */
1927
1928  strat->red = redFirstShift; /* no redHomog ! */
1929
1930  if (pLexOrder && strat->honey)
1931    strat->initEcart = initEcartNormal;
1932  else
1933    strat->initEcart = initEcartBBA;
1934  if (strat->honey)
1935    strat->initEcartPair = initEcartPairMora;
1936  else
1937    strat->initEcartPair = initEcartPairBba;
1938  strat->kIdeal = NULL;
1939  //if (strat->ak==0) strat->kIdeal->rtyp=IDEAL_CMD;
1940  //else              strat->kIdeal->rtyp=MODUL_CMD;
1941  //strat->kIdeal->data=(void *)strat->Shdl;
1942  if ((TEST_OPT_WEIGHTM)&&(F!=NULL))
1943  {
1944    //interred  machen   Aenderung
1945    pFDegOld=pFDeg;
1946    pLDegOld=pLDeg;
1947    //h=ggetid("ecart");
1948    //if ((h!=NULL) /*&& (IDTYP(h)==INTVEC_CMD)*/)
1949    //{
1950    //  ecartWeights=iv2array(IDINTVEC(h));
1951    //}
1952    //else
1953    {
1954      ecartWeights=(short *)omAlloc((pVariables+1)*sizeof(short));
1955      /*uses automatic computation of the ecartWeights to set them*/
1956      kEcartWeights(F->m,IDELEMS(F)-1,ecartWeights);
1957    }
1958    pRestoreDegProcs(totaldegreeWecart, maxdegreeWecart);
1959    if (TEST_OPT_PROT)
1960    {
1961      for(i=1; i<=pVariables; i++)
1962        Print(" %d",ecartWeights[i]);
1963      PrintLn();
1964      mflush();
1965    }
1966  }
1967}
[037df4]1968#endif
Note: See TracBrowser for help on using the repository browser.