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

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

commit 777992aa8563a35848dd9288719065e9fa11506d
Author: Dana Jacobsen <d...@acm.org>
Date:   Thu Jan 30 22:51:14 2014 -0800

    Update some PE examples
---
 MANIFEST                      |  1 +
 examples/project_euler_211.pl | 17 +++++++++++++++++
 examples/project_euler_357.pl | 18 +++++++++++++++---
 3 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/MANIFEST b/MANIFEST
index a745742..20849e5 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -75,6 +75,7 @@ examples/project_euler_049.pl
 examples/project_euler_069.pl
 examples/project_euler_070.pl
 examples/project_euler_095.pl
+examples/project_euler_211.pl
 examples/project_euler_357.pl
 bin/primes.pl
 bin/factor.pl
diff --git a/examples/project_euler_211.pl b/examples/project_euler_211.pl
new file mode 100644
index 0000000..e6791fa
--- /dev/null
+++ b/examples/project_euler_211.pl
@@ -0,0 +1,17 @@
+#!/usr/bin/env perl
+use warnings;
+use strict;
+use Math::Prime::Util qw/:all/;
+
+# Brute force using MPU's divisor_sum.
+# MPU v0.38   1.5 minutes
+# Pari        3.5 minutes:
+#   s=0; for(n=1,64000000-1,if(issquare(sigma(n,2)),s=s+n;))
+
+my $n = shift || 64_000_000;
+
+my $sum = 0;
+foreach my $i (0 .. $n-1) {
+  $sum += $i if is_power( divisor_sum($i, 2) , 2);
+}
+print "$sum\n";
diff --git a/examples/project_euler_357.pl b/examples/project_euler_357.pl
index 5b69fe0..b805d15 100644
--- a/examples/project_euler_357.pl
+++ b/examples/project_euler_357.pl
@@ -2,13 +2,25 @@
 use warnings;
 use strict;
 use Math::Prime::Util qw/:all/;
+use List::MoreUtils qw/all/;
 
-# Takes ~ 10 seconds
+my $maxn = shift || 100_000_000;
+
+# Takes ~ 5 seconds
 my $sum = 0;
 forprimes {
   my $n = $_-1;                  # 1+$n/1 is prime  (hence n=1 or even)
   if (is_prime(2+($n>>1))) {     # 2+$n/2 is prime  (noting n is even or 1)
-    $sum += $n unless scalar grep { !is_prime($_+$n/$_) } divisors($n);
+    if (moebius($n) != 0) {      # n should be square free
+      $sum += $n if all { is_prime($_+$n/$_) } divisors($n);
+    }
   }
-} 100_000_000;
+} $maxn;
 print "$sum\n";
+
+# We could additionally check these:
+#   if ( (($n+2) % 4) == 0 || $n == 1) {
+# Using all is more efficient, but this works:
+#   $sum += $n unless scalar grep { !is_prime($_+$n/$_) } divisors($n);
+# We could alternately generate primes to $maxn/2,
+#    my $n = 2*$_-4; if (is_prime($n+1)) { ... }

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-perl/packages/libmath-prime-util-perl.git

_______________________________________________
Pkg-perl-cvs-commits mailing list
Pkg-perl-cvs-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits

Reply via email to