473,325 Members | 2,671 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,325 software developers and data experts.

Easter function explanation Part II (long)

From:

http://groups-beta.google.com/group/...0f97a90?hl=en&

Errata:

19 solar years = 2939.6018 days should be
19 solar years = 6939.6018 days

Easter Function explanation Part II

Terms:
luna XIV - the 14th day of the first lunar month of spring, also called
the 'Paschal term' because Easter is the Sunday after it.
feria - day of the week on which any given date falls, expressed either
by its name or by a number: 1 = Sunday
bissextile - Roman name for the leap day in a leap year the 'twice
sixth' denoting the repetition of the 'sixth day before the Kalends of
March', 24 February.
millésime - the number of the year in an era
indiction - a 15-year cycle devised in the later Roman empire for
taxation purposes, and long maintained as a dating formula
Golden Number - the number indicating the place of the year in the
decemnovenal cycle as used by the Western Church, found by adding 1 to
the year AD and dividing the sum by 19; the remainder is the GN, or if
there is no remainder, the GN is 19
epact - Age of the moon on a given day of the solar year, especially in
Easter computus that on 1 January, 22 March, or 31 December
concurrent - number related to how many days from the Paschal term
until Easter Sunday
Sunday Letter - method using letters that replaced the use of
concurrents

All quotes are from the Oxford Companion to the Year by Bonnie
Blackburn and Leofranc Holford-Strevens. The authors have obviously
made ancient and modern calendar systems a lifelong pursuit. Also,
Leofranc's understanding of many ancient, Middle Age and modern
languages is phenomenal and inspiring. I also sense from the authors'
comments that there is a scattering of people throughout the globe that
share his obsession. First I'll give their explanation of Gauss'
formula:

pp 864 - 865
"
Readers with a facility for mental arithmetic may prefer to find Easter
by a formula derived from the celebrated mathematician Carl Friedrich
Gauss (1777-1855), directed at determining first the number of days by
which luna XV (not luna XIV) falls later than its earliest possible
date, 22 March, and then the number of days from luna XV to Sunday;
when both are 0, Easter falls on 22 March. Let year AD be Y; take the
remainder of Y to 19, 4, and 7 respectively:

a is congruent to Y mod 19
b is congruent to Y mod 4
c is congruent to Y mod 7

For the Julian canlendar put:

d is congruent to 19a + 15 (mod 30)
e is congruent to 2b + 4c + 6d + 6 (mod 7)
Easter = 22 + d + e March, or d + e - 9 April

As always, things are not so simple in the Gregorian calendar. Put

S = [Y / 100] (i.e., divide by 100 and ignore the remainder)

s = [(S - 17) / 25] (=0 down to 4299)

M is congruent to 15 + S - [S / 4] - [(S - s) /3] (mod 30)

d is congruent to 19a + M (mod 30)

except that:

if M = 0, 3, 6, 8, 11, 14, 17, 19, 22, 25, 27, and 19a + M (mod 30) =
29, d = 28.

if M = 2, 5, 10, 13, 16, 21, 24, 29, and 19a + M (mod 30) = 29, d = 27.

N is congruent to S - 3 - [S / 4] (mod 7)
e is congruent to 2b + 4c + 6d + N (mod 7)

Then, as before,

Easter = 22 + d + e March, or d + e - 9 April

Century M N
1500-1699 22 2
1700-99 23 3
1800-99 23 4
1900-2099 24 5
2100-99 24 6
2200-99 25 0
2300-99 26 1
2400-99 25 1
"
pp 801-802
"
METONIC CYCLES The mean length of the synodic month or lunation, from
new moon to new moon, is 29.53059 days; the traditional approximation
of 29 1/2 days, taken over by the Christian computists, entails an
alternation of 30-day 'full' months and 29-day 'hollow' months. On
this footing, 12 months amount to 354 days, 11 days fewer than the
calendar year of 365 days; the deficit is made up by adding extra
'embolismic' months of 30 days at various points in a cycle designed to
correlate the lunar with the solar year. In accordance with a
tradition that Jews, Greeks, and early Romans had kept their calendar
in touch with the sun by intercalating three months in every eight
years, the earliest Easter computus was based on the eight-year cycle
or oktaeteris, which inserted an embolism in years 3, 6 and 8; but a
more accurate device is the 19-year cycle or enneakaidekaeteris, known
as the Metonic cycle after the Athenian astronomer Meton (fl. 432 BC)
based on the near-equivalence of 235 synodic months = 6939.68865 days
and 19 tropical years = 6939.6018 days. Depending on the
starting-point, embolisms will occur at three- and two-year intervals,
combining into subcycles of eight years (intercalated 3, 3, 2) and
eleven (intercalated 3, 3, 3, 2); these are known respectively as the
ogdoad and the hendecad, terms of no practical use, but often flaunted
by computists.

....

SOLAR YEARS Since the common year contains 365 is congruent to 1 mod 7
days, in any two consecutive common years any given date will fall one
feria later in the second than the first; since leap year contains 366
is congruent to 2 mod 7 days the difference will be two feriae if leap
day intervenes. It is therefore possible, knowing the feria of a given
date in a particular year, to finds its feria in any subsequent year by
adding one day for each year elapsed and one day for each leap year;
that is to say, dividing the number of years by 4, ignoring the
remainder, and adding the quotient to the dividend. In an era reckoned
by current years, as is normal outside India, the feria of the first
day in any year can be determined by the ferial formula Y + [Y / 4] + P
(mod 7); add to the year of the era its quarter, ignoring fractions,
and a parameter corresponding to the feria of the day preceding the
first day of the era (since 1 will be added for year 1), and take the
remainder to 7. However, in the Julian calendar the ferial cycle of 7
days and the bissextile cycle of 4 years have a combined periodicity of
28 years, known as the solar cycle; one may therefore apply the ferial
formula not to the millésime of the year, but to its place in the
solar cycle of the calendar in question, except for the Western
calendar, in which this method dispenses with the parameter 9 required
on p. 811.

PASCHAL CYCLES The 19- and 28- year cycles combine to form a 532-year
sequence, devised by Annianus in the early fifth century and stumbled
into a few decades later by Victorius of Aquitaine, variously known as
a 'Great Cycle', a 'Great Year', a 'Paschal cycle', alpha (because in
Greek the numerical value of the constituent letters is 532), and in
Russian as a 'Great Indiction'. In the Julian calendar, though not the
Gregorian, Easter in any year falls on the same date as it did 532 or
1064 years previously.
"

pp 817-818
"
When Pope Gregory XIII changed the style in 1582, he did not change the
definition of Easter, which remained the Sunday after the 14th lune on
or next after 21 March, but advanced 21 March nominal by 10 days to the
natural day previously called the 11th, with provision for further
transference to the 10th, the 9th, the 8th, and so forth. As a result,
14th lunes that had hitherto preceded 21 March now followed it, and
constituted Paschal terms. The 532-year cycle therefore needed to be
replaced; the opportunity was also taken to compensate for the excess
in the true synodic month. Moreover, since the Golden Numbers could no
longer be written against the new moons in the calendar unless a new
calendar were prepared from century to century, they were confined to
the ancillary function of indicating the epact, which became once more
the basis of the computus; its seat was moved from 22 March to 31
December in the previous year, so that Gregorian epact e corresponds to
pre-Dionysian E - 1.

In each century (defined for this purpose as running from 00 to 99) the
19 Golden Numbers, still equivalent to Y + 1 (mod 7) [I believe the
author meant mod 19], correspond to 19 different epacts, increasing by
11 with a saltus at the end of the cycle; but the epacts change from
century to century (see Table 7). Every time an intercalation is
suppressed, the epact is reduced by one; for ease of reckoning, the
reduction, known as the 'solar correction', is made with effect from 1
January instead of 25 February. However, to compensate (a little too
much) for the excess of the true synodic month over 29.5 days, the
epact is increased eight times in 2500 years; this 'lunar correction'
is made seven times after 300 years and the eighth after 400. Only in
centennial leap years does it actually increase the epact; otherwise it
cancels the solar correction, as when it was first made in 1800, which
was deemed the last in a 2500-year cycle. Of the future corrections,
due every 300 years up to and including 3900 but not again till 4300,
only those of 2400 and 3600 will actually augment the epact; in all
other cases (2100, 2700, 3000, 3300, 3900, 4300) the solar correction
will be cancelled. Hence in years divisible by 400 the epact rises if
there is a lunar correction and otherwise remains the same; in other
centennial years it remains the same if there is a lunar correction and
otherwise diminishes by 1.

Each set of epacts is set out in a line with an index-letter, also used
in the Roman Martyrology (See App. E). The epacts from 15 October 1582
to 31 December 1599 stand on line D; thereafter the lines are:

1600 D (no correction)
1700 C (solar correction only)
1800 C (solar correction cancelled by lunar)
1900 B (solar correction only)
2000 B (no correction)
2100 B (solar correction cancelled by lunar)
2200 A (solar correction only)
2300 u (solar correction only)
2400 A (lunar correction only)

Hence the epacts of 1900 will remain in force down to 2199.
"

pp. 809-810
"
Dionysius' first year, 532, was exactly divisible without remainder.
Now since 248 = 13 x 19 + 1, this year was the first of a new cycle;
since 532 = 28 x 19 without remainder, the place of a year AD is found
by adding 1, dividing by 19, and taking the remainder (treating 0 as
19). This was later known in the West as the Golden Number, in which
'Golden' means 'especially important', as in Golden Rule and Golden
Section;

....

The concurrent is found by the ferial formula with parameter 4;

....

Thus to find the date of Easter in 729:

719 _ 1 = 730 = 19 x 38 + 8 therefore Golden Nubmer = 8 therefore epact
= 17
or 729 = 19 x 38 + 7; 7 x 11 = 77; 77 = 30 x 2 + 17 therefore epact =
17
"

p. 811
"
Concurrents recur in a solar cycle of 28 years, after which years must
repeat in respect both of intercalation and the feria of 1 January. In
order that the first four years of the cycle should have concurrents 1,
2, 3, and 4, a new cycle was taken to begin in 9 BC; AD 1 is solar
cycle 10, and the cyclical place of any year is found by adding 9 and
dividing by 28; the ferial formula may then be applied without the
addition of a parameter. Thus 729 + 9 = 738 = 28 x 26 + 10; [10 / 4] =
2; 10 + 2 = 12 is congruent to 4 mod 7, therefore concurrent = 5. In
the later Middle Ages the concurrent was discarded in favour of the
Sunday Letter;
"

BTW, the Golden Number for 2005 is 11 (p. 876). England adoped the
Gregorian calendar in 1752. In spite of the epact being referred to as
e, the e in Gauss' formula has almost nothing to do with the epact.
For the Julian part of Gauss' solution, 'a' is related to the where the
year is in the 19 year Metonic cycle. 'b' and 'c' are related to the
28 year solar cycle formed by leap years every four years and the seven
possible days. 'd' is approximately the number of days after the
equinox when the moon becomes full. 'e' is the number of days after
that day until Easter Sunday. The 19a + 15 (mod 30) is related to the
fact that the epact retreats by 11 days each year. -11 is congruent to
19 mod 30. The 15 gets you from the new moon to approximately the full
moon. I discovered what the mod 30 was for when I did an astronomical
calculation of Easter using the continuous values. Using the
continuous values, the epact moved about within a 29.53059 day window.
Gauss wisely started 0 as the day following the equinox. So the window
actually goes from 0 to about 28.5 and taking a number mod 30 gives you
from 0 to 29. There is nearly half day difference between the
continuous value and the integer value which I assume is moved forward
from the start of the equinox. It also handles the problem of the
epact in relation to the equinox apparently backing up by 11.25 in
non-leap years (365.25 - 354) in relation to the sun. The good news is
that if the Weekday function is kept up to date (say until 8914 AD),
once you have 'd' you can calculate the Sunday on or after that day.
The variable M is related to the lunar correction necessary to keep in
line with the equinox. The variable N is related to the solar
correction above and beyond the normal four year leap year cycle. A
key fact is that, unlike so many methods in the past, just about
everyone agrees with Gauss' solution. So my proposed Easter function,
awaiting some final verification involving having a function implement
the full Gauss solution and comparing the values of the two for about
the next 6000 years is:

Public Function IsEaster(dtTestDate As Date) As Boolean
Dim M As Integer
Dim d As Integer
Dim y As Integer
Dim DT As Date
Dim S1 As Integer 'S
Dim S2 As Integer 's

IsEaster2 = False
If Month(dtTestDate) < 3 Or Month(dtTestDate) > 4 Then Exit Function
If Month(dtTestDate) = 3 And Day(dtTestDate) < 22 Then Exit Function
If Month(dtTestDate) = 4 And Day(dtTestDate) > 25 Then Exit Function
y = Year(dtTestDate)
S1 = y \ 100
S2 = (S1 - 17) \ 25
M = (15 + S1 - S1 \ 4 - (S1 - S2) \ 3) Mod 30
d = (19 * (y Mod 19) + M) Mod 30
Select Case d
Case 29:
Select Case M
Case 0, 3, 6, 8, 11, 14, 17, 19, 22, 25, 27:
d = 28
Case 2, 5, 10, 13, 16, 21, 24, 29:
d = 27
End Select
End Select
DT = DateAdd("d", d, DateSerial(y, 3, 22))
DT = DT + (8 - WeekDay(DT)) Mod 7
If Month(dtTestDate) = Month(DT) And Day(dtTestDate) = Day(DT) Then
IsEaster = True
End Function

James A. Fortune

These [Easter and the dependent feasts and fasts] are reckoned
according to a Metonic cycle that for 528 years out of 532 yields the
normal Julian Easter, but in the remaining four causes Easter to be
kept on 13 April instead of the 6th. These 'false Easters' have been a
subject for discord between the Armenians and the 'Greeks and
Georgians' - p. 740

It would be sadly ironic if the dispute and resulting bad feelings over
when to hold a religious holiday played any part in what happened to
the Armenians in Turkey not too many years later.

Nov 13 '05 #1
1 3303
ji********@compumarc.com wrote:
Public Function IsEaster(dtTestDate As Date) As Boolean
Dim M As Integer
Dim d As Integer
Dim y As Integer
Dim DT As Date
Dim S1 As Integer 'S
Dim S2 As Integer 's

IsEaster2 = False
If Month(dtTestDate) < 3 Or Month(dtTestDate) > 4 Then Exit Function
If Month(dtTestDate) = 3 And Day(dtTestDate) < 22 Then Exit Function
If Month(dtTestDate) = 4 And Day(dtTestDate) > 25 Then Exit Function
y = Year(dtTestDate)
S1 = y \ 100
S2 = (S1 - 17) \ 25
M = (15 + S1 - S1 \ 4 - (S1 - S2) \ 3) Mod 30
d = (19 * (y Mod 19) + M) Mod 30
Select Case d
Case 29:
Select Case M
Case 0, 3, 6, 8, 11, 14, 17, 19, 22, 25, 27:
d = 28
Case 2, 5, 10, 13, 16, 21, 24, 29:
d = 27
End Select
End Select
DT = DateAdd("d", d, DateSerial(y, 3, 22))
DT = DT + (8 - WeekDay(DT)) Mod 7
If Month(dtTestDate) = Month(DT) And Day(dtTestDate) = Day(DT) Then
IsEaster = True
End Function

James A. Fortune


'Test IsEaster2 function code behind form
DT = DateSerial(2005, 1, 1)
For lngI = 1 To 2191500 'Roughly 6000 years
If IsEaster(DT) <> IsEaster2(DT) Then
MsgBox (DT)
Exit For
End If
DT = DateAdd("d", 1, DT)
Next lngI
MsgBox ("Done.")

'Module code
Public Function IsEaster(dtTestDate As Date) As Boolean
Dim M As Integer
Dim N As Integer
Dim d As Integer
Dim e As Integer
Dim F As Integer
Dim y As Integer
Dim S1 As Integer
Dim S2 As Integer
Dim EMonth As Integer
Dim EDay As Integer

IsEaster = False
If Month(dtTestDate) < 3 Or Month(dtTestDate) > 4 Then Exit Function
If Month(dtTestDate) = 3 And Day(dtTestDate) < 22 Then Exit Function
If Month(dtTestDate) = 4 And Day(dtTestDate) > 26 Then Exit Function
y = Year(dtTestDate)
S1 = y \ 100
S2 = (S1 - 17) \ 25
M = (15 + S1 - S1 \ 4 - (S1 - S2) \ 3) Mod 30
d = (19 * (y Mod 19) + M) Mod 30
Select Case d
Case 29:
Select Case M
Case 0, 3, 6, 8, 11, 14, 17, 19, 22, 25, 27:
d = 28
Case 2, 5, 10, 13, 16, 21, 24, 29:
d = 27
End Select
End Select
N = (S1 - 3 - S1 \ 4) Mod 7
e = (2 * (y Mod 4) + 4 * (y Mod 7) + 6 * d + N) Mod 7
F = d + e
If F > 9 Then
EMonth = 4 'April, Access Style
EDay = F - 9
Else
EMonth = 3 'March, Access Style
EDay = 22 + F
End If
If Month(dtTestDate) = EMonth And Day(dtTestDate) = EDay Then
IsEaster = True
End If
End Function

Public Function IsEaster2(dtTestDate As Date) As Boolean
Dim M As Integer
Dim d As Integer
Dim y As Integer
Dim DT As Date
Dim S1 As Integer
Dim S2 As Integer

IsEaster2 = False
If Month(dtTestDate) < 3 Or Month(dtTestDate) > 4 Then Exit Function
If Month(dtTestDate) = 3 And Day(dtTestDate) < 22 Then Exit Function
If Month(dtTestDate) = 4 And Day(dtTestDate) > 25 Then Exit Function
y = Year(dtTestDate)
S1 = y \ 100
S2 = (S1 - 17) \ 25
M = (15 + S1 - S1 \ 4 - (S1 - S2) \ 3) Mod 30
d = (19 * (y Mod 19) + M) Mod 30
Select Case d
Case 29:
Select Case M
Case 0, 3, 6, 8, 11, 14, 17, 19, 22, 25, 27:
d = 28
Case 2, 5, 10, 13, 16, 21, 24, 29:
d = 27
End Select
End Select
DT = DateAdd("d", d, DateSerial(y, 3, 22))
DT = DT + (8 - WeekDay(DT)) Mod 7
If Month(dtTestDate) = Month(DT) And Day(dtTestDate) = Day(DT) Then
IsEaster2 = True
End Function

I think I'll change '> 25' back to '> 26' in IsEaster2 because 6000
years aren't enough to test all the possible cases. Then I'll change
IsEaster2 to IsEaster and use that. Anyway, there will probably be an
additional correction day before the year 9000 so the function will
have to be changed anyway.

James A. Fortune

Nov 13 '05 #2

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

9
by: Penn Markham | last post by:
Hello all, I am writing a script where I need to use the system() function to call htpasswd. I can do this just fine on the command line...works great (see attached file, test.php). When my...
11
by: Michael \(michka\) Kaplan [MS] | last post by:
A little light humor... this "easter egg" was hidden deep in the Access 95 help system. I did not write it (I am not this creative and never was) and I did not put it in the product (I was not on...
2
by: Gustavo G. Rondina | last post by:
It is possible to caclulate every year's easter using simple mathematical operations. Here is a code that does the trick: http://www.brlivre.org/c/easter.c I found the math scheme in an...
6
by: karthi | last post by:
hi, I need user defined function that converts string to float in c. since the library function atof and strtod occupies large space in my processor memory I can't use it in my code. regards,...
28
by: Larax | last post by:
Best explanation of my question will be an example, look below at this simple function: function SetEventHandler(element) { // some operations on element element.onclick = function(event) {
8
by: optimistx | last post by:
In excellent YAHOO user interface programs I see often extra parenthesis like this (foo=function(){ alert('I am foo'); })(); instead of bar=function(){
83
by: Anonymous | last post by:
Came across some code summarized as follows: char const* MyClass::errToText(int err) const { switch (err) { case 0: return "No error"; case 1: return "Not enough"; case 2: return "Too...
2
by: dwasbig9 | last post by:
Hi Group (fairly limited knowledge of Access and almost none of Access VBA. Using Access 2003). I need to sum time, I've found through the groups archive an sql extract that led me to this ...
6
by: WolfgangS | last post by:
Ok first off, i am a total beginner at this groups stuff and i have no clue how this works. This is probabaly the wrong group for my problem but i will post it anyways. Learning by doing right? ...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
1
by: Defcon1945 | last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
1
by: Shćllîpôpď 09 | last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.