韋 磊
題目:圖1是關于判斷閏年的流程圖,則以下年份是閏年的為( )

圖1
A.1996 B.1998
C.2010 D.2100
這道題本身不難,只需要按照題目的要求,必須滿足被4整除且不能被100整除,或者能被400整除的年份,就是閏年.很容易檢驗,只有1996符合條件.
不過這道題背后所展示的有關歷法的背景值得我們關注:為何閏年年份要如此設置?背后的數學原理是什么?
這就不得不提與閏年設置息息相關的概念——連分數.因為恰好,連分數還可以解決我們在本刊本專欄的2019第10期所提出的中國剩余定理,類似:
“如果正整數N除以3余2,除以5余3,除以7余2,則滿足條件的N的最小值為多少?”
在該文中,我們總結出,解決這道題的關鍵,就是如何找到“3和5的最小公倍數中除以7余1”這樣的數,因為只要找到余1的數,那任何余數的情況也就很容易找到.這個問題可以歸納為:
如果數a,b的最大公約數為1,請找出a的倍數中,除以b余1的數,用數學語言,就是解方程ax≡1(modb)的解.
比如說,找“3和5的最小公倍數中找除以7余1”的數,就是解方程15x≡1(mod7).幸好,我們的老祖宗早就完美地解決了這一問題.這就是秦九韶的大衍求一術.
不過鑒于大衍求一術的原文理解起來比較生澀,相關文獻也不少,所以我們在這里采用一種與大衍求一術等價的方法來闡述,這便是連分數.
形如下面這樣的,就是連分數:

我們可以把任何一個數寫成連分數的形式,不管是有理數還是無理數,只不過有理數寫成的連分數,其“層數”是有限的,而無理數則有無限層.
將一個數寫成連分數的形式,并舍去一些分數層,就得到與原數近似的分數,比如說連分數:

我們可以依次得到一系列近似分數:
我們觀察著一系列近似分數:

經驗證,有以下結論成立:
定理若一個數的第n個近似分數為其中分子分母互質,第n+1個分數為則pnqn+1-pn+1qn=(-1)n.
此定理非常有用,其作用之一,便是求方程ax≡1(modb)的解.
我們且看方程ax≡1(modb),如果我們能將寫成連分數的形式,其倒數第二個近似分數為(最后一 個 近似分數就),并能保證n為偶數,那么根據定理,就有ap-bq=1,即ap=bq+1.瞧!這不就說明ap就是被b除余1的那個數嗎?這個p,不就是方程ax≡1(modb)的一個解了嗎?
太爽了,此時面臨兩個問題,一是,如何將一個有理數寫成連分數;第二是,如何保證n為偶數,也就是保證有偶數條分數線.
第二個問題,如何保證有偶數條分數線?這好像是天生注定的事情.實則不然,就比如剛才的的連分數,有三條分數線,如何將其寫成四條分數線?方法很簡單,只需要將最底層的分母4,寫成就行了,如果分母是3,就寫成以此類推.于是的連分數就成了另一種形式:

簡直要為我們掩飾不住的智慧點贊!
忍不住來試試手,比如方程15x≡1(mod7),因為有兩條分數線,其倒數第二個近似分數(最后一個為本身)為于是該方程的一個解就是其分子1了.
以上就是解方程ax≡1(modb)的方法,雖然秦九韶的著作中沒有以連分數的形式給寫成出,但其本質與連分數的方法完全相同.我們只不過是提供了一種更為現代化的敘述方式.
連分數還具有另一個性質:各個近似分數越來越趨近于原數.
連分數的這一性質,有非常大的作用.第一個作用,便是對某些數進行近似代替.
案例1:歷法設置
(1)農歷
本文只關心農歷中大小月的設置.首先要知道,農歷中每月的天數只有29天和30天兩種.這就會涉及大小月數量的安排,基本上都是按照計算來安排.
我們知道,朔望月29.5306天(一天以24小時為計,下同).那么我們安排大月的時間,就應該是10000個月當中,安排5306個大月.不過這個數字太大,對于短時間內如何安排,就要用到連分數了.利用化連分數的方法,將朔望月的小數部分0.5306化成連分數:

因此,在以上近似分數中,采取15個月中有8個月是30天,17個月中有9個月是30天等就比較合理.當然這并不是確定無疑的,隨著時間推移,還會根據計算做出相應的調整.畢竟這個0.5306也不是精確數值.
同樣的道理,一個回歸年是365.2422日.一個朔望月是29.5306天.我們在對“大小月的設置”中,已經將29.5306這個數字考慮了進去,因此完全可以認為我們每月的平均天數就是29.5306天,那么這樣一來,一年就應該有:365.2422/29.5306≈12.3683個月.而我們一年只有12個月,怎么辦?先將其小數部分0.3683化作連分數就是:

不再用我解釋,你就知道19年閏7個月是什么意思了,也就是每19年就得加7個月.這是中國傳統歷法的設置,直到祖沖之在《大明歷》中將其改為每391年置144閏月,這顯然比19年置7閏月更準確.之所以不等于我們上面的任何一個近似分數,只是因為當時對回歸年和朔望月的觀測數據與我們的數據有差距而已.
從上面的分析中我們可以發現,中國的農歷是充分考慮到“日和月”的影響的,使得每個月的天數盡量符合真正的月亮公轉周期,每年的月數也盡量符合地球的公轉周期.
因此,中國的農歷不應該叫“陰歷”,而應該叫“陰陽歷”.
反觀公歷,便不是如此.
(2)公歷
公歷有一個特點,那就是每個月的天數中,除了2月以外,要么30天,要么31天,隨便心算都能想到,如此設置下的每個月的天數,是絕不可能逼近于月亮的公轉周期29.5306的.因而我們可以斷定,公歷是沒有考慮到逼近月亮真實公轉周期這一層的.
其實在最初,公歷每個月要么只有30天,要么只有31天,2月之所以是28或29天,絕非月亮惹的禍,純粹就是人為喜好的改動.因而在普通情況下,公歷的一年就是365天.
但一個回歸年是365.2422天,這不可避免地會造成誤差,于是想到隔幾年就在某一年中加一天的方式來彌補誤差.我們將小數部分0.2422化為連分數:

比如我們在文章開頭的題目中所看到的閏年的設置方法,便是為了方便計算而設置的.因為按照此種算法,在10000年的時間里,能被4整除的年份有2500年,如果僅僅是考慮四年一閏,那么一萬年便會多出78天,這個誤差是很大的.因此人為在4年一閏的基礎上進行條件限制.
考慮到能被100整除的年份有100年,而能被400整除的年份有25年,那么在一萬年的時間里,能被100整除,但不能被400整除的年數就是75年,這和78比較接近.同時注意到,被4整除、被100整除、被400整除是層層包含的關系(如圖2所示):
因此,被4整除的年數-被100整除的年數+被400整除的年數=2425.其表示的區域便是陰影部分,其中外面的陰影部分就可以描述成:被4整除但不被100整除的年份;里面的陰影部分就是“能被400整除的年份”.

圖2
這就和真實數據2422天非常接近了,10000年才多三天,到時候再挪三天也問題不大的.
由此可知,公歷是只照顧到了地球回歸年,而沒有兼顧到月亮的公轉周期.所以,公歷也稱之為“陽歷”.
案例2:無理數的逼近
前面說過,無理數也有連分數,只不過其連分數的層數是無限多層.比如說圓周率π的連分數:
該連分數的得到在我們能理解的范圍內,沒有什么技巧,就是跟取有理數的連分數一樣,不斷地通過圓周率的近似小數值,取其整數部分而得到.
如何得到這個連分數不是我們的重點,我們關注的是其近似分數:


這種對無理數的近似替代,在現實生活甚至數學領域中,發揮了非常重要的作用.
下一期我們將會從“一類二次根式的連分數”出發,引出更美妙的問題,拭目以待吧!