def is_prime (x): if ((x <= 0) or (x == 1)): return False if (x == 2): return True for n in range(2, x): div = 0 flag = False div = x % n if div == 0: flag = False return flag else: return flag i tried to find what's wrong with the code but i couldn't locate it :(
After playing around with your code to arrive at a solution, this results...
from math import sqrt def is_prime (x): if x < 2: return False if x % 2 == 0: return False or x == 2 # reduce sample space by a factor of 2 r = int(sqrt(x)) + 1 # reduce sample space by a factor of r flag = True for n in range(3, r, 2): # odd numbers between 3 and r inclusive if x % n == 0: flag = False # factorable; outta here break return flag # not factorable if still True
It's not lesson tested, but it works in the lab.
There are four assertions in the above algorithm.
- A prime cannot be less than 2.
- A prime cannot be even unless it is 2.
- A number with factors less than or equal to its square root is not prime,
- A number is prime, provided it cannot be refuted by...
And we go on with the for statement in an attempt to refute. That's basically what all this boils down to.
repl.it is a good testing ground is you are looking for compatibility issues. It’s a great resource for testing.
from math import sqrt def is_prime (x): if x < 2: return False if x % 2 == 0: return False or x == 2 r = int(sqrt(x))+1 flag = True for n in range(3, r, 2): if x % n == 0: flag = False break return flag
In conclusion, I have no doubt that this exact example exists somewhere in the CC archives, or even a current 'discuss' topic, but of that I have no actual awares. I only know that intuitively it came up here. If it is meant to be, then so be it. Relish in the discovery, all the same!
Alternatively, a simple change to your code will do the job in a way closer to what the lesson is looking for. Within your for loop, you don't allow for any possibility of flag being marked as True. So any number other than 2 will always return False. Try changing line 8 to flag = True.