Find two distinct prime numbers with given product
Last Updated :
20 Aug, 2022
Given a number N (greater than 2 ). The task is to find two distinct prime numbers whose product will be equal to the given number. There may be several combinations possible. Print only first such pair.
If it is not possible to express N as a product of two distinct primes, print “Not Possible”.
Examples:
Input : N = 15
Output : 3, 5
3 and 5 are both primes and,
3*5 = 15
Input : N = 39
Output : 3, 13
3 and 13 are both primes and,
3*13 = 39
The idea is to find all the primes less than or equal to the given number N using Sieve of Eratosthenes. Once we have an array that tells all primes, we can traverse through this array to find a pair with a given product.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool SieveOfEratosthenes( int n, bool isPrime[])
{
isPrime[0] = isPrime[1] = false ;
for ( int i = 2; i <= n; i++)
isPrime[i] = true ;
for ( int p = 2; p * p <= n; p++) {
if (isPrime[p] == true ) {
for ( int i = p * 2; i <= n; i += p)
isPrime[i] = false ;
}
}
}
void findPrimePair( int n)
{
int flag = 0;
bool isPrime[n + 1];
SieveOfEratosthenes(n, isPrime);
for ( int i = 2; i < n; i++) {
int x = n / i;
if (isPrime[i] && isPrime[x] and x != i
and x * i == n) {
cout << i << " " << x;
flag = 1;
return ;
}
}
if (!flag)
cout << "No such pair found" ;
}
int main()
{
int n = 39;
findPrimePair(n);
return 0;
}
|
C
#include <stdio.h>
#include <stdbool.h>
bool SieveOfEratosthenes( int n, bool isPrime[])
{
isPrime[0] = isPrime[1] = false ;
for ( int i = 2; i <= n; i++)
isPrime[i] = true ;
for ( int p = 2; p * p <= n; p++) {
if (isPrime[p] == true ) {
for ( int i = p * 2; i <= n; i += p)
isPrime[i] = false ;
}
}
}
void findPrimePair( int n)
{
int flag = 0;
bool isPrime[n + 1];
SieveOfEratosthenes(n, isPrime);
for ( int i = 2; i < n; i++) {
int x = n / i;
if (isPrime[i] && isPrime[x] && x != i && x * i == n) {
printf ( "%d %d" ,i,x);
flag = 1;
return ;
}
}
if (!flag)
printf ( "No such pair found" );
}
int main()
{
int n = 39;
findPrimePair(n);
return 0;
}
|
Java
class GFG {
static void SieveOfEratosthenes( int n,
boolean isPrime[])
{
isPrime[ 0 ] = isPrime[ 1 ] = false ;
for ( int i = 2 ; i <= n; i++)
isPrime[i] = true ;
for ( int p = 2 ; p * p <= n; p++) {
if (isPrime[p] == true ) {
for ( int i = p * 2 ; i <= n; i += p)
isPrime[i] = false ;
}
}
}
static void findPrimePair( int n)
{
int flag = 0 ;
boolean [] isPrime = new boolean [n + 1 ];
SieveOfEratosthenes(n, isPrime);
for ( int i = 2 ; i < n; i++) {
int x = n / i;
if (isPrime[i] && isPrime[x] && x != i
&& x * i == n) {
System.out.println(i + " " + x);
flag = 1 ;
return ;
}
}
if (flag == 0 )
System.out.println( "No such pair found" );
}
public static void main(String[] args)
{
int n = 39 ;
findPrimePair(n);
}
}
|
Python3
from math import *
def SieveOfEratosthenes(n, isPrime) :
isPrime[ 0 ], isPrime[ 1 ] = False , False
for i in range ( 2 , n + 1 ) :
isPrime[i] = True
for p in range ( 2 , int (sqrt(n)) + 1 ) :
if isPrime[p] = = True :
for i in range (p * 2 , n + 1 , p) :
isPrime[i] = False
def findPrimePair(n) :
flag = 0
isPrime = [ False ] * (n + 1 )
SieveOfEratosthenes(n, isPrime)
for i in range ( 2 , n) :
x = int (n / i)
if (isPrime[i] & isPrime[x] and
x ! = i and x * i = = n) :
print (i, x)
flag = 1
break
if not flag :
print ( "No such pair found" )
if __name__ = = "__main__" :
n = 39 ;
findPrimePair(n)
|
C#
using System;
class GFG
{
static void SieveOfEratosthenes( int n,
bool [] isPrime)
{
isPrime[0] = isPrime[1] = false ;
for ( int i = 2; i <= n; i++)
isPrime[i] = true ;
for ( int p = 2; p * p <= n; p++)
{
if (isPrime[p] == true )
{
for ( int i = p * 2; i <= n; i += p)
isPrime[i] = false ;
}
}
}
static void findPrimePair( int n)
{
int flag = 0;
bool [] isPrime = new bool [n + 1];
SieveOfEratosthenes(n, isPrime);
for ( int i = 2; i < n; i++)
{
int x = n / i;
if (isPrime[i] && isPrime[x] &&
x != i && x * i == n)
{
Console.Write(i + " " + x);
flag = 1;
return ;
}
}
if (flag == 0)
Console.Write( "No such pair found" );
}
public static void Main()
{
int n = 39;
findPrimePair(n);
}
}
|
PHP
<?php
function SieveOfEratosthenes( $n , & $isPrime )
{
$isPrime [0] = false;
$isPrime [1] = false;
for ( $i = 2; $i <= $n ; $i ++)
$isPrime [ $i ] = true;
for ( $p = 2; $p * $p <= $n ; $p ++)
{
if ( $isPrime [ $p ])
{
for ( $i = $p * 2;
$i <= $n ; $i += $p )
$isPrime [ $i ] = false;
}
}
}
function findPrimePair( $n )
{
$flag = 0;
$isPrime = array_fill (0, ( $n + 1), false);
SieveOfEratosthenes( $n , $isPrime );
for ( $i = 2; $i < $n ; $i ++)
{
$x = (int)( $n / $i );
if ( $isPrime [ $i ] && $isPrime [ $x ] and
$x != $i and $x * $i == $n )
{
echo $i . " " . $x ;
$flag = 1;
return ;
}
}
if (! $flag )
echo "No such pair found" ;
}
$n = 39;
findPrimePair( $n );
?>
|
Javascript
<script>
function SieveOfEratosthenes(n, isPrime)
{
isPrime[0] = isPrime[1] = false ;
for ( var i = 2; i <= n; i++)
isPrime[i] = true ;
for ( var p = 2; p * p <= n; p++)
{
if (isPrime[p] == true )
{
for ( var i = p * 2; i <= n; i += p)
isPrime[i] = false ;
}
}
}
function findPrimePair(n)
{
var flag = 0;
var isPrime = []
SieveOfEratosthenes(n, isPrime);
for ( var i = 2; i < n; i++)
{
var x = n / i;
if (isPrime[i] && isPrime[x] &&
x != i && x * i == n)
{
document.write(i + " " + x);
flag = 1;
return ;
}
}
if (flag == 0)
document.write( "No such pair found" );
}
var n = 39;
findPrimePair(n);
</script>
|
Time Complexity: O(N*log log(N))
Auxiliary Space: O(N), since N extra space has been taken.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...