Check if a number is a Trojan Numbers in Python


Suppose we have a number n, we have to check whether n is a Trojan Number or not. As we know that the Trojan Number is a number that is a strong number without a perfect power. A number n is a strong number when for every prime divisor or factor p of n, p^2 is also a divisor. In other words, every prime factor appears at least twice. Trojan numbers are strong. But the reverse is not true. So it means, not all strong numbers are Trojan numbers: only those that cannot be represented as a^b.

So, if the input is like 72, then the output will be True, as 72 can be represented as (6*6*2) = (6^2 * 2). Strong Number but without perfect power.

To solve this, we will follow these steps −

  • Define a function check_perfect_pow() . This will take n
  • if n is same as 1, then
    • return True
  • for x in range 2 to integer part of (square root of n) + 1, do
    • y := 2
    • p = x^y
    • while p <= n and p > 0, do
      • if p is same as n, then
        • return True
      • y := y + 1
      • p = x^y
  • return False
  • Define a function check_strong_num() . This will take n
  • count := a map to hold frequency of numbers, initially all are 0
  • while n mod 2 is same as 0, do
    • n := n / 2 (integer division)
    • count[2] := count[2] + 1
  • for i in range 3 to integer part of (square root of n) + 1, increase by 2, do
    • while n mod i is same as 0, do
      • n := n / i (integer division)
      • count[i] := count[i] + 1
  • if n > 2 is non-zero, then
    • count[n] := count[n] + 1
  • flag := 0
  • for each key,value in items() of count, do
    • if value is same as 1, then
      • flag := 1
      • break
  • if flag is same as 1, then
    • return False
  • return True
  • From the main method do the following −
    • return true when check_perfect_pow(n) is False and check_strong_num(n) is true, otherwise return false

Example

Let us see the following implementation to get better understanding −

 Live Demo

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))

Input

72

Output

True

Updated on: 27-Aug-2020

85 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements