[libmath-prime-util-perl] 16/33: More movement to PP front end
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:51:42 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.37
in repository libmath-prime-util-perl.
commit b16de00abad773a9cf7a578993bf3d0d023da43e
Author: Dana Jacobsen <dana at acm.org>
Date: Wed Jan 22 10:49:41 2014 -0800
More movement to PP front end
---
lib/Math/Prime/Util.pm | 26 ---------
lib/Math/Prime/Util/PP.pm | 31 ++---------
lib/Math/Prime/Util/PPFE.pm | 129 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 134 insertions(+), 52 deletions(-)
diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index 74bc698..91ca2a8 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -67,13 +67,11 @@ BEGIN {
# We could alternately use Config's $Config{uvsize} for MAXBITS
use constant OLD_PERL_VERSION=> $] < 5.008;
use constant MPU_MAXBITS => (~0 == 4294967295) ? 32 : 64;
- use constant MPU_64BIT => MPU_MAXBITS == 64;
use constant MPU_32BIT => MPU_MAXBITS == 32;
use constant MPU_MAXPARAM => MPU_32BIT ? 4294967295 : 18446744073709551615;
use constant MPU_MAXDIGITS => MPU_32BIT ? 10 : 20;
use constant MPU_MAXPRIME => MPU_32BIT ? 4294967291 : 18446744073709551557;
use constant MPU_MAXPRIMEIDX => MPU_32BIT ? 203280221 : 425656284035217743;
- use constant MPU_MAXNATIVE => OLD_PERL_VERSION ? 999999999999999 : ~0;
use constant UVPACKLET => MPU_32BIT ? 'L' : 'Q';
eval {
@@ -94,41 +92,17 @@ BEGIN {
# Load PP front end code
require Math::Prime::Util::PPFE;
- *_validate_num = \&Math::Prime::Util::PP::_validate_num;
- *is_lucas_pseudoprime=\&Math::Prime::Util::PP::is_lucas_pseudoprime;
- *is_strong_lucas_pseudoprime=\&Math::Prime::Util::PP::is_strong_lucas_pseudoprime;
- *is_extra_strong_lucas_pseudoprime=\&Math::Prime::Util::PP::is_extra_strong_lucas_pseudoprime;
- *is_almost_extra_strong_lucas_pseudoprime=\&Math::Prime::Util::PP::is_almost_extra_strong_lucas_pseudoprime;
- *is_frobenius_underwood_pseudoprime=\&Math::Prime::Util::PP::is_frobenius_underwood_pseudoprime;
- *is_aks_prime =\&Math::Prime::Util::PP::is_aks_prime;
*next_prime = \&Math::Prime::Util::_generic_next_prime;
*prev_prime = \&Math::Prime::Util::_generic_prev_prime;
*exp_mangoldt = \&Math::Prime::Util::_generic_exp_mangoldt;
*prime_count = \&Math::Prime::Util::_generic_prime_count;
*divisor_sum = \&Math::Prime::Util::_generic_divisor_sum;
- *legendre_phi = \&Math::Prime::Util::PP::legendre_phi;
- *gcd = \&Math::Prime::Util::PP::gcd;
- *lcm = \&Math::Prime::Util::PP::lcm;
*factor = \&Math::Prime::Util::_generic_factor;
*factor_exp = \&Math::Prime::Util::_generic_factor_exp;
*divisors = \&Math::Prime::Util::_generic_divisors;
*forprimes = sub (&$;$) { _generic_forprimes(@_); }; ## no critic qw(ProhibitSubroutinePrototypes)
*forcomposites = sub (&$;$) { _generic_forcomposites(@_); }; ## no critic qw(ProhibitSubroutinePrototypes)
*fordivisors = sub (&$) { _generic_fordivisors(@_); }; ## no critic qw(ProhibitSubroutinePrototypes)
-
- *_prime_memfreeall = \&Math::Prime::Util::PP::_prime_memfreeall;
- *prime_memfree = \&Math::Prime::Util::PP::prime_memfree;
- *prime_precalc = \&Math::Prime::Util::PP::prime_precalc;
-
- # These probably shouldn't even be aliased, as they're not public
- *trial_factor = \&Math::Prime::Util::PP::trial_factor;
- *fermat_factor = \&Math::Prime::Util::PP::fermat_factor;
- *holf_factor = \&Math::Prime::Util::PP::holf_factor;
- *squfof_factor = \&Math::Prime::Util::PP::squfof_factor;
- *pbrent_factor = \&Math::Prime::Util::PP::pbrent_factor;
- *prho_factor = \&Math::Prime::Util::PP::prho_factor;
- *pminus1_factor = \&Math::Prime::Util::PP::pminus1_factor;
- *pplus1_factor = \&Math::Prime::Util::PP::pminus1_factor; # TODO: implement PP p+1.
};
# aliases for deprecated names. Will eventually be removed.
diff --git a/lib/Math/Prime/Util/PP.pm b/lib/Math/Prime/Util/PP.pm
index 0bc11d9..4317ad8 100644
--- a/lib/Math/Prime/Util/PP.pm
+++ b/lib/Math/Prime/Util/PP.pm
@@ -1822,8 +1822,6 @@ sub lucas_sequence {
sub is_lucas_pseudoprime {
my($n) = @_;
- return 0 if defined $n && int($n) < 0;
- _validate_positive_integer($n);
return 0+($n >= 2) if $n < 4;
return 0 if ($n % 2) == 0 || _is_perfect_square($n);
@@ -1838,8 +1836,6 @@ sub is_lucas_pseudoprime {
sub is_strong_lucas_pseudoprime {
my($n) = @_;
- return 0 if defined $n && int($n) < 0;
- _validate_positive_integer($n);
return 0+($n >= 2) if $n < 4;
return 0 if ($n % 2) == 0 || _is_perfect_square($n);
@@ -1869,8 +1865,6 @@ sub is_strong_lucas_pseudoprime {
sub is_extra_strong_lucas_pseudoprime {
my($n) = @_;
- return 0 if defined $n && int($n) < 0;
- _validate_positive_integer($n);
return 0+($n >= 2) if $n < 4;
return 0 if ($n % 2) == 0 || _is_perfect_square($n);
@@ -1901,13 +1895,7 @@ sub is_extra_strong_lucas_pseudoprime {
sub is_almost_extra_strong_lucas_pseudoprime {
my($n, $increment) = @_;
- return 0 if defined $n && int($n) < 0;
- _validate_positive_integer($n);
- if (defined $increment) {
- _validate_positive_integer($increment, 1, 256);
- } else {
- $increment = 1;
- }
+ $increment = 1 unless defined $increment;
return 0+($n >= 2) if $n < 4;
return 0 if ($n % 2) == 0 || _is_perfect_square($n);
@@ -1946,8 +1934,6 @@ sub is_almost_extra_strong_lucas_pseudoprime {
sub is_frobenius_underwood_pseudoprime {
my($n) = @_;
- return 0 if defined $n && int($n) < 0;
- _validate_positive_integer($n);
return 0+($n >= 2) if $n < 4;
return 0 if ($n % 2) == 0 || _is_perfect_square($n);
@@ -2064,11 +2050,7 @@ sub _test_anr {
sub is_aks_prime {
my $n = shift;
- return 0 if defined $n && int($n) < 0;
- _validate_positive_integer($n);
-
- return 0 if $n < 2;
- return 0 if _is_perfect_power($n);
+ return 0 if $n < 2 || _is_perfect_power($n);
my($log2n, $limit);
if ($n > 2**48) {
@@ -2133,6 +2115,9 @@ sub _basic_factor {
while ( !($_[0] % 3) ) { push @factors, 3; $_[0] = int($_[0] / 3); }
while ( !($_[0] % 5) ) { push @factors, 5; $_[0] = int($_[0] / 5); }
} else {
+ # Without this, the bdivs will try to convert the results to BigFloat
+ # and lose precision.
+ $_[0]->upgrade(undef) if ref($_[0]) && $_[0]->upgrade();
if (!Math::BigInt::bgcd($_[0], B_PRIM235)->is_one) {
while ( $_[0]->is_even) { push @factors, 2; $_[0]->brsft(BONE); }
foreach my $div (3, 5) {
@@ -2327,7 +2312,6 @@ sub squfof_factor { trial_factor(@_) }
sub prho_factor {
my($n, $rounds, $pa) = @_;
- _validate_positive_integer($n);
$rounds = 4*1024*1024 unless defined $rounds;
$pa = 3 unless defined $pa;
@@ -2397,7 +2381,6 @@ sub prho_factor {
sub pbrent_factor {
my($n, $rounds, $pa) = @_;
- _validate_positive_integer($n);
$rounds = 4*1024*1024 unless defined $rounds;
$pa = 3 unless defined $pa;
@@ -2478,7 +2461,6 @@ sub pbrent_factor {
sub pminus1_factor {
my($n, $B1, $B2) = @_;
- _validate_positive_integer($n);
my @factors = _basic_factor($n);
return @factors if $n < 4;
@@ -2627,7 +2609,6 @@ sub pminus1_factor {
sub holf_factor {
my($n, $rounds, $startrounds) = @_;
- _validate_positive_integer($n);
$rounds = 64*1024*1024 unless defined $rounds;
$startrounds = 1 unless defined $startrounds;
$startrounds = 1 if $startrounds < 1;
@@ -2674,7 +2655,6 @@ sub holf_factor {
sub fermat_factor {
my($n, $rounds) = @_;
- _validate_positive_integer($n);
$rounds = 64*1024*1024 unless defined $rounds;
my @factors = _basic_factor($n);
@@ -2724,7 +2704,6 @@ sub fermat_factor {
sub ecm_factor {
my($n, $B1, $B2, $ncurves) = @_;
- _validate_positive_integer($n);
my @factors = _basic_factor($n);
return @factors if $n < 4;
diff --git a/lib/Math/Prime/Util/PPFE.pm b/lib/Math/Prime/Util/PPFE.pm
index bf0ea9a..98ed907 100644
--- a/lib/Math/Prime/Util/PPFE.pm
+++ b/lib/Math/Prime/Util/PPFE.pm
@@ -6,6 +6,10 @@ use warnings;
use Math::Prime::Util::PP;
*_validate_num = \&Math::Prime::Util::PP::_validate_num;
+*_prime_memfreeall = \&Math::Prime::Util::PP::_prime_memfreeall;
+*prime_memfree = \&Math::Prime::Util::PP::prime_memfree;
+*prime_precalc = \&Math::Prime::Util::PP::prime_precalc;
+
sub mertens {
my($n) = @_;
@@ -87,6 +91,7 @@ sub prime_count_approx {
return Math::Prime::Util::PP::prime_count_approx($n);
}
+
sub is_prime {
my($n) = @_;
return 0 if defined $n && int($n) < 0;
@@ -113,6 +118,45 @@ sub is_strong_pseudoprime {
croak "No bases given to miller_rabin" unless @bases;
return Math::Prime::Util::PP::is_strong_pseudoprime($n, @bases);
}
+sub is_lucas_pseudoprime {
+ my($n) = @_;
+ return 0 if defined $n && int($n) < 0;
+ _validate_positive_integer($n);
+ return Math::Prime::Util::PP::is_lucas_pseudoprime($n);
+}
+sub is_strong_lucas_pseudoprime {
+ my($n) = @_;
+ return 0 if defined $n && int($n) < 0;
+ _validate_positive_integer($n);
+ return Math::Prime::Util::PP::is_strong_lucas_pseudoprime($n);
+}
+sub is_extra_strong_lucas_pseudoprime {
+ my($n) = @_;
+ return 0 if defined $n && int($n) < 0;
+ _validate_positive_integer($n);
+ return Math::Prime::Util::PP::is_extra_strong_lucas_pseudoprime($n);
+}
+sub is_almost_extra_strong_lucas_pseudoprime {
+ my($n, $increment) = @_;
+ return 0 if defined $n && int($n) < 0;
+ _validate_positive_integer($n);
+ if (defined $increment) { _validate_positive_integer($increment, 1, 256);
+ } else { $increment = 1; }
+ return Math::Prime::Util::PP::is_almost_extra_strong_lucas_pseudoprime($n, $increment);
+}
+sub is_frobenius_underwood_pseudoprime {
+ my($n) = @_;
+ return 0 if defined $n && int($n) < 0;
+ _validate_positive_integer($n);
+ return Math::Prime::Util::PP::is_frobenius_underwood_pseudoprime($n);
+}
+sub is_aks_prime {
+ my($n) = @_;
+ return 0 if defined $n && int($n) < 0;
+ _validate_positive_integer($n);
+ return Math::Prime::Util::PP::is_aks_prime($n);
+}
+
sub kronecker {
my($a, $b) = @_;
@@ -146,4 +190,89 @@ sub znprimroot {
return Math::Prime::Util::PP::znprimroot($n);
}
+sub trial_factor {
+ my($n, $maxlim) = @_;
+ _validate_positive_integer($n);
+ if (defined $maxlim) {
+ _validate_positive_integer($maxlim);
+ return Math::Prime::Util::PP::trial_factor($n, $maxlim);
+ }
+ return Math::Prime::Util::PP::trial_factor($n);
+}
+sub fermat_factor {
+ my($n, $rounds) = @_;
+ _validate_positive_integer($n);
+ if (defined $rounds) {
+ _validate_positive_integer($rounds);
+ return Math::Prime::Util::PP::fermat_factor($n, $rounds);
+ }
+ return Math::Prime::Util::PP::fermat_factor($n);
+}
+sub holf_factor {
+ my($n, $rounds) = @_;
+ _validate_positive_integer($n);
+ if (defined $rounds) {
+ _validate_positive_integer($rounds);
+ return Math::Prime::Util::PP::holf_factor($n, $rounds);
+ }
+ return Math::Prime::Util::PP::holf_factor($n);
+}
+sub squfof_factor {
+ my($n, $rounds) = @_;
+ _validate_positive_integer($n);
+ if (defined $rounds) {
+ _validate_positive_integer($rounds);
+ return Math::Prime::Util::PP::squfof_factor($n, $rounds);
+ }
+ return Math::Prime::Util::PP::squfof_factor($n);
+}
+sub pbrent_factor {
+ my($n, $rounds, $pa) = @_;
+ _validate_positive_integer($n);
+ if (defined $rounds) { _validate_positive_integer($rounds);
+ } else { $rounds = 4*1024*1024; }
+ if (defined $pa ) { _validate_positive_integer($pa);
+ } else { $pa = 3; }
+ return Math::Prime::Util::PP::pbrent_factor($n, $rounds, $pa);
+}
+sub prho_factor {
+ my($n, $rounds, $pa) = @_;
+ _validate_positive_integer($n);
+ if (defined $rounds) { _validate_positive_integer($rounds);
+ } else { $rounds = 4*1024*1024; }
+ if (defined $pa ) { _validate_positive_integer($pa);
+ } else { $pa = 3; }
+ return Math::Prime::Util::PP::prho_factor($n, $rounds, $pa);
+}
+sub pminus1_factor {
+ my($n, $B1, $B2) = @_;
+ _validate_positive_integer($n);
+ _validate_positive_integer($B1) if defined $B1;
+ _validate_positive_integer($B2) if defined $B2;
+ Math::Prime::Util::PP::pminus1_factor($n, $B1, $B2);
+}
+*pplus1_factor = \&pminus1_factor;
+sub ecm_factor {
+ my($n, $B1, $B2, $ncurves) = @_;
+ _validate_positive_integer($n);
+ _validate_positive_integer($B1) if defined $B1;
+ _validate_positive_integer($B2) if defined $B2;
+ _validate_positive_integer($ncurves) if defined $ncurves;
+ Math::Prime::Util::PP::ecm_factor($n, $B1, $B2, $ncurves);
+}
+
+sub gcd {
+ return Math::Prime::Util::PP::gcd(@_);
+}
+sub lcm {
+ return Math::Prime::Util::PP::lcm(@_);
+}
+
+sub legendre_phi {
+ my($x, $a) = @_;
+ _validate_positive_integer($x);
+ _validate_positive_integer($a);
+ return Math::Prime::Util::PP::legendre_phi($x, $a);
+}
+
1;
--
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