法雷数列浅谈

法雷数列的来源:

  约翰·法雷 是英国一位多才多艺的“ 杂家” , 生活在拿破仑时代, 职业是土地丈量员, 却有着广泛的爱好, 喜欢搜集奇异的石头、矿物, 兴致来潮, 撰写小块科普文章在《哲学杂志》上发表, 题材广泛涉及到地质、音乐、钱币、车轮、慧星, 偶尔也涉及数学小品。1816年, 当他审读亨利 戈德温所编的“ 小数商表” 时,忽然有一个问题涌上心头, 既约最简真分数有多少呢能不能把它们按一定的顺序排列出来兴致所及, 急切难忍, 他立即推开戈氏冗繁的“商表” , 动手排列起来, 一遍又一遍, 没有头绪。这时他想到两点:一是真分数有无限多个, 要“ 全部” 排出, 必须限制分母的大小二是可按递增的顺序去排列, 容易发现规律 他终于排出来了, 还发现了若干性质。发表后, 立即被当时数学家们抓住, 后来数学家柯西发现这分数串在数学中很有用,并名之为法雷数列。 没成想早在14年前, 一位名叫哈罗斯的人, 就发现并公布了自己的研究结故。名之哈罗斯一法雷数列。

法雷数列的定义:

  对任意给定的一个自然数n,将分母小于等于n的不可约的真分数按升序排列,并且在第一个分数之前加上0/1,在最后一个分数之后加上1/1,这个序列称为n级法雷数列,以Fn表示。如F6为:0/1,1/6,1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5,5/6,1/1。

推导法雷数列方法:

  以上面的F6为例。对一般的法雷数列中的两个分数a/b和c/d,可以得到它们中间的那个分数,即p/q = (a+c)/(b+d)(前提是得出的q值小于或者等于给定的n值)。所以由0/1和1/1得出1/2,由0/1和1/2得出1/3,由1/2和1/1得出2/3,依次类推……即可得出所有的法雷数列中的分数。

法雷数列的一些性质:

  性质1:n级法雷数列中相邻两个分数a/b和c/d的差为1/bd,并且所有的差中最小值为1/(n*(n-1));

  性质2:除了1级法雷数列外,所有的法雷数列都有奇数个元素,其中居于正中间的那个元素一定是1/2;

  性质3:当n趋于正无穷时,n级法雷数列包含的元素的个数趋于3/(π*π) * n2 ≈ 0.30396355 * n2。

用法雷数列逼近一个实数的方法:

  Step1: 置实数f 的下界为a/b=0/1, 上界为c/d =1/1。 

  Step2: 计算出下界和上界之间的数p/q = (a+c)/(b+d) 

  Step3: 若q>n(分母大于指定值),计算中止。 

  若p/q = f,a/b ßp/q , c/d ßp/q, 计算中止。 

  若p/q < f, 置下界a/b为p/q 

  若p/q > f, 置上界c/d为p/q 

  Step4, 重复step 2-3 

  当计算终止时,a/b为这个实数的下界,c/d为这个实数的上界。

给出一个实数,求出这个实数在n级法雷数列下的下界和上界,参考程序如下:

 1 #include<iostream>
 2  using namespace std;
 3  
 4  int a,b,c,d,p,q;
 5  int n;
 6  double f;
 7  void solve()
 8  {
 9    a = 0,b = 1,c = 1,d = 1,p = a + c,q = b + d;
10    while(q <= n)
11    {
12      if(f > (double)p/q)
13      {
14        a = p;
15        b = q;
16      }
17      else 
18      {
19        c = p;
20        d = q;
21      }
22      p = a + c;
23      q = b + d;
24    }
25  }
26  
27  int main()
28  {
29    while(cin>>n>>f)
30    {
31      solve();
32      cout<<a<<"/"<<b<<" << "<<f<<" << "<<c<<"/"<<d<<endl;
33    }
34    return 0;
35  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章