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.