source: git/kernel/kstd2.cc @ e9c3b2

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