home *** CD-ROM | disk | FTP | other *** search
/ CD Actual Thematic 7: Programming / CDAT7.iso / Share / Editores / Perl5 / perl / lib / site / Bit / primes.pl next >
Encoding:
Perl Script  |  1997-08-10  |  1.8 KB  |  95 lines

  1. #!perl -w
  2.  
  3. use strict;
  4. use vars qw($limit $set $start $stop $min $max $norm $i $j);
  5.  
  6. use Bit::Vector;
  7.  
  8. print "\n***** Calculating Prime Numbers - The Sieve Of Erathostenes *****\n";
  9.  
  10. $limit = 0;
  11.  
  12. if (-t STDIN)
  13. {
  14.     while ($limit < 16)
  15.     {
  16.         print "\nPlease enter an upper limit (>15): ";
  17.         $limit = <STDIN>;
  18.         if ($limit =~ /^\s*(\d+)\s*$/) { $limit = $1; } else { $limit = 0; }
  19.     }
  20.     print "\n";
  21. }
  22. else
  23. {
  24.     $limit = 100;
  25.     print "\nRunning in batch mode - using $limit as upper limit.\n\n";
  26. }
  27.  
  28. $set = Bit::Vector->new($limit+1);
  29.  
  30. $set->Fill();
  31.  
  32. $set->Delete(0);
  33. $set->Delete(1);
  34.  
  35. print "Calculating the prime numbers in the range [2..$limit]...\n\n";
  36.  
  37. $start = time;
  38.  
  39. for ( $j = 4; $j <= $limit; $j += 2 ) { $set->Delete($j); }
  40.  
  41. for ( $i = 3; ($j = $i * $i) <= $limit; $i += 2 )
  42. {
  43.     for ( ; $j <= $limit; $j += $i ) { $set->Delete($j); }
  44. }
  45.  
  46. $stop = time;
  47.  
  48. &print_elapsed_time;
  49.  
  50. $min = $set->Min();
  51. $max = $set->Max();
  52. $norm = $set->Norm();
  53.  
  54. print "Found $norm prime numbers in the range [2..$limit]:\n\n";
  55.  
  56. for ( $i = $min, $j = 0; $i <= $max; $i++ )
  57. {
  58.     if ($set->contains($i)) { print "prime number #", ++$j, " = $i\n"; }
  59. }
  60.  
  61. print "\n";
  62.  
  63. exit;
  64.  
  65. sub print_elapsed_time
  66. {
  67.     my($flag) = 0;
  68.     my($sec,$min,$hour,$year,$yday) = (gmtime($stop - $start))[0,1,2,5,7];
  69.     $year -= 70;
  70.     print "Elapsed time: ";
  71.     if ($year > 0)
  72.     {
  73.         printf("%d year%s ", $year, ($year!=1)?"s":"");
  74.         $flag = 1;
  75.     }
  76.     if (($yday > 0) || $flag)
  77.     {
  78.         printf("%d day%s ", $yday, ($yday!=1)?"s":"");
  79.         $flag = 1;
  80.     }
  81.     if (($hour > 0) || $flag)
  82.     {
  83.         printf("%d hour%s ", $hour, ($hour!=1)?"s":"");
  84.         $flag = 1;
  85.     }
  86.     if (($min > 0) || $flag)
  87.     {
  88.         printf("%d minute%s ", $min, ($min!=1)?"s":"");
  89.     }
  90.     printf("%d second%s.\n\n", $sec, ($sec!=1)?"s":"");
  91. }
  92.  
  93. __END__
  94.  
  95.