# 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``#include``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

 ``
Output:
`Yes`

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

My Personal Notes arrow_drop_up