法雷數列淺談

法雷數列的來源:

  約翰·法雷 是英國一位多才多藝的“ 雜家” , 生活在拿破崙時代, 職業是土地丈量員, 卻有着廣泛的愛好, 喜歡蒐集奇異的石頭、礦物, 興致來潮, 撰寫小塊科普文章在《哲學雜誌》上發表, 題材廣泛涉及到地質、音樂、錢幣、車輪、慧星, 偶爾也涉及數學小品。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  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章