input: Write a function to construct a prime number sieve which returns a list of all prime numbers up to a given number. The function should initialize a list of boolean values representing whether each number is prime, then iteratively mark non-prime numbers starting from the smallest prime number, and finally collect and return the list of prime numbers up to the given number.
  def primeSieve(n):
      prime_list = [True for i in range(n+1)]
      p = 2
      while (p * p <= n):
          if (prime_list[p] == True):
              for i in range(p * 2, n+1, p):
                  prime_list[i] = False
          p += 1
      primes = []
      for p in range(2, n+1):
          if prime_list[p]:
              primes.append(p)
      return primes
  
  print(primeSieve(10))  # [2, 3, 5, 7]
  print(primeSieve(0))   # []
  print(primeSieve(1))   # []
  print(primeSieve(20))  # [2, 3, 5, 7, 11, 13, 17, 19]
output: def primeSieve(n):
      prime_list = [True for i in range(n+1)]
      p = 2
      while (p * p <= n):
          if (prime_list[p] == True):
              for i in range(p * 2, n+1, p):
                  prime_list[i] = False
          p += 1
      primes = []
      for p in range(2, n+1):
          if prime_list[p]:
              primes.append(p)
      return primes