Challenge Level

Zeller worked out a formula to calculate the day of the week for any date.

$$

d= \left(n+\mbox{int}\left[\frac{(m+1)\times 26}{10}\right]+y+\mbox{int}\left[\frac{y}{4}\right]+\mbox{int}\left[\frac{C}{4}\right]-2C\right)\mbox{mod }7

$$

This formula contains a lots of symbols and terminology, as follows:

In Zeller's formula $d$ stands for the day of the week, numbered $0$ to $6$ for Saturday - Friday.

$n$ is the day of the month, numbered 1 to 28, 29, 30 or 31 depending on the month in question.

$m$ is the month, numbered from $3-12$ for March - December; $m=13$ in January and $m=14$ in February.

$y$ is the last two digits of the year, or the last two digits of the previous year if $m=13$ or $14$.

$C$ is the first two digits of the year.

'int[$x$]' is a function which rounds $x$ down to the nearest integer or returns $x$ if $x$ is already an integer.

'mod 7' means return the remainder when divided by 7.

There are two parts to your task:

1) Check that you can use the formula to work out the day of the week for a few dates.

2) (Difficult extension) Work out why it is, either roughly or exactly, that Zeller's algorithm works. A spreadsheet might help to work out why each term is present in the algorithm.

$$

d= \left(n+\mbox{int}\left[\frac{(m+1)\times 26}{10}\right]+y+\mbox{int}\left[\frac{y}{4}\right]+\mbox{int}\left[\frac{C}{4}\right]-2C\right)\mbox{mod }7

$$

This formula contains a lots of symbols and terminology, as follows:

In Zeller's formula $d$ stands for the day of the week, numbered $0$ to $6$ for Saturday - Friday.

$n$ is the day of the month, numbered 1 to 28, 29, 30 or 31 depending on the month in question.

$m$ is the month, numbered from $3-12$ for March - December; $m=13$ in January and $m=14$ in February.

$y$ is the last two digits of the year, or the last two digits of the previous year if $m=13$ or $14$.

$C$ is the first two digits of the year.

'int[$x$]' is a function which rounds $x$ down to the nearest integer or returns $x$ if $x$ is already an integer.

'mod 7' means return the remainder when divided by 7.

There are two parts to your task:

1) Check that you can use the formula to work out the day of the week for a few dates.

2) (Difficult extension) Work out why it is, either roughly or exactly, that Zeller's algorithm works. A spreadsheet might help to work out why each term is present in the algorithm.

Did you know ... ?

Date algorithms are complicated by leap years, when there are 29 days in February. Leap years occur roughly every 4 years, although on occasions a leap year is skipped. The precise rule for determining leap years is as follows:

If the year modulo 400 is 0 then it is a leap year; else if the year modulo 100 is 0 then it is not a leap year; else if the year modulo 4 is 0 then it is a leap year; else it is not a leap year.

Some human calculators are able to run Zeller's algorithm in their heads. Can you learn how to do this? You can see an awesome human calculator in action on You Tube.

Date algorithms are complicated by leap years, when there are 29 days in February. Leap years occur roughly every 4 years, although on occasions a leap year is skipped. The precise rule for determining leap years is as follows:

If the year modulo 400 is 0 then it is a leap year; else if the year modulo 100 is 0 then it is not a leap year; else if the year modulo 4 is 0 then it is a leap year; else it is not a leap year.

Some human calculators are able to run Zeller's algorithm in their heads. Can you learn how to do this? You can see an awesome human calculator in action on You Tube.