Smallest number which is not coprime with any element of an array
Last Updated :
11 May, 2021
Given an array arr[] size N, the task is to find the smallest number which is not co-prime with any element of the given array.
Examples:
Input: arr[] = {3, 4, 6, 7, 8, 9, 10}
Output: 42
Explanation: The prime factorization of array elements are:
3 = 3
4 = 2 * 2
6 = 2 * 3
7 = 7
8 = 2 * 2 * 2
9 = 3 * 3
10 = 2 * 5
Considering prime factors {2, 3, 7} to get the number X (= 2 * 3 * 7 = 42), which is not co-prime with any other array element.
Input: arr[] = {4, 3}
Output: 6
Explanation: The prime factorization of array elements are:
4 = 2 * 2
3 = 3
Considering prime factors {2, 3} to get the number X (= 2 * 3 = 6), which is not co-prime with any other array element.
Approach: The idea is based on the observation that the required number, say X, should not be co-prime with any array element arr[i]. There must exist some common factor, d ? 2 for each array element arr[i] which divides both arr[i] and X. The minimum d possible is a prime number. Hence, the idea is to consider the set of prime numbers such that their product is not co-prime with all array elements and find the minimum number possible. Follow the steps below to solve the problem:
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
#define MAX 50
bool isPrime(ll n)
{
if (n <= 1)
return false ;
if (n <= 3)
return true ;
if (n % 2 == 0 || n % 3 == 0)
return false ;
for (ll i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return false ;
return true ;
}
void findPrime(vector<ll>& primes)
{
for (ll i = 2; i <= MAX; i++) {
if (isPrime(i))
primes.push_back(i);
}
}
ll gcd(ll a, ll b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
void findMinimumNumber(ll arr[], ll N)
{
vector<ll> primes;
findPrime(primes);
ll ans = INT_MAX;
ll n = primes.size();
for (ll i = 1; i < (1 << n); i++) {
ll temp = 1;
for (ll j = 0; j < n; j++) {
if (i & (1 << j)) {
temp *= primes[j];
}
}
bool check = true ;
for (ll k = 0; k < N; k++) {
if (gcd(temp, arr[k]) == 1) {
check = false ;
break ;
}
}
if (check)
ans = min(ans, temp);
}
cout << ans;
}
int main()
{
ll arr[] = { 3, 4, 6, 7, 8, 9, 10 };
ll N = sizeof (arr) / sizeof (arr[0]);
findMinimumNumber(arr, N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static long MAX = 50 ;
static boolean isPrime( long n)
{
if (n <= 1 )
return false ;
if (n <= 3 )
return true ;
if (n % 2 == 0 || n % 3 == 0 )
return false ;
for ( long i = 5 ; i * i <= n; i = i + 6 )
if (n % i == 0 || n % (i + 2 ) == 0 )
return false ;
return true ;
}
static void findPrime(ArrayList<Long> primes)
{
for ( long i = 2 ; i <= MAX; i++)
{
if (isPrime(i))
primes.add(i);
}
}
static long gcd( long a, long b)
{
if (b == 0 )
return a;
else
return gcd(b, a % b);
}
static void findMinimumNumber( long []arr, long N)
{
ArrayList<Long> primes = new ArrayList<Long>();
findPrime(primes);
long ans = 2147483647 ;
int n = primes.size();
for ( int i = 1 ; i < ( 1 << n); i++)
{
long temp = 1 ;
for ( int j = 0 ; j < n; j++)
{
if ((i & ( 1 << j)) > 0 )
{
temp *= primes.get(j);
}
}
boolean check = true ;
for ( long k = 0 ; k < N; k++)
{
if (gcd(temp, arr[( int )k]) == 1l)
{
check = false ;
break ;
}
}
if (check == true )
ans = Math.min(ans, temp);
}
System.out.print(ans);
}
public static void main (String[] args)
{
long []arr = { 3 , 4 , 6 , 7 , 8 , 9 , 10 };
long N = arr.length;
findMinimumNumber(arr, N);
}
}
|
Python3
MAX = 50
import sys
from math import sqrt,gcd
def isPrime(n):
if (n < = 1 ):
return False
if (n < = 3 ):
return True
if (n % 2 = = 0 or n % 3 = = 0 ):
return False
for i in range ( 5 , int (sqrt(n)) + 1 , 6 ):
if (n % i = = 0 or n % (i + 2 ) = = 0 ):
return False
return True
def findPrime(primes):
global MAX
for i in range ( 2 , MAX + 1 , 1 ):
if (isPrime(i)):
primes.append(i)
def findMinimumNumber(arr, N):
primes = []
findPrime(primes)
ans = sys.maxsize
n = len (primes)
for i in range ( 1 , ( 1 << n), 1 ):
temp = 1
for j in range (n):
if (i & ( 1 << j)):
temp * = primes[j]
check = True
for k in range (N):
if (gcd(temp, arr[k]) = = 1 ):
check = False
break
if (check):
ans = min (ans, temp)
print (ans)
if __name__ = = '__main__' :
arr = [ 3 , 4 , 6 , 7 , 8 , 9 , 10 ]
N = len (arr)
findMinimumNumber(arr, N)
|
C#
using System;
using System.Collections.Generic;
class GFG{
static long MAX = 50;
static bool isPrime( long n)
{
if (n <= 1)
return false ;
if (n <= 3)
return true ;
if (n % 2 == 0 || n % 3 == 0)
return false ;
for ( long i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return false ;
return true ;
}
static void findPrime(List< long > primes)
{
for ( long i = 2; i <= MAX; i++)
{
if (isPrime(i))
primes.Add(i);
}
}
static long gcd( long a, long b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
static void findMinimumNumber( long []arr, long N)
{
List< long > primes = new List< long >();
findPrime(primes);
long ans = 2147483647;
int n = primes.Count;
for ( int i = 1; i < (1 << n); i++)
{
long temp = 1;
for ( int j = 0; j < n; j++)
{
if ((i & (1 << j)) > 0)
{
temp *= primes[j];
}
}
bool check = true ;
for ( long k = 0; k < N; k++)
{
if (gcd(temp, arr[k]) == 1)
{
check = false ;
break ;
}
}
if (check == true )
ans = Math.Min(ans, temp);
}
Console.Write(ans);
}
public static void Main()
{
long []arr = { 3, 4, 6, 7, 8, 9, 10 };
long N = arr.Length;
findMinimumNumber(arr, N);
}
}
|
Javascript
<script>
let MAX = 50
let primes = [];
function isPrime(n)
{
if (n <= 1)
return false ;
if (n <= 3)
return true ;
if (n % 2 == 0 || n % 3 == 0)
return false ;
for (let i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return false ;
return true ;
}
function findPrime()
{
for (let i = 2; i <= MAX; i++) {
if (isPrime(i))
primes.push(i);
}
}
function gcd(a, b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
function findMinimumNumber(arr, N)
{
findPrime();
let ans = Number.MAX_SAFE_INTEGER;
let n = primes.length;
for (let i = 1; i < (1 << n); i++) {
let temp = 1;
for (let j = 0; j < n; j++) {
if (i & (1 << j)) {
temp *= primes[j];
}
}
let check = true ;
for (let k = 0; k < N; k++) {
if (gcd(temp, arr[k]) == 1) {
check = false ;
break ;
}
}
if (check)
ans = Math.min(ans, temp);
}
document.write(ans);
}
let arr = [ 3, 4, 6, 7, 8, 9, 10 ];
let N = arr.length;
findMinimumNumber(arr, N);
</script>
|
Time Complexity: O(2M*N*log(X)), where M is the size of the array primes[] and X is the smallest element in the array arr[]
Auxiliary Space: O(M)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...