[libmath-prime-util-perl] 13/18: Add GMP-ECPP verification example
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:48:04 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.26
in repository libmath-prime-util-perl.
commit 3e6ff85c99601c1b4b27005830c7c8f9b1f4a723
Author: Dana Jacobsen <dana at acm.org>
Date: Thu Apr 18 21:43:09 2013 -0700
Add GMP-ECPP verification example
---
MANIFEST | 1 +
TODO | 15 +++-------
examples/verify-gmp-eccp-cert.pl | 61 ++++++++++++++++++++++++++++++++++++++++
lib/Math/Prime/Util.pm | 11 ++++----
lib/Math/Prime/Util/PP.pm | 1 -
5 files changed, 72 insertions(+), 17 deletions(-)
diff --git a/MANIFEST b/MANIFEST
index 10a9f2b..f0044b0 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -58,6 +58,7 @@ examples/test-bpsw.pl
examples/test-factor-gnufactor.pl
examples/test-primes-script.pl
examples/test-primes-script2.pl
+examples/verify-gmp-eccp-cert.pl
bin/primes.pl
bin/factor.pl
t/01-load.t
diff --git a/TODO b/TODO
index d3db691..39a2833 100644
--- a/TODO
+++ b/TODO
@@ -33,14 +33,7 @@
- Implement S2 calculation for LMO prime count.
-- Add primality proof output to is_provable_prime.
-
-- Fixup EllipticCurve so we define points and a curve.
-
-- Change is_provable_prime from Lucas to BLS75.
-
-- Use EllipticCurve to make ecm_factor.
-
-- add recursive AGKM format.
-
-- Can we easily provide a certificate for Maurer primes?
+- Add Sage output style verification. Looks like NZMATH has ECPP but doesn't
+ produce a certificate. Adding a Primo parser (see WraithX's code) would
+ be awesome, but may be a lot more work. It would still be nice to have yet
+ another independent codebase for this.
diff --git a/examples/verify-gmp-eccp-cert.pl b/examples/verify-gmp-eccp-cert.pl
new file mode 100644
index 0000000..de3e616
--- /dev/null
+++ b/examples/verify-gmp-eccp-cert.pl
@@ -0,0 +1,61 @@
+#!/usr/bin/env perl
+use warnings;
+use strict;
+use Math::BigInt try=>"GMP,Pari";
+use Math::Prime::Util qw/:all/;
+use Data::Dump qw/dump/;
+
+# Takes the output of GMP-ECPP, creates a certificate in the format used
+# by MPU, and runs it through the verifier.
+#
+# Example:
+#
+# perl -MMath::Prime::Util -E 'say random_ndigit_prime(60)' | \
+# gmp-ecpp -q | \
+# perl examples/verify-gmp-eccp-cert.pl
+
+
+my $early_check = 0;
+
+my $N;
+my ($n, $a, $b, $m, $q, $Px, $Py);
+my @cert;
+
+while (<>) {
+ if (/^N\[(\d+)\]\s*=\s*(\d+)/) {
+ $n = $2;
+ if ($1 == 0) {
+ die "Bad input" if defined $N;
+ $N = $n;
+ @cert = ($n, "AGKM");
+ }
+ }
+ elsif (/^a\s*=\s*(\d+)/) { $a = $1; }
+ elsif (/^b\s*=\s*(\d+)/) { $b = $1; }
+ elsif (/^m\s*=\s*(\d+)/) { $m = $1; }
+ elsif (/^q\s*=\s*(\d+)/) { $q = $1; }
+ elsif (/^P\s*=\s*\(\s*(\d+)\s*,\s*(\d+)\s*\)/) {
+ $Px = $1;
+ $Py = $2;
+ die "Bad input\n"
+ unless defined $N && defined $a && defined $b && defined $m
+ && defined $q && defined $Px && defined $Py;
+
+ # If for a given q value, is_prime returns 2, that indicates it can
+ # produce an n-1 primality proof very quickly, so we could stop now.
+ if ($early_check) {
+ my $bq = Math::BigInt->new("$q");
+ if (is_prime($bq) == 2) {
+ push @cert, [$n, $a, $b, $m, [prime_certificate($bq)], [$Px,$Py]];
+ last;
+ }
+ }
+ push @cert, [$n, $a, $b, $m, $q, [$Px,$Py]];
+ }
+ else {
+ last if /^proven prime/;
+ }
+}
+
+print dump(\@cert), "\n";
+print verify_prime(@cert) ? "SUCCESS\n" : "FAILURE\n";
diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index e7e4d47..58e7724 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -1902,8 +1902,8 @@ sub verify_prime {
warn "verify_prime: incorrect AGKM format\n";
return 0;
}
- my ($ni, $a, $b, $m, $q, $P);
- $q = $n;
+ my ($ni, $a, $b, $m, $P);
+ my ($qval, $q) = ($n, $n);
foreach my $block (@pdata) {
if (ref($block) ne 'ARRAY' || scalar @$block != 6) {
warn "verify_prime: incorrect AGKM block format\n";
@@ -1913,7 +1913,8 @@ sub verify_prime {
warn "verify_prime: incorrect AGKM block format: block n != q\n";
return 0;
}
- ($ni, $a, $b, $m, $q, $P) = @$block;
+ ($ni, $a, $b, $m, $qval, $P) = @$block;
+ $q = ref($qval) eq 'ARRAY' ? $qval->[0] : $qval;
if (ref($P) ne 'ARRAY' || scalar @$P != 2) {
warn "verify_prime: incorrect AGKM block point format\n";
return 0;
@@ -1953,8 +1954,8 @@ sub verify_prime {
return 0;
}
}
- # Check primality of last q using BPSW
- return 0 unless verify_prime($q);
+ # Check primality of last q
+ return 0 unless verify_prime($qval);
print "primality success: $n by A-K-G-M elliptic curve\n" if $verbose > 1;
return 1;
diff --git a/lib/Math/Prime/Util/PP.pm b/lib/Math/Prime/Util/PP.pm
index d8a7bcd..f8f75a8 100644
--- a/lib/Math/Prime/Util/PP.pm
+++ b/lib/Math/Prime/Util/PP.pm
@@ -1856,7 +1856,6 @@ sub primality_proof_lucas {
return @composite;
}
-use Data::Dump qw/dump/;
sub primality_proof_bls75 {
my ($n) = shift;
my @composite = (0, []);
--
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