浅谈Stern-brocot树和连分数
Stern-brocot树是一个二叉搜索树,每个节点的键值是一个有理数,以最简分数的形式记为。同时有一个上界分数和一个下界分数,表示这个点为根的子树所有键值都在区间内,且满足。也就是说,每个节点的上界下界分数已经蕴含了键值。
这是一棵形态固定的树。生成方式如下:
根节点的下界分数为,上界分数为
节点,其左儿子的下界分数是,上界分数是。
其右儿子下界分数是,上界分数是。
如此生成一颗无限大的二叉树。称一个节点的键值和其上下界分数为相邻分数。
接下来介绍一些性质。
- 任意两个相邻分数,有
用归纳法即可直接证明。
- 用这种方式直接加出来得到的键值都是最简分数。
由性质1,可知,即键值是最简分数。
- 任意两个点键值不同
由构造方式,可知每个点键值严格介于上下界之间,那么每往下构造一层节点相当于往序列里的每个间隔插入一个数,不会相等。
- 任意正有理数都会出现在这棵树上。
设某个有理数,若其处在某两个相邻分数之间,即
两个不等式拆开可得,,由于都是整数,可写为,
把消元得到,由性质1化为。
当时这个有理数不可能严格介于这两个相邻分数之间。也就是说,不停在树上往下二分,保持有理数在上下界之间,当某个节点的上下界分数的分母之和超过时,这个有理数一定会在树上出现。
由前几个可看出,stern-brocot树上的节点集合和正有理数可以构成双射。
-
对于键值来说是二叉搜索树,对于分子或分母来说是小顶堆。
-
有理数在树上的深度,级别是。
-
有理数在树上到根节点的路径转折点个数级别是。
考虑一个转折点的情况,转折点的儿子将会是转折点和转折点的父节点作为上下界。由于性质5,分子分母相比于转折点的父亲都至少翻倍。则转折点个数只有个。
接下来,怎么表示这棵树?一般来讲不会全部保存,需要用到的范围很大。但可以高效计算一些相关节点。
当前节点上界为,下界为。
- 当前分数值为
- 父节点是和当中更小的那一个分数
- 向左走步的后代是,向右走步的后代是
通过这些快速计算就可以计算一个无理数在固定精度下的有理逼近。比如某个,在sbt上往下二分,往左二分的步数,然后再二分往右走的步数,这样就可以找到分母不超过某个数以内的最佳有理逼近。时间复杂度。
当然还有一些在具体题目里的应用我就不说了。接下来来介绍连分数。
某个有理数,可被表示为如下形式,即连分数表示。
从定义可看出。根据定义可知序列中每个数其实就是这个有理数里的和做辗转相除的时候的每一步的商。由算法可知,有理数的连分数序列长度级别为。
这其实也是一个不断逼近的过程,称这个序列前个位置的连分数表示出来的有理数为,称为渐进分数。
可以看出,每连续2个都是一个的上下界,且不断缩小范围。偶数下标的都小于,且递增,奇数下标的都大于且递减。这和stern-brocot树的逼近过程有类似之处。
既然这是一个逼近,那么对于无理数来说,也可以类似定义连分数,但是是一个无穷长的序列,是一个极限为此无理数的柯西列。
渐进分数满足如下等式。
证明:我们令和序列按以上方式递推生成,时由生成,我们证明
用归纳法证明。当时由定义显然成立
假设当时,任意序列都满足以上等式,当时:
归纳假设成立。
特殊定义,可将合法递推关系扩展至的情况。
观察渐进分数的递推式,发现和stern-brocot树上往某侧走步表达式类似。有了这个递推式之后,可将有理数在stern-brocot树的位置用连分数进行对应。
由上面两个图可以发现初始在根节点,向右走步,再向左走步,依次往下走,最后一步走步,就是这个数的位置。这样,连分数序列长度和stern-brocot树上转折点个数相同(或者差),前面说过他们都是级别。
由图中可知,这个渐进分数是的左(右)儿子的右(左)后代,所以他们是相邻分数。那么就有。对于一对数,化简结果是,由,。也就是说,可作为不定方程的结果。这是扩欧的另一个角度。
由于(区间可能反过来),有,对都成立。这可以说明无理数的有理逼近的一个精度。
应用什么的不是特别了解,oi里可能会有一些比较牵强的题,但是代数或者数论里面好像会有不少比较深刻的应用。其实我半年前就打算更这个,数算课pre我讲的,写了个简略的ppt,但是因为期末忘了。前段时间学shor算法(order finding部分)的时候突然又用到了这个才想起来。
NOI2024的d2t1不知道能不能用这个做,希望如果有人看到了这里可以教教我。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示