मान लीजिए कि हमारे पास एक संख्या n है, हमें जांचना है कि n एक ट्रोजन संख्या है या नहीं। जैसा कि हम जानते हैं कि ट्रोजन नंबर एक ऐसी संख्या है जो एक पूर्ण शक्ति के बिना एक मजबूत संख्या है। एक संख्या n एक मजबूत संख्या है जब प्रत्येक अभाज्य भाजक या n के कारक p के लिए, p^2 भी एक भाजक होता है। दूसरे शब्दों में, प्रत्येक अभाज्य गुणनखंड कम से कम दो बार प्रकट होता है। ट्रोजन नंबर मजबूत हैं। लेकिन उलटा सच नहीं है। तो इसका मतलब है, सभी मजबूत संख्याएं ट्रोजन संख्याएं नहीं हैं:केवल वे जिन्हें a^b के रूप में प्रदर्शित नहीं किया जा सकता है।
इसलिए, यदि इनपुट 72 की तरह है, तो आउटपुट ट्रू होगा, क्योंकि 72 को (6*6*2) =(6^2 * 2) के रूप में दर्शाया जा सकता है। मजबूत संख्या लेकिन पूर्ण शक्ति के बिना।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- एक फ़ंक्शन को परिभाषित करें check_perfect_pow() । इसमें n . लगेगा
- यदि n 1 के समान है, तो
- सही लौटें
- x के लिए श्रेणी 2 से पूर्णांक भाग (n का वर्गमूल) + 1 के लिए, करें
- y :=2
- p =x^y
- जबकि p <=n और p>
0, करते हैं
- यदि p, n के समान है, तो
- सही लौटें
- y :=y + 1
- p =x^y
- यदि p, n के समान है, तो
- झूठी वापसी
- एक फ़ंक्शन को परिभाषित करें check_strong_num() । इसमें n . लगेगा
- गिनती :=संख्याओं की बारंबारता रखने वाला नक्शा, प्रारंभ में सभी 0 हैं
- जबकि n mod 2 0 के समान है, करें
- n :=n/2 (पूर्णांक विभाजन)
- गिनती[2] :=गिनती[2] + 1
- i श्रेणी 3 से पूर्णांक भाग (n का वर्गमूल) + 1 के लिए, 2 से बढ़ाएँ, करें
- जबकि n mod i 0 के समान है, करते हैं
- n :=n / i (पूर्णांक विभाजन)
- गिनती[i] :=गिनती[i] + 1
- जबकि n mod i 0 के समान है, करते हैं
- यदि n> 2 शून्येतर है, तो
- गिनती[n] :=गिनती[n] + 1
- झंडा :=0
- प्रत्येक कुंजी के लिए, आइटम में मान () गिनती के, करते हैं
- यदि मान 1 के समान है, तो
- झंडा :=1
- ब्रेक
- यदि मान 1 के समान है, तो
- यदि ध्वज 1 के समान है, तो
- झूठी वापसी
- सही लौटें
- मुख्य विधि से निम्न कार्य करें -
- सही लौटें जब 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