Open In App

Check if an integer can be expressed as a sum of two semi-primes

Last Updated : 16 Feb, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

Given a positive integer N, check if it can be expressed as a sum of two semi-primes or not.
Semi-primes A number is said to be a semi-prime if it can be expressed as product of two primes number ( not necessarily distinct ).
Semi-primes in the range 1 -100 are: 
 

4, 6, 9, 10, 14, 15, 21, 22, 25, 26, 33, 34, 35, 38, 39, 46, 49, 51, 55, 57, 58, 62, 65, 69, 74, 77, 82, 85, 86, 87, 91, 93, 94, 95. 
 


Examples: 
 

Input : N = 30
Output: YES
Explanation: 30 can be expressed as '15 + 15' 
15 is semi-primes as 15 is a product of two primes 3 and 5.

Input : N = 45
Output : YES
Explanation: 45 can be expressed as '35 + 10'
35 and 10 are also  semi-primes as it can a be expressed 
as product of two primes:
       35 = 5 * 7
       10 = 2 * 5   


 


Prerequisite
 


A Simple Solution is to traverse from i=1 to N     and check if i and N-i are semi-primes or not. If yes, print i and n-i.
An Efficient Solution is to pre-compute semi-primes in an array up to the given range and then traverse the semi-prime array and check if n-arr[i] is semi-prime or not. As, arr[i] is already a semi-prime if n-arr[i] is also a semi-prime, then n can be expressed as sum of two semi-primes.
Below is the implementation of above approach: 
 

C++

// CPP Code to check if an integer
// can be expressed as sum of
// two semi-primes
 
#include <bits/stdc++.h>
using namespace std;
#define MAX 1000000
 
vector<int> arr;
bool sprime[MAX];
 
// Utility function to compute
// semi-primes in a range
void computeSemiPrime()
{
    memset(sprime, false, sizeof(sprime));
 
    for (int i = 2; i < MAX; i++) {
 
        int cnt = 0;
        int num = i;
        for (int j = 2; cnt < 2 && j * j <= num; ++j) {
            while (num % j == 0) {
                num /= j, ++cnt; // Increment count
                // of prime numbers
            }
        }
 
        // If number is greater than 1, add it to
        // the count variable as it indicates the
        // number remain is prime number
 
        if (num > 1)
            ++cnt;
 
        // if count is equal to '2' then
        // number is semi-prime
 
        if (cnt == 2) {
 
            sprime[i] = true;
            arr.push_back(i);
        }
    }
}
 
// Utility function to check
// if a number sum of two
// semi-primes
bool checkSemiPrime(int n)
{
    int i = 0;
 
    while (arr[i] <= n / 2) {
 
        // arr[i] is already a semi-prime
        // if n-arr[i] is also a semi-prime
        // then we a number can be expressed as
        // sum of two semi-primes
 
        if (sprime[n - arr[i]]) {
            return true;
        }
 
        i++;
    }
 
    return false;
}
 
// Driver code
int main()
{
    computeSemiPrime();
 
    int n = 30;
    if (checkSemiPrime(n))
        cout << "YES";
    else
        cout << "NO";
 
    return 0;
}

                    

Java

// Java Code to check if an integer
// can be expressed as sum of
// two semi-primes
 
import java.util.*;
 
class GFG {
 
    static final int MAX = 1000000;
    static Vector<Integer> arr = new Vector<>();
    static boolean[] sprime = new boolean[MAX];
 
    // Utility function to compute
    // semi-primes in a range
    static void computeSemiPrime()
    {
 
        for (int i = 0; i < MAX; i++)
            sprime[i] = false;
 
        for (int i = 2; i < MAX; i++) {
 
            int cnt = 0;
            int num = i;
            for (int j = 2; cnt < 2 && j * j <= num; ++j) {
                while (num % j == 0) {
                    num /= j;
                    ++cnt;
                    // Increment count
                    // of prime numbers
                }
            }
 
            // If number is greater than 1, add it to
            // the count variable as it indicates the
            // number remain is prime number
 
            if (num > 1)
                ++cnt;
 
            // if count is equal to '2' then
            // number is semi-prime
 
            if (cnt == 2) {
 
                sprime[i] = true;
                arr.add(i);
            }
        }
    }
 
    // Utility function to check
    // if a number is sum of two
    // semi-primes
    static boolean checkSemiPrime(int n)
    {
        int i = 0;
 
        while (arr.get(i) <= n / 2) {
 
            // arr[i] is already a semi-prime
            // if n-arr[i] is also a semi-prime
            // then  a number can be expressed as
            // sum of two semi-primes
 
            if (sprime[n - arr.get(i)]) {
                return true;
            }
 
            i++;
        }
 
        return false;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        computeSemiPrime();
 
        int n = 30;
        if (checkSemiPrime(n))
            System.out.println("YES");
        else
            System.out.println("NO");
    }
}

                    

Python3

# Python3 Code to check if an integer can
# be expressed as sum of two semi-primes
MAX = 10000
 
arr = []
sprime = [False] * (MAX)
 
# Utility function to compute
# semi-primes in a range
def computeSemiPrime():
 
    for i in range(2, MAX):
 
        cnt, num, j = 0, i, 2
        while cnt < 2 and j * j <= num:
            while num % j == 0:
                num /= j
                 
                # Increment count of prime numbers
                cnt += 1
                 
            j += 1
 
        # If number is greater than 1, add it
        # to the count variable as it indicates
        # the number remain is prime number
        if num > 1:
            cnt += 1
 
        # if count is equal to '2' then
        # number is semi-prime
        if cnt == 2:
 
            sprime[i] = True
            arr.append(i)
 
# Utility function to check
# if a number sum of two
# semi-primes
def checkSemiPrime(n):
 
    i = 0
    while arr[i] <= n // 2:
 
        # arr[i] is already a semi-prime
        # if n-arr[i] is also a semi-prime
        # then a number can be expressed as
        # sum of two semi-primes
        if sprime[n - arr[i]] == True:
            return True
 
        i += 1
     
    return False
 
# Driver code
if __name__ == "__main__":
 
    computeSemiPrime()
 
    n = 30
    if checkSemiPrime(n) == True:
        print("YES")
    else:
        print("NO")
 
# This code is contributed by
# Rituraj Jain

                    

C#

// C# Code to check if an integer
// can be expressed as sum of
// two semi-primes
using System.Collections.Generic;
 
class GFG
{
 
static int MAX = 1000000;
static List<int> arr = new List<int>();
static bool[] sprime = new bool[MAX];
 
// Utility function to compute
// semi-primes in a range
static void computeSemiPrime()
{
 
    for (int i = 0; i < MAX; i++)
        sprime[i] = false;
 
    for (int i = 2; i < MAX; i++)
    {
 
        int cnt = 0;
        int num = i;
        for (int j = 2; cnt < 2 && j * j <= num; ++j)
        {
            while (num % j == 0)
            {
                num /= j;
                ++cnt;
                 
                // Increment count
                // of prime numbers
            }
        }
 
        // If number is greater than 1, add it to
        // the count variable as it indicates the
        // number remain is prime number
        if (num > 1)
            ++cnt;
 
        // if count is equal to '2' then
        // number is semi-prime
 
        if (cnt == 2)
        {
            sprime[i] = true;
            arr.Add(i);
        }
    }
}
 
// Utility function to check
// if a number is sum of two
// semi-primes
static bool checkSemiPrime(int n)
{
    int i = 0;
 
    while (arr[i] <= n / 2)
    {
 
        // arr[i] is already a semi-prime
        // if n-arr[i] is also a semi-prime
        // then a number can be expressed as
        // sum of two semi-primes
 
        if (sprime[n - arr[i]])
        {
            return true;
        }
 
        i++;
    }
 
    return false;
}
 
// Driver code
public static void Main()
{
    computeSemiPrime();
 
    int n = 30;
    if (checkSemiPrime(n))
        System.Console.WriteLine("YES");
    else
        System.Console.WriteLine("NO");
}
}
 
// This code is contributed by mits

                    

Javascript

<script>
 
// Javascript Code to check if an integer
// can be expressed as sum of
// two semi-primes
 
var MAX = 1000000;
 
var arr = [];
var sprime = Array(MAX).fill(false);
 
// Utility function to compute
// semi-primes in a range
function computeSemiPrime()
{
 
    for (var i = 2; i < MAX; i++) {
 
        var cnt = 0;
        var num = i;
        for (var j = 2; cnt < 2 && j * j <= num; ++j) {
            while (num % j == 0) {
                num /= j, ++cnt; // Increment count
                // of prime numbers
            }
        }
 
        // If number is greater than 1, add it to
        // the count variable as it indicates the
        // number remain is prime number
 
        if (num > 1)
            ++cnt;
 
        // if count is equal to '2' then
        // number is semi-prime
 
        if (cnt == 2) {
 
            sprime[i] = true;
            arr.push(i);
        }
    }
}
 
// Utility function to check
// if a number sum of two
// semi-primes
function checkSemiPrime(n)
{
    var i = 0;
 
    while (arr[i] <= parseInt(n / 2)) {
 
        // arr[i] is already a semi-prime
        // if n-arr[i] is also a semi-prime
        // then we a number can be expressed as
        // sum of two semi-primes
 
        if (sprime[n - arr[i]]) {
            return true;
        }
 
        i++;
    }
 
    return false;
}
 
// Driver code
 
computeSemiPrime();
var n = 30;
if (checkSemiPrime(n))
    document.write( "YES");
else
    document.write( "NO");
 
// This code is contributed by itsok.
</script>

                    

Output: 
YES

 

Time Complexity: O(MAX*log(log(MAX))) 

Auxiliary Space: O(MAX)



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads