[libmath-prime-util-perl] 59/72: Simplify some of the randomness loop code

Partha P. Mukherjee ppm-guest at moszumanska.debian.org
Thu May 21 18:49:41 UTC 2015


This is an automated email from the git hooks/post-receive script.

ppm-guest pushed a commit to annotated tag v0.32
in repository libmath-prime-util-perl.

commit 09ca3d513a2bc16d3cafbb5eba9aede8b5d5e4df
Author: Dana Jacobsen <dana at acm.org>
Date:   Tue Oct 8 12:43:27 2013 -0700

    Simplify some of the randomness loop code
---
 lib/Math/Prime/Util.pm | 28 +++++++++++++---------------
 1 file changed, 13 insertions(+), 15 deletions(-)

diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index 9f3698b..a2e14f4 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -529,24 +529,23 @@ sub primes {
         my $U;
         if (ref($range) eq 'Math::BigInt') {
           my $bits = length($range->as_bin) - 2;   # bits in range
-          my $bytes = int(($bits+7)/8);
-          # Generate more bits so we rarely have to loop.
+          my $bytes = 1 + int(($bits+7)/8);  # extra byte to reduce ave. loops
           my $rmax = Math::BigInt->bone->blsft($bytes*8)->bdec();
-          my $remainder = $rmax % $range;
+          my $overflow = $rmax - ($rmax % $range);
           do {
             $U = Math::BigInt->from_hex('0x' . $_BRS->bytes_hex($bytes));
-          } while $U >= ($rmax - $remainder);
+          } while $U >= $overflow;
         } elsif ($range <= 4294967295) {
-          my $remainder = 4294967295 % $range;
+          my $overflow = 4294967295 - (4294967295 % $range);
           do {
             $U = $_BRS->irand();
-          } while $U >= (4294967295 - $remainder);
+          } while $U >= $overflow;
         } else {
           croak "randf given max out of bounds: $max" if $range > ~0;
-          my $remainder = 18446744073709551615 % $range;
+          my $overflow = 18446744073709551615 - (18446744073709551615 % $range);
           do {
             $U = ($_BRS->irand() << 32) + $_BRS->irand();
-          } while $U >= (18446744073709551615 - $remainder);
+          } while $U >= $overflow;
         }
         return $U % $range;
       };
@@ -573,24 +572,23 @@ sub primes {
           my $zero = $range->copy->bzero;
           my $rbits = length($range->as_bin) - 2;   # bits in range
           my $rwords = int($rbits/32) + (($rbits % 32) ? 1 : 0);
-          # Generate more bits so we rarely have to loop.
           my $rmax = Math::BigInt->bone->blsft($rwords*32)->bdec();
-          my $remainder = $rmax % $range;
+          my $overflow = $rmax - ($rmax % $range);
           do {
             $U = $range->copy->from_hex
               ("0x" . join '', map { sprintf("%08X", $irandf->()) } 1 .. $rwords);
-          } while $U >= ($rmax - $remainder);
+          } while $U >= $overflow;
         } elsif ($range <= 4294967295) {
-          my $remainder = 4294967295 % $range;
+          my $overflow = 4294967295 - (4294967295 % $range);
           do {
             $U = $irandf->();
-          } while $U >= (4294967295 - $remainder);
+          } while $U >= $overflow;
         } else {
           croak "randf given max out of bounds: $max" if $range > ~0;
-          my $remainder = 18446744073709551615 % $range;
+          my $overflow = 18446744073709551615 - (18446744073709551615 % $range);
           do {
             $U = ($irandf->() << 32) + $irandf->();
-          } while $U >= (18446744073709551615 - $remainder);
+          } while $U >= $overflow;
         }
         return $U % $range;
       };

-- 
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