[libmath-prime-util-perl] 02/04: Change PP perfect square test
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:47:04 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.20
in repository libmath-prime-util-perl.
commit dc5a392af4c0fcb42482981cf5357b9a6f40fd71
Author: Dana Jacobsen <dana at acm.org>
Date: Sat Feb 2 19:04:37 2013 -0800
Change PP perfect square test
---
Changes | 3 +++
MANIFEST | 1 +
examples/bench-mp-prime_count.pl | 21 +++++++++++++++++++++
lib/Math/Prime/Util/PP.pm | 19 ++++++++-----------
4 files changed, 33 insertions(+), 11 deletions(-)
diff --git a/Changes b/Changes
index 904b316..11d6ef6 100644
--- a/Changes
+++ b/Changes
@@ -4,6 +4,9 @@ Revision history for Perl extension Math::Prime::Util.
- Little speedup for PP AKS, and turn off test on 32-bit machines.
+ - Replaced fast sqrt detection in PP.pm with a slightly slower version.
+ The bloom filter doesn't work right in 32-bit Perl.
+
0.19 1 February 2012
- Update MR bases with newest from http://miller-rabin.appspot.com/.
diff --git a/MANIFEST b/MANIFEST
index 6f59e04..6945e23 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -41,6 +41,7 @@ examples/bench-pp-isprime.pl
examples/bench-pp-sieve.pl
examples/bench-mp-nextprime.pl
examples/bench-mp-psrp.pl
+examples/bench-mp-prime_count.pl
examples/test-factor-yafu.pl
examples/test-factor-mpxs.pl
examples/test-nextprime-yafu.pl
diff --git a/examples/bench-mp-prime_count.pl b/examples/bench-mp-prime_count.pl
new file mode 100644
index 0000000..d19797f
--- /dev/null
+++ b/examples/bench-mp-prime_count.pl
@@ -0,0 +1,21 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Math::Prime::Util;
+use Math::Prime::Util::GMP;
+use Math::Primality;
+use Benchmark qw/:all/;
+my $count = shift || -2;
+
+#my($n, $exp) = (100000,9592);
+my($n, $exp) = (1000000,78498);
+#my($n, $exp) = (10000000,664579);
+cmpthese($count,{
+ 'MP' =>sub { die unless $exp == Math::Primality::prime_count($n); },
+ 'MPU default' =>sub { die unless $exp == Math::Prime::Util::prime_count($n); },
+ 'MPU XS Sieve' =>sub { die unless $exp == Math::Prime::Util::_XS_prime_count($n); },
+ 'MPU XS Lehmer'=>sub { die unless $exp == Math::Prime::Util::_XS_lehmer_pi($n); },
+ 'MPU PP Sieve' =>sub { die unless $exp == Math::Prime::Util::PP::_sieve_prime_count($n); },
+ 'MPU PP Lehmer'=>sub { die unless $exp == Math::Prime::Util::PP::_lehmer_pi($n); },
+ 'MPU GMP Trial'=>sub { die unless $exp == Math::Prime::Util::GMP::prime_count(2,$n); },
+});
diff --git a/lib/Math/Prime/Util/PP.pm b/lib/Math/Prime/Util/PP.pm
index 051422e..54c8b10 100644
--- a/lib/Math/Prime/Util/PP.pm
+++ b/lib/Math/Prime/Util/PP.pm
@@ -852,16 +852,15 @@ sub is_strong_lucas_pseudoprime {
# Check for perfect square
if (ref($n) eq 'Math::BigInt') {
- my $mcheck = int(($n & 127)->bstr);
- if (($mcheck*0x8bc40d7d) & ($mcheck*0xa1e2f5d1) & 0x14020a) {
- # ~82% of non-squares were rejected by the bloom filter
+ my $mc = int(($n & 31)->bstr);
+ if ($mc==0||$mc==1||$mc==4||$mc==9||$mc==16||$mc==17||$mc==25) {
my $sq = $n->copy->bsqrt->bfloor;
$sq->bmul($sq);
return 0 if $sq == $n;
}
} else {
- my $mcheck = $n & 127;
- if (($mcheck*0x8bc40d7d) & ($mcheck*0xa1e2f5d1) & 0x14020a) {
+ my $mc = $n & 31;
+ if ($mc==0||$mc==1||$mc==4||$mc==9||$mc==16||$mc==17||$mc==25) {
my $sq = int(sqrt($n));
return 0 if ($sq*$sq) == $n;
}
@@ -1412,9 +1411,8 @@ sub holf_factor {
$s->binc if ($s * $s) != $ni;
my $m = $s->copy->bmul($s)->bmod($n);
# Check for perfect square
- my $mcheck = int(($m & 127)->bstr);
- next if (($mcheck*0x8bc40d7d) & ($mcheck*0xa1e2f5d1) & 0x14020a);
- # ... 82% of non-squares were rejected by the bloom filter
+ my $mc = int(($m & 31)->bstr);
+ next unless $mc==0||$mc==1||$mc==4||$mc==9||$mc==16||$mc==17||$mc==25;
my $f = $m->copy->bsqrt->bfloor->as_int;
next unless ($f*$f) == $m;
$f = Math::BigInt::bgcd( ($s > $f) ? $s-$f : $f-$s, $n);
@@ -1432,9 +1430,8 @@ sub holf_factor {
$s++ if ($s * $s) != ($n * $i);
my $m = ($s < $_half_word) ? ($s*$s) % $n : _mulmod($s, $s, $n);
# Check for perfect square
- my $mcheck = $m & 127;
- next if (($mcheck*0x8bc40d7d) & ($mcheck*0xa1e2f5d1) & 0x14020a);
- # ... 82% of non-squares were rejected by the bloom filter
+ my $mc = $m & 31;
+ next unless $mc==0||$mc==1||$mc==4||$mc==9||$mc==16||$mc==17||$mc==25;
my $f = int(sqrt($m));
next unless $f*$f == $m;
$f = _gcd_ui( ($s > $f) ? $s - $f : $f - $s, $n);
--
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