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 ...
随机推荐
- Maven——Maven核心概念
原文:http://www.cnblogs.com/xdp-gacl/p/4051819.html 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1. ...
- eclipse如何调试(Debug)程序(zhuan)
http://jingyan.baidu.com/article/e6c8503c7e46b6e54f1a18c5.html ************************************* ...
- phalcon: 资源文件管 理 引入css,js
<?php class IndexController extends Phalcon\Mvc\Controller { public function index() { //添加本地css资 ...
- Linux下数据库的安装和使用
数据库有多重要就不用说了,每一个计算机相关行业的人都必须要学会基本的数据库操作,因为你总会用到的. 之前转过一些学习资源: 与MySQL的零距离接触 - 慕课网 Python操作MySQL数据库 生物 ...
- ARPG客户端中场景对象体系设计
一.场景对象体系 二.场景对象生命周期管理 场景对象的生命周期,不适合采用原始的c++管理方式, 即由使用者自己负责删除.而应该采用引用计数方式, 自动负责删除. 采用引用计数方式, 目前用法比较广的 ...
- 资源 之 4.4 Resource通配符路径(拾贰)
4.4.1 使用路径通配符加载Resource 前面介绍的资源路径都是非常简单的一个路径匹配一个资源,Spring还提供了一种更强大的Ant模式通配符匹配,从能一个路径匹配一批资源. Ant路径通配 ...
- DI 之 3.4 Bean的作用域(捌)
3.4 Bean的作用域 什么是作用域呢?即"scope",在面向对象程序设计中一般指对象或变量之间的可见范围.而在Spring容器中是指其创建的Bean对象相对于其他Bean对 ...
- 怎么实现form表单提交后不重新刷新当前页面
怎么实现表单提交后不重新刷新当前页面 如何实现表单提交后不重新刷新当前页面 <form name='form1' id='form1' action='/xbcw/cw/xx_xx.ac ...
- java集合——Collection接口
Collection是Set,List接口的父类接口,用于存储集合类型的数据. 2.方法 int size():返回集合的长度 void clear():清除集合里的所有元素,将集合长度变为0 Ite ...
- 为 Node.js 开发者准备的 8 本免费在线电子书(转)
ode.js 是一套用来编写高性能网络服务器的JavaScript工具包,一系列的变化由此开始.比较独特的是,Node.js会假设你是在POSIX环境下运行它 Linux 或 Mac OS X.如果你 ...