Common prime factors of two numbers - GeeksforGeeks

06 Jun, 2021
Given two integer and , the task is to find the common prime divisors of these numbers.Examples:  
Input: A = 6, B = 12 Output: 2 3 2 and 3 are the only common prime divisors of 6 and 12Input: A = 4, B = 8 Output: 2  
 
Naive Approach: Iterate from 1 to min(A, B) and check whether i is prime and a factor of both A and B, if yes then display the number.Efficient Approach is to do following:  
Find Greatest Common Divisor (gcd) of the given numbers.Find prime factors of the GCD.
Find Greatest Common Divisor (gcd) of the given numbers.
Find prime factors of the GCD.
Efficient Approach for multiple queries: The above solution can be further optimized if there are multiple queries for common factors. The idea is based on Prime Factorization using Sieve O(log n) for multiple queries.Below is the implementation of the above approach:  
C++
Java
Python3
C#
Javascript
// C++ implementation of above approach#include <bits/stdc++.h>using namespace std; #define MAXN   100001 bool prime[MAXN];void SieveOfEratosthenes(){     // Create a boolean array "prime[0..n]" and initialize    // all entries it as true. A value in prime[i] will    // finally be false if i is Not a prime, else true.     memset(prime, true, sizeof(prime));     // 0 and 1 are not prime numbers    prime[0] = false;    prime[1] = false;     for (int p = 2; p * p <= MAXN; p++) {         // If prime[p] is not changed, then it is a prime        if (prime[p] == true) {             // Update all multiples of p as non-prime            for (int i = p * p; i <= MAXN; i += p)                prime[i] = false;        }    }} // Find the common prime divisorsvoid common_prime(int a, int b){     // Get the GCD of the given numbers    int gcd = __gcd(a, b);     // Find the prime divisors of the gcd    for (int i = 2; i <= (gcd); i++) {         // If i is prime and a divisor of gcd        if (prime[i] && gcd % i == 0) {            cout << i << " ";        }    }} // Driver codeint main(){    // Create the Sieve    SieveOfEratosthenes();     int a = 6, b = 12;     common_prime(a, b);    return 0;}
//Java implementation of above approach class GFG { static final int MAXN = 100001;static boolean prime[] = new boolean[MAXN]; static void SieveOfEratosthenes(){     // Create a boolean array "prime[0..n]" and initialize    // all entries it as true. A value in prime[i] will    // finally be false if i is Not a prime, else true.         for(int i = 0;i<prime.length;i++)            prime[i]=true;     // 0 and 1 are not prime numbers    prime[0] = false;    prime[1] = false;     for (int p = 2; p * p < MAXN; p++) {         // If prime[p] is not changed, then it is a prime        if (prime[p] == true) {             // Update all multiples of p as non-prime            for (int i = p * p; i < MAXN; i += p)                prime[i] = false;        }    }} // Find the common prime divisorsstatic void common_prime(int a, int b){     // Get the GCD of the given numbers    int gcd = (int) __gcd(a, b);     // Find the prime divisors of the gcd    for (int i = 2; i <= (gcd); i++) {         // If i is prime and a divisor of gcd        if (prime[i] && gcd % i == 0) {            System.out.print(i + " ");        }    }}static long __gcd(long a, long b) {     if (a == 0)         return b;     return __gcd(b % a, a); }// Driver code    public static void main(String[] args) {        // Create the Sieve    SieveOfEratosthenes();     int a = 6, b = 12;     common_prime(a, b);    }} /*This code is contributed by 29AjayKumar*/
# Python implementation of above approachfrom math import gcd, sqrt # Create a boolean array "prime[0..n]"# and initialize all entries it as true.# A value in prime[i] will finally be# false if i is Not a prime, else true.prime = [True] * 100001 def SieveOfEratosthenes() :         # 0 and 1 are not prime numbers    prime[0] = False    prime[1] = False         for p in range(2, int(sqrt(100001)) + 1) :         # If prime[p] is not changed,        # then it is a prime        if prime[p] == True :             # Update all multiples of            # p as non-prime            for i in range(p**2, 100001, p) :                prime[i] = False     # Find the common prime divisorsdef common_prime(a, b) :     # Get the GCD of the given numbers    __gcd = gcd(a, b)     # Find the prime divisors of the gcd    for i in range(2, __gcd + 1) :          # If i is prime and a divisor of gcd        if prime[i] and __gcd % i == 0 :            print(i, end = " ") # Driver codeif __name__ == "__main__" :     # Create the Sieve    SieveOfEratosthenes()    a, b = 6, 12         common_prime(a, b)     # This code is contributed by ANKITRAI1
//C# implementation of above approachusing System;public class GFG {      static bool []prime = new bool[100001];    static void SieveOfEratosthenes()    {         // Create a boolean array "prime[0..n]" and initialize        // all entries it as true. A value in prime[i] will        // finally be false if i is Not a prime, else true.             for(int i = 0;i<prime.Length;i++)                prime[i]=true;         // 0 and 1 are not prime numbers        prime[0] = false;        prime[1] = false;         for (int p = 2; p * p < 100001; p++) {             // If prime[p] is not changed, then it is a prime            if (prime[p] == true) {                 // Update all multiples of p as non-prime                for (int i = p * p; i < 100001; i += p)                    prime[i] = false;            }        }    }     // Find the common prime divisors    static void common_prime(int a, int b)    {         // Get the GCD of the given numbers        int gcd = (int) __gcd(a, b);         // Find the prime divisors of the gcd        for (int i = 2; i <= (gcd); i++) {             // If i is prime and a divisor of gcd            if (prime[i] && gcd % i == 0) {                Console.Write(i + " ");            }        }    }    static long __gcd(long a, long b)     {         if (a == 0)             return b;         return __gcd(b % a, a);     }    // Driver code    public static void Main() {        // Create the Sieve    SieveOfEratosthenes();      int a = 6, b = 12;      common_prime(a, b);    }}  /*This code is contributed by 29AjayKumar*/
<script>// Javascript program to implement the above approach MAXN = parseInt(100001);prime = new Array(MAXN); function __gcd(a, b) {     if (a == 0)         return b;     return __gcd(b % a, a); }function SieveOfEratosthenes(){    // Create a boolean array "prime[0..n]" and initialize    // all entries it as true. A value in prime[i] will    // finally be false if i is Not a prime, else true.     prime.fill(true);     // 0 and 1 are not prime numbers    prime[0] = false;    prime[1] = false;     for (var p = 2; p * p <= MAXN; p++) {         // If prime[p] is not changed, then it is a prime        if (prime[p] == true) {             // Update all multiples of p as non-prime            for (var i = p * p; i <= MAXN; i += p)                prime[i] = false;        }    }} // Find the common prime divisorsfunction common_prime( a, b){     // Get the GCD of the given numbers    var gcd = __gcd(a, b);     // Find the prime divisors of the gcd    for (var i = 2; i <= (gcd); i++) {         // If i is prime and a divisor of gcd        if (prime[i] && gcd % i == 0) {            document.write( i + " ");       }    }}  SieveOfEratosthenes();var a = 6, b = 12;common_prime(a, b); //This code is contributed by SoumikModnal</script>
2 3
 
ankthon
29AjayKumar
SoumikMondal
saurabh1990aror
Numbers
prime-factor
sieve
Technical Scripter 2018
Mathematical
Mathematical
Numbers
sieve
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Merge two sorted arrays
Modulo Operator (%) in C/C++ with Examples
Prime Numbers
Program to find sum of elements in a given array
Program for factorial of a number
Operators in C / C++
Program for Decimal to Binary Conversion
Algorithm to solve Rubik's Cube
Minimum number of jumps to reach end
The Knight's tour problem | Backtracking-1