bnghtz

prime_1000thprime_diff_eq_9000_optimalized.pl

Oct 9th, 2014
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.93 KB | None | 0 0
  1. #! /usr/bin/perl
  2. ## sill running for hours :)
  3. ## must use c...
  4.  
  5. # Is there a prime wich after the 1000th prime is exactley bigger by
  6. # 8000 / 9000 / 10000 ...?
  7. # 1000th_prime - prime == 8000 / 9000 / 10000 ...;
  8.  
  9. use strict;
  10. use warnings;
  11.  
  12. # store already chcked primes, to make algoritm faster
  13. my %primes = ();
  14. sub prime($) {
  15.   my $number = shift;
  16.   return 1 if ($number == 2);
  17.   return 1 if $primes{$number};
  18.  
  19.   my $d = 2;
  20.   my $sqrt = sqrt($number);
  21.  
  22.   while (1) {
  23.     return 0 if ($number % $d == 0);
  24.  
  25.     if ($d < $sqrt) {
  26.       $d++;
  27.     } else {
  28.       return 1;
  29.     }
  30.   }
  31. }
  32.  
  33. my @res;
  34. my @diff = ();
  35. my $min = 8000;
  36. my $max = 17000;
  37.  
  38. for (my $i = $min; $i < $max; $i += 1000) {
  39.     push(@diff, $i);
  40. }
  41.  
  42.  
  43. # find a prime, call it 1st
  44. my $first = 1;
  45.  
  46. OUTER: while (1) {
  47.     $first += 2;
  48.     next unless prime($first);
  49.     $primes{$first} = '';
  50.  
  51.     # find the 1000th prime ($next) to the 1st prime
  52.     my $last = $first;
  53.     my $next = 0;
  54.  
  55.     while (1) {
  56.         $last += 2;
  57.         next unless prime($last);
  58.         $primes{$last} = '';
  59.         $next++;
  60.  
  61.         # check the 1000th prime
  62.         if ($next == 1000) {
  63.             # printf("%-40s", "1000th prim after $first = $last");
  64.             my $diff = $last - $first;
  65.  
  66.             # if it fit, search is over :)
  67.             if (grep {$diff == $_} @diff) {
  68.                 print "I FOUND IT! " x 3 . "\n";
  69.                 push(@res, "$diff == $first-$last ($next.)\n");
  70.                 last;
  71.             }
  72.            
  73.             # if it's too big, search is over
  74.             elsif ($diff > $diff[-1]) {
  75.                 print "diff is too big    $diff\n";
  76.                 last OUTER;
  77.             }
  78.            
  79.             # if it's too small, get a bigger 1st prime!
  80.             else {
  81.                 # print "diff is too small  $diff\n";
  82.                 last;
  83.             }
  84.         }
  85.     }
  86. }
  87.  
  88. print "\n" x 2 . join('',@res);
Advertisement
Add Comment
Please, Sign In to add comment