[libmath-prime-util-perl] 10/11: Fix some horrible breakage on 32-bit
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:46:12 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.15
in repository libmath-prime-util-perl.
commit 25b940c26d757e2693e7db2a07114e00083af350
Author: Dana Jacobsen <dana at acm.org>
Date: Sun Dec 9 18:10:55 2012 -0800
Fix some horrible breakage on 32-bit
---
lib/Math/Prime/Util.pm | 17 ++++++++++++-----
t/16-randomprime.t | 10 +++++++---
2 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index eaad7ef..5764c45 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -180,6 +180,8 @@ sub prime_set_config {
} elsif ($param eq 'gmp') {
$_Config{'gmp'} = ($value) ? 1 : 0;
$_HAVE_GMP = $_Config{'gmp'};
+ } elsif ($param eq 'nobigint') {
+ $_Config{'nobigint'} = ($value) ? 1 : 0;
} elsif ($param =~ /^(assume[_ ]?)?[ge]?rh$/ || $param =~ /riemann\s*h/) {
$_Config{'assume_rh'} = ($value) ? 1 : 0;
} elsif ($param eq 'verbose') {
@@ -446,7 +448,8 @@ sub primes {
$irandf = sub {
my($range) = @_;
return 0 if $range <= 0;
- return int(::rand($range+1)) if $range < (1 << 31);
+ my $zero = $range - $range; # zero in possible bigint
+ return $zero+int(::rand($range+1)) if $range < (1 << 31);
my $rbits = 0;
if (ref($range) eq 'Math::BigInt') {
$rbits = length($range->as_bin) - 2;
@@ -456,7 +459,7 @@ sub primes {
}
while (1) {
my $rbitsleft = $rbits;
- my $U = $range - $range; # zero in possible bigint
+ my $U = $zero;
while ($rbitsleft > 0) {
my $usebits = ($rbitsleft > 31) ? 31 : $rbitsleft;
$U = ($U << $usebits) + int(::rand(1 << $usebits));
@@ -469,8 +472,9 @@ sub primes {
$irandf = sub {
my($range) = @_;
return 0 if $range <= 0;
+ my $zero = $range - $range; # zero in possible bigint
my $rand_max_bits = $_Config{'system_randbits'};
- return int(rand($range+1)) if $range < (1 << $rand_max_bits);
+ return $zero+int(rand($range+1)) if $range < (1 << $rand_max_bits);
my $rbits = 0;
if (ref($range) eq 'Math::BigInt') {
$rbits = length($range->as_bin) - 2;
@@ -480,7 +484,7 @@ sub primes {
}
while (1) {
my $rbitsleft = $rbits;
- my $U = $range - $range; # zero in possible bigint
+ my $U = $zero;
while ($rbitsleft > 0) {
my $usebits = ($rbitsleft > $rand_max_bits) ? $rand_max_bits : $rbitsleft;
$U = ($U << $usebits) + int(rand(1 << $usebits));
@@ -822,6 +826,7 @@ sub primes {
# I've seen +0, +1, and +2 here. Maurer uses +0. Menezes uses +1.
my $q = random_maurer_prime( ($r * $k)->bfloor + 1 );
+ $q = Math::BigInt->new("$q") unless ref($q) eq 'Math::BigInt';
my $I = Math::BigInt->new(2)->bpow($k-1)->bdiv(2 * $q)->bfloor;
print "B = $B r = $r k = $k q = $q I = $I\n" if $verbose;
@@ -833,7 +838,8 @@ sub primes {
_make_big_gcds() if $_big_gcd_use;
}
- while (1) {
+ my $loop_limit = 1_000_000 + $k * 1_000;
+ while ($loop_limit-- > 0) {
# R is a random number between $I+1 and 2*$I
my $R = $I + 1 + $irandf->( $I - 1 );
#my $n = 2 * $R * $q + 1;
@@ -899,6 +905,7 @@ sub primes {
}
# Didn't pass the selected a values. Try another R.
}
+ croak "Failure in random_maurer_prime, could not find a prime\n";
} # End of random_maurer_prime
} # end of the random prime section
diff --git a/t/16-randomprime.t b/t/16-randomprime.t
index ce9675f..2641a54 100644
--- a/t/16-randomprime.t
+++ b/t/16-randomprime.t
@@ -6,9 +6,9 @@ use Test::More;
#use Math::Random::MT qw/rand/;
#use Math::Random::MT::Auto qw/rand/;
#sub rand { return 0.5; }
-use Math::Prime::Util qw/-nobigint
- random_prime random_ndigit_prime random_nbit_prime
- random_maurer_prime is_prime/;
+use Math::Prime::Util qw/random_prime random_ndigit_prime random_nbit_prime
+ random_maurer_prime is_prime
+ prime_set_config/;
my $use64 = Math::Prime::Util::prime_get_config->{'maxbits'} > 32;
my $extra = defined $ENV{RELEASE_TESTING} && $ENV{RELEASE_TESTING};
@@ -122,6 +122,10 @@ while (my($range, $expect) = each (%ranges)) {
ok($inrange, "All returned values for $low-$high were in the range" );
}
+# We want to test the no-bigint stuff here. This makes calls for 10-digit
+# (32-bit) and 20-digit (64-bit) random primes stay inside native range.
+prime_set_config(nobigint=>1);
+
foreach my $high (@random_to) {
my $isprime = 1;
my $inrange = 1;
--
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