สมมติว่าเรามีหมายเลข n เราต้องตรวจสอบว่า n เป็นหมายเลขโทรจันหรือไม่ อย่างที่เราทราบกันดีว่าหมายเลขโทรจันเป็นตัวเลขที่เป็นตัวเลขที่แข็งแกร่งแต่ไม่มีกำลังสมบูรณ์ จำนวน n เป็นจำนวนหนักเมื่อสำหรับทุกตัวหารเฉพาะหรือตัวประกอบ p ของ n p^2 เป็นตัวหารด้วย กล่าวอีกนัยหนึ่ง ทุกปัจจัยเฉพาะปรากฏขึ้นอย่างน้อยสองครั้ง ตัวเลขโทรจันนั้นแข็งแกร่ง แต่กลับไม่เป็นความจริง ดังนั้นจึงหมายความว่า ไม่ใช่ตัวเลขที่แข็งแกร่งทั้งหมดที่เป็นตัวเลขโทรจัน:เฉพาะตัวเลขที่ไม่สามารถแสดงเป็น a^b ได้
ดังนั้น หากอินพุตเท่ากับ 72 เอาต์พุตจะเป็น True เนื่องจาก 72 สามารถแสดงเป็น (6*6*2) =(6^2 * 2) ตัวเลขแข็งแกร่ง แต่ไม่มีพลังที่สมบูรณ์แบบ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน check_perfect_pow() นี่จะใช้เวลา n
- ถ้า n เหมือนกับ 1 แล้ว
- คืนค่า True
- สำหรับ x ในช่วง 2 ถึงส่วนของจำนวนเต็มของ (รากที่สองของ n) + 1 ทำ
- y :=2
- p =x^y
- ในขณะที่ p <=n และ p>
0, ทำ
- ถ้า p เหมือนกับ n แล้ว
- คืนค่า True
- y :=y + 1
- p =x^y
- ถ้า p เหมือนกับ n แล้ว
- คืนค่าเท็จ
- กำหนดฟังก์ชัน check_strong_num() นี่จะใช้เวลา n
- นับ :=แผนที่เก็บความถี่ของตัวเลข เริ่มต้นทั้งหมดเป็น 0
- ในขณะที่ n mod 2 เหมือนกับ 0, do
- n :=n / 2 (การหารจำนวนเต็ม)
- นับ[2] :=นับ[2] + 1
- สำหรับฉันในช่วง 3 ถึงส่วนของจำนวนเต็มของ (รากที่สองของ n) + 1 เพิ่มขึ้น 2 ทำ
- ในขณะที่ n mod i เหมือนกับ 0, do
- n :=n / i (การหารจำนวนเต็ม)
- นับ[i] :=นับ[i] + 1
- ในขณะที่ n mod i เหมือนกับ 0, do
- ถ้า n> 2 ไม่ใช่ศูนย์ ดังนั้น
- นับ[n] :=นับ[n] + 1
- ธง :=0
- สำหรับแต่ละคีย์ ค่าใน items() ของการนับ ทำ
- ถ้าค่าเท่ากับ 1 แล้ว
- ธง :=1
- แตก
- ถ้าค่าเท่ากับ 1 แล้ว
- ถ้าแฟล็กเหมือนกับ 1 แล้ว
- คืนค่าเท็จ
- คืนค่า True
- จากวิธีหลัก ให้ทำดังต่อไปนี้ −
- คืนค่า จริง เมื่อ check_perfect_pow(n) เป็นเท็จ และ check_strong_num(n) เป็นจริง มิฉะนั้น คืนค่าเท็จ
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
from math import sqrt, pow def check_perfect_pow(n): if n == 1: return True for x in range(2, int(sqrt(n)) + 1): y = 2 p = x**y while p <= n and p > 0: if p == n: return True y += 1 p = x**y return False def check_strong_num(n): count = {i:0 for i in range(n)} while n % 2 == 0: n = n // 2 count[2] += 1 for i in range(3,int(sqrt(n)) + 1, 2): while n % i == 0: n = n // i count[i] += 1 if n > 2: count[n] += 1 flag = 0 for key,value in count.items(): if value == 1: flag = 1 break if flag == 1: return False return True def isTrojan(n): return check_perfect_pow(n) == False and check_strong_num(n) n = 72 print(isTrojan(n))
อินพุต
72
ผลลัพธ์
True