-
-
Notifications
You must be signed in to change notification settings - Fork 357
/
Copy pathgauss_easter.py
55 lines (41 loc) · 1.48 KB
/
gauss_easter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
def computus(year, servois=False):
# Year's position on the 19-year metonic cycle
a = year % 19
# Century index
k = year // 100
# Shift of metonic cycle, add a day offset every 300 years
p = (13 + 8 * k) // 25
# Correction for non-observed leap days
q = k // 4
# Correction to starting point of calculation each century
M = (15 - p + k - q) % 30
# Number of days from March 21st until the full moon
d = (19 * a + M) % 30
# Returning if user wants value for Servois' table
if servois:
return str((21 + d) % 31)
# Finding the next Sunday
# Century-based offset in weekly calculation
N = (4 + k - q) % 7
# Correction for leap days
b = year % 4
c = year % 7
# Days from d to next Sunday
e = (2 * b + 4 * c + 6 * d + N) % 7
# Historical corrections for April 26 and 25
if (d == 29 and e == 6) or (d == 28 and e == 6 and a > 10):
e = -1
# Determination of the correct month for Easter
if 22 + d + e > 31:
return "April " + str(d + e - 9)
else:
return "March " + str(22 + d + e)
# Here, we will output the date of the Paschal full moon
# (using Servois notation), and Easter for 2020-2030
print(
"The following are the dates of the Paschal full moon (using Servois",
"notation) and the date of Easter for 2020-2030 AD:",
)
print("Year\tServois number\tEaster")
for year in range(2020, 2031):
print(f"{year}\t{computus(year, servois=True)}\t\t{computus(year)}")