無理数に見えるのに整数になる?
このページは[url=https://www.geogebra.org/m/ddm5798j]マス旅[/url]の一部です。[br][br]ラマヌジャンというと、無限に続く式というイメージがありますね。[br][br]一見、無理数に見えるけれど、計算すると整数になる式。[br]そんな式からはじめてみよう。
1.数式とウォーミングアップ
[br][b][size=150]sqrt(1+2 sqrt(1+ 3 sqrt(1+ 4 sqrt( 1+ 5 sqrt(1+ ...... =?[br][/size][/b]geogebraのTexでかくと、[br] [math]\sqrt{1+2\sqrt{1+3\sqrt{1+4\sqrt{1+5\sqrt{1+...}}}}}=[/math][b][color=#0000ff][size=150]?[/size][/color][/b][br][br]無理数の計算をすれば無理数になるんじゃないか?[br]と思いがちですが整数になります。[br][br]では、ウォーミングアップから入りましょう。[br][br][size=150][b]<[/b][b]平方根の連分数展開>[/b][/size][br]入れ子の分数の極限が無理数になるというのは知ってますよね。[br][size=200][color=#0000ff]1+1/(2+1/(2+1/(2+1/......)))=√2[br][/color][size=100]geogebraのTexでかくと、[br][/size][/size][br] [math]1+\frac{1}{2+\frac{1}{2+\frac{1}{2+....}}}=[/math] √2[br][br]√2となる結果をわからないとしてxとおきましょう。[br]すると、x=1+1/□ [br]という形に見えますよね。[br]その分母□のところをじっと見よう。[br]□=2+1/△になりますね。[br]ここで、□と△を見比べてみよう。無限があることから□と△が同じになってしまう。[br]ということは、[br]最初の式の分母□=2+1/□=1+(1+1/□)=1+x。[br]つまり、最初の式全体は[br]x=1+1/(1+x)[br]となるね。[br]x-1=1/(1+x)[br](x-1)(x+1)=1[br]x^2=2[br]x=√2(正だから)[br][br][b][size=150]<分数が√にかわると。。。>[br][/size][/b][br]視界をずらす練習ができたところで、次にいこう。[br][br] [math]\sqrt{2+\sqrt{2+\sqrt{2+\sqrt{2+\sqrt{2+...}}}}}=[/math][b][color=#0000ff][size=150]?[/size][/color][/b][br][br]これも同じ作戦でいこう。[br]式の結果をxとすると、[br]x=√(2+□)と見える。[br]今度は□を見ると、□は無限性からxに見えるね。[br]x=√(2+x)となるから、[br]x^2=2+x[br]x^2-x-2=(x-2)(x+1)=0[br]x=2(正だから)[br]
2.数式の値を求めよう
さあいよいよ、[br][size=150]sqrt(1+2 sqrt(1+ 3 sqrt(1+ 4 sqrt( 1+ 5 sqrt(1+ ...... =?[/size]だ、[br]これまでの数式では一定数だったのが、sqrtの前が1,2,3,4,5と変化しているので、[br]とおいて、漸化式のようなものが作れたらいいですね。[br]そこで、計算結果をxとおくのではなく、[br]平方根にかける数列をx,x+1,x+2,...とするときのxの関数値になるとしてf(x)とおくのです。[br]たまたま、最初の問題ではx=2にしていただけだということにするのですね。[br]もし、だから、計算結果はf(2)になるでしょう。[br][br]さて、[br][b]f(x)=sqrt(1+x sqrt(1+ (x+1) sqrt(1+ (x+2) sqrt( 1+ (x+3) sqrt(1+ ...... [br][/b]すると、[br][b][f(x)^2-1]/x=sqrt(1+ (x+1) sqrt(1+ (x+2) sqrt( 1+ (x+3) sqrt(1+ ......[br][/b]となるね。[br][br]右辺はf(x)のxが1つ進んだだけなので、[b]f(x+1)[/b]だ。[br][b]f(x)^2=1+ xf(x+1)[br][/b][br]一見ややこしそうにみえるが、f(x)が1次式だとすると、左辺も右辺も2次式になる。[br]そして、左辺がf(x)の2乗の典型の定数項が、右辺で1になることから、f(x)=x+1が予想できるね。[br]まさに、[b](x+1)^2=1+x(x+1+1) [/b]が成り立つ。[br]もう解けたと同じです。[br][br]計算結果は[b]f(2)=2+1=3[/b]。[br][br][b][size=150]<f(2)の収束の速さ>[br][br][/size][/b]このf(2)の値をもし、推定するとしたら、どのくらいで3に近くなるでしょうか。[br][b][color=#0000ff][size=150]a1=√(1+2*0)=1[br]a2=√(1+2√(1+3*0)=√3=1.73205...[br]a3=√(1+2√(1+3√(1+4*0)))=√5=2.23606...[br]a4=√(1+2√(1+3√(1+4√(1+5*0)))=....=2.559...[br][/size][/color][/b][br]結構、スピードが速そうですね。[br]akは、根号がk個あり、最後の根号の中は1+0になりますね。[br]根号の最後(内側)から前(外側)に向かってする1回の操作を関数にしましょう。[br]直前の値をprevとすると、次の結果は[br]ret=sqrt(1+k*prev)になります。この関数をnext(k,prev)としましょう。[br]たとえば、k倍はk=4の場合2,3,4では足りないので2,3,4,5と4回まわす形にしたいですね。[br]そこで、a4を出すには最初のprev=0にして、k=5,4,3,2とカウントダウンしながらnext(k,prev)を[br]まわせばよいですね。[br]そこで、[br]ループの変数をi として、range(n)とすると[br] result = next(n+1-i, result)にすると、[br] n=4のときは、iは0から3まで動き、n+1-iは4+1-0=5から4+1-3=2まで変化します。[br]これで、a4=√(1+2√(1+3√(1+4√(1+5*0)))と同じ計算ができることが、脳内デバッグできるでしょう。[br][br]実際まわしてみると、n=10でほぼ3になるという猛スピードで収束することがわかるね。
[b][u][color=#9900ff][size=150]課題:どのくらいで3になるかをPythonで視覚化しよう。[/size][/color][/u][/b][br][br]from math import sqrt[br]import matplotlib.pyplot as plt[br]def next(k,prev):[br] ret =sqrt(1 + k * prev)[br] if ret<0:[br] ret=0[br] return ret[br][br]def nested(n):[br] result = 0[br] for i in range(n):[br] result = next(n+1-i, result)[br] return result[br]# ==========================================[br]max_depth = 15[br]# ==========================================[br]# 視覚化してみる:深さnに対する値の収束プロット[br]depths = range(1, max_depth + 1)[br]values = [nested(d) for d in depths][br][br]plt.figure(figsize=(10, 6))[br]plt.plot(depths, values, marker='o', linestyle='-', color='#674ea7', markerfacecolor='#e06666')[br]plt.axhline(y=3, color='black', linestyle='--', label='convergence: 3')[br]plt.xlabel('depth(n)')[br]plt.ylabel('value')[br]plt.title('where to (√1+2√1+3√...)')[br]plt.legend()[br]plt.grid(True)[br]plt.show()[br][br][OUT]
入れ子の根号式の収束
[b][size=150]<振り返り>[/size][/b][br][br]ラマヌジャンの発想を想像してみよう。[br]以下は、zenの勝手な想像であることを承知して読んでください。[br][br]ラマヌジャンにとっての数式は全体としてある1つの生き物であり、[br]登場する数はその生き物の状態を変えられるパラメータだ。[br]しかもそれが、ちまちま変えるのでなく、[br]一斉にブロードキャストできるものだ。[br][br]つまり、こんなイメージ[br][size=150]f(2, 3,4,5,.....)=sqrt(1+2 sqrt(1+ 3 sqrt(1+ 4 sqrt( 1+ 5 sqrt(1+ ......=??? [/size][br][size=150]f(1, 2,3,4,.....)=sqrt(1+1 sqrt(1+ 2 sqrt(1+ 3 sqrt( 1+ 4 sqrt(1+ ......=?? [br][size=150][color=#0000ff]f(0, 1,2,3,.....)=sqrt(1+0 sqrt(1+ 1 sqrt(1+ 2 sqrt( 1+ 3 sqrt(1+ ......=[b]sqrt(1+0 )=1[/b][/color][/size][/size][color=#0000ff][br][size=150]f(-1, 0,1,2,.....)=sqrt(1-1 sqrt(1+ 0 sqrt(1+ 1 sqrt( 1+ 2 sqrt(1+ ......=[b]sqrt(1-1 sqrt(1+0))=0[/b] [/size][br][/color][br]そこで、sqrtの前の数を一斉に変化させるために[br][b][color=#0000ff]f(2,3,4,5,.....)をf(2)とすると、[br]f(0)=1, f(-1)=0だから、f(x)=x+1が予測できる。[br][br][/color][/b]ラマヌジャン自身は証明しなくても自明だったのではないでしょうか。[br]証明をしない数学者は、[br]「[b]証明するまでもなく自明な筋道[/b]」を見つけているということだと思います。[br][br][b][size=150][u][color=#9900ff]課題:geogebraでnextを回す感じで3に近づくことを確かめよう。[br][/color][/u][/size][/b][br]タイトルは「ラマヌジャンの入れ子の根号計算」[br][b][color=#0000ff]g(k,x)=sqrt(1+ k x)[br]a10=g(2,g(3,g(4,g(5,g(6,g(7,g(8,g(9,g(10,g(11,0))))))))))[br]#2.98992[br][/color][/b][br]a11=g(2,g(3,g(4,g(5,g(6,g(7,g(8,g(9,g(10,g(11,g(12,0)))))))))))[br]#2.9948[br]a12=g(2,g(3,g(4,g(5,g(6,g(7,g(8,g(9,g(10,g(11,g(12,g(13,0))))))))))))[br]#2.99733[br][br] IterationListを使わなくても、関数を入れ子にするだけで、済みますね。[br]1回の処理を1つの関数としておくことで、[br]関数の入れ子の式をそのまま再現していることもわかるし、[br]あっけなく計算できてしまうね。[br][br]ということは、Pythonでも同様な関数の入れ子ができるはずだね。[br]# 1回分のルートの皮を被せる関数[br]def g(k, x):[br] return sqrt(1 + k * x)[br][br]# 数式をそのままコードに翻訳する[br][b]a10 = g(2, g(3, g(4, g(5, g(6, g(7, g(8, g(9, g(10, g(11, 0))))))))))[br][/b]print(a10) # 2.98992...
ラマヌジャンの入れ子の根号計算
圏論には「ファンクター」から入ろう
このページは[url=https://www.geogebra.org/m/ddm5798j]マス旅[/url]の一部です。[br][br][b][size=150][color=#0000ff]「圏」は「集合」と「ベクトル」と「群」をゆる~くアレンジしてできた、[br]何かのつながりを俯瞰するときに使える数学のアイディアです。[br][/color][/size][/b][br]知らないものを学ぶという感覚ではなく、[br]ぼんやり気づいていることの明確化だ、と思って付き合いましょう。[br][br]さて、「圏」は「集合」と「ベクトル」と「群」をゆる~くアレンジしてできたものとかきましたが、[br]ざっくり、「圏」(カテゴリー)というカタマリの共通ルールを確認しましょう。[br][br]そして、1つめキーワードである「ファンクター(関手)」に親しもう。
6の約数圏
1.圏の具体と抽象
圏の具体と抽象[br][br][size=150][b]<圏とは何か>[br][/b][/size][br][color=#0000ff][b][size=150]「圏」とは、対象と「射」という矢印を持っていて、1という矢印があり、[br]矢印の結合ができて、結合法則が成り立つ、そういうカタマリです。[br]たったこれだけのルールです。[br][/size][/b][/color][br]対象があるところが「集合」と同じだけど、その中身は特に指定されてない。対象は数どころか、同種のものがあつまってれば何でもOK。[br]矢印があるのが「ベクトル」と同じだけれど、始点と終点はあっても位置はない、長さは自由。[br]1と結合法則については「群」と同じだけれど、逆は特になくてOK。[br][br]ここまで読んで、どう思いますか。[br][br]矢印中心で対象はあいまいです。これでいいのか?[br]と思いますよね。あえて、矢印中心にしたのです。[br]これが「圏」の物重視ではな関係重視の思想です。[u][b]internalよりも[/b][/u][u][b]external重視[/b][/u]です。[br][br]矢印の位置も長さがどうでもよくて、つなげ方が大事です。[br]これが、同型なら同じとみなすという位相的な発想が基本にあります。[br]「射」中心の圏論では、対象を[b][u]同型を除いて(up to isomorphism)[/u][/b]区別するのが自然なのです。[br][br][br][b][size=150]<圏の具体>[/size][/b][br]人間の認知構造として、モデルがないと、わかった気にならないものです。[br]そこで、圏の具体を並べます。[br][br]ヒットするものがあるとうれしいです。[br][br][color=#0000ff][b][size=200]圏の名前={対象、射、結合、1}[br][/size][/b][/color]の順に並べてみますね。[br][br][br]整数の整除圏={整数たち、整除、整除の連続、自身を割る}[br]半順序圏={半順序集合の要素、半順序 、半順序の合成、自身との半順序」[b][br]6の約数圏={[1,2,3,6]、xはyの約数、約数の約数、1}[/b][br]先祖圏={[私、母、祖母]、xはy以上の先祖、先祖の先祖、自身}[br][br]Grps(群圏)={群たち、群準同型、群準同型の合成,恒等写像}[br]Sets(集合圏)={集合たち、写像、写像の合成、恒等写像}[br]Tops(位相空間圏)={位相空間たち、連続写像、写像の合成、恒等写像}[br]空圏={空、空、空、空}[br]1圏={1、1→1、1、1}[br][br]グラフ圏={ノード、矢、矢をつなぐ、自己ノードをさすループ}[br]データ型圏={データ型たち(数値、文字列、リスト)、型変換、変換の連続、無変換}[br]すごろく圏={すごろくの位置(振り出し、とちゅう、ゴール)、進む、進むを続ける、休み}[br][br]まだまだありそうですね。[br][br]半群の圏、環の圏、体の圏、.......[br]集合で対象を1つの集合の要素たちにして、射を部分集合にした「部分集合の圏」もできるでしょう。[br]集合たちでも2つの集合の共通部分を射にすると、「共通部分の圏」もできるでしょう。[br]いろいろできそうですね。[br][br]「圏」のアイディアが「[b]普遍性[/b]」のあるものだということが感じられるでしょう。[br][br]さて、次はいよいよ、[br][br][b][size=150][size=200][color=#0000ff]圏と圏をつなぐ矢印であるファンクター(関手)[br][/color][/size][/size][br][/b]を見てみよう。
2.ファンクターはこわさず持ち上げる
[b][size=150]<ファンクターはこわさず持ち上げる>[/size][/b][br][br]functorはfunctionと最初の4文字が同じです。[br]働きは似てますが、厳密には違うからこそ違う名前がついています。[br]見慣れないコトバだと思っている人には朗報です。[br][br][color=#0000ff][b][size=150]「ファンクターはセットメニュー化」[br][/size][/b][/color][br]というブンゲン先生の「はじめての圏論」でのたとえが超わかりやすいです。[br][br]H=ハンバーグ圏[br]={[ハンバーグ、チーズハンバーグ、和風ハンバーグ、…]、[br][和風にする、チーズをのせる、...]、[br]射を組み合わせる、素のまま}[br][br]fmap(H)=ハンバーグライスセット圏[br]={[ハンバーグライスセット、チーズハンバーグライスセット、和風ハンバーグライスセット、…]、[和風にする、チーズをのせる、...]、射を組み合わせる、素のまま}[br][br]ここで、Hの2つの対象a=ハンバーグ、 b=チーズハンバーグと、射cheeze:a→b(チーズをのせる)を[br]とりあげましょう。[br]f(a),f(b)の関係はcheezeなので、fmap(cheeze):f(a)→f(a)ですよね。[br][br]HaskellのFunctorの型クラスの定義は次のようになってます。[br][br][b][size=200][color=#0000ff]class Functor f where[br] fmap f :: (a->b) -> fa -> fb[br][/color][/size][/b][br](Haskellは関数の引数にかっこをつけないの上にかいたことと同じです。)[br][b]射をまるごと始点と終点もいっしょに移します[/b]が、始点、終点はライスセットのfが効いてますが、[br]射のチーズをのせるのはそのまま保存されてますね。[br][br]Functorの型には、[b]Maybe[/b]というインスタンスもあります。[br]Maybeはたぶんコケるかもというデータ型です。[br]こけても安全にデータとして渡されます。[br]「fmap」はmapだけどファンクターのマッピングですよという、[br]一般のmapと区別するためのワードですので深入りしないでいいです。[br]「where」はHaskellの条件句の開始部分で左カッコ程度の意味ですね。[br][br]instance Functor Maybe where[br] fmap f (Just x) = just (f x)[br] fmap f Nothing = Nothing[br][br]似たものに[b]Either[/b]というインスタンスもあります。[br]instance Functor (Either a) where[br] fmap f (Right x) = Right (f x)[br] fmap f (Left x) = Left x[br][br]Haskellは型が厳密な言語なので、ファンクター型が種類わけされています。[br]Pythonとは現状真逆で型にうるさくないなのでFunctorはもっとゆるく使えましたね。[br][br]たとえば、[b]PythonのFunctorのMaybe[/b]の使い方は、[br]from pymonad.maybe import Just, Nothing[br]def extract_addressM(X):[br] return Just(X["A"]) if "A" in X else Nothing[br]というように、[br]辞書型のデータのaddress項目を調べて、欠損してないとJustでくるみ、欠損してるとNothing[br]を返す。JustもNothingも予定された値だから欠損値でもエラーがおきずに動かせます。[br][br]Nothingじゃあさみしいと思ったら、[br]def extract_addressE(X):[br] return Right(X["address"]) if "address" in X and X["address"] is not None else Left("Address がありません")[br]Either型を使って、欠損値のときはLeftにメッセージをくるみ、データがあればRightにくるんで送ります。[br][br]これは、単独処理ではなく、複数の項目があればこのような関数をバケツリレーできます。[br]変なデータがまざっていても、エラーが起きずに情報収集ができます。[br]くわしくは、こちら「[url=https://www.geogebra.org/m/twxxx3yq#material/huczjcdf]FP:モナドで現実データ世界を安全に過ごそう」[/url]をご覧ください。[br][br][b][size=150]<振り返り>[br][/size][/b]今の3つの例からわかることは何でしょう。[br]ブンゲン先生の例は[br]「ハンバーグ圏」の構造を持ち上げて「ライスセット圏」を作りました。[br]Maybeは[br]「データ圏」の構造を変えずに、「Maybe圏」を作りました。[br]Eitherは[br]「データ圏」の構造を変えずに、「Either圏」を作りました。[br][br]これって、圏を圏に移す射です、1対1で構造を壊さず全体を持ち上げてますね。[br]ということは[br]ファンクター={圏たち、ファンクター、合成、恒等射}という圏になっているということですね。[br]このしくみは、[br]2の約数圏={[1,2]、約数、合成、自分自身の約数}という超シンプルな圏と対応がつくね。[br]ファンクターを使うと、圏の同型写像の圏を作れそうですね。[br]だた、準同型ではなく、同型といえるためには逆戻りできないといけない。[br]厳密には、逆射としての逆ファンクターが構成できると、「[b]圏同型[/b]」と言えそうだね。また、ファンクターは射の1つだから、[br]射の合成としてファンクターのバケツリレーができるということも言えるでしょう。[br]たとえば、「ライスセット圏」にビールをつけて「ビールライスセット圏」もできるでしょう。[br][br][br][b][size=150]<さらに俯瞰しよう>[br][/size][/b][br]圏たちが、対象でファンクターが射となる圏が作れるということは、[br]圏と圏をつなぐファンクターを複数用意することができるはずだ。[br]さっきの例では、[br]1つのデータ圏に対して、ファンクターを変えたために、Maybe圏とEiger圏ができた。[br]でも、圏Cに2つのファンクターF,Gをして同じ圏Dができることもありうるでしょう。[br]そうすると、F、Gは違ってみえても、[br]2つの[color=#0000ff]ファンクター[b]FをGに翻訳する対応が自然にできるはず[/b][/color]ですね。[br]これを[b][color=#0000ff][size=200]自然変換(natural transformation)[/size][/color][/b]という。[br][br]圏Cの中の[b]射f:a→b[/b]に目をつけてみよう。[br]射がそれぞれ持ち上げられるとして、[b]F(f): F(a)→F(b)とG(g):G(a)→G(b)[/b]とする。[br]そして、FモノからGモノへの翻訳をφとしたら、[br]F(a)からG(b)への射は[br][b]φaしてG(f)でも、F(f)してからφbしても[/b]同じはずだ。[br]これを「[b]図式が可換[/b]」だという言い方をします。[br]圏論の証明の基本技です。[br][br]群論の証明でもよく出てきましたね。[br]グラフをかくと、四角形ABCDができてて、AからCへの矢印は[br][b]AB+BCでも、AD+DCでも射の合成は同じ[/b]になりますよ[br]というものでしたね。[br][br]イメージとしたら、「ビールライスセット圏」は[br][b]ピールが先でもライスが先でも、[br]結局は、「ビールライスセット圏」ができる[/b]でしょということですね。
3.圏の視覚化
圏の視覚化をしてみる。[br][br][size=150][b][u][color=#9900ff]課題:自然変換φの図式が可換であることを視覚化しよう。[br][/color][/u][/b][/size][br]#Pythonを使わなくても、geogebraで図式がカンタンにかけます。[br]#オブジェクトの設定のラベルの変更によって、記述の自由度があがりますね。[br]#タイトル「自然変換φの図式が可換」[br]#四角形ABCDをかきます。[br]A=(-3,3)[br]B=(-3,-1)[br]C=(3,-1)[br]D=(3,3)[br]φa=Vector(A,B)[br]φb=Vector(D,C)[br]Ff=Vector(A,D[br]Gf=Vector(B,C)[br]4点A,B,C,Dの設定を順にひらいて[br]ラベルをF(a),G(a),G(b),F(b)に変更します。[br]ビューの格子と軸を設定で非表示にすると、図に見えますね。[br]
自然変換φの図式が可換
[b][size=150][u][color=#9900ff]課題:データ圏をMaybe圏やEither圏に持ち上げるようすを視覚化しよう。[br][/color][/u][/size][/b][br]Pythonを使わなくても、geogebraでカンタンに作れます。[br]#タイトル「データ圏をファンクターを使って、Maybe圏またはEither圏へ持ち上げる」[br]a=slider(-10,10,1) #アニメーションにする。[br]JorN={"Just " + a, "Nothing"}[br]Maybe=if(a>=0, JorN(1), JorN(2)) #太字で青で文字サイズを大にする。[br]RorL={"Right( " + a + " )","Left(負のデータです)")[br]Either= if(a>=0, RorL(1), RorL(2)) #太字で緑で文字サイズを大にする。[br]b=CheckBox(if(On),Maybe,Either) #Maybeに連動して作る。Eitherの設定で上級でb==falseとする。[br]ビューの格子と軸を設定で非表示にすると、図に見えますね。[br][br]