summaryrefslogtreecommitdiff
blob: 814dc4b2ab9d4feff08b076dde2b96f999df999e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
diff -ru src/src/basemath/alglin1.c b/src/basemath/alglin1.c
--- src/src/basemath/alglin1.c	2014-01-29 18:00:27.000000000 +0100
+++ b/src/basemath/alglin1.c	2014-02-09 01:54:37.676725196 +0100
@@ -247,6 +247,7 @@
   a = RgM_shallowcopy(a);
   for (i=1; i<nbco; i++)
   {
+    int garbage = 0;  /* Only gerepile() once per loop iteration */
     for(k=i; k<=nbco; k++)
     {
       gcoeff(a,k,i) = ff->red(E,gcoeff(a,k,i));
@@ -271,7 +272,7 @@
       for (j=i+1; j<=nbco; j++)
       {
         gcoeff(a,j,k) = ff->add(E, gcoeff(a,j,k), ff->mul(E,m,gcoeff(a,j,i)));
-        if (low_stack(lim, stack_lim(av,1)))
+        if (low_stack(lim, stack_lim(av,1)) && (garbage++ == 0))
         {
           if(DEBUGMEM>1) pari_warn(warnmem,"det. col = %ld",i);
           gerepileall(av,4, &a,&x,&q,&m);
@@ -3721,6 +3722,7 @@
   a = RgM_shallowcopy(a);
   for (i=1; i<nbco; i++)
   {
+    int garbage = 0;  /* Only gerepile() once per loop iteration */
     k = pivot(a, data, i, NULL);
     if (k > nbco) return gerepilecopy(av, gcoeff(a,i,i));
     if (k != i)
@@ -3740,7 +3742,7 @@
       for (j=i+1; j<=nbco; j++)
       {
         gcoeff(a,j,k) = gsub(gcoeff(a,j,k), gmul(m,gcoeff(a,j,i)));
-        if (low_stack(lim, stack_lim(av,3)))
+        if (low_stack(lim, stack_lim(av,3)) && (garbage++ == 0))
         {
           if(DEBUGMEM>1) pari_warn(warnmem,"det. col = %ld",i);
           gerepileall(av,2, &a,&x);
@@ -3791,6 +3793,7 @@
   {
     GEN ci, ck, m;
     int diveuc = (gequal1(pprec)==0);
+    int garbage = 0;  /* Only gerepile() once per loop iteration */
 
     p = gcoeff(a,i,i);
     if (gequal0(p))
@@ -3827,7 +3830,7 @@
           GEN p1 = gsub(gmul(p,gel(ck,j)), gmul(m,gel(ci,j)));
           if (diveuc) p1 = mydiv(p1,pprec);
           gel(ck,j) = gerepileupto(av2, p1);
-          if (low_stack(lim,stack_lim(av,2)))
+          if (low_stack(lim,stack_lim(av,2)) && (garbage++ == 0))
           {
             if(DEBUGMEM>1) pari_warn(warnmem,"det. col = %ld",i);
             gerepileall(av,2, &a,&pprec);