Open In App

Check whether X can be represented in the form of (2n – 1) / 3

Improve
Improve
Like Article
Like
Save
Share
Report

Given an integer X, the task is to check whether X can be represented in the form of X = (2n – 1) / 3 for some value of n, Where it is necessary for X to be prime.

Examples:

Input: X = 5
Output: Yes
Explanation: X is a prime number and (24 – 1) / 3 = (16 – 1) / 3 = 15 / 3 = 5. So, it is valid.

Input: X = 2
Output: No

Approach: This can be solved with the following idea:

Simplifying, The equation given: X = (2n – 1) / 3

  • 3X = 2n – 1
  • 3X + 1 = 2n
  • 2n = 3X + 1                           

Taking log2 Both the side of the equation, we get

  • log2(2n) = log2(3X + 1)
  • n = log2(3X + 1).

Therefore, if X is prime and after solving equation n is also prime, then it is valid

Steps involved in the implementation  of code:

  • Input a number X.
  • Check whether the number is prime or not. If it is not prime then for sure It is not valid.
  • Compute the logarithm of 3X+1  and store it in a variable n
  • Now we will check if n is a prime number or not.
  • If n is a  prime number then X is valid else it is not valid.

Below is the implementation of the above approach:

C++




// C++ code for the above approach
#include <iostream>
#include <math.h>
using namespace std;
 
// Function to check whether the
// number is prime or not
bool isPrime(int n)
{
 
    if (n == 2)
        return false;
    int l = sqrt(n);
    for (int i = 3; i <= l; i += 2) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}
 
// Function to check whether the number
// obtained is proper integer or not
bool isInteger(float num)
{
 
    // n will store integer value of num
    float n = floor(num);
 
    if (num > n) {
        return false;
    }
    return true;
}
 
// Function to check whether
// the number is valid or not
bool isValid(int X)
{
 
    if (isPrime(X) == false) {
        return false;
    }
    float n = log2(3 * X + 1);
    if (isInteger(n) == false) {
        return false;
    }
 
    return isPrime((int)n);
}
 
// Driver code
int main()
{
    int X = 5;
 
    // Function call
    if (isValid(X)) {
        cout << "Yes" << endl;
    }
    else {
        cout << "No" << endl;
    }
}


Java




// Java code for the above approach
 
import java.io.*;
 
class GFG {
 
  // Function to check whether the number is prime or not
  static boolean isPrime(int n)
  {
 
    if (n == 2)
      return false;
    int l = (int)Math.sqrt(n);
    for (int i = 3; i <= l; i += 2) {
      if (n % i == 0) {
        return false;
      }
    }
    return true;
  }
 
  // Function to check whether the number obtained is
  // proper integer or not
  static boolean isInteger(float num)
  {
 
    // n will store integer value of num
    float n = (float)Math.floor(num);
 
    if (num > n) {
      return false;
    }
    return true;
  }
 
  // Function to check whether the number is valid or not
  static boolean isValid(int X)
  {
 
    if (isPrime(X) == false) {
      return false;
    }
    float n
      = (float)(Math.log(3 * X + 1) / Math.log(2));
    if (isInteger(n) == false) {
      return false;
    }
 
    return isPrime((int)n);
  }
 
  public static void main(String[] args)
  {
    int X = 5;
 
    // Function call
    if (isValid(X)) {
      System.out.println("Yes");
    }
    else {
      System.out.println("No");
    }
  }
}
 
// This code is contributed by lokesh.


Python3




import math
 
# Function to check whether the
# number is prime or not
def isPrime(n):
    if n == 2:
        return False
    l = int(math.sqrt(n))
    for i in range(3, l+1, 2):
        if n % i == 0:
            return False
    return True
 
# Function to check whether the number
# obtained is proper integer or not
def isInteger(num):
    # n will store integer value of num
    n = math.floor(num)
    if num > n:
        return False
    return True
 
# Function to check whether
# the number is valid or not
def isValid(X):
    if isPrime(X) == False:
        return False
    n = math.log2(3 * X + 1)
    if isInteger(n) == False:
        return False
    return isPrime(int(n))
 
# Driver code
X = 5
 
# Function call
if isValid(X):
    print("Yes")
else:
    print("No")


C#




// C# code for the above approach
 
using System;
 
public class GFG {
    // Function to check whether the
    // number is prime or not
    static bool isPrime(int n)
    {
        if (n == 2)
            return false;
        int l = (int)Math.Sqrt(n);
        for (int i = 3; i <= l; i += 2)
        {
            if (n % i == 0)
            {
                return false;
            }
        }
        return true;
    }
 
    // Function to check whether the number
    // obtained is proper integer or not
    static bool isInteger(float num)
    {
        // n will store integer value of num
        float n = (float)Math.Floor(num);
 
        if (num > n)
        {
            return false;
        }
        return true;
    }
 
    // Function to check whether
    // the number is valid or not
    static bool isValid(int X)
    {
        if (isPrime(X) == false)
        {
            return false;
        }
        float n = (float)Math.Log(3 * X + 1, 2);
        if (isInteger(n) == false)
        {
            return false;
        }
 
        return isPrime((int)n);
    }
 
    // Driver code
    static void Main()
    {
        int X = 5;
 
        // Function call
        if (isValid(X))
        {
            Console.WriteLine("Yes");
        }
        else
        {
            Console.WriteLine("No");
        }
    }
}


Javascript




// Function to check whether the number is prime or not
function isPrime(n) {
  if (n == 2) {
    return false;
  }
  let l = Math.sqrt(n);
  for (let i = 3; i <= l; i += 2) {
    if (n % i == 0) {
      return false;
    }
  }
  return true;
}
 
// Function to check whether the number obtained is proper integer or not
function isInteger(num) {
  // n will store integer value of num
  let n = Math.floor(num);
  if (num > n) {
    return false;
  }
  return true;
}
 
// Function to check whether the number is valid or not
function isValid(X) {
  if (isPrime(X) == false) {
    return false;
  }
  let n = Math.log(3 * X + 1) / Math.log(2);
  if (isInteger(n) == false) {
    return false;
  }
  return isPrime(parseInt(n));
}
 
// Driver Code
 
  let X = 5;
 
  // Function call
  if (isValid(X)) {
    console.log("Yes");
  } else {
    console.log("No");
  }


Output

Yes

Time Complexity: O(sqrt(n))
Auxiliary Space: O(1)



Last Updated : 04 Apr, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads