[libmath-prime-util-perl] 34/55: Validate input in PPFE for gcd, lcm, vecsum

Partha P. Mukherjee ppm-guest at moszumanska.debian.org
Thu May 21 18:53:41 UTC 2015


This is an automated email from the git hooks/post-receive script.

ppm-guest pushed a commit to annotated tag v0.41
in repository libmath-prime-util-perl.

commit d25bd70571d8d8af92df6c63085bcc5fc3aa5134
Author: Dana Jacobsen <dana at acm.org>
Date:   Mon May 12 15:26:43 2014 -0700

    Validate input in PPFE for gcd, lcm, vecsum
---
 lib/Math/Prime/Util/PP.pm   | 26 ++++++++++++++++++++++++++
 lib/Math/Prime/Util/PPFE.pm | 22 +++++++++++++---------
 2 files changed, 39 insertions(+), 9 deletions(-)

diff --git a/lib/Math/Prime/Util/PP.pm b/lib/Math/Prime/Util/PP.pm
index 4027c5e..61d038f 100644
--- a/lib/Math/Prime/Util/PP.pm
+++ b/lib/Math/Prime/Util/PP.pm
@@ -148,6 +148,32 @@ sub _validate_positive_integer {
   1;
 }
 
+sub _validate_integer {
+  my($n) = @_;
+  croak "Parameter must be defined" if !defined $n;
+  if (ref($n) eq 'CODE') {
+    $_[0] = $_[0]->();
+    $n = $_[0];
+  }
+  my $poscmp = OLD_PERL_VERSION ?  562949953421312 : ''.~0;
+  my $negcmp = OLD_PERL_VERSION ? -562949953421312 : -(~0 >> 1);
+  if (ref($n) eq 'Math::BigInt') {
+    croak "Parameter '$n' must be an integer" if !$n->is_int();
+    $_[0] = _bigint_to_int($_[0]) if $n <= $poscmp && $n >= $negcmp;
+  } else {
+    my $strn = "$n";
+    croak "Parameter '$strn' must be an integer"
+      if $strn =~ tr/-0123456789//c && $strn !~ /^[-+]?\d+$/;
+    if ($n <= $poscmp && $n >= $negcmp) {
+      $_[0] = $strn if ref($n);
+    } else {
+      $_[0] = Math::BigInt->new($strn)
+    }
+  }
+  $_[0]->upgrade(undef) if ref($_[0]) && $_[0]->upgrade();
+  1;
+}
+
 
 my @_primes_small = (0,2,3,5);
 {
diff --git a/lib/Math/Prime/Util/PPFE.pm b/lib/Math/Prime/Util/PPFE.pm
index 2951ad9..ca96288 100644
--- a/lib/Math/Prime/Util/PPFE.pm
+++ b/lib/Math/Prime/Util/PPFE.pm
@@ -10,6 +10,7 @@ use Carp qw/carp croak confess/;
 package Math::Prime::Util;
 
 *_validate_num = \&Math::Prime::Util::PP::_validate_num;
+*_validate_integer = \&Math::Prime::Util::PP::_validate_integer;
 *_prime_memfreeall = \&Math::Prime::Util::PP::_prime_memfreeall;
 *prime_memfree  = \&Math::Prime::Util::PP::prime_memfree;
 *prime_precalc  = \&Math::Prime::Util::PP::prime_precalc;
@@ -316,22 +317,25 @@ sub divisor_sum {
 }
 
 sub gcd {
-  return Math::Prime::Util::PP::gcd(@_);
+  my(@v) = @_;
+  _validate_integer($_) for @v;
+  return Math::Prime::Util::PP::gcd(@v);
 }
 sub lcm {
-  return Math::Prime::Util::PP::lcm(@_);
+  my(@v) = @_;
+  _validate_integer($_) for @v;
+  return Math::Prime::Util::PP::lcm(@v);
 }
 sub vecsum {
-  return Math::Prime::Util::PP::vecsum(@_);
+  my(@v) = @_;
+  _validate_integer($_) for @v;
+  return Math::Prime::Util::PP::vecsum(@v);
 }
 sub invmod {
   my ($a, $n) = @_;
-  my ($va, $vn) = ($a, $n);
-  $va = -$va if defined $va && $va < 0;
-  $vn = -$vn if defined $vn && $vn < 0;
-  _validate_positive_integer($va);
-  _validate_positive_integer($vn);
-  return Math::Prime::Util::PP::invmod(@_);
+  _validate_integer($a);
+  _validate_integer($n);
+  return Math::Prime::Util::PP::invmod($a,$n);
 }
 
 sub legendre_phi {

-- 
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