[libmath-prime-util-perl] 07/14: Tweak factoring and factor tests based on coverage analysis
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:47:52 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.25
in repository libmath-prime-util-perl.
commit c72237b008b6580aa5f662686184a693c732a9b1
Author: Dana Jacobsen <dana at acm.org>
Date: Wed Mar 13 14:23:43 2013 -0700
Tweak factoring and factor tests based on coverage analysis
---
Changes | 4 ++--
TODO | 3 ---
factor.c | 18 ++++++++----------
t/50-factoring.t | 3 ++-
4 files changed, 12 insertions(+), 16 deletions(-)
diff --git a/Changes b/Changes
index 390d496..0102f37 100644
--- a/Changes
+++ b/Changes
@@ -2,8 +2,8 @@ Revision history for Perl extension Math::Prime::Util.
0.25 xx March 2013
- - Speed up p-1 stage 2 factoring. This makes factor() about 20% faster
- for 19 digit semiprimes.
+ - Speed up p-1 stage 2 factoring. Combined with some minor changes to the
+ general factoring combination, ~20% faster for 19 digit semiprimes.
- New internal macro to loop over primary sieve starting at 2. Simplifies
code in quite a few places.
diff --git a/TODO b/TODO
index a75cc17..b0be486 100644
--- a/TODO
+++ b/TODO
@@ -19,9 +19,6 @@
- finish test suite for bignum. Work on making it faster.
-- After the factoring changes, we need to use Devel::Cover again to ferret
- out numbers that pass the early tests.
-
- Test all routines for numbers on word-size boundary, or ranges that cross.
- Test all functions return either native or bigints. Functions that return
diff --git a/factor.c b/factor.c
index 26622cf..44f36bd 100644
--- a/factor.c
+++ b/factor.c
@@ -49,34 +49,31 @@ int factor(UV n, UV *factors)
UV const br_rounds = ((n>>29) < 100000) ? 1500 : 1500;
UV const sq_rounds = 80000; /* 20k 91%, 40k 98%, 80k 99.9%, 120k 99.99% */
- /* About 94% of random inputs are factored with this pbrent call */
+ /* 99.7% of 32-bit, 94% of 64-bit random inputs factored here */
if (!split_success) {
split_success = pbrent_factor(n, tofac_stack+ntofac, br_rounds, 3)-1;
if (verbose) { if (split_success) printf("pbrent 1: %"UVuf" %"UVuf"\n", tofac_stack[ntofac], tofac_stack[ntofac+1]); else printf("pbrent 0\n"); }
}
- /* SQUFOF with these parameters gets 95% of what's left. */
+ /* SQUFOF with these parameters gets 99.9% of everything left */
if (!split_success && n < (UV_MAX>>3)) {
split_success = racing_squfof_factor(n,tofac_stack+ntofac, sq_rounds)-1;
if (verbose) printf("rsqufof %d\n", split_success);
}
- /* Perhaps prho using different parameters will find it */
- if (!split_success) {
- split_success = pbrent_factor(n, tofac_stack+ntofac, 800, 5)-1;
- if (verbose) printf("pbrent5 %d\n", split_success);
- }
+ /* At this point we should only have 16+ digit semiprimes. */
/* This p-1 gets about 2/3 of what makes it through the above */
if (!split_success) {
split_success = pminus1_factor(n, tofac_stack+ntofac, 5000, 80000)-1;
if (verbose) printf("pminus1 %d\n", split_success);
}
- /* Some rounds of HOLF, good for close to perfect squares */
+ /* Some rounds of HOLF, good for close to perfect squares which are
+ * the worst case for the next step */
if (!split_success) {
split_success = holf_factor(n, tofac_stack+ntofac, 2000)-1;
if (verbose) printf("holf %d\n", split_success);
}
- /* Less than 0.1% of random inputs make it here */
+ /* The catch-all. Should factor anything. */
if (!split_success) {
- split_success = pbrent_factor(n, tofac_stack+ntofac, 256*1024, 7)-1;
+ split_success = prho_factor(n, tofac_stack+ntofac, 256*1024)-1;
if (verbose) printf("long prho %d\n", split_success);
}
@@ -277,6 +274,7 @@ static int is_perfect_square(UV n, UV* sqrtn)
if ((m*0xabf1a3a7) & (m*0x2612bf93) & 0x45854000) return 0;
/* 99.92% of non-squares are rejected now */
#else
+ /* It may be faster to skip these */
m = n % 63;
if ((m*0x3d491df7) & (m*0xc824a9f9) & 0x10f14008) return 0;
#endif
diff --git a/t/50-factoring.t b/t/50-factoring.t
index 35cf133..2d367a7 100644
--- a/t/50-factoring.t
+++ b/t/50-factoring.t
@@ -32,7 +32,7 @@ my @testn = qw/0 1 2 3 4 5 6 7 8 16 57 64 377 9592 30107 78498 664579 5761455
808 2727 12625 34643 134431 221897 496213 692759 1228867
2231139 2463289 3008891 5115953 6961021 8030207 10486123
10893343 12327779 701737021
- 549900
+ 549900 10000142
/;
my @testn64 = qw/37607912018 346065536839 600851475143
@@ -42,6 +42,7 @@ my @testn64 = qw/37607912018 346065536839 600851475143
9007199254740991 9007199254740992 9007199254740993
6469693230 200560490130 7420738134810 304250263527210
13082761331670030 614889782588491410
+ 440091295252541 5333042142001571
/;
push @testn, @testn64 if $use64;
--
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