连分数

连分数学习笔记

记号约定

连分数可以将实数通过有理数列的极限刻画,同时给出最佳逼近,它本身只是一个形式记号。

通常用记号 描述一个连分数,它就等于

在数论中,我们通常只考虑项都是整数的情况,更具体地,我们规定 而对于 均有 ,此时连分数叫做简单连分数,简称连分数。

下文中,我们默认连分数指“简单连分数”。

当然,当我们要刻画的不是有理数时,连分数必然会有无穷项,自然地,无穷项的连分数表示的是项数趋于无穷时,连分数的极限,即

连分数有意义当且仅当对应的极限有意义,可以证明,简单连分数必然有意义。

称作 的第 个渐进分数, 称为第 个余项。

有理数的连分数表示

有理数的连分数表示不唯一(有两种表示),区别在于是否强制规定最后一项为 ,例如

也即

其中末项为 的称为标准表示,否则为非标准表示。

求有理数的连分数表示

在求 的连分数表示时,我们尝试依次确定 ,显然 ,因此 是必须的,于是剩余部分 就应该是 的连分数表示,递归下去,直到 是整数。

更形式化地,设第 个余项 ,那么 ,这是辗转相除的形式,直到 ,时间复杂度

1
2
3
4
5
6
def f(p, q): # 返回 p/q 的连分数的序列表示
ans = []
while q:
ans.append(p // q)
p, q = q, p % q
return ans

求连分数的值

有了有理数到连分数的转换方式之后,我们还可能需要将连分数的值求出来。对于有理数,我们当然可以从末项开始倒推,但这种方法存在一个缺陷:当连分数对应值是无理数时,我们每多添一项,就要重新算整个连分数的值,于是我们转而寻求一个顺序递推求值的算法。

对于连分数 ,设其第 个渐进分数为 ,那么有递推公式

递推起点为两个形式分数

1
2
3
4
5
6
7
def f(r): # 返回连分数序列 r 对应的既约渐进分数序列
p = [0, 1]
q = [1, 0]
for a in r:
p.append(a * p[-1] + p[-2])
q.append(a * q[-1] + q[-2])
return p, q

参考资料

OI-Wiki

Matrix67的博客