[libmath-prime-util-perl] 10/23: Streamline random prime test, add more testing for nbit and maurer random primes

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


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

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

commit 1f192303da2862b71b7a0aa94cde5d1ba0c55846
Author: Dana Jacobsen <dana at acm.org>
Date:   Fri Nov 23 12:57:04 2012 -0800

    Streamline random prime test, add more testing for nbit and maurer random primes
---
 t/16-randomprime.t | 130 ++++++++++++++++++++++++++++++++++-------------------
 t/81-bignum.t      |   4 ++
 2 files changed, 87 insertions(+), 47 deletions(-)

diff --git a/t/16-randomprime.t b/t/16-randomprime.t
index eff57e0..da06444 100644
--- a/t/16-randomprime.t
+++ b/t/16-randomprime.t
@@ -6,14 +6,67 @@ use Test::More;
 #use Math::Random::MT qw/rand/;
 #use Math::Random::MT::Auto qw/rand/;
 #sub rand { return 0.5; }
-use Math::Prime::Util qw/random_prime random_ndigit_prime is_prime/;
+use Math::Prime::Util qw/random_prime random_ndigit_prime random_nbit_prime
+                         random_maurer_prime is_prime/;
 
 my $use64 = Math::Prime::Util::prime_get_config->{'maxbits'} > 32;
 my $extra = defined $ENV{RELEASE_TESTING} && $ENV{RELEASE_TESTING};
+my $maxbits = $use64 ? 64 : 32;
 
-plan tests => 13+4 + 6*1 + 11*3 + 10*2 + 12*2 + 2*$use64 + 10*2;
+my @random_to = (2, 3, 4, 5, 6, 7, 8, 9, 100, 1000, 1000000, 4294967295);
+
+my @random_nbit_tests = ( 2 .. 6, 10, 15 .. 17, 28, 32 );
+push @random_nbit_tests, (34) if $use64;
+ at random_nbit_tests = (2 .. $maxbits) if $extra;
+
+my @random_ndigit_tests = (1 .. ($use64 ? 20 : 10));
+
+my %ranges = (
+  "2 to 20" => [2,19],
+  "3 to 7" => [3,7],
+  "20 to 100" => [23,97],
+  "5678 to 9876" => [5683,9871],
+  "27767 to 88493" => [27767,88493],
+  "27764 to 88498" => [27767,88493],
+  "27764 to 88493" => [27767,88493],
+  "27767 to 88498" => [27767,88493],
+  "17051687 to 17051899" => [17051687,17051899],
+  "17051688 to 17051898" => [17051707,17051887],
+);
+
+my %range_edge = (
+  "0 to 2" => [2,2],
+  "2 to 2" => [2,2],
+  "2 to 3" => [2,3],
+  "3 to 5" => [3,5],
+  "10 to 20" => [11,19],
+  "8 to 12" => [11,11],
+  "10 to 12" => [11,11],
+  "16706143 to 16706143" => [16706143,16706143],
+  "16706142 to 16706144" => [16706143,16706143],
+  "3842610773 to 3842611109" => [3842610773,3842611109],
+  "3842610772 to 3842611110" => [3842610773,3842611109],
+);
+my %range_edge_empty = (
+  "0 to 0" => [],
+  "0 to 1" => [],
+  "2 to 1" => [],
+  "3 to 2" => [],
+  "1294268492 to 1294268778" => [],
+  "3842610774 to 3842611108" => [],
+);
+
+plan tests => 13+4+4+4
+              + (1 * scalar (keys %range_edge_empty))
+              + (3 * scalar (keys %range_edge))
+              + (2 * scalar (keys %ranges))
+              + (2 * scalar @random_to)
+              + (1 * scalar @random_ndigit_tests)
+              + (2 * scalar @random_nbit_tests)
+              + 0;
 
 my $infinity = ~0 * ~0;
+my $nrandom_range_samples = $extra ? 1000 : 50;
 
 ok(!eval { random_prime(undef); }, "random_prime(undef)");
 ok(!eval { random_prime(-3); }, "random_prime(-3)");
@@ -34,32 +87,21 @@ ok(!eval { random_ndigit_prime(0); }, "random_ndigit_prime(0)");
 ok(!eval { random_ndigit_prime(-5); }, "random_ndigit_prime(-5)");
 ok(!eval { random_ndigit_prime(50); }, "random_ndigit_prime(50)");
 
-my %range_edge_empty = (
-  "0 to 0" => [],
-  "0 to 1" => [],
-  "2 to 1" => [],
-  "3 to 2" => [],
-  "1294268492 to 1294268778" => [],
-  "3842610774 to 3842611108" => [],
-);
+ok(!eval { random_nbit_prime(undef); }, "random_nbit_prime(undef)");
+ok(!eval { random_nbit_prime(0); }, "random_nbit_prime(0)");
+ok(!eval { random_nbit_prime(-5); }, "random_nbit_prime(-5)");
+ok(!eval { random_nbit_prime(130); }, "random_nbit_prime(130)");
+
+ok(!eval { random_maurer_prime(undef); }, "random_maurer_prime(undef)");
+ok(!eval { random_maurer_prime(0); }, "random_maurer_prime(0)");
+ok(!eval { random_maurer_prime(-5); }, "random_maurer_prime(-5)");
+ok(!eval { random_maurer_prime(130); }, "random_maurer_prime(130)");
+
 while (my($range, $expect) = each (%range_edge_empty)) {
   my($low,$high) = $range =~ /(\d+) to (\d+)/;
   is( random_prime($low,$high), undef, "primes($low,$high) should return undef" );
 }
 
-my %range_edge = (
-  "0 to 2" => [2,2],
-  "2 to 2" => [2,2],
-  "2 to 3" => [2,3],
-  "3 to 5" => [3,5],
-  "10 to 20" => [11,19],
-  "8 to 12" => [11,11],
-  "10 to 12" => [11,11],
-  "16706143 to 16706143" => [16706143,16706143],
-  "16706142 to 16706144" => [16706143,16706143],
-  "3842610773 to 3842611109" => [3842610773,3842611109],
-  "3842610772 to 3842611110" => [3842610773,3842611109],
-);
 while (my($range, $expect) = each (%range_edge)) {
   my($low,$high) = $range =~ /(\d+) to (\d+)/;
   my $got = random_prime($low,$high);
@@ -68,23 +110,11 @@ while (my($range, $expect) = each (%range_edge)) {
   cmp_ok( $got, '<=', $expect->[1], "random_prime($low,$high) >= $expect->[1]");
 }
 
-my %ranges = (
-  "2 to 20" => [2,19],
-  "3 to 7" => [3,7],
-  "20 to 100" => [23,97],
-  "5678 to 9876" => [5683,9871],
-  "27767 to 88493" => [27767,88493],
-  "27764 to 88498" => [27767,88493],
-  "27764 to 88493" => [27767,88493],
-  "27767 to 88498" => [27767,88493],
-  "17051687 to 17051899" => [17051687,17051899],
-  "17051688 to 17051898" => [17051707,17051887],
-);
 while (my($range, $expect) = each (%ranges)) {
   my($low,$high) = $range =~ /(\d+) to (\d+)/;
   my $isprime = 1;
   my $inrange = 1;
-  for (1 .. 1000) {
+  for (1 .. $nrandom_range_samples) {
     my $got = random_prime($low,$high);
     $isprime *= is_prime($got) ? 1 : 0;
     $inrange *= (($got >= $expect->[0]) && ($got <= $expect->[1])) ? 1 : 0;
@@ -93,11 +123,10 @@ while (my($range, $expect) = each (%ranges)) {
   ok($inrange, "All returned values for $low-$high were in the range" );
 }
 
-my @to = (2, 3, 4, 5, 6, 7, 8, 9, 100, 1000, 1000000, 4294967295);
-foreach my $high (@to) {
+foreach my $high (@random_to) {
   my $isprime = 1;
   my $inrange = 1;
-  for (1 .. 1000) {
+  for (1 .. $nrandom_range_samples) {
     my $got = random_prime($high);
     $isprime *= is_prime($got) ? 1 : 0;
     $inrange *= (($got >= 2) && ($got <= $high)) ? 1 : 0;
@@ -106,14 +135,21 @@ foreach my $high (@to) {
   ok($inrange, "All returned values for $high were in the range" );
 }
 
-if ($use64) {
-  my $got = random_prime(2**34);
-  cmp_ok( $got, '<=', 2**34, "34-bit random_prime is in range");
-  ok( is_prime($got), "32-bit prime is indeed prime");
+foreach my $digits ( @random_ndigit_tests ) {
+  my $n = random_ndigit_prime($digits);
+  ok ( length($n) == $digits && is_prime($n),
+       "$digits-digit random prime is in range and prime");
+}
+
+foreach my $bits ( @random_nbit_tests ) {
+  check_bits( random_nbit_prime($bits), $bits, "nbit" );
+  check_bits( random_maurer_prime($bits), $bits, "Maurer" );
 }
 
-foreach my $digits (1 .. 10) {
-  my $got = random_ndigit_prime($digits);
-  is( length($got), $digits, "$digits-digit random prime is $digits digits");
-  ok( is_prime($got), "$digits-digit random prime is indeed prime");
+sub check_bits {
+  my($n, $bits, $what) = @_;
+  my $min = 1 << ($bits-1);
+  my $max = ~0 >> ($maxbits - $bits);
+  ok ( $n >= $min && $n <= $max && is_prime($n),
+       "$bits-bit random $what prime is in range and prime");
 }
diff --git a/t/81-bignum.t b/t/81-bignum.t
index dc3baf9..f732d8f 100644
--- a/t/81-bignum.t
+++ b/t/81-bignum.t
@@ -106,6 +106,10 @@ use Math::Prime::Util qw/
 #        LogarithmicIntegral
 #        RiemannR
 
+# Test bignum using PP
+diag "Math::Prime::Util::GMP not being used.\n"
+  unless Math::Prime::Util::prime_get_config->{gmp};
+
 
 ###############################################################################
 

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