diff --git a/src/prime_checker.py b/src/prime_checker.py new file mode 100644 index 00000000..7923ee13 --- /dev/null +++ b/src/prime_checker.py @@ -0,0 +1,40 @@ +def is_prime(n): + """ + Check if a given number is prime. + + A prime number is a natural number greater than 1 that is only divisible by 1 and itself. + + Args: + n (int): The number to check for primality. + + Returns: + bool: True if the number is prime, False otherwise. + + Raises: + TypeError: If the input is not an integer. + ValueError: If the input is less than or equal to 0. + """ + # Check input type + if not isinstance(n, int): + raise TypeError("Input must be an integer") + + # Check input range + if n <= 0: + raise ValueError("Input must be a positive integer greater than 0") + + # Handle small prime numbers + if n == 1: + return False + if n <= 3: + return True + + # Optimize for even numbers + if n % 2 == 0: + return False + + # Check for divisibility up to the square root of n + for i in range(3, int(n**0.5) + 1, 2): + if n % i == 0: + return False + + return True \ No newline at end of file diff --git a/tests/test_prime_checker.py b/tests/test_prime_checker.py new file mode 100644 index 00000000..f39f35dd --- /dev/null +++ b/tests/test_prime_checker.py @@ -0,0 +1,38 @@ +import pytest +from src.prime_checker import is_prime + +def test_prime_numbers(): + """Test known prime numbers""" + prime_numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] + for num in prime_numbers: + assert is_prime(num) is True, f"{num} should be prime" + +def test_non_prime_numbers(): + """Test known non-prime numbers""" + non_prime_numbers = [1, 4, 6, 8, 9, 10, 12, 14, 15, 16] + for num in non_prime_numbers: + assert is_prime(num) is False, f"{num} should not be prime" + +def test_large_prime_number(): + """Test a larger prime number""" + assert is_prime(997) is True + +def test_large_non_prime_number(): + """Test a larger non-prime number""" + assert is_prime(1000) is False + +def test_invalid_input_types(): + """Test invalid input types""" + with pytest.raises(TypeError): + is_prime(3.14) + with pytest.raises(TypeError): + is_prime("7") + with pytest.raises(TypeError): + is_prime([7]) + +def test_invalid_input_range(): + """Test invalid input ranges""" + with pytest.raises(ValueError): + is_prime(0) + with pytest.raises(ValueError): + is_prime(-5) \ No newline at end of file