K distant prime pairs in a given range
Last Updated :
18 Jan, 2023
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.
C++
#include <bits/stdc++.h>
using namespace std;
bool isPrime( int N)
{
for ( int i = 2; i <= sqrt (N); i++) {
if (N % i == 0)
return false ;
}
return true ;
}
void getPrimePairs( int L, int R, int K)
{
int count = 0;
for ( int i = L; i <= R; i++) {
if (isPrime(i) && isPrime(i + K)) {
count++;
}
}
cout << count << endl;
}
int main()
{
int L = 4, R = 13;
int K = 2;
getPrimePairs(L, R, K);
return 0;
}
|
Java
import java.util.*;
class Main
{
public static boolean isPrime( int N)
{
for ( int i = 2 ; i <= Math.sqrt(N); i++) {
if (N % i == 0 )
return false ;
}
return true ;
}
public static void getPrimePairs( int L, int R, int K)
{
int count = 0 ;
for ( int i = L; i <= R; i++) {
if (isPrime(i) && isPrime(i + K)) {
count++;
}
}
System.out.println(count);
}
public static void main(String[] args)
{
int L = 4 , R = 13 ;
int K = 2 ;
getPrimePairs(L, R, K);
}
}
|
Python3
import math
def isPrime(N):
for i in range ( 2 , math.floor(math.sqrt(N)) + 1 ):
if (N % i = = 0 ):
return False ;
return True ;
def getPrimePairs(L, R, K):
count = 0 ;
for i in range (L, R + 1 ):
if (isPrime(i) and isPrime(i + K)):
count + = 1 ;
print (count);
L = 4 ;
R = 13 ;
K = 2 ;
getPrimePairs(L, R, K);
|
C#
using System;
class GFG
{
public static bool IsPrime( int N)
{
for ( int i = 2; i <= Math.Sqrt(N); i++) {
if (N % i == 0)
return false ;
}
return true ;
}
public static void GetPrimePairs( int L, int R, int K)
{
int count = 0;
for ( int i = L; i <= R; i++) {
if (IsPrime(i) && IsPrime(i + K)) {
count++;
}
}
Console.WriteLine(count);
}
public static void Main( string [] args)
{
int L = 4, R = 13;
int K = 2;
GetPrimePairs(L, R, K);
}
}
|
Javascript
function isPrime(N)
{
for (let i = 2; i <= Math.sqrt(N); i++) {
if (N % i == 0)
return false ;
}
return true ;
}
function getPrimePairs(L, R, K)
{
let count = 0;
for (let i = L; i <= R; i++) {
if (isPrime(i) && isPrime(i + K)) {
count++;
}
}
console.log(count);
}
let L = 4, R = 13;
let K = 2;
getPrimePairs(L, R, K);
|
Time Complexity: O(sqrt((N))*(R – L + 1)), 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++
#include <bits/stdc++.h>
using namespace std;
void findPrimeNos( int L, int R,
unordered_map< int ,
int >& M)
{
for ( int i = L; i <= R; i++) {
M[i]++;
}
if (M.find(1) != M.end()) {
M.erase(1);
}
for ( int i = 2; i <= sqrt (R); i++) {
int multiple = 2;
while ((i * multiple) <= R) {
if (M.find(i * multiple)
!= M.end()) {
M.erase(i * multiple);
}
multiple++;
}
}
}
void getPrimePairs( int L, int R, int K)
{
unordered_map< int , int > M;
findPrimeNos(L, R, M);
for ( auto & it : M) {
if (M.find(it.first + K)
!= M.end()) {
cout << "(" << it.first
<< ", "
<< it.first + K
<< ") " ;
}
}
}
int main()
{
int L = 1, R = 19;
int K = 6;
getPrimePairs(L, R, K);
return 0;
}
|
Java
import java.util.*;
class solution{
static void findPrimeNos( int L, int R,
Map<Integer,
Integer> M,
int K)
{
for ( int i = L; i <= R; i++)
{
if (M.get(i) != null )
M.put(i, M.get(i) + 1 );
else
M.put(i, 1 );
}
if (M.get( 1 ) != null )
{
M.remove( 1 );
}
for ( int i = 2 ;
i <= Math.sqrt(R); i++)
{
int multiple = 2 ;
while ((i * multiple) <= R)
{
if (M.get(i * multiple) != null )
{
M.remove(i * multiple);
}
multiple++;
}
}
for (Map.Entry<Integer,
Integer> entry :
M.entrySet())
{
if (M.get(entry.getKey() + K) != null )
{
System.out.print( "(" + entry.getKey() +
", " + (entry.getKey() +
K) + ") " );
}
}
}
static void getPrimePairs( int L,
int R, int K)
{
Map<Integer,
Integer> M = new HashMap<Integer,
Integer>();
findPrimeNos(L, R, M, K);
}
public static void main(String args[])
{
int L = 1 , R = 19 ;
int K = 6 ;
getPrimePairs(L, R, K);
}
}
|
Python3
from math import sqrt
def findPrimeNos(L, R, M):
for i in range (L, R + 1 ):
M[i] = M.get(i, 0 ) + 1
if ( 1 in M):
M.pop( 1 )
for i in range ( 2 , int (sqrt(R)) + 1 , 1 ):
multiple = 2
while ((i * multiple) < = R):
if ((i * multiple) in M):
M.pop(i * multiple)
multiple + = 1
def getPrimePairs(L, R, K):
M = {}
findPrimeNos(L, R, M)
for key, values in M.items():
if ((key + K) in M):
print ( "(" , key, "," ,
key + K, ")" , end = " " )
if __name__ = = '__main__' :
L = 1
R = 19
K = 6
getPrimePairs(L, R, K)
|
C#
using System;
using System.Collections.Generic;
class solution{
static void findPrimeNos( int L, int R,
Dictionary< int ,
int > M, int K)
{
for ( int i = L; i <= R; i++)
{
if (M.ContainsKey(i))
M.Add(i, M[i] + 1);
else
M.Add(i, 1);
}
if (M[1] != 0)
{
M.Remove(1);
}
for ( int i = 2;
i <= Math.Sqrt(R); i++)
{
int multiple = 2;
while ((i * multiple) <= R)
{
if (M.ContainsKey(i * multiple))
{
M.Remove(i * multiple);
}
multiple++;
}
}
foreach (KeyValuePair< int ,
int > entry in M)
{
if (M.ContainsKey(entry.Key + K))
{
Console.Write( "(" + entry.Key +
", " + (entry.Key +
K) + ") " );
}
}
}
static void getPrimePairs( int L,
int R, int K)
{
Dictionary< int ,
int > M = new Dictionary< int ,
int >();
findPrimeNos(L, R, M, K);
}
public static void Main(String []args)
{
int L = 1, R = 19;
int K = 6;
getPrimePairs(L, R, K);
}
}
|
Javascript
<script>
function findPrimeNos(L, R, M)
{
for ( var i = L; i <= R; i++)
{
if (M.has(i))
M.set(i, M.get(i) + 1)
else
M.set(i, 1)
}
if (M.has(1))
{
M. delete (1);
}
for ( var i = 2; i <= parseInt(Math.sqrt(R)); i++)
{
var multiple = 2;
while ((i * multiple) <= R)
{
if (M.has(i * multiple))
{
M. delete (i * multiple);
}
multiple++;
}
}
return M;
}
function getPrimePairs(L, R, K)
{
var M = new Map();
M = findPrimeNos(L, R, M);
M.forEach((value, key) => {
if (M.has(key + K))
{
document.write( "(" + key + ", " +
(key + K) + ") " );
}
});
}
var L = 1, R = 19;
var K = 6;
getPrimePairs(L, R, K);
</script>
|
Output
(13, 19) (11, 17) (5, 11) (7, 13)
Time Complexity: O(N*log*(log(N)) + sqrt(R – L)), where N = R – L + 1
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...