Encontre se dois números são relativamente primos em Java

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 que é menor queb, trocamos os valores antes de continuar. O algoritmo para quando é 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.