# Problem with simple prime number function

## Question:

I am trying to make a function to check if a number is a prime number based on the result of a modulo operation; so far so good but it seems to classify 9 as a prime number for some reason.

``````def is_prime(x):
if x <= 1: return False
elif x == 2 or x == 3: return True
else:
for n in range(2, x - 1):
if x % n == 0:
return False
else:
return True
``````

With that function if you run it as `is_prime(9)` it returns a `True` value, although if you type `9 % 3` on the interpreter it outputs `0`.

I guess I am making a mistake but I am not seeing it, could you help me out please?

This is what happens when you try to run it in the interpreter:

``````Python 3.11.2 (tags/v3.11.2:878ead1, Feb  7 2023, 16:38:35) [MSC v.1934 64 bit (AMD64)] on win32
>>> def is_prime(x):
...     for n in range(2, x-1):
...             if x % n == 0: return False
...             else: return True
...
>>> is_prime(9)
True
``````

But technically `n = 3` and `x = 9` used as `x % n` should output `0` right?

You shouldn’t `return true` in the `for loop`. You should wait until after your `for loop` finishes iterating through all the possibilities. The way you have it set up right now:

``````is_prime(9)
``````

It will do `x % n` where `n` is 2 and returns `true` because `x % n` is not equal to 0. So your function should look like this:

``````def is_prime(x):
for n in range(2, x-1):
if x % n == 0: return False
return True # Is prime
``````

the reason it’s returning `True` for `9` is because when it gets to the loop it starts with 2 and checks `9%2 == 0` which is `False` so it goes to the else and returns `True`. you can fix this by changing your code to:

``````def is_prime(x):
return all(x % n != 0 for n in range(2, x-1))
``````

here we are basically asking if all the numbers below the number don’t divide it then the number is prime.

There is an error in your implementation of the `is_prime` function. The issue is that the function `returns True` if the modulo operation with any value of `n` is not zero, rather than checking if the modulo operation is zero for all values of n from `2 to x-1.`

To fix this, you should move the `return True` statement outside the for loop, so it is only executed if the loop completes without finding a factor of `x`.

Here’s correct implementation

``````def is_prime(x):
if x <= 1:
return False
elif x == 2 or x == 3:
return True
else:
for n in range(2, x):
if x % n == 0:
return False
return True # Moved outside for loop

Output: is_prime(9)
False
``````
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.