[libmath-prime-util-perl] 15/23: Tweak MR test, add environment variables to disable XS and GMP
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:45:56 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.14
in repository libmath-prime-util-perl.
commit 3e5a8b2eda5466f1126a7039b06ae11947daae1d
Author: Dana Jacobsen <dana at acm.org>
Date: Wed Nov 28 22:28:21 2012 -0800
Tweak MR test, add environment variables to disable XS and GMP
---
Changes | 3 +++
TODO | 7 +++++--
factor.c | 25 ++++++++++++-------------
lib/Math/Prime/Util.pm | 6 ++++--
4 files changed, 24 insertions(+), 17 deletions(-)
diff --git a/Changes b/Changes
index 72b964e..86c6544 100644
--- a/Changes
+++ b/Changes
@@ -16,6 +16,9 @@ Revision history for Perl extension Math::Prime::Util.
jordan_totient generalization of Euler Totient
divisor_sum run coderef for every divisor
+ - Allow environment variables MPU_NO_XS and MPU_NO_GMP to turn off XS and
+ GMP support respectively if they are defined and equal to 1.
+
0.13 19 November 2012
- Fix an issue with prime count, and make prime count available as a
diff --git a/TODO b/TODO
index e317e7f..daade6c 100644
--- a/TODO
+++ b/TODO
@@ -29,8 +29,6 @@
- Make proper pminus1 in PP code, like factor.c.
-- Add Lehmer in PP (I have a version, just needs some polishing).
-
- For bignums, RiemannZeta and RiemmannR are slow and give questionable
precision. We should be able to do better. One problem is the accuracy
bug in Math::BigFloat. Perhaps check for Math::MPFR installed and use it?
@@ -47,3 +45,8 @@
is_provable_prime
RiemannZeta
RiemannR
+
+- Add Lehmer in PP (I have a version, just needs some polishing). This is a
+ high priority, as the test suite now assumes prime_count is fast for large
+ inputs.
+
diff --git a/factor.c b/factor.c
index deedbae..a032cbe 100644
--- a/factor.c
+++ b/factor.c
@@ -142,9 +142,9 @@ static int is_perfect_square(UV n, UV* sqrtn)
*/
int _XS_miller_rabin(UV n, const UV *bases, int nbases)
{
- int b;
- int s = 0;
+ UV const nm1 = n-1;
UV d = n-1;
+ int b, r, s = 0;
MPUassert(n > 3, "MR called with n <= 3");
@@ -153,15 +153,18 @@ int _XS_miller_rabin(UV n, const UV *bases, int nbases)
d >>= 1;
}
for (b = 0; b < nbases; b++) {
- int r;
- UV a = bases[b];
- UV x;
+ UV x, a = bases[b];
if (a < 2)
croak("Base %"UVuf" is invalid", a);
#if 0
if (a > (n-2))
croak("Base %"UVuf" is invalid for input %"UVuf, a, n);
+#else
+ if (a >= n)
+ a %= n;
+ if ( (a <= 1) || (a == nm1) )
+ continue;
#endif
/* n is a strong pseudoprime to this base if either
@@ -170,19 +173,15 @@ int _XS_miller_rabin(UV n, const UV *bases, int nbases)
*/
x = powmod(a, d, n);
- if ( (x == 1) || (x == (n-1)) ) continue;
+ if ( (x == 1) || (x == nm1) ) continue;
/* cover r = 1 to s-1, r=0 was just done */
for (r = 1; r < s; r++) {
x = sqrmod(x, n);
- if (x == 1) {
- return 0;
- } else if (x == (n-1)) {
- a = 0;
- break;
- }
+ if ( x == nm1 ) break;
+ if ( x == 1 ) return 0;
}
- if (a != 0)
+ if (r >= s)
return 0;
}
return 1;
diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index e40c547..0df6425 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -59,6 +59,7 @@ BEGIN {
require Math::Prime::Util::PP; Math::Prime::Util::PP->import();
eval {
+ return 0 if defined $ENV{MPU_NO_XS} && $ENV{MPU_NO_XS} == 1;
require XSLoader;
XSLoader::load(__PACKAGE__, $Math::Prime::Util::VERSION);
prime_precalc(0);
@@ -276,8 +277,9 @@ sub primes {
} elsif (($high <= (65536*30)) || ($high <= _get_prime_cache_size())) {
$method = 'Sieve';
- # More memory than we should reasonably use for base sieve?
- } elsif ($high > (32*1024*1024*30)) {
+ # At some point the segmented sieve is faster than the base sieve, not
+ # to mention using much less memory.
+ } elsif ($high > (1024*1024*30)) {
$method = 'Segment';
# The segment sieve doesn't itself use a segmented sieve for the base,
# so it will slow down for very large endpoints (larger than 10^16).
--
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