初稿: 2019年4月
本文細述本網站對秦至漢初(公元前221年–前104年)歷法的計算,歷法的復原方法采用李忠林在2012年發表的「秦至漢初(前246至前104)歷法研究—以出土歷簡為中心」李忠林12(也可參看李忠林2016年的著作《秦至漢初歷法研究》李忠林16)。復原方法的有效年限估計是從前246年至前104年,但是本網站只用在前221年至前104年。此復原法的要旨是把秦至漢初分為三個時段,每個時段有各自的合朔歷元,然后用四分術的朔策計算每個時段的合朔時刻,置閏按照3-3-3-2-3-3-2的年序經驗法則在十九年置七個閏月,但在漢文帝后元元年(公元前163年)起改變了章周的起算年李忠林09。二十四節氣的時刻則與古六歷之一的顓頊歷相同。按李忠林的說法,置閏采用經驗法則,二十四節氣與閏月規則毫不相干,這點我認為值得再探討,但這和復原歷法沒有直接關系,不在這里討論。
本文所述的復原方法涉及古六歷和本網站之古六歷計算法,這些資料在本網站的古六歷網頁有敘述,這里就不重復了。
歷代學者對于秦至漢初的歷法一直感到困惑?!妒酚洝氛f漢初沿用秦朝歷法,《漢書》進一步說明所用的歷法是古六歷之一的顓頊歷。但是歷代學者已發現用顓頊歷推算出的漢初歷日與文獻常有不合,而多與殷歷相合。自宋人劉羲叟到近代學者陳垣,都主張秦與漢初的歷法是顓頊歷或殷歷。到了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日)?!杆窡o余」是指合朔小余是零,即合朔發生在夜半(午夜零時)。歷法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中的歷表推斷的?!度灏倌隁v日天象》載太初元年十二月和正月連續兩月皆是小月,這在平朔法是不可能的,顯然是正月改歷的結果。
[注五] 實際合朔時刻用現代天文的計算方法,即這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月。