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 fc219708072ea2aa226c1672e7a6c6c14265a6fc Author: Dana Jacobsen <d...@acm.org> Date: Fri Jun 29 04:29:50 2012 -0600 Turn on bignum support for PP code --- TODO | 2 ++ lib/Math/Prime/Util.pm | 10 ++++++++-- lib/Math/Prime/Util/PP.pm | 33 ++++++++++++++++++++++----------- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/TODO b/TODO index a879bfd..828b213 100644 --- a/TODO +++ b/TODO @@ -24,3 +24,5 @@ - Move .c / .h files into separate directory. version does it in a painful way. Something simpler to be had? + +- In PP nth_prime* and prime_count*, turn on bignum if bigint is on. diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm index 0d1ff4f..d81d3b5 100644 --- a/lib/Math/Prime/Util.pm +++ b/lib/Math/Prime/Util.pm @@ -103,7 +103,9 @@ sub primes { } # Verify the parameters are in range. - croak "Parameters [ $low $high ] not in range 0-$_maxparam" unless $low <= $_maxparam && $high <= $_maxparam; + if (!$_pure_perl || !defined $bigint::VERSION) { + croak "Parameters [ $low $high ] not in range 0-$_maxparam" unless $low <= $_maxparam && $high <= $_maxparam; + } return $sref if ($low > $high) || ($high < 2); @@ -167,7 +169,9 @@ sub random_prime { $high = 'undef' unless defined $high; croak "Parameters [ $low $high ] must be positive integers"; } - croak "Parameters [ $low $high ] not in range 0-$_maxparam" unless $low <= $_maxparam && $high <= $_maxparam; + if (!$_pure_perl || !defined $bigint::VERSION) { + croak "Parameters [ $low $high ] not in range 0-$_maxparam" unless $low <= $_maxparam && $high <= $_maxparam; + } $low = 2 if $low < 2; # Make sure we have a valid range. @@ -200,6 +204,7 @@ sub random_prime { # Generate random numbers in the interval until one is prime. my $loop_limit = 2000 * 1000; # To protect against broken rand do { + # TODO: bigint with huge range my $rand = ($range <= 4294967295) ? $irandf->($range) : ( ($irandf->(4294967295) << 32) + $irandf->(4294967295) ) % $range; $prime = $low + $rand; @@ -216,6 +221,7 @@ my @_random_ndigit_ranges; sub random_ndigit_prime { my $digits = shift; + # TODO: bigint with many digits if ((!defined $digits) || ($digits > $_maxdigits) || ($digits < 1)) { croak "Digits must be between 1 and $_maxdigits"; } diff --git a/lib/Math/Prime/Util/PP.pm b/lib/Math/Prime/Util/PP.pm index e95934c..84613d6 100644 --- a/lib/Math/Prime/Util/PP.pm +++ b/lib/Math/Prime/Util/PP.pm @@ -76,6 +76,7 @@ my @_prevwheel30 = (29,29,1,1,1,1,1,1,7,7,7,7,11,11,13,13,13,13,17,17,19,19,19,1 sub _is_prime7 { # n must not be divisible by 2, 3, or 5 my($n) = @_; + # TODO: bignum on 32-bit return is_prob_prime($n) if (~0 == 18446744073709551615) && ($n > 10_000_000); foreach my $i (qw/7 11 13 17 19 23 29/) { @@ -275,7 +276,8 @@ sub primes { sub next_prime { my($n) = @_; croak "Input must be a positive integer" unless _is_positive_int($n); - return 0 if $n >= ((_maxbits == 32) ? 4294967291 : 18446744073709551557); + return 0 if ($n >= ((_maxbits == 32) ? 4294967291 : 18446744073709551557)) + && (!defined $bigint::VERSION); return $_prime_next_small[$n] if $n <= $#_prime_next_small; my $d = int($n/30); @@ -443,7 +445,7 @@ sub nth_prime_lower { # Dusart 1999 page 14, for all n >= 2 my $lower = $n * ($flogn + $flog2n - 1.0 + (($flog2n-2.25)/$flogn)); - if ($lower >= ~0) { + if ( ($lower >= ~0) && (!defined $bignum::VERSION) ) { if (_maxbits == 32) { return 4294967291 if $n <= 203280221; } else { @@ -474,7 +476,7 @@ sub nth_prime_upper { $upper = $n * ( $flogn + $flog2n ); } - if ($upper >= ~0) { + if ( ($upper >= ~0) && (!defined $bignum::VERSION) ) { if (_maxbits == 32) { return 4294967291 if $n <= 203280221; } else { @@ -512,7 +514,7 @@ sub nth_prime_approx { elsif ($n < 200000000) { $approx += 0.0 * $order; } else { $approx += -0.010 * $order; } - if ($approx >= ~0) { + if ( ($approx >= ~0) && (!defined $bignum::VERSION) ) { if (_maxbits == 32) { return 4294967291 if $n <= 203280221; } else { @@ -530,10 +532,12 @@ sub nth_prime { return $_primes_small[$n] if $n <= $#_primes_small; - if (_maxbits == 32) { - croak "nth_prime($n) overflow" if $n > 203280221; - } else { - croak "nth_prime($n) overflow" if $n > 425656284035217743; + if (!defined $bigint::VERSION) { + if (_maxbits == 32) { + croak "nth_prime($n) overflow" if $n > 203280221; + } else { + croak "nth_prime($n) overflow" if $n > 425656284035217743; + } } my $prime = 0; @@ -1155,9 +1159,16 @@ methods, is_prime, prime_count, nth_prime, approximations and bounds for the prime_count and nth prime, next_prime and prev_prime, factoring utilities, and more. -All routines currently work in native integers (32-bit or 64-bit). Bignum -support may be added later. If you need bignum support for these types of -functions inside Perl now, I recommend L<Math::Pari>. +All routines should work with native integers or multi-precision numbers. To +enable big numbers, use bignum: + + use bignum; + say prime_count_approx(1000000000000000000000000)' + # says 18435599767347543283712 + +This is still experimental, and some functions will be very slow. I recommend +looking into L<Math::Pari> if you need serious bignum support for this type +of functionality right now. =head1 FUNCTIONS -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libmath-prime-util-perl.git _______________________________________________ Pkg-perl-cvs-commits mailing list Pkg-perl-cvs-commits@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits