| Bill Allombert on Fri, 10 Feb 2012 22:33:23 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Please test pari-2.5.1 prerelease 2 |
On Fri, Feb 10, 2012 at 09:34:52PM +0100, Bill Allombert wrote: > On Fri, Feb 10, 2012 at 07:37:02PM +0100, Leonardo Cangelmi wrote: > > > > I tested pari-2.5.1 (the prerelease 2 and then the stable version). There > > are no problems in compilation and tests. However, the total time taken by > > test-all is longer than in version 2.5.0 (see the attached bench files). > > Thanks for your careful tests! > > Note that when we fix a bug in 2.5.1, we generally add a new test, so it is > expected that the new testsuite takes more time. However, in this case the > difference is large and is indeed a regression. > > The largest slowdown is in test-resultant. It was introduced by > the commit 5301c466d2 which fixes this bug: > 18- subst(Y/X,X,x) -> 0 > > We will try to address that in 2.5.2. I found out that the unstable branch is not affected due to the second half of 961d38a24ef improving substvec speed tremendously. Unfortunately I only applied the first half to PARI 2.5.1 (since the second half is not a bug fix). Please find a patch which apply the second half, which I am considering to apply to 2.5.2. Cheers, Bill.
>From c325dedd4d680dd95a6e8622d4d69c04135f40c2 Mon Sep 17 00:00:00 2001
From: Karim Belabas <Karim.Belabas@math.u-bordeaux1.fr>
Date: Tue, 23 Aug 2011 13:19:27 +0000
Subject: [PATCH] improve substvec speed.
---
src/basemath/gen3.c | 27 ++++++++++++++++-----------
1 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/src/basemath/gen3.c b/src/basemath/gen3.c
index 4f86849..5673bc1 100644
--- a/src/basemath/gen3.c
+++ b/src/basemath/gen3.c
@@ -1453,24 +1453,29 @@ GEN
gsubstvec(GEN e, GEN v, GEN r)
{
pari_sp ltop=avma;
- long i,l=lg(v);
+ long i, j, l = lg(v);
GEN w,z;
- if ( !is_vec_t(typ(v)) || !is_vec_t(typ(r)) )
- pari_err(typeer,"substvec");
+ if ( !is_vec_t(typ(v)) || !is_vec_t(typ(r)) ) pari_err(typeer,"substvec");
if (lg(r)!=l)
pari_err(talker,"different number of variables and values in substvec");
- w=cgetg(l,t_VECSMALL);
- z=cgetg(l,t_VECSMALL);
- for(i=1;i<l;i++)
+ w = cgetg(l,t_VECSMALL);
+ z = cgetg(l,t_VECSMALL);
+ for(i=j=1;i<l;i++)
{
GEN T = gel(v,i);
if (!gcmpX(T)) pari_err(talker,"not a variable in substvec (%Ps)", T);
- w[i]=varn(T);
- z[i]=fetch_var();
+ if (gvar(gel(r,i)) == NO_VARIABLE) /* no need to take precautions */
+ e = gsubst(e, varn(T), gel(r,i));
+ else
+ {
+ w[j]=varn(T);
+ z[j]=fetch_var();
+ j++;
+ }
}
- for(i=1;i<l;i++) e = gsubst(e,w[i],pol_x(z[i]));
- for(i=1;i<l;i++) e = gsubst(e,z[i],gel(r,i));
- for(i=1;i<l;i++) (void)delete_var();
+ for(i=1;i<j;i++) e = gsubst(e,w[i],pol_x(z[i]));
+ for(i=1;i<j;i++) e = gsubst(e,z[i],gel(r,i));
+ for(i=1;i<j;i++) (void)delete_var();
return gerepileupto(ltop,e);
}
--
1.7.2.5