《漢書·律曆志》筆記(3):三統曆算法的基本思路
三統曆曆法計算分爲三個部分,第一部分是年月日、節氣、月食等的計算,叫做統術;第二部分是五大行星出現的時間等的計算,叫做紀術;第三部分是推求特定年份木星所在十二次的哪一次,叫做歲術。下面先解釋三統曆算法的基本思路,之後再依次介紹統術、紀術、歲術的計算方法。
上一個部分介紹了很多三統曆所用的週期、時間單位長度等等,這些對三統曆的曆法計算都很重要。三統曆對年月日以及月食、五星運行的計算都有一個基本的思路。
首先,假設一個定點,在這一點冬至出現在天正月朔日夜半,五星、日月都在同一個位置,也就是之前介紹的太極上元。這個定點就是所有事件(包括年月日、日月、五星運行)的起點。所有的推算都是以太極上元爲起點來計算的。
其次,所有的天文和曆法事件都有一個週期。在一個週期與另一個週期之內,同一個天文或曆法事件在週期內以相同的順序和時間發生。例如,前面說過,朔望月和回歸年有一個大約十九年,也就是 235 個月的週期。在十九年的週期之中,有七個閏月。十九年中的第一個閏月必定設置在第三年的九月之後,也就是閏九月。假設過了十九年之後,第二個週期開始,在第 22 年(第二個週期的第三年 $22=19 + 3$),也必然是閏九月。
基於這種思路,假設已經知道一個特定年份距離太極上元,也就是週期開始時的距離(三統曆叫做“距上元年數”),只要先除去已經過去的年份中所有完整的週期數,餘下的數就是該年份在一個週期中的所在的位置。例如,在計算一個特定年份有沒有閏月、閏月是哪個月時,假設已經知道本年距離上元 $22$ 年,在這 22 年中,有一個朔望月和回歸年的十九年週期,那本年就處在第二個的週期的第三年($3 = 22 - 19 \times 1$)。
最後,根據給定年份在一個週期中的位置,與特定天文或曆法事件進行計算,就可以知道當年是否會發生這一天文或曆法事件,以及如果該事件發生,該事件發生的時間。例如,本年距上元 $22$ 年,在一個週期中處在第三年,根據十九年七閏,以及閏月必定在沒有中氣的月份的原則(這些已經在第一部分“中國傳統曆法的特點”中解釋過了),就可以確定本年有閏月,而且是閏九月。
總結一下,三統曆的計算大概有以下四步:
- 給定一個年份距太極上元的年數 $n$
- 已知某個事件的週期爲 $p$
- 從太極上元到本年已經經過的週期數爲 $n \ \mathbf{div}\ p$,也就是 $n$ 除以 $p$ 的商。假如這個數字的單位是日,它就叫做“積日”;如果是月,就叫做“積月”,意思是該事件累積的週期數。而本年在本週期內的位置就是 $n \ \mathbf{mod}\ p$,就是 $n$ 除以 $p$ 的餘數。這個餘數叫做“小餘”。
- 根據本年在本週期之內的位置 $n \ \mathbf{mod}\ p$,對照特定事件在一個週期內發生的順序,就可以知道本年該事件是否發生,以及如果發生,這一事件的發生時間。
還是以閏月爲例,假設一個特定年份距太極上元 $n$ 年,朔望月和回歸年的週期是 $p = 19$,計算過程就是:
$$ \begin{align*} n \div p& = \frac{n}{p}\\ & = n \ \mathbf{div}\ p \frac{n \ \mathbf{mod}\ p}{p}\\ & = n \ \mathbf{div}\ 19 \frac{n \ \mathbf{mod}\ 19}{19}\\ \text{到 n 年總共有幾個 19 年的週期}&= n \ \mathbf{div}\ 19\\ \text{第 n 年在 19 年的週期中的位置}&= n \ \mathbf{mod}\ 19\\ \end{align*} $$
知道了第 $n$ 年在 19 年的週期中的位置 $n \ \mathbf{mod}\ 19$,只要對照十九年的週期中設置閏月的順序和時間,就可以知道這一年有沒有閏月,以及閏月在哪一個月了。下面的表格就是十九年的週期中有閏月的年份,和閏月的月份。
| 年份 | 月份 |
|---|---|
| 第 3 年 | 閏九月 |
| 第 6 年 | 閏六月 |
| 第 9 年 | 閏二月 |
| 第 11 年 | 閏十一月 |
| 第 14 年 | 閏七月 |
| 第 17 年 | 閏四月 |
| 第 19 年 | 閏十二月 |
將第 $n$ 年在 19 年的週期中的位置 $n \ \mathbf{mod}\ 19$與年份對照,如果這個數字是有閏月的年份,就知道這一年閏月的哪個月份。
三統曆對其他事件的計算都遵循相同的思路。假如一個事件在一個週期內發生的時間間隔是一樣的,例如一年二十四個節氣,每個節氣都是 $365 \frac{385}{1539} \div 24 = 15 \frac{8080}{1539 \times 24} = 15 \frac{1010}{4617}$。假如我們知道這一年冬至發生在 $j \frac{x}{1539}$ 日,那只要加上一個節氣的時間,就可以算出下一個節氣發生的時間,也就是:
$$ \begin{align*} &j \frac{x}{1539} + 15 \frac{1010}{4617}\\ =&j \frac{3x}{4617} + 15 \frac{1010}{4617}\\ =&(j + 15) \frac{3x + 1010}{4617} \end{align*} $$
如果 $3x + 1010 \gt 4617$,那只要將這個數字化爲帶分數就可以知道下一個節氣發生的具體時刻了。三統曆對於節氣、中氣、五星後見的計算,都是基於這個思路的。
所以,要求某項事件是否發生和發生時間,只要知道三項數據就可以了:
- 本年距上元年數;
- 該事件的週期。這些週期數都已經列在統母、紀母中了;
- 該事件在一個週期內的發生順序。有的事件是勻速發生的(節氣、中氣等),有的事件不是(閏月)。
但是要說明的是,太極上元是日月和五星運行的共同週期,在計算五星週期時,必須要用到太極上元。因爲五星會合週期大於日月會合週期 $138240 \gt 4617$ 。但是對於年月日的計算,只要知道特定年份在一元或一統之中的位置就可以了(元法 4617,統法 1539)。這也就是爲什麼統術第一項計算的就是距上元某年在哪一統哪一年的緣故。