Given a positive integer N, the task is to check if it is a Proth number. If the given number is a Proth number then print ‘YES’ otherwise print ‘NO’.
Proth Number: In mathematics, a Proth number is a positive integer of the form
n = k * 2n + 1
where k is an odd positive integer and n is a positive integer such that 2n > k .
The first few Proth numbers are –
3, 5, 9, 13, 17, 25, 33, 41, 49, ……
Examples:
Input: 25
Output: YES
Taking k= 3 and n= 3,
25 can be expressed in the form of
(k.2n + 1) as (3.23 + 1)
Input: 73
Output: NO
Taking k=9 and n=3
73 can be expressed in the form of
(k.2n + 1 ) as (9.23 + 1)
But 23 is less than 9
(it should be greater than k to be Proth Number)
Approach 1:
- Iterate through values of k from 1 to n.
- For each k, iterate through exponent from 0 to n.
- Calculate prothNumber using the formula k * (1ULL << exponent) + 1.
- If prothNumber is equal to the given number n, return true.
- If prothNumber is greater than n, break the inner loop and continue with the next k.
- If no Proth number is found, return false.
Note: This brute-force approach has high time complexity and is not efficient for large values of n.
#include <iostream> #include <cmath> // Utility function to check if a number is a power of two bool isPowerOfTwo(unsigned long long int n) {
return n && !(n & (n - 1));
} // Function to check if a number is a Proth number using brute-force bool isProthNumber(unsigned long long int n) {
if (n < 3)
return false ;
for (unsigned long long int k = 1; k <= n; ++k) {
for (unsigned long long int exponent = 0; exponent <= n; ++exponent) {
unsigned long long int prothNumber = k * (1ULL << exponent) + 1;
if (prothNumber == n)
return true ;
if (prothNumber > n)
break ;
}
}
return false ;
} // Nikunj Sonigara // Driver code int main() {
// Get n
unsigned long long int n = 25;
// Check n for Proth Number
if (isProthNumber(n - 1))
std::cout << "YES" << std::endl;
else
std::cout << "NO" << std::endl;
return 0;
} |
public class GFG {
// Utility function to check if a number is a power of two
public static boolean isPowerOfTwo( long n) {
return n != 0 && (n & (n - 1 )) == 0 ;
}
// Function to check if a number is a Proth number using brute-force
public static boolean isProthNumber( long n) {
if (n < 3 )
return false ;
for ( long k = 1 ; k <= n; ++k) {
for ( long exponent = 0 ; exponent <= n; ++exponent) {
long prothNumber = k * (1L << exponent) + 1 ;
if (prothNumber == n)
return true ;
if (prothNumber > n)
break ;
}
}
return false ;
}
// Nikunj Sonigara
public static void main(String[] args) {
// Get n
long n = 25 ;
// Check n for Proth Number
if (isProthNumber(n - 1 ))
System.out.println( "YES" );
else
System.out.println( "NO" );
}
} |
# Utility function to check if a number is a power of two def isPowerOfTwo(n):
return n ! = 0 and (n & (n - 1 )) = = 0
# Function to check if a number is a Proth number using brute-force def isProthNumber(n):
if n < 3 :
return False
for k in range ( 1 , n + 1 ):
for exponent in range ( 0 , n + 1 ):
prothNumber = k * ( 1 << exponent) + 1
if prothNumber = = n:
return True
if prothNumber > n:
break
return False
# Nikunj Sonigara # Driver code n = 25
# Check n for Proth Number if isProthNumber(n - 1 ):
print ( "YES" )
else :
print ( "NO" )
|
using System;
class Program
{ // Utility function to check if a number is a power of two
static bool IsPowerOfTwo( int n)
{
return n != 0 && (n & (n - 1)) == 0;
}
// Function to check if a number is a Proth number using brute-force
static bool IsProthNumber( int n)
{
if (n < 3)
return false ;
for ( int k = 1; k <= n; k++)
{
for ( int exponent = 0; exponent <= n; exponent++)
{
int prothNumber = k * (1 << exponent) + 1;
if (prothNumber == n)
return true ;
if (prothNumber > n)
break ;
}
}
return false ;
}
static void Main( string [] args)
{
int n = 25;
// Check n for Proth Number
if (IsProthNumber(n - 1))
{
Console.WriteLine( "YES" );
}
else
{
Console.WriteLine( "NO" );
}
}
} |
// Utility function to check if a number is a power of two function isPowerOfTwo(n) {
return n !== 0 && (n & (n - 1)) === 0;
} // Function to check if a number is a Proth number using brute-force function isProthNumber(n) {
if (n < 3)
return false ;
for (let k = 1; k <= n; ++k) {
for (let exponent = 0; exponent <= n; ++exponent) {
const prothNumber = k * (1 << exponent) + 1;
if (prothNumber === n)
return true ;
if (prothNumber > n)
break ;
}
}
return false ;
} // Driver code const n = 25; // Check n for Proth Number if (isProthNumber(n - 1)) {
console.log( "YES" );
} else {
console.log( "NO" );
} |
YES
Time Complexity: O(N2)
Auxiliary Space: O(1)
Approach 2:
- Deduct 1 from the number. This would give a number in the form k*2n, if the given number is a proth number.
- Now, loop through all odd numbers starting form k=1 to n/k and check if k can divide n in such a way that ( n/k ) is a power of 2 or not.
- If found, print ‘YES’
- If no such value of k is found then Print ‘NO’
Below is the implementation of the above idea
// CPP program to check Proth number #include <bits/stdc++.h> using namespace std;
// Utility function to check power of two bool isPowerOfTwo( int n)
{ return (n && !(n & (n - 1)));
} // Function to check if the // Given number is Proth number or not bool isProthNumber( int n)
{ int k = 1;
while (k < (n / k)) {
// check if k divides n or not
if (n % k == 0) {
// Check if n/k is power of 2 or not
if (isPowerOfTwo(n / k))
return true ;
}
// update k to next odd number
k = k + 2;
}
// If we reach here means
// there exists no value of K
// Such that k is odd number
// and n/k is a power of 2 greater than k
return false ;
} // Driver code int main()
{ // Get n
int n = 25;
// Check n for Proth Number
if (isProthNumber(n - 1))
cout << "YES" ;
else
cout << "NO" ;
return 0;
} |
// Java program to check for Proth number class GFG {
// Utility function to check power of two
static boolean isPowerOfTwo( int n)
{
return n != 0 && ((n & (n - 1 )) == 0 );
}
// Function to check if the
// Given number is Proth number or not
static boolean isProthNumber( int n)
{
int k = 1 ;
while (k < (n / k)) {
// check if k divides n or not
if (n % k == 0 ) {
// Check if n/k is power of 2 or not
if (isPowerOfTwo(n / k))
return true ;
}
// update k to next odd number
k = k + 2 ;
}
// If we reach here means
// there exists no value of K
// Such that k is odd number
// and n/k is a power of 2 greater than k
return false ;
}
// Driver code
public static void main(String[] args)
{
// Get n
int n = 25 ;
// Check n for Proth Number
if (isProthNumber(n - 1 ))
System.out.println( "YES" );
else
System.out.println( "NO" );
}
} |
# Python3 program to check for Proth number # Utility function to Check # power of two def isPowerOfTwo(n):
return (n and ( not (n & (n - 1 ))))
# Function to check if the # Given number is Proth number or not def isProthNumber( n):
k = 1
while (k < (n / / k)):
# check if k divides n or not
if (n % k = = 0 ):
# Check if n / k is power of 2 or not
if (isPowerOfTwo(n / / k)):
return True
# update k to next odd number
k = k + 2 # If we reach here means
# there exists no value of K
# Such that k is odd number
# and n / k is a power of 2 greater than k
return False
# Driver code # Get n int n = 25 ;
# Check n for Proth Number if (isProthNumber(n - 1 )):
print ( "YES" );
else :
print ( "NO" );
|
// C# program to check Proth number using System;
class GFG {
// Utility function to check power of two
static bool isPowerOfTwo( int n)
{
return n != 0 && ((n & (n - 1)) == 0);
}
// Function to check if the
// Given number is Proth number or not
static bool isProthNumber( int n)
{
int k = 1;
while (k < (n / k)) {
// check if k divides n or not
if (n % k == 0) {
// Check if n/k is power of 2 or not
if (isPowerOfTwo(n / k))
return true ;
}
// update k to next odd number
k = k + 2;
}
// If we reach here means
// there exists no value of K
// Such that k is odd number
// and n/k is a power of 2 greater than k
return false ;
}
// Driver code
public static void Main()
{
// Get n
int n = 25;
// Check n for Proth Number
if (isProthNumber(n - 1))
Console.WriteLine( "YES" );
else
Console.WriteLine( "NO" );
}
} |
<script> // Javascript program to check Proth number // Utility function to check power of two function isPowerOfTwo(n)
{ return (n && !(n & (n - 1)));
} // Function to check if the // Given number is Proth number or not function isProthNumber(n)
{ let k = 1;
while (k < parseInt(n / k))
{
// Check if k divides n or not
if (n % k == 0)
{
// Check if n/k is power of 2 or not
if (isPowerOfTwo(parseInt(n / k)))
return true ;
}
// Update k to next odd number
k = k + 2;
}
// If we reach here means
// there exists no value of K
// Such that k is odd number
// and n/k is a power of 2 greater than k
return false ;
} // Driver code // Get n let n = 25; // Check n for Proth Number if (isProthNumber(n - 1))
document.write( "YES" );
else document.write( "NO" );
// This code is contributed by souravmahato348 </script> |
<?php // PHP program to check Proth number // Utility function to check // power of two function isPowerOfTwo( $n )
{ return ( $n && !( $n & ( $n - 1)));
} // Function to check if the // Given number is Proth // number or not function isProthNumber( $n )
{ $k = 1;
while ( $k < ( $n / $k ))
{
// check if k divides n or not
if ( $n % $k == 0)
{
// Check if n/k is power
// of 2 or not
if (isPowerOfTwo( $n / $k ))
return true;
}
// update k to next odd number
$k = $k + 2;
}
// If we reach here means
// there exists no value of K
// Such that k is odd number
// and n/k is a power of 2
// greater than k
return false;
} // Driver code // Get n $n = 25;
// Check n for Proth Number if (isProthNumber( $n - 1))
echo "YES" ;
else echo "NO" ;
// This code is contributed // by inder_verma ?> |
YES
Time Complexity: O(sqrt(n))
Auxiliary Space: O(1)