** 以下內容由用戶提供,88DB 不為內容之準確性作任何保證,如你認為此內容不妥,請「接此」回報給我們。

計算復活節

34 1
大家放復活節假就放得多,但係大家又知唔知道復活節都有計算方法?
根據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。個個程式係o甘的:
Y := 2006; {Y 代表年份。}C := (Y DIV 100) + 1; {C(21) 代表世紀。}G := (Y MOD 19) + 1;
{G(12) 代表 Y 在 Metonic Cycle 的 Golden Number。}X := (3*C DIV 4) - 12; {X(3) 表示自從1582共放棄了多少個閏年。}Z := ((8*C + 5) DIV 25) - 5;
{Z(1) 表示 Clavius 誤差,每 2500 年約有 8 天,又稱 Lunar Equation。}D := ((5*Y) DIV 4) - X - 10;
{D(2494) 有助尋找三月的第一個星期日,方法是計算 ((-D) MOD 7)}
{2006年三月的第一個星期日在三月5日 }E := (11*G+20+Z-X) MOD 30;If (E=25)AND(G>11) then    E:=1+E;
If (E = 24) then E := 1+E;
{E(0): Epact 月亮在一月一日有多「老」,29.53 - E 便是下一個新月。}N := 44 - E; {N(14) 三月的圓月就在這一天,(29.53-E)+15=44-E}If (21 > N) then N := 30+N; {N(44)尋找春分之後的圓月}S := (N+7) - ((D + N) MOD 7); {S(47) 移到下一個星期日}If (S > 31) then 四月(S-31)日
   else 三月S日 ; {2006年四月16日}