source: git/Singular/hutil.cc @ 194f5e5

spielwiese
Last change on this file since 194f5e5 was cf3ff4, checked in by Hans Schönemann <hannes@…>, 26 years ago
* hannes: cleanup in hutil.cc git-svn-id: file:///usr/local/Singular/svn/trunk@1347 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 15.4 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: hutil.cc,v 1.6 1998-04-07 17:51:02 Singular Exp $ */
5/*
6* ABSTRACT: Utilities for staircase operations
7*/
8
9#include "mod2.h"
10#include "tok.h"
11#include "febase.h"
12#include "mmemory.h"
13#include "ipid.h"
14#include "ideals.h"
15#include "polys.h"
16#include "hutil.h"
17
18scfmon hexist, hstc, hrad, hwork;
19scmon hpure, hpur0;
20varset hvar, hsel;
21int  hNexist, hNstc, hNrad, hNvar, hNpure;
22Exponent_t hisModule;
23monf stcmem, radmem;
24
25// Making a global "security" copy of the allocated exponent vectors
26// is a dirty fix for cerrect memory disallocation: It would be
27// better, if either the fields of heist are never touched
28// (i.e. changed) except in hInit, or, if hInit would return the
29// "security" copy as well. But then, all the relevant data is held in
30// global variables, so we might do that here, as well.
31static Exponent_t **hsecure= NULL;
32
33scfmon hInit(ideal S, ideal Q, int *Nexist)
34{
35  int  sl, ql, i, k = 0;
36  polyset si, qi, ss;
37  scfmon ex, ek;
38  hisModule = idRankFreeModule(S);
39  if (hisModule < 0)
40    hisModule = 0;
41  if (S)
42  {
43    si = S->m;
44    sl = IDELEMS(S);
45  }
46  else
47  {
48    si = NULL;
49    sl = 0;
50  }
51  if (Q)
52  {
53    qi = Q->m;
54    ql = IDELEMS(Q);
55  }
56  else
57  {
58    qi = NULL;
59    ql = 0;
60  }
61  if (!(sl + ql))
62  {
63    *Nexist = 0;
64    return NULL;
65  }
66  ss = si;
67  for (i = sl; i; i--)
68  {
69    if (*ss)
70      k++;
71    ss++;
72  }
73  ss = qi;
74  for (i = ql; i; i--)
75  {
76    if (*ss)
77      k++;
78    ss++;
79  }
80  *Nexist = k;
81  if (!k)
82    return NULL;
83  ek = ex = (scfmon)Alloc(k * sizeof(scmon));
84  hsecure = (Exponent_t**) Alloc(k * sizeof(scmon));
85  for (i = sl; i>0; i--)
86  {
87    if (*si!=NULL)
88    {
89      *ek = (Exponent_t*) Alloc((pVariables+1)*sizeof(Exponent_t));
90      pGetExpV(*si, *ek);
91      ek++;
92    }
93    si++;
94  }
95  for (i = ql; i; i--)
96  {
97    if (*qi)
98    {
99      *ek = (Exponent_t*) Alloc((pVariables+1)*sizeof(Exponent_t));
100      pGetExpV(*qi, *ek);
101      ek++;
102    }
103    qi++;
104  }
105  memcpy(hsecure, ex, k * sizeof(scmon));
106  return ex;
107}
108
109void hDelete(scfmon ev, int ev_length)
110{
111  int i;
112
113  for (i=0;i<ev_length;i++)
114    Free(hsecure[i],(pVariables+1)*sizeof(Exponent_t));
115  Free(hsecure, ev_length*sizeof(scmon));
116  Free(ev,  ev_length*sizeof(scmon));
117}
118
119 
120void hComp(scfmon exist, int Nexist, Exponent_t ak, scfmon stc, int *Nstc)
121{
122  int  i = Nexist, k = 0;
123  scfmon ex = exist, co = stc;
124  for (; i; i--)
125  {
126    if (!(**ex) || ((**ex) == ak))
127    {
128      *co = *ex;
129      co++;
130      k++;
131    }
132    ex++;
133  }
134  *Nstc = k;
135}
136
137
138void hSupp(scfmon stc, int Nstc, varset var, int *Nvar)
139{
140  int  nv, i0, i1, i, j;
141  nv = i0 = *Nvar;
142  i1 = 0;
143  for (i = 1; i <= nv; i++)
144  {
145    j = 0;
146    loop
147    {
148      if (stc[j][i])
149      {
150        i1++;
151        var[i1] = i;
152        break;
153      }
154      j++;
155      if (j == Nstc)
156      {
157        var[i0] = i;
158        i0--;
159        break;
160      }
161    }
162  }
163  *Nvar = i1;
164}
165
166void hOrdSupp(scfmon stc, int Nstc, varset var, int Nvar)
167{
168  int  i, i1, j, jj, k, l;
169  Exponent_t  x;
170  scmon temp, count;
171  float o, h, g, *v1;
172
173  v1 = (float *)Alloc(Nvar * sizeof(float));
174  temp = (Exponent_t *)Alloc(Nstc * sizeof(Exponent_t));
175  count = (Exponent_t *)Alloc(Nstc * sizeof(Exponent_t));
176  for (i = 1; i <= Nvar; i++)
177  {
178    i1 = var[i];
179    *temp = stc[0][i1];
180    *count = 1;
181    jj = 1;
182    for (j = 1; j < Nstc; j++)
183    {
184      x = stc[j][i1];
185      k = 0;
186      loop
187      {
188        if (x > temp[k])
189        {
190          k++;
191          if (k == jj)
192          {
193            temp[k] = x;
194            count[k] = 1;
195            jj++;
196            break;
197          }
198        }
199        else if (x < temp[k])
200        {
201          for (l = jj; l > k; l--)
202          {
203            temp[l] = temp[l-1];
204            count[l] = count[l-1];
205          }
206          temp[k] = x;
207          count[k] = 1;
208          jj++;
209          break;
210        }
211        else
212        {
213          count[k]++;
214          break;
215        }
216      }
217    }
218    h = 0.0;
219    o = (float)Nstc/(float)jj;
220    for(j = 0; j < jj; j++)
221    {
222       g = (float)count[j];
223       if (g > o)
224         g -= o;
225       else
226         g = o - g;
227       if (g > h)
228         h = g;
229    }
230    v1[i-1] = h * (float)jj;
231  }
232  Free((ADDRESS)count, Nstc * sizeof(Exponent_t));
233  Free((ADDRESS)temp, Nstc * sizeof(Exponent_t));
234  for (i = 1; i < Nvar; i++)
235  {
236    i1 = var[i+1];
237    h = v1[i];
238    j = 0;
239    loop
240    {
241      if (h > v1[j])
242      {
243        for (l = i; l > j; l--)
244        {
245          v1[l] = v1[l-1];
246          var[l+1] = var[l];
247        }
248        v1[j] = h;
249        var[j+1] = i1;
250        break;
251      }
252      j++;
253      if (j == i)
254        break;
255    }
256  }
257  Free((ADDRESS)v1, Nvar * sizeof(float));
258}
259
260
261static void hShrink(scfmon co, int a, int Nco)
262{
263  int  i = a, j = a;
264  for (; j < Nco; j++)
265  {
266    if (co[j])
267    {
268      co[i] = co[j];
269      i++;
270    }
271  }
272}
273
274
275void hStaircase(scfmon stc, int *Nstc, varset var, int Nvar)
276{
277  int  nc = *Nstc, z = 0, i, j, k, k1;
278  scmon n, o;
279  if (nc < 2)
280    return;
281  i = 0;
282  j = 1;
283  n = stc[j];
284  o = *stc;
285  k = Nvar;
286  loop
287  {
288    k1 = var[k];
289    if (o[k1] > n[k1])
290    {
291      loop
292      {
293        k--;
294        if (!k)
295        {
296          stc[i] = NULL;
297          z++;
298          break;
299        }
300        else
301        {
302          k1 = var[k];
303          if (o[k1] < n[k1])
304            break;
305        }
306      }
307      k = Nvar;
308    }
309    else if (o[k1] < n[k1])
310    {
311      loop
312      {
313        k--;
314        if (!k)
315        {
316          stc[j] = NULL;
317          z++;
318          break;
319        }
320        else
321        {
322          k1 = var[k];
323          if (o[k1] > n[k1])
324            break;
325        }
326      }
327      k = Nvar;
328    }
329    else
330    {
331      k--;
332      if (!k)
333      {
334        stc[j] = NULL;
335        z++;
336        k = Nvar;
337      }
338    }
339    if (k == Nvar)
340    {
341      if (!stc[j])
342        i = j - 1;
343      loop
344      {
345        i++;
346        if (i == j)
347        {
348          i = -1;
349          j++;
350          if (j < nc)
351            n = stc[j];
352          else
353          {
354            if (z)
355            {
356              *Nstc -= z;
357              hShrink(stc, 0, nc);
358            }
359            return;
360          }
361        }
362        else if (stc[i])
363        {
364          o = stc[i];
365          break;
366        }
367      }
368    }
369  }
370}
371
372
373void hRadical(scfmon rad, int *Nrad, int Nvar)
374{
375  int  nc = *Nrad, z = 0, i, j, k;
376  scmon n, o;
377  if (nc < 2)
378    return;
379  i = 0;
380  j = 1;
381  n = rad[j];
382  o = *rad;
383  k = Nvar;
384  loop
385  {
386    if (o[k] && !n[k])
387    {
388      loop
389      {
390        k--;
391        if (!k)
392        {
393          rad[i] = NULL;
394          z++;
395          break;
396        }
397        else
398        {
399          if (!o[k] && n[k])
400            break;
401        }
402      }
403      k = Nvar;
404    }
405    else if (!o[k] && n[k])
406    {
407      loop
408      {
409        k--;
410        if (!k)
411        {
412          rad[j] = NULL;
413          z++;
414          break;
415        }
416        else
417        {
418          if (o[k] && !n[k])
419            break;
420        }
421      }
422      k = Nvar;
423    }
424    else
425    {
426      k--;
427      if (!k)
428      {
429        rad[j] = NULL;
430        z++;
431        k = Nvar;
432      }
433    }
434    if (k == Nvar)
435    {
436      if (!rad[j])
437        i = j - 1;
438      loop
439      {
440        i++;
441        if (i == j)
442        {
443          i = -1;
444          j++;
445          if (j < nc)
446            n = rad[j];
447          else
448          {
449            if (z)
450            {
451              *Nrad -= z;
452              hShrink(rad, 0, nc);
453            }
454            return;
455          }
456        }
457        else if (rad[i])
458        {
459          o = rad[i];
460          break;
461        }
462      }
463    }
464  }
465}
466
467
468void hLexS(scfmon stc, int Nstc, varset var, int Nvar)
469{
470  int  j = 1, i = 0, k, k1;
471  scmon n, o;
472  if (Nstc < 2)
473    return;
474  n = stc[j];
475  o = *stc;
476  k = Nvar;
477  loop
478  {
479    k1 = var[k];
480    if (o[k1] < n[k1])
481    {
482      i++;
483      if (i < j)
484      {
485        o = stc[i];
486        k = Nvar;
487      }
488      else
489      {
490        j++;
491        if (j < Nstc)
492        {
493          i = 0;
494          o = *stc;
495          n = stc[j];
496          k = Nvar;
497        }
498        else
499          return;
500      }
501    }
502    else if (o[k1] > n[k1])
503    {
504      for (k = j; k > i; k--)
505        stc[k] = stc[k - 1];
506      stc[i] = n;
507      j++;
508      if (j < Nstc)
509      {
510        i = 0;
511        o = *stc;
512        n = stc[j];
513        k = Nvar;
514      }
515      else
516        return;
517    }
518    else
519      k--;
520  }
521}
522
523
524void hLexR(scfmon rad, int Nrad, varset var, int Nvar)
525{
526  int  j = 1, i = 0, k, k1;
527  scmon n, o;
528  if (Nrad < 2)
529    return;
530  n = rad[j];
531  o = *rad;
532  k = Nvar;
533  loop
534  {
535    k1 = var[k];
536    if (!o[k1] && n[k1])
537    {
538      i++;
539      if (i < j)
540      {
541        o = rad[i];
542        k = Nvar;
543      }
544      else
545      {
546        j++;
547        if (j < Nrad)
548        {
549          i = 0;
550          o = *rad;
551          n = rad[j];
552          k = Nvar;
553        }
554        else
555          return;
556      }
557    }
558    else if (o[k1] && !n[k1])
559    {
560      for (k = j; k > i; k--)
561        rad[k] = rad[k - 1];
562      rad[i] = n;
563      j++;
564      if (j < Nrad)
565      {
566        i = 0;
567        o = *rad;
568        n = rad[j];
569        k = Nvar;
570      }
571      else
572        return;
573    }
574    else
575      k--;
576  }
577}
578
579
580void hPure(scfmon stc, int a, int *Nstc, varset var, int Nvar,
581 scmon pure, int *Npure)
582{
583  int  nc = *Nstc, np = 0, nq = 0, j, i, i1, c, l;
584  scmon x;
585  for (j = a; j < nc; j++)
586  {
587    x = stc[j];
588    i = Nvar;
589    c = 2;
590    l = 0;
591    loop
592    {
593      i1 = var[i];
594      if (x[i1])
595      {
596        c--;
597        if (!c)
598        {
599          l = 0;
600          break;
601        }
602        else if (c == 1)
603          l = i1;
604      }
605      i--;
606      if (!i)
607        break;
608    }
609    if (l)
610    {
611      if (!pure[l])
612      {
613        np++;
614        pure[l] = x[l];
615      }
616      else if (x[l] < pure[l])
617        pure[l] = x[l];
618      stc[j] = NULL;
619      nq++;
620    }
621  }
622  *Npure = np;
623  if (nq)
624  {
625    *Nstc -= nq;
626    hShrink(stc, a, nc);
627  }
628}
629
630
631void hElimS(scfmon stc, int *e1, int a2, int e2, varset var, int Nvar)
632{
633  int  nc = *e1, z = 0, i, j, k, k1;
634  scmon n, o;
635  if (!nc || (a2 == e2))
636    return;
637  j = 0;
638  i = a2;
639  o = stc[i];
640  n = *stc;
641  k = Nvar;
642  loop
643  {
644    k1 = var[k];
645    if (o[k1] > n[k1])
646    {
647      k = Nvar;
648      i++;
649      if (i < e2)
650        o = stc[i];
651      else {
652        j++;
653        if (j < nc)
654        {
655          i = a2;
656          o = stc[i];
657          n = stc[j];
658        }
659        else
660        {
661          if (z)
662          {
663            *e1 -= z;
664            hShrink(stc, 0, nc);
665          }
666          return;
667        }
668      }
669    }
670    else
671    {
672      k--;
673      if (!k)
674      {
675        stc[j] = NULL;
676        z++;
677        j++;
678        if (j < nc)
679        {
680          i = a2;
681          o = stc[i];
682          n = stc[j];
683          k = Nvar;
684        }
685        else
686        {
687          if (z)
688          {
689            *e1 -= z;
690            hShrink(stc, 0, nc);
691          }
692          return;
693        }
694      }
695    }
696  }
697}
698
699
700void hElimR(scfmon rad, int *e1, int a2, int e2, varset var, int Nvar)
701{
702  int  nc = *e1, z = 0, i, j, k, k1;
703  scmon n, o;
704  if (!nc || (a2 == e2))
705    return;
706  j = 0;
707  i = a2;
708  o = rad[i];
709  n = *rad;
710  k = Nvar;
711  loop
712  {
713    k1 = var[k];
714    if (o[k1] && !n[k1])
715    {
716      k = Nvar;
717      i++;
718      if (i < e2)
719        o = rad[i];
720      else
721      {
722        j++;
723        if (j < nc)
724        {
725          i = a2;
726          o = rad[i];
727          n = rad[j];
728        }
729        else
730        {
731          if (z)
732          {
733            *e1 -= z;
734            hShrink(rad, 0, nc);
735          }
736          return;
737        }
738      }
739    }
740    else
741    {
742      k--;
743      if (!k)
744      {
745        rad[j] = NULL;
746        z++;
747        j++;
748        if (j < nc)
749        {
750          i = a2;
751          o = rad[i];
752          n = rad[j];
753          k = Nvar;
754        }
755        else
756        {
757          if (z)
758          {
759            *e1 -= z;
760            hShrink(rad, 0, nc);
761          }
762          return;
763        }
764      }
765    }
766  }
767}
768
769
770void hLex2S(scfmon rad, int e1, int a2, int e2, varset var,
771 int Nvar, scfmon w)
772{
773  int  j0 = 0, j = 0, i = a2, k, k1;
774  scmon n, o;
775  if (!e1)
776  {
777    for (; i < e2; i++)
778      rad[i - a2] = rad[i];
779    return;
780  }  else if (i == e2)
781    return;
782  n = rad[j];
783  o = rad[i];
784  loop
785  {
786    k = Nvar;
787    loop
788    {
789      k1 = var[k];
790      if (o[k1] < n[k1])
791      {
792        w[j0] = o;
793        j0++;
794        i++;
795        if (i < e2)
796        {
797          o = rad[i];
798          break;
799        }
800        else
801        {
802          for (; j < e1; j++)
803          {
804            w[j0] = rad[j];
805            j0++;
806          }
807          memcpy(rad, w, (e1 + e2 - a2) * sizeof(scmon));
808          return;
809        }
810      }
811      else if (o[k1] > n[k1])
812      {
813        w[j0] = n;
814        j0++;
815        j++;
816        if (j < e1)
817        {
818          n = rad[j];
819          break;
820        }
821        else
822        {
823          for (; i < e2; i++)
824          {
825            w[j0] = rad[i];
826            j0++;
827          }
828          memcpy(rad, w, (e1 + e2 - a2) * sizeof(scmon));
829          return;
830        }
831      }
832      k--;
833    }
834  }
835}
836
837
838void hLex2R(scfmon rad, int e1, int a2, int e2, varset var,
839 int Nvar, scfmon w)
840{
841  int  j0 = 0, j = 0, i = a2, k, k1;
842  scmon n, o;
843  if (!e1)
844  {
845    for (; i < e2; i++)
846      rad[i - a2] = rad[i];
847    return;
848  }
849  else if (i == e2)
850    return;
851  n = rad[j];
852  o = rad[i];
853  loop
854  {
855    k = Nvar;
856    loop
857    {
858      k1 = var[k];
859      if (!o[k1] && n[k1])
860      {
861        w[j0] = o;
862        j0++;
863        i++;
864        if (i < e2)
865        {
866          o = rad[i];
867          break;
868        }
869        else
870        {
871          for (; j < e1; j++)
872          {
873            w[j0] = rad[j];
874            j0++;
875          }
876          memcpy(rad, w, (e1 + e2 - a2) * sizeof(scmon));
877          return;
878        }
879      }
880      else if (o[k1] && !n[k1])
881      {
882        w[j0] = n;
883        j0++;
884        j++;
885        if (j < e1)
886        {
887          n = rad[j];
888          break;
889        }
890        else
891        {
892          for (; i < e2; i++)
893          {
894            w[j0] = rad[i];
895            j0++;
896          }
897          memcpy(rad, w, (e1 + e2 - a2) * sizeof(scmon));
898          return;
899        }
900      }
901      k--;
902    }
903  }
904}
905
906
907void hStepS(scfmon stc, int Nstc, varset var, int Nvar, int *a, Exponent_t *x)
908{
909  int  k1, i;
910  Exponent_t  y;
911  k1 = var[Nvar];
912  y = *x;
913  i = *a;
914  loop
915  {
916    if (y < stc[i][k1])
917    {
918      *a = i;
919      *x = stc[i][k1];
920      return;
921    }
922    i++;
923    if (i == Nstc)
924    {
925      *a = i;
926      return;
927    }
928  }
929}
930
931
932void hStepR(scfmon rad, int Nrad, varset var, int Nvar, int *a)
933{
934  int  k1, i;
935  k1 = var[Nvar];
936  i = 0;
937  loop
938  {
939    if (rad[i][k1])
940    {
941      *a = i;
942      return;
943    }
944    i++;
945    if (i == Nrad)
946    {
947      *a = i;
948      return;
949    }
950  }
951}
952
953
954monf hCreate(int Nvar)
955{
956  monf xmem;
957  int  i;
958  xmem = (monf)Alloc((Nvar + 1) * sizeof(monp));
959  for (i = Nvar; i>0; i--)
960  {
961    xmem[i] = (monp)Alloc(LEN_MON);
962    xmem[i]->mo = NULL;
963  }
964  return xmem;
965}
966
967
968void hKill(monf xmem, int Nvar)
969{
970  int  i;
971  for (i = Nvar; i; i--)
972  {
973    if (xmem[i]->mo)
974      Free((ADDRESS)xmem[i]->mo, xmem[i]->a * sizeof(scmon));
975    Free((ADDRESS)xmem[i], LEN_MON);
976  }
977  Free((ADDRESS)xmem, (Nvar + 1) * sizeof(monp));
978}
979
980
981scfmon hGetmem(int lm, scfmon old, monp monmem)
982{
983  scfmon x = monmem->mo;
984  int  lx = monmem->a;
985  if (!x || (lm > lx))
986  {
987    Free((ADDRESS)x, lx * sizeof(scmon));
988    monmem->mo = x = (scfmon)Alloc(lm * sizeof(scmon));
989    monmem->a = lm;
990  }
991  memcpy(x, old, lm * sizeof(scmon));
992  return x;
993}
994
995
996scmon hGetpure(scmon p)
997{
998  scmon p1, pn;
999  p1 = p + 1;
1000  pn = p1 + pVariables;
1001  memcpy(pn, p1, pVariables * sizeof(Exponent_t));
1002  return pn - 1;
1003}
1004
1005
Note: See TracBrowser for help on using the repository browser.