Stupid lunar phase tricks
I've occasionally found myself attempting to figure out what the lunar phase will be for a given date, or when full moon will occur, when there's no handy calendar for the purpose. As a kid, I learned the algorithm for figuring out the day of week for a given date with a few seconds of mental effort, and decided I'd come up with a similar method for determining dates of lunar phases. As it turns out, computing lunar phase dates mentally is a lot easier than computing the day of the week, as long as you don't insist on covering many years.
To do it, you have to remember a table of digits for each month, much as you have to with the day-of-week algorithm. The table is:
January: 10 February: 8 March: 10 April: 8 May: 8 June: 6 July: 6 August: 4 September: 4 October: 3 November: 2 December: 1
You also need a table of numbers for each year. Personally, I'm only apt to remember the current year:
1998: 2 1999: 21, -8 2000: 10 2001: 28, -1 2002: 18 2003: 8 2004: 24, -3 2005: 15 2006: 4
The date of full moon for a given month, then, is the sum of the "month number" and "year number". For example: when will there be a full moon in July 2003: July's month number is 6; 2003's year number is 8. Therefore, the full moon will be on 14 July 2003.
This computes the "mean" date of full moon, and the numbers have been chosen to give results plus-or-minus one day. (I wrote a little piece of code to try out possible values for each year, picking the one that resulted in the least error.) Also, in about one year out of every three, you need two numbers. For example, in 2004, you need a year number of 24 for the last part of the year (e.g., October 2004: month number = 3 + year number = 24 gives a full moon date of 27 October 2004, but in January 2004, month number = 10 + year number = 24 would give 34 January. So we switch to month number = -3, giving a more reasonable 7 January.)
Occasionally, both month numbers work. For example: in January 1999, you get full moons of 31 January and 2 January... also known as a "blue moon".
You could derive another set of year numbers for new moons and for first/last quarters. Personally, rather than remember still more numbers, I'm apt to compute full moon dates, then back up/add on 7 days for the quarters, or 14 or 15 days for new moons.
Day of week mental algorithm: This one is quite impressive to people who don't know how it's done. It does require slightly more mental effort and memorization than the above lunar phase algorithm. On the bright side, its range covers millennia.As before, there is a year number and a month number, and as before, the month number comes from a table:
January: 0 February: 3 March: 3 April: 6 May: 1 June: 4 July: 6 August: 2 September: 5 October: 0 November: 3 December: 5
The year number, though, requires you to do some math. First, throw out the 'century' part, to get a number from 0 to 99. The Gregorian calendar repeats every 28 years within a century, so you can subtract 28, 56, or 84 from the result, thereby giving you smaller numbers with which to deal. (For example, with the year 1941, compute 41 - 28 = 13.)
Call this number x. Compute x + x/4 (in the above case, 13 + 13/4 = 16). We can now throw away multiples of seven, since the day of the week repeats every seven days; thus, 16 - 14 = 2. You don't have to do this right away; we could, for example, have used 41 + 41/4 = 51, and either then subtracted 7*7 to get 2, or left it at 51 for the moment. But usually, getting rid of those multiples of seven will get you an easier-to-remember number.
In any case... to our resulting "year number", be it 16, 2, or 51, we add the month number and the day of the month. For example, for December 7, we would add 5 and 7. Again, multiples of 7 can be discarded at will; you could add (16 + 5 + 7), or (2 + 5 + 0), etc.
Now we have to add in a "century number":
1st, 5th, 9th, 13th, 17th, 21st century: 6 or -1 2st, 6th, 10th, 14th, 18th, 22st century: 4 3st, 7th, 11th, 15th, 19th, 23st century: 2 4st, 8th, 12th, 16th, 20th, 24st century: 0
Of course, for normal use, just remembering "no century number at all" for the 20th century and an offset of -1 for the current century is sufficient. Either that, or remember the offset of 2 for the 1800s and 4 for the 1700s, and the fact that the calendar repeats every 400 years. (That is, if somebody asks you a day of the week in the year 5772, subtract 4000 years, get 1772, and know that the century offset is -1.)
For our example case in 1941, there's no century offset, and we've computed an answer of 28 or 7 or 14. Throw away multiples of seven, and you've got a result of zero... also known as "Sunday":
0 = Sunday 1 = Monday 2 = Tuesday 3 = Wednesday 4 = Thursday 5 = Friday 6 = Saturday
23 times out of 24, that's all there is to it. You do have to remember that 24th case, namely, a date in January or February of a leap year. In that situation, you have to back up one day. An example: 22 Feb 1732: offset for the 18th century is 4, and (32 + 32 / 4) = 40, bringing us up to 44. (At this point, I'd discard multiples of seven: 44 - 7 * 6 = 2.) Our "month offset" for February is 3, plus 22 for the date: 2 + 3 + 22 = 27. Again throw away multiples of seven, to get 27 - 3 * 7 = 6.
Normally, we'd be done, but this is the "24th case" of January or February in a leap year. So we back up by one day to get a result of 5, also known as "Friday".