Even Perfect Number

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, exccluding 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++

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


Output: 

Yes

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

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up


If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.