Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions src/prime_checker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
def is_prime(number: int) -> bool:
"""
Check if the given number is prime.

A prime number is a natural number greater than 1 that is only divisible by 1 and itself.

Args:
number (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.
"""
# Check if input is an integer
if not isinstance(number, int):
raise TypeError("Input must be an integer")

# Handle special cases
if number < 2:
return False

# Optimize for small numbers
if number == 2:
return True

# Even numbers greater than 2 are not prime
if number % 2 == 0:
return False

# Check odd divisors up to the square root of the number
for divisor in range(3, int(number**0.5) + 1, 2):
if number % divisor == 0:
return False

return True
39 changes: 39 additions & 0 deletions tests/test_prime_checker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
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, 31, 37, 41, 43, 47]
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 = [0, 1, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22]
for num in non_prime_numbers:
assert is_prime(num) is False, f"{num} should not be prime"

def test_large_prime():
"""Test a large prime number."""
assert is_prime(104729) is True, "104729 is a large prime number"

def test_large_non_prime():
"""Test a large non-prime number."""
assert is_prime(100000) is False, "100000 should not be prime"

def test_negative_numbers():
"""Test negative numbers."""
negative_numbers = [-1, -2, -3, -5, -7]
for num in negative_numbers:
assert is_prime(num) is False, f"{num} should not be prime"

def test_error_handling():
"""Test error handling for invalid input types."""
with pytest.raises(TypeError):
is_prime(3.14)

with pytest.raises(TypeError):
is_prime("17")

with pytest.raises(TypeError):
is_prime(None)