Luna, tierra y sol

¿Cuando se encontrarán los tres astros en la misma posición de hoy? ¿En 19 años?

La luna recorre su órbita alrededor de la Tierra aproximadamente en 29 días, y la Tierra tarda un año en completar su movimiento de traslación alrededor del Sol. Esto se asemeja a un problema de trenes: ¿cuándo volverán a coincidir si ambos parten al mismo tiempo?

Si tomamos estas duraciones en centésimas de día:

Queremos saber cuándo se repetirán las posiciones de hoy, con un margen de tolerancia.

Aquí aparecerá el valor de d.
Aquí aparecerá el valor de d/a.
Aquí aparecerá el valor de d/b.

En el ejemplo por defecto, d/a es el número de años que habrá que esperar para que se repita, en un mismo día, la posición actual de la Luna y la Tierra.

Explicación matemática del cálculo de d:

El mínimo común múltiplo (mcm) de dos números a y b es el primer número d tal que el resto de d/a es cero y lo mismo ocurre con el resto de d/b, es decir, la distancia de d a un múltipo de a es cero, tolerancia cero (c = 0), y lo mismo con la distantia de d a un múltiplo de b.

Con tolerancia c, el mcm(a, b) se define como el primer número d tal que d no diste más de c/2 de un múltiplo de a, y lo mismo con b.

En nuestro caso así aseguramos que d está como mucho a medio día de que la luna tenga la posición actual en su órbita, y la tierra a no más de medio día de la posición actual en su orbita.

Cálculo del valor de d en el script:

// Encontrar el primer número d tal que d >= a, d >= b, y las condiciones de los módulos se cumplen
let d = Math.max(a, b); // d debe ser mayor o igual que a y b, comenzamos con el mayor
while (true) {
    const conditionA = Math.min(d % a, a - (d % a)); // Calcula la distancia mínima al valor 0 del módulo a
    const conditionB = Math.min(d % b, b - (d % b)); // Calcula la distancia mínima al valor 0 del módulo b
    if (conditionA <= c / 2 && conditionB <= c / 2) { // Si ambas distancias cumplen la tolerancia c/2
        break; // Se encontró el valor de d que cumple las condiciones
    }
    d++; // Incrementar d para continuar la búsqueda
}

Podíamos llamar a este número d mínimo común múltiplo de a y b con tolerancia c, mcmt(a,b;c)

En la página de este enlace hemos puesto lo que sería el máximo común divisor con tolerancia c, mcdt(a,b;c)