source: git/Singular/hutil.cc @ 35aab3

spielwiese
Last change on this file since 35aab3 was 8d1bbc, checked in by Hans Schönemann <hannes@…>, 21 years ago
*hannes: Exponent_t git-svn-id: file:///usr/local/Singular/svn/trunk@6601 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.22 2003-03-11 16:48:04 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 "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;
22int 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 int **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 = (int**) omAlloc(k * sizeof(scmon));
88  for (i = sl; i>0; i--)
89  {
90    if (*si!=NULL)
91    {
92      *ek = (int*) omAlloc((pVariables+1)*sizeof(int));
93      pGetExpV(*si, *ek);
94      ek++;
95    }
96    si++;
97  }
98  for (i = ql; i; i--)
99  {
100    if (*qi!=NULL)
101    {
102      *ek = (int*) omAlloc((pVariables+1)*sizeof(int));
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  int 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(int));
143  omFreeSize(hsecure, ev_length*sizeof(scmon));
144  omFreeSize(ev,  ev_length*sizeof(scmon));
145}
146
147
148void hComp(scfmon exist, int Nexist, int 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  int  x;
198  scmon temp, count;
199  float o, h, g, *v1;
200
201  v1 = (float *)omAlloc(Nvar * sizeof(float));
202  temp = (int *)omAlloc(Nstc * sizeof(int));
203  count = (int *)omAlloc(Nstc * sizeof(int));
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(int));
261  omFreeSize((ADDRESS)temp, Nstc * sizeof(int));
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  while ((co[a]!=NULL) && (a<Nco)) a++;
292  int i = a;
293  int j;
294  for (j = a; j < Nco; j++)
295  {
296    if (co[j]!=NULL)
297    {
298      co[i] = co[j];
299      i++;
300    }
301  }
302}
303
304
305void hStaircase(scfmon stc, int *Nstc, varset var, int Nvar)
306{
307  int  nc = *Nstc;
308  if (nc < 2)
309    return;
310  int z = 0;
311  int i = 0;
312  int j = 1;
313  scmon n = stc[1 /*j*/];
314  scmon o = stc[0];
315  int k = Nvar;
316  loop
317  {
318    int k1 = var[k];
319    if (o[k1] > n[k1])
320    {
321      loop
322      {
323        k--;
324        if (k==0)
325        {
326          stc[i] = NULL;
327          z++;
328          break;
329        }
330        else
331        {
332          k1 = var[k];
333          if (o[k1] < n[k1])
334            break;
335        }
336      }
337      k = Nvar;
338    }
339    else if (o[k1] < n[k1])
340    {
341      loop
342      {
343        k--;
344        if (k==0)
345        {
346          stc[j] = NULL;
347          z++;
348          break;
349        }
350        else
351        {
352          k1 = var[k];
353          if (o[k1] > n[k1])
354            break;
355        }
356      }
357      k = Nvar;
358    }
359    else
360    {
361      k--;
362      if (k==0)
363      {
364        stc[j] = NULL;
365        z++;
366        k = Nvar;
367      }
368    }
369    if (k == Nvar)
370    {
371      if (stc[j]==NULL)
372        i = j - 1;
373      loop
374      {
375        i++;
376        if (i == j)
377        {
378          i = -1;
379          j++;
380          if (j < nc)
381            n = stc[j];
382          else
383          {
384            if (z!=0)
385            {
386              *Nstc -= z;
387              hShrink(stc, 0, nc);
388            }
389            return;
390          }
391        }
392        else if (stc[i]!=NULL)
393        {
394          o = stc[i];
395          break;
396        }
397      }
398    }
399  }
400}
401
402
403void hRadical(scfmon rad, int *Nrad, int Nvar)
404{
405  int  nc = *Nrad, z = 0, i, j, k;
406  scmon n, o;
407  if (nc < 2)
408    return;
409  i = 0;
410  j = 1;
411  n = rad[j];
412  o = rad[0];
413  k = Nvar;
414  loop
415  {
416    if ((o[k]!=0) && (n[k]==0))
417    {
418      loop
419      {
420        k--;
421        if (k==0)
422        {
423          rad[i] = NULL;
424          z++;
425          break;
426        }
427        else
428        {
429          if ((o[k]==0) && (n[k]!=0))
430            break;
431        }
432      }
433      k = Nvar;
434    }
435    else if (!o[k] && n[k])
436    {
437      loop
438      {
439        k--;
440        if (!k)
441        {
442          rad[j] = NULL;
443          z++;
444          break;
445        }
446        else
447        {
448          if (o[k] && !n[k])
449            break;
450        }
451      }
452      k = Nvar;
453    }
454    else
455    {
456      k--;
457      if (!k)
458      {
459        rad[j] = NULL;
460        z++;
461        k = Nvar;
462      }
463    }
464    if (k == Nvar)
465    {
466      if (!rad[j])
467        i = j - 1;
468      loop
469      {
470        i++;
471        if (i == j)
472        {
473          i = -1;
474          j++;
475          if (j < nc)
476            n = rad[j];
477          else
478          {
479            if (z)
480            {
481              *Nrad -= z;
482              hShrink(rad, 0, nc);
483            }
484            return;
485          }
486        }
487        else if (rad[i])
488        {
489          o = rad[i];
490          break;
491        }
492      }
493    }
494  }
495}
496
497
498void hLexS(scfmon stc, int Nstc, varset var, int Nvar)
499{
500  if (Nstc < 2)
501    return;
502  int  j = 1, i = 0;
503  scmon n = stc[j];
504  scmon o = stc[0];
505  int k = Nvar;
506  loop
507  {
508    int k1 = var[k];
509    if (o[k1] < n[k1])
510    {
511      i++;
512      if (i < j)
513      {
514        o = stc[i];
515        k = Nvar;
516      }
517      else
518      {
519        j++;
520        if (j < Nstc)
521        {
522          i = 0;
523          o = stc[0];
524          n = stc[j];
525          k = Nvar;
526        }
527        else
528          return;
529      }
530    }
531    else if (o[k1] > n[k1])
532    {
533      int tmp_k;
534      for (tmp_k = j; tmp_k > i; tmp_k--)
535        stc[tmp_k] = stc[tmp_k - 1];
536      stc[i] = n;
537      j++;
538      if (j < Nstc)
539      {
540        i = 0;
541        o = stc[0];
542        n = stc[j];
543        k = Nvar;
544      }
545      else
546        return;
547    }
548    else
549    {
550      k--;
551      if (k<=0) return;
552    }
553  }
554}
555
556
557void hLexR(scfmon rad, int Nrad, varset var, int Nvar)
558{
559  int  j = 1, i = 0, k, k1;
560  scmon n, o;
561  if (Nrad < 2)
562    return;
563  n = rad[j];
564  o = rad[0];
565  k = Nvar;
566  loop
567  {
568    k1 = var[k];
569    if (!o[k1] && n[k1])
570    {
571      i++;
572      if (i < j)
573      {
574        o = rad[i];
575        k = Nvar;
576      }
577      else
578      {
579        j++;
580        if (j < Nrad)
581        {
582          i = 0;
583          o = rad[0];
584          n = rad[j];
585          k = Nvar;
586        }
587        else
588          return;
589      }
590    }
591    else if (o[k1] && !n[k1])
592    {
593      for (k = j; k > i; k--)
594        rad[k] = rad[k - 1];
595      rad[i] = n;
596      j++;
597      if (j < Nrad)
598      {
599        i = 0;
600        o = rad[0];
601        n = rad[j];
602        k = Nvar;
603      }
604      else
605        return;
606    }
607    else
608      k--;
609  }
610}
611
612
613void hPure(scfmon stc, int a, int *Nstc, varset var, int Nvar,
614 scmon pure, int *Npure)
615{
616  int  nc = *Nstc, np = 0, nq = 0, j, i, i1, c, l;
617  scmon x;
618  for (j = a; j < nc; j++)
619  {
620    x = stc[j];
621    i = Nvar;
622    c = 2;
623    l = 0;
624    loop
625    {
626      i1 = var[i];
627      if (x[i1])
628      {
629        c--;
630        if (!c)
631        {
632          l = 0;
633          break;
634        }
635        else if (c == 1)
636          l = i1;
637      }
638      i--;
639      if (!i)
640        break;
641    }
642    if (l)
643    {
644      if (!pure[l])
645      {
646        np++;
647        pure[l] = x[l];
648      }
649      else if (x[l] < pure[l])
650        pure[l] = x[l];
651      stc[j] = NULL;
652      nq++;
653    }
654  }
655  *Npure = np;
656  if (nq!=0)
657  {
658    *Nstc -= nq;
659    hShrink(stc, a, nc);
660  }
661}
662
663
664void hElimS(scfmon stc, int *e1, int a2, int e2, varset var, int Nvar)
665{
666  int  nc = *e1, z = 0, i, j, k, k1;
667  scmon n, o;
668  if (!nc || (a2 == e2))
669    return;
670  j = 0;
671  i = a2;
672  o = stc[i];
673  n = stc[0];
674  k = Nvar;
675  loop
676  {
677    k1 = var[k];
678    if (o[k1] > n[k1])
679    {
680      k = Nvar;
681      i++;
682      if (i < e2)
683        o = stc[i];
684      else
685      {
686        j++;
687        if (j < nc)
688        {
689          i = a2;
690          o = stc[i];
691          n = stc[j];
692        }
693        else
694        {
695          if (z!=0)
696          {
697            *e1 -= z;
698            hShrink(stc, 0, nc);
699          }
700          return;
701        }
702      }
703    }
704    else
705    {
706      k--;
707      if (k==0)
708      {
709        stc[j] = NULL;
710        z++;
711        j++;
712        if (j < nc)
713        {
714          i = a2;
715          o = stc[i];
716          n = stc[j];
717          k = Nvar;
718        }
719        else
720        {
721          if (z!=0)
722          {
723            *e1 -= z;
724            hShrink(stc, 0, nc);
725          }
726          return;
727        }
728      }
729    }
730  }
731}
732
733
734void hElimR(scfmon rad, int *e1, int a2, int e2, varset var, int Nvar)
735{
736  int  nc = *e1, z = 0, i, j, k, k1;
737  scmon n, o;
738  if (!nc || (a2 == e2))
739    return;
740  j = 0;
741  i = a2;
742  o = rad[i];
743  n = rad[0];
744  k = Nvar;
745  loop
746  {
747    k1 = var[k];
748    if (o[k1] && !n[k1])
749    {
750      k = Nvar;
751      i++;
752      if (i < e2)
753        o = rad[i];
754      else
755      {
756        j++;
757        if (j < nc)
758        {
759          i = a2;
760          o = rad[i];
761          n = rad[j];
762        }
763        else
764        {
765          if (z!=0)
766          {
767            *e1 -= z;
768            hShrink(rad, 0, nc);
769          }
770          return;
771        }
772      }
773    }
774    else
775    {
776      k--;
777      if (!k)
778      {
779        rad[j] = NULL;
780        z++;
781        j++;
782        if (j < nc)
783        {
784          i = a2;
785          o = rad[i];
786          n = rad[j];
787          k = Nvar;
788        }
789        else
790        {
791          if (z!=0)
792          {
793            *e1 -= z;
794            hShrink(rad, 0, nc);
795          }
796          return;
797        }
798      }
799    }
800  }
801}
802
803
804void hLex2S(scfmon rad, int e1, int a2, int e2, varset var,
805 int Nvar, scfmon w)
806{
807  int  j0 = 0, j = 0, i = a2, k, k1;
808  scmon n, o;
809  if (!e1)
810  {
811    for (; i < e2; i++)
812      rad[i - a2] = rad[i];
813    return;
814  }  else if (i == e2)
815    return;
816  n = rad[j];
817  o = rad[i];
818  loop
819  {
820    k = Nvar;
821    loop
822    {
823      k1 = var[k];
824      if (o[k1] < n[k1])
825      {
826        w[j0] = o;
827        j0++;
828        i++;
829        if (i < e2)
830        {
831          o = rad[i];
832          break;
833        }
834        else
835        {
836          for (; j < e1; j++)
837          {
838            w[j0] = rad[j];
839            j0++;
840          }
841          memcpy(rad, w, (e1 + e2 - a2) * sizeof(scmon));
842          return;
843        }
844      }
845      else if (o[k1] > n[k1])
846      {
847        w[j0] = n;
848        j0++;
849        j++;
850        if (j < e1)
851        {
852          n = rad[j];
853          break;
854        }
855        else
856        {
857          for (; i < e2; i++)
858          {
859            w[j0] = rad[i];
860            j0++;
861          }
862          memcpy(rad, w, (e1 + e2 - a2) * sizeof(scmon));
863          return;
864        }
865      }
866      k--;
867    }
868  }
869}
870
871
872void hLex2R(scfmon rad, int e1, int a2, int e2, varset var,
873 int Nvar, scfmon w)
874{
875  int  j0 = 0, j = 0, i = a2, k, k1;
876  scmon n, o;
877  if (!e1)
878  {
879    for (; i < e2; i++)
880      rad[i - a2] = rad[i];
881    return;
882  }
883  else if (i == e2)
884    return;
885  n = rad[j];
886  o = rad[i];
887  loop
888  {
889    k = Nvar;
890    loop
891    {
892      k1 = var[k];
893      if (!o[k1] && n[k1])
894      {
895        w[j0] = o;
896        j0++;
897        i++;
898        if (i < e2)
899        {
900          o = rad[i];
901          break;
902        }
903        else
904        {
905          for (; j < e1; j++)
906          {
907            w[j0] = rad[j];
908            j0++;
909          }
910          memcpy(rad, w, (e1 + e2 - a2) * sizeof(scmon));
911          return;
912        }
913      }
914      else if (o[k1] && !n[k1])
915      {
916        w[j0] = n;
917        j0++;
918        j++;
919        if (j < e1)
920        {
921          n = rad[j];
922          break;
923        }
924        else
925        {
926          for (; i < e2; i++)
927          {
928            w[j0] = rad[i];
929            j0++;
930          }
931          memcpy(rad, w, (e1 + e2 - a2) * sizeof(scmon));
932          return;
933        }
934      }
935      k--;
936    }
937  }
938}
939
940
941void hStepS(scfmon stc, int Nstc, varset var, int Nvar, int *a, int *x)
942{
943  int  k1, i;
944  int  y;
945  k1 = var[Nvar];
946  y = *x;
947  i = *a;
948  loop
949  {
950    if (y < stc[i][k1])
951    {
952      *a = i;
953      *x = stc[i][k1];
954      return;
955    }
956    i++;
957    if (i == Nstc)
958    {
959      *a = i;
960      return;
961    }
962  }
963}
964
965
966void hStepR(scfmon rad, int Nrad, varset var, int Nvar, int *a)
967{
968  int  k1, i;
969  k1 = var[Nvar];
970  i = 0;
971  loop
972  {
973    if (rad[i][k1])
974    {
975      *a = i;
976      return;
977    }
978    i++;
979    if (i == Nrad)
980    {
981      *a = i;
982      return;
983    }
984  }
985}
986
987
988monf hCreate(int Nvar)
989{
990  monf xmem;
991  int  i;
992  xmem = (monf)omAlloc((Nvar + 1) * sizeof(monp));
993  for (i = Nvar; i>0; i--)
994  {
995    xmem[i] = (monp)omAlloc(LEN_MON);
996    xmem[i]->mo = NULL;
997  }
998  return xmem;
999}
1000
1001
1002void hKill(monf xmem, int Nvar)
1003{
1004  int  i;
1005  for (i = Nvar; i!=0; i--)
1006  {
1007    if (xmem[i]->mo!=NULL)
1008      omFreeSize((ADDRESS)xmem[i]->mo, xmem[i]->a * sizeof(scmon));
1009    omFreeSize((ADDRESS)xmem[i], LEN_MON);
1010  }
1011  omFreeSize((ADDRESS)xmem, (Nvar + 1) * sizeof(monp));
1012}
1013
1014
1015scfmon hGetmem(int lm, scfmon old, monp monmem)
1016{
1017  scfmon x = monmem->mo;
1018  int  lx = monmem->a;
1019  if ((x==NULL) || (lm > lx))
1020  {
1021    if ((x!=NULL)&&(lx>0)) omFreeSize((ADDRESS)x, lx * sizeof(scmon));
1022    monmem->mo = x = (scfmon)omAlloc(lm * sizeof(scmon));
1023    monmem->a = lm;
1024  }
1025  memcpy(x, old, lm * sizeof(scmon));
1026  return x;
1027}
1028
1029/*
1030* a bug in Metrowerks with "lifetime analysis"
1031*scmon hGetpure(scmon p)
1032*{
1033*  scmon p1, pn;
1034*  p1 = p + 1;
1035*  pn = p1 + pVariables;
1036*  memcpy(pn, p1, pVariables * sizeof(int));
1037*  return pn - 1;
1038*}
1039*/
1040scmon hGetpure(scmon p)
1041{
1042  scmon p1 = p;
1043  scmon pn;
1044  p1++;
1045  pn = p1;
1046  pn += pVariables;
1047  memcpy(pn, p1, pVariables * sizeof(int));
1048  return pn - 1;
1049}
1050
Note: See TracBrowser for help on using the repository browser.