Even Perfect Number

• Difficulty Level : Easy
• Last Updated : 13 Sep, 2021

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:

1. Find the square root of the given number to get a number close to 2q – 1.
2. 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.
3. 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.
4. 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#includeusing namespace std; bool isPrime(long n); // Function to check for perfect numbervoid 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 numberbool 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 Codeint 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 approachimport math # Function to check for perfect numberdef 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 numberdef 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 approachusing System;using System.Collections.Generic; class GFG{ // Function to check for perfect numberprivate 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 numberpublic 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 codepublic static void Main(String []args){    long num = 6;    check(num);}} // This code is contributed by amal kumar choubey

Javascript


Output:
Yes

Time Complexity: O(N1/4)
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up