Search code examples
pythonpython-3.xmathjupyter-notebookgoogle-colaboratory

Can't define 2 as prime number or not


I'm trying to define prime numbers, but my algorithm doesn't recognize 2 as a prime number. Instead return None. I try it in Google Colab, Jupiter Notebook and PyCharm with same result.

My code:

# V1) Test all divisors from 2 through n-1. (skip 1 and n)
def is_prime_v1(n):
  """ Return 'True' if 'n' is a prime number. False otherwise. """
  if n == 1:
    return False # 1 is not prime

  for d in range(2, n):
    if n % d == 0:
      return False # Is not prime
    return True

# ===== Test Function =====
for n in range(1, 21):
  print(n, is_prime_v1(n))

My output:

1 False
2 None
3 True
4 False
5 True
6 False
7 True
8 False
9 True
10 False
11 True
12 False
13 True
14 False
15 True
16 False
17 True
18 False
19 True
20 False

Additionally, the return has some erros, like 9 is not a prime number.

This code is from, starting in 0:46: Python and Prime Numbers || Python Tutorial || Learn Python Programming


Solution

  • Because Your program never enters the loop.

    for d in range(2, n):
        if n % d == 0:
          return False # Is not prime
        return True
    

    starts from 2, up until n-1. Also, you should indent it differently. Only after your program exited the loop should you return True:

    for d in range(2, n):
        if n % d == 0:
          return False # Is not prime
    return True
    

    But if you want to optimize your function, it should be like this:

    def is_prime_v1(n):
        if n <= 1:
            return False
        if n == 2:
            return True
        if n % 2 == 0:
            return False
        for d in range(3, round(n**0.5) + 1, 2):
            if n % d == 0:
                return False
        return True
    

    Since you dont need to check up to the number itself, only it's square root. Also, no number that is even can ever be prime (except 2), since it would be divisible by two.
    EDIT:
    I'm happy my answer helped :)