Related Articles

Related Articles

K distant prime pairs in a given range
  • Last Updated : 05 Nov, 2020

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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


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 DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up
Recommended Articles
Page :