สมมติว่าเรามีหมายเลข 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