2011年12月31日 星期六

心算萬年曆,你也做得到

很羡慕星期一專欄的作者,連續兩星期恰逢信報休刋日(12 月 26 日聖誕翌日及 1 月 2 日元旦翌日),得以在佳節期間頓筆小休。

活了三十餘年,今年才發覺聖誕和元旦恰好七天之隔,必定在同一星期天!這「發現」本來不值一哂,但推而廣之,可以幫助我們不看日曆也能輕鬆推算某日星期幾。讓我循序漸進,帶領大家學習心算萬年曆。

26 號之外,12 月還有哪天星期一?簡單,19 號、12 號、5 號,26 減去 7 的倍數就是。

今年 10 月 31 日萬聖節是星期幾?逐星期減太慢太煩,幸好有條捷徑。每年 4 月 4 日、6 月 6 日、8 月 8 日、10 月 10 日和 12 月 12 日都在同一星期天;今年 12 月 12 日是星期一,即是 10 月 10 日也是星期一,萬聖節與 10 月 10 日相差 21 天,是 7 的倍數,萬聖節也是星期一。以上五天可稱為日曆上的「地標」,方便我們在月份之間穿梭。2011 年地標全部都是星期一。

今年 7 月 1 日香港回歸紀念日是星期幾?要用另一條捷徑。每年 5 月 9 日、9 月 5 日、7 月 11 日和 11 月 7 日都是地標日;換句話說,今年 7 月 11 日是星期一,7 月 4 日也是星期一,7 月 1 日就是星期五。以上四天不難記,只要記着「朝九晚五」和「7-11 便利店」。

現在 4 至 12 月都有地標,還欠頭三個月。2 月最後一日永遠是地標(平年 28 日,閏年 29 日);七日後的 3 月 7 日順理成章成了 3 月的地標,為方便記憶,可以 3 月 “0” 日代替(即 3 月 1 日前一天);1 月最麻煩,在四年一遇的閏年,地標是 1 月 4 日,其餘年份是 1 月 3 日。

2011 年地標是星期一,下年地標星期幾?2012 是閏年,366 除 7 得餘數 2,故地標順延兩天,是星期三。平年順延一天,2013 地標將是星期四。

1989 年 6 月 4 日星期幾?逐年推算地標太慢太煩,又需要捷徑。捷徑是有的,可是,與其再加一條捷徑,不如介紹一條「一站式」公式,一次過推算星期天;該公式把以上所有捷徑結合並簡化,盲目運算便可,省卻上述推理的腦汁,在香港這個「求學只是求分數」的地方,我們無謂尋根問底,總之背熟公式,在老師、長輩和異性心目中「攞分」最重要。我親身試過這條公式,找些遙遠的日子計算,能在五十秒內得出正確答案,速度不算驚人,但我只是一名初哥。

以下介紹公式四步驟,以 1989 年 6 月 4 日作例:

「年」= 1989
「月」= 6
「日」= 4
「心」= 心中記着的數字,整個運算過程只需記着一個數

第一步:
 例:1989 年 6 月 4 日
• 抽出「年」的後二位數字,若單數,加 11;89 + 11 = 100
• 除以 2;100 ÷ 2 = 50
• 若單數,加 11。50 是雙數,步驟完成。我們只關注星期天,七天一循環,故可把 50 除 7,餘 1。「心」= 1。


第二步:
對照下表,根據「年」所在的世紀,把頂行數字(0、2、4 或 5)加進「心」中。
0245
不適用(註一)不適用(註一)15001600
1700180019002000
210022002300...

例:1989 屬於 1900 世紀,「心」= 1 + 4 = 5。

第三步:
下表列出每月的地標,找出地標日,加進「心」中。
月份地標日
1平年 3;閏年 4(註二)
2平年 0;閏年 1(註二)
30
44
59
66
711
88
95
1010
117
1212

例:6 月的地標日為 6 號,5 + 6 = 11,除 7,餘 4。「心」= 4。

第四步;
「日」減「心」,再除 7,餘數就是星期天。(1 = 星期一;2 = 星期二,類推。)
例:4 - 4 = 0?不打緊,0 即是星期日,-1 即是星期六,-2 即是星期五,類推。

1989 年 6 月 4 日是個星期日,一個血紅色的星期日。

這條公式由 Mike Walter 及 Chamberlain Fong 在 2009 年發明,遠比舊式的捷徑方便易用,當中牽涉一些不淺的數學和聰明點子,有興趣考究的讀者不妨登上:
http://firstsundaydoomsday.blogspot.com/

篇幅所限,就此停筆,祝各位來年順景,事事如意。

§

註一:為什麼最早只到 1500 世紀?因為現時的公曆(Gregorian calendar)在 1582 年才建立。各地採用公曆的時間不一,意大利在 1582 年,英國及其殖民地遲至 1752 年。

註二:一個鮮為人知的事實,「00」字尾的年份,給 400 除得盡的才是閏年,其餘是平年。1600 和 2000 是閏年,1700、1800、1900 不是。

(2011 年 12 月 31 日 信報副刋)

6 則留言:

  1. GAUSS' CALENDAR FORMULA FOR THE DAY OF THE WEEK
    http://berndt-schwerdtfeger.de/cal/cal.pdf

    其實大致上差唔多,但一二月煩啲(「單數加十一」都比計 floor function 易應用,記少個數)。

    下面試咗兩個日期:(a) 係你篇文提到嘅算法,(b) 係條 link 篇文提到嘅高斯算法(但我照用返「心」呢個字,同埋中途除7取餘數)。第一個日期亂咁揀,第二個就特登揀閏年一月(兩個算法都需要例外規則)。

    1937.8.3

    (a)
    37 + 11 = 48
    48 ÷ 2 = 24
    24 ≡ 3 (mod7)
    心 = 3
    19xx → 心 + 4
    心 = 3 + 4 = 7
    8月地標日為8
    7 + 8 = 15 ≡ 1(mod7)
    心 = 1
    3 - 1 = 2
    1937.8.3 = Tue.

    (b)
    37 ÷ 4 = 9...1
    d + g + 9 = 49 ≡ 0(mod7)
    心 = 0
    19xx → f = 1
    心 = 0 + 1 = 1
    m = 8, e = 1
    心 + e = 1 + 1 = 2
    1987.8.3 = Tue


    2000.1.31

    (a)
    00 ÷ 2 = 0
    心 = 0
    20xx → 心 + 5
    心 = 0 + 5 = 5
    1月地標日為4(閏年)
    心 = 5 + 4 = 9
    31 - 9 = 22 ≡ 1(mod7)
    2000.1.31 = Mon

    (b)
    m = 1 → y = 2000-1 = 1999
    99 ÷ 4 = 24...3
    d + g + 24 = 31 + 99 + 24
    31 + 99 + 24 ≡ 3 + 1 + 3(mod 7)
    3 + 1 + 3 = 7 ≡ 0(mod 7)
    心 = 0
    19xx → f = 1
    心 = 0 + 1 = 1
    m = 1, e = 0
    心 = 1 + 0 = 1
    2000.1.31 = Mon

    回覆刪除
  2. 多謝提供。

    歷史上有不少這種 algorithm,我未試過其他,不敢說文中提及的最容易,但相信是 one of the easiest。

    另一個:
    http://rudy.ca/doomsday.html

    有興趣的話,大可比較比較。

    回覆刪除
  3. This method is the most efficient unless you want to impress some chicks at the bar: google it on the smart phone.

    As for mental exercise, try something more creative such as inventing your own system for finding the day of week for any date: a meaningless but interesting pursuit.

    Excellent blog and all the best for the new year!

    回覆刪除
  4. Happy new year to you all! Thanks for reading.

    回覆刪除
  5. THANKS FOR LETTING ME KNOW.. NICE BLOG

    回覆刪除