17 votos

Calcule en qué día de la semana cae una fecha usando aritmética modular

En Guerras de verano el personaje principal (es un matemático) calcula el día de la semana del cumpleaños de alguien (el 19/07/1992 es domingo). Sé aritmética modular (muy) básica, pero no sé cómo hacerlo. ¿Puede alguien indicarme la dirección correcta? Parece divertido hacerlo.

12 votos

1 votos

De hecho, enseño este algoritmo en mi clase de algoritmos; ¡es útil en la vida real poder hacerlo!

0 votos

Dershowitz/Reingold es el libro de referencia para este tipo de temas.

6voto

user8269 Puntos 46

Antes del método del Juicio Final (véase el enlace en el comentario de Theo Buehler), existía una fórmula debida a Gauss. Un buen artículo es Berndt Schwerdtfeger, Gauss' calendar formula for the day of the week, disponible en http://berndt-schwerdtfeger.de/cal/cal.pdf

3voto

Andrew Puntos 140

El Congruencia de Zeller es otro método para calcular el día de la semana de una fecha determinada. Kim Larsen presenta una aplicación de una variante de la congruencia de Zeller en este artículo . (Hay una discusión adicional sobre la formulación de Larsen aquí .)

0 votos

El enlace para la congruencia de Zeller parece estar muerto. Tal vez podría ser reemplazado por el enlace a la Artículo de Wikipedia o por una instantánea de La máquina del retroceso .

0voto

MiguelMunoz Puntos 101

La Congruencia de Zeller, modificada para las convenciones informáticas modernas, proporciona un algoritmo sencillo para determinar el día de la semana para cualquier día del Calendario Gregoriano, que entró en uso en 1582. La variación más sencilla de la fórmula es la siguiente

h = (d + ((m+1)*26)/10 + y + y/4 + 6 * (y/100) + y/400 + 5) % 7 + 1; donde d es el día del mes, m es el mes, y es el año de cuatro dígitos, y el resultado utiliza las convenciones de días de la semana de la ISO: 1=lunes a 7=domingo.

Todas las operaciones de división deben utilizar la división entera (truncada). Esta variante sólo utiliza coeficientes positivos, por lo que evita el problema de los resultados negativos que aparecen en otras variantes.

El mes y el año deben tratarse de forma diferente para los dos primeros meses del año. Enero y febrero deben tratarse como los meses 13 y 14 del año anterior. Así que el primer mes se convierte en marzo, con un valor de 3. Una implementación en Java podría ser así:

/**
 * Calculate the day of the week for a given date of the Gregorian Calendar.
 * @param year The four-digit year
 * @param month The month, from 1 (January) to 12 (December)
 * @param dayOfMonth The day of the month.
 * @return An ISO-compliant day of the week, where 1 = Monday and 7 = Sunday.
 */
public final int dayOfWeek(int year, int month, int dayOfMonth) {
  assert year > 1582 : "Four digit year required: " + year;
  int y = year;
  if (month < 3) {
    month += 12;
    y--;
  }

  return (dayOfMonth + ((month+1)*26)/10 + y + y/4 + 6 * (y/100) + y/400 + 5) % 7 + 1;
}

Se puede encontrar un artículo completo sobre la fórmula en la página de Wikipedia Congruencia de Zeller artículo

0voto

Count Iblis Puntos 2083

Es fácil, sin invocar ninguna fórmula especial, no sólo hacer aritmética en módulo 7, sino que en ese mismo espíritu también utilizar la misma lógica para los meses. Por ejemplo, ¿por qué dejar que agosto termine el 31 de agosto? es conveniente extender agosto a septiembre y definir el 32 de agosto como equivalente al 1 de septiembre.

Para calcular cuántos días han pasado módulo 7 desde el 19 de julio de 2015 (hoy es miércoles 9 de agosto de 2015), puedo considerar que hoy es el 40 de agosto, por lo que son 40 + 12 días, módulo 7 esto es 3. Luego sabemos que 365 = 1 módulo 7, por lo que si nos olvidamos de los años bisiestos los 23 años que han pasado harían que esto fuera 3 + 23 módulo 7 = 5 días de la semana antes. Cada año bisiesto hace una aportación adicional de 1 día. En un lapso de tiempo de 4 años hay un año bisiesto con la excepción de los años divisibles por 100, pero no los años divisibles por 400. Por lo tanto, no hay que preocuparse por el año 2000, que fue la excepción de la excepción. Para contar el número de años bisiestos, podemos entonces considerar simplemente el primero que cae en el intervalo de tiempo que estamos considerando y que es el año 1996. Entonces se puede dividir el intervalo de tiempo desde el 29 de febrero de 1996 y dividirlo entre 4 años y redondearlo al siguiente número entero. Pero es más sencillo considerar que el último año bisiesto en el intervalo fue el 2012 y que, por lo tanto, tuvo 16/4+1 = 5 años bisiestos.

Entonces, sumamos 5 a los 5 días sin años bisiestos y tomamos mod 7 para obtener 10 Mod 7 = 3. Ahora 3 días de la semana antes del miércoles es efectivamente un domingo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X