source: git/Singular/hutil.cc @ 584f84d

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