Related Articles

# K distant prime pairs in a given range

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

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 ``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 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 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 M = ``new` `HashMap(); ` `  ``// 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 != 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

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