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