import math
import unittest







def 						A__  (					__A	):







    '''simple docstring'''
    assert isinstance(SCREAMING_SNAKE_CASE_   , SCREAMING_SNAKE_CASE_	) 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(SCREAMING_SNAKE_CASE_	) + 1	)   , 6	):
        if number % i == 0 or number % (i + 2) == 0:
            return False
    return True




class 	__snake_case	( unittest.TestCase		):





      '''simple docstring'''






      def 	_SCREAMING_SNAKE_CASE    (					self     :				int)				->List[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 	_SCREAMING_SNAKE_CASE    (					self     :				Optional[int])				->Tuple:


          """simple docstring"""


          with self.assertRaises(lowercase__):
              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()





def 						A__  (					__A   , __A	):







    '''simple docstring'''
    _enforce_args(__A   , __A	)
    if n == 0:
        return 0
    _lowerCamelCase     :		Tuple 						=						float("""-inf"""	)
    for i in range(1   , n + 1	):
        _lowerCamelCase     :		Any 						=						max(
            __A   , prices[i - 1] + naive_cut_rod_recursive(n - i   , __A	)	)

    return max_revue







def 						A__  (					__A   , __A	):







    '''simple docstring'''
    _enforce_args(__A   , __A	)
    _lowerCamelCase     :		Optional[Any] 						=						[float("""-inf"""	) for _ in range(n + 1	)]
    return _top_down_cut_rod_recursive(__A   , __A   , __A	)







def 						A__  (					__A   , __A   , __A	):







    '''simple docstring'''
    if max_rev[n] >= 0:
        return max_rev[n]
    elif n == 0:
        return 0
    else:
        _lowerCamelCase     :		int 						=						float("""-inf"""	)
        for i in range(1   , n + 1	):
            _lowerCamelCase     :		Optional[Any] 						=						max(
                __A   , prices[i - 1] + _top_down_cut_rod_recursive(n - i   , __A   , __A	)   , )

        _lowerCamelCase     :		Optional[Any] 						=						max_revenue

    return max_rev[n]







def 						A__  (					__A   , __A	):







    '''simple docstring'''
    _enforce_args(__A   , __A	)

    # length(max_rev) = n + 1, to accommodate for the revenue obtainable from a rod of
    # length 0.
    _lowerCamelCase     :		List[Any] 						=						[float("""-inf"""	) for _ in range(n + 1	)]
    _lowerCamelCase     :		Any 						=						0

    for i in range(1   , n + 1	):
        _lowerCamelCase     :		Any 						=						max_rev[i]
        for j in range(1   , i + 1	):
            _lowerCamelCase     :		List[Any] 						=						max(__A   , prices[j - 1] + max_rev[i - j]	)

        _lowerCamelCase     :		int 						=						max_revenue_i

    return max_rev[n]







def 						A__  (					__A   , __A	):







    '''simple docstring'''
    if n < 0:
        _lowerCamelCase     :		Any 						=						F"""n must be greater than or equal to 0. Got n = {n}"""
        raise ValueError(__A	)

    if n > len(__A	):
        _lowerCamelCase     :		List[Any] 						=						(
            """Each integral piece of rod must have a corresponding price. """
            F"""Got n = {n} but length of prices = {len(__A	)}"""
        )
        raise ValueError(__A	)







def 						A__  (					):







    '''simple docstring'''
    _lowerCamelCase     :		str 						=						[6, 10, 12, 15, 20, 23]
    _lowerCamelCase     :		List[str] 						=						len(__A	)

    # the best revenue comes from cutting the rod into 6 pieces, each
    # of length 1 resulting in a revenue of 6 * 6 = 36.
    _lowerCamelCase     :		Tuple 						=						36

    _lowerCamelCase     :		Any 						=						top_down_cut_rod(__A   , __A	)
    _lowerCamelCase     :		Dict 						=						bottom_up_cut_rod(__A   , __A	)
    _lowerCamelCase     :		List[str] 						=						naive_cut_rod_recursive(__A   , __A	)

    assert expected_max_revenue == max_rev_top_down
    assert max_rev_top_down == max_rev_bottom_up
    assert max_rev_bottom_up == max_rev_naive


if __name__ == "__main__":
    main()




