source: git/kernel/combinatorics/hdegree.cc @ 2965b7

spielwiese
Last change on this file since 2965b7 was 2965b7, checked in by Hans Schoenemann <hannes@…>, 4 years ago
fix: scDimIntRing
  • Property mode set to 100644
File size: 31.7 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5*  ABSTRACT -  dimension, multiplicity, HC, kbase
6*/
7
8#include "kernel/mod2.h"
9
10#include "misc/intvec.h"
11#include "coeffs/numbers.h"
12
13#include "kernel/structs.h"
14#include "kernel/ideals.h"
15#include "kernel/polys.h"
16
17#include "kernel/combinatorics/hutil.h"
18#include "kernel/combinatorics/hilb.h"
19#include "kernel/combinatorics/stairc.h"
20
21VAR int  hCo, hMu, hMu2;
22VAR omBin indlist_bin = omGetSpecBin(sizeof(indlist));
23
24/*0 implementation*/
25
26// dimension
27
28void hDimSolve(scmon pure, int Npure, scfmon rad, int Nrad,
29 varset var, int Nvar)
30{
31  int  dn, iv, rad0, b, c, x;
32  scmon pn;
33  scfmon rn;
34  if (Nrad < 2)
35  {
36    dn = Npure + Nrad;
37    if (dn < hCo)
38      hCo = dn;
39    return;
40  }
41  if (Npure+1 >= hCo)
42    return;
43  iv = Nvar;
44  while(pure[var[iv]]) iv--;
45  hStepR(rad, Nrad, var, iv, &rad0);
46  if (rad0!=0)
47  {
48    iv--;
49    if (rad0 < Nrad)
50    {
51      pn = hGetpure(pure);
52      rn = hGetmem(Nrad, rad, radmem[iv]);
53      hDimSolve(pn, Npure + 1, rn, rad0, var, iv);
54      b = rad0;
55      c = Nrad;
56      hElimR(rn, &rad0, b, c, var, iv);
57      hPure(rn, b, &c, var, iv, pn, &x);
58      hLex2R(rn, rad0, b, c, var, iv, hwork);
59      rad0 += (c - b);
60      hDimSolve(pn, Npure + x, rn, rad0, var, iv);
61    }
62    else
63    {
64      hDimSolve(pure, Npure, rad, Nrad, var, iv);
65    }
66  }
67  else
68    hCo = Npure + 1;
69}
70
71int  scDimInt(ideal S, ideal Q)
72{
73  id_Test(S, currRing);
74  if( Q!=NULL ) id_Test(Q, currRing);
75
76  int  mc;
77  hexist = hInit(S, Q, &hNexist, currRing);
78  if (!hNexist)
79    return (currRing->N);
80  hwork = (scfmon)omAlloc(hNexist * sizeof(scmon));
81  hvar = (varset)omAlloc(((currRing->N) + 1) * sizeof(int));
82  hpure = (scmon)omAlloc((1 + ((currRing->N) * (currRing->N))) * sizeof(int));
83  mc = hisModule;
84  if (!mc)
85  {
86    hrad = hexist;
87    hNrad = hNexist;
88  }
89  else
90    hrad = (scfmon)omAlloc(hNexist * sizeof(scmon));
91  radmem = hCreate((currRing->N) - 1);
92  hCo = (currRing->N) + 1;
93  loop
94  {
95    if (mc)
96      hComp(hexist, hNexist, mc, hrad, &hNrad);
97    if (hNrad)
98    {
99      hNvar = (currRing->N);
100      hRadical(hrad, &hNrad, hNvar);
101      hSupp(hrad, hNrad, hvar, &hNvar);
102      if (hNvar)
103      {
104        memset(hpure, 0, ((currRing->N) + 1) * sizeof(int));
105        hPure(hrad, 0, &hNrad, hvar, hNvar, hpure, &hNpure);
106        hLexR(hrad, hNrad, hvar, hNvar);
107        hDimSolve(hpure, hNpure, hrad, hNrad, hvar, hNvar);
108      }
109    }
110    else
111    {
112      hCo = 0;
113      break;
114    }
115    mc--;
116    if (mc <= 0)
117      break;
118  }
119  hKill(radmem, (currRing->N) - 1);
120  omFreeSize((ADDRESS)hpure, (1 + ((currRing->N) * (currRing->N))) * sizeof(int));
121  omFreeSize((ADDRESS)hvar, ((currRing->N) + 1) * sizeof(int));
122  omFreeSize((ADDRESS)hwork, hNexist * sizeof(scmon));
123  hDelete(hexist, hNexist);
124  if (hisModule)
125    omFreeSize((ADDRESS)hrad, hNexist * sizeof(scmon));
126  return (currRing->N) - hCo;
127}
128
129int  scDimIntRing(ideal vid, ideal Q)
130{
131#ifdef HAVE_RINGS
132  if (rField_is_Ring(currRing))
133  {
134    int i = idPosConstant(vid);
135    if ((i != -1) && (n_IsUnit(pGetCoeff(vid->m[i]),currRing->cf)))
136    { /* ideal v contains unit; dim = -1 */
137      return(-1);
138    }
139    ideal vv = id_Head(vid,currRing);
140    idSkipZeroes(vv);
141    i = idPosConstant(vid);
142    int d;
143    if(i == -1)
144    {
145      d = scDimInt(vv, Q);
146      if(rField_is_Z(currRing))
147        d++;
148    }
149    else
150    {
151      if(n_IsUnit(pGetCoeff(vv->m[i]),currRing->cf))
152        d = -1;
153      else
154        d = scDimInt(vv, Q);
155    }
156    //Anne's Idea for std(4,2x) = 0 bug
157    int dcurr = d;
158    for(unsigned ii=0;ii<(unsigned)IDELEMS(vv);ii++)
159    {
160      if(vv->m[ii] != NULL && !n_IsUnit(pGetCoeff(vv->m[ii]),currRing->cf))
161      {
162        ideal vc = idCopy(vv);
163        poly c = pInit();
164        pSetCoeff0(c,nCopy(pGetCoeff(vv->m[ii])));
165        idInsertPoly(vc,c);
166        idSkipZeroes(vc);
167        for(unsigned jj = 0;jj<(unsigned)IDELEMS(vc)-1;jj++)
168        {
169          if((vc->m[jj]!=NULL)
170          && (n_DivBy(pGetCoeff(vc->m[jj]),pGetCoeff(c),currRing->cf)))
171          {
172            pDelete(&vc->m[jj]);
173          }
174        }
175        idSkipZeroes(vc);
176        i = idPosConstant(vc);
177        if (i != -1) pDelete(&vc->m[i]);
178        dcurr = scDimInt(vc, Q);
179        // the following assumes the ground rings to be either zero- or one-dimensional
180        if((i==-1) && rField_is_Z(currRing))
181        {
182          // should also be activated for other euclidean domains as groundfield
183          dcurr++;
184        }
185        idDelete(&vc);
186      }
187      if(dcurr > d)
188          d = dcurr;
189    }
190    idDelete(&vv);
191    return d;
192  }
193#endif
194  return scDimInt(vid,Q);
195}
196
197// independent set
198STATIC_VAR scmon hInd;
199
200static void hIndSolve(scmon pure, int Npure, scfmon rad, int Nrad,
201 varset var, int Nvar)
202{
203  int  dn, iv, rad0, b, c, x;
204  scmon pn;
205  scfmon rn;
206  if (Nrad < 2)
207  {
208    dn = Npure + Nrad;
209    if (dn < hCo)
210    {
211      hCo = dn;
212      for (iv=(currRing->N); iv; iv--)
213      {
214        if (pure[iv])
215          hInd[iv] = 0;
216        else
217          hInd[iv] = 1;
218      }
219      if (Nrad)
220      {
221        pn = *rad;
222        iv = Nvar;
223        loop
224        {
225          x = var[iv];
226          if (pn[x])
227          {
228            hInd[x] = 0;
229            break;
230          }
231          iv--;
232        }
233      }
234    }
235    return;
236  }
237  if (Npure+1 >= hCo)
238    return;
239  iv = Nvar;
240  while(pure[var[iv]]) iv--;
241  hStepR(rad, Nrad, var, iv, &rad0);
242  if (rad0)
243  {
244    iv--;
245    if (rad0 < Nrad)
246    {
247      pn = hGetpure(pure);
248      rn = hGetmem(Nrad, rad, radmem[iv]);
249      pn[var[iv + 1]] = 1;
250      hIndSolve(pn, Npure + 1, rn, rad0, var, iv);
251      pn[var[iv + 1]] = 0;
252      b = rad0;
253      c = Nrad;
254      hElimR(rn, &rad0, b, c, var, iv);
255      hPure(rn, b, &c, var, iv, pn, &x);
256      hLex2R(rn, rad0, b, c, var, iv, hwork);
257      rad0 += (c - b);
258      hIndSolve(pn, Npure + x, rn, rad0, var, iv);
259    }
260    else
261    {
262      hIndSolve(pure, Npure, rad, Nrad, var, iv);
263    }
264  }
265  else
266  {
267    hCo = Npure + 1;
268    for (x=(currRing->N); x; x--)
269    {
270      if (pure[x])
271        hInd[x] = 0;
272      else
273        hInd[x] = 1;
274    }
275    hInd[var[iv]] = 0;
276  }
277}
278
279intvec * scIndIntvec(ideal S, ideal Q)
280{
281  id_Test(S, currRing);
282  if( Q!=NULL ) id_Test(Q, currRing);
283
284  intvec *Set=new intvec((currRing->N));
285  int  mc,i;
286  hexist = hInit(S, Q, &hNexist, currRing);
287  if (hNexist==0)
288  {
289    for(i=0; i<(currRing->N); i++)
290      (*Set)[i]=1;
291    return Set;
292  }
293  hwork = (scfmon)omAlloc(hNexist * sizeof(scmon));
294  hvar = (varset)omAlloc(((currRing->N) + 1) * sizeof(int));
295  hpure = (scmon)omAlloc((1 + ((currRing->N) * (currRing->N))) * sizeof(int));
296  hInd = (scmon)omAlloc0((1 + (currRing->N)) * sizeof(int));
297  mc = hisModule;
298  if (mc==0)
299  {
300    hrad = hexist;
301    hNrad = hNexist;
302  }
303  else
304    hrad = (scfmon)omAlloc(hNexist * sizeof(scmon));
305  radmem = hCreate((currRing->N) - 1);
306  hCo = (currRing->N) + 1;
307  loop
308  {
309    if (mc!=0)
310      hComp(hexist, hNexist, mc, hrad, &hNrad);
311    if (hNrad!=0)
312    {
313      hNvar = (currRing->N);
314      hRadical(hrad, &hNrad, hNvar);
315      hSupp(hrad, hNrad, hvar, &hNvar);
316      if (hNvar!=0)
317      {
318        memset(hpure, 0, ((currRing->N) + 1) * sizeof(int));
319        hPure(hrad, 0, &hNrad, hvar, hNvar, hpure, &hNpure);
320        hLexR(hrad, hNrad, hvar, hNvar);
321        hIndSolve(hpure, hNpure, hrad, hNrad, hvar, hNvar);
322      }
323    }
324    else
325    {
326      hCo = 0;
327      break;
328    }
329    mc--;
330    if (mc <= 0)
331      break;
332  }
333  for(i=0; i<(currRing->N); i++)
334    (*Set)[i] = hInd[i+1];
335  hKill(radmem, (currRing->N) - 1);
336  omFreeSize((ADDRESS)hpure, (1 + ((currRing->N) * (currRing->N))) * sizeof(int));
337  omFreeSize((ADDRESS)hInd, (1 + (currRing->N)) * sizeof(int));
338  omFreeSize((ADDRESS)hvar, ((currRing->N) + 1) * sizeof(int));
339  omFreeSize((ADDRESS)hwork, hNexist * sizeof(scmon));
340  hDelete(hexist, hNexist);
341  if (hisModule)
342    omFreeSize((ADDRESS)hrad, hNexist * sizeof(scmon));
343  return Set;
344}
345
346VAR indset ISet, JSet;
347
348static BOOLEAN hNotZero(scfmon rad, int Nrad, varset var, int Nvar)
349{
350  int  k1, i;
351  k1 = var[Nvar];
352  i = 0;
353  loop
354  {
355    if (rad[i][k1]==0)
356      return FALSE;
357    i++;
358    if (i == Nrad)
359      return TRUE;
360  }
361}
362
363static void hIndep(scmon pure)
364{
365  int iv;
366  intvec *Set;
367
368  Set = ISet->set = new intvec((currRing->N));
369  for (iv=(currRing->N); iv!=0 ; iv--)
370  {
371    if (pure[iv])
372      (*Set)[iv-1] = 0;
373    else
374      (*Set)[iv-1] = 1;
375  }
376  ISet = ISet->nx = (indset)omAlloc0Bin(indlist_bin);
377  hMu++;
378}
379
380void hIndMult(scmon pure, int Npure, scfmon rad, int Nrad,
381 varset var, int Nvar)
382{
383  int  dn, iv, rad0, b, c, x;
384  scmon pn;
385  scfmon rn;
386  if (Nrad < 2)
387  {
388    dn = Npure + Nrad;
389    if (dn == hCo)
390    {
391      if (Nrad==0)
392        hIndep(pure);
393      else
394      {
395        pn = *rad;
396        for (iv = Nvar; iv!=0; iv--)
397        {
398          x = var[iv];
399          if (pn[x])
400          {
401            pure[x] = 1;
402            hIndep(pure);
403            pure[x] = 0;
404          }
405        }
406      }
407    }
408    return;
409  }
410  iv = Nvar;
411  dn = Npure+1;
412  if (dn >= hCo)
413  {
414    if (dn > hCo)
415      return;
416    loop
417    {
418      if(!pure[var[iv]])
419      {
420        if(hNotZero(rad, Nrad, var, iv))
421        {
422          pure[var[iv]] = 1;
423          hIndep(pure);
424          pure[var[iv]] = 0;
425        }
426      }
427      iv--;
428      if (!iv)
429        return;
430    }
431  }
432  while(pure[var[iv]]) iv--;
433  hStepR(rad, Nrad, var, iv, &rad0);
434  iv--;
435  if (rad0 < Nrad)
436  {
437    pn = hGetpure(pure);
438    rn = hGetmem(Nrad, rad, radmem[iv]);
439    pn[var[iv + 1]] = 1;
440    hIndMult(pn, Npure + 1, rn, rad0, var, iv);
441    pn[var[iv + 1]] = 0;
442    b = rad0;
443    c = Nrad;
444    hElimR(rn, &rad0, b, c, var, iv);
445    hPure(rn, b, &c, var, iv, pn, &x);
446    hLex2R(rn, rad0, b, c, var, iv, hwork);
447    rad0 += (c - b);
448    hIndMult(pn, Npure + x, rn, rad0, var, iv);
449  }
450  else
451  {
452    hIndMult(pure, Npure, rad, Nrad, var, iv);
453  }
454}
455
456/*3
457* consider indset x := !pure
458* (for all i) (if(sm(i) > x) return FALSE)
459* else return TRUE
460*/
461static BOOLEAN hCheck1(indset sm, scmon pure)
462{
463  int iv;
464  intvec *Set;
465  while (sm->nx != NULL)
466  {
467    Set = sm->set;
468    iv=(currRing->N);
469    loop
470    {
471      if (((*Set)[iv-1] == 0) && (pure[iv] == 0))
472        break;
473      iv--;
474      if (iv == 0)
475        return FALSE;
476    }
477    sm = sm->nx;
478  }
479  return TRUE;
480}
481
482/*3
483* consider indset x := !pure
484* (for all i) if(x > sm(i)) delete sm(i))
485* return (place for x)
486*/
487static indset hCheck2(indset sm, scmon pure)
488{
489  int iv;
490  intvec *Set;
491  indset be, a1 = NULL;
492  while (sm->nx != NULL)
493  {
494    Set = sm->set;
495    iv=(currRing->N);
496    loop
497    {
498      if ((pure[iv] == 1) && ((*Set)[iv-1] == 1))
499        break;
500      iv--;
501      if (iv == 0)
502      {
503        if (a1 == NULL)
504        {
505          a1 = sm;
506        }
507        else
508        {
509          hMu2--;
510          be->nx = sm->nx;
511          delete Set;
512          omFreeBin((ADDRESS)sm, indlist_bin);
513          sm = be;
514        }
515        break;
516      }
517    }
518    be = sm;
519    sm = sm->nx;
520  }
521  if (a1 != NULL)
522  {
523    return a1;
524  }
525  else
526  {
527    hMu2++;
528    sm->set = new intvec((currRing->N));
529    sm->nx = (indset)omAlloc0Bin(indlist_bin);
530    return sm;
531  }
532}
533
534/*2
535*  definition x >= y
536*      x(i) == 0 => y(i) == 0
537*      > ex. j with x(j) == 1 and y(j) == 0
538*/
539static void hCheckIndep(scmon pure)
540{
541  intvec *Set;
542  indset res;
543  int iv;
544  if (hCheck1(ISet, pure))
545  {
546    if (hCheck1(JSet, pure))
547    {
548      res = hCheck2(JSet,pure);
549      if (res == NULL)
550        return;
551      Set = res->set;
552      for (iv=(currRing->N); iv; iv--)
553      {
554        if (pure[iv])
555          (*Set)[iv-1] = 0;
556        else
557          (*Set)[iv-1] = 1;
558      }
559    }
560  }
561}
562
563void hIndAllMult(scmon pure, int Npure, scfmon rad, int Nrad,
564 varset var, int Nvar)
565{
566  int  dn, iv, rad0, b, c, x;
567  scmon pn;
568  scfmon rn;
569  if (Nrad < 2)
570  {
571    dn = Npure + Nrad;
572    if (dn > hCo)
573    {
574      if (!Nrad)
575        hCheckIndep(pure);
576      else
577      {
578        pn = *rad;
579        for (iv = Nvar; iv; iv--)
580        {
581          x = var[iv];
582          if (pn[x])
583          {
584            pure[x] = 1;
585            hCheckIndep(pure);
586            pure[x] = 0;
587          }
588        }
589      }
590    }
591    return;
592  }
593  iv = Nvar;
594  while(pure[var[iv]]) iv--;
595  hStepR(rad, Nrad, var, iv, &rad0);
596  iv--;
597  if (rad0 < Nrad)
598  {
599    pn = hGetpure(pure);
600    rn = hGetmem(Nrad, rad, radmem[iv]);
601    pn[var[iv + 1]] = 1;
602    hIndAllMult(pn, Npure + 1, rn, rad0, var, iv);
603    pn[var[iv + 1]] = 0;
604    b = rad0;
605    c = Nrad;
606    hElimR(rn, &rad0, b, c, var, iv);
607    hPure(rn, b, &c, var, iv, pn, &x);
608    hLex2R(rn, rad0, b, c, var, iv, hwork);
609    rad0 += (c - b);
610    hIndAllMult(pn, Npure + x, rn, rad0, var, iv);
611  }
612  else
613  {
614    hIndAllMult(pure, Npure, rad, Nrad, var, iv);
615  }
616}
617
618// multiplicity
619
620static int hZeroMult(scmon pure, scfmon stc, int Nstc, varset var, int Nvar)
621{
622  int  iv = Nvar -1, sum, a, a0, a1, b, i;
623  int  x, x0;
624  scmon pn;
625  scfmon sn;
626  if (!iv)
627    return pure[var[1]];
628  else if (!Nstc)
629  {
630    sum = 1;
631    for (i = Nvar; i; i--)
632      sum *= pure[var[i]];
633    return sum;
634  }
635  x = a = 0;
636  pn = hGetpure(pure);
637  sn = hGetmem(Nstc, stc, stcmem[iv]);
638  hStepS(sn, Nstc, var, Nvar, &a, &x);
639  if (a == Nstc)
640    return pure[var[Nvar]] * hZeroMult(pn, sn, a, var, iv);
641  else
642    sum = x * hZeroMult(pn, sn, a, var, iv);
643  b = a;
644  loop
645  {
646    a0 = a;
647    x0 = x;
648    hStepS(sn, Nstc, var, Nvar, &a, &x);
649    hElimS(sn, &b, a0, a, var, iv);
650    a1 = a;
651    hPure(sn, a0, &a1, var, iv, pn, &i);
652    hLex2S(sn, b, a0, a1, var, iv, hwork);
653    b += (a1 - a0);
654    if (a < Nstc)
655    {
656      sum += (x - x0) * hZeroMult(pn, sn, b, var, iv);
657    }
658    else
659    {
660      sum += (pure[var[Nvar]] - x0) * hZeroMult(pn, sn, b, var, iv);
661      return sum;
662    }
663  }
664}
665
666static void hProject(scmon pure, varset sel)
667{
668  int  i, i0, k;
669  i0 = 0;
670  for (i = 1; i <= (currRing->N); i++)
671  {
672    if (pure[i])
673    {
674      i0++;
675      sel[i0] = i;
676    }
677  }
678  i = hNstc;
679  memcpy(hwork, hstc, i * sizeof(scmon));
680  hStaircase(hwork, &i, sel, i0);
681  if ((i0 > 2) && (i > 10))
682    hOrdSupp(hwork, i, sel, i0);
683  memset(hpur0, 0, ((currRing->N) + 1) * sizeof(int));
684  hPure(hwork, 0, &i, sel, i0, hpur0, &k);
685  hLexS(hwork, i, sel, i0);
686  hMu += hZeroMult(hpur0, hwork, i, sel, i0);
687}
688
689static void hDimMult(scmon pure, int Npure, scfmon rad, int Nrad,
690 varset var, int Nvar)
691{
692  int  dn, iv, rad0, b, c, x;
693  scmon pn;
694  scfmon rn;
695  if (Nrad < 2)
696  {
697    dn = Npure + Nrad;
698    if (dn == hCo)
699    {
700      if (!Nrad)
701        hProject(pure, hsel);
702      else
703      {
704        pn = *rad;
705        for (iv = Nvar; iv; iv--)
706        {
707          x = var[iv];
708          if (pn[x])
709          {
710            pure[x] = 1;
711            hProject(pure, hsel);
712            pure[x] = 0;
713          }
714        }
715      }
716    }
717    return;
718  }
719  iv = Nvar;
720  dn = Npure+1;
721  if (dn >= hCo)
722  {
723    if (dn > hCo)
724      return;
725    loop
726    {
727      if(!pure[var[iv]])
728      {
729        if(hNotZero(rad, Nrad, var, iv))
730        {
731          pure[var[iv]] = 1;
732          hProject(pure, hsel);
733          pure[var[iv]] = 0;
734        }
735      }
736      iv--;
737      if (!iv)
738        return;
739    }
740  }
741  while(pure[var[iv]]) iv--;
742  hStepR(rad, Nrad, var, iv, &rad0);
743  iv--;
744  if (rad0 < Nrad)
745  {
746    pn = hGetpure(pure);
747    rn = hGetmem(Nrad, rad, radmem[iv]);
748    pn[var[iv + 1]] = 1;
749    hDimMult(pn, Npure + 1, rn, rad0, var, iv);
750    pn[var[iv + 1]] = 0;
751    b = rad0;
752    c = Nrad;
753    hElimR(rn, &rad0, b, c, var, iv);
754    hPure(rn, b, &c, var, iv, pn, &x);
755    hLex2R(rn, rad0, b, c, var, iv, hwork);
756    rad0 += (c - b);
757    hDimMult(pn, Npure + x, rn, rad0, var, iv);
758  }
759  else
760  {
761    hDimMult(pure, Npure, rad, Nrad, var, iv);
762  }
763}
764
765static void hDegree(ideal S, ideal Q)
766{
767  id_Test(S, currRing);
768  if( Q!=NULL ) id_Test(Q, currRing);
769
770  int  di;
771  int  mc;
772  hexist = hInit(S, Q, &hNexist, currRing);
773  if (!hNexist)
774  {
775    hCo = 0;
776    hMu = 1;
777    return;
778  }
779  //hWeight();
780  hwork = (scfmon)omAlloc(hNexist * sizeof(scmon));
781  hvar = (varset)omAlloc(((currRing->N) + 1) * sizeof(int));
782  hsel = (varset)omAlloc(((currRing->N) + 1) * sizeof(int));
783  hpure = (scmon)omAlloc((1 + ((currRing->N) * (currRing->N))) * sizeof(int));
784  hpur0 = (scmon)omAlloc((1 + ((currRing->N) * (currRing->N))) * sizeof(int));
785  mc = hisModule;
786  hrad = (scfmon)omAlloc(hNexist * sizeof(scmon));
787  if (!mc)
788  {
789    memcpy(hrad, hexist, hNexist * sizeof(scmon));
790    hstc = hexist;
791    hNrad = hNstc = hNexist;
792  }
793  else
794    hstc = (scfmon)omAlloc(hNexist * sizeof(scmon));
795  radmem = hCreate((currRing->N) - 1);
796  stcmem = hCreate((currRing->N) - 1);
797  hCo = (currRing->N) + 1;
798  di = hCo + 1;
799  loop
800  {
801    if (mc)
802    {
803      hComp(hexist, hNexist, mc, hrad, &hNrad);
804      hNstc = hNrad;
805      memcpy(hstc, hrad, hNrad * sizeof(scmon));
806    }
807    if (hNrad)
808    {
809      hNvar = (currRing->N);
810      hRadical(hrad, &hNrad, hNvar);
811      hSupp(hrad, hNrad, hvar, &hNvar);
812      if (hNvar)
813      {
814        hCo = hNvar;
815        memset(hpure, 0, ((currRing->N) + 1) * sizeof(int));
816        hPure(hrad, 0, &hNrad, hvar, hNvar, hpure, &hNpure);
817        hLexR(hrad, hNrad, hvar, hNvar);
818        hDimSolve(hpure, hNpure, hrad, hNrad, hvar, hNvar);
819      }
820    }
821    else
822    {
823      hNvar = 1;
824      hCo = 0;
825    }
826    if (hCo < di)
827    {
828      di = hCo;
829      hMu = 0;
830    }
831    if (hNvar && (hCo == di))
832    {
833      if (di && (di < (currRing->N)))
834        hDimMult(hpure, hNpure, hrad, hNrad, hvar, hNvar);
835      else if (!di)
836        hMu++;
837      else
838      {
839        hStaircase(hstc, &hNstc, hvar, hNvar);
840        if ((hNvar > 2) && (hNstc > 10))
841          hOrdSupp(hstc, hNstc, hvar, hNvar);
842        memset(hpur0, 0, ((currRing->N) + 1) * sizeof(int));
843        hPure(hstc, 0, &hNstc, hvar, hNvar, hpur0, &hNpure);
844        hLexS(hstc, hNstc, hvar, hNvar);
845        hMu += hZeroMult(hpur0, hstc, hNstc, hvar, hNvar);
846      }
847    }
848    mc--;
849    if (mc <= 0)
850      break;
851  }
852  hCo = di;
853  hKill(stcmem, (currRing->N) - 1);
854  hKill(radmem, (currRing->N) - 1);
855  omFreeSize((ADDRESS)hpur0, (1 + ((currRing->N) * (currRing->N))) * sizeof(int));
856  omFreeSize((ADDRESS)hpure, (1 + ((currRing->N) * (currRing->N))) * sizeof(int));
857  omFreeSize((ADDRESS)hsel, ((currRing->N) + 1) * sizeof(int));
858  omFreeSize((ADDRESS)hvar, ((currRing->N) + 1) * sizeof(int));
859  omFreeSize((ADDRESS)hwork, hNexist * sizeof(scmon));
860  omFreeSize((ADDRESS)hrad, hNexist * sizeof(scmon));
861  hDelete(hexist, hNexist);
862  if (hisModule)
863    omFreeSize((ADDRESS)hstc, hNexist * sizeof(scmon));
864}
865
866int  scMultInt(ideal S, ideal Q)
867{
868  id_Test(S, currRing);
869  if( Q!=NULL ) id_Test(Q, currRing);
870
871  hDegree(S, Q);
872  return hMu;
873}
874
875void scPrintDegree(int co, int mu)
876{
877  int di = (currRing->N)-co;
878  if (currRing->OrdSgn == 1)
879  {
880    if (di>0)
881      Print("// dimension (proj.)  = %d\n// degree (proj.)   = %d\n", di-1, mu);
882    else
883      Print("// dimension (affine) = 0\n// degree (affine)  = %d\n",       mu);
884  }
885  else
886    Print("// dimension (local)   = %d\n// multiplicity = %d\n", di, mu);
887}
888
889void scDegree(ideal S, intvec *modulweight, ideal Q)
890{
891  id_Test(S, currRing);
892  if( Q!=NULL ) id_Test(Q, currRing);
893
894  int co, mu, l;
895  intvec *hseries2;
896  intvec *hseries1 = hFirstSeries(S, modulweight, Q);
897  l = hseries1->length()-1;
898  if (l > 1)
899    hseries2 = hSecondSeries(hseries1);
900  else
901    hseries2 = hseries1;
902  hDegreeSeries(hseries1, hseries2, &co, &mu);
903  if ((l == 1) &&(mu == 0))
904    scPrintDegree((currRing->N)+1, 0);
905  else
906    scPrintDegree(co, mu);
907  if (l>1)
908    delete hseries1;
909  delete hseries2;
910}
911
912static void hDegree0(ideal S, ideal Q, const ring tailRing)
913{
914  id_TestTail(S, currRing, tailRing);
915  if (Q!=NULL) id_TestTail(Q, currRing, tailRing);
916
917  int  mc;
918  hexist = hInit(S, Q, &hNexist, tailRing);
919  if (!hNexist)
920  {
921    hMu = -1;
922    return;
923  }
924  else
925    hMu = 0;
926
927  const ring r = currRing;
928
929  hwork = (scfmon)omAlloc(hNexist * sizeof(scmon));
930  hvar = (varset)omAlloc(((r->N) + 1) * sizeof(int));
931  hpur0 = (scmon)omAlloc((1 + ((r->N) * (r->N))) * sizeof(int));
932  mc = hisModule;
933  if (!mc)
934  {
935    hstc = hexist;
936    hNstc = hNexist;
937  }
938  else
939    hstc = (scfmon)omAlloc(hNexist * sizeof(scmon));
940  stcmem = hCreate((r->N) - 1);
941  loop
942  {
943    if (mc)
944    {
945      hComp(hexist, hNexist, mc, hstc, &hNstc);
946      if (!hNstc)
947      {
948        hMu = -1;
949        break;
950      }
951    }
952    hNvar = (r->N);
953    for (int i = hNvar; i; i--)
954      hvar[i] = i;
955    hStaircase(hstc, &hNstc, hvar, hNvar);
956    hSupp(hstc, hNstc, hvar, &hNvar);
957    if ((hNvar == (r->N)) && (hNstc >= (r->N)))
958    {
959      if ((hNvar > 2) && (hNstc > 10))
960        hOrdSupp(hstc, hNstc, hvar, hNvar);
961      memset(hpur0, 0, ((r->N) + 1) * sizeof(int));
962      hPure(hstc, 0, &hNstc, hvar, hNvar, hpur0, &hNpure);
963      if (hNpure == hNvar)
964      {
965        hLexS(hstc, hNstc, hvar, hNvar);
966        hMu += hZeroMult(hpur0, hstc, hNstc, hvar, hNvar);
967      }
968      else
969        hMu = -1;
970    }
971    else if (hNvar)
972      hMu = -1;
973    mc--;
974    if (mc <= 0 || hMu < 0)
975      break;
976  }
977  hKill(stcmem, (r->N) - 1);
978  omFreeSize((ADDRESS)hpur0, (1 + ((r->N) * (r->N))) * sizeof(int));
979  omFreeSize((ADDRESS)hvar, ((r->N) + 1) * sizeof(int));
980  omFreeSize((ADDRESS)hwork, hNexist * sizeof(scmon));
981  hDelete(hexist, hNexist);
982  if (hisModule)
983    omFreeSize((ADDRESS)hstc, hNexist * sizeof(scmon));
984}
985
986int  scMult0Int(ideal S, ideal Q, const ring tailRing)
987{
988  id_TestTail(S, currRing, tailRing);
989  if (Q!=NULL) id_TestTail(Q, currRing, tailRing);
990
991  hDegree0(S, Q, tailRing);
992  return hMu;
993}
994
995
996// HC
997
998STATIC_VAR poly pWork;
999
1000static void hHedge(poly hEdge)
1001{
1002  pSetm(pWork);
1003  if (pLmCmp(pWork, hEdge) == currRing->OrdSgn)
1004  {
1005    for (int i = hNvar; i>0; i--)
1006      pSetExp(hEdge,i, pGetExp(pWork,i));
1007    pSetm(hEdge);
1008  }
1009}
1010
1011
1012static void hHedgeStep(scmon pure, scfmon stc,
1013                       int Nstc, varset var, int Nvar,poly hEdge)
1014{
1015  int  iv = Nvar -1, k = var[Nvar], a, a0, a1, b, i;
1016  int  x/*, x0*/;
1017  scmon pn;
1018  scfmon sn;
1019  if (iv==0)
1020  {
1021    pSetExp(pWork, k, pure[k]);
1022    hHedge(hEdge);
1023    return;
1024  }
1025  else if (Nstc==0)
1026  {
1027    for (i = Nvar; i>0; i--)
1028      pSetExp(pWork, var[i], pure[var[i]]);
1029    hHedge(hEdge);
1030    return;
1031  }
1032  x = a = 0;
1033  pn = hGetpure(pure);
1034  sn = hGetmem(Nstc, stc, stcmem[iv]);
1035  hStepS(sn, Nstc, var, Nvar, &a, &x);
1036  if (a == Nstc)
1037  {
1038    pSetExp(pWork, k, pure[k]);
1039    hHedgeStep(pn, sn, a, var, iv,hEdge);
1040    return;
1041  }
1042  else
1043  {
1044    pSetExp(pWork, k, x);
1045    hHedgeStep(pn, sn, a, var, iv,hEdge);
1046  }
1047  b = a;
1048  loop
1049  {
1050    a0 = a;
1051    // x0 = x;
1052    hStepS(sn, Nstc, var, Nvar, &a, &x);
1053    hElimS(sn, &b, a0, a, var, iv);
1054    a1 = a;
1055    hPure(sn, a0, &a1, var, iv, pn, &i);
1056    hLex2S(sn, b, a0, a1, var, iv, hwork);
1057    b += (a1 - a0);
1058    if (a < Nstc)
1059    {
1060      pSetExp(pWork, k, x);
1061      hHedgeStep(pn, sn, b, var, iv,hEdge);
1062    }
1063    else
1064    {
1065      pSetExp(pWork, k, pure[k]);
1066      hHedgeStep(pn, sn, b, var, iv,hEdge);
1067      return;
1068    }
1069  }
1070}
1071
1072void scComputeHC(ideal S, ideal Q, int ak, poly &hEdge, ring tailRing)
1073{
1074  id_TestTail(S, currRing, tailRing);
1075  if (Q!=NULL) id_TestTail(Q, currRing, tailRing);
1076
1077  int  i;
1078  int  k = ak;
1079  #ifdef HAVE_RINGS
1080  if (rField_is_Ring(currRing) && (currRing->OrdSgn == -1))
1081  {
1082    //consider just monic generators (over rings with zero-divisors)
1083    ideal SS=id_Copy(S,tailRing);
1084    for(i=0;i<=idElem(S);i++)
1085    {
1086      if((SS->m[i]!=NULL)
1087      && ((p_IsPurePower(SS->m[i],tailRing)==0)
1088        ||(!n_IsUnit(pGetCoeff(SS->m[i]), tailRing->cf))))
1089      {
1090        p_Delete(&SS->m[i],tailRing);
1091      }
1092    }
1093    S=id_Copy(SS,tailRing);
1094    idSkipZeroes(S);
1095  }
1096  #if 0
1097  printf("\nThis is HC:\n");
1098  for(int ii=0;ii<=idElem(S);ii++)
1099  {
1100    pWrite(S->m[ii]);
1101  }
1102  //getchar();
1103  #endif
1104  #endif
1105  if(idElem(S) == 0)
1106    return;
1107  hNvar = (currRing->N);
1108  hexist = hInit(S, Q, &hNexist, tailRing); // tailRing?
1109  if (k!=0)
1110    hComp(hexist, hNexist, k, hexist, &hNstc);
1111  else
1112    hNstc = hNexist;
1113  assume(hNexist > 0);
1114  hwork = (scfmon)omAlloc(hNexist * sizeof(scmon));
1115  hvar = (varset)omAlloc((hNvar + 1) * sizeof(int));
1116  hpure = (scmon)omAlloc((1 + (hNvar * hNvar)) * sizeof(int));
1117  stcmem = hCreate(hNvar - 1);
1118  for (i = hNvar; i>0; i--)
1119    hvar[i] = i;
1120  hStaircase(hexist, &hNstc, hvar, hNvar);
1121  if ((hNvar > 2) && (hNstc > 10))
1122    hOrdSupp(hexist, hNstc, hvar, hNvar);
1123  memset(hpure, 0, (hNvar + 1) * sizeof(int));
1124  hPure(hexist, 0, &hNstc, hvar, hNvar, hpure, &hNpure);
1125  hLexS(hexist, hNstc, hvar, hNvar);
1126  if (hEdge!=NULL)
1127    pLmFree(hEdge);
1128  hEdge = pInit();
1129  pWork = pInit();
1130  hHedgeStep(hpure, hexist, hNstc, hvar, hNvar,hEdge);
1131  pSetComp(hEdge,ak);
1132  hKill(stcmem, hNvar - 1);
1133  omFreeSize((ADDRESS)hwork, hNexist * sizeof(scmon));
1134  omFreeSize((ADDRESS)hvar, (hNvar + 1) * sizeof(int));
1135  omFreeSize((ADDRESS)hpure, (1 + (hNvar * hNvar)) * sizeof(int));
1136  hDelete(hexist, hNexist);
1137  pLmFree(pWork);
1138}
1139
1140
1141
1142//  kbase
1143
1144STATIC_VAR poly last;
1145STATIC_VAR scmon act;
1146
1147static void scElKbase()
1148{
1149  poly q = pInit();
1150  pSetCoeff0(q,nInit(1));
1151  pSetExpV(q,act);
1152  pNext(q) = NULL;
1153  last = pNext(last) = q;
1154}
1155
1156static int scMax( int i, scfmon stc, int Nvar)
1157{
1158  int x, y=stc[0][Nvar];
1159  for (; i;)
1160  {
1161    i--;
1162    x = stc[i][Nvar];
1163    if (x > y) y = x;
1164  }
1165  return y;
1166}
1167
1168static int scMin( int i, scfmon stc, int Nvar)
1169{
1170  int x, y=stc[0][Nvar];
1171  for (; i;)
1172  {
1173    i--;
1174    x = stc[i][Nvar];
1175    if (x < y) y = x;
1176  }
1177  return y;
1178}
1179
1180static int scRestrict( int &Nstc, scfmon stc, int Nvar)
1181{
1182  int x, y;
1183  int i, j, Istc = Nstc;
1184
1185  y = MAX_INT_VAL;
1186  for (i=Nstc-1; i>=0; i--)
1187  {
1188    j = Nvar-1;
1189    loop
1190    {
1191      if(stc[i][j] != 0) break;
1192      j--;
1193      if (j == 0)
1194      {
1195        Istc--;
1196        x = stc[i][Nvar];
1197        if (x < y) y = x;
1198        stc[i] = NULL;
1199        break;
1200      }
1201    }
1202  }
1203  if (Istc < Nstc)
1204  {
1205    for (i=Nstc-1; i>=0; i--)
1206    {
1207      if (stc[i] && (stc[i][Nvar] >= y))
1208      {
1209        Istc--;
1210        stc[i] = NULL;
1211      }
1212    }
1213    j = 0;
1214    while (stc[j]) j++;
1215    i = j+1;
1216    for(; i<Nstc; i++)
1217    {
1218      if (stc[i])
1219      {
1220        stc[j] = stc[i];
1221        j++;
1222      }
1223    }
1224    Nstc = Istc;
1225    return y;
1226  }
1227  else
1228    return -1;
1229}
1230
1231static void scAll( int Nvar, int deg)
1232{
1233  int i;
1234  int d = deg;
1235  if (d == 0)
1236  {
1237    for (i=Nvar; i; i--) act[i] = 0;
1238    scElKbase();
1239    return;
1240  }
1241  if (Nvar == 1)
1242  {
1243    act[1] = d;
1244    scElKbase();
1245    return;
1246  }
1247  do
1248  {
1249    act[Nvar] = d;
1250    scAll(Nvar-1, deg-d);
1251    d--;
1252  } while (d >= 0);
1253}
1254
1255static void scAllKbase( int Nvar, int ideg, int deg)
1256{
1257  do
1258  {
1259    act[Nvar] = ideg;
1260    scAll(Nvar-1, deg-ideg);
1261    ideg--;
1262  } while (ideg >= 0);
1263}
1264
1265static void scDegKbase( scfmon stc, int Nstc, int Nvar, int deg)
1266{
1267  int  Ivar, Istc, i, j;
1268  scfmon sn;
1269  int x, ideg;
1270
1271  if (deg == 0)
1272  {
1273    for (i=Nstc-1; i>=0; i--)
1274    {
1275      for (j=Nvar;j;j--){ if(stc[i][j]) break; }
1276      if (j==0){return;}
1277    }
1278    for (i=Nvar; i; i--) act[i] = 0;
1279    scElKbase();
1280    return;
1281  }
1282  if (Nvar == 1)
1283  {
1284    for (i=Nstc-1; i>=0; i--) if(deg >= stc[i][1]) return;
1285    act[1] = deg;
1286    scElKbase();
1287    return;
1288  }
1289  Ivar = Nvar-1;
1290  sn = hGetmem(Nstc, stc, stcmem[Ivar]);
1291  x = scRestrict(Nstc, sn, Nvar);
1292  if (x <= 0)
1293  {
1294    if (x == 0) return;
1295    ideg = deg;
1296  }
1297  else
1298  {
1299    if (deg < x) ideg = deg;
1300    else ideg = x-1;
1301    if (Nstc == 0)
1302    {
1303      scAllKbase(Nvar, ideg, deg);
1304      return;
1305    }
1306  }
1307  loop
1308  {
1309    x = scMax(Nstc, sn, Nvar);
1310    while (ideg >= x)
1311    {
1312      act[Nvar] = ideg;
1313      scDegKbase(sn, Nstc, Ivar, deg-ideg);
1314      ideg--;
1315    }
1316    if (ideg < 0) return;
1317    Istc = Nstc;
1318    for (i=Nstc-1; i>=0; i--)
1319    {
1320      if (ideg < sn[i][Nvar])
1321      {
1322        Istc--;
1323        sn[i] = NULL;
1324      }
1325    }
1326    if (Istc == 0)
1327    {
1328      scAllKbase(Nvar, ideg, deg);
1329      return;
1330    }
1331    j = 0;
1332    while (sn[j]) j++;
1333    i = j+1;
1334    for (; i<Nstc; i++)
1335    {
1336      if (sn[i])
1337      {
1338        sn[j] = sn[i];
1339        j++;
1340      }
1341    }
1342    Nstc = Istc;
1343  }
1344}
1345
1346static void scInKbase( scfmon stc, int Nstc, int Nvar)
1347{
1348  int  Ivar, Istc, i, j;
1349  scfmon sn;
1350  int x, ideg;
1351
1352  if (Nvar == 1)
1353  {
1354    ideg = scMin(Nstc, stc, 1);
1355    while (ideg > 0)
1356    {
1357      ideg--;
1358      act[1] = ideg;
1359      scElKbase();
1360    }
1361    return;
1362  }
1363  Ivar = Nvar-1;
1364  sn = hGetmem(Nstc, stc, stcmem[Ivar]);
1365  x = scRestrict(Nstc, sn, Nvar);
1366  if (x == 0) return;
1367  ideg = x-1;
1368  loop
1369  {
1370    x = scMax(Nstc, sn, Nvar);
1371    while (ideg >= x)
1372    {
1373      act[Nvar] = ideg;
1374      scInKbase(sn, Nstc, Ivar);
1375      ideg--;
1376    }
1377    if (ideg < 0) return;
1378    Istc = Nstc;
1379    for (i=Nstc-1; i>=0; i--)
1380    {
1381      if (ideg < sn[i][Nvar])
1382      {
1383        Istc--;
1384        sn[i] = NULL;
1385      }
1386    }
1387    j = 0;
1388    while (sn[j]) j++;
1389    i = j+1;
1390    for (; i<Nstc; i++)
1391    {
1392      if (sn[i])
1393      {
1394        sn[j] = sn[i];
1395        j++;
1396      }
1397    }
1398    Nstc = Istc;
1399  }
1400}
1401
1402static ideal scIdKbase(poly q, const int rank)
1403{
1404  ideal res = idInit(pLength(q), rank);
1405  polyset mm = res->m;
1406  do
1407  {
1408    *mm = q; ++mm;
1409
1410    const poly p = pNext(q);
1411    pNext(q) = NULL;
1412    q = p;
1413
1414  } while (q!=NULL);
1415
1416  id_Test(res, currRing);   // WRONG RANK!!!???
1417  return res;
1418}
1419
1420ideal scKBase(int deg, ideal s, ideal Q, intvec * mv)
1421{
1422  if( Q!=NULL) id_Test(Q, currRing);
1423
1424  int  i, di;
1425  poly p;
1426
1427  if (deg < 0)
1428  {
1429    di = scDimInt(s, Q);
1430    if (di != 0)
1431    {
1432      //Werror("KBase not finite");
1433      return idInit(1,s->rank);
1434    }
1435  }
1436  stcmem = hCreate((currRing->N) - 1);
1437  hexist = hInit(s, Q, &hNexist, currRing);
1438  p = last = pInit();
1439  /*pNext(p) = NULL;*/
1440  act = (scmon)omAlloc(((currRing->N) + 1) * sizeof(int));
1441  *act = 0;
1442  if (!hNexist)
1443  {
1444    scAll((currRing->N), deg);
1445    goto ende;
1446  }
1447  if (!hisModule)
1448  {
1449    if (deg < 0) scInKbase(hexist, hNexist, (currRing->N));
1450    else scDegKbase(hexist, hNexist, (currRing->N), deg);
1451  }
1452  else
1453  {
1454    hstc = (scfmon)omAlloc(hNexist * sizeof(scmon));
1455    for (i = 1; i <= hisModule; i++)
1456    {
1457      *act = i;
1458      hComp(hexist, hNexist, i, hstc, &hNstc);
1459      int deg_ei=deg;
1460      if (mv!=NULL) deg_ei -= (*mv)[i-1];
1461      if ((deg < 0) || (deg_ei>=0))
1462      {
1463        if (hNstc)
1464        {
1465          if (deg < 0) scInKbase(hstc, hNstc, (currRing->N));
1466          else scDegKbase(hstc, hNstc, (currRing->N), deg_ei);
1467        }
1468        else
1469          scAll((currRing->N), deg_ei);
1470      }
1471    }
1472    omFreeSize((ADDRESS)hstc, hNexist * sizeof(scmon));
1473  }
1474ende:
1475  hDelete(hexist, hNexist);
1476  omFreeSize((ADDRESS)act, ((currRing->N) + 1) * sizeof(int));
1477  hKill(stcmem, (currRing->N) - 1);
1478  pLmFree(&p);
1479  if (p == NULL)
1480    return idInit(1,s->rank);
1481
1482  last = p;
1483  return scIdKbase(p, s->rank);
1484}
1485
1486#if 0 //-- alternative implementation of scComputeHC
1487/*
1488void scComputeHCw(ideal ss, ideal Q, int ak, poly &hEdge, ring tailRing)
1489{
1490  id_TestTail(ss, currRing, tailRing);
1491  if (Q!=NULL) id_TestTail(Q, currRing, tailRing);
1492
1493  int  i, di;
1494  poly p;
1495
1496  if (hEdge!=NULL)
1497    pLmFree(hEdge);
1498
1499  ideal s=idInit(IDELEMS(ss),ak);
1500  for(i=IDELEMS(ss)-1;i>=0;i--)
1501  {
1502    if (ss->m[i]!=NULL) s->m[i]=pHead(ss->m[i]);
1503  }
1504  di = scDimInt(s, Q);
1505  stcmem = hCreate((currRing->N) - 1);
1506  hexist = hInit(s, Q, &hNexist, currRing);
1507  p = last = pInit();
1508  // pNext(p) = NULL;
1509  act = (scmon)omAlloc(((currRing->N) + 1) * sizeof(int));
1510  *act = 0;
1511  if (!hNexist)
1512  {
1513    scAll((currRing->N), -1);
1514    goto ende;
1515  }
1516  if (!hisModule)
1517  {
1518    scInKbase(hexist, hNexist, (currRing->N));
1519  }
1520  else
1521  {
1522    hstc = (scfmon)omAlloc(hNexist * sizeof(scmon));
1523    for (i = 1; i <= hisModule; i++)
1524    {
1525      *act = i;
1526      hComp(hexist, hNexist, i, hstc, &hNstc);
1527      if (hNstc)
1528      {
1529        scInKbase(hstc, hNstc, (currRing->N));
1530      }
1531      else
1532        scAll((currRing->N), -1);
1533    }
1534    omFreeSize((ADDRESS)hstc, hNexist * sizeof(scmon));
1535  }
1536ende:
1537  hDelete(hexist, hNexist);
1538  omFreeSize((ADDRESS)act, ((currRing->N) + 1) * sizeof(int));
1539  hKill(stcmem, (currRing->N) - 1);
1540  pDeleteLm(&p);
1541  idDelete(&s);
1542  if (p == NULL)
1543  {
1544    return; // no HEdge
1545  }
1546  else
1547  {
1548    last = p;
1549    ideal res=scIdKbase(p, ss->rank);
1550    poly p_ind=res->m[0]; int ind=0;
1551    for(i=IDELEMS(res)-1;i>0;i--)
1552    {
1553      if (pCmp(res->m[i],p_ind)==-1) { p_ind=res->m[i]; ind=i; }
1554    }
1555    assume(p_ind!=NULL);
1556    assume(res->m[ind]==p_ind);
1557    hEdge=p_ind;
1558    res->m[ind]=NULL;
1559    nDelete(&pGetCoeff(hEdge));
1560    pGetCoeff(hEdge)=NULL;
1561    for(i=(currRing->N);i>0;i--)
1562      pIncrExp(hEdge,i);
1563    pSetm(hEdge);
1564
1565    idDelete(&res);
1566    return;
1567  }
1568}
1569 */
1570#endif
Note: See TracBrowser for help on using the repository browser.