Encontre se dois números são relativamente primos em Java
1. Visão geral
Dados dois inteiros,a eb, dizemos que eles sãorelatively prime if the only factor that divides both is 1. Mutually prime or coprime are synonyms for relatively prime numbers.
Neste tutorial rápido, veremos uma solução para esse problema usando Java.
2. Maior algoritmo de fator comum
Como se constatou, se o maior divisor comum (gcd) de 2 númerosaeb for 1 (ou seja, gcd(a, b) = 1) entãoa eb são relativamente primos. Como resultado, determinar se dois números são relativamente primos consiste simplesmente em descobrir segcd é 1.
3. Implementação de algoritmo euclidiano
Nesta seção, usaremos oEuclidean algorithm para calcular ogcd de 2 números.
Antes de mostrar nossa implementação, vamos resumir o algoritmo e ver um exemplo rápido de como aplicá-lo para fins de compreensão.
Então, imagine que temos dois inteiros,aeb. Na abordagem iterativa, primeiro dividimosa porbe obtemos o resto. Em seguida, atribuímos aa o valor deb e atribuímos ab o valor restante. Repetimos esse processo atéb =0. Finalmente, quando alcançamos este ponto, retornamos o valor dea como o resultado degcd, e sea =1, podemos dizer quea eb são relativamente primos.
Vamos experimentar em dois inteiros,a = 81 andb = 35.
Nesse caso, o restante de81 and35 (81 % 35) is11. Portanto, na primeira etapa de iteração, terminamos coma = 35eb = 11. Consequentemente, faremos outra iteração.
O restante de35 dividido por11 is2. Como resultado, temos agoraa = 11 (trocamos os valores) eb = 2. Vamos continuar.
Mais uma etapa resultará ema = 2 eb = 1. Agora, estamos chegando perto do fim.
Por fim, após mais uma iteração, chegaremos aa = 1 andb = 0. O algoritmo retorna1e podemos concluir que81 areia35 são de fato relativamente primos.
3.1. Implementação imperativa
Primeiro, vamos implementar a versão Java imperativa do algoritmo euclidiano, conforme descrito acima:
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;
}
Como podemos notar, no caso em quea é menor queb, trocamos os valores antes de continuar. O algoritmo para quandob é 0.
3.2. Implementação Recursiva
A seguir, vamos dar uma olhada em uma implementação recursiva. Provavelmente, isso é mais limpo, pois evita trocas explícitas de valores de variáveis:
int recursiveGCD(int a, int b) {
if (b == 0) {
return a;
}
if (a < b) {
return recursiveGCD(b, a);
}
return recursiveGCD(b, a % b);
}
4. Usando a implementação deBigInteger
Mas espere - o algoritmogcd já não está implementado em Java? Sim, ele é! A classeBigInteger fornece um métodogcd que implementa o algoritmo Euclidiano para encontrar o maior divisor comum.
Usando esse método, podemos esboçar mais facilmente o algoritmo relativamente primo como:
boolean bigIntegerRelativelyPrime(int a, int b) {
return BigInteger.valueOf(a).gcd(BigInteger.valueOf(b)).equals(BigInteger.ONE);
}
5. Conclusão
Neste tutorial rápido, apresentamos uma solução para o problema de descobrir se dois números são relativamente primos usando três implementações do algoritmogcd.
E, como sempre, o código de amostra está disponívelover on GitHub.