สมมติว่าเรามีจำนวน n เราต้องตรวจสอบว่า n เป็นจำนวนเฉพาะไพรมอเรียลหรือไม่ กล่าวได้ว่าจำนวนเฉพาะไพรมอเรียลเมื่อเป็นจำนวนเฉพาะของรูปแบบ pN# + 1 หรือ pN# – 1 โดยที่ pN# บ่งชี้ถึงไพรมอเรียลของ pN ส่งผลให้ผลคูณของจำนวนเฉพาะ N ตัวแรก
ดังนั้น หากอินพุตเท่ากับ 29 เอาต์พุตจะเป็น True เนื่องจาก 29 คือ Primorial Prime ของรูปแบบ pN - 1 หาก N=3, Primorial คือ 2*3*5 =30 และ 30-1 =29
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- MAX :=100000
- prime :=รายการขนาด MAX และเติม True
- arr :=รายการใหม่
- กำหนดฟังก์ชัน SieveOfEratosthenes() นี่จะใช้เวลา
- สำหรับ pri ในช่วง 2 ถึง int(สแควร์รูทของ (MAX)) + 1 ทำ
- ถ้าไพรม์[pri] เหมือนกับ True แล้ว
- สำหรับ i ในช่วง pri * 2 ถึง MAX ให้อัปเดตในแต่ละขั้นตอนโดย pri ทำ
- prime[i] :=เท็จ
- สำหรับ i ในช่วง pri * 2 ถึง MAX ให้อัปเดตในแต่ละขั้นตอนโดย pri ทำ
- ถ้าไพรม์[pri] เหมือนกับ True แล้ว
- สำหรับ pri ในช่วง 2 ถึง MAX ให้ทำ
- ถ้าไพรม์[pri] ไม่ใช่ศูนย์ ดังนั้น
- ใส่ pri ต่อท้าย arr
- ถ้าไพรม์[pri] ไม่ใช่ศูนย์ ดังนั้น
- จากวิธีหลัก ให้ทำดังต่อไปนี้ −
- ถ้าไพรม์[n] เป็นศูนย์ ดังนั้น
- คืนค่าเท็จ
- สินค้า :=1, ผม :=0
- ในขณะที่ผลิตภัณฑ์
- ผลิตภัณฑ์ :=ผลิตภัณฑ์ * arr[i]
- ถ้า product + 1 เหมือนกับ n หรือ product - 1 เหมือนกับ n แล้ว
- คืนค่า True
- ผม :=ผม + 1
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
from math import sqrt MAX = 100000 prime = [True] * MAX arr = [] def SieveOfEratosthenes() : for pri in range(2, int(sqrt(MAX)) + 1) : if prime[pri] == True : for i in range(pri * 2 , MAX, pri) : prime[i] = False for pri in range(2, MAX) : if prime[pri] : arr.append(pri) def check_primorial_prime(n) : if not prime[n] : return False product, i = 1, 0 while product < n : product *= arr[i] if product + 1 == n or product - 1 == n : return True i += 1 return False SieveOfEratosthenes() n = 29 print(check_primorial_prime(n))
อินพุต
29
ผลลัพธ์
True