浅谈Stern-brocot树和连分数

Stern-brocot树是一个二叉搜索树,每个节点的键值是一个有理数,以最简分数的形式记为mini。同时有一个上界分数aibi和一个下界分数cidi,表示这个点为根的子树所有键值都在(cidi,aibi)区间内,且满足mi=ai+ci,ni=bi+di。也就是说,每个节点的上界下界分数已经蕴含了键值。

这是一棵形态固定的树。生成方式如下:

根节点的下界分数为01,上界分数为10

节点i,其左儿子的下界分数是cidi,上界分数是mini

其右儿子下界分数是mini,上界分数是aibi

如此生成一颗无限大的二叉树。称一个节点的键值和其上下界分数为相邻分数。

接下来介绍一些性质。

  1. 任意两个相邻分数m1n1<m2n2,有m2n1m1n2=1

用归纳法即可直接证明。

  1. 用这种方式直接加出来得到的键值都是最简分数。

由性质1,可知gcd(m1,n1)=gcd(m2,n2)=1​,即键值是最简分数。

  1. 任意两个点键值不同

由构造方式,可知每个点键值严格介于上下界之间,那么每往下构造一层节点相当于往序列里的每个间隔插入一个数,不会相等。

  1. 任意正有理数都会出现在这棵树上。

设某个有理数pq,若其处在某两个相邻分数之间,即m1n1<pq<m2n2

两个不等式拆开可得qm1<pn1qm2>pn2,由于都是整数,可写为pn1qm11qm2pn21

p消元得到q(m2n1m1n2)n1+n2,由性质1化为qn1+n2

n1+n2>q时这个有理数不可能严格介于这两个相邻分数之间。也就是说,不停在树上往下二分,保持有理数在上下界之间,当某个节点的上下界分数的分母之和超过q时,这个有理数一定会在树上出现。

由前几个可看出,stern-brocot树上的节点集合和正有理数可以构成双射。

  1. 对于键值来说是二叉搜索树,对于分子或分母来说是小顶堆。

  2. 有理数pq在树上的深度,级别是O(max(p,q))

  3. 有理数pq在树上到根节点的路径转折点个数级别是O(logmax(p,q))

考虑一个转折点的情况,转折点的儿子将会是转折点和转折点的父节点作为上下界。由于性质5,分子分母相比于转折点的父亲都至少翻倍。则转折点个数只有log个。

接下来,怎么表示这棵树?一般来讲不会全部保存,需要用到的范围很大。但可以高效计算一些相关节点。

当前节点上界为ab,下界为cd

  1. 当前分数值为a+cb+d
  2. 父节点是bd当中更小的那一个分数
  3. 向左走k步的后代是kc+akd+b,向右走k步的后代是ka+ckb+d

通过这些快速计算就可以计算一个无理数在固定精度下的有理逼近。比如某个a,在sbt上往下二分,往左二分的步数,然后再二分往右走的步数,这样就可以找到分母不超过某个数以内的最佳有理逼近。时间复杂度O(log2M)

当然还有一些在具体题目里的应用我就不说了。接下来来介绍连分数。

某个有理数r,可被表示为如下形式,即连分数表示。

从定义可看出a00,1i<n,ai>0,an>1。根据定义可知序列中每个数其实就是这个有理数r=pq里的pq做辗转相除的时候的每一步的商。由算法可知,有理数的连分数序列长度级别为O(log(max(p,q)))

这其实也是一个不断逼近的过程,称这个序列前k个位置的连分数表示出来的有理数为rk=pkqk,称为渐进分数。

可以看出,每连续2个rk都是一个r​的上下界,且不断缩小范围。偶数下标的rk都小于r,且递增,奇数下标的rk都大于r且递减。这和stern-brocot树的逼近过程有类似之处。

既然这是一个逼近,那么对于无理数来说,也可以类似定义连分数,但是是一个无穷长的序列,是一个极限为此无理数的柯西列。

渐进分数满足如下等式。

pk=akpk1+pk2,qk=akqk1+qk2

证明:我们令{pk}{qk}序列按以上方式递推生成,k=0,1时由r0,r1生成,我们证明pkqk=rk

用归纳法证明。当k=0,1时由定义显然成立

假设当n<k时,任意序列都满足以上等式,当n=k时:

rk=[a0,a1,...,ak]=[a0,a1,...,ak1+1ak]=(ak1+1ak)pk2+pk3(ak1+1ak)qk2+qk3=pk1+pk2akqk1+qk2ak=pkqk

归纳假设成立。

特殊定义r1=10,r2=01,可将合法递推关系扩展至k=0的情况。

观察渐进分数的递推式,发现和stern-brocot树上往某侧走ak步表达式类似。有了这个递推式之后,可将有理数在stern-brocot树的位置用连分数进行对应。


由上面两个图可以发现初始在根节点,向右走a0步,再向左走a1步,依次往下走,最后一步走an1步,就是这个数的位置。这样,连分数序列长度和stern-brocot树上转折点个数相同(或者差1),前面说过他们都是log级别。

由图中可知,rk这个渐进分数是rk1的左(右)儿子的右(左)后代,所以他们是相邻分数。那么就有pkqk1pk1qk=(1)k1。对于一对数a,bab化简结果是pnqn,由pnqn1pn1qn=(1)n1aqn1bpn1=gcd(a,b)(1)n1。也就是说,qn1,pn1可作为ax+by=gcd(a,b)不定方程的结果。这是扩欧的另一个角度。

由于r[pk1qk1,pkqk](区间可能反过来),有|rpkqk|<|pk1qk1pkqk|=1qkqk1,对rR都成立。这可以说明无理数的有理逼近的一个精度。

应用什么的不是特别了解,oi里可能会有一些比较牵强的题,但是代数或者数论里面好像会有不少比较深刻的应用。其实我半年前就打算更这个,数算课pre我讲的,写了个简略的ppt,但是因为期末忘了。前段时间学shor算法(order finding部分)的时候突然又用到了这个才想起来。

NOI2024的d2t1不知道能不能用这个做,希望如果有人看到了这里可以教教我。

posted @   Lebron_Durant  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示