[libmath-prime-util-perl] 11/50: Better switch between segment and trial methods for very large end values
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:45:33 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.13
in repository libmath-prime-util-perl.
commit 158b8ba89c67101da4cb3ae02c72ca7b39a826c4
Author: Dana Jacobsen <dana at acm.org>
Date: Mon Oct 15 17:08:47 2012 -0600
Better switch between segment and trial methods for very large end values
---
lib/Math/Prime/Util.pm | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index 5b4fa69..3ac7661 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -257,6 +257,16 @@ sub primes {
# More memory than we should reasonably use for base sieve?
} elsif ($high > (32*1024*1024*30)) {
$method = 'Segment';
+ # The segment sieve doesn't itself use a segmented sieve for the base,
+ # so it will slow down for very large endpoints (larger than 10^16).
+ # Make a crude predictor of segment and trial and decide.
+ if ($high > 10**14) {
+ my $est_trial = ($high-$low) / 1_000_000; # trial estimate 1s per 1M
+ # segment is exponential on high, plus very fast scan.
+ my $est_segment = 0.2 * 3.3**(log($high / 10**15) / log(10))
+ + ($high-$low) / 1_000_000_000_000;
+ $method = 'Trial' if $est_trial <= $est_segment;
+ }
# Only want half or less of the range low-high ?
} elsif ( int($high / ($high-$low)) >= 2 ) {
--
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