Pair of prime numbers with a given sum and minimum absolute difference

Given an integer ‘sum’ (less than 10^8), the task is to find a pair of prime numbers whose sum is equal to the given ‘sum’
Out of all the possible pairs, the absolute difference between the chosen pair must be minimum.
If the ‘sum’ cannot be represented as a sum of two prime numbers then print “Cannot be represented as sum of two primes”.

Examples:

Input : Sum = 1002
Output : Primes: 499 503
Explanation
1002 can be represented as sum of many prime number pairs
such as
499 503
479 523
461 541
439 563
433 569
431 571
409 593
401 601...
But 499 and 503 is the only pair which has minimum difference 

Input :Sum = 2002
Output : Primes: 983 1019

Solution



  • We will create a sieve of Eratosthenes which will store all the prime numbers and check whether a number is prime or not in O(1) time.
  • Now, to find two prime numbers with sum equal to the given variable, ‘sum’. We will start a loop from sum/2 to 1 (to minimize the absolute difference) and check whether the loop counter ‘i’ and ‘sum-i’ are both prime.
  • If they are prime then we will print them and break out of the loop.
  • If the ‘sum’ cannot be represented as a sum of two prime numbers then we will print “Cannot be represented as sum of two primes”.

Below is the implementation of the above solution:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
#define MAX 100000000
  
// stores whether a number is prime or not
bool prime[MAX + 1];
  
// create the sieve of eratosthenes
void SieveOfEratosthenes()
{
    // Create a boolean array "prime[0..n]" and initialize
    // all entries it as true. A value in prime[i] will
    // finally be false if i is Not a prime, else true.
    memset(prime, true, sizeof(prime));
  
    prime[1] = false;
  
    for (int p = 2; p * p <= MAX; p++) {
  
        // If prime[p] is not changed, then it is a prime
        if (prime[p] == true) {
  
            // Update all multiples of p as non-prime
            for (int i = p * 2; i <= MAX; i += p)
                prime[i] = false;
        }
    }
}
  
// find the two prime numbers with minimum
// difference and whose sum is equal to
// variable sum
void find_Prime(int sum)
{
  
    // start from sum/2 such that
    // difference between i and sum-i will be
    // minimum
    for (int i = sum / 2; i > 1; i--) {
  
        // if both 'i' and 'sum - i' are prime then print
        // them and break the loop
        if (prime[i] && prime[sum - i]) {
            cout << i << " " << (sum - i) << endl;
            return;
        }
    }
    // if there is no prime
    cout << "Cannot be represented as sum of two primes" << endl;
}
  
// Driver code
int main()
{
    // create the sieve
    SieveOfEratosthenes();
  
    int sum = 1002;
  
    // find the primes
    find_Prime(sum);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

//Java implementation of the above approach 
  
class GFG {
  
    static final int MAX = 100000000;
  
    // stores whether a number is prime or not 
    static boolean prime[] = new boolean[MAX + 1];
  
    // create the sieve of eratosthenes 
    static void SieveOfEratosthenes() {
        // Create a boolean array "prime[0..n]" and initialize 
        // all entries it as true. A value in prime[i] will 
        // finally be false if i is Not a prime, else true. 
        for (int i = 0; i < prime.length; i++) {
            prime[i] = true;
        }
        prime[1] = false;
  
        for (int p = 2; p * p <= MAX; p++) {
  
            // If prime[p] is not changed, then it is a prime 
            if (prime[p] == true) {
  
                // Update all multiples of p as non-prime 
                for (int i = p * 2; i <= MAX; i += p) {
                    prime[i] = false;
                }
            }
        }
    }
  
    // find the two prime numbers with minimum 
    // difference and whose sum is equal to 
    // variable sum 
    static void find_Prime(int sum) {
  
        // start from sum/2 such that 
        // difference between i and sum-i will be 
        // minimum 
        for (int i = sum / 2; i > 1; i--) {
  
            // if both 'i' and 'sum - i' are prime then print 
            // them and break the loop 
            if (prime[i] && prime[sum - i]) {
                System.out.println(i + " " + (sum - i));
                return;
            }
        }
        // if there is no prime 
        System.out.println("Cannot be represented as sum of two primes");
    }
    public static void main(String []args) {
        // create the sieve 
        SieveOfEratosthenes();
        int sum = 1002;
        // find the primes 
        find_Prime(sum);
    }
}
/*This code is contributed by 29AjayKumar*/

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 implementation of the above approach
from math import sqrt
  
# stores whether a number is prime or not
  
# create the sieve of eratosthenes
def SieveOfEratosthenes():
    MAX = 1000001
      
    # Create a boolean array "prime[0..n]" and 
    # initialize all entries it as true. A value 
    # in prime[i] will finally be false if i is 
    # Not a prime, else true.
    prime = [True for i in range(MAX + 1)]
  
    prime[1] = False
  
    for p in range(2, int(sqrt(MAX)) + 1, 1):
          
        # If prime[p] is not changed,
        # then it is a prime
        if (prime[p] == True):
              
            # Update all multiples of p 
            # as non-prime
            for i in range(p * 2, MAX + 1, p):
                prime[i] = False
  
    return prime
      
# find the two prime numbers with minimum
# difference and whose sum is equal to
# variable sum
def find_Prime(sum):
      
    # start from sum/2 such that difference 
    # between i and sum-i will be minimum
    # create the sieve
    prime = SieveOfEratosthenes()
    i = int(sum / 2)
    while(i > 1):
          
        # if both 'i' and 'sum - i' are prime
        # then print them and break the loop
        if (prime[i] and prime[sum - i]):
            print(i, (sum - i))
            return
              
        i -= 1
  
    # if there is no prime
    print("Cannot be represented as sum"
                         "of two primes")
  
# Driver code
if __name__ == '__main__':
  
    sum = 1002
  
    # find the primes
    find_Prime(sum)
  
# This code is contributed by
# Shashank_Sharma

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the 
// above approach 
class GFG 
{
  
static int MAX = 1000000;
  
// stores whether a number is
// prime or not 
static bool[] prime = new bool[MAX + 1];
  
// create the sieve of eratosthenes 
static void SieveOfEratosthenes() 
{
    // Create a boolean array "prime[0..n]" 
    // and initialize all entries it as true. 
    // A value in prime[i] will finally be
    // false if i is Not a prime, else true. 
    for (int i = 0; i < prime.Length; i++) 
    {
        prime[i] = true;
    }
    prime[1] = false;
  
    for (int p = 2; p * p <= MAX; p++) 
    {
  
        // If prime[p] is not changed, 
        // then it is a prime 
        if (prime[p] == true)
        {
  
            // Update all multiples of p 
            // as non-prime 
            for (int i = p * 2;
                     i <= MAX; i += p)
            {
                prime[i] = false;
            }
        }
    }
}
  
// find the two prime numbers with 
// minimum difference and whose sum 
// is equal to variable sum 
static void find_Prime(int sum) 
{
  
    // start from sum/2 such that 
    // difference between i and sum-i 
    // will be minimum 
    for (int i = sum / 2; i > 1; i--)
    {
  
        // if both 'i' and 'sum - i' 
        // are prime then print 
        // them and break the loop 
        if (prime[i] && prime[sum - i])
        {
            System.Console.WriteLine(i + " "
                                    (sum - i));
            return;
        }
    }
      
    // if there is no prime 
    System.Console.WriteLine("Cannot be represented " +    
                               "as sum of two primes");
}
  
// Driver Code
static void Main() 
{
    // create the sieve 
    SieveOfEratosthenes();
    int sum = 1002;
      
    // find the primes 
    find_Prime(sum);
}
}
  
// This code is contributed by mits

chevron_right


Output:

499 503


My Personal Notes arrow_drop_up

Second year Department of Information Technology Jadavpur University

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.