Count common prime factors of two numbers

Given two integer A and B, the task is to find the count of common factors of two numbers where factors are prime.

Examples:

Input: A = 6, B = 12
Output: 2
2 and 3 are the only common prime divisors of 6 and 12

Input: A = 4, B = 8
Output: 1

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 increment the counter.

Efficient Approach is to do following:

  1. Find Greatest Common Divisor (gcd) of the given numbers.
  2. Find prime factors of the GCD.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to count common prime factors
// of a and b.
#include <bits/stdc++.h>
using namespace std;
  
// A function to count all prime factors of
// a given number x
int countPrimeFactors(int x)
{
    int res = 0;
    if (x % 2 == 0) {
        res++;
  
        // Print the number of 2s that divide x
        while (x % 2 == 0)
            x = x / 2;
    }
  
    // x must be odd at this point.  So we 
    // can skip one element (Note i = i +2)
    for (int i = 3; i <= sqrt(x); i = i + 2) {
        if (x % i == 0) {
  
            // While i divides x, print i and 
            // divide x
            res++;
            while (x % i == 0)
                x = x / i;
        }
    }
  
    // This condition is to handle the case 
    // when x is a prime number greater than 2
    if (x > 2)
        res++;
    return res;
}
  
// Count of common prime factors
int countCommonPrimeFactors(int a, int b)
{
    // Get the GCD of the given numbers
    int gcd = __gcd(a, b);
  
    // Count prime factors in GCD
    return countPrimeFactors(gcd);
}
  
// Driver code
int main()
{
    int a = 6, b = 12;
    cout << countCommonPrimeFactors(a, b);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java  program to count common prime factors
 // of a and b.
  
import java.io.*;
  
class GFG {
    // Recursive function to return gcd of a and b 
    static int __gcd(int a, int b) 
    
        // Everything divides 0  
        if (a == 0
          return b; 
        if (b == 0
          return a; 
         
        // base case 
        if (a == b) 
            return a; 
         
        // a is greater 
        if (a > b) 
            return __gcd(a-b, b); 
        return __gcd(a, b-a); 
    
// A function to count all prime factors of
// a given number x
 static int countPrimeFactors(int x)
{
    int res = 0;
    if (x % 2 == 0) {
        res++;
  
        // Print the number of 2s that divide x
        while (x % 2 == 0)
            x = x / 2;
    }
  
    // x must be odd at this point. So we 
    // can skip one element (Note i = i +2)
    for (int i = 3; i <= Math.sqrt(x); i = i + 2) {
        if (x % i == 0) {
  
            // While i divides x, print i and 
            // divide x
            res++;
            while (x % i == 0)
                x = x / i;
        }
    }
  
    // This condition is to handle the case 
    // when x is a prime number greater than 2
    if (x > 2)
        res++;
    return res;
}
  
// Count of common prime factors
static int countCommonPrimeFactors(int a, int b)
{
    // Get the GCD of the given numbers
    int gcd = __gcd(a, b);
  
    // Count prime factors in GCD
    return countPrimeFactors(gcd);
}
  
// Driver code
  
  
    public static void main (String[] args) {
    int a = 6, b = 12;
    System.out.println(countCommonPrimeFactors(a, b));
    }
}
// This code is contributed by inder_verma..

chevron_right


Python3

# Python 3 program to count common prime
# factors of a and b.
from math import sqrt,gcd

# A function to count all prime
# factors of a given number x
def countPrimeFactors(x):
res = 0
if (x % 2 == 0):
res += 1

# Print the number of 2s that divide x
while (x % 2 == 0):
x = x / 2

# x must be odd at this point. So we
# can skip one element (Note i = i +2)
k = int(sqrt(x)) + 1
for i in range(3, k, 2):
if (x % i == 0):

# While i divides x, print i
# and divide x
res += 1
while (x % i == 0):
x = x / i

# This condition is to handle the
# case when x is a prime number
# greater than 2
if (x > 2):
res += 1
return res

# Count of common prime factors
def countCommonPrimeFactors(a, b):

# Get the GCD of the given numbers
gcd__ = gcd(a, b)

# Count prime factors in GCD
return countPrimeFactors(gcd__)

# Driver code
if __name__ == ‘__main__’:
a = 6
b = 12
print(countCommonPrimeFactors(a, b))

# This code is contributed by
# Surendra_Gangwar

C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to count common prime factors 
// of a and b. 
  
using System ;
  
class GFG { 
    // Recursive function to return gcd of a and b 
    static int __gcd(int a, int b) 
    
        // Everything divides 0 
        if (a == 0) 
        return b; 
        if (b == 0) 
        return a; 
          
        // base case 
        if (a == b) 
            return a; 
          
        // a is greater 
        if (a > b) 
            return __gcd(a-b, b); 
        return __gcd(a, b-a); 
    
    // A function to count all prime factors of 
    // a given number x 
    static int countPrimeFactors(int x) 
    
        int res = 0; 
        if (x % 2 == 0) { 
            res++; 
      
            // Print the number of 2s that divide x 
            while (x % 2 == 0) 
                x = x / 2; 
        
      
        // x must be odd at this point. So we 
        // can skip one element (Note i = i +2) 
        for (int i = 3; i <= Math.Sqrt(x); i = i + 2) { 
            if (x % i == 0) { 
      
                // While i divides x, print i and 
                // divide x 
                res++; 
                while (x % i == 0) 
                    x = x / i; 
            
        
      
        // This condition is to handle the case 
        // when x is a prime number greater than 2 
        if (x > 2) 
            res++; 
        return res; 
    
      
    // Count of common prime factors 
    static int countCommonPrimeFactors(int a, int b) 
    
        // Get the GCD of the given numbers 
        int gcd = __gcd(a, b); 
      
        // Count prime factors in GCD 
        return countPrimeFactors(gcd); 
    
      
    // Driver code 
    public static void Main() { 
    int a = 6, b = 12; 
      
    Console.WriteLine(countCommonPrimeFactors(a, b)); 
    
    // This code is contributed by Ryuga 

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to count common 
// prime factors of a and b. 
  
// Recursive function to return
// gcd of a and b 
function __gcd($a, $b
    // Everything divides 0 
    if ($a == 0) 
        return $b
    if ($b == 0) 
        return $a
      
    // base case 
    if ($a == $b
        return $a
      
    // a is greater 
    if ($a > $b
        return __gcd(($a - $b), $b); 
    return __gcd($a, ($b - $a)); 
  
// A function to count all prime 
// factors of a given number x 
function countPrimeFactors($x
    $res = 0; 
    if ($x % 2 == 0)
    
        $res++; 
  
        // Print the number of 2s that 
        // divide x 
        while ($x % 2 == 0) 
            $x = $x / 2; 
    
  
    // x must be odd at this point. So we 
    // can skip one element (Note i = i +2) 
    for ($i = 3; $i <= sqrt($x); $i = $i + 2) 
    
        if ($x % $i == 0) 
        
  
            // While i divides x, print i 
            // and divide x 
            $res++; 
            while ($x % $i == 0) 
                $x = $x / $i
        
    
  
    // This condition is to handle the case 
    // when x is a prime number greater than 2 
    if ($x > 2) 
        $res++; 
    return $res
  
// Count of common prime factors 
function countCommonPrimeFactors($a, $b
    // Get the GCD of the given numbers 
    $gcd = __gcd($a, $b); 
  
    // Count prime factors in GCD 
    return countPrimeFactors($gcd); 
  
// Driver code 
$a = 6;
$b = 12; 
  
echo (countCommonPrimeFactors($a, $b)); 
  
// This code is contributed by akt_mit..
?>

chevron_right


Output:

2

If there are multiple queries for counting common divisors, we can further optimize above code using Prime Factorization using Sieve O(log n) for multiple queries



My Personal Notes arrow_drop_up