Happy birthDay
Can you interpret this algorithm to determine the day on which you were born?
Problem
$$
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.
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.
Student Solutions
This solution is not 'complete', but does indicate why the formula works. It will make more sense if you test it out using a spreadsheet.
This tasks seems daunting at first but then you might realise that essentially the function is a 'counter' and the year starts at 1st March and ends on 28/9th of February.
Years are always of the same structure with the exception of the last day of Feb:
From 1st March to 1st April is +31 days.
From 1st April to 1st May is +30 days.
From 1st May to 1st June is +31 days.
etc.
For weekday calculations we are only interested in mod 7 changes. Since 31 is 3 mod 7 and 30 is 2 mod 7 we have the following differences between the first of the months, with the +0/1 corresponding to February.
(1Mar) +3, +2, +3, +2, +3, +3, +2, +3, +2, +3, +3,+0/1 (1Mar)
Accumulating the changes from the 1st March (mod 7) gives
(1Mar) 0
(1Apr) 3
(1May) 5
(1Jun) 1
(1Jul) 3
(1Aug) 6
(1Sep) 2
(1Oct) 4
(1Nov) 0
(1Dec) 2
(1Jan) 5
(1Feb) 1
(1Mar) 1 or 2 in a leap year
Interestingly, the $\mbox{int}\left[\frac{(m+1)\times 26}{10}\right]$ part matches these offsets with the labellings of months given (try it out to see).
So, in the absence of leap years the expression would work.
The part $y+\mbox{int}\left[\frac{y}{4}\right]+\mbox{int}\left[\frac{C}{4}\right]-2C$ has the correct mod 7 behaviour to count the leap years (try it).