# 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
Type "help", "copyright", "credits" or "license" for more information.
>>> 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?

## Answers:

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
```