Skip to content
Related Articles

Related Articles

Improve Article

GCD of elements which occur prime number of times

  • Last Updated : 13 May, 2021
Geek Week

Given an array arr[] of N elements, the task is to find the GCD of the elements which have prime frequencies in the array. Note that 1 is neither prime nor composite.
Examples: 
 

Input: arr[] = {5, 4, 6, 5, 4, 6} 
Output:
All the elements appear 2 times which is a prime 
So, gcd(5, 4, 6) = 1
Input: arr[] = {4, 8, 8, 1, 4, 3, 0} 
Output:
 

 

Approach: 
 

  • Traverse the array and store the frequencies of all the elements in a map.
  • Build Sieve of Eratosthenes which will be used to test the primality of a number in O(1) time.
  • Calculate the gcd of elements having prime frequency using the Sieve array calculated in the previous step.

Below is the implementation of the above approach: 
 



C++




// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to create Sieve to check primes
void SieveOfEratosthenes(bool prime[], int p_size)
{
    // False here indicates
    // that it is not prime
    prime[0] = false;
    prime[1] = false;
 
    for (int p = 2; p * p <= p_size; p++) {
 
        // If prime[p] is not changed,
        // then it is a prime
        if (prime[p]) {
 
            // Update all multiples of p,
            // set them to non-prime
            for (int i = p * 2; i <= p_size; i += p)
                prime[i] = false;
        }
    }
}
 
// Function to return the GCD of elements
// in an array having prime frequency
int gcdPrimeFreq(int arr[], int n)
{
    bool prime[n + 1];
    memset(prime, true, sizeof(prime));
 
    SieveOfEratosthenes(prime, n + 1);
 
    int i, j;
 
    // Map is used to store
    // element frequencies
    unordered_map<int, int> m;
    for (i = 0; i < n; i++)
        m[arr[i]]++;
 
    int gcd = 0;
 
    // Traverse the map using iterators
    for (auto it = m.begin(); it != m.end(); it++) {
 
        // Count the number of elements
        // having prime frequencies
        if (prime[it->second]) {
            gcd = __gcd(gcd, it->first);
        }
    }
 
    return gcd;
}
 
// Driver code
int main()
{
    int arr[] = { 5, 4, 6, 5, 4, 6 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    cout << gcdPrimeFreq(arr, n);
 
    return 0;
}

Java




// Java implementation of the approach
import java.util.*;
     
class GFG
{
     
// Function to create Sieve to check primes
static void SieveOfEratosthenes(boolean prime[],
                                int p_size)
{
    // False here indicates
    // that it is not prime
    prime[0] = false;
    prime[1] = false;
 
    for (int p = 2; p * p <= p_size; p++)
    {
 
        // If prime[p] is not changed,
        // then it is a prime
        if (prime[p])
        {
 
            // Update all multiples of p,
            // set them to non-prime
            for (int i = p * 2;
                     i <= p_size; i += p)
                prime[i] = false;
        }
    }
}
 
// Function to return the GCD of elements
// in an array having prime frequency
static int gcdPrimeFreq(int arr[], int n)
{
    boolean []prime = new boolean[n + 1];
    for (int i = 0; i < n + 1; i++)
        prime[i] = true;
 
    SieveOfEratosthenes(prime, n + 1);
 
    int i, j;
 
    // Map is used to store
    // element frequencies
    HashMap<Integer,
            Integer> mp = new HashMap<Integer,
                                      Integer>();
 
    for (i = 0 ; i < n; i++)
    {
        if(mp.containsKey(arr[i]))
        {
            mp.put(arr[i], mp.get(arr[i]) + 1);
        }
        else
        {
            mp.put(arr[i], 1);
        }
    }
    int gcd = 0;
 
    // Traverse the map using iterators
    for (Map.Entry<Integer,
                   Integer> it : mp.entrySet())
    {
 
        // Count the number of elements
        // having prime frequencies
        if (prime[it.getValue()])
        {
            gcd = __gcd(gcd, it.getKey());
        }
    }
    return gcd;
}
static int __gcd(int a, int b)
{
    if (b == 0)
        return a;
    return __gcd(b, a % b);
     
}
 
// Driver code
static public void main ( String []arg)
{
    int arr[] = { 5, 4, 6, 5, 4, 6 };
    int n = arr.length;
 
    System.out.println(gcdPrimeFreq(arr, n));
}
}
 
// This code is contributed by Rajput-Ji

Python3




# Python3 implementation of the approach
from math import sqrt, gcd
 
# Function to create Sieve to check primes
def SieveOfEratosthenes(prime, p_size) :
 
    # False here indicates
    # that it is not prime
    prime[0] = False;
    prime[1] = False;
 
    for p in range(2, int(sqrt(p_size)) + 1) :
 
        # If prime[p] is not changed,
        # then it is a prime
        if (prime[p]) :
 
            # Update all multiples of p,
            # set them to non-prime
            for i in range(2 * p, p_size, p) :
                prime[i] = False;
 
# Function to return the GCD of elements
# in an array having prime frequency
def gcdPrimeFreq(arr, n) :
 
    prime = [True] * (n + 1);
 
    SieveOfEratosthenes(prime, n + 1);
     
    # Map is used to store
    # element frequencies
    m = dict.fromkeys(arr, 0);
     
    for i in range(n) :
        m[arr[i]] += 1;
 
    __gcd = 0;
 
    # Traverse the map using iterators
    for key,value in m.items() :
 
        # Count the number of elements
        # having prime frequencies
        if (prime[value]) :
            __gcd = gcd(__gcd, key);
     
    return __gcd;
 
# Driver code
if __name__ == "__main__" :
 
    arr = [ 5, 4, 6, 5, 4, 6 ];
    n = len(arr);
 
    print(gcdPrimeFreq(arr, n));
 
# This code is contributed by AnkitRai01

C#




// C# implementation of the approach
using System;
using System.Collections.Generic;    
 
class GFG
{
     
// Function to create Sieve to check primes
static void SieveOfEratosthenes(bool []prime,
                                int p_size)
{
    // False here indicates
    // that it is not prime
    prime[0] = false;
    prime[1] = false;
 
    for (int p = 2; p * p <= p_size; p++)
    {
 
        // If prime[p] is not changed,
        // then it is a prime
        if (prime[p])
        {
 
            // Update all multiples of p,
            // set them to non-prime
            for (int i = p * 2;
                     i <= p_size; i += p)
                prime[i] = false;
        }
    }
}
 
// Function to return the GCD of elements
// in an array having prime frequency
static int gcdPrimeFreq(int []arr, int n)
{
    int i;
    bool []prime = new bool[n + 1];
    for (i = 0; i < n + 1; i++)
        prime[i] = true;
 
    SieveOfEratosthenes(prime, n + 1);
 
    // Map is used to store
    // element frequencies
    Dictionary<int, int> mp = new Dictionary<int, int>();
    for (i = 0 ; i < n; i++)
    {
        if(mp.ContainsKey(arr[i]))
        {
            var val = mp[arr[i]];
            mp.Remove(arr[i]);
            mp.Add(arr[i], val + 1);
        }
        else
        {
            mp.Add(arr[i], 1);
        }
    }
    int gcd = 0;
 
    // Traverse the map using iterators
    foreach(KeyValuePair<int, int> it in mp)
    {
 
        // Count the number of elements
        // having prime frequencies
        if (prime[it.Value])
        {
            gcd = __gcd(gcd, it.Key);
        }
    }
    return gcd;
}
static int __gcd(int a, int b)
{
    if (b == 0)
        return a;
    return __gcd(b, a % b);
     
}
 
// Driver code
static public void Main ( String []arg)
{
    int []arr = { 5, 4, 6, 5, 4, 6 };
    int n = arr.Length;
 
    Console.WriteLine(gcdPrimeFreq(arr, n));
}
}
 
// This code is contributed by Princi Singh

Javascript




<script>
// javascript implementation of the approach
function gcd_two_numbers(x, y) {
  x = Math.abs(x);
  y = Math.abs(y);
  while(y) {
    var t = y;
    y = x % y;
    x = t;
  }
  return x;
}
 
// Function to create Sieve to check primes
function SieveOfEratosthenes(prime, p_size){
    // False here indicates
    // that it is not prime
    prime[0] = false;
    prime[1] = false;
 
    for (let p = 2; p * p <= p_size; p++) {
        // If prime[p] is not changed,
        // then it is a prime
        if (prime[p]) {
            // Update all multiples of p,
            // set them to non-prime
            for (let i = p * 2; i <= p_size; i += p)
                prime[i] = false;
        }
    }
    return prime;
}
 
// Function to return the GCD of elements
// in an array having prime frequency
function gcdPrimeFreq( arr,  n){
    let prime = [];
    for(let i = 0;i<n+1;i++){
        prime.push(true);
    }
    prime = SieveOfEratosthenes(prime, n + 1);
    let i, j;
    // Map is used to store
    // element frequencies
    let m = new Map();
    for (i = 0; i < n; i++){
      if(m[arr[i]])
        m[arr[i]]++;
      else
        m[arr[i]] = 1;
    }
    let gcd = 0;
 
    // Traverse the map using iterators
    for (var it in m) {
         
        // Count the number of elements
        // having prime frequencies
        if (prime[m[it]]) {
            gcd = gcd_two_numbers(gcd, it);
        }
    }
 
    return gcd;
}
 
// Driver code
let a = [ 5, 4, 6, 5, 4, 6 ];
 
let len = a.length;
 
document.write( gcdPrimeFreq(a, len));
</script>
Output: 
1

 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :