[libmath-prime-util-perl] 27/181: Lehmer update cache settings
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:51:03 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.36
in repository libmath-prime-util-perl.
commit 953591015df2c8c3e767710bbbc0b0e1b6d3589d
Author: Dana Jacobsen <dana at acm.org>
Date: Fri Dec 20 18:22:58 2013 -0800
Lehmer update cache settings
---
lehmer.c | 48 ++++++++++++++++++++++++++++++++----------------
1 file changed, 32 insertions(+), 16 deletions(-)
diff --git a/lehmer.c b/lehmer.c
index 99ce156..4c7e50a 100644
--- a/lehmer.c
+++ b/lehmer.c
@@ -286,6 +286,8 @@ static uint16_t _s6[30030];
static const uint16_t* sphicache[7] = { _s0,_s1,_s2,_s3,_s4,_s5,_s6 };
static int sphi_init = 0;
+#define PHIC 7
+
static UV tablephi(UV x, uint32_t a) {
switch (a) {
case 0: return x;
@@ -295,11 +297,25 @@ static UV tablephi(UV x, uint32_t a) {
case 4: return (x/ 210U) * 48U + sphicache[4][x % 210U];
case 5: return (x/ 2310U) * 480U + sphicache[5][x % 2310U];
case 6: return (x/ 30030U) * 5760U + sphicache[6][x % 30030U];
- default: {
+#if PHIC >= 7
+ case 7: {
UV xp = x / 17U;
return ((x /30030U) * 5760U + sphicache[6][x % 30030U]) -
((xp/30030U) * 5760U + sphicache[6][xp % 30030U]);
}
+#endif
+#if PHIC >= 8
+ case 8: {
+ UV xp = x / 17U;
+ UV x2 = x / 19U;
+ UV x2p = x2 / 17U;
+ return ((x /30030U) * 5760U + sphicache[6][x % 30030U]) -
+ ((xp /30030U) * 5760U + sphicache[6][xp % 30030U]) -
+ ((x2 /30030U) * 5760U + sphicache[6][x2 % 30030U]) +
+ ((x2p/30030U) * 5760U + sphicache[6][x2p% 30030U]);
+ }
+#endif
+ default: croak("a %u too large for tablephi\n", a);
}
}
static void phitableinit(void) {
@@ -316,9 +332,9 @@ static void phitableinit(void) {
}
-/* Max memory = 2*A*X bytes, e.g. 2*400*24000 = 18.3 MB */
-#define PHICACHEA 257
-#define PHICACHEX 32769
+/* Max memory = 2*X*A bytes, e.g. 2*65536*256 = 32 MB */
+#define PHICACHEA 512
+#define PHICACHEX 65536
typedef struct
{
uint32_t max[PHICACHEA];
@@ -370,10 +386,10 @@ static IV _phi3(UV x, UV a, int sign, const uint32_t* const primes, const uint32
if (PHI_CACHE_POPULATED(x, a))
return sign * cache->val[a][x];
+ else if (a <= PHIC)
+ sum = sign * tablephi(x,a);
else if (x < primes[a+1])
sum = sign;
- else if (a <= 7)
- sum = sign * tablephi(x,a);
else if (x <= primes[lastidx] && x < primes[a]*primes[a])
sum = sign * (bs_prime_count(x, primes, lastidx) - a + 1);
else {
@@ -385,11 +401,11 @@ static IV _phi3(UV x, UV a, int sign, const uint32_t* const primes, const uint32
for (a2 = 1; a2 <= iters; a2++)
sum += _phi3( FAST_DIV(x, primes[a2]), a2-1, -sign, primes, lastidx, cache);
} else {
- if (PHI_CACHE_POPULATED(x, 7))
- sum = sign * cache->val[7][x];
+ if (PHI_CACHE_POPULATED(x, PHIC))
+ sum = sign * cache->val[PHIC][x];
else
- sum = sign * tablephi(x, 7);
- for (a2 = 8; a2 <= a; a2++)
+ sum = sign * tablephi(x, PHIC);
+ for (a2 = PHIC+1; a2 <= a; a2++)
sum += _phi3( FAST_DIV(x,primes[a2]), a2-1, -sign, primes, lastidx, cache);
}
}
@@ -565,7 +581,7 @@ static UV phi(UV x, UV a)
phitableinit();
if (a == 1) return ((x+1)/2);
- if (a <= 7) return tablephi(x, a);
+ if (a <= PHIC) return tablephi(x, a);
lastidx = a+1;
primes = generate_small_primes(lastidx);
@@ -579,7 +595,7 @@ static UV phi(UV x, UV a)
a2 = vcarray_create();
vcarray_insert(&a1, x, 1);
- while (a > 7) {
+ while (a > PHIC) {
UV primea = primes[a];
UV sval_last = 0;
IV sval_count = 0;
@@ -638,7 +654,7 @@ static UV phi(UV x, UV a)
#pragma omp parallel for reduction(+: sum) schedule(dynamic, 16)
#endif
for (i = 0; i < a1.n; i++)
- sum += arr[i].c * tablephi( arr[i].v, 7 );
+ sum += arr[i].c * tablephi( arr[i].v, PHIC );
vcarray_destroy(&a1);
Safefree(primes);
return (UV) sum;
@@ -881,14 +897,14 @@ static const unsigned char primes_small[] =
UV _XS_legendre_phi(UV x, UV a) {
/* For small values, calculate directly */
- if (a <= 7) return tablephi(x, a);
+ if (a <= PHIC) return tablephi(x, a);
/* For large values, do our non-recursive phi */
if (a > NPRIMES_SMALL) return phi(x,a);
/* Otherwise, recurse */
{
UV i;
- UV sum = tablephi(x, 7);
- for (i = 8; i <= a; i++) {
+ UV sum = tablephi(x, PHIC);
+ for (i = PHIC+1; i <= a; i++) {
uint32_t p = primes_small[i];
UV xp = x/p;
if (xp < p) {
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libmath-prime-util-perl.git
More information about the Pkg-perl-cvs-commits
mailing list