1.2.5 Máximo Divisor Comum
O máximo divisor comum (MDC, ou GCD em inglês) de dois inteiros e é definido como sendo o maior inteiro que divide tanto quanto sem resto. Por exemplo, o MDC de 16 e 28 é 4. No capítulo 2, quando investigarmos como implementar aritmética de números racionais, precisaremos ser capazes de calcular MDCs a fim de reduzir números racionais aos menores termos. (Para reduzir um número racional aos menores termos, devemos dividir tanto o numerador quanto o denominador pelo seu MDC. Por exemplo, 16/28 reduz para 4/7.) Uma maneira de encontrar o MDC de dois inteiros é fatorá-los e procurar fatores comuns, mas existe um algoritmo famoso que é muito mais eficiente.
A ideia do algoritmo é baseada na observação de que, se é o resto quando é dividido por , então os divisores comuns de e são precisamente os mesmos que os divisores comuns de e . Assim, podemos usar a equação
para reduzir sucessivamente o problema de calcular um MDC ao problema de calcular o MDC de pares de inteiros cada vez menores. Por exemplo,
reduz a , que é 2. É possível mostrar que começando com quaisquer dois inteiros positivos e realizando reduções repetidas sempre eventualmente produzirá um par onde o segundo número é 0. Então o MDC é o outro número no par. Este método para calcular o MDC é conhecido como Algoritmo de Euclides.1
É fácil expressar o Algoritmo de Euclides como uma função:
Carregando playground de código...
Isso gera um processo iterativo, cujo número de passos cresce como o logaritmo dos números envolvidos.
O fato de que o número de passos necessários pelo Algoritmo de Euclides tem crescimento logarítmico tem uma relação interessante com os números de Fibonacci:
Teorema de Lamé: Se o Algoritmo de Euclides requer passos para calcular o MDC de algum par, então o menor número no par deve ser maior ou igual ao -ésimo número de Fibonacci.2
Podemos usar este teorema para obter uma estimativa de ordem de crescimento para o Algoritmo de Euclides. Seja o menor dos dois argumentos de entrada da função. Se o processo leva passos, então devemos ter