ภาพรวม
บทความนี้แสดงวิธีตรวจสอบว่าเลข n สามารถเขียนในรูปผลรวมของเซมีไพรม์ (semi-prime) สองจำนวนได้หรือไม่ เซมีไพรม์คือเลขที่เป็นผลคูณของจำนวนเฉพาะสองจำนวน (อาจเป็นจำนวนเฉพาะตัวเดียวกันได้ เช่น 4 = 2×2)
เซมีไพรม์ตัวอย่าง (1-100)
4, 6, 9, 10, 14, 15, 21, 22, 25, 26, 33, 34, 35, 38, 39, 46, 49, 51, 55, 57, 58, 62, 65, 69, 74, 77, 82, 85, 86, 87, 91, 93, 94, 95
อัลกอริทึม
- สร้างรายการเซมีไพรม์ทั้งหมดจนถึงค่าสูงสุดที่กำหนด (MAX = 10000)
- ใช้การแยกตัวประกอบเฉพาะเพื่อตรวจสอบว่าเลขแต่ละจำนวนเป็นเซมีไพรม์หรือไม่
- ตรวจสอบว่ามีคู่เซมีไพรม์
(a, b)ที่a + b = nโดยวนลูปaจนถึงn//2และตรวจสอบว่าn-aเป็นเซมีไพรม์หรือไม่
ตัวอย่างโค้ด Python
MAX = 10000
nums = []
s_prime_flags = [False] * MAX
def get_semi_primes():
for i in range(2, MAX):
count = 0
num = i
j = 2
while count < 2 and j * j <= num:
while num % j == 0:
num //= j
count += 1
j += 1
if num > 1:
count += 1
if count == 2:
s_prime_flags[i] = True
nums.append(i)
def solve(n):
get_semi_primes()
i = 0
while nums[i] <= n // 2:
if s_prime_flags[n - nums[i]]:
return True
i += 1
return False
n = 108
print(solve(n)) # True (14 + 94)
ผลลัพธ์
True
คำอธิบายเพิ่มเติม
โค้ดใช้การคัดกรองเซมีไพรม์ล่วงหน้า (precompute) เพื่อให้การตรวจสอบแต่ละค่า n รวดเร็วขึ้น เหมาะสำหรับการประมวลผลหลายคำถาม (multiple queries)