1. Overview
Given two integers, a and b, we say that they are relatively prime if the only factor that divides both is 1. Mutually prime or coprime are synonyms for relatively prime numbers.
In this quick tutorial, we’ll walk through a solution to this problem using Java.
2. Greatest Common Factor Algorithm
As it turns out, if the greatest common divisor (gcd) of 2 numbers a and b is 1 (i.e. gcd(a, b) = 1) then a and b are relatively prime. As a result, determining whether two numbers are relatively prime consists simply of finding if the gcd is 1.
3. Euclidean Algorithm Implementation
In this section, we’ll use the Euclidean algorithm to calculate the gcd of 2 numbers.
Before we show our implementation, let’s summarize the algorithm and look at a quick example of how to apply it for the sake of understanding.
So, imagine we have two integers, a and b. In the iterative approach, we first divide a by b and get the remainder. Next, we assign a the value of b, and we assign b the remainder value. We repeat this process until b = 0. Finally, when we reach this point, we return the value of a as the gcd result, and if a = 1, we can say that a and b are relatively prime.
Let’s try it out on two integers, a = 81 and b = 35.
In this case, the remainder of 81 and 35 (81 % 35) is 11. So, in the first iteration step, we end with a = 35 and b = 11. Consequently, we’ll do another iteration.
The remainder of 35 divided by 11 is 2. As a result, we have now a = 11 (we swapped values) and b = 2. Let’s keep going.
One more step will result in a = 2 and b = 1. Now, we’re getting close to the end.
Lastly, after one more iteration, we’ll reach a = 1 and b = 0. The algorithm returns 1 and we can conclude that 81 and 35 are indeed relatively prime.
3.1. Imperative Implementation
First, let’s implement the imperative Java version of the Euclidean algorithm as described above:
int iterativeGCD(int a, int b) { int tmp; while (b != 0) { if (a < b) { tmp = a; a = b; b = tmp; } tmp = b; b = a % b; a = tmp; } return a; }
As we can notice, in the case where a is less than b, we swap the values before continuing. The algorithm stops when b is 0.
3.2. Recursive Implementation
Next, let’s look at a recursive implementation. This is probably cleaner since it avoids explicit variable value swaps:
int recursiveGCD(int a, int b) { if (b == 0) { return a; } if (a < b) { return recursiveGCD(b, a); } return recursiveGCD(b, a % b); }
4. Using BigInteger‘s Implementation
But wait — isn’t the gcd algorithm already implemented in Java? Yes, it is! The BigInteger class provides a gcd method that implements the Euclidean algorithm for finding the greatest common divisor.
Using this method, we can more easily draft the relatively prime algorithm as:
boolean bigIntegerRelativelyPrime(int a, int b) { return BigInteger.valueOf(a).gcd(BigInteger.valueOf(b)).equals(BigInteger.ONE); }
5. Conclusion
In this quick tutorial, we’ve presented a solution to the problem of finding if two numbers are relatively prime using three implementations of the gcd algorithm.
And, as always, the sample code is available over on GitHub.