Given an even number N, the task is to check whether it is a Perfect number or not without finding its divisors.
In number theory, an Even Perfect Number is a positive integer which is even or that is equal to the sum of its positive divisors, excluding the number itself.
An even perfect number can be represented as P * (P + 1) / 2 where P is Mersenne Prime.
A Mersenne Prime is a prime number of form 2q – 1 where q is also a prime number.
For example: if N = 6,
If we choose q to be 2 (prime number) then mersenne prime (P) is 22 – 1 = 3.
Therefore, the Even perfect number formed by the formula is 3 * (3 + 1) / 2 = 6.
Examples:
Input: N = 6
Output: Yes
Explanation:
The integer 6 can be written as 6 = 1 + 2 + 3. Hence, its perfect number.Input: N =156
Output: No
Explanation:
The integer 156 cannot be written as a sum of its divisors. Hence, its not a perfect number.
Approach:
- Find the square root of the given number to get a number close to 2q – 1.
- Find q-1 from the square root of the number and then check whether 2q-1 * (2q-1) gives the number entered. If not then it is not a perfect number, otherwise continue.
- Check whether q is prime or not. If it is not prime then 2q-1 cannot be prime and subsequently check whether 2q-1 is prime.
- If all the above conditions hold true then it is an even perfect number otherwise not.
Below is the implementation of the above approach:
C++
// C++ program for the above approach #include<bits/stdc++.h> using namespace std; bool isPrime( long n); // Function to check for perfect number void check( long num) { // Find a number close to 2^q-1 long root = ( long ) sqrt (num); // Calculate q-1 long poww = ( long )( log (root) / log (2)); // Condition of perfect number if (num == ( long )( pow (2, poww) * ( pow (2, poww + 1) - 1))) { // Check whether q is prime or not if (isPrime(poww + 1)) { // Check whether 2^q - 1 is a // prime number or not if (isPrime(( long ) pow (2, poww + 1) - 1)) cout << "Yes" << endl; else cout << "No" << endl; } else cout << "No" << endl; } else cout << "No" << endl; } // Function to check for prime number bool isPrime( long n) { if (n <= 1) return false ; // Check whether it is equal to 2 or 3 else if (n == 2 || n == 3) return true ; else { // Check if it can be divided by 2 // and 3 then it is not prime number if (n % 2 == 0 || n % 3 == 0) return false ; // Check whether the given number be // divide by other prime numbers for ( long i = 5; i <= sqrt (n); i += 6) { if (n % i == 0 || n % (i + 2) == 0) return false ; } return true ; } } // Driver Code int main() { long num = 6; check(num); return 0; } // This code is contributed by rutvik_56 |
Java
// Java program for the above approach class GFG { // Function to check for perfect number private static void check( long num) { // Find a number close to 2^q-1 long root = ( long )Math.sqrt(num); // Calculate q-1 long pow = ( long )(Math.log(root) / Math.log( 2 )); // Condition of perfect number if (num == ( long )(Math.pow( 2 , pow) * (Math.pow( 2 , pow + 1 ) - 1 ))) { // Check whether q is prime or not if (isPrime(pow + 1 )) { // Check whether 2^q - 1 is a // prime number or not if (isPrime( ( long )Math.pow( 2 , pow + 1 ) - 1 )) System.out.println( "Yes" ); else System.out.println( "No" ); } else System.out.println( "No" ); } else System.out.println( "No" ); } // Function to check for prime number public static boolean isPrime( long n) { if (n <= 1 ) return false ; // Check whether it is equal to 2 or 3 else if (n == 2 || n == 3 ) return true ; else { // Check if it can be divided by 2 // and 3 then it is not prime number if (n % 2 == 0 || n % 3 == 0 ) return false ; // Check whether the given number be // divide by other prime numbers for ( long i = 5 ; i <= Math.sqrt(n); i += 6 ) { if (n % i == 0 || n % (i + 2 ) == 0 ) return false ; } return true ; } } // Driver code public static void main(String args[]) { long num = 6 ; check(num); } } |
Python3
# Python3 program for the above approach import math # Function to check for perfect number def check(num): # Find a number close to 2^q-1 root = ( int )(math.sqrt(num)) # Calculate q-1 poww = ( int )(math.log(root) / math.log( 2 )) # Condition of perfect number if (num = = ( int )( pow ( 2 , poww) * ( pow ( 2 , poww + 1 ) - 1 ))): # Check whether q is prime or not if (isPrime(poww + 1 )): # Check whether 2^q - 1 is a # prime number or not if (isPrime(( int )( pow ( 2 , poww + 1 )) - 1 )): print ( "Yes" ) else : print ( "No" ) else : print ( "No" ) else : print ( "No" ) # Function to check for prime number def isPrime(n): if (n < = 1 ): return bool ( False ) # Check whether it is equal to 2 or 3 elif (n = = 2 or n = = 3 ): return bool ( True ) else : # Check if it can be divided by 2 # and 3 then it is not prime number if (n % 2 = = 0 or n % 3 = = 0 ): return bool ( False ) # Check whether the given number be # divide by other prime numbers for i in range ( 5 , sqrt(n + 1 ) + 1 , 6 ): if (n % i = = 0 or n % (i + 2 ) = = 0 ): return bool ( False ) return bool ( True ) # Driver Code num = 6 check(num) # This code is contributed by divyeshrabadiya07 |
C#
// C# program for the above approach using System; using System.Collections.Generic; class GFG{ // Function to check for perfect number private static void check( long num) { // Find a number close to 2^q-1 long root = ( long )Math.Sqrt(num); // Calculate q-1 long pow = ( long )(Math.Log(root) / Math.Log(2)); // Condition of perfect number if (num == ( long )(Math.Pow(2, pow) * (Math.Pow(2, pow + 1) - 1))) { // Check whether q is prime or not if (isPrime(pow + 1)) { // Check whether 2^q - 1 is a // prime number or not if (isPrime(( long )Math.Pow(2, pow + 1) - 1)) Console.WriteLine( "Yes" ); else Console.WriteLine( "No" ); } else Console.WriteLine( "No" ); } else Console.WriteLine( "No" ); } // Function to check for prime number public static bool isPrime( long n) { if (n <= 1) return false ; // Check whether it is equal to 2 or 3 else if (n == 2 || n == 3) return true ; else { // Check if it can be divided by 2 // and 3 then it is not prime number if (n % 2 == 0 || n % 3 == 0) return false ; // Check whether the given number be // divide by other prime numbers for ( long i = 5; i <= Math.Sqrt(n); i += 6) { if (n % i == 0 || n % (i + 2) == 0) return false ; } return true ; } } // Driver code public static void Main(String []args) { long num = 6; check(num); } } // This code is contributed by amal kumar choubey |
Javascript
<script> // JavaScript program for the above approach // Function to check for perfect number function check(num) { // Find a number close to 2^q-1 let root = Math.floor(Math.sqrt(num)); // Calculate q-1 let pow = Math.floor(Math.log(root) / Math.log(2)); // Condition of perfect number if (num == Math.floor(Math.pow(2, pow) * (Math.pow(2, pow + 1) - 1))) { // Check whether q is prime or not if (isPrime(pow + 1)) { // Check whether 2^q - 1 is a // prime number or not if (isPrime( Math.floor(Math.pow( 2, pow + 1) ) - 1)) document.write( "Yes" ); else document.write( "No" ); } else document.write( "No" ); } else document.write( "No" ); } // Function to check for prime number function isPrime(n) { if (n <= 1) return false ; // Check whether it is equal to 2 or 3 else if (n == 2 || n == 3) return true ; else { // Check if it can be divided by 2 // and 3 then it is not prime number if (n % 2 == 0 || n % 3 == 0) return false ; // Check whether the given number be // divide by other prime numbers for (let i = 5; i <= Math.floor(Math.sqrt(n)); i += 6) { if (n % i == 0 || n % (i + 2) == 0) return false ; } return true ; } } // Driver Code let num = 6; check(num); </script> |
Yes
Time Complexity: O(N1/4)
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!