1. 天干地支的數學分析
時間是事件過程長短和發生順序的度量, 記錄時間對於人類的生存和發展具有極其重要的意義。 中國古代多用天干地支來記錄時間, 天干有十個, 分別為
甲、乙、丙、丁、戊、己、庚、辛、壬、癸;
地支有十二個, 分別為 :
子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。
為了便於數學處理, 我們將其按序號來表示, 即
天干$H$ | 甲 | 乙 | 丙 | 丁 | 戊 | 己 | 庚 | 辛 | 壬 | 癸 |
序號 $h$ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
和
地支$E$ | 子 | 丑 | 寅 | 卯 | 辰 | 巳 | 午 | 未 | 申 | 酉 | 戌 | 亥 |
序號 $e$ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
而將天干和地支的名稱作為序號的函數(數列), 即 $H(h)$ 和 $E(e)$。 例如 $H(5)=$ 戊, $E(11)=$ 戌, 等等。
上表列出的只是天干和地支的基本取值, 以後隨著序號的增加不斷循環, 因此上述的名稱函數(數列)對於各自的序號具有週期性, 天干的週期為 10, 地支的週期為 12。 任意序號 $h$ 的天干值為 \begin{equation} H(h)=H(h\ {\rm mod}\, 10),\label{1} \end{equation} 其中 mod 10 表示除以 10 的餘數, 序號 $h$ 按照原始含義應屬於正整數集合, 為了便於向前推算, 我們將其拓展為整數集合 $\Bbb I$, 即 $h\in \Bbb I$。 由於10 mod 10 = 0 mod 10, 即 $10\equiv 0 ({\rm mod}\,10)$, 因此 「癸」對應的天干序號也可以認為是 0, 即 $H(0)=$ 癸。
在天干集合 $H=\{H(0),H(1),H(2),\ldots,H(9)\}$ 上定義運算 \begin{equation} H(i)\circ H(j)=H(i+j),\label{2} \end{equation}
則成為一個 10 階循環群, 其單位元為 $H(0)$, 群元的逆元為 $H^{-1}(i)=H(-i)=H(10-i)$。
類似地, 任意序號 $e$ 的地支值為 \begin{equation} E(e)=E(e\ {\rm mod}\, 12),\qquad e\in \Bbb I.\label{3} \end{equation} 由於 $12\equiv 0({\rm mod}\, 12)$, 因此 「亥」 對應的地支序號也可以認為是 0, 即 $E(0)=$ 亥。
在地支集合 $E=\{E(0),E(1),E(2),\ldots,E(11)\}$ 上定義運算 \begin{equation} E(i)\circ E(j)=E(i+j),\label{4} \end{equation} 則成為一個 12 階循環群, 其單位元為 $E(0)$, 群元的逆元為 $E^{-1}(i)=E(-i)=E(10-i)$。
在此基礎上, 可以構造直積群 $HE=\{\langle H(i),E(j)\rangle\mid 0\le i\lt 10,0\le j\lt 12\}$, 對應的群運算為 \begin{equation} \langle H(i),E(j)\rangle\circ \langle H(n),E(m)\rangle=\langle H(i)\circ H(n),E(j)\circ E(m)\rangle,\label{5} \end{equation} 直積群共有 $10\times 12=120$ 個群元, 單位元為 $H(0)\circ E(0)=HE(0)$。
2. 干支表的數學分析
將十天干和十二地支依次相配, 組成一個基本週期, 以後不斷循環, 古人以此作為年、月、日、時的序號, 叫「天干地支記時法」, 簡稱「干支記時法」。
按照上述方法, 我們得到如下的排序表
表1. 偶和組的干支表
支 幹 | 1子 | 2丑 | 3寅 | 4卯 | 5辰 | 6巳 | 7午 | 8未 | 9申 | 10酉 | 11戌 | 12亥 |
1甲 | 1 | 51 | 41 | 31 | 21 | 11 | ||||||
2乙 | 2 | 52 | 42 | 32 | 22 | 12 | ||||||
3丙 | 13 | 3 | 53 | 43 | 33 | 23 | ||||||
4丁 | 14 | 4 | 54 | 44 | 34 | 24 | ||||||
5戊 | 25 | 15 | 5 | 55 | 45 | 35 | ||||||
6己 | 26 | 16 | 6 | 56 | 46 | 36 | ||||||
7庚 | 37 | 27 | 17 | 7 | 57 | 47 | ||||||
8辛 | 38 | 28 | 18 | 8 | 58 | 48 | ||||||
9壬 | 49 | 39 | 29 | 19 | 9 | 59 | ||||||
10癸 | 50 | 40 | 30 | 20 | 10 | 60 |
注意, 上表中共列出了 60 對天干地支組合的序號, 其中序號 60 與 0 對於模 60 同餘, 即 $60\equiv $ 0 mod 60, 所對應的天干地支值相同, 都是「癸亥」, 以後不再加以區分。
按照週期性, 大於 60 的序數 $n$ 對應的天干地支由 $n$ mod 60確定。 用數學公式表示為 $$HE(n)=HE(n\,{\rm mod}\, 60),\qquad n\in \Bbb I.$$ 上述以十個天干和十二個地支相配組成的六十個干支名稱的干支表, 是當時的人們用來推算日期的, 可以說是我國最早的日曆。 由於序號數字以「甲子」開始, 並在表中形成花紋, 人們又將其稱為「花甲子」表。
設組合排序後的序號為 $n$, 容易發現 \begin{equation} h=n\, {\rm mod}\, 10, \qquad e=n\, {\rm mod}\, 12.\label{6} \end{equation} 由此推出 \begin{equation} n=10k+h,\qquad n=12l+e,\label{7} \end{equation} 其中 $k$ 和 $l$ 為整數。
將上式中的第一式乘以 6 減去第二式乘以 5, 得到 $$n=60k+6h-60l-5e.$$ 在基本週期內, 序號為 \begin{equation} N=n\, {\rm mod}\,60 =(6h-5e)\,{\rm mod}\, 60. \label{8} \end{equation} 利用上述公式可以直接由天干地支值來計算其在干支表中的序號。
反過來, 我們也可以利用下列公式可以直接由序號計算對應的干支值 \begin{equation} (H(n),E(n))=(H(n\,{\rm mod}\,10),E(n\,{\rm mod}\,12)). \label{9} \end{equation} 從數學的角度看, 干支表是天干和地支兩個有序週期數列依次組合得到的二元數列。 一般來說這兩個數列存在 120 種不同的組合情況 (包含表 1 中的空白), 而花甲子表只包含 60 種組合, 這裡的數學意義是什麼?
將十天干和十二地支依次相配, 理論上可以得到兩種分組的方法。 一種是從甲子 $(1,1)$ 開始, 即表 1 所示的花甲子表, 其中包括所有同奇同偶的天干地支對, 滿足規律 $$(h+e)\,{\rm mod}\,2=0,$$ 可以稱為偶和組。
另一種是從甲丑 $(1,2)$ 開始, 其中包括所有奇偶性不同的天干地支對, 滿足規律 $$(h+e)\,{\rm mod}\,2=1,$$ 可以稱為奇和組, 如下所示。
表2.奇和組的干支表
支 幹 | 1子 | 2丑 | 3寅 | 4卯 | 5辰 | 6巳 | 7午 | 8未 | 9申 | 10酉 | 11戌 | 12亥 |
1甲 | 1 | 51 | 41 | 31 | 21 | 11 | ||||||
2乙 | 12 | 2 | 52 | 42 | 32 | 22 | ||||||
3丙 | 13 | 3 | 53 | 43 | 33 | 23 | ||||||
4丁 | 24 | 14 | 4 | 54 | 44 | 34 | ||||||
5戊 | 25 | 15 | 5 | 55 | 45 | 35 | ||||||
6己 | 36 | 26 | 16 | 6 | 56 | 46 | ||||||
7庚 | 37 | 27 | 17 | 7 | 57 | 47 | ||||||
8辛 | 48 | 38 | 28 | 18 | 8 | 58 | ||||||
9壬 | 49 | 39 | 29 | 19 | 9 | 59 | ||||||
10癸 | 60 | 50 | 40 | 30 | 20 | 10 |
從群論的角度看, 偶和組中包括直積群的單位元, 滿足群運算的封閉性, 是直積群的一個子群, 而且是正規子群; 奇和組是偶和組的唯一陪集。 這可能是古人選用偶和組構造花甲子表的一個深層原因。
3. 干支記時法
用天干地支組合來記年、 月、 日、 時, 叫「干支記時法」。 天干地支的偶和組合以 60 為週期, 因此只要給出任一時間點 $x_0$ 的天干地支值, 就可以推出其他時間點 $x$ 的天干地支值。 設該時間點對應的天干地支序號為 $n$, 則容易推出 \begin{equation} n(x)=(x-x_0)\,{\rm mod}\,60 +n(x_0).\label{10} \end{equation} 為了方便, 我們取 $n(x_0)=0$, 即 $x_0$ 的天干地支值為癸亥。 則時間點 $x$ 的天干地支為 \begin{equation} n(x)=\Delta x\,{\rm mod}\,60, \label{11} \end{equation} 其中 $\Delta x=x-x_0$ 為時間差。
考慮到 60 是天干週期 10 和地支週期 12 的最小公倍數, 因此我們也可以直接計算對應的天干地支值 \begin{equation} h(x)=\Delta x\,{\rm mod}\,10,\qquad e(x)=\Delta x\,{\rm mod}\,12,\label{12} \end{equation}
3.1. 干支記年
用六十甲子依次記年, 六十年一個週期。 設西元記年的年份為 $y$, 則其對應的干支記年(序號)為 $n_y(y)$。 考慮到西元 3 年為癸亥年, 即 $n_y(3)=0$, 因此有 $$n_y(y)=\Delta y\,{\rm mod}\,60,$$ 其中 $\Delta y=y-3$ 為年份差。 我們也可以利用年份差直接計算對應的天干地支 $$h_y(y)=\Delta y\,{\rm mod}\,10,\qquad e_y(y)=\Delta y\,{\rm mod}\,12.$$ 例如, 西元 2017 年與西元 3 年的年份差為 $\Delta y=2017-3=2014$, 因此對應的干支序號為 $$n_y(2017)=2014\,{\rm mod}\,60=34,$$ 天干序號和地支序號分別為 $$h_y(2017)=2014\,{\rm mod}\,10=4,\qquad e_y(2017)=2014\,{\rm mod}\,12=10.$$ 天干序號 4 對應於「丁」, 地支序號 10 對應於「酉」, 因此西元 2017 年為農曆丁酉年。 需要說明的是 : 干支記年法的新一年由立春開始, 2017 年的立春是二月三日, 所以 2017 年 2 月 3 日立春之後才是丁酉年, 在此之前應是丙申年。
3.2. 干支記月
一年有 12 個月, 用六十甲子依次記月, 5 年一個週期。 已知西元 1903 年 11 月為癸亥月, 因此西元 ###3 年或 ###8 年 11 月都是癸亥月, 與西元月份 $mm$ 對應的干支記月(序號)為 $$n_m(mm)=\Delta m\,{\rm mod}\,60,$$ 其中 $\Delta m$ 為西元月份 $mm$ 與某個癸亥月的月份差。 例如, 西元 2017 年 7 月與西元 2013 年 11 月的月份差為 $$\Delta m=12\times 3+8=44,$$ 即 $$n_m(mm)=\Delta m\,{\rm mod}\,60=44.$$ 於是 $$h_m(mm)=44\ {\rm mod}\,10=4,\qquad e_m(mm)=44\ {\rm mod}\,12=8,$$ 天干序號 4 對應於「丁」, 地支序號 8 對應於「未」, 因此西元 2017 年 7 月為農曆丁未月。
需要說明的是 : 採用干支記月時, 每個地支對應的時間範圍二十四節氣中月初的節氣至下一個月月初的節氣, 以交節時刻決定始末的一個月時間範圍, 不是該月月初至月底。 例如, 2017 年 7 月 7 日為小暑, 該日之前為丙午月, 自該日起才是丁未月, 直到下下個節氣 8 月 7 日立秋之前。
具體 24 節氣的名稱、順序和日期可以參看下列節氣歌
春雨驚春清穀天,夏滿芒夏暑相連。
秋處露秋寒霜降,冬雪雪冬小大寒。
上半年是六廿一,下半年是八廿三。
每月兩節日期定,最多只差一兩天。
由於節氣以西元年為週期, 一年 24 節氣, 平均每月 2 個節氣。 因此地支記月與西元月份 $m$ 的關係是固定的, 具體關係為 $$e_m(mm)=(m+1)\,{\rm mod}\,12.$$
3.3. 干支記日
干支記日也是 60 日為一個週期, 大約 2 個月。 已知西元 1901 年 2 月 14 日為癸亥日, 因此西元日期 $dd$ 的干支序號為 $$n_d(dd)=\Delta d\,{\rm mod}\, 60,$$ 其中 $\Delta d$ 為西元日期 $dd$ 到某個癸亥日的日期差。 考慮到西元平年 365 日, 閏年 366 日, 每四年一閏, 因此 4 年共 1461 天。 而 $$1461\,{\rm mod}\, 60=21.$$ 因此, 每過 4 年, 同一干支記日的西元日期需要向後順延 21 日。 20 個 4 年順延 420 日, 恰好為 7 個週期, 因此每 80 年干支記日復原。 又因為西元年份能被 100 整除, 但是不能被 400 整除時為平年, 因此每遇到一個這種情況, 同一干支記日的西元日期要向後少順延 1 日, 或者說提前 1 日。
例如, 西元 1981 年 2 月 14 日、 2061 年 2 月 14 日都是癸亥日, 但 2141 年的癸亥日卻是 2 月 13 日。
如果計算 2017 年 7 月 7 日的干支記日, 該日與 1981 年 2 月 14 日相差 36 年, 折合 9 個 4 年, 向後順延 189 日, 加上年內日差為 143 日, 可以算出日期差為 $$\Delta d=(189+143)\,{\rm mod}\, 60=32.$$ 於是 $$h_d=32\,{\rm mod}\, 10=2,\qquad e_d=32\,{\rm mod}\, 12=8.$$
天干序號 2 對應於「乙」, 地支序號 8 對應於「未」, 因此西元 2017年7月7日為乙未日。
3.4. 干支記時
古人將一天劃分為 12 個時辰, 用地支來命名, 與太陽時 $t$ 的對應關係為
時辰 | 序數 $e$ | 太陽時範圍 | 中點 $t$ |
子時 | 1 | -1時~1時 | 0 |
丑時 | 2 | 1時~3時 | 2 |
寅時 | 3 | 3時~5時 | 4 |
卯時 | 4 | 5時~7時 | 6 |
辰時 | 5 | 7時~9時 | 8 |
巳時 | 6 | 9時~11時 | 10 |
午時 | 7 | 11時~13時 | 12 |
未時 | 8 | 13時~15時 | 14 |
申時 | 9 | 15時~17時 | 16 |
酉時 | 10 | 17時~19時 | 18 |
戌時 | 11 | 19時~21時 | 20 |
亥時 | 12 | 21時~23時 | 22 |
其中 -1 時為上日的 23 時。 上述關係可以寫成數學公式 $$e(t)=t\ {\rm div}\ 2+1,$$ 其中 div 2 表示用 2 除的商。 例如 :
淩晨 1 點 15 分, 對應的太陽時中點為 2, 時辰為 $e(2)=2\,{\rm div}\,2+1=2$, 即丑時;
下午 4 點 45 分, 對應的太陽時中點為 16, 時辰為 $e(16)=16\,{\rm div}\,2+1=2$, 即申時。
60 時辰合 5 日, 為時辰干支的一個週期, 而每天只有 12 個時辰, 因而需要和日子的天干相配組合。 古人的規定是「甲日」的「子時」作為「甲子時」, 以後的時辰按照甲子表排序, 因此「癸日」的「亥時」為「癸亥時」, 以後每隔 5 日重複。
例如, 西元 1981 年 2 月 14 日為癸亥日, 該日的亥時為「癸亥時」。 平年為 365 日, 恰好是 5 的倍數, 因此 1982 年、 1983 年和 1984 年 2 月 14 日的亥時都是「癸亥時」。 遇到閏年 366 日, 「癸亥時」所對應的西元日期需要前移 1 天, 因此 1985 年 2 月 13 日的亥時是「癸亥時」。 一般來說, 每經過一個閏日「癸亥時」 所對應的西元日期要前移 1 天。 1981 年到 2018 年初共經過 9 個閏日, 「癸亥時」 對應的西元日期就要前移 9 天, 故 2018 年 2 月 5 日的亥時為「癸亥時」。
與西元時刻 $tt$ 對應的干支記時 (序號) 為 $$n_t(tt)=\Delta t\,{\rm mod}\, 60,$$ 其中 $\Delta t$ 為西元時刻 $tt$ 與癸亥時的時辰差。 例如, 西元 2018 年 2 月 3 日 10 點為巳時, 與最近一個癸亥時 (2018 年 1 月 31 日亥時) 時辰差為 $$\Delta t=12\times 2+6=30,$$ 即 $$n_t(tt)=\Delta t\,{\rm mod}\, 60=30.$$ 於是 $$h_t(tt)=30\,{\rm mod}\, 10=0,\qquad e_t(tt)=30\,{\rm mod}\, 12=6.$$
天干序號 0 對應於「癸」, 地支序號 6 對應於「巳」, 因此西元 2018 年 2 月 3 日 10 點為癸巳時。
應該注意的是 : 干支記時法是以子時的起點(西元 23 時整, 即次日的 -1 時)為日期的分界線, 而西元記時法是以 0 時整 (24 時)為日期的分界線, 因此西元同一天的子時分為 0 時到 1 時的早子時和 23 時到 24 時的晚子時, 所以遇到甲(或己)之日, 0 時到 1 時屬於當日的子時, 即甲子時; 但 23 時到 24 時屬下一日的子時, 因此是丙子時。 其餘情況可以類推, 詳情參考下表。
表3.干支記時表
時辰 | 太陽時 | 甲或己日 | 乙或庚日 | 丙或辛日 | 丁或壬日 | 戊或癸日 |
子時 | -1時~1時 | 甲子時 | 丙子時 | 戊子時 | 庚子時 | 壬子時 |
丑時 | 1時~3時 | 乙丑時 | 丁丑時 | 己丑時 | 辛丑時 | 癸丑時 |
寅時 | 3時~5時 | 丙寅時 | 戊寅時 | 庚寅時 | 壬寅時 | 甲寅時 |
卯時 | 5時~7時 | 丁卯時 | 己卯時 | 辛卯時 | 癸卯時 | 乙卯時 |
辰時 | 7時~9時 | 戊辰時 | 庚辰時 | 壬辰時 | 甲辰時 | 丙辰時 |
巳時 | 9時~11時 | 己巳時 | 辛巳時 | 癸巳時 | 乙巳時 | 丁巳時 |
午時 | 11時~13時 | 庚午時 | 壬午時 | 甲午時 | 丙午時 | 戊午時 |
未時 | 13時~15時 | 辛未時 | 癸未時 | 乙未時 | 丁未時 | 己未時 |
申時 | 15時~17時 | 壬申時 | 甲申時 | 丙申時 | 戊申時 | 庚申時 |
酉時 | 17時~19時 | 癸酉時 | 乙酉時 | 丁酉時 | 己酉時 | 辛酉時 |
戌時 | 19時~21時 | 甲戌時 | 丙戌時 | 戊戌時 | 庚戌時 | 壬戌時 |
亥時 | 21時~23時 | 乙亥時 | 丁亥時 | 己亥時 | 辛亥時 | 癸亥時 |
4. 結語
從數學的角度進行分析, 我們得到了天干地支記時法的內在意義, 發現天干地支對為週期數列, 「癸亥」相當於其坐標原點。 在此基礎上, 給出了由西元記時得到天干地支記時的簡明方法。 需要說明的是 : 天干地支記時法以節氣分年月, 避免了西元記時法中年分平閏、 月分大小的缺陷, 是更為科學、 嚴格的太陽曆, 不是迷信。
注 : 天干地支記時法同時可記年、 月、 日、 時, 分別稱為「年柱、月柱、日柱、時柱」。 每柱 2 個字, 共八個字。 此八個字就是俗稱的「八字」, 一個人的「生辰八字」就是他出生時間的四柱記錄。
參考文獻
---本文作者現任教中國合肥市第四中學---