9. Máximo común divisor y mínimo común múltiplo

El MCD permite encontrar el mayor divisor compartido y el MCM el menor múltiplo común. Son herramientas útiles para simplificar fracciones, sincronizar ciclos y resolver problemas de divisibilidad.

9.1 Introducción

El máximo común divisor y el mínimo común múltiplo se apoyan en los conceptos de divisibilidad, múltiplos, divisores y factorización vistos en temas anteriores.

En programación aparecen en problemas donde hay que simplificar proporciones, reducir fracciones, coordinar eventos periódicos, repartir cantidades en grupos iguales o buscar patrones que se repiten.

En este tema veremos primero la idea matemática y luego la convertiremos en funciones JavaScript.

9.2 Qué es el máximo común divisor

El máximo común divisor, abreviado MCD, es el mayor número que divide exactamente a dos o más números.

Divisores de 12: 1, 2, 3, 4, 6, 12
Divisores de 18: 1, 2, 3, 6, 9, 18
MCD(12, 18) = 6

El número 6 es el mayor divisor que comparten 12 y 18.

const a = 12;
const b = 18;

console.log(a % 6);
console.log(b % 6);

9.3 Buscar divisores comunes

Una forma directa de calcular el MCD es buscar todos los divisores comunes y quedarse con el mayor.

function mcdPorBusqueda(a, b) {
  let resultado = 1;
  const limite = Math.min(a, b);

  for (let divisor = 1; divisor <= limite; divisor++) {
    if (a % divisor === 0 && b % divisor === 0) {
      resultado = divisor;
    }
  }

  return resultado;
}

console.log(mcdPorBusqueda(12, 18));
console.log(mcdPorBusqueda(20, 30));

Este algoritmo es fácil de entender, aunque puede ser lento si los números son grandes.

9.4 Algoritmo de Euclides

El algoritmo de Euclides calcula el MCD usando restos. La idea es que el MCD de dos números no cambia si reemplazamos el mayor por el resto de dividirlo por el menor.

MCD(48, 18)
48 % 18 = 12
18 % 12 = 6
12 % 6 = 0
MCD = 6
function mcd(a, b) {
  while (b !== 0) {
    const resto = a % b;
    a = b;
    b = resto;
  }

  return a;
}

console.log(mcd(48, 18));
console.log(mcd(12, 18));

Este algoritmo es eficiente y se usa con mucha frecuencia en programación.

9.5 Manejar números negativos

El MCD se considera positivo. Si recibimos valores negativos, podemos trabajar con sus valores absolutos usando Math.abs().

function mcd(a, b) {
  a = Math.abs(a);
  b = Math.abs(b);

  while (b !== 0) {
    const resto = a % b;
    a = b;
    b = resto;
  }

  return a;
}

console.log(mcd(-48, 18));
console.log(mcd(48, -18));

Esta pequeña validación hace que la función sea más robusta.

9.6 MCD y simplificación de fracciones

Una aplicación muy importante del MCD es simplificar fracciones. Para reducir una fracción, dividimos numerador y denominador por su MCD.

18/24 se simplifica dividiendo por MCD(18, 24) = 6
18/24 = 3/4
function mcd(a, b) {
  a = Math.abs(a);
  b = Math.abs(b);

  while (b !== 0) {
    const resto = a % b;
    a = b;
    b = resto;
  }

  return a;
}

const numerador = 18;
const denominador = 24;
const divisorComun = mcd(numerador, denominador);

console.log(numerador / divisorComun);
console.log(denominador / divisorComun);

9.7 Qué es el mínimo común múltiplo

El mínimo común múltiplo, abreviado MCM, es el menor número positivo que es múltiplo de dos o más números.

Múltiplos de 4: 4, 8, 12, 16, 20, 24, ...
Múltiplos de 6: 6, 12, 18, 24, ...
MCM(4, 6) = 12

El 12 es el menor múltiplo positivo que comparten 4 y 6.

console.log(12 % 4);
console.log(12 % 6);

9.8 Buscar el MCM por múltiplos

Una forma directa de calcular el MCM es empezar desde el mayor de los dos números y avanzar hasta encontrar un valor divisible por ambos.

function mcmPorBusqueda(a, b) {
  let candidato = Math.max(a, b);

  while (true) {
    if (candidato % a === 0 && candidato % b === 0) {
      return candidato;
    }

    candidato++;
  }
}

console.log(mcmPorBusqueda(4, 6));
console.log(mcmPorBusqueda(8, 12));

Este método es claro, pero puede tardar mucho con números grandes.

9.9 Relación entre MCD y MCM

Para dos números positivos, existe una relación muy útil:

MCM(a, b) = (a × b) / MCD(a, b)

Esta fórmula permite calcular el MCM de forma eficiente si ya tenemos una función para el MCD.

function mcd(a, b) {
  a = Math.abs(a);
  b = Math.abs(b);

  while (b !== 0) {
    const resto = a % b;
    a = b;
    b = resto;
  }

  return a;
}

function mcm(a, b) {
  return Math.abs(a * b) / mcd(a, b);
}

console.log(mcm(4, 6));
console.log(mcm(8, 12));
console.log(mcm(15, 20));

9.10 MCD y MCM por factorización

También podemos calcular MCD y MCM usando factorización prima. El MCD toma los factores comunes con menor exponente. El MCM toma todos los factores con mayor exponente.

12 = 2² × 3
18 = 2 × 3²
MCD = 2 × 3 = 6
MCM = 2² × 3² = 36

Este enfoque es muy útil para entender la relación matemática, aunque el algoritmo de Euclides suele ser más práctico para programar el MCD.

9.11 Aplicación: sincronizar eventos

El MCM aparece cuando dos eventos se repiten con diferentes intervalos y queremos saber cuándo coinciden nuevamente.

Si una tarea ocurre cada 4 segundos y otra cada 6 segundos, ambas coinciden cada 12 segundos.

function mcd(a, b) {
  while (b !== 0) {
    const resto = a % b;
    a = b;
    b = resto;
  }

  return a;
}

function mcm(a, b) {
  return Math.abs(a * b) / mcd(a, b);
}

const tareaA = 4;
const tareaB = 6;

console.log(mcm(tareaA, tareaB));

9.12 Aplicación: formar grupos iguales

El MCD ayuda a repartir cantidades en grupos iguales del mayor tamaño posible. Por ejemplo, si tenemos 24 lápices y 36 hojas, podemos armar paquetes idénticos usando el MCD.

function mcd(a, b) {
  while (b !== 0) {
    const resto = a % b;
    a = b;
    b = resto;
  }

  return a;
}

const lapices = 24;
const hojas = 36;
const paquetes = mcd(lapices, hojas);

console.log(paquetes);
console.log(lapices / paquetes);
console.log(hojas / paquetes);

El primer resultado indica cuántos paquetes iguales se pueden formar. Los siguientes indican cuántos lápices y hojas tendrá cada paquete.

9.13 MCD y MCM de varios números

Podemos extender las funciones para trabajar con listas de números usando reduce(). La idea es aplicar la operación de a pares.

function mcd(a, b) {
  a = Math.abs(a);
  b = Math.abs(b);

  while (b !== 0) {
    const resto = a % b;
    a = b;
    b = resto;
  }

  return a;
}

function mcm(a, b) {
  return Math.abs(a * b) / mcd(a, b);
}

const numeros = [12, 18, 30];

console.log(numeros.reduce((acumulado, numero) => mcd(acumulado, numero)));
console.log(numeros.reduce((acumulado, numero) => mcm(acumulado, numero)));

Este patrón es útil cuando una entrada contiene varias cantidades y necesitamos una respuesta común para todas.

9.14 Errores comunes

  • Confundir divisor común con múltiplo común.
  • Olvidar que el MCD busca el mayor divisor compartido.
  • Olvidar que el MCM busca el menor múltiplo positivo compartido.
  • No usar valores absolutos cuando los números pueden ser negativos.
  • No contemplar el caso del cero en funciones generales.
  • Usar búsqueda simple con números muy grandes cuando el algoritmo de Euclides sería más eficiente.
function mcd(a, b) {
  a = Math.abs(a);
  b = Math.abs(b);

  while (b !== 0) {
    const resto = a % b;
    a = b;
    b = resto;
  }

  return a;
}

console.log(mcd(0, 8));
console.log(mcd(8, 0));
console.log(mcd(0, 0));

El caso MCD(0, 0) requiere una decisión según el contexto del programa. Matemáticamente suele considerarse indefinido.

9.15 Qué debes recordar de este tema

  • El MCD es el mayor divisor común de dos o más números.
  • El MCM es el menor múltiplo positivo común de dos o más números.
  • El algoritmo de Euclides calcula el MCD usando restos.
  • La fórmula MCM(a, b) = (a × b) / MCD(a, b) permite calcular el MCM de forma eficiente.
  • El MCD sirve para simplificar fracciones y repartir en grupos iguales.
  • El MCM sirve para sincronizar ciclos y encontrar coincidencias periódicas.
  • En programación conviene validar signos, ceros y tipos de datos.

9.16 Conclusión

El máximo común divisor y el mínimo común múltiplo convierten ideas de divisibilidad en herramientas prácticas. Permiten simplificar, sincronizar, repartir y razonar sobre patrones repetitivos.

En el próximo tema estudiaremos fracciones y operaciones con fracciones, donde el MCD y el MCM volverán a ser especialmente útiles.