| Bill Allombert on Sat, 20 Mar 2004 15:51:53 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| patch to speed up binomial |
Hello PARI developers,
Here a patch to speed up binomial() the same way as mpfact:
Basically it use divide_conquer_prod. That should be around
60% faster on my tests.
This patch can probably be made cleaner.
I don't think it affects the accuracy of the result in any way
(when n is a real).
Cheers,
Bill.
Index: src/basemath/bibli2.c
===================================================================
RCS file: /home/cvs/pari/src/basemath/bibli2.c,v
retrieving revision 1.60
diff -u -r1.60 bibli2.c
--- src/basemath/bibli2.c 25 Jan 2004 17:50:05 -0000 1.60
+++ src/basemath/bibli2.c 20 Mar 2004 14:25:27 -0000
@@ -497,7 +497,7 @@
if (k == 0) return gun;
return gcopy(n);
}
- av = avma; y = n;
+ av = avma;
if (typ(n) == t_INT)
{
if (signe(n) > 0)
@@ -512,14 +512,19 @@
return gcopy(n);
}
}
- for (i=2; i<=k; i++)
- y = gdivgs(gmul(y,addis(n,i-1-k)), i);
+ y = cgetg(k+1,t_VEC);
+ for (i=1; i<=k; i++)
+ y[i] = lsubis(n,i-1);
+ y=divide_conquer_prod(y,mulii);
}
else
{
- for (i=2; i<=k; i++)
- y = gdivgs(gmul(y,gaddgs(n,i-1-k)), i);
+ y = cgetg(k+1,t_VEC);
+ for (i=1; i<=k; i++)
+ y[i] = lsubgs(n,i-1);
+ y=divide_conquer_prod(y,gmul);
}
+ y=gdiv(y,mpfact(k));
return gerepileupto(av, y);
}