First Program Bug (Newbie)

Mensanator mensanator at aol.com
Mon Mar 17 21:20:14 EDT 2008


On Mar 17, 7:03 pm, Benjamin Serrato <benjamin.serr... at gmail.com>
wrote:
> I Found It!! The following was a post asking for help finding a bug. I
> thought I needed help with my syntax, but just before sending I found
> the bug on line 13. Line 13 should read: "base = 2". I would still
> appreciate any comments on my program. Maybe there is a better way to do
> it that I didn't think about. I know it's not that interesting but it's
> my first one.
>
> [post]
> I'm almost halfway through an online tutorial I found on the python.org
> site and decided to stop and write a program for myself. I got it in my
> head to write a program to print all the primes; the idea came from
> another tutorial. The program prints some non-prime numbers. In a
> comparison to lists of primes the program prints eight non-primes for
> numbers less than 150. Those numbers are [27,35,87,95,119,123,143,147].
> Here is the program.
>
> base = 2
> candidate = 3
>
> while True:
>         while candidate % base != 0:
>                 base = base + 1
>                 if base > (candidate / 2):
>                         print candidate
>                         candidate = candidate + 1
>                         base = 2
>         else:
>                 candidate = candidate + 1
>
> The following is a rundown of the program.
>
> candidate: A possible prime number.
> base: Start point for divisibility testing.
> outer while loop: Causes the program to loop.
> inner while loop: Obviously, checks if 'candidate' mod 'base' equals
> zero. If not base is incremented by one then 'if loop'.
> if loop: After base has been incremented this checks whether all the
> possible divisors have been used up. If they have then 'candidate' must
> be prime. So, candidate is printed, a new candidate is chosen and the
> base is reset.
> else loop: If 'candidate' mod 'base' equals zero, then 'candidate' is
> not prime and a new candidate is chosen.
>
> I realize yall probably didn't need all that.
>
> At first I tried to use 'return' on the 'else' block to cause the
> program to loop, but I don't understand 'return' yet and that didn't
> work. So, I put the rest into another while loop and was really happy to
> find it worked but the program prints some non-prime numbers.
>
> Thanks, Benjamin Serrato
>
> P.S. What is the chance I'll get spam for using my real email address? I
> currently don't get any so...
> [/post]

Several items.

First, you don't need to check base larger than sqrt(candidate).

Second, see comments following dc.

Third, you need to add base = 2 to end of program, otherwise next
candidate starts base where previous candidate left off.

Fourth, use +=1 to increment.

Finally, throw this away and use gmpy. :-)


import gmpy  # for Quality Assurance
base = 2
candidate = 3
p = 0                            # prime count
while p<100:                     # limit the loop to 100 primes
  while candidate % base != 0:
    base += 1
    #if base > (candidate / 2):
    if base > (gmpy.sqrt(candidate)):  # only need to test to
sqrt(candidate)
      dc = divmod(candidate,2)         # remainder==0 gives false
primes
      if dc[1]==1:
        #
        # the gmpy functions are for QA, verifies that what you call a
prime
        # really is one and the next_prime makes sure you don't skip
any
        # these can be removed once working
        #
        print
candidate,gmpy.is_prime(candidate)>0,gmpy.next_prime(candidate)
        p += 1
        candidate += 1
        base = 2
      else:
        candidate += 1                 # false prime, reset
        base = 2
  else:
    candidate += 1
    base = 2                           # failure to reset causes false
primes

##  3 True 5
##  5 True 7
##  7 True 11
##  11 True 13
##  13 True 17
##  17 True 19
##  19 True 23
##  23 True 29
##  29 True 31
##  31 True 37
##  37 True 41
##  41 True 43
##  43 True 47
##  47 True 53
##  53 True 59
##  59 True 61
##  61 True 67
##  67 True 71
##  71 True 73
##  73 True 79
##  79 True 83
##  83 True 89
##  89 True 97
##  97 True 101
##  101 True 103
##  103 True 107
##  107 True 109
##  109 True 113
##  113 True 127
##  127 True 131
##  131 True 137
##  137 True 139
##  139 True 149
##  149 True 151
##  151 True 157
##  157 True 163
##  163 True 167
##  167 True 173
##  173 True 179
##  179 True 181
##  181 True 191
##  191 True 193
##  193 True 197
##  197 True 199
##  199 True 211
##  211 True 223
##  223 True 227
##  227 True 229
##  229 True 233
##  233 True 239
##  239 True 241
##  241 True 251
##  251 True 257
##  257 True 263
##  263 True 269
##  269 True 271
##  271 True 277
##  277 True 281
##  281 True 283
##  283 True 293
##  293 True 307
##  307 True 311
##  311 True 313
##  313 True 317
##  317 True 331
##  331 True 337
##  337 True 347
##  347 True 349
##  349 True 353
##  353 True 359
##  359 True 367
##  367 True 373
##  373 True 379
##  379 True 383
##  383 True 389
##  389 True 397
##  397 True 401
##  401 True 409
##  409 True 419
##  419 True 421
##  421 True 431
##  431 True 433
##  433 True 439
##  439 True 443
##  443 True 449
##  449 True 457
##  457 True 461
##  461 True 463
##  463 True 467
##  467 True 479
##  479 True 487
##  487 True 491
##  491 True 499
##  499 True 503
##  503 True 509
##  509 True 521
##  521 True 523
##  523 True 541
##  541 True 547
##  547 True 557



More information about the Python-list mailing list