Just for the sake of it, and I apologise profusely for the top posting..

Here is a summary of the posted prime calculators for testing your
results against.

>(1) Ohad
#-------------------------------------------------------
perl -e 'print"@{[grep{(1x$_)!~/^(11+?)\1+$/}2..shift||1e2]}\n"'
<number>
#-------------------------------------------------------
>(2) Joseph
#-------------------------------------------------------
my @primes = (2);
my $candidate = 3;
while(1) {
   my $limit = $candidate ** 0.5;
   my $has_factor = 0;
   foreach (@primes) {
      if ($_ > $limit) {
         push @primes, $candidate;
         last;
      }
      unless ($candidate % $_) {
         $has_factor = 1;
         last;
      }
   }
   unless ($has_factor) {
      print "$_ " foreach @primes;
      print "\n";
   }
   $candidate++;
}
#-------------------------------------------------------
>(3) me (Hey, it's a Mee Too!)
#-------------------------------------------------------
$max=shift||17393;
%notprime=();
@prime=();

for $n (2..$max){
        unless($notprime{$n}){
                push @prime,$n;
                $notprime{$_*$n}=1 for 2..$max/$n;
        }
}

print "Found $#prime prime numbers..".$/;
print "@prime\n";
#-------------------------------------------------------

Brief explanation..
(1) Ohad posted an obfuscated calculator which runs the array
(2..<number>) through
    grep().  The pattern in grep is '(1 x $_) !~ /^(11+?)\1+$/' which is
a tricky
    way of getting perls enormously powerful regex exgine to determine
if there is
    a way of dividing a string of length int($_) characters into a
number of same length
    substrings.   Probably memory hungry, but definitely cpu hungry for
the regexp.
    Note that for any value '$x', "(1 x $x) !~ /^(11=?)\1+$/" will
return true if the
    number is prime.   Excellent way to perform a (quick?) once off test
against a
    known number without calculating every other prime.  It uses the
obscure perl
    @{[ expr ]} to magically interpolate code within quotes.

(2) Joseph posted a calculator which uses the feature of prime numbers
that the 
    largest number you need to divide it by is the square root of itself
($_**0.5)
    and that you only need to test if the number you are examining is
divisible
    (ie mod==0) by another prime you have already found.  Hence, very
quick and
    very cpu/memory cheap.  Why not test against every number?  If you
test against
    a non-prime number, you are simply testing against a multiple of a
prime of
    course.

(3) A very simple implementation of an erogenous sieve (iud? did I say
that wrong?)
    which keeps all primes in '@primes' and all 'eliminated' entries in
'%notprime'.
    quick, but likely more memory intensive than (2).

Cheers.
David


--              
Senior Technical Specialist             
I d e n t i t y   S o l u t i o n s     
        
Level 1, 369 Camberwell Road, Melbourne, Vic 3124       
Ph 03 9813 1388 Fax 03 9813 1688 Mobile 0417 595 550
Email [EMAIL PROTECTED] 
 

> -----Original Message-----
> From: Stuart White [mailto:[EMAIL PROTECTED] 
> Sent: Tuesday, 2 March 2004 11:14 AM
> To: James Edward Gray II
> Cc: [EMAIL PROTECTED]
> Subject: Re: listing prime numbers in a range (Beginning Perl 
> exercise)
> 
> 
> > That's not really accurate.  What was said to that:
> > 
> > @list = "@list";
> > 
> > Creates a joined string of elements and replaces the
> > list with that one 
> > item.  It's perfectly reasonable to stringify an
> > array, without 
> > altering the array's contents:
> > 
> > print "@list\n";
> > 
> 
> I'm not sure I understand.
> 
> > 
> > That can just be if ($_ % 2), if you prefer.  Zero
> 
> That makes perfect sense.  Thanks.
> 
> > >  {
> > >   unshift(@primelist, $_);
> > >   @primelist\n";  
> > 
> > The above line is not a valid Perl statement.
> > 
> 
> Oh, the "@primelist\n";  ?  I'm not sure how that got
> there...
> 
> > > Now what I'd like to do to test whether or not I
> > have
> > > a prime number is to get at each element in
> > > @primelist, and use the modulus operator on each
> > > element against each element in @list.  For
> > example:
> > > $primelist[0] % $list[0]
> > > $primelist[0] % $list[1]
> > > $primelist[0] % $list[2]
> > > $primelist[1] % $list[0]
> > > $primelist[1] % $list[1]
> > > $primelist[1] % $list[2]
> > > $primelist[2] % $list[0]
> > > $primelist[2] % $list[1]
> > > $primelist[2] % $list[2]  
> > >
> > > and if the result doesn't equal 0 for every test
> > > except for against itself, then I want to unshift
> > it
> > > onto @primelist.
> > >
> > > I thought I'd do this with nested foreach loops,
> > but
> > > that didn't seem to work.  Any ideas?
> > 
> > Define "didn't seem to work"?  On second thought,
> > just post that nested 
> > foreach and let us help you fix it.
> > 
> > James
> > 
> 
> Ok, I went with for loops.  As above, I want to get
> the modulus of numbers in one array by comparing the
> numbers of another array.  It's not doing what I
> expect it to.  I'm not sure if the first loop is
> really running either.  What am I doing wrong?  (Does
> that question make sense?)
> 
> Also, I'm getting an error: Use of uninitialized value
> in modulus (%) at primeNumbers.pl line 40, <STDIN>
> line 1.
> Illegal modulus zero at primeNumbers.pl line 40,
> <STDIN> line 1.
> What do those errors mean exactly?  Thanks.
> 
> 
> __________________________________
> Do you Yahoo!?
> Get better spam protection with Yahoo! Mail.
> http://antispam.yahoo.com/tools
> 
> -- 
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> <http://learn.perl.org/> <http://learn.perl.org/first-response>
> 
> 
> 

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to