[libmath-prime-util-perl] 37/59: More random prime changes
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:44:58 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.10
in repository libmath-prime-util-perl.
commit c4219ab04d0c6e57b57539c0017478a4b33b4344
Author: Dana Jacobsen <dana at acm.org>
Date: Sun Jul 8 05:09:37 2012 -0600
More random prime changes
---
XS.xs | 4 ++--
lib/Math/Prime/Util.pm | 37 ++++++++++++++++++++++++++++++-------
lib/Math/Prime/Util/PP.pm | 44 ++++++++++++++++++++++----------------------
3 files changed, 54 insertions(+), 31 deletions(-)
diff --git a/XS.xs b/XS.xs
index 2821618..54937c0 100644
--- a/XS.xs
+++ b/XS.xs
@@ -307,9 +307,9 @@ _XS_factor(IN UV n)
}
void
-trial_factor(IN UV n)
+trial_factor(IN UV n, IN UV maxfactor = 0)
PPCODE:
- SIMPLE_FACTOR(trial_factor, n, UV_MAX);
+ SIMPLE_FACTOR(trial_factor, n, maxfactor);
void
fermat_factor(IN UV n, IN UV maxrounds = 64*1024*1024)
diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index 21daaf7..cccd6bb 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -327,6 +327,26 @@ sub primes {
# Returns a uniform number between [0,$range] inclusive.
my $get_rand_range = sub {
my($range) = @_;
+ my $rbits = 0;
+ if (ref($range) eq 'Math::BigInt') {
+ $rbits = length($range->as_bin) - 2;
+ } else {
+ my $t = $range - 1;
+ while ($t) { $rbits++; $t >>= 1; }
+ }
+ while (1) {
+ my $rbitsleft = $rbits;
+ my $U = $range - $range; # zero in possible bigint
+ while ($rbitsleft > 0) {
+ my $usebits = ($rbitsleft > $rand_max_bits) ? $rand_max_bits : $rbitsleft;
+ $U = ($U << $usebits) + $irandf->(1 << $usebits);
+ $rbitsleft -= $usebits;
+ }
+ return $U if $U <= $range;
+ }
+ };
+ my $get_rand_range2 = sub {
+ my($range) = @_;
my $max = int($range) + 1;
my $offset = 0;
while ($max > 1) {
@@ -539,7 +559,7 @@ sub primes {
my $I = Math::BigInt->new(2)->bpow($k-1)->bdiv(2 * $q)->bfloor;
#warn "I = $I\n";
- my @primes = @{primes($B)};
+ my @primes = @{primes(11,$B)};
while (1) {
# R is a random number between $I+1 and 2*$I
@@ -548,9 +568,12 @@ sub primes {
# We constructed a promising looking $n. Now test it.
# Trial divide up to $B
+ next if !($n % 3);
+ next if !($n % 5);
+ next if !($n % 7);
my $looks_prime = 1;
foreach my $p (@primes) {
- do { $looks_prime = 0; last; } if ($n % $p) == 0;
+ do { $looks_prime = 0; last; } if !($n % $p);
}
next unless $looks_prime;
#warn "$n passes trial division\n";
@@ -581,10 +604,10 @@ sub primes {
# next if $z is a perfect square
# Menezes seems to imply only the q test needs to be done.
- # Finally, verify with a BPSW test on the result. This will either,
+ # We perhaps could verify with a BPSW test on the result. This could:
# 1) save us from accidently outputing a non-prime due to some mistake
# 2) make history by finding the first known BPSW pseudo-prime
- croak "Maurer prime $n failed BPSW" unless is_prob_prime($n);
+ # croak "Maurer prime $n failed BPSW" unless is_prob_prime($n);
#warn " and passed BPSW.\n";
return $n;
@@ -634,7 +657,7 @@ sub moebius {
return 1 if $n == 1;
# Quick check for small replicated factors
- return 0 if ($n >= 25) && (($n % 4) == 0 || ($n % 9) == 0 || ($n % 25) == 0);
+ return 0 if ($n >= 25) && (!($n % 4) || !($n % 9) || !($n % 25));
my @factors = factor($n);
my %all_factors;
@@ -808,9 +831,9 @@ sub is_prob_prime {
return 2 if $n == 2 || $n == 3 || $n == 5 || $n == 7;
return 0 if $n < 11;
- return 0 if ($n % 2) == 0 || ($n % 3) == 0 || ($n % 5) == 0 || ($n % 7) == 0;
+ return 0 if !($n % 2) || !($n % 3) || !($n % 5) || !($n % 7);
foreach my $i (qw/11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71/) {
- return 2 if $i*$i > $n; return 0 if ($n % $i) == 0;
+ return 2 if $i*$i > $n; return 0 if !($n % $i);
}
if ($n < 105936894253) { # BPSW seems to be faster after this
diff --git a/lib/Math/Prime/Util/PP.pm b/lib/Math/Prime/Util/PP.pm
index 525bcb3..72bb812 100644
--- a/lib/Math/Prime/Util/PP.pm
+++ b/lib/Math/Prime/Util/PP.pm
@@ -98,7 +98,7 @@ sub _is_prime7 { # n must not be divisible by 2, 3, or 5
foreach my $i (qw/7 11 13 17 19 23 29/) {
return 2 if $i*$i > $n;
- return 0 if ($n % $i) == 0;
+ return 0 if !($n % $i);
}
return Math::Prime::Util::is_prob_prime($n) if $n > 10_000_000;
@@ -106,24 +106,24 @@ sub _is_prime7 { # n must not be divisible by 2, 3, or 5
my $limit = int(sqrt($n));
my $i = 31;
while (($i+30) <= $limit) {
- return 0 if ($n % $i) == 0; $i += 6;
- return 0 if ($n % $i) == 0; $i += 4;
- return 0 if ($n % $i) == 0; $i += 2;
- return 0 if ($n % $i) == 0; $i += 4;
- return 0 if ($n % $i) == 0; $i += 2;
- return 0 if ($n % $i) == 0; $i += 4;
- return 0 if ($n % $i) == 0; $i += 6;
- return 0 if ($n % $i) == 0; $i += 2;
+ return 0 if !($n % $i); $i += 6;
+ return 0 if !($n % $i); $i += 4;
+ return 0 if !($n % $i); $i += 2;
+ return 0 if !($n % $i); $i += 4;
+ return 0 if !($n % $i); $i += 2;
+ return 0 if !($n % $i); $i += 4;
+ return 0 if !($n % $i); $i += 6;
+ return 0 if !($n % $i); $i += 2;
}
while (1) {
- last if $i > $limit; return 0 if ($n % $i) == 0; $i += 6;
- last if $i > $limit; return 0 if ($n % $i) == 0; $i += 4;
- last if $i > $limit; return 0 if ($n % $i) == 0; $i += 2;
- last if $i > $limit; return 0 if ($n % $i) == 0; $i += 4;
- last if $i > $limit; return 0 if ($n % $i) == 0; $i += 2;
- last if $i > $limit; return 0 if ($n % $i) == 0; $i += 4;
- last if $i > $limit; return 0 if ($n % $i) == 0; $i += 6;
- last if $i > $limit; return 0 if ($n % $i) == 0; $i += 2;
+ last if $i > $limit; return 0 if !($n % $i); $i += 6;
+ last if $i > $limit; return 0 if !($n % $i); $i += 4;
+ last if $i > $limit; return 0 if !($n % $i); $i += 2;
+ last if $i > $limit; return 0 if !($n % $i); $i += 4;
+ last if $i > $limit; return 0 if !($n % $i); $i += 2;
+ last if $i > $limit; return 0 if !($n % $i); $i += 4;
+ last if $i > $limit; return 0 if !($n % $i); $i += 6;
+ last if $i > $limit; return 0 if !($n % $i); $i += 2;
}
2;
}
@@ -135,7 +135,7 @@ sub is_prime {
return 2 if ($n == 2) || ($n == 3) || ($n == 5); # 2, 3, 5 are prime
return 0 if $n < 7; # everything else below 7 is composite
# multiples of 2,3,5 are composite
- return 0 if (($n % 2) == 0) || (($n % 3) == 0) || (($n % 5) == 0);
+ return 0 if !($n % 2) || !($n % 3) || !($n % 5);
return _is_prime7($n);
}
@@ -530,7 +530,7 @@ sub miller_rabin {
return 0 if ($n == 0) || ($n == 1);
return 1 if ($n == 2) || ($n == 3);
- return 0 if ($n % 2) == 0;
+ return 0 if !($n % 2);
if ( ref($n) eq 'Math::BigInt' ) {
@@ -777,9 +777,9 @@ sub _basic_factor {
return ($_[0]) if $_[0] < 4;
my @factors;
- while ( ($_[0] % 2) == 0 ) { push @factors, 2; $_[0] = int($_[0] / 2); }
- while ( ($_[0] % 3) == 0 ) { push @factors, 3; $_[0] = int($_[0] / 3); }
- while ( ($_[0] % 5) == 0 ) { push @factors, 5; $_[0] = int($_[0] / 5); }
+ while ( !($_[0] % 2) ) { push @factors, 2; $_[0] = int($_[0] / 2); }
+ while ( !($_[0] % 3) ) { push @factors, 3; $_[0] = int($_[0] / 3); }
+ while ( !($_[0] % 5) ) { push @factors, 5; $_[0] = int($_[0] / 5); }
# Stop using bignum if we can
$_[0] = int($_[0]->bstr) if ref($_[0]) eq 'Math::BigInt' && $_[0] <= ~0;
--
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