[libmath-prime-util-perl] 45/59: GMP and bigint stuff
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:45:01 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 d569ae0412eadccaf9e35a50797d12f797a31a05
Author: Dana Jacobsen <dana at acm.org>
Date: Mon Jul 9 21:42:15 2012 -0600
GMP and bigint stuff
---
lib/Math/Prime/Util.pm | 45 +++++++++++++++++++++++++++++++++++++++------
1 file changed, 39 insertions(+), 6 deletions(-)
diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index 1c02e6f..a6c6352 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -675,12 +675,26 @@ sub euler_phi {
#}
# Alternate way doing multiplications only.
- my $totient = 1;
- foreach my $factor (@factors) {
- $totient *= ($factor - 1);
- $totient *= $factor for (2 .. $factor_mult{$factor});
+ if (ref($n) ne 'Math::BigInt') {
+ my $totient = 1; # $n - $n + 1 will make this a bigint if needed
+ foreach my $factor (@factors) {
+ $totient *= ($factor - 1);
+ $totient *= $factor for (2 .. $factor_mult{$factor});
+ }
+ return $totient;
}
+ # Some real wackiness to solve issues with Math::BigInt::GMP (not seen with
+ # Pari or Calc). Results of the multiply will go negative if we don't do
+ # this. Standalone bug:
+ # perl -E 'my $a = 2931542417; use bigint lib=>'GMP'; my $n = 49754396241690624; my $x = $n*$a; say $x;'
+ # This may be related to RT 71548 of Math::BigInt::GMP.
+ my $totient = $n->copy->bone;
+ foreach my $factor (@factors) {
+ my $f = $n->copy->bzero->badd("$factor");
+ $totient->bmul($f->copy->bsub(1));
+ $totient->bmul($f) for (2 .. $factor_mult{$factor});
+ }
$totient;
}
@@ -721,7 +735,7 @@ sub is_prime {
_validate_positive_integer($n);
return _XS_is_prime($n) if $n <= $_XS_MAXVAL;
- return Math::Prime::Util::GMP::is_prime($n, @_) if $_HAVE_GMP;
+ return Math::Prime::Util::GMP::is_prime($n) if $_HAVE_GMP;
return is_prob_prime($n);
}
@@ -730,6 +744,12 @@ sub next_prime {
_validate_positive_integer($n);
return _XS_next_prime($n) if $n <= $_XS_MAXVAL;
+ if ($_HAVE_GMP) {
+ # If $n is a bigint object, try to make the return value the same
+ return (ref($n) eq 'Math::BigInt')
+ ? $n->copy->bzero->badd(Math::Prime::Util::GMP::next_prime($n))
+ : Math::Prime::Util::GMP::next_prime($n);
+ }
return Math::Prime::Util::PP::next_prime($n);
}
@@ -738,6 +758,12 @@ sub prev_prime {
_validate_positive_integer($n);
return _XS_prev_prime($n) if $n <= $_XS_MAXVAL;
+ if ($_HAVE_GMP) {
+ # If $n is a bigint object, try to make the return value the same
+ return (ref($n) eq 'Math::BigInt')
+ ? $n->copy->bzero->badd(Math::Prime::Util::GMP::prev_prime($n))
+ : Math::Prime::Util::GMP::prev_prime($n);
+ }
return Math::Prime::Util::PP::prev_prime($n);
}
@@ -769,6 +795,13 @@ sub factor {
_validate_positive_integer($n);
return _XS_factor($n) if $n <= $_XS_MAXVAL;
+ if ($_HAVE_GMP) {
+ my @factors = Math::Prime::Util::GMP::factor($n);
+ if (ref($n) eq 'Math::BigInt') {
+ @factors = map { ($_ > ~0) ? $n->copy->bzero->badd($_) : $_ } @factors;
+ }
+ return @factors;
+ }
return Math::Prime::Util::PP::factor($n);
}
@@ -821,7 +854,7 @@ sub is_prob_prime {
_validate_positive_integer($n);
return _XS_is_prob_prime($n) if $n <= $_XS_MAXVAL;
- return Math::Prime::Util::GMP::is_prob_prime($n, @_) if $_HAVE_GMP;
+ return Math::Prime::Util::GMP::is_prob_prime($n) if $_HAVE_GMP;
return 2 if $n == 2 || $n == 3 || $n == 5 || $n == 7;
return 0 if $n < 11;
--
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