Count of unordered pairs of semi-prime numbers with prime sum in range [1, N]
Last Updated :
21 Jul, 2022
Given a positive integer N, the task is to find the number of unordered pairs of semi-prime numbers in the range [1, N] such that their sum is prime.
Examples:
Input: N = 25
Output: 5
Explanation:
The valid pairs of semi-prime numbers whose sum is also prime are (10, 21), (14, 15), (15, 22), (20, 21), and (21, 22). The count of such numbers is 5.
Input: N = 100
Output: 313
Approach: The given problem can be solved by using the Sieve of Eratosthenes. An array prime[] can be created where prime[i] stores the distinct prime factors of the number using the Sieve. All numbers in the range [1, N] with 2 distinct prime factors can be stored in a vector semiPrimes. Thereafter, iterate over all unordered pairs of the vector semiPrimes and maintain the count of pairs with prime sum.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000;
int prime[maxn] = {};
vector< int > semiPrimes( int N)
{
for ( int p = 2; p <= maxn; p++) {
if (prime[p] == 0) {
for ( int i = 2 * p; i <= maxn; i += p)
prime[i]++;
}
}
vector< int > sPrimes;
for ( int p = 2; p <= N; p++)
if (prime[p] == 2)
sPrimes.push_back(p);
return sPrimes;
}
int countPairs(vector< int > semiPrimes)
{
int cnt = 0;
for ( int i = 0;
i < semiPrimes.size(); i++) {
for ( int j = i + 1;
j < semiPrimes.size(); j++) {
if (prime[semiPrimes[i]
+ semiPrimes[j]]
== 0) {
cnt++;
}
}
}
return cnt;
}
int main()
{
int N = 100;
cout << countPairs(semiPrimes(N));
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int maxn = 100000 ;
static int [] prime = new int [maxn + 1 ];
static ArrayList<Integer> semiPrimes( int N)
{
for ( int p = 2 ; p <= maxn; p++) {
if (prime[p] == 0 ) {
for ( int i = 2 * p; i <= maxn; i += p)
prime[i]++;
}
}
ArrayList<Integer> sPrimes
= new ArrayList<Integer>();
for ( int p = 2 ; p <= N; p++)
if (prime[p] == 2 )
sPrimes.add(p);
return sPrimes;
}
static int countPairs(ArrayList<Integer> semiPrimes)
{
int cnt = 0 ;
for ( int i = 0 ; i < semiPrimes.size(); i++) {
for ( int j = i + 1 ; j < semiPrimes.size(); j++) {
if (prime[semiPrimes.get(i) + semiPrimes.get(j)] == 0 ) {
cnt++;
}
}
}
return cnt;
}
public static void main(String[] args)
{
int N = 100 ;
System.out.print(countPairs(semiPrimes(N)));
}
}
|
Python3
maxn = 100000
prime = [ 0 for _ in range (maxn)]
def semiPrimes(N):
for p in range ( 2 , maxn):
if (prime[p] = = 0 ):
for i in range ( 2 * p, maxn, p):
prime[i] + = 1
sPrimes = []
for p in range ( 2 , N + 1 ):
if (prime[p] = = 2 ):
sPrimes.append(p)
return sPrimes
def countPairs(semiPrimes):
cnt = 0
for i in range ( 0 , len (semiPrimes)):
for j in range (i + 1 , len (semiPrimes)):
if (prime[semiPrimes[i] + semiPrimes[j]] = = 0 ):
cnt + = 1
return cnt
if __name__ = = "__main__" :
N = 100
print (countPairs(semiPrimes(N)))
|
C#
using System;
using System.Collections.Generic;
class GFG {
const int maxn = 100000;
static int [] prime = new int [maxn + 1];
static List< int > semiPrimes( int N)
{
for ( int p = 2; p <= maxn; p++) {
if (prime[p] == 0) {
for ( int i = 2 * p; i <= maxn; i += p)
prime[i]++;
}
}
List< int > sPrimes = new List< int >();
for ( int p = 2; p <= N; p++)
if (prime[p] == 2)
sPrimes.Add(p);
return sPrimes;
}
static int countPairs(List< int > semiPrimes)
{
int cnt = 0;
for ( int i = 0; i < semiPrimes.Count; i++) {
for ( int j = i + 1; j < semiPrimes.Count; j++) {
if (prime[semiPrimes[i] + semiPrimes[j]]
== 0) {
cnt++;
}
}
}
return cnt;
}
public static void Main()
{
int N = 100;
Console.WriteLine(countPairs(semiPrimes(N)));
}
}
|
Javascript
<script>
const maxn = 100000;
let prime = new Array(maxn).fill(0);
function semiPrimes(N) {
for (let p = 2; p <= maxn; p++) {
if (prime[p] == 0) {
for (let i = 2 * p; i <= maxn; i += p)
prime[i]++;
}
}
let sPrimes = [];
for (let p = 2; p <= N; p++)
if (prime[p] == 2)
sPrimes.push(p);
return sPrimes;
}
function countPairs(semiPrimes) {
let cnt = 0;
for (let i = 0;
i < semiPrimes.length; i++) {
for (let j = i + 1;
j < semiPrimes.length; j++) {
if (prime[semiPrimes[i]
+ semiPrimes[j]]
== 0) {
cnt++;
}
}
}
return cnt;
}
let N = 100;
document.write(countPairs(semiPrimes(N)));
</script>
|
Time Complexity: O(N2)
Auxiliary Space: O(N)
Share your thoughts in the comments
Please Login to comment...