APP下载

从大衍求一术到连分数
——从一道算法题说开去

2019-12-24

新世纪智能(数学备考) 2019年11期
关键词:公历分数线年份

韦 磊

题目:图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:无理数的逼近

前面说过,无理数也有连分数,只不过其连分数的层数是无限多层.比如说圆周率π的连分数:

该连分数的得到在我们能理解的范围内,没有什么技巧,就是跟取有理数的连分数一样,不断地通过圆周率的近似小数值,取其整数部分而得到.

如何得到这个连分数不是我们的重点,我们关注的是其近似分数:

这种对无理数的近似替代,在现实生活甚至数学领域中,发挥了非常重要的作用.

下一期我们将会从“一类二次根式的连分数”出发,引出更美妙的问题,拭目以待吧!

猜你喜欢

公历分数线年份
特殊的一年
我省近两年普通高校专升本选拔考试第二批招生院校录取最低控制分数线对比
2017年-2018年专升本院校录取分数线
寒露
学数学要『咬文嚼字』
新月历
什么是闰年?
一样的年份
更正