One way to resolve this exercise is through the Sieve of Eratosthenes . The idea, superficially, is to get the complete list of values between 2 and N and remove those that are not prime. The pseudo-code, taken from the source mentioned above, is:
Input: an integer n > 1.
Let A be an array of Boolean values, indexed by integers 2 to n,
initially all set to true.
for i = 2, 3, 4, ..., not exceeding √n:
if A[i] is true:
for j = i2, i2+i, i2+2i, i2+3i, ..., not exceeding n:
A[j] := false.
Output: all i such that A[i] is true.
In Python, one way to implement it is:
import math
# Input: an integer n > 1.
N = int(input("N: "))
# Let A be an array of Boolean values, indexed by integers 2 to n, initially all set to true.
A = list(range(2, N))
# for i = 2, 3, 4, ..., not exceeding √n:
for i in range(2, int(math.sqrt(N)+1)):
# if A[i] is true:
if i in A:
# for j = i2, i2+i, i2+2i, i2+3i, ..., not exceeding n:
for j in range(i**2, N, i):
# A[j] := false.
if j in A: A.remove(j)
# Output: all i such that A[i] is true.
print(A)
If we enter a value of 30 for N, we get the following output:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
See working at Ideone or Repl.it .