สมมติว่าเรามีตัวเลข n; เราต้องตรวจสอบว่า n เป็นเลขจุดอ่อนหรือไม่ อย่างที่เราทราบกันดีว่าจำนวนหนึ่งคือเลขอคิลลิสเมื่อจำนวนที่มีประสิทธิภาพ (จำนวน N เรียกว่าจำนวนอันทรงพลังเมื่อสำหรับทุกปัจจัยเฉพาะ p ของมัน p^2 ก็หารด้วย) แต่ไม่ใช่กำลังที่สมบูรณ์แบบ ตัวอย่างของตัวเลข Achilles ได้แก่ 72, 108, 200, 288, 392, 432, 500, 648, 675, 800, 864, 968, 972, 1125
ดังนั้น หากอินพุตเท่ากับ 108 ผลลัพธ์จะเป็น True เนื่องจาก 6 และ 36 หารทั้งคู่และไม่เป็นกำลังสองสมบูรณ์
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน check_powerful() นี่จะใช้เวลา n
- ในขณะที่ n mod 2 เหมือนกัน ทำ
- p :=0
- ในขณะที่ n mod 2 เหมือนกับ 0, do
- n :=n / 2
- p :=p + 1
- ถ้า p เหมือนกับ 1 แล้ว
- คืนค่าเท็จ
- p :=จำนวนเต็มของ (รากที่สองของ n) + 1
- สำหรับปัจจัยในช่วง 3 ถึง p เพิ่มขึ้น 2 ทำ
- p :=0
- ในขณะที่ปัจจัย mod n เหมือนกับ 0, do
- n :=n / แฟกเตอร์
- p :=p + 1
- ถ้า p เหมือนกับ 1 แล้ว
- คืนค่าเท็จ
- คืนค่า จริง เมื่อ (n เท่ากับ 1)
- กำหนดฟังก์ชัน check_power() นี่จะใช้เวลา
- ถ้า a เหมือนกับ 1 แล้ว
- คืนค่า True
- p :=จำนวนเต็มของ (รากที่สองของ n) + 1
- สำหรับฉันในช่วง 2 ถึง a เพิ่มขึ้น 1 ทำ
- val :=log(a) / log(i) [ทุกฐาน e]
- ถ้า (val - ส่วนจำนวนเต็มของ (val)) <0.00000001 แล้ว
- คืนค่า True
- คืนค่าเท็จ
- จากวิธีหลัก ให้ทำดังต่อไปนี้ −
- ถ้า check_powerful(n) เหมือนกับ True และ check_power(n) เหมือนกับ False ดังนั้น
- คืนค่า True
- มิฉะนั้น
- คืนค่าเท็จ
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
from math import sqrt, log def check_powerful(n): while (n % 2 == 0): p = 0 while (n % 2 == 0): n /= 2 p += 1 if (p == 1): return False p = int(sqrt(n)) + 1 for factor in range(3, p, 2): p = 0 while (n % factor == 0): n = n / factor p += 1 if (p == 1): return False return (n == 1) def check_power(a): if (a == 1): return True p = int(sqrt(a)) + 1 for i in range(2, a, 1): val = log(a) / log(i) if ((val - int(val)) < 0.00000001): return True return False def isAchilles(n): if (check_powerful(n) == True and check_power(n) == False): return True else: return False n = 108 print(isAchilles(n))
อินพุต
108
ผลลัพธ์
True