Minimum prime number operations to convert A to B - GeeksforGeeks

23 Apr, 2021
Given two integers A and B, the task is to convert A to B with a minimum number of the following operations:  
Multiply A by any prime number.Divide A by one of its prime divisors.
Multiply A by any prime number.
Divide A by one of its prime divisors.
Print the minimum number of operations required.Examples:  
Input: A = 10, B = 15 Output: 2 Operation 1: 10 / 2 = 5 Operation 2: 5 * 3 = 15Input: A = 9, B = 7 Output: 3  
Naive Approach: If prime factorization of A = p1q1 * p2q2 * ... * pnqn. If we multiply A by some prime then qi for that prime will increase by 1 and if we divide A by one of its prime factors then qi for that prime will decrease by 1. So for a prime p if it occurs qA times in prime factorization of A and qB times in prime factorization of B then we only need to find the sum of |qA – qB| for all the primes to get a minimum number of operations. 
Efficient Approach: Eliminate all the common factors of A and B by dividing both A and B by their GCD. If A and B have no common factors then we only need the sum of powers of their prime factors to convert A to B. 
Below is the implementation of the above approach:  
C++
Java
Python3
C#
PHP
Javascript
// C++ implementation of above approach#include <bits/stdc++.h>using namespace std; // Function to return the count of// prime factors of a numberint countFactors(int n){    int factors = 0;     for (int i = 2; i * i <= n; i++) {        while (n % i == 0) {            n /= i;            factors += 1;        }    }     if (n != 1)        factors++;     return factors;} // Function to return the minimum number of// given operations required to convert A to Bint minOperations(int A, int B){    int g = __gcd(A, B); // gcd(A, B);     // Eliminate the common    // factors of A and B    A /= g;    B /= g;     // Sum of prime factors    return countFactors(A) + countFactors(B);} // Driver codeint main(){    int A = 10, B = 15;     cout << minOperations(A, B);     return 0;}
// Java implementation of above approachimport java .io.*; class GFG{     // Function to return the count of// prime factors of a numberstatic int countFactors(int n){    int factors = 0;     for (int i = 2; i * i <= n; i++)    {        while (n % i == 0)        {            n /= i;            factors += 1;        }    }     if (n != 1)        factors++;         return factors;} static int __gcd(int a, int b){    if (b == 0)    return a;    return __gcd(b, a % b);} // Function to return the minimum// number of given operations// required to convert A to Bstatic int minOperations(int A, int B){    int g = __gcd(A, B); // gcd(A, B);     // Eliminate the common    // factors of A and B    A /= g;    B /= g;     // Sum of prime factors    return countFactors(A) + countFactors(B);} // Driver codepublic static void main(String[] args){    int A = 10, B = 15;     System.out.println(minOperations(A, B));}} // This code is contributed// by Code_Mech
# Python3 implementation of above approach # from math lib import sqrt# and gcd functionfrom math import sqrt, gcd # Function to return the count of# prime factors of a numberdef countFactors(n) :    factors = 0;     for i in range(2, int(sqrt(n)) + 1) :        while (n % i == 0) :            n //= i            factors += 1     if (n != 1) :        factors += 1     return factors # Function to return the minimum number of# given operations required to convert A to Bdef minOperations(A, B) :         g = gcd(A, B)     # Eliminate the common    # factors of A and B    A //= g    B //= g     # Sum of prime factors    return countFactors(A) + countFactors(B) # Driver codeif __name__ == "__main__" :     A, B = 10, 15     print(minOperations(A, B)) # This code is contributed by Ryuga
// C# implementation of above approachusing System;     class GFG{         // Function to return the count of    // prime factors of a number    static int countFactors(int n)    {        int factors = 0;        for (int i = 2; i * i <= n; i++)        {            while (n % i == 0)            {                n /= i;                factors += 1;            }        }         if (n != 1)            factors++;         return factors;    }     static int __gcd(int a, int b)    {        if (b == 0)            return a;        return __gcd(b, a % b);    }     // Function to return the minimum    // number of given operations    // required to convert A to B    static int minOperations(int A, int B)    {        int g = __gcd(A, B); // gcd(A, B);         // Eliminate the common        // factors of A and B        A /= g;        B /= g;         // Sum of prime factors        return countFactors(A) + countFactors(B);    }     // Driver code    public static void Main()    {        int A = 10, B = 15;        Console.WriteLine(minOperations(A, B));    }} // This code is contributed by// PrinciRaj1992
<?php// PHP implementation of above approach // Function to calculate gcdfunction __gcd($a, $b){             // Everything divides 0    if ($a == 0 || $b == 0)        return 0;         // base case    if ($a == $b)        return $a;         // a is greater    if ($a > $b)        return __gcd($a - $b, $b);                 return __gcd($a, $b - $a);} // Function to return the count of// prime factors of a numberfunction countFactors($n){    $factors = 0;     for ($i = 2; $i * $i <= $n; $i++)    {        while ($n % $i == 0)        {            $n /= $i;            $factors += 1;        }    }     if ($n != 1)        $factors++;     return $factors;} // Function to return the minimum number of// given operations required to convert A to Bfunction minOperations($A, $B){    $g = __gcd($A, $B); // gcd(A, B);     // Eliminate the common    // factors of A and B    $A /= $g;    $B /= $g;     // Sum of prime factors    return countFactors($A) +           countFactors($B);} // Driver code$A = 10; $B = 15; echo minOperations($A, $B); // This code is contributed// by Akanksha Rai?>
<script>// javascript implementation of above approach     // Function to return the count of    // prime factors of a number    function countFactors(n) {        var factors = 0;         for (i = 2; i * i <= n; i++) {            while (n % i == 0) {                n /= i;                factors += 1;            }        }         if (n != 1)            factors++;         return factors;    }     function __gcd(a , b) {        if (b == 0)            return a;        return __gcd(b, a % b);    }     // Function to return the minimum    // number of given operations    // required to convert A to B    function minOperations(A , B) {        var g = __gcd(A, B); // gcd(A, B);         // Eliminate the common        // factors of A and B        A /= g;        B /= g;         // Sum of prime factors        return countFactors(A) + countFactors(B);    }     // Driver code             var A = 10, B = 15;         document.write(minOperations(A, B)); // This code contributed by Rajput-Ji</script>
2
 
ankthon
Akanksha_Rai
Code_Mech
princiraj1992
Rajput-Ji
prime-factor
Algorithms
Mathematical
Mathematical
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
SDE SHEET - A Complete Guide for SDE Preparation
DSA Sheet by Love Babbar
Introduction to Algorithms
Difference between Informed and Uninformed Search in AI
Quick Sort vs Merge Sort
Program for Fibonacci numbers
Write a program to print all permutations of a given string
C++ Data Types
Set in C++ Standard Template Library (STL)
Coin Change | DP-7