The Gregorian Modifications --------------------------- The reformed calendar is actually extremely conservative. Its one radical measure, dropping 10 days in October, was itself done under constraint of the Nicene date of March 21 for the equinox. The Julian leap-year is basically kept intact, with a "correction" on century years (which I'd bet most people don't remember, except maybe for a brief time near the centuries :-)). More accurate rules could be devised -- and had been proposed; some criticism was directed at the Gregorian proposal BECAUSE it wasn't as accurate as it might be. [My own, tongue-in-cheek, proposal would be for us to go over to an octal system; we would use the Julian rule except that octal "bicentennial" (every 128 = 2*8^2) years don't leap.] The actual rule is both fairly good and fairly easy -- and almost no difference in practice from what it replaces. The lunar calendar, though necessarily more complex, also retains a form which permits construction, for all years in a given century, of the same kind of simple table I constructed last time for the paschal moons. Because of the Gregorian leap year correction, there is a "missing" day every non-leap century year, and at those points the new moons slip forward a day. (So, in the Gregorian calendar it's possible to have a paschal new moon on any day from March 8 to April 5, not just on the 19 days of the table I gave last time.) Besides the "solar" correction to the 19-year cycle, there's a "lunar" correction as well. The Julian cycle *assumed* that 235 months were exactly equal to 6939.75 days; but 235 * 29.53059 = 6939.68865 days; i.e. the new moons of a new cycle are about an hour and a half earlier than the previous ones. This mounts up to the new moons slipping behind one day in about 310 years (19 * 1/(.75 - .68865)). The Gregorian commission took this value to be 312.5, so that working to an integral number of centuries there are 8 days in 2500 years to account for. The solar correction adds a day to the new moon dates in 3 out of 4 century years; the lunar correction subtracts a day every 300 years (the first was in 1800, then 2100 and so on to 3900; after 8 of these the cycle runs out a final century to 4000, and the next subtraction is in 4300.) Details ------- For a number of reasons, notably the possible appearance of new moons at any day of any month, the underlying details of calendar construction for ecclesiastical months uses a different method than the older Julian construction. It gets new months *indirectly* from a quantity called "epact" -- essentially the "age" of the moon on Jan. 1st (and also March 1st, which is what I'll actually calculate with). Starting with a new moon on March 1st one year, after 12 regular months the "same" month begins next year 11 days back into February, and the moon on March 1st is 11 days "older" -- the epact is 1+11. Next year it's 23, then 34-30 = 4, etc. This is almost the "same" calculation in the reverse direction to what I used last time to get paschal new moons. But by adding the solar and lunar corrections, we can come out with any value from 1 to 30 (or 0 to 29 with 0 identified with 30 -- it's the last day of the "old" moon and the day of astronomical conjunction, with epact 1 being the new moon for church purposes.) epact = (13 + 11 * (year % 19) - solar + lunar) % 30; where century = year/100; /* the Gregorian calendar very */ solar = century - century/4; /* cleverly does all adjustment */ lunar = (century - 15)/3; /* on century years only! */ Notes: the solar correction as I give it here is 12, not the 10 one might expect (for that, I'd have to use (century-3) - (century-3)/4, as we are adjusting back to Nicea, not to the year 1 A.D. There is no need here to be fussy, since I can absorb the other two days in the constant term of the epact equation. Also, this version of the lunar correction is valid only up to 4199 A.D. For true pedantry, you can use lunar = (century - 15 - (century-17)/25)/3; In the form above, epact can be negative (e.g. if year % 19 == 0 and the solar correction is large enough). Some systems take the % operator to yield negative remainders from negative input, so the equation for epact should be supplemented by: if (epact < 0) epact += 30; This is almost enough to give us the paschal new moon and easter. There is a new moon in March determined from the epact: new_moon = 31 - epact; if (new_moon < 8) new_moon += 30; Unfortunately this is not quite right. Unlike the old Julian cycle, it is *possible* for the moon before the paschal moon to have 29 days. The details of how 29-day months are disposed are complex (but clever; they have to do with some hacking with epacts 24, 25 and 26 in constructing a full table of calendar new moons against epacts. See the _Encyclopedia Britannica_ calendar article for details.) For our purposes, it is enough to note that the pre-paschal month has 29 days ONLY when epact is 24 or it is 25 and the cycle is in its last 8 years -- this is usually marked in tables as epact 25', and it is assimilated to epact 24.) Thus, we get (correctly this time :-)) new_moon = 31 - epact; if (new_moon < 8) if (epact == 24 || epact == 25 && (year%19) > 10) new_moon += 29; else new_moon += 30; We get from there to the full moon, its weekday and Easter by the same method as in the Julian calendar: full_moon = new_moon + 13; week_day = (2 + year + year/4 - solar + full_moon) % 7; easter = full_moon + 7 - week_day; if (easter > 31) printf("April %d\n", easter-31); else printf("March %d\n", easter); the only difference being the week_day calculation, which has to take into account the 10 days of October 1582 and subsequent solar correction.) The final installment in this series will be a C program that prints out both Julian and (after 1582) Gregorian data on golden numbers, dominical letters (i.e. day of the week counted from Jan 1 as A on which Sundays fall), epacts, paschal moon, Easter and Ash Wednesday (= easter - 46; remember that Sundays are not fast days) for a year or range of years.