ধরুন আমাদের একটি সংখ্যা n আছে, আমাদের পরীক্ষা করতে হবে n একটি ট্রোজান নম্বর কিনা। আমরা জানি যে ট্রোজান সংখ্যা হল এমন একটি সংখ্যা যা একটি নিখুঁত শক্তি ছাড়াই একটি শক্তিশালী সংখ্যা। একটি সংখ্যা n একটি শক্তিশালী সংখ্যা যখন n এর প্রতিটি মৌলিক ভাজক বা ফ্যাক্টর p এর জন্য, p^2ও একটি ভাজক। অন্য কথায়, প্রতিটি প্রাইম ফ্যাক্টর কমপক্ষে দুইবার উপস্থিত হয়। ট্রোজান সংখ্যা শক্তিশালী। কিন্তু বিপরীত সত্য নয়। সুতরাং এর অর্থ হল, সমস্ত শক্তিশালী সংখ্যাই ট্রোজান সংখ্যা নয়:শুধুমাত্র যেগুলিকে a^b হিসাবে উপস্থাপন করা যায় না।
সুতরাং, যদি ইনপুট 72 এর মত হয়, তাহলে আউটপুট হবে True, যেহেতু 72 কে (6*6*2) =(6^2*2) হিসেবে উপস্থাপন করা যেতে পারে। শক্তিশালী সংখ্যা কিন্তু নিখুঁত শক্তি ছাড়া।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- একটি ফাংশন সংজ্ঞায়িত করুন check_perfect_pow()। এটি n লাগবে
- যদি n 1 এর মত হয়, তাহলে
- সত্য ফেরান
- এক্সের জন্য পরিসীমা 2 থেকে পূর্ণসংখ্যার অংশ (n এর বর্গমূল) + 1, করুন
- y :=2
- p =x^y
- যখন p <=n এবং p>
0, do
- যদি p n এর মত হয়, তাহলে
- সত্য ফেরান
- y :=y + 1
- p =x^y
- যদি p n এর মত হয়, তাহলে
- মিথ্যে ফেরত দিন
- একটি ফাংশন সংজ্ঞায়িত করুন check_strong_num()। এটি n লাগবে
- গণনা :=সংখ্যার ফ্রিকোয়েন্সি ধরে রাখার জন্য একটি মানচিত্র, প্রাথমিকভাবে সবগুলিই 0
- যদিও n mod 2 0 এর মতো, do
- n :=n / 2 (পূর্ণসংখ্যা বিভাগ)
- গণনা[2] :=গণনা[2] + 1
- এর জন্য i পরিসীমা 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
- প্রতিটি কীর জন্য, আইটেমের মান () গণনার জন্য, করুন
- যদি মান 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