《漢書·律曆志》筆記(5):紀術
行星與地球都是圍繞太陽運動的,而這種運動在地球上看來則是相當複雜的。上面這張圖是行星、地球、太陽之間相互位置的示意圖。中間橘色的點代表太陽,下面藍色的點代表地球;實線表示地球軌道,點線代表內行星(水星、金星)的軌道,虛線代表外行星(火星、木星、土星)的軌道。
內行星水星、金星的軌道在地球與太陽之間。當內行星運行到地球與太陽的連線或連線的延長線上時,也就是內行星與地球、太陽形成一條直線時,由於內行星靠近太陽,所以在地球上看不到內行星,這就叫做伏;而從內行星、地球、太陽三者位置的相對關係來說,如果內行星在遠離地球的一側,就叫上合,而當內行星在地球和太陽中間時,就叫下合。所謂大距,指的是地球上看起來,內行星距離太陽的距離最大的時候。當內行星在太陽東邊時,就叫東大距;在太陽西邊時,就叫西大距。西大距出現在早上,而東大距出現在傍晚。三統曆叫做晨見與夕見。因此在內行星的運行中,有兩次伏。一次是內行星運行到地球和太陽之間時,即下合時;另一次則是內行星運行到地球和太陽連線的延長線上時,即上合時。而對於外行星,由於外行星的軌道在地球之外,所以外行星會有兩次運行到地球和太陽連線的延長線上,一次靠近地球,另一次靠近太陽。靠近地球的那一次稱爲“衝”(opposition)。因爲這時行星正對着太陽,就如月亮在望日正對着太陽一樣,是最適於觀測外行星的時候。而在靠近太陽的那次,外行星就會被太陽的光芒掩蓋,地球上就看不到了。這就是外行星的伏;就行星、地球、太陽的位置關係而言叫“上合”(superior conjunction)。行星的這種運行是週期性的,例如外行星由一次上合到下一次上合是一個完整的週期。行星的這種運行週期就叫做一個會合週期(synodic cycle),在三統曆中叫做“一見”,這個週期的時長就叫見數,也就是紀母中的見中法。
紀術與統術不同。統術在推天地元統中算出入統年之後,其他計算只要用入統年就可以了,而所有的紀術計算都依賴於距太極上元年數。這是因爲太極上元是日月、五星的共同週期,要計算五星運行的時間,必須從太極上元算起。另外,紀術與統術不同,統術每個計算只要算一次,而紀術每種都可以算五次,每個行星一次(除了推晨見加夕,這一運算只有金星、水星能算)。
紀術部分從推五星見復到推入月日數,其實都是求一個事件的時間,就是星見。紀術分別計算了星見所在年份(推五星見復)、中氣、十二次(推星所見中次)、所在月份(推星見月)、所在中氣首日(推至日)、當月朔日(推朔日)、所在中氣日數(推入中)、所在月的第幾天(推入月日數)。除了推算本次星見時間外,還可以推算下一次星見時間,這就是推後見中(推算下一次星見所在中氣)、推後見月(推算下一次星見所在月份)的內容。
紀術部分所用的基本已知數也只有一個,就是太極上元以來年數,其他運算所用已知數都是從這個數值推算出來的。下圖展示了紀術各部分之間的關係與所用已知數。
因爲紀術裏的用語有些與紀母不同,這裏稍加說明。紀母中的見中法,在紀術中叫做見復數,又叫做大統見復數。
推五星見復
推五星見復,置太極上元以來,盡所求年,乘大統見復數,盈歲數得一,則定見復數也。不盈者名曰見復餘。見復餘盈其見復數,一以上見在往年,倍一以上,又在前往年,不盈者在今年也。
所謂見復就是五星經過一個週期之後在天空中出現,而見復數就是五星出現的週期,也就是見中法,這裏叫做大統見復數。設所求年距太極上元年數爲 $x$,所求的行星歲數爲 $p$,行星見復數爲 $m$。
$$ \begin{align*} \text{一見復時間}&=\text{行星歲數} \div \text{見復數}\\ &=\frac{p}{m}\\ x\ \text{年見復數}&=x \div \frac{p}{m}\\ &=(xm \ \mathbf{div}\ p) \frac{xm \ \mathbf{mod}\ p}{p}\\ &=\text{定見復數} \frac{見復餘}{p}\\ \text{定見復數}&=xm \ \mathbf{div}\ p\\ &=(\text{距上元年數} \times \text{見復數}) \ \mathbf{div}\ \text{歲數}\\ \text{見復餘}&=xm \ \mathbf{mod}\ p\\ &=(\text{距上元年數} \times \text{見復數}) \ \mathbf{mod}\ \text{歲數} \end{align*} $$
行星見復可以由見復餘與見復數的關係確定。假如見復餘大於見復數,但是小於見復數的兩倍,那行星見復就出現在所求年的前一年;而如果見復餘大於見復數的兩倍,但小於見復數的三倍,那行星見復就出現在所求年的前兩年。用代碼寫出來就是:
def tuiJianfu(x, jianfuShu, suiShu):
"""
推五星見復:由距上元年數 x,求五星見復出現年數
Args:
x: 距上元年數
jianfuShu: 見復數,即見中法
suiShu: 歲數
Returns:
jianfu: 見復,1 在今年,2 在去年,3 在前年
jianfuYu: 見復餘
dingJianfu: 定見復數
"""
dingJianfu = (x * jianfuShu) // suiShu
jianfuYu = (x * jianfuShu) % suiShu
if jianfuShu < jianfuShu:
jianfu = 1 # 見復在本年
elif jianfuShu >= jianfuShu and jianfuShu < 2 * jianfuShu:
jianfu = -1 # 見復在去年
elif jianfuShu >= 2 * jianfuShu and jianfuShu < 3 * jianfuShu:
jianfu = -2 # 見復在前年
return jianfu, jianfuYu, dingJianfu
推星所見中次
推星所(一多「在」字)見中次,以見中分乘定見復數,盈見中法得一,則積中法也。不盈者名曰中餘。以元中除積中,餘則中元餘也。以章中除之,餘則入章中數也。以十二除之,餘則星見中次也。中數從冬至起,次數從星紀起,算外,則星所見中次也。
這一條是求行星出現時刻在當年的哪個中氣內,與出現在十二次的哪一次。具體計算步驟是:
- 計算出上元以來的所有中氣數:$\text{定見復數} \times \frac{\text{見中分}}{\text{見中法}} = \text{積中} \frac{中餘}{見中法}$
- 計算出中元餘,也就是不足一個元中的中氣餘數:$中元餘 =\text{積中} \ \mathbf{mod}\ \text{元中}$。這裏要用到一元的中氣數 55404,即統母中的元中。
- 計算出入章中數,也就是不足一個章中的中氣餘數:$\text{入章中數}=\text{中元餘} \ \mathbf{mod}\ \text{章中}$。章中是一章的中氣數,也見統母。
- 計算出星見中次,也就是五星見在十二次的哪一次:$\text{星見中次} \text{入章中數} \ \mathbf{mod}\ 12$
- 以所得星見中次,從冬至開始數,就是星所見中氣;從星紀開始數,就是星所見次。注意,仍然是以冬至/星紀爲 0 開始數。
設距上元年數爲 $x$,見復數(見中法)爲 $m$,歲數爲 $p$,定見復數爲 $d$。計算出上元以來的所有中氣數,也就是定見復數內總中氣數,將它轉換成帶分數,就可以算出積中、中餘:
$$ \begin{align*} \text{定見復數}&=(\text{距上元年數} \times 見復數) \ \mathbf{div}\ \text{歲數})\\ &= xm \ \mathbf{mod}\ p\\ \text{一見復數年數}&=\frac{歲數}{見復數}\\ &=\frac{p}{m}\\ \text{定見復數年數}&=\text{定見復數} \times \text{一見復數年數}\\ &=\text{定見復數}\times \frac{歲數}{見復數}\\ &=\text{d} \times \frac{p}{m}\\ \text{一年中氣數}&=12\\ \text{歲數} \times 12 &= \text{見中分}\\ \text{定見復數總中氣數}&=\text{定見復數總年數} \times \text{一年中氣數}\\ &=\text{d} \times \frac{p}{m} \times 12\\ &=\text{d} \times \frac{\text{見中分}}{m}\\ &=(d \times \text{見中分} \ \mathbf{div}\ m) \frac{d \times \text{見中分} \ \mathbf{mod}\ m}{m}\\ &=\text{積中} \frac{中餘}{m}\\ \text{積中}&=d \times \text{見中分} \ \mathbf{div}\ m\\ \text{中餘}&=d \times \text{見中分} \ \mathbf{mod}\ m \end{align*} $$
要求星見中次,只要以積中除元中、章中、十二次/氣,求得各自的餘數就可以了。也就是:
$$\text{星見中次} = \text{積中} \ \mathbf{mod}\ \text{元中} \ \mathbf{mod}\ \text{章中} \ \mathbf{mod}\ 12$$
推星見月
推星見月,以閏分乘定見,以章歲乘中餘從之,盈見月法得一,并積中,則積月也。不盈者名曰月中餘。以元月除積月餘,名曰月元餘。以章月除月元餘,則入章月數也。以十二除之,至有閏之歲,除十三。1入章三歲一閏,六歲二閏,九歲三閏,十一歲四閏,十四歲五閏,十七歲六閏,十九歲七閏。不盈者數起於天正,算外,則星所見月也。
上一段已經求得行星始見所在中氣和十二次,這一段則是求新會合週期開始時星始見的月份。三統曆用了三個步驟:
- 求定見復數期間總月數
- 根據積月求出星見在本章的哪月
- 減去本章不計閏月的月數(每年十二)、閏月數(入章三年一個閏月,六年兩個,九年三個,十一年四個,十四年五個,十七年六個,十九年七個),算出星見在本年的哪個月
首先求定見復數期間所有的朔望月數目。三統曆將朔望月分爲閏月和一般的一年十二個月。所以要求定見復數期間所有的朔望月數目,只要將定見復數期間所有閏月和定見復數期間所有 12 個月(非閏月)加起來就可以了。根據紀母部分的見閏分(這裏叫做閏分),一個會合週期,也就是歲數中有 $\text{見閏分} = \text{歲數} \times \frac{7}{19}$ 個閏月,而一見的閏月數就是:$\frac{歲數 \times 7}{見中法 \times 19}$。一年的非閏月數與中氣數一樣,都是 12,所以定見復數期間所有的不含閏月的朔望月數目與這期間所有的中氣數是一樣的。上一部分“推星所見中次”已經求出定見復數期間的積中和中餘了,將這個數字加上閏月數就是定見復數期間所有朔望月數目。寫成算式就是:
$$ \begin{align*} \text{定見復數總閏月數}&=\frac{\text{閏分}}{\text{見月法}} \times \text{定見復數}\\ \text{定見復數不計閏月總月數} &=\text{定見復數總中氣數}\\ &=\text{積中} \frac{中餘}{見中法}\\ \text{定見復數總月數}&=\text{定見復數總閏月數} + \text{定見復數不計閏月總月數}\\ &=\frac{\text{閏分} \times \text{定見復數}}{\text{見月法}} + \text{積中} \frac{\text{中餘}}{\text{見中法}}\\ &=\frac{\text{閏分} \times \text{定見復數} + \text{中餘} \times 19}{\text{見月法}} + \text{積中}& \text{見月法} = 19 \times \text{見中法}\\ &= \text{積月} \frac{月餘}{見月法} \end{align*} $$
與上一部分“推星所見中次”一樣,先要將積月除以元月、章月,求出月元餘、入章月數。由於在一章中有些年份有閏月有些年份沒有,並不是每年都是十二個月,所以求出了入章月數,並不能立即得出該月在一章之中的哪年、哪個月,還需要從入章月中減去累積的月數,這都要按照統術部分“推閏餘”所列出的表格來。每逢一章中的第 3、6 、9、11、14、17、19 年,就要減去十三個月,再根據不足一年的月數求出星見在本年的哪月。
$$ \begin{align*} \text{月元餘}&=\text{積月} \ \mathbf{mod}\ \text{元月}\\ &=\text{積月} \ \mathbf{mod}\ 57105\\ \text{入章月數}&=\text{月元餘} \ \mathbf{mod}\ \text{章月}\\ &=\text{積月} \ \mathbf{mod}\ 57105 \ \mathbf{mod}\ 235\\ \end{align*} $$
推至日
推至日,以中法乘中元餘,盈元法得一,名曰積日,不盈者名曰小餘。小餘盈二千五百九十七以上,中大。數除積日如法,算外,則冬至也。
這一段以“推至日”爲名,從字面上看應該是求冬至日的干支日名,但是從所述算法來看,實際是求星見所在中氣的干支日名。《中國古代曆法》認爲“推至日”應該是“推中日”之誤。這裏仍用推至日的名字,但是所求未知數是星見所在中氣的干支日名。這裏要用到的已知數是“推星所見中次”中求出的中元餘。
在“推星所見中次”中已經求出從上元到星見期間累積的中氣數,而中元餘就是星見所在元中累積的中氣數。在“三統曆基本時間單位”中已經求出一個中氣的時間長度是 $30 \frac{2020}{4617} = \frac{140530}{4617}=\frac{\text{中法}}{元法}$,那將中元餘乘以一個中氣的長度就是在當前元中到星見所在中氣時累積日數,也就是:
$$ \begin{align*} \text{入元來到當前中氣日數}&=\frac{\text{中元餘} \times \text{中法}}{\text{元法}}\\ &=\text{積日}\frac{小餘}{元法}\\ \text{氣首日名}&=\text{積日} \ \mathbf{mod}\ 60 \end{align*} $$
而求當前中氣所在日期的干支日名就是求積日大餘,並在干支表中數出對應干支即可。
推朔日
推朔日,以月法乘月元餘,盈日法得一,名曰積日,餘名曰小餘。小餘三十八以上,月大。數除積日如法,算外,則星見月朔日也。
這一段是求星見之月的朔日干支,所用已知數是“推星見月”中求出的月元餘,也就是入元以來的月數。月元餘乘以一月日數 $\frac{2392}{81} = \frac{月法}{日法}$ 就是從入元以來到星見月的所有日數。再以積日求出積日大餘就知道當月朔日的干支日名了。
$$ \begin{align*} &\ \ \ \ \ \text{月元餘} \times \frac{\text{月法}}{\text{日法}}\\ &=\text{月元餘} \times \frac{2392}{81}\\ &=\text{積日}\frac{小餘}{81}\\ \text{朔日}&=\text{積日} \ \mathbf{mod}\ 60 \end{align*} $$
推入中、次日度數
推入中次日度數,以中法乘中餘,以見中法乘其小餘并之,盈見中日法得一,則入中日入次度數也。中次至日數,次以次初數,算外,則星所見及日所在度數也。求夕,在日後十五度。
求星見所入中氣之後的日數,以及星見在所入十二次的度數。在推星所在中次部分,以及算出星見時刻不足一個中氣的時長是 $\frac{\text{中餘}}{\text{見中法}}$。要求星見所入中氣之後的日數,只要將這個數值轉換成日數就可以了,也就是將這個數值乘以一個中氣的日數(參見表格:三統曆基本時間單位年月日時長 ):
$$\frac{中餘}{見中法}\times \frac{中法}{元法}$$
但是星見所在中氣並非一定在夜半,所以將這個數值轉換成日數之後,還需要加上星見所在中氣距夜半的時段。這個時段已經在推至日部分算出來了,也就是入元來日數除去積日的分數部分,即 $\frac{小餘}{元法}$。上一個數值與這個數值相加,就是:
$$ \begin{align*} &\frac{中餘}{見中法}\times \frac{中法}{元法} + \frac{小餘}{元法}\\ =&\frac{中餘 \times 中法 + 小餘 \times 見中法}{見中法 \times 元法}\\ =&\frac{中餘 \times 中法 + 小餘 \times 見中法}{見中日法} \end{align*} $$
其中,見中日法 $= 見中法 \times 元法$,參見紀母表。將這個數字化爲帶分數,假如整數部分是 0,那星見就中氣首日,也就是中氣當天。
推入月日數
推入月日數,以月法乘月餘,以見月法乘其小餘并之,盈見月日法得一,則入月日數也。并之大餘,數除如法,則見日也。
這一段是求星見在所在月的日數,所用的已知數是“推星見月”中求出的月元餘、“推朔日”中求出的積日小餘。以月餘乘以一月日數 $\frac{2392}{81} = \frac{月法}{日法}$,再加上朔日小餘就是星見當日的日數。
$$ \begin{align*} &\frac{月餘}{見月法}\times \frac{月法}{81} + \frac{小餘}{81}\\\ =&\frac{月餘}{見月法}\times \frac{月法}{81} + \frac{小餘 \times 見月法}{81 \times 見月法}\\\ =&\frac{月餘 \times 月法 + 小餘 \times 見月法}{81 \times 見月法}\\\ =&\frac{月餘 \times 月法 + 小餘 \times 見月法}{見月日法} \end{align*} $$
將求得的數化爲帶分數,再加上朔日大餘,就是星見當天的干支日名了。如果二者加起來超過 60,求二者之和除以 60 的餘數,也就是星見日大餘,就可以求得當天的干支序數了。
推後見中、後見月
推後見中,加積中於中元餘,加後餘於中餘,盈其法得一,從中元餘,數如法,則見也。
這一段是計算下一次星見所在的中氣。本次星見的積中和中餘已經在推星所見中次中求得,那下一次星見所在中氣只要加上一見所含中氣的積中和中餘就可以得到了。星見一次所含中氣次數爲 $\frac{見中分}{見中法} = 積中 \frac{中餘}{見中法}$。爲了區分本次星見的積中和中餘與一見的積中和中餘,《中國古代曆法》中將一見的積中和中餘叫做見中和見中餘。也就是說,下次星見所在的中氣數爲:
$$ \begin{align*} &\text{本次星見積中中餘} + \text{一見的積中和中餘}\\ =&\text{積中}\frac{中餘}{見中法} + \text{見中} \frac{見中餘}{見中法}\\ \end{align*} $$
要求下一次星見中次,只要以求得的下一次積中除元中、章中、十二次/氣,求得各自的餘數就可以了。
推後見月,加積月於月元餘,加後月餘於月餘,盈其法得一,從月元餘,除數如法,則後見月也。
推下一次星見所在的月份,與推後見中一樣,以推星見月部分求出的月元餘、月餘加上一見的積月、月餘(紀母中的積月和月餘,《中國古代曆法》稱之爲見月、見月餘),以求得下一次星見的積月、月餘,按照推星見月後半部分的計算,就可以求得下一次星見所在月份了。也就是:
$$ \begin{align*} &\text{本次星見積月月餘} + \text{一見的積月和月餘}\\ =&\text{月元餘}\frac{月餘}{見月法} + \text{見月} \frac{見月餘}{見月法}\\ =&(月元餘 + 見月) \frac{月餘 + 見月餘}{見月法} \end{align*} $$
推至日及入中次度數,如上法。
推朔日及入月數,如上法。
推晨見加夕,夕見加晨,皆如上法。\
要計算下一次星見的至日、入中次度數、朔日與入月數,只要加上五星一見的積中、中餘、積月、月餘就可以了。而計算金星、水星的晨見、夕見,也只要加上晨見或夕見的積中、中餘、積月、月餘。
推五步
推五步,置始見以來日數,至所求日,各以其行度數乘之。其星若日有分者,分子乘全為實,分母為法。其兩有分者,分母分度數乘全,分子從之,令相乘為實,分母相乘為法,實如法得一,名曰積度。數起星初見星宿所在宿度,算外,則星所在宿度也。
求星見之後某天星所在宿度。在紀母之後的五步部分,三統曆已經給出了五大行星的運行軌跡和運行不同階段的日數與日行度數。因此,只要知道了五星始見的位置,也就是星度,就是上面“推入中次日度數”部分所求出十二次度數,再對照五大行星在各個階段停留的日數與日行度數,就可以算出相應時間行星所在的位置。這裏所說的只是整數相乘、整數與分數相乘、分數與分數相乘的辦法,而沒有解釋推五步的具體辦法。
參考文獻
- 錢大昕. 三統術衍. 自“夫曆春秋者”始。
- 張培瑜、陳美東、薄樹人和胡鐵珠. (2008). 中国古代历法.中国科学出版社.
- 劉操南. (2009). 古代天文曆法釋證. 浙江大學出版社.
- 劉洪濤. (2003). 古代曆法計算法. 南開大學出版社.
- 夏國強. (2015). 《漢書·律曆志》研究. 花木蘭文化出版社.
-
劉洪濤認爲應該在十三後點斷,是。 ↩︎