[Tutor] making lists of prime numbers

Andre Engels andreengels at gmail.com
Thu Sep 15 04:35:24 CEST 2011


On Thu, Sep 15, 2011 at 4:01 AM, c smith <illusiontechniques at gmail.com>wrote:

> hi list, i am trying the MIT opencourseware assignments.
> one was to find the 1000th prime.
> since this isn't actually my homework, I modified the solution as I would
> like to collect lists of primes and non-primes up to N, also some log()
> ratio to one comparison.
> here is what I came up with on paper:
> #!/usr/bin/env python
> import sys, os, math
>
> def main(a):
>     notprime = []
>     primelist = [2,3]
>     nprime = sys.argv[1]
>     numcheck = 4
>     while len(primelist) < nprime:
>         for i in range(2,numcheck-1):
>             if numcheck % i == 0:
>                 print numcheck,'is not prime'
>                 notprime.append(numcheck)
>                 numcheck += 1
>                 break
>             if i == numcheck and numcheck % i !=0:
>                 print numcheck, 'is prime'
>                 primelist.append(numcheck)
>                 numcheck += 1
>                 break
>     TwotoN = 0
>     for j in primelist:
>         TwotoN += log(j)
>     print 'sum of logs of primes from 2 to', nprime,'is',TwotoN
>     print 'the ratio of this sum to 1 is' %f % (float(TwotoN)/nprime)
> if __name__=='__main__':
>     main(sys.argv[1])
>
> my questions would be:
> am I passing arguments from the command line correctly?
> this seems to count by twos (going through both 'if statements' maybe?)
> I thought the 'break' would send control back to the 'while'
> basically, is there an obvious problem here or is it just completely wrong?
>

I'd say the obvious problem is your second if statement. Its guard will
never be true. i goes through range(2,numcheck-1). The highest number in
that range in numcheck-2, so i==numcheck will never be true. Even if you'd
get i to equal numcheck somehow, numcheck % i would then ber equal to
numcheck % numcheck, which equals 0, so numcheck % i != 0 would not be true.

The obvious thing to do seems to be to get this code out of the for loop,
without and if statement guarding it.

Another thing that goes wrong is:

nprime = sys.argv[1]

You use nprime as an integer, but sys.argv[1] is a string. You should thus
change this into

nprime = int(sys.argv[1])

However, for the sake of reusability, it's better to have a function that
gets the first n primes for n decided by the caller than to have a function
that gets the first n primes for n always being the first argument, thus I
would change it to:

nprime = int(a)

-- 
André Engels, andreengels at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20110915/c88f3e4e/attachment.html>


More information about the Tutor mailing list