Stern-Brocot树 及 法里级数分析
Stern-Brocot树
产生了所有分子分母互素的分数
从初始0/1 1/0 -> m/n m'/n'出发,不断往中间添加 (m+m')/(n+n')
容易推得 n * m' - m * n' = 1
证:
初始 0/1 1/0 那么1*1-0*0=1
那么假设前一次符合n * m' - m * n' = 1的性质
之后二叉树有两个方向行进,产生两种相邻 (m/n , (m+m')/(n+n')) ((m+m')/(n+n') , m'/n')
-> 左侧n*(m+m') - m*(n+n') = n*m'-m*n'=1
右侧(n+n')*m'-(m+m')*n' = n*m'-m*n = 1
所以总是不断的得到n * m' - m * n' = 1的性质
那么根据扩展欧几里得很容易得到 (n+n') , (m+m') 互质才有解,所以产生的数 (m+m')/(n+n') 必然是分子分母互素的
因为必然有整数解,很容易得知左右连接的两个数 n , n' 互质 , m m'互质 , n m 互质 , n' m'互质
同样因为(n+n')*m'-(m+m')*n' = 1
产生了所有分子分母互素的分数的证明:
m/n < (m+m')/(n+n') < m'/n' -> 这一点保证了Stern-Brocot树产生的分数是有序的
总是在两个合法分数之间产生一个合法分数,也就是说我们需要任何分数,只需要递归判断属于哪个区间,不断往树的那
一侧移动
而且每次往树底移动一步,必然会使分母变大至少1,所以求分母为n的合法分数,至多只需要往树上走n层即可
利用Stern-Brocot树思想 求解阶为n的法里级数
法里级数就是表示分母不大于n的所有分数
下面是简单的求出法里级数序列的代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define M 26
#define N 500000
#define ull unsigned long long
#define ll long long
const int MOD = ;
int n; void dfs(int l1 , int l2 , int r1 , int r2) //l1/l2 , r1/r2
{
if(l2+r2>n) return ;
//Stern-Brocot树 左侧总是最小的,右侧最大的,那么总是优先输入左侧,再输入中间的,最后输入右侧的数
dfs(l1 , l2 , l1+r1 , l2+r2);
cout<<l1+r1<<"/"<<l2+r2<<" ";
dfs(l1+r1 , l2+r2 , r1 , r2);
} int main() {
n = ;
cout<<"0/1 ";
dfs( , , , ); //会按从小到大的次序输出结果
cout<<"1/1"<<endl;
return ;
}
Farey series
Stern-Brocot树上节点的表示
我从单位一设为起始点
总是用一个长字符串表示从单位1 (1/1) 开始走的路径
L表示左走 , R表示右走,当前位置为S
那么用M(S) = (n n'
m m') 的矩阵进行描述
值F(S) = (m+m')/(n+n')
往右走M(SR) = M(S) * M(R) = M(S)*(1 1
0 1)
往左走M(SL) = M(S) * M(L) = M(S)*(1 0
1 1)
对于连续的都可以用矩阵快速幂求解
如M(SRRRR) = M(S)*M(R)^4
另外求F(RS) 时 可以发现规律是 F(RS) = F(S)+1, F(LS) = F(S)/(F(S)+1)
可以利用矩阵简单求证
Stern-Brocot树 及 法里级数分析的更多相关文章
- QtWebkit里RenderLayer树的绘制具体流程分析
更新:RenderLayer树的绘制对RenderObject的绘制.同一时候补足绘制阶段的描写叙述. QtWebkit里,QWebView,QWebPage和QWebFr ...
- 高级设计总监的设计方法论——5W1H需求分析法 KANO模型分析法
本期开始进入设计方法论的学习,大湿自己也是边学边分享,算是巩固一遍吧: 另外这些理论基本都是交叉结合来应用于工作中,我们学习理论但不要拘泥于理论的框架中,掌握后要灵活运用一点- 这些理论一部分来自于我 ...
- 宋牧春: Linux设备树文件结构与解析深度分析(2) 【转】
转自:https://mp.weixin.qq.com/s/WPZSElF3OQPMGqdoldm07A 作者简介 宋牧春,linux内核爱好者,喜欢阅读各种开源代码(uboot.linux.ucos ...
- 编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解
语法分析(自顶向下/自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析法, ...
- UVALive - 8292 (法里数列)
参考博客:zro https://blog.csdn.net/alusang/article/details/81840944 orz 给你一个分母 m 和一个浮点数 x,让你求出一个分母不超过 m ...
- 比特币区块结构Merkle树及简单支付验证分析
在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通 ...
- Java7里try-with-resources分析
这个所谓的try-with-resources,是个语法糖.实际上就是自动调用资源的close()函数.和Python里的with语句差不多. 例如: [java] view plain copy ...
- 高德地图API(流程法)整理分析
[高德地图API(流程法)分析]: 前言:公司现在的网约车项目,使用的是高德地图,因为地图导航这一块的功能占比量比较大,为了方便大家对高德地图API的了解和学习使用,使用流程图把高德API分析整理了下 ...
- 宋牧春: Linux设备树文件结构与解析深度分析(1) 【转】
转自:https://mp.weixin.qq.com/s/OX-aXd5MYlE_YoZ3p32qWA 作者简介 宋牧春,linux内核爱好者,喜欢阅读各种开源代码(uboot.linux.ucos ...
随机推荐
- Poco C++——HTTP的post请求和get请求
两种请求都需要包含头文件: #include <iostream> #include <string> #include "Poco/Net/HTTPClientSe ...
- Android软键盘弹出时把布局顶上去的解决方法
原文: 解决Andriod软键盘出现把原来的布局给顶上去的方法(转) 链接:http://blog.sina.com.cn/s/blog_9564cb6e0101g2eb.html 决方法,在main ...
- 转:Jeff Atwood倾情推荐——程序员必读之书
Jeff Atwood倾情推荐——程序员必读之书 英文版:<Code Complete 2>中文版:<代码大全(第二版)>作者:Steve McConnell译者:金戈 汤凌 ...
- 微信jssdk
http://203.195.235.76/jssdk/?from=timeline&isappinstalled=0
- django在pyhton2.7 和 python3.* 之间代码和睦相处的方法
“祥”龙第一掌: from __future__ import unicode_literals from django.utils.encoding import python_2_unicode_ ...
- phalcon: plugin 结合Manager事件管理、dispatcher调度控制器 监听sql日志记录或其他拦截出来
可能用到的类 phalcon\mvc\use\plugin Phalcon\Mvc\Dispatcher as MvcDispatcher Phalcon\Events\Manager as Even ...
- EXEL表格读取 按键精灵
EXEL表格读取(1,m)(2,m)表格信息,m为行数 以下为本帖隐藏内容 ============================== Call Plugin.Office.OpenXls(&quo ...
- Element can be click when out of view
WebDriver can't action the element when out of view Webdriver can't action the element when the elem ...
- 和为S的两个数VS和为S的连续正数序列
其实这个题目如果没有限制时间复杂度的话,那么就很简单了,一遍一遍地扫描吧.时间复杂度肯定就是 O(n2)啰.但是这题目肯定不会这么简单,否则就是小学生的水平了嘛. 其实我刚到这题的时候想到的是用二叉查 ...
- 苹果审核Metadata Rejected
最近提交了 公司的一个 app,收到了appStore拒绝的信息及邮件 拒绝后的状态改为了:metadata rejected 邮件里面有这样一句话 意思大致就是: 你的app先被显示为 Metada ...