計算復活節
Clavius的復活節算法
Donald Knuth的經典
The Art of Computer Programming
介紹了由 Clavius 所提出的推算復活節的算法(Algorithm)。我沒有讀清楚 Donald 的著作,以為是「數學王子」高斯 Gauss 的傑作,是我讀書不精,被高斯的權威、聲望所蒙蔽,的確是個美麗的誤會,謹向多年來的 LaSallian 道歉。今日之前我還說是AOCP第一版的錯,今天(二零零六年二月五日)已証實是我的錯,謹此向 Donald 道歉。
為了方便算法的表達,我選用 Pascal 撰寫。不懂 Pascal 的讀者不用氣餒, Clavius 的算法祇要求兩個特別的運算如下:
DIV
:整除,即除數運算所得的「商」。
MOD
:求餘。例如:
2003 被 100 除,得 20 為商, 3 為餘數。配以賦值符號
:=
, 整數 A 得 20,整數 B 得 3。
A
:=
(2003
DIV
100);
B
:=
(2003
MOD
100);
郭志強
二零零六年二月五日
請在以下空格填上任何大於 1582 的整數,按【計算復活節】查閱結果。
太陽年與朔望月
天主創造天地的玄妙,不在乎取悅於人,故此:
1太陽年合365.2422日(請參閱
Earth fact sheet
)
1朔望月合 29.53059日(請參閱
Moon fact sheet
)
第一個數字(365.2422)帶來了「閏年」的概念。公元前四十六年,儒略凱撒(Julius Caesar)頒佈曆法,「平年」為365日,第四年為「閏年」,有366日。當年的春分(Spring Equinox)在三月廿五日。
粗略地計算,365.2422 x 400 = 146096.8。所以,400年祇應有97個閏年。
到了公元325舉行的尼西大公會議(Nicea Council)時,已多加了三個閏年,那年的春分已「提前」到三月廿一日。那一次的大公會議訂定了復活節的慶祝日期:春分(三月廿一日)後的圓月之後的星期日。
差不多十二個半世紀之後,公元1563年脫利騰大公會議(Council of Trend)時,春分已「提前」到三月十一日了。結果,教宗額我略八世經過了十九年的努力,完成了修訂的方案,頒佈了新的額我略曆(Gregorian Calendar),作出了大刀闊斧的安排:
一五八二年十月四日之後是十月十五日。
一年以January 1開始。(不要忘記中國人以農曆正月初一為一年之始)
世紀之年(1600, 1700, 1800, 1900, 2000, 2100...)若非四百所整除,不是閏年。
他的改革,要到十八世紀纔被
基督教國家
如德國(1700)、英國(1752)所接受。
第二個數字(29.53059)使根據月亮的曆法(陰曆 Lunar Calendar,如初一、十五之類)和根據太陽的曆法(陽曆 Solar Calendar,如春分秋分、冬至夏至等)很難吻合。
粗略計算: 365.2422 = 12* 29.53059 + 10.875。
即每年的陽曆一月一日的月亮會遷移十一日。這個就是
Epact
的概念。
公元前432年,雅典的天文學家 Meton 發現了 19 個太陽年相當於 235 個朔望月的現象,史稱 Metonic Cycle。即是說,祇有 19, 38, 57, 76, 95 歲的西曆生日,纔會和你的唐曆生日吻合!
19 個太陽年有: 19* 365.2422 / 29.53059 = 234.9970749 朔望月
從以上點滴的天文曆法小知識,可想而知,釐訂每年的春分(陽曆的概念)之後的圓月(陰曆的概念)確非輕易。額我略的工作是得到一位天文及數學家,耶穌會神父
Christopher Clavius
和醫科教授
Aloisius Lilius
協助完成的。
撰寫這篇網頁,提昇了編寫 Javascript 程式的能力,其中亦走了不少歪路。過程總比成果珍貴。謹此互勉!
12
th
April, 2003