√に近い分数の作り方

627/362 という分数は、√3 と小数点以下4桁目まで一致する。
 627/362 = 1.7320441・・・
   √3 = 1.7320508・・・
590/223 という分数は、√7 と小数点以下4桁目まで一致する。
 590/223 = 2.6457399・・・
   √7 = 2.6457513・・・
どうやってこんな分数を見つけたのか?
実はこれ、私が見つけたわけではなくて、とある大学入試問題にあった方法なのです。

この問題を順番に解いてゆけば、最後には上のような分数が見つかります。
実は順番に解かなくても、最後の(4)さえ計算すれば、とりあえず答は得られます。
上の 590/223 という分数は、f(f(2)) を計算して求めました。
もっと根性があれば f(f(f(f(f(x))))) みたいにして、いくらでも精度の高い分数を作ることができます。
しかし、この入試問題を作った人は、どうやって最初の
f(x) = (8x+21)/(3x+8) という式を見つけたのでしょうか?
もしこれが √7 ではなくて、もっと別の数、例えば √3 で同じことをやってみろと言われたら、
√3 のための式 f(x) が作れますか?
以上は gbさんという方からコメントに頂いた質問です。
* いまひとつの連分数展開 >> [id:rikunora:20090830]
機械的に問題を処理しているだけでは決して出てこない、もっともな疑問だと思います。

この問題の核心部は、最後の(4) にある f(f(x)) という所に表れています。
ある関数 f(x) の結果を、再び f(x) に代入して f(f(x)) を計算し、
その結果をまた f(x) に代入して f(f(f(x)))) を計算し、・・・
・・・といった具合に、繰り返し f(f(f(f(f(x) を計算してゆくと、最後には何処にたどり着くのでしょうか?
その様子を描いたのが、下のグラフです。

グラフの上に、y=f(x) の曲線と、y=x という斜め45度の直線を描きます。
f(x) の結果を、再び f(x) に代入する、という操作は、
グラフの上では黄色い矢印のような動きになります。つまり、
・f(x)の値から横に線を引いて、斜め45度の直線にぶつかる点を探す。
・ぶつかった点から縦に線を引いて、f(x)にぶつかる点を探す。
といった操作になります。
この操作をどこまでも繰り返してゆけば、黄色い矢印の行き着く先は、
y=f(x) の曲線と、y=x の直線の交点に収束します。
ということは、あらかじめ交点が √7 となるように上手い具合に f(x) を調整しておけば、
繰り返し計算によって √7 の近似値が求められることになります。
これが、この問題に託された意図なのです。

グラフの形から分かるように、f(x) は 点(√7, √7) で、直線 y=x と交差していなければなりません。
また、実際の計算の手間を考えると、f(x) はなるべく単純な四則演算だけで済ませたい。
そこで、問題にあったような分数関数が考え出されたのでしょう。
このような分数関数で、点(√7, √7) を通るものは
  f(x) = (a x + 7 b) / (b x + a)  ・・・{a, b は適当な整数≠0}
といった形になります。
a, b に入れる整数は何でも構わないのですが、上のグラフで示した黄色い矢印が
できるだけシャープに√7に近づくような形にした方が、計算回数が少なくて済みます。
(できるだけ収束の早い関数を見つけたい、ということ。)
そのために思い当たるのは、
・lim[x->∞] f(x) = a / b が、√7 よりほんの少しだけ大きくなるようにしておく。
・√7 近傍での f(x) の値が、できるだけ変動しないような関数が望ましい。
こういった理由で、a = 8, b = 3 が選ばれたのだと思います。
8/3 = 2.6666・・・なので、√7 にかなり近い値となっています。
f(x) の変動の様子はどうなるか、f(x) のグラフを描いてみると、こうなっています。

√7 付近の様子を見ると、グラフがほとんど水平に近くなっています。
グラフの上に矢印を描いてみればわかるのですが、水平に近いほど収束は早くなります。
これが問題の (3) の意図なのです。
グラフの傾きを計算してみると、1回の計算で2桁の精度が出ることがわかります。
(つまり(2), (3) は微分して傾きを比較せよ、という出題意図なのでしょう。)

以上で、√N に近づく分数関数の作り方がわかるかと思います。
試しに √3 に近づく分数関数を作ってみましょう。
分数関数は
  f(x) = (a x + 3 b) / (b x + a)
という形で、a / b が √3 より少しだけ大きくなるような数を選べば良いわけです。
a = 9, b = 5 を選べば、a / b = 1.8 となるので上手くあてはまりそうです。
  f(x) = (9 x + 15) / (5 x + 9)
この関数を使って計算すると、
 f(1) = 12/7 = 1.7142857・・・
 f(f(1)) = 71/41 = 1.7317073・・・
 f(f(f(1))) = 627/362 = 1.7320441・・・
確かに、√3にかなり近い値が得られました。

Web上を探したら、ここに似たようなことが載っていた。
 * 私的数学塾 -- 無理数を近似する分数
 >> http://www004.upp.so-net.ne.jp/s_honma/fraction/fraction3.htm
もしかして有名問題なのか?

※ 6/16追記:このf(x)は、連分数展開から次のようにして作ることができます。コメント感謝!


※ 7/28追記:収束の速い分数近似式をどうやって作るのか?
271828さんより、ペル方程式に帰着する解法を教えていただきました。
* 271828の滑り台Log -- 無理数と連分数
>> http://blog.goo.ne.jp/slide_271828/e/922e814742bf5e0de42d1de8ad061202