source: git/Singular/hutil.cc @ 5ca9807

spielwiese
Last change on this file since 5ca9807 was 50cbdc, checked in by Hans Schönemann <hannes@…>, 23 years ago
*hannes: merge-2-0-2 git-svn-id: file:///usr/local/Singular/svn/trunk@5619 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 16.3 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: hutil.cc,v 1.20 2001-08-27 14:47: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 "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  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    }
552  }
553}
554
555
556void hLexR(scfmon rad, int Nrad, varset var, int Nvar)
557{
558  int  j = 1, i = 0, k, k1;
559  scmon n, o;
560  if (Nrad < 2)
561    return;
562  n = rad[j];
563  o = rad[0];
564  k = Nvar;
565  loop
566  {
567    k1 = var[k];
568    if (!o[k1] && n[k1])
569    {
570      i++;
571      if (i < j)
572      {
573        o = rad[i];
574        k = Nvar;
575      }
576      else
577      {
578        j++;
579        if (j < Nrad)
580        {
581          i = 0;
582          o = rad[0];
583          n = rad[j];
584          k = Nvar;
585        }
586        else
587          return;
588      }
589    }
590    else if (o[k1] && !n[k1])
591    {
592      for (k = j; k > i; k--)
593        rad[k] = rad[k - 1];
594      rad[i] = n;
595      j++;
596      if (j < Nrad)
597      {
598        i = 0;
599        o = rad[0];
600        n = rad[j];
601        k = Nvar;
602      }
603      else
604        return;
605    }
606    else
607      k--;
608  }
609}
610
611
612void hPure(scfmon stc, int a, int *Nstc, varset var, int Nvar,
613 scmon pure, int *Npure)
614{
615  int  nc = *Nstc, np = 0, nq = 0, j, i, i1, c, l;
616  scmon x;
617  for (j = a; j < nc; j++)
618  {
619    x = stc[j];
620    i = Nvar;
621    c = 2;
622    l = 0;
623    loop
624    {
625      i1 = var[i];
626      if (x[i1])
627      {
628        c--;
629        if (!c)
630        {
631          l = 0;
632          break;
633        }
634        else if (c == 1)
635          l = i1;
636      }
637      i--;
638      if (!i)
639        break;
640    }
641    if (l)
642    {
643      if (!pure[l])
644      {
645        np++;
646        pure[l] = x[l];
647      }
648      else if (x[l] < pure[l])
649        pure[l] = x[l];
650      stc[j] = NULL;
651      nq++;
652    }
653  }
654  *Npure = np;
655  if (nq!=0)
656  {
657    *Nstc -= nq;
658    hShrink(stc, a, nc);
659  }
660}
661
662
663void hElimS(scfmon stc, int *e1, int a2, int e2, varset var, int Nvar)
664{
665  int  nc = *e1, z = 0, i, j, k, k1;
666  scmon n, o;
667  if (!nc || (a2 == e2))
668    return;
669  j = 0;
670  i = a2;
671  o = stc[i];
672  n = stc[0];
673  k = Nvar;
674  loop
675  {
676    k1 = var[k];
677    if (o[k1] > n[k1])
678    {
679      k = Nvar;
680      i++;
681      if (i < e2)
682        o = stc[i];
683      else
684      {
685        j++;
686        if (j < nc)
687        {
688          i = a2;
689          o = stc[i];
690          n = stc[j];
691        }
692        else
693        {
694          if (z!=0)
695          {
696            *e1 -= z;
697            hShrink(stc, 0, nc);
698          }
699          return;
700        }
701      }
702    }
703    else
704    {
705      k--;
706      if (k==0)
707      {
708        stc[j] = NULL;
709        z++;
710        j++;
711        if (j < nc)
712        {
713          i = a2;
714          o = stc[i];
715          n = stc[j];
716          k = Nvar;
717        }
718        else
719        {
720          if (z!=0)
721          {
722            *e1 -= z;
723            hShrink(stc, 0, nc);
724          }
725          return;
726        }
727      }
728    }
729  }
730}
731
732
733void hElimR(scfmon rad, int *e1, int a2, int e2, varset var, int Nvar)
734{
735  int  nc = *e1, z = 0, i, j, k, k1;
736  scmon n, o;
737  if (!nc || (a2 == e2))
738    return;
739  j = 0;
740  i = a2;
741  o = rad[i];
742  n = rad[0];
743  k = Nvar;
744  loop
745  {
746    k1 = var[k];
747    if (o[k1] && !n[k1])
748    {
749      k = Nvar;
750      i++;
751      if (i < e2)
752        o = rad[i];
753      else
754      {
755        j++;
756        if (j < nc)
757        {
758          i = a2;
759          o = rad[i];
760          n = rad[j];
761        }
762        else
763        {
764          if (z!=0)
765          {
766            *e1 -= z;
767            hShrink(rad, 0, nc);
768          }
769          return;
770        }
771      }
772    }
773    else
774    {
775      k--;
776      if (!k)
777      {
778        rad[j] = NULL;
779        z++;
780        j++;
781        if (j < nc)
782        {
783          i = a2;
784          o = rad[i];
785          n = rad[j];
786          k = Nvar;
787        }
788        else
789        {
790          if (z!=0)
791          {
792            *e1 -= z;
793            hShrink(rad, 0, nc);
794          }
795          return;
796        }
797      }
798    }
799  }
800}
801
802
803void hLex2S(scfmon rad, int e1, int a2, int e2, varset var,
804 int Nvar, scfmon w)
805{
806  int  j0 = 0, j = 0, i = a2, k, k1;
807  scmon n, o;
808  if (!e1)
809  {
810    for (; i < e2; i++)
811      rad[i - a2] = rad[i];
812    return;
813  }  else if (i == e2)
814    return;
815  n = rad[j];
816  o = rad[i];
817  loop
818  {
819    k = Nvar;
820    loop
821    {
822      k1 = var[k];
823      if (o[k1] < n[k1])
824      {
825        w[j0] = o;
826        j0++;
827        i++;
828        if (i < e2)
829        {
830          o = rad[i];
831          break;
832        }
833        else
834        {
835          for (; j < e1; j++)
836          {
837            w[j0] = rad[j];
838            j0++;
839          }
840          memcpy(rad, w, (e1 + e2 - a2) * sizeof(scmon));
841          return;
842        }
843      }
844      else if (o[k1] > n[k1])
845      {
846        w[j0] = n;
847        j0++;
848        j++;
849        if (j < e1)
850        {
851          n = rad[j];
852          break;
853        }
854        else
855        {
856          for (; i < e2; i++)
857          {
858            w[j0] = rad[i];
859            j0++;
860          }
861          memcpy(rad, w, (e1 + e2 - a2) * sizeof(scmon));
862          return;
863        }
864      }
865      k--;
866    }
867  }
868}
869
870
871void hLex2R(scfmon rad, int e1, int a2, int e2, varset var,
872 int Nvar, scfmon w)
873{
874  int  j0 = 0, j = 0, i = a2, k, k1;
875  scmon n, o;
876  if (!e1)
877  {
878    for (; i < e2; i++)
879      rad[i - a2] = rad[i];
880    return;
881  }
882  else if (i == e2)
883    return;
884  n = rad[j];
885  o = rad[i];
886  loop
887  {
888    k = Nvar;
889    loop
890    {
891      k1 = var[k];
892      if (!o[k1] && n[k1])
893      {
894        w[j0] = o;
895        j0++;
896        i++;
897        if (i < e2)
898        {
899          o = rad[i];
900          break;
901        }
902        else
903        {
904          for (; j < e1; j++)
905          {
906            w[j0] = rad[j];
907            j0++;
908          }
909          memcpy(rad, w, (e1 + e2 - a2) * sizeof(scmon));
910          return;
911        }
912      }
913      else if (o[k1] && !n[k1])
914      {
915        w[j0] = n;
916        j0++;
917        j++;
918        if (j < e1)
919        {
920          n = rad[j];
921          break;
922        }
923        else
924        {
925          for (; i < e2; i++)
926          {
927            w[j0] = rad[i];
928            j0++;
929          }
930          memcpy(rad, w, (e1 + e2 - a2) * sizeof(scmon));
931          return;
932        }
933      }
934      k--;
935    }
936  }
937}
938
939
940void hStepS(scfmon stc, int Nstc, varset var, int Nvar, int *a, Exponent_t *x)
941{
942  int  k1, i;
943  Exponent_t  y;
944  k1 = var[Nvar];
945  y = *x;
946  i = *a;
947  loop
948  {
949    if (y < stc[i][k1])
950    {
951      *a = i;
952      *x = stc[i][k1];
953      return;
954    }
955    i++;
956    if (i == Nstc)
957    {
958      *a = i;
959      return;
960    }
961  }
962}
963
964
965void hStepR(scfmon rad, int Nrad, varset var, int Nvar, int *a)
966{
967  int  k1, i;
968  k1 = var[Nvar];
969  i = 0;
970  loop
971  {
972    if (rad[i][k1])
973    {
974      *a = i;
975      return;
976    }
977    i++;
978    if (i == Nrad)
979    {
980      *a = i;
981      return;
982    }
983  }
984}
985
986
987monf hCreate(int Nvar)
988{
989  monf xmem;
990  int  i;
991  xmem = (monf)omAlloc((Nvar + 1) * sizeof(monp));
992  for (i = Nvar; i>0; i--)
993  {
994    xmem[i] = (monp)omAlloc(LEN_MON);
995    xmem[i]->mo = NULL;
996  }
997  return xmem;
998}
999
1000
1001void hKill(monf xmem, int Nvar)
1002{
1003  int  i;
1004  for (i = Nvar; i!=0; i--)
1005  {
1006    if (xmem[i]->mo!=NULL)
1007      omFreeSize((ADDRESS)xmem[i]->mo, xmem[i]->a * sizeof(scmon));
1008    omFreeSize((ADDRESS)xmem[i], LEN_MON);
1009  }
1010  omFreeSize((ADDRESS)xmem, (Nvar + 1) * sizeof(monp));
1011}
1012
1013
1014scfmon hGetmem(int lm, scfmon old, monp monmem)
1015{
1016  scfmon x = monmem->mo;
1017  int  lx = monmem->a;
1018  if (!x || (lm > lx))
1019  {
1020    if (x) omFreeSize((ADDRESS)x, lx * sizeof(scmon));
1021    monmem->mo = x = (scfmon)omAlloc(lm * sizeof(scmon));
1022    monmem->a = lm;
1023  }
1024  memcpy(x, old, lm * sizeof(scmon));
1025  return x;
1026}
1027
1028/*
1029* a bug in Metrowerks with "lifetime analysis"
1030*scmon hGetpure(scmon p)
1031*{
1032*  scmon p1, pn;
1033*  p1 = p + 1;
1034*  pn = p1 + pVariables;
1035*  memcpy(pn, p1, pVariables * sizeof(Exponent_t));
1036*  return pn - 1;
1037*}
1038*/
1039scmon hGetpure(scmon p)
1040{
1041  scmon p1 = p;
1042  scmon pn;
1043  p1++;
1044  pn = p1;
1045  pn += pVariables;
1046  memcpy(pn, p1, pVariables * sizeof(Exponent_t));
1047  return pn - 1;
1048}
1049
Note: See TracBrowser for help on using the repository browser.