Given two numbers N and K. We need to find out if ‘N’ can be written as sum of ‘K’ prime numbers.
Given N <= 10^9
Examples :
Input : N = 10 K = 2 Output : Yes 10 can be written as 5 + 5 Input : N = 2 K = 2 Output : No
The idea is to use Goldbach’s conjecture which says that every even integer (greater than 2) can be expressed as sum of two primes.
If the N >= 2K and K = 1: the answer will be Yes if N is a prime number
If N >= 2K and K = 2: If N is an even number answer will be Yes(Goldbach’s conjecture) and if N is odd answer will be No if N-2 is not a prime number and Yes if N-2 is a prime number. This is because we know odd + odd = even and even + odd = odd. So when N is odd, and K = 2 one number must be 2 as it is the only even prime number so now the answer depends on whether N-2 is odd or not.
If N >= 2K and K >= 3: Answer will always be Yes. When N is even N – 2*(K-2) is also even so N – 2*(K – 2) can be written as sum of two prime numbers (Goldbach’s conjecture) p, q and N can be written as 2, 2 …..K – 2 times, p, q. When N is odd N – 3 -2*(K – 3) is even so it can be written as sum of two prime numbers p, q and N can be written as 2, 2 …..K-3 times, 3, p, q
// C++ implementation to check if N can be // written as sum of k primes #include<bits/stdc++.h> using namespace std;
// Checking if a number is prime or not bool isprime( int x)
{ // check for numbers from 2 to sqrt(x)
// if it is divisible return false
for ( int i = 2; i * i <= x; i++)
if (x % i == 0)
return false ;
return true ;
} // Returns true if N can be written as sum // of K primes bool isSumOfKprimes( int N, int K)
{ // N < 2K directly return false
if (N < 2*K)
return false ;
// If K = 1 return value depends on primality of N
if (K == 1)
return isprime(N);
if (K == 2)
{
// if N is even directly return true;
if (N % 2 == 0)
return true ;
// If N is odd, then one prime must
// be 2. All other primes are odd
// and cannot have a pair sum as even.
return isprime(N - 2);
}
// If K >= 3 return true;
return true ;
} // Driver function int main()
{ int n = 10, k = 2;
if (isSumOfKprimes (n, k))
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
} |
// Java implementation to check if N can be // written as sum of k primes public class Prime
{ // Checking if a number is prime or not
static boolean isprime( int x)
{
// check for numbers from 2 to sqrt(x)
// if it is divisible return false
for ( int i= 2 ; i*i<=x; i++)
if (x%i == 0 )
return false ;
return true ;
}
// Returns true if N can be written as sum
// of K primes
static boolean isSumOfKprimes( int N, int K)
{
// N < 2K directly return false
if (N < 2 *K)
return false ;
// If K = 1 return value depends on primality of N
if (K == 1 )
return isprime(N);
if (K == 2 )
{
// if N is even directly return true;
if (N% 2 == 0 )
return true ;
// If N is odd, then one prime must
// be 2. All other primes are odd
// and cannot have a pair sum as even.
return isprime(N - 2 );
}
// If K >= 3 return true;
return true ;
}
public static void main (String[] args)
{
int n = 10 , k = 2 ;
if (isSumOfKprimes (n, k))
System.out.print( "Yes" );
else
System.out.print( "No" );
}
} // Contributed by Saket Kumar |
# Python implementation to check # if N can be written as sum of # k primes # Checking if a number is prime # or not def isprime(x):
# check for numbers from 2
# to sqrt(x) if it is divisible
# return false
i = 2
while (i * i < = x):
if (x % i = = 0 ):
return 0
i + = 1
return 1
# Returns true if N can be written # as sum of K primes def isSumOfKprimes(N, K):
# N < 2K directly return false
if (N < 2 * K):
return 0
# If K = 1 return value depends
# on primality of N
if (K = = 1 ):
return isprime(N)
if (K = = 2 ):
# if N is even directly
# return true;
if (N % 2 = = 0 ):
return 1
# If N is odd, then one
# prime must be 2. All
# other primes are odd
# and cannot have a pair
# sum as even.
return isprime(N - 2 )
# If K >= 3 return true;
return 1
# Driver function n = 15
k = 2
if (isSumOfKprimes(n, k)):
print ( "Yes" )
else :
print ( "No" )
# This code is Contributed by Sam007. |
// C# implementation to check if N can be // written as sum of k primes using System;
class GFG {
// Checking if a number is prime or not
static bool isprime( int x)
{
// check for numbers from 2 to sqrt(x)
// if it is divisible return false
for ( int i = 2; i * i <= x; i++)
if (x % i == 0)
return false ;
return true ;
}
// Returns true if N can be written as sum
// of K primes
static bool isSumOfKprimes( int N, int K)
{
// N < 2K directly return false
if (N < 2 * K)
return false ;
// If K = 1 return value depends on primality of N
if (K == 1)
return isprime(N);
if (K == 2)
{
// if N is even directly return true;
if (N % 2 == 0)
return true ;
// If N is odd, then one prime must
// be 2. All other primes are odd
// and cannot have a pair sum as even.
return isprime(N - 2);
}
// If K >= 3 return true;
return true ;
}
// Driver function
public static void Main ()
{
int n = 10, k = 2;
if (isSumOfKprimes (n, k))
Console.Write( "Yes" );
else
Console.Write( "No" );
}
} // This code is contributed by Sam007 |
<?php // PHP implementation to check // if N can be written as sum // of k primes // Checking if a number // is prime or not function isprime( $x )
{ // check for numbers from 2
// to sqrt(x) if it is
// divisible return false
for ( $i = 2; $i * $i <= $x ; $i ++)
if ( $x % $i == 0)
return false;
return true;
} // Returns true if N can be // written as sum of K primes function isSumOfKprimes( $N , $K )
{ // N < 2K directly return false
if ( $N < 2 * $K )
return false;
// If K = 1 return value
// depends on primality of N
if ( $K == 1)
return isprime( $N );
if ( $K == 2)
{
// if N is even directly
// return true;
if ( $N % 2 == 0)
return true;
// If N is odd, then one prime
// must be 2. All other primes
// are odd and cannot have a
// pair sum as even.
return isprime( $N - 2);
}
// If K >= 3 return true;
return true;
} // Driver Code $n = 10; $k = 2;
if (isSumOfKprimes ( $n , $k ))
echo "Yes" ;
else echo "No" ;
// This code is contributed by vt ?> |
<script> // javascript implementation to check if N can be // written as sum of k primes // Checking if a number is prime or not
function isprime(x)
{
// check for numbers from 2 to sqrt(x)
// if it is divisible return false
for (i = 2; i * i <= x; i++)
if (x % i == 0)
return false ;
return true ;
}
// Returns true if N can be written as sum
// of K primes
function isSumOfKprimes(N, K)
{
// N < 2K directly return false
if (N < 2 * K)
return false ;
// If K = 1 return value depends on primality of N
if (K == 1)
return isprime(N);
if (K == 2)
{
// if N is even directly return true;
if (N % 2 == 0)
return true ;
// If N is odd, then one prime must
// be 2. All other primes are odd
// and cannot have a pair sum as even.
return isprime(N - 2);
}
// If K >= 3 return true;
return true ;
}
// Driver code
var n = 10, k = 2;
if (isSumOfKprimes(n, k))
document.write( "Yes" );
else
document.write( "No" );
// This code is contributed by gauravrajput1 </script> |
Output :
Yes
Time Complexity: O(sqrt(x))
Auxiliary Space: O(1)
This article is contributed by Ayush Jha