source: git/Singular/hutil.cc @ 907274

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