[libmath-prime-util-perl] 37/43: Add one more big-a optimization to legendre_phi
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:53:09 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.40
in repository libmath-prime-util-perl.
commit 6be3cee015b8a43ae6fbd84e96d09d416cac7f91
Author: Dana Jacobsen <dana at acm.org>
Date: Thu Apr 17 16:34:40 2014 -0700
Add one more big-a optimization to legendre_phi
---
TODO | 3 +++
lmo.c | 14 ++++++++++++--
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/TODO b/TODO
index 021d8b0..ae9e8e2 100644
--- a/TODO
+++ b/TODO
@@ -68,3 +68,6 @@
- Ensure a fast path for Math::GMP from MPU -> MPU:GMP -> GMP, and back.
- znlog better implementation
+
+- We don't use legendre_phi for other functions any more, but it'd be nice
+ to speed it up using some ideas from the Ohana 2011 SAGE code.
diff --git a/lmo.c b/lmo.c
index 5f98e0f..4004ba3 100644
--- a/lmo.c
+++ b/lmo.c
@@ -338,18 +338,28 @@ static IV _phi(UV x, UV a, int sign, const uint32_t* const primes, const uint32_
}
UV legendre_phi(UV x, UV a)
{
+ /* If 'x' is very small, give a quick answer with any 'a' */
if (x <= PHIC)
return tablephi(x, (a > PHIC) ? PHIC : a);
/* Shortcuts for large values, from R. Andrew Ohana */
if (a > (x >> 1)) return 1;
+ /* If a > prime_count(2^32), then we can need not be concerned with composite
+ * x values with all factors > 2^32, as x is limited to 64-bit. */
if (a > 203280221) { /* prime_count(2**32) */
UV pc = _XS_LMO_pi(x);
return (a > pc) ? 1 : pc - a + 1;
}
+ /* If a is large enough, check the ratios */
+ if (a > 1000000 && x < a*21) { /* x always less than 2^32 */
+ if ( _XS_LMO_pi(x) < a) return 1;
+ }
+
+ /* TODO: R. Andrew Ohana's 2011 SAGE code is faster as the a value
+ * increases. It uses a primelist as in the caching code below, as
+ * well as a binary search prime count on it (like in our lehmer). */
- /* TODO: tune these */
- if ( (x > PHIC && a > 200) || (x > 1000000000 && a > 30) ) {
+ if ( a > 254 || (x > 1000000000 && a > 30) ) {
uint16_t* cache;
uint32_t* primes;
uint32_t lastidx;
--
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