初稿: 2019年4月
本文細述本網站對秦至漢初(公元前221年–前104年)曆法的計算,曆法的復原方法採用李忠林在2012年發表的「秦至汉初(前246至前104)历法研究—以出土历简为中心」李忠林12(也可參看李忠林2016年的著作《秦至汉初历法研究》李忠林16)。復原方法的有效年限估計是從前246年至前104年,但是本網站只用在前221年至前104年。此復原法的要旨是把秦至漢初分為三個時段,每個時段有各自的合朔曆元,然後用四分術的朔策計算每個時段的合朔時刻,置閏按照3-3-3-2-3-3-2的年序經驗法則在十九年置七個閏月,但在漢文帝後元元年(公元前163年)起改變了章週的起算年李忠林09。二十四節氣的時刻則與古六曆之一的顓頊曆相同。按李忠林的說法,置閏採用經驗法則,二十四節氣與閏月規則毫不相干,這點我認為值得再探討,但這和復原曆法沒有直接關係,不在這裡討論。
本文所述的復原方法涉及古六曆和本網站之古六曆計算法,這些資料在本網站的古六曆網頁有敘述,這裡就不重複了。
歷代學者對於秦至漢初的曆法一直感到困惑。《史記》說漢初沿用秦朝曆法,《漢書》進一步說明所用的曆法是古六曆之一的顓頊曆。但是歷代學者已發現用顓頊曆推算出的漢初曆日與文獻常有不合,而多與殷曆相合。自宋人劉羲叟到近代學者陳垣,都主張秦與漢初的曆法是顓頊曆或殷曆。到了1972年,在山東省臨沂市銀雀山漢墓出土了《元光元年曆譜》,我們因此得知漢武帝元光元年(公元前134年)的曆日,曆譜所載的十三個朔日干支有十個與殷曆合,有七個與顓頊曆合,說明元光元年曆譜所用的曆法既不是顓頊曆,也不是殷曆,於是掀起了秦與漢初曆法研究的熱潮,學者們尋求一套曆法復原方法以符合《元光元年曆譜》。
漢初曆法雖然不是古六曆的任何一種曆法,但一般認為應該仍是採用古六曆的四分術。秦與漢初的曆法用顓頊曆的月序,以十月為一年之始,月序數是十月、十一月、十二月、正月、二月……九月,閏月置於年終,稱為「後九月」,這點也是沒有爭議的。問題是只根據《元光元年曆譜》不能找出以四分術為本的唯一復原方法。據張培瑜在《中国古代历法》張陳薄胡第三章第九節和「根据新出历日简牍试论秦与汉初的历法」張培瑜07所述,以《元光元年曆譜》復原漢初曆法有58種可能,合朔時刻的上下限可相差87分鐘,在沒有其他資料的情況下無法判斷誰對誰錯,很多學者都提出各自的復原方法。上世紀八十年代及以後,情況又有了新進展。先是在湖北江陵縣張家山247號漢墓發現了從漢高祖五年(公元前202年)到高后二年(前186年)十七年的曆日竹簡,後來又在湖北省沙市區關沮鄉清河村周家台30號秦墓出土的秦簡﹑和在湖南西部里耶鎮出土的秦簡都有秦朝的曆日資料。從這些考古新發現我們得知秦與漢初施行的曆法比以前認識的複雜,先前沒有一家的復原法能與新出土的曆日完全吻合。
據我所知,目前有兩篇文章嘗試用這些新出土的簡牘復原秦與漢初的曆法註一。其一是上面提及的張培瑜在2007年發表的「根据新出历日简牍试论秦与汉初的历法」張培瑜07,另一是李忠林在2012年發表的「秦至汉初(前246至前104)历法研究—以出土历简为中心」李忠林12。李忠林的研究成果也發表在其著作《秦至汉初历法研究》李忠林16,筆者感謝李忠林教授贈送此書。兩者都認為秦與漢初的曆法不同,而張家山竹簡曆日所依據的漢初曆法與《元光元年曆譜》用的漢武帝時期曆法又不相同,但兩篇文章提出的曆法復原方法不同。
張培瑜對秦朝曆法的復原法採用四分術的朔策和歲實,以公元前606年(乙卯)己巳夜半霜降合朔齊同為曆元(公曆日期是前607年10月27日),並以小雪固定在十月為置閏標準。復原曆法與已公布的考古發現及文獻記載的(由秦昭襄王末年到秦亡)秦國曆日都相符。文章的表九載有從秦王政元年(公元前246年)到秦亡(前207)的朔閏表。
至於漢初的曆法,張培瑜的結論是不可能找到一種以四分術為本的曆法可以完全滿足從漢初到太初改曆前這102年的全部曆日。也就是說,如果漢初施行的曆法確是四分術,則其間曆法必有修改過;如果漢初的曆法沒有修改過,則這曆法一定不是四分術。張培瑜試圖打破四分術的框架,以一種平朔法來復原漢初曆法。他假設的朔策是(29+663/1249)日,歲實是365.2496734日或(365+311.8420766/1249)日。這樣的歲實看似莫明其妙,其實只是朔策的235/19倍,寫成(365+5925/23731)日也可以。用235:19的比例顯然是為了符合十九年七閏的章週規律。張培瑜沒有明確說明復原曆法的曆元,但文章的表十給出從漢高祖元年(公元前206年)到漢武帝元封六年(前105年)的朔閏表註二。文章也沒有說明復原曆法的置閏法則,但有提及另一復原曆法的置閏法則是把立春固定在正月,這是相當奇怪的置閏法則,而且明顯不符合文末表十的朔閏表。我根據張培瑜在《中国古代历法》張陳薄胡第三章第九節所述的置閏法則得出正確的閏月。這法則是在漢文帝後元元年(公元前163年)前把冬至固定在十一月,在後元元年後則把雨水固定在正月。
張培瑜用非四分術的方法復原漢初曆法,頗似他對春秋時期魯國曆法的復原(張培瑜的春秋曆復原法可參考《中国古代历法》張陳薄胡第三章第五節,本網站的春秋曆就是採用這復原方法,詳情可參閱春秋曆網頁。)。張培瑜並沒有給出漢初行用非四分術的論據,我應為這做法只是數據擬合的模型,不是漢初行用曆法的依據。
李忠林在「秦至汉初(前246至前104)历法研究—以出土历简为中心」李忠林12提出另一復原方法。他認為既然秦、漢初與漢武帝時期的曆日資料顯示這三段時間行用的曆法不同,最簡單的解釋是曆法在這段期間至少有過兩次改動。他於是用三種以四分術為本的曆法復原秦至漢初一百四十多年間的曆法,三種曆法以A、B、C名之。他主張三曆法都用顓頊曆的方法計算二十四節氣,只是合朔計算採用三個曆元。曆法A的曆元是秦孝公元年(公元前361年)十月丁巳朔無餘(公曆日期是前362年11月18日),曆法B的曆元是公元前240年十月乙亥朔無餘(公曆日期是前241年10月31日),曆法C的曆元是公元前206年十一月丁巳朔無餘(公曆日期是前207年12月14日)。「朔無餘」是指合朔小餘是零,即合朔發生在夜半(午夜零時)。曆法A的行用時間暫定為秦王政以前到漢高祖五年十二月,曆法B從漢高祖五年正月到文帝前元十六年後九月,曆法C從文帝後元元年十月到太初元年五月。
李忠林對於秦與漢初的置閏法則有獨特見解,認為置閏只是按照3-3-3-2-3-3-2的年序經驗法則在十九年置七個閏月,但在漢文帝後元元年(公元前163年)起改變了章週的起算年。其實,李忠林在2009年的文章「试论秦汉初历法的置闰规则」李忠林09已指出秦至漢初的所有閏月皆可從出土曆簡與存世文獻推出來,所以雖然我們不知道當時行用的置閏法則,但是仍能根據推出來的閏月復原曆法。
張培瑜與李忠林兩人提出的秦與漢初曆法復原方法雖然不同,但是比較他們提供的朔閏表發現在140多年間、1700多個朔日裡,只有19個朔日有差異,現在把這19個差異列於下表以供參考。表中的年份除了給出中國傳統的帝王或年號紀年外,還用Ny表示年首最接近公元y年1月1日的曆年。例如N-202表示漢高祖四年,始於公元-203年(即前204年)11月11日、終於-202年10月30日。
年份 | 月份 | 朔日 — 張培瑜 | 朔日 — 李忠林* |
---|---|---|---|
N-245 秦王政元年 | 二 | 戊申 (-245年3月5日) | 丁未 (-245年3月4日) |
N-239 秦王政七年 | 九 | 庚子 (-239年9月21日) | 己亥 (-239年9月20日) |
N-232 秦王政十四年 | 三 | 壬辰 (-232年4月9日) | 辛卯 (-232年4月8日) |
N-226 秦王政二十年 | 後九 | 甲申 (-226年10月27日) | 癸未 (-226年10月26日) |
N-204 漢高祖二年 | 十 | 辛巳 (-205年11月3日) | 壬午 (-205年11月4日) |
N-204 漢高祖二年 | 十二 | 庚辰 (-204年1月1日) | 辛巳 (-204年1月2日) |
N-204 漢高祖二年 | 二 | 己卯 (-204年2月29日) | 庚辰 (-204年3月1日) |
N-203 漢高祖三年 | 二 | 癸卯 (-203年3月19日) | 甲辰 (-203年3月20日) |
N-203 漢高祖三年 | 四 | 壬寅 (-203年5月17日) | 癸卯 (-203年5月18日) |
N-202 漢高祖四年 | 七 | 乙丑 (-202年8月3日) | 丙寅 (-202年8月4日) |
N-202 漢高祖四年 | 九 | 甲子 (-202年10月1日) | 乙丑 (-202年10月2日) |
N-183 漢高后四年 | 二 | 丁丑 (-183年3月8日) | 戊寅 (-183年3月9日) |
N-177 漢文帝前元二年 | 九 | 己巳 (-177年9月25日) | 庚午 (-177年9月26日) |
N-170 漢文帝前元九年 | 三 | 辛酉 (-170年4月13日) | 壬戌 (-170年4月14日) |
N-163 漢文帝前元十六年 | 十 | 癸丑 (-164年10月30日) | 甲寅 (-164年10月31日) |
N-136 漢武帝建元四年 | 五 | 癸卯 (-136年5月26日) | 甲辰 (-136年5月27日) |
N-129 漢武帝元光五年 | 十一 | 乙未 (-130年12月13日) | 丙申 (-130年12月14日) |
N-112 漢武帝元鼎四年 | 十二 | 丙戌 (-112年1月4日) | 丁亥 (-112年1月5日) |
N-106 漢武帝元封四年 | 七 | 戊寅 (-106年7月23日) | 己卯 (-106年7月24日) |
* 李忠林朔閏表中漢高祖七年五月朔的日干支有誤:己巳應改為己卯註三,這錯誤在《秦至汉初历法研究》李忠林16改正了。
鑑於兩套復原方法都能完全符合已出土的曆簡和傳世文獻,而且差異不大,二者可任選其一。仔細比較兩套算法,我認為李忠林的方法較為可取,所以本網站採用他的復原方法。下面各節詳細說明本網站的具體計算方法。
復原曆法的二十四節氣和顓頊曆相同,計算方法在古六曆網頁已有敘述,這裡只把公式列出。根據古六曆網頁公式(4)和表二的數據,可得最接近公曆y年1月1日的冬至儒略日數是
JD(W(y)) = 1721050.5 + 19/32 + y·Ps (1)
其中Ps=365.25是四分術的歲實。其他二十四節氣的儒略日數可用古六曆網頁公式(5)計算:
JDq(j, y) = JD(W(y)) + (j/24)·Ps (2)
其中j是從冬至算起的節氣數,以j=0表示冬至、j=1表示小寒、j=2表示大寒、j=3表示立春……j=23表示大雪(二十四節氣的名稱和次序可參閱本網站的二十四節氣網頁)。式中除了冬至落在y-1年的12月末外,其餘節氣都在公元y年。
合朔的儒略日數也可以寫成古六曆網頁中的公式(1):
JD(Mi) = JD(M0) + i· PL (3)
式中PL=(29+499/940)是四分術的朔策,i是從曆元合朔M0起算的積月,Mi是從曆元合朔M0起算的第i個合朔,JD(M0) 是曆元合朔M0的儒略日數。
上節說過復原曆法採用三個合朔曆元。以曆法A為例,曆元取秦孝公元年(公元前361年)十月丁巳朔無餘。用上一節定義的曆年記號,秦孝公元年是N-360,顓頊曆的十月朔是公元前362年11月17日,日干支是丙辰,比曆法A的曆元早一日。公元前362年11月18日(丁巳日)夜半的儒略日數是1589523.5,由此得出曆法A的JD(M0)=1589523.5。曆法B和C的JD(M0)也可用類似的方法計算,結果列於下表。
曆 法 A | 曆 法 B | 曆 法 C | |
---|---|---|---|
曆元 | N-360十月丁巳朔無餘 | N-239十月乙亥朔無餘 | N-205十一月丁巳朔無餘 |
行用時間 | N-245(秦王政元年)之前 – N-201(漢高祖五年)十二月 | N-201(漢高祖五年)正月 – N-163(文帝前元十六年)後九月 | N-162(文帝後元元年)十月 – N-103(武帝太初元年)五月 |
JD(M0) | 1589523.5 | 1633701.5 | 1646163.5 |
如果知道了從曆元合朔到曆年Ny十月朔的積月 A(y),Ny的十月朔便可用公式(3)把i換成A(y)求得,Ny的其他月份也可輕易計算。但是要知道A(y)的數值就要知道Ny之前的閏月分佈。下一節探討計算閏月和A(y)的方法。
在第一節(引言)已提及秦至漢初一百四十多年間的所有閏月都可從出土曆簡和存世文獻推出來,所以即使不知道當時行用的置閏法則也能根據閏月的實際分佈復原秦至漢初的曆法,本網站就是以這原則處理秦至漢初的閏月。
年首積月A(y)可用類似本網站復原春秋曆網頁所述的方法計算。由於春秋時期魯國的曆法沒有固定的置閏規則,閏月和A(y)都必須根據閏月的實際年份逐年計算。秦至漢初曆法的閏月則分佈規整,而且符合古六曆網頁所述的3-3-3-2-3-3-2年份次序,只是在漢文帝後元元年(N-162)起改變了章週的起算年(詳情可參閱李忠林的「试论秦汉初历法的置闰规则」李忠林09),所以閏月和A(y)不須要如春秋曆般逐年計算,只要掌握了一章週內十九年的數據便可推出其他年份的閏月和A(y)。具體的計算方法是先定義兩個函數J和R:
k | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
J(k) | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
R(k) | 0 | 12 | 24 | 37 | 49 | 61 | 74 | 86 | 98 | 111 | 123 | 136 | 148 | 160 | 173 | 185 | 197 | 210 | 222 |
此處k是從某一章首起算的積年:k=0表示章週的第一年、k=1表示章週的第二年、k=2表示章週的第三年、……、k=18表示章週的第十九年。J(k)的數值表示該年有沒有閏月(即後九月):J(k)=0表示沒有閏月、J(k)=1表示有閏月。表中的0、0、1、0、0、1、0、0、1、0、1、0、0、1、0、0、1、0、1正是3-3-3-2-3-3-2的閏月規律。R(k)是從章週第一年第一個月起算的年首積月,R(k)可用以下遞歸公式計算:
R(0) = 0, R(k) = R(k-1) + 12 + J(k-1) (k=1, 2, ..., 18) (4)
也就是說年首積月第一年是0,其後每年增加12或13:沒有閏月就增加12、有閏月則增加13。表三所列的R(k)就是用遞歸公式(4)計算的結果。有了J(k)和R(k)兩個函數後,年首到曆元的積月A(y)可用以下公式計算:
c = floor( (y - yz)/19 ) (5)
k = y - yz - 19c (6)
閏月: 如果J(k)=0就沒有閏月、如果J(k)=1就有閏月 (7)
年首積月: A(y) = ΔA + 235c + R(k) (8)
其中floor(x)表示不小於x的最大整數,yz是 某一章首的年份。如前述,漢文帝後元元年改變了章週的起算年,所以yz在文帝後元元年前和後元元年後的數值不同。c就是從yz算起到y對上一個章首的週期數。式(6)中k是從y到對上一個章首的積年,寫成k = mod(y - yz, 19)也可以,此處mod(X,Y)指X除以Y後所得之餘數。公式(8)的最後兩項代表從yz到y的積月,但是A(y)是從曆元到y的積月,所以要加上修正值ΔA。ΔA和yz在曆法A、B、C的數值列於下表,為方便查閱,這裡把表二的資料也一併列出。如上述,yz在漢文帝後元元年前後取不同數值,但漢文帝後元元年正是曆法C的起用年,故yz在曆法A和B取同一數值,在曆法C取另一數值。
曆 法 A | 曆 法 B | 曆 法 C | |
---|---|---|---|
曆元 | N-360十月丁巳朔無餘 | N-239十月乙亥朔無餘 | N-205十一月丁巳朔無餘 |
行用時間 | N-245(秦王政元年)之前 – N-201(漢高祖五年)十二月 | N-201(漢高祖五年)正月 – N-163(文帝前元十六年)後九月 | N-162(文帝後元元年)十月 – N-103(武帝太初元年)五月 |
JD(M0) | 1589523.5 | 1633701.5 | 1646163.5 |
yz | -225 | -225 | -179 |
ΔA | 1670 | 174 | 321 |
有了公式(1)–(3)、(5)–(8)、表二、表三和表四的數據就可以計算秦至漢初一百四十多年間的曆法,下一節用兩個例子展示實際的計算。
雖然復原曆法有效年限估計是秦王政元年前到漢武帝太初元年五月,本網站年曆網頁從公元-220年(即前221年)起才用復原曆法、朔閏表網頁則從N-220年(即秦始皇二十六年)起才用復原曆法(年曆網頁以公曆為主、朔閏表網頁則以農曆為主)。兩網頁都在漢武帝太初元年五月起改用張培瑜《三千五百年历日天象》張培瑜97的數據註四。復原曆法的太初元年三月是小月、四月是大月、五月是小月。改了曆法後,五月朔提前了一天,使四月變成小月,而新曆法的五月又是小月,於是出現了三、四、五三個相連小月,這在平朔法則是不可能的,只有在改曆時才可能出現。如果在太初元年六月才改用太初曆,就會使五月只有二十八日,這在平時也是不可能出現的。
先計算月份。根據表四,N-130應用曆法C、JD(M0)取1646163.5、yz = -179、ΔA = 321。用公式(5)–(8)及表三得出:
c = floor( (-130 + 179)/19) = 2
k = -130 + 179 - 19×2 = 11
J(11) = 0 ⇒ N-130沒有後九月
A(-130) = 321 + 235×2 + 136 = 927。
有了年首積月後,N-130十月朔的儒略日數用公式(3)把i=A(-130)計算:
JD十月朔 = 1646163.5 + 927×(29+499/940) = 1673538.5 + 93/940
合朔小餘是93(略去分母940),用現行的時間系統即是說合朔時間是2時22分28秒。朔日正午的儒略日數是1673539,用儒略日轉公曆的標準方法(例如理查斯算法)算出對應的公曆日期是公元前132年11月25日,用干支網頁的公式求得朔日的天干數是
1 + mod(1673539-1, 10) = 9,日天干是壬;朔日的地支數是
1 + mod(1673539+1, 12) = 9,日地支是申,所以朔日干支是壬申。
N-130的其他月份的合朔日期和小餘只須把十月朔的時刻加上朔策的整數倍便可求得。傳統的計算法是用大小餘,日數先定為29,把合朔小餘加499(略去分母940),如果大於940則減去940並把日數進一得30,下一個朔日便是29日或30日後。例如十月朔是壬申,小餘93,把小餘加499得592,日數是29,所以十月是小月,十一月朔在壬申日後29日。29=3×10-1,所以天干是壬之前的第一個天干,即辛;29=2×12+5,所以日地支是申之後的第五個地支(數到亥後回到子再數),即丑。因此十一月朔是辛丑,小餘是592。公曆日期是11月25日之後29日,即11月(25+29)日=12月(25+29-30)日=12月24日。當然,傳統算法在編寫程式上會較為麻煩,不及儒略日數那麼方便。下表把十月至九月的合朔日期﹑干支和小餘列出。
月份 | 朔日公曆日期 | 朔日干支 | 合朔小餘 |
十(小) | 前132年11月25日 | 壬申 | 93 |
十一(大) | 前132年12月24日 | 辛丑 | 592 |
十二(小) | 前131年1月23日 | 辛未 | 151 |
正(大) | 2月21日 | 庚子 | 650 |
二(小) | 3月23日 | 庚午 | 209 |
三(大) | 4月21日 | 己亥 | 708 |
四(小) | 5月21日 | 己巳 | 267 |
五(大) | 6月19日 | 戊戌 | 766 |
六(小) | 7月19日 | 戊辰 | 325 |
七(大) | 8月17日 | 丁酉 | 824 |
八(小) | 9月16日 | 丁卯 | 383 |
九(大) | 10月15日 | 丙申 | 882 |
月大月小由兩朔日之間的日期間隔決定,兩朔日相差二十九日為小月﹑三十日為大月。合朔小餘是合朔離子正的時間以分數日表示,分母940往往略去。由於朔策是(29+499/940)日,每月的合朔小餘是前月的小餘加上499,達到或超過940則減去940,合朔小餘如果小於441,加了499後仍小於940,則此月是小月,大於或等於441時則是大月。
現在計算小雪、冬至、立春的日期和月齡,先計算冬至。用公式(1)求得N-130冬至的儒略日數是
JD冬至 = JD(W(-130)) = 1721050.5 + 19/32 -130×365.25 = 1673568.5 + 3/32
冬至小餘是3/32,冬至日正午的儒略日數是1673569,用上述的方法計算出對應的公曆日期是公元前132年12月25日、日干支是壬寅,從表五可見冬至在十一月初二。至於冬至的月齡,按定義是冬至離之前的合朔時間,這裡用朔策的分數倍表示。冬至之前的朔是十一月朔。
JD十一月朔 = JD十月朔 + 29 + 499/940 = 1673567.5 + 592/940,
冬至月齡 = (JD冬至 - JD十一月朔)/(29 + 499/940) = 1163/74024 ≈ 0.3/19。
以上的計算保留了分數,只是為了方便展示小餘的數值而已。其實本網站的曆法計算全部用十進制小數,我在古六曆網頁的最後一節有詳細敘述,其中最後一個公式給出二十四節氣月齡的簡易計算法:
L = (JD - JD(M0))/29.53085106382979 (9)
節氣月齡 = L - floor(L) (10)
式中JD(M0)可從表二查得,曆法C的值是1646163.5。L是從曆元合朔M0起算到該節氣的時間間隔以朔策為單位,月齡是節氣與上一個合朔的時間間隔,以朔策為單位就是L的小數部分。以冬至為例,
L = (JD冬至 - 1646163.5)/29.53085106382979 = 928.0157111207177
冬至月齡 = L - floor(L) = 0.01571112207177 ≈ 0.3/19,與上面計算的數值一致。
其實每一個合朔的懦略日數都是JD(M0)加上朔策的整數倍,所以用任何一個合朔計算L都可以,得到的L只是整數部份不同而已。這裡就再以JD十月朔為例:
L = (JD冬至 - JD十月朔)/29.53085106382979 = 1.015711120717605
冬至月齡 = L - floor(L) = 0.0157111220717605 ≈ 0.3/19,也與上面計算的一致。
值得注意的是在古六曆很多曆法裡,冬至的月齡往往是1/19的整數倍,但在這裡卻不是,這是因為曆元氣朔並沒有冬至閏餘無的關係。即使在顓頊曆,曆元氣朔的關係是夜半立春合朔齊同,由此可算出顓頊曆的冬至在曆元年份的月齡是69/152=8.625/19,也不是1/19的整數倍,而曆法C的曆元乾脆不指定氣朔有任何關係,不是1/19的整數倍是正常的。月齡每年增加7/19(大於或等於一就把一減去),所以其他年份的月齡也不會是1/19的整數倍。
其他二十四節氣可用公式(2)計算。N-130的小雪應在公元-131年,所以應用y=-131來算,但是其實不一定要用公式(2)計算:小雪是冬至之前的第二個節氣,只須把JD冬至減去(2/24)Ps就可以了。
JD小雪 = JD冬至 - (2/24)×365.25 = 1673537.5 + 21/32
比較JD小雪和JD十月朔,得知小雪日在十月朔日之前一日,即11月24日,不屬於N-130。從表五可見N-129年首在前131年10月15日之後30日,即11月14日,而公元前131年的小雪必然在11月24日或前後一日,也就是說N-130沒有小雪。
立春是冬至之後的第三個節氣,所以
JD立春 = JD冬至 + (3/24)×365.25 = 1673613.5 + 3/4
L = (JD立春 - JD十月朔)/(29 + 499/940) = 2 + 5198/9253
立春月齡 = 5198/9253 ≈ 10.7/19。
立春小餘是3/4,立春日正午的儒略日數是1673614,對應的公曆日期是前131年2月8日、日干支是丁亥,從表五可算出在漢曆的十二月十七。
從表二得知N-201正月前用曆法A,正月開始用曆法B,所以曆法A和B的積月都要計算。
先算曆法A,根據表四,JD(M0)=1589523.5、yz=-225、ΔA=1670。
c = floor((-201 + 225)/19) = 1
k = -201 + 225 - 19 = 5
J(5) = 1,但曆法A只用到十二月,N-201有沒有後九月由曆法B決定。
A(-201) = 1670 + 235 + 61 = 1966
JD十月朔 = 1589523.5 + 1966×(29+499/940) = 1647580.5 + 614/940
十月朔小餘是614,朔日正午的儒略日數是1647581,對應的公曆日期是前203年10月31日、日干支是甲午。
至於曆法B,根據表四,JD(M0)=1633701.5、yz=-225、ΔA=174。
c = floor((-201 + 225)/19) = 1
k = -201 + 225 - 19 = 5
J(5) = 1 ⇒ N-201有後九月
A(-201) = 174 + 235 + 61 = 470
曆法B從正月開始使用,正月是十月後的第三個月,所以
JD正月朔 = 1633701.5 + (470+3)×(29+499/940) = 1647669.5 + 87/940。
正月朔小餘是87,朔日正午的儒略日數是1647670,對應的公曆日期是前202年1月28日、日干支是癸亥。有了十月和正月的日期和朔小餘後,N-201其他月份的合朔只須加上朔策的整數倍即得,下表列出計算結果。
月份 | 朔日公曆日期 | 朔日干支 | 合朔小餘 |
十(大) | 前203年10月31日 | 甲午 | 614 |
十一(小) | 11月30日 | 甲子 | 173 |
十二(大) | 12月29日 | 癸巳 | 672 |
正(小) | 前202年1月28日 | 癸亥 | 87 |
二(大) | 2月26日 | 壬辰 | 586 |
三(小) | 3月28日 | 壬戌 | 145 |
四(大) | 4月26日 | 辛卯 | 644 |
五(小) | 5月26日 | 辛酉 | 203 |
六(大) | 6月24日 | 庚寅 | 702 |
七(小) | 7月24日 | 庚申 | 261 |
八(大) | 8月22日 | 己丑 | 760 |
九(小) | 9月21日 | 己未 | 319 |
後九(大) | 10月20日 | 戊子 | 818 |
如上述,月大月小可從小餘數值得知,小餘小於441是小月,否則是大月。但是這規則不一定適用於十二月,因為正月開始改用新曆法,所以必須從十二月朔和正月朔日期間隔定出十二月是大月還是小月。
節氣的計算與上面一樣。先算冬至,用公式(1)求得N-201冬至的儒略日數是
JD冬至 = 1721050.5 + 19/32 - 201×365.25 = 1647635.5 + 11/32。
冬至小餘是11/32,冬至日正午的儒略日數是1647636,對應的公曆日期是前203年12月25日、日干支是己丑,從表六可算出冬至在漢曆的十一月廿六。由於冬至在正月之前,計算月齡時應用曆法A的合朔,這裡且用JD十月朔來算:
L = (JD冬至 - JD十月朔)/(29 + 499/940) = 1 + 189201/222072
冬至月齡 = 189201/222072 ≈ 16.2/19。
小雪是冬至之前第二個節氣,所以
JD小雪 = JD冬至 - (2/24)×365.25 = 1647604.5 + 29/32
小餘是29/32,正午儒略日數是1647605,對應的公曆日期是前203年11月24日,日干支是戊午,從表六可算出在漢曆的十月廿五。由於小雪就在十月,用JD十月朔計算月齡最直接。
小雪月齡 = (JD小雪 - JD十月朔)/(29 + 499/940) = 182383/222072 ≈ 15.6/19。
夏至在冬至之後半個歲實,所以
JD夏至 = JD冬至 + 365.25/2 = 1647817.5 + 31/32
小餘是31/32,正午儒略日數是1647818,對應的公曆日期是前202年6月25日,日干支是辛卯,從表六可知在漢曆的六月初二。夏至在正月之後,算月齡時要用曆法B的合朔,這裡就用JD正月朔來算。
L = (JD夏至 - JD正月朔)/(29 + 499/940) = 5 + 9189/222072
夏至月齡 = 9189/222072 ≈ 0.8/19。
秦與漢初的曆法是後天的,即曆法的合朔時刻遲於真正的合朔時刻,如下圖所示,兩者相差的平均值約為一天,所以漢初的日食多發生在晦日(即朔之前一天),甚至晦日前一天。四分術的朔策比朔望月的平均值稍大,積三百年就會後天一日,所以在圖中明顯可見後天日數有逐漸增大的趨勢。
圖中所見的波動是因為曆法的合朔計算用平朔法,沒有計及月亮和太陽的不均勻運動。從秦王政元年到秦朝滅亡之間,曆法後天日數的平均值是1.03日。曆法A改為曆法B後,合朔小餘調小了144/940(≈ 0.15日),不足以改變曆法A的後天,只能暫緩後天日數之增長。曆法B改為曆法C後,合朔小餘調小了18/940(≈ 0.019日),更是無補於事。所以曆法後天的日數繼續增加,漢武帝元光年間(前134年至前129年)的平均後天日數是1.20日,到了漢武帝元封元年(前110年)以後後天日數增加到1.24日,直到太初元年改曆後才改正過來。這些平均後天日數的數值與張培瑜「根据新出历日简牍试论秦与汉初的历法」張培瑜07給出的數值很接近。曆法後天如此嚴重,當時不可能不知道,而應該是故意的。
李忠林在《秦至汉初历法研究》李忠林16分析指出曆法後天極可能受到天命論的政治思想影響,曆法家選取曆元,往往為了顯示統治者合乎天命而捨棄較為合天的曆元。例如曆法A的曆元選秦孝公元年就有強烈的天命論色彩,秦孝公在位期間採納商鞅的變法使秦國富國強兵。曆法C的曆元是漢高祖元年,也有明顯的天命論色彩。到了漢武帝太初元年的曆改天命論色彩更加濃厚,這點在《秦至汉初历法研究》和《中国古代历法》張陳薄胡都有詳細說明。
用上述方法可輕易算出二十四節氣在秦至漢初一百四十多年間的日期和月齡,其中小雪、冬至、大寒、立春和雨水的數據列於此網頁。正如上二節例一所示,某些年份有時沒有小雪,表中所列的數據是最接近當年十月初一的小雪。從表中可見有一些小雪出現在前一年的後九月末。
節氣的月齡每年增加7/19 (mod 1),十九年循環一週,但是節氣的中曆日期卻不然。以冬至為例,上二節例一算得冬至在N-130(漢武帝元光四年)的月齡是1163/74024(≈0.3/19),也就是說冬至在合朔之後1163/74024個朔策,用現在通用的24小時制來說,冬至在合朔以後11小時8分6秒。例二亦算出十一月朔小餘是592(分母是940),換成24小時制,合朔發生在15:06:54,把這時間加上11小時8分6秒,便得冬至時刻是朔日下一天的02:15,所以元光四年的冬至在十一月初二。十九年後是N-111(漢武帝元鼎五年),這時冬至的月齡已循環一週又回到1163/74024,即冬至仍在合朔後11小時8分6秒,這時的十一月朔是N-130十一月朔之後235個月,朔小餘是mod(592 + 235×499, 940) = 357,合朔發生在09:06:54,把這時刻加上11小時8分6秒,得知冬至在朔日當天的20:15,所以是十一月初一,和元光四年的冬至日期不一樣,這計算與此網頁的數據吻合。可見節氣的中曆日期並非以十九年為週期,用四分術的法數可知週期是一蔀,即七十六年。由於曆法A、B和C沒有一部的行用時間超過七十六年,所以有必要把一百四十多年的數據全部列出。
從表中可看到在文帝後元元年(N-162)以前,冬至一直固定在十一月,而且閏年都出現在冬至(和大寒)月齡大於12/19的年份。文帝後元元年後,由於閏月分佈有了改變,冬至不再固定在十一月了,反而大寒固定在十二月以及雨水固定在正月,而閏年則出現在雨水月齡大於12/19的年份。
表中雖然只列出幾個節氣,但我把所有二十四節氣都計算了,發現在文帝後元元年前,除了冬至外沒有其他二十四節氣固定在一個月內,除了冬至和大寒外也沒有其他節氣月齡大於12/19的年份與閏年吻合。文帝後元元年後,除了大寒和雨水外,沒有其他二十四節氣固定在一個月內;除了雨水外,沒有其他二十四節氣月齡大於12/19的年份與閏年吻合。這些資料或許是研究這段期間置閏法則的重要線索。
[註一] 本文的主要目的是說明本網站對秦與漢初曆法之復原法,並非學術論文,撰寫時並無搜索所有的相關文獻,如有文獻遺漏,敬請原諒。
[註二] 至今我仍摸不透張培瑜07年文章表十的朔閏表是怎樣算出的。只要知道其中一個合朔的日期和小餘,其他合朔的日期和小餘就可用張培瑜採用的朔策(29+663/1249)日計算出,但是表十只有日干支,沒有給出小餘。但這問題也不難解決,以表十的第一個合朔為例,合朔小餘有1249個可能:0、1/1249、2/1249、……、1248/1249。從漢高祖元年十月到漢武帝元封六年後九月有1262個朔日,只要把這1249個可能的小餘一一檢驗,就可知道哪個小餘值可得出完全符合表十的1262個朔日干支(略去表十最後一行的太初元年朔日)。我編寫了簡單的計算機程式,得出這1249個可能的小餘之中,只有611/1249能滿足表十的1262個朔日干支。每月小餘增加663,而mod(611+195×663, 1249) = 0,由此可知漢高祖元年十月後第195個合朔發生在夜半,但是這個朔是漢惠帝四年八月朔(公元前191年8月21日),日干支是丙戌,與文章所載的15蔀蔀首日名沒有一個相符。根據採用的朔策,一蔀有1249×29+663=36884日,而36884×3=9221×12,所以蔀首日名地支以三蔀循環一週,如果戌是其中一地支,則其餘蔀首日名地支只能是午和寅,但文章所列出的蔀首日名的三個可能地支是子、申和辰,顯然與丙戌不相容。但是以漢惠帝四年八月丙戌合朔發生在夜半這假設確能得出符合表十的所有朔日干支。
如果假設表十的干支不完全正確,則可求出一個可能的結果。這假設是漢高祖元年十月的朔小餘是613/1249,這樣的話就有兩個干支與表十不符:漢武帝建元四年五月朔和武帝元鼎四年十二月朔。有趣的是這兩個不合的日干支反而符合李忠林12文章的朔閏表。由於mod(613+860×663, 1249) = 0,高祖元年十月朔後的第860個朔日發生在夜半,這朔恰巧就是武帝建元四年的五月朔,日干支由表十的癸卯改為甲辰,而甲辰是文章列出的蔀首日名其中之一。由於這不是四分術,蔀首只是合朔發生在夜半,但不保證氣朔齊同。用蔀日36884往前推,看看是否可以找到一個以某一節氣合朔夜半齊同的曆元,使二十四節氣的時刻接近顓頊曆的二十四節氣時刻。我發現一個可能的曆元是前6297年庚申日夜半芒種合朔齊同(公曆日期是前6297年6月12日,儒略日數是-578393.5),用此曆元計算的節氣時刻在公元前150年比顓頊曆的約早10分鐘。復原曆法的歲實比四分術的歲實稍短,用此曆元計算的節氣時刻在漢初比顓頊曆遲約15分鐘, 在武帝太初元年時卻比顓頊曆早約30分鐘。表十是不是用這個曆元計算?那兩個朔日干支是不是真的錯了?
[註三] 用李忠林文章所述的曆元計算出漢高祖七年五月朔的日干是己卯,但是即使不用曆元計算也可推出表中五月朔干支不對,而且應該是己卯。這可從漢高祖七年四月朔和六月朔的日干支看出。表中列出四月朔和六月朔的日干支都是己酉,由此可知四月朔與六月朔相差六十日,唯一的可能是四月和五月都是大月。所以五月朔干支是己酉之後第三十個干支,即己卯。
[註四] 《三千五百年历日天象》自漢武帝太初元年正月起採用新曆法;從秦始皇三十一年(N-215)十月到太初元年十二月採用作者根據《元光元年曆譜》復原的曆法張培瑜78;從秦始皇二十六年(N-220)十月到秦始皇三十年(N-216)九月用顓頊曆。《三千五百年历日天象》並沒有說明這些細節,以上結論是比較書中曆表和張培瑜的另一本書《中国先秦史历表》張培瑜87中的曆表推斷的。《三千五百年历日天象》載太初元年十二月和正月連續兩月皆是小月,這在平朔法是不可能的,顯然是正月改曆的結果。
[註五] 實際合朔時刻用現代天文的計算方法,即這pdf文件所述的方法,但是歲差要用該文7.2節所說的Vondrák等人的歲差模型計算,算出的TDB時刻用該文第8節的方法轉化為世界時UT1時刻。曆法合朔時刻用上面公式(3)計算JD(Mi),這可視為是當地的地方時。秦朝京城咸陽和西漢京城長安的地理位置都很接近現在的陝西省西安市,經度大約是東經108.9°,所以京城地方時比UT1遲(108.9/15)小時=0.3025日,把JD(Mi)減去0.3025日便得曆法合朔的UT1儒略日數,再減去實際合朔的UT1儒略日數便求得曆法的後天日數。從秦王政元年十月朔到漢武帝太初元年四月朔總共有1764個合朔,圖一就是用這1764個合朔的後天日數繪製而成。
[李忠林09] 李忠林,"试论秦汉初历法的置闰规则",《四川大学学报(哲学社会科学版)》,2009年第6期(总第165期),第5–11頁。
[李忠林12] 李忠林,"秦至汉初(前246至前104)历法研究—以出土历简为中心",《中国史研究》,2012年第二期,第17–69頁。
[李忠林16] 李忠林,《秦至汉初历法研究》,中华书局(北京),2016年1月。
[張培瑜78] 張培瑜, "汉初历法讨论",《中国天文学史文集》,科学出版社(北京),1978年四月,第82–94頁。
[張培瑜87] 張培瑜,《中国先秦史历表》,齐鲁书社(济南),1987年6月。
[張培瑜97] 張培瑜,《三千五百年历日天象》,大象出版社,1997年7月。
[張培瑜07] 張培瑜, "根据新出历日简牍试论秦与汉初的历法",《中原文物》, 2007年第5期,第62–77頁。
[張陳薄胡] 張培瑜、陳美東、薄樹人和胡鐵珠,《中国古代历法》,中国科学出版社(北京),2008年3月。