





"""simple docstring"""
def 					__lowerCamelCase       (							a_					:		int							)      ->				"list[int]":
      if upper_limit < 0:
            raise ValueError('''Limit for the Catalan sequence must be ≥ 0'''							)

      __SCREAMING_SNAKE_CASE       :Tuple		    =  [0] * (upper_limit + 1)

      # Base case: C(0) = C(1) = 1
      __SCREAMING_SNAKE_CASE       :Tuple		    =  1
      if upper_limit > 0:
            __SCREAMING_SNAKE_CASE       :Optional[Any]		    =  1

      # Recurrence relation: C(i) = sum(C(j).C(i-j-1)), from j = 0 to i
      for i in range(2			,       upper_limit + 1							):
            for j in range(a_							):
                  catalan_list[i] += catalan_list[j] * catalan_list[i - j - 1]

      return catalan_list


if __name__ == "__main__":
  print("\n********* Catalan Numbers Using Dynamic Programming ************\n")
  print("\n*** Enter -1 at any time to quit ***")
  print("\nEnter the upper limit (≥ 0) for the Catalan number sequence: ", end="")
  try:
    while True:
      lowerCamelCase_       =		int(input().strip())
      if N < 0:
        print("\n********* Goodbye!! ************")
        break
      else:
        print(f'The Catalan numbers from 0 through {N} are:')
        print(catalan_numbers(N))
        print("Try another upper limit for the sequence: ", end="")
  except (NameError, ValueError):
    print("\n********* Invalid input, goodbye! ************\n")

  import doctest

  doctest.testmod()






"""simple docstring"""
import math
import unittest



def 					__lowerCamelCase       (							a_					:		int							)      ->				bool:
      assert isinstance(a_			,       a_							) and (
          number >= 0
      ), "'number' must been an int and positive"

      if 1 < number < 4:
            # 2 and 3 are primes
            return True
      elif number < 2 or number % 2 == 0 or number % 3 == 0:
            # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
            return False

      # All primes number are in format of 6k +/- 1
      for i in range(5			,       int(math.sqrt(a_							) + 1							)			,       6							):
            if number % i == 0 or number % (i + 2) == 0:
                  return False
      return True






class  _SCREAMING_SNAKE_CASE(       unittest.TestCase  ):




       def    _UpperCamelCase					(						self							)      ->				Union[str, Any]:





             """simple docstring"""






             self.assertTrue(is_prime(2							)							)
             self.assertTrue(is_prime(3							)							)
             self.assertTrue(is_prime(5							)							)
             self.assertTrue(is_prime(7							)							)
             self.assertTrue(is_prime(11							)							)
             self.assertTrue(is_prime(13							)							)
             self.assertTrue(is_prime(17							)							)
             self.assertTrue(is_prime(19							)							)
             self.assertTrue(is_prime(23							)							)
             self.assertTrue(is_prime(29							)							)




       def    _UpperCamelCase					(						self							)      ->				Tuple:





             """simple docstring"""






             with self.assertRaises(SCREAMING_SNAKE_CASE__							):
                   is_prime(-19							)
             self.assertFalse(
                 is_prime(0							)		,'''Zero doesn\'t have any positive factors, primes must have exactly two.'''		,)
             self.assertFalse(
                 is_prime(1							)		,'''One only has 1 positive factor, primes must have exactly two.'''		,)
             self.assertFalse(is_prime(2 * 2							)							)
             self.assertFalse(is_prime(2 * 3							)							)
             self.assertFalse(is_prime(3 * 3							)							)
             self.assertFalse(is_prime(3 * 5							)							)
             self.assertFalse(is_prime(3 * 5 * 7							)							)


if __name__ == "__main__":
  unittest.main()