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?

Asked By: Patricio

||

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
Answered By: Marcelo Paco

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.

Answered By: zaki98

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
Answered By: Shahebaz Mohammad
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.