へんな数式美術館2009-07-18 01:43

副題 世界を表すミョーな数式の数々
著者 竹内薫
発行 技術評論社 2008-08-05 1版1刷
価格 1,580+税
ISBN978-4-7741-3556-4

なんか最近、竹内薫さんの解説本を読む機会が多い気がする。
ちなみこの本、自分にとっては 30年前の高校の頃を思い出させてくれたという意味でヒットです。

自分の高校の頃といえば、なぜか「同じ演算の繰り返し」に興味がありました。P.124 「黄金比」は Ruby を使えば以下のようになります。

まず、繰り返し関数 rp を定義します。fn は目的の演算、x は初期値、n は繰り返し回数です。"include Math" はあとで定数を使うため。

include Math
def rp(fn, x, n)
 if n <= 0
  return x
 else
  return fn.call(x, rp(fn, x, n - 1))
 end
end

fun = "lambda{|a, b| a + ( 1 / b)}"
x = 1.0
n = 15
printf("rp(%s, %f, %d) = %f\n", fun, x, n, rp(eval(fun), x, n))
結果
rp(lambda{|a, b| a + ( 1 / b)}, 1.000000, 15) = 1.618034

P.154「無限の不思議」は前出の rp を使って以下のようになります。

fun = "lambda{|a, b| a ** b}"
x = 2 ** 0.5 # ルート 2
n = 38
printf("rp(%s, %f, %d) = %f\n", fun, x, n, rp(eval(fun), x, n))
結果
rp(lambda{|a, b| a ** b}, 1.414214, 38) = 2.000000

ここで 「ルート 2 の x 乗 = x」とすれば、x = 2 または x = 4 となる。しかし、x = 4 は捨てられる。本にはその理由が書かれていないけれど、なぜかと言えば収束するのが べき乗される側が e の e 乗根までだからである。
その e の e 乗根までなら収束する証明を高校のころしたような気がするけれど詳細が思い出せない。進路指導に忙しい担任の数学教師に「役に立たない」呼ばわりされたような気もするけど、習いたての部分積分かなんかを使った気がする。

とりあえず、e の e乗根が繰り返し乗演算されて e に近づいていく様子は下のようになる。

fun = "lambda{|a, b| a ** b}"
x = E ** (1 / E) # e の e 乗根
n = 100000
printf(" e = %f\n", E)
printf("rp(%s, %f, %d) = %f\n", fun, x, n, rp(eval(fun), x, n))
結果
                        e = 2.718282
rp(lambda{|a, b| a ** b}, 1.444668, 1000) = 2.718227

ブログでは全角スペースとかが入っていて Ruby をコピペで動かすには工夫がいるかも。そのため以下にもソースは置いときます。
http://www.taifu.jp/svn/mole/trunk/math/rp.rb




# "molt" ←ぜんぜん更新してない