Số nguyên tố: số nguyên dương > 1, chỉ chia hết cho 1 và chính nó. 1 không phải số nguyên tố.
Phương pháp 1: Vòng lặp lồng đơn giản
def prime_method1(n):
primes = []
for num in range(2, n):
is_prime = True
for i in range(2, num):
if num % i == 0:
is_prime = False
break
if is_prime:
primes.append(num)
return primes
print(prime_method1(50))
# [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
Phương pháp 2: Break sớm (tối ưu nhẹ)
def prime_method2(n):
primes = []
for num in range(2, n+1):
is_prime = True
for i in range(2, num):
if num % i == 0:
is_prime = False
break
if is_prime:
primes.append(num)
return primes
Phương pháp 3: Chỉ kiểm tra đến √n (tối ưu mạnh)
def prime_method3(n):
primes = []
for num in range(2, n):
is_prime = True
for i in range(2, int(num**0.5) + 1):
if num % i == 0:
is_prime = False
break
if is_prime:
primes.append(num)
return primes
print(prime_method3(50))
Phương pháp 4: Sieve of Eratosthenes (hiệu quả nhất cho n lớn)
def sieve(n):
is_prime = [True] * (n+1)
is_prime[0] = is_prime[1] = False
for i in range(2, int(n**0.5)+1):
if is_prime[i]:
for j in range(i*i, n+1, i):
is_prime[j] = False
return [i for i, val in enumerate(is_prime) if val]
print(sieve(1000000)) # Rất nhanh cho n lớn
So sánh độ phức tạp
| Phương pháp | Độ phức tạp thời gian | Phù hợp |
|---|---|---|
| Naive (p1) | O(n²) | n nhỏ, giáo dục |
| Break early (p2) | O(n²) nhưng nhanh hơn | n nhỏ |
| √n check (p3) | O(n√n) | n trung bình |
| Sieve | O(n log log n) | n lớn, nhiều truy vấn |
Kiểm tra 1 số (is_prime)
def is_prime(n):
if n < 2: return False
if n % 2 == 0: return n == 2
for i in range(3, int(n**0.5)+1, 2):
if n % i == 0: return False
return True