จำนวนเฉพาะคือจำนวนเต็มบวกที่มากกว่า 1 และไม่มีตัวหารอื่นนอกจาก 1 และตัวมันเอง
วิธีที่ 1: Naive Trial Division (เข้าใจง่าย)
def is_prime_naive(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
print(is_prime_naive(23)) # True
print(is_prime_naive(25)) # False
วิธีที่ 2: Optimized Trial Division (เร็วกว่า)
- เช็ค 2 และ 3 ก่อน
- ข้ามตัวเลขคู่ และตัวเลขหาร 3 ลงตัว
- เช็คเฉพาะรูปแบบ 6k ± 1 จนถึง √n
def is_prime_optimized(n):
if n <= 1:
return False
if n <= 3:
return True
if n % 2 == 0 or n % 3 == 0:
return False
i = 5
while i * i <= n:
if n % i == 0 or n % (i + 2) == 0:
return False
i += 6
return True
print(is_prime_optimized(31)) # True
print(is_prime_optimized(25)) # False
วิธีที่ 3: ใช้ sympy (สำหรับงานจริง)
import sympy print(sympy.isprime(10**9 + 7)) # True
เปรียบเทียบประสิทธิภาพ
| วิธี | Time Complexity | เหมาะสำหรับ |
|---|---|---|
| Naive | O(n) | n เล็ก, การศึกษา |
| Optimized 6k±1 | O(√n) | ทั่วไป, สัมภาษณ์ |
| Miller-Rabin (sympy) | O(k log³ n) | จำนวนใหญ่, คริปโต |
สรุป
ใช้ optimized trial division สำหรับจำนวนปานกลาง ใช้ sympy สำหรับจำนวนใหญ่มาก