First Program Bug (Newbie)
oog1e
"benjamin.serrato\" at G(oog1e)MAIL.com
Tue Mar 18 19:39:16 EDT 2008
Hey, big thanks to you and Gabriel for replying. I couldn't quite follow
what you did yet. What is this 'gimpy' thing and where can I read about
it? In response:
First: Heh, I'm a little embarrassed I didn't notice this. I thought 'I
only need to check up to half' but it didn't occur that base**2 was more
than 1/2 candidate.
Second: I don't quite follow this.
Third: Yeah, I found that bug just before, and because of, posting.
Fourth: I used the incrementing command and incremented candidates by
two to check only odds and now the program is a lot faster.
Thanks a lot for yall's replies. Three more things before I go. What is
the square root function in python? I couldn't find the fact.py demo
script. I didn't mean return I meant 'continue'.
Mensanator wrote:
> 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