Skip to content
Related Articles

Related Articles

Improve Article

K distant prime pairs in a given range

  • Difficulty Level : Easy
  • Last Updated : 07 Jun, 2021
Geek Week

Given two integers L, R, and an integer K, the task is to print all the pairs of Prime Numbers from the given range whose difference is K.

Examples:

Input: L = 1, R = 19, K = 6
Output: (5, 11) (7, 13) (11, 17) (13, 19)
Explanation: The pairs of prime numbers with difference 6 are (5, 11), (7, 13), (11, 17), and (13, 19).

Input: L = 4, R = 13, K = 2
Output: (5, 7) (11, 13)
Explanation: The pairs of prime numbers with difference 2 are (5, 7) and (11, 13).

Naive Approach: The simplest approach is to generate all possible pairs having difference K from the given range and check if both the pair elements are Prime Numbers or not. If there exists such a pair, then print that pair. 



Time Complexity: O(sqrt((N))*(R – L + 1)2), where N is any number in the range [L, R].
Auxiliary Space: O(1)

Efficient Approach: To optimize the above approach, the idea is to use the Sieve of Eratosthenes to find all the prime numbers in the given range [L, R] and store it in an unordered_map M. Now, traverse through each value(say val) in the M and if (val + K) is also present in the map M, then print the pair.

Below is the implementation of the above approach:

C++




// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to generate prime numbers
// in the given range [L, R]
void findPrimeNos(int L, int R,
                  unordered_map<int,
                                int>& M)
{
    // Store all value in the range
    for (int i = L; i <= R; i++) {
        M[i]++;
    }
 
    // Erase 1 as its non-prime
    if (M.find(1) != M.end()) {
        M.erase(1);
    }
 
    // Perform Sieve of Eratosthenes
    for (int i = 2; i <= sqrt(R); i++) {
 
        int multiple = 2;
 
        while ((i * multiple) <= R) {
 
            // Find current multiple
            if (M.find(i * multiple)
                != M.end()) {
 
                // Erase as it is a
                // non-prime
                M.erase(i * multiple);
            }
 
            // Increment multiple
            multiple++;
        }
    }
}
 
// Function to print all the prime pairs
// in the given range that differs by K
void getPrimePairs(int L, int R, int K)
{
    unordered_map<int, int> M;
 
    // Generate all prime number
    findPrimeNos(L, R, M);
 
    // Traverse the Map M
    for (auto& it : M) {
 
        // If it.first & (it.first + K)
        // is prime then print this pair
        if (M.find(it.first + K)
            != M.end()) {
            cout << "(" << it.first
                 << ", "
                 << it.first + K
                 << ") ";
        }
    }
}
 
// Driver Code
int main()
{
    // Given range
    int L = 1, R = 19;
 
    // Given K
    int K = 6;
 
    // Function Call
    getPrimePairs(L, R, K);
 
    return 0;
}

Java




// Java program for the
// above approach
import java.util.*;
 
class solution{
 
// Function to generate prime
// numbers in the given range [L, R]
static void findPrimeNos(int L, int R,
                         Map<Integer,
                             Integer> M,
                         int K)
{
  // Store all value in the range
  for (int i = L; i <= R; i++)
  {
    if(M.get(i) != null)
      M.put(i, M.get(i) + 1);
    else
      M.put(i, 1);
  }
 
  // Erase 1 as its
  // non-prime
  if (M.get(1) != null)
  {
    M.remove(1);
  }
 
  // Perform Sieve of
  // Eratosthenes
  for (int i = 2;
           i <= Math.sqrt(R); i++)
  {
    int multiple = 2;
     
    while ((i * multiple) <= R)
    {
      // Find current multiple
      if (M.get(i * multiple) != null)
      {
        // Erase as it is a
        // non-prime
        M.remove(i * multiple);
      }
 
      // Increment multiple
      multiple++;
    }
  }
 
  // Traverse the Map M
  for (Map.Entry<Integer,
                 Integer> entry :
       M.entrySet()) 
  {
    // If it.first & (it.first + K)
    // is prime then print this pair
 
    if (M.get(entry.getKey() + K) != null)
    {
      System.out.print("(" + entry.getKey() +
                       ", " + (entry.getKey() +
                       K) + ") ");
    }
  }
}
 
// Function to print all
// the prime pairs in the
// given range that differs by K
static void getPrimePairs(int L,
                          int R, int K)
{
  Map<Integer,
      Integer> M = new HashMap<Integer,
                               Integer>(); 
 
  // Generate all prime number
  findPrimeNos(L, R, M, K);
}
 
// Driver Code
public static void main(String args[])
{
  // Given range
  int L = 1, R = 19;
 
  // Given K
  int K = 6;
 
  // Function Call
  getPrimePairs(L, R, K);
}
}
 
// This code is contributed by SURENDRA_GANGWAR

Python3




# Python3 program for the above approach
from math import sqrt
 
# Function to generate prime numbers
# in the given range [L, R]
def findPrimeNos(L, R, M):
     
    # Store all value in the range
    for i in range(L, R + 1):
        M[i] = M.get(i, 0) + 1
 
    # Erase 1 as its non-prime
    if (1 in M):
        M.pop(1)
 
    # Perform Sieve of Eratosthenes
    for i in range(2, int(sqrt(R)) + 1, 1):
        multiple = 2
 
        while ((i * multiple) <= R):
             
            # Find current multiple
            if ((i * multiple) in M):
                 
                # Erase as it is a
                # non-prime
                M.pop(i * multiple)
 
            # Increment multiple
            multiple += 1
 
# Function to print all the prime pairs
# in the given range that differs by K
def getPrimePairs(L, R, K):
     
    M = {}
 
    # Generate all prime number
    findPrimeNos(L, R, M)
 
    # Traverse the Map M
    for key, values in M.items():
         
        # If it.first & (it.first + K)
        # is prime then print this pair
        if ((key + K) in M):
            print("(", key, ",",
                  key + K, ")", end = " ")
 
# Driver Code
if __name__ == '__main__':
     
    # Given range
    L = 1
    R = 19
 
    # Given K
    K = 6
 
    # Function Call
    getPrimePairs(L, R, K)
 
# This code is contributed by bgangwar59

C#




// C# program for the
// above approach
using System;
using System.Collections.Generic;
class solution{
 
// Function to generate prime
// numbers in the given range [L, R]
static void findPrimeNos(int L, int R,
                         Dictionary<int,
                         int> M, int K)
{
  // Store all value in the range
  for (int i = L; i <= R; i++)
  {
      if(M.ContainsKey(i))
      M.Add(i, M[i] + 1);
    else
      M.Add(i, 1);
  }
 
  // Erase 1 as its
  // non-prime
  if (M[1] != 0)
  {
    M.Remove(1);
  }
 
  // Perform Sieve of
  // Eratosthenes
  for (int i = 2;
           i <= Math.Sqrt(R); i++)
  {
    int multiple = 2;
     
    while ((i * multiple) <= R)
    {
      // Find current multiple
      if (M.ContainsKey(i * multiple))
      {
        // Erase as it is a
        // non-prime
        M.Remove(i * multiple);
      }
 
      // Increment multiple
      multiple++;
    }
  }
 
  // Traverse the Map M
  foreach (KeyValuePair<int
                        int> entry in  M) 
  {
    // If it.first & (it.first + K)
    // is prime then print this pair
 
    if (M.ContainsKey(entry.Key + K))
    {
      Console.Write("(" + entry.Key +
                    ", " + (entry.Key +
                    K) + ") ");
    }
  }
}
 
// Function to print all
// the prime pairs in the
// given range that differs by K
static void getPrimePairs(int L,
                          int R, int K)
{
  Dictionary<int,
             int> M = new Dictionary<int,
                                     int>(); 
   
  // Generate all prime number
  findPrimeNos(L, R, M, K);
}
 
// Driver Code
public static void Main(String []args)
{
  // Given range
  int L = 1, R = 19;
 
  // Given K
  int K = 6;
 
  // Function Call
  getPrimePairs(L, R, K);
}
}
 
// This code is contributed by Amit Katiyar

Javascript




<script>
 
// Javascript program for the above approach
 
// Function to generate prime numbers
// in the given range [L, R]
function findPrimeNos(L, R, M)
{
     
    // Store all value in the range
    for(var i = L; i <= R; i++)
    {
        if (M.has(i))
            M.set(i, M.get(i) + 1)
        else
            M.set(i, 1)
    }
 
    // Erase 1 as its non-prime
    if (M.has(1))
    {
        M.delete(1);
    }
 
    // Perform Sieve of Eratosthenes
    for(var i = 2; i <= parseInt(Math.sqrt(R)); i++)
    {
        var multiple = 2;
 
        while ((i * multiple) <= R)
        {
             
            // Find current multiple
            if (M.has(i * multiple))
            {
                 
                // Erase as it is a
                // non-prime
                M.delete(i * multiple);
            }
 
            // Increment multiple
            multiple++;
        }
    }
    return M;
}
 
// Function to print all the prime pairs
// in the given range that differs by K
function getPrimePairs(L, R,  K)
{
    var M = new Map();
 
    // Generate all prime number
    M = findPrimeNos(L, R, M);
 
    // Traverse the Map M
    M.forEach((value, key) => {
         
        // If it.first & (it.first + K)
        // is prime then print this pair
        if (M.has(key + K))
        {
            document.write("(" + key + ", " +
                          (key + K) + ") ");
        }
    });
}
 
// Driver Code
 
// Given range
var L = 1, R = 19;
 
// Given K
var K = 6;
 
// Function Call
getPrimePairs(L, R, K);
 
// This code is contributed by rutvik_56
 
</script>
Output
(5, 11) (7, 13) (11, 17) (13, 19) 

Time Complexity: O(N*log*(log(N)) + sqrt(R – L)), where N = R – L + 1
Auxiliary Space: O(N)

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.




My Personal Notes arrow_drop_up
Recommended Articles
Page :