読者です 読者をやめる 読者になる 読者になる

内積の本質

この記事は 日曜数学 Advent Calendar 2015の 9日目の記事です。(8日目:「3の100乗を19で割ったあまりは?」を4通りの方法で計算する )

フーリエ解析は非常に話題に富む数学のトピックである.そのため様々なフーリエ解析の本が本屋に売られ,またインターネット上にもたくさんの解説が存在している.面白いのは,これらの解説の仕方には多様性があるということである.あるものは実際に高調波を合成して望みの波形に近似させる様子を見せたり,またあるものは最小二乗法の観点からフーリエ解析を述べている.これらフーリエ解析の解説書はまさにその著者のフーリエ解析の理解の仕方を表しているのだろう.

私はというと内積を関数に拡張してフーリエ級数展開を説明するというやり方が好きである.それまで幾何学的な意味しかわからなかったベクトルの内積が関数にも定義され,しかもそれが大いに効果を発揮するというところに内積の本質を感じたからである.今日はフーリエ解析の話と絡めて内積について語ろうと思う.


私が人にフーリエ解析を教えるときは,まず次のような問題を出す:

 \begin{pmatrix} 4 \\ 1 \\ -2 \\ 3 \end{pmatrix} = a_1 \begin{pmatrix} 1/2 \\ 1/2 \\ 1/2 \\ 1/2 \end{pmatrix} + a_2 \begin{pmatrix} 1/2 \\ 1/2 \\ -1/2 \\ -1/2 \end{pmatrix} + a_3 \begin{pmatrix} 1/2 \\ -1/2 \\ 1/2 \\ -1/2 \end{pmatrix} + a_4 \begin{pmatrix} 1/2 \\ -1/2 \\ -1/2 \\ 1/2 \end{pmatrix}
 a_1, a_2, a_3, a_4は何でしょう?

まあただの連立方程式とみなせるので地道にやれば求まるのだが,それがわざわざしたいことではない.注意すべきべきは,右辺のベクトルを順に \mathbf{x}_1, \mathbf{x}_2, \mathbf{x}_3, \mathbf{x}_4としたとき,これらが正規直交系になっていることである.つまり,これら4つのベクトルから異なるもの2つ \mathbf{x}_i, \mathbf{x}_jを取ってくると,その内積 \langle \mathbf{x}_i, \mathbf{x}_j \rangle = 0となり,また同じベクトル同士の内積は全て1になっているのである.この性質を利用し,問題の式の両辺に \mathbf{x}_1との内積をとってみると,
 \langle \begin{pmatrix} 4 \\ 1 \\ -2 \\ 3 \end{pmatrix}, \mathbf{x}_1 \rangle = a_1 \langle \mathbf{x}_1, \mathbf{x}_1 \rangle + a_2 \langle \mathbf{x}_2, \mathbf{x}_1 \rangle + a_3 \langle \mathbf{x}_3, \mathbf{x}_1 \rangle + a_4 \langle \mathbf{x}_4, \mathbf{x}_1 \rangle = a_1
となって, a_1 = \langle (4, 1, -2, 3)^T, (1/2, 1/2, 1/2, 1/2)^T \rangle = 3{}^Tは転置を表す)というふうにa_1が求まる.残りについてもベクトル (4, 1, -2, 3)^T \mathbf{x}_2, \mathbf{x}_3, \mathbf{x}_4との内積をとることで求めることができる.


フーリエ級数展開において各係数を求めるというのも全く同じようなものである.まず問題としては,区間 [ 0, 2\pi ] で定義された関数 f(t)が,
 f(t) = a_0 + a_1 \cos t + b_1 \sin t + a_2 \cos 2t + b_2 \sin 2t + \cdots
というように書き表せるとき, a_0, a_1, b_1, a_2, b_2, ...は何かということである.
先の例でいう \mathbf{x}_1, \mathbf{x}_2, \mathbf{x}_3, \mathbf{x}_4に対応するものは定数関数1および三角関数となっている.これらに内積的なものがあって正規直交基底的なものになっていればベクトルの場合と同じ方針で解くことができる.さて,「内積的なもの」とは何か.


実は数学でいうと内積は,何か線型空間 Xで定義された実数値あるいは複素数値の2変数関数\langle x, y \rangleであって,以下の条件を満たすものと定義される:
1. \langle x, x \rangle \ge 0であって,
   \langle x, x \rangle = 0 \Leftrightarrow x = 0
2. \langle \lambda x + \mu y , z \rangle = \lambda \langle x, z \rangle + \mu \langle y, z \rangle(線型性)
3. \langle x, y \rangle = \overline{ \langle y, x \rangle }複素共役

ベクトルの内積は当然これを満たす.「関数にも内積的なものがあれば」というのは,関数2つに対してある値を定める方法で,これら3条件を満たすようなものがあればいいということである.そこで,関数 f(x), g(x)に対してこういう値への対応を考えてみよう:
 \langle f, g \rangle = \int_0^{2\pi} f(x)\overline{g(x)} dx
すると,これが上の条件1,2,3を満たすことが確認できるだろう.なので,数学的にはもうこれを「内積」と呼んでも構わないのである.

これで関数に内積が定義できた.次に考えるべくは定数関数1および三角関数 \cos t, \sin t, \cos 2t, \sin 2t, ...が正規直交系を成しているかである.手始めに定数関数と \sin ntとの内積を取ってみよう.
 \langle 1, \sin nt \rangle = \int_0^{2\pi} \sin nt dt = 0
 \cos ntとでも同様の結果になる.つまり,この内積でいうと定数関数と三角関数は直交している.次に,三角関数同士の内積であるが,異なる自然数 n, mについて,
 \langle \cos nt, \cos mt \rangle = \int_0^{2\pi} \cos nt \cos mt dt = 0
 \langle \sin nt, \sin mt \rangle = \int_0^{2\pi} \sin nt \sin mt dt = 0
となることが高校程度の数学で確認できる.また,任意の自然数 n, mについて
 \langle \cos nt, \sin mt \rangle = \int_0^{2\pi} \cos nt \sin mt dt = 0
となる.つまり,三角関数同士も直交している.では,「正規直交系」の「正規」(ここでいう自身との内積が1)についてはどうだろうか?計算してみると,
 \langle 1, 1 \rangle = \int_0^{2\pi} dt = 2\pi
 \langle \cos nt, \cos nt \rangle = \int_0^{2\pi} \cos^2 nt dt = \pi
 \langle \sin nt, \sin nt \rangle = \int_0^{2\pi} \sin^2 nt dt = \pi
となって全然1ではない.だが,正規化は係数をいじくれば何とかなる.定数関数については 1の代わりに 1/\sqrt{2}を使うことにすれば
 \langle 1/\sqrt{2}, 1/\sqrt{2} \rangle = \int_0^{2\pi} \frac{1}{2}dt = \pi
となる.ここで,内積の定義を
 \langle f, g \rangle = \frac{1}{\pi}\int_0^{2\pi} f(x)\overline{g(x)} dx
というふうに書き換えよう.内積の条件はこれでも満たされるのでこれも内積と呼んで問題ない.こうすれば
 \langle 1/\sqrt{2}, 1/\sqrt{2} \rangle = 1
 \langle \cos nt, \cos nt \rangle = 1
 \langle \sin nt, \sin nt \rangle = 1
となって正規化される.


フーリエ級数の問題に戻ると,問題は
 f(t) = a_0 + a_1 \cos t + b_1 \sin t + a_2 \cos 2t + b_2 \sin 2t + \cdots
 a_0, a_1, b_1, a_2, b_2, ...を求めるということであった.上で定数関数として 1の代わりに 1/\sqrt{2}を使ったので, a'_0 = \sqrt{2} a_0として
 f(t) = \frac{a'_0}{\sqrt{2}} + a_1 \cos t + b_1 \sin t + a_2 \cos 2t + b_2 \sin 2t + \cdots
と書き換えておこう.さて,準備はそろったのであとはベクトルの問題と同様にやればよい.
 a_0 = \frac{a'_0}{\sqrt{2}} = \frac{1}{\sqrt{2}} \langle f(t), 1/\sqrt{2} \rangle = \frac{1}{2\pi}\int_0^{2\pi} f(t) dt
 a_n = \langle f(t), \cos nt \rangle = \frac{1}{\pi} \int_0^{2\pi} f(t) \cos nt dt \quad (n \in \mathbb{N})
 b_n = \langle f(t), \sin nt \rangle = \frac{1}{\pi} \int_0^{2\pi} f(t) \sin nt dt \quad (n \in \mathbb{N})
こうして教科書に載っているフーリエ級数展開の公式が得られる.


以上の流れを見るとむしろ三角関数 \cos nt, \sin ntが現れたことが唐突に思える.この議論で必要だったのは結局いい感じの内積とそれに対応するいい感じの正規直交系である.その正規直交系としてここで三角関数が選ばれた理由は特にない.なので,別の正規直交系を選んでくることも可能であり,例えばルジャンドル多項式系という多項式の系列で同様に級数展開することも可能である.このように一般的な正規直交系を成す関数系を用いた級数展開を一般フーリエ級数展開という.


元はといえば,ベクトルの問題からスタートしたのであった.そしてその内積の本質を3つの条件として抜き出し,他の対象にも応用すると,議論の対象が異なるにもかかわらず同じ方針で問題が解けるようになる.なんと素晴らしい再利用システムであろうか.

この文献・・・日本語じゃない.英語でもない.でも,あきらめない!

この記事は 日曜数学 Advent Calendar 2015の 2日目の記事です。(1日目:日曜数学ってなんだろう )

このブログはちょうど一年前に次の記事から始まった:end01nojo.hatenablog.com
というのも明日話したくなる数学豆知識 Advent Calendar 2014という企画に参加するためにこのブログは作られたのである.2014年の12月が過ぎた後もたまにチラシの裏の感覚で記事を書いていたが,2015年の12月を迎えるに当たりまたしてもこのアドベントカレンダー企画に参加するため,記事を書こうと思う.なお,去年の明日話したくなる数学豆知識 Advent Calendar 2014はリンク先を見ると分かるが,ほぼtsujimotter氏と私しか登録がなく,「記事を書けなくなった方の負け」という泥沼の数学記事合戦の様相を見せていた.対して今年の日曜数学 Advent Calendar 2015の登録状況はとても豊作であり,私にとって師走に追い打ちをかけるイベントではなくなったのはありがたい.tsujimotter氏が1日目の記事で言及されていたように日曜数学者,つまりアマチュア数学者のコミュニティが2015年に大きく広がったことが如実に示されているのだろう.

こうして広がりを見せる日曜数学であるが,その楽しみ方は人それぞれである.プロの数学研究者ではなく,論文をたくさん出して業績を挙げる必要性がないからこそ,どんな数学にどう取り組むかの多様性が生まれるのだ.今日は日曜数学についての記事という事で,私にとっての一つの日曜数学的な楽しみ方を紹介しよう.



日本は母国語で学問をすることのできる珍しい国であると言われる.それも文明開化の時代の先人の努力の賜物であるのだが,そのため数学を学ぶにしてもかなり高度なレベルの本も日本語で読むことができる.しかし,やはり最先端の領域は英語の文献であり,また日本語の文献を読んでいてもその参考文献が全て日本語とは限らない.という訳である程度のレベルに到達すると自然と英語の文献に当たらざるを得なくなるというのが数学を含め科学を学ぶ者の宿命となっている.語学が嫌いな理系学生もいつかは英語を勉強せざるを得なくなるのだ.ただ,数学においては英語だけで済まない可能性がある.

以下は吉野邦生氏の佐藤超関数によるShannon-染谷の標本化定理の拡張とRamanujanの積分公式という記事における参考文献の部分を抜き出したものである:

f:id:End01nojo:20151201221120p:plain
f:id:End01nojo:20151201221141p:plain

見ればわかるように,文献一発目から英語ではない.フランス語である.しかも文献[4]もフランス語であり,著者は英語だけでなくフランス語に長けているのかと驚く.だがさらに驚くべきは文献[11]でありこれは何とドイツ語である.失礼ながら本当に著者はこれらの文献を読んで理解しているのかと疑ってしまう.

このように日本語でも英語でもない文献が参考文献に挙げられるのは,その文献が古い場合が多い(文献[4]はフランス語だが…).今でこそ理系の論文は英語で書くのが常識となってしまっているが,おそらく1970年くらいまではこのようにフランス語やドイツ語,あるいはロシア語で書いても学者らに受け入れられたのであろう.そして特に数学では古い文献が引用されることもままあるので,非英語文献が名を連ねることもしばしばである.



さて,それではこのような非英語文献の内容が気になってしまった時はどうするか.常套手段としてはその翻訳版がないかを探してみることである.超関数の分野では誰も彼もLaurent Schwartzの"Théorie des distributions"を参考文献に挙げるが,これは日本語で読める.皆本当に原著を読んだのだろうか?また英語訳が見つかる可能性はもっと大きい.だが,私は言いたい.
「そのまま読もうぜ!」と.

ある言語の文章を理解するにはその文法を把握することと語彙を増やすことが必要になるが,数学の文章においてはその単語はたいてい英語のものと似ている.また,文学作品ではないので数学の文章はだいたい同じ単語が頻繁に出現する.集合,関数,線型…というような基礎的な単語が繰り返されるので小説を読むよりは圧倒的に楽である.文法はまあ何か適当な文法書を買ってきて読むほかないが,数学書は「~を…とすると,***が成り立つ」と言うような頻繁に使われる言い回しがあるので,文法の点でも他の文章より読みやすいのではないかと思う.

…と「第二外国語で読みやすいのは実は数学書!」ということを述べたが,実際にその文章を見ていただこう.以下の画像はGerd Fischerの"Lehrbuch der Algebra",つまりドイツの代数学の教科書の一部をスキャンしたものである(私物のため私のメモが残っている).

f:id:End01nojo:20151201225752p:plain

いかがだろうか?少し代数学を学んだ人なら,ドイツ語を第二外国語に選んだ人でなくてもこれが群の定義について述べていることが分かるだろう.さらに,単語の意味も推測できる.Gruppeは明らかに群であるし,ここに抜き出した部分以外も見ればMengeが集合を意味していることがわかる.さらに,最後の"G heißt kommutativ (oder abelsch), wenn a*b = b*a für alle a,b \in G"は「全てのa,b \in Gについてa*b=b*aならば,Gは可換である(あるいはアーベル群である)という.」と訳せることも数学をやっている人間なら容易に推測できるだろう.つまり,wennは何かしらwhenかifの意味である.群の定義文はよく見ると「~, wenn ~」という形なので,G1およびG2が満たされるときGを群と呼ぶということが読み取れる.ここまでドイツ語の語彙や文法知識は使っていない.

もう一つ同じ本から抜き出そう:

f:id:End01nojo:20151201225757p:plain

ここではl_ar_aという写像が定義され,translationという名前がつけられている.続くBemarkungは何かしら定理か系かそんな感じの意味だろう.bijectivは英語でいうbijective,つまり全単射と考えられる.斜体になっているBeweisはおそらくその証明で,それを見るとたしかに l_aおよび r_aには逆写像が存在するので全単射である.



いかがであろうか?単語帳も文法書も何もなくても著者の主張がここまで読み取れるのである.さらに少しの語彙と文法を憶えればより多くの情報を掴むことができるだろう.まあ例に挙げたのは数学的には基礎中の基礎の内容であるが,他国の言語で書かれた文章が数式を通じて理解できるという事に面白さを感じないだろうか?最先端ではないけれども,楽しい.これこそ日曜数学の醍醐味だと私は思う.

Rによる1命令だけのプログラミング

今月の「情報処理」という学会誌に奥村晴彦先生の「Rによる1行プログラミング」という記事が載っていた.記事は情報処理学会員でなくても読めるようである:

Rを好んで使っている身としては読まざるを得ないタイトルである.しかも1行プログラミングということで,いわゆるワンライナーの奇怪な短いコードで問題を解くという内容かと思ったが,実際には1行ずつ実行できるプログラミングというような内容であった.

ワンライナーを期待して読んでしまったので消化不良な気分になり,しばらく1行でなるべく短く書く方法を自分で考えた.解くべき問題は1から100を出力することであるが,3の倍数のときは数字の代わりに"Fizz"と,5の倍数のときは"Buzz",両方の倍数ならば"FizzBuzz"と出力することである.つまり,いわゆる「アホになる」やつである.

今回はこれをRの一行のなるべく短いコードで実行することを目指す.実際には,Rではセミコロン「;」で区切ることによって複数の命令が書けてしまう.Rのよいところは,豊富な関数がすでに用意されており,命令の数を少なくできることにあると思っているので,セミコロンの使用も今回は禁止して一行と言うより一命令文でこの問題を解くことにしよう.

実は,Rにはifelse関数があるのでこれを知っていれば割と簡単に次のように書ける:

ifelse(1:100%%3,ifelse(1:100%%5,1:100,"Buzz"),ifelse(1:100%%5,"Fizz","FizzBuzz"))

これで81文字である.1:100が何回も現れるので,これを工夫すればもっと短くできる(73文字):

ifelse((a=1:100)%%3,ifelse(a%%5,a,"Buzz"),ifelse(a%%5,"Fizz","FizzBuzz"))

ifelseがあまりに強力なので,これ以上短くするのは容易ではないだろう.実際私にはこれ以上短いものは思いつかなかった.

だが,結果を出力せずに「1 2 Fizz 4 Buzz ...」を変数に入れた状態にするだけであれば,より短いコードがあることに気付いた.そのやや奇怪なコードがこれである:

(a=b=1:100)[a[!b%%3]<-"Fizz"][a[!b%%5]<-"Buzz"][a[!b%%15]<-"FizzBuzz"]

70文字のこのコードは,それ自身だけでは結果としてNAしか出力しない.だが,aにはちゃんと問題の解が入っている:

> (a=b=1:100)[a[!b%%3]<-"Fizz"][a[!b%%5]<-"Buzz"][a[!b%%15]<-"FizzBuzz"]
[1] NA
> a
  [1] "1"        "2"        "Fizz"     "4"        "Buzz"     "Fizz"    
  [7] "7"        "8"        "Fizz"     "Buzz"     "11"       "Fizz"    
 [13] "13"       "14"       "FizzBuzz" "16"       "17"       "Fizz"    
 [19] "19"       "Buzz"     "Fizz"     "22"       "23"       "Fizz"    
 [25] "Buzz"     "26"       "Fizz"     "28"       "29"       "FizzBuzz"
 [31] "31"       "32"       "Fizz"     "34"       "Buzz"     "Fizz"    
 [37] "37"       "38"       "Fizz"     "Buzz"     "41"       "Fizz"    
 [43] "43"       "44"       "FizzBuzz" "46"       "47"       "Fizz"    
 [49] "49"       "Buzz"     "Fizz"     "52"       "53"       "Fizz"    
 [55] "Buzz"     "56"       "Fizz"     "58"       "59"       "FizzBuzz"
 [61] "61"       "62"       "Fizz"     "64"       "Buzz"     "Fizz"    
 [67] "67"       "68"       "Fizz"     "Buzz"     "71"       "Fizz"    
 [73] "73"       "74"       "FizzBuzz" "76"       "77"       "Fizz"    
 [79] "79"       "Buzz"     "Fizz"     "82"       "83"       "Fizz"    
 [85] "Buzz"     "86"       "Fizz"     "88"       "89"       "FizzBuzz"
 [91] "91"       "92"       "Fizz"     "94"       "Buzz"     "Fizz"    
 [97] "97"       "98"       "Fizz"     "Buzz"

ポイントは[]で代入を囲むことである.Rでは代入した結果にインデックスを表す[]をそのままつけることができる:

> (a <- 1:10)[2:5]
[1] 2 3 4 5

これを利用し,[]の中身に代入文を書いてしまうのである.そして,[]は[]の後にさらにつけることができるので,[]を使えばいくらでも代入文を書くことができる.そんなことをしたらセミコロンを使うのと変わらないではないかと思うかもしれない.その通りである.

進化的アルゴリズムで関数を進化させてみる

生命の起源や進化論に関する本を読むと,我々人間は偶然の産物のようである.生まれたばかりの地球はマグマに覆われた火の玉であり,生物が発生するどころか住める環境ではない.クマムシにとってもあったかいどころではすまない星であった.やがて地球が冷めてくると水蒸気が水になって海ができるが,まだその海はただの水たまりであって生物はまだ発生していない.そんなある日になにかしら奇跡が起きてアミノ酸やらRNAやらができてそいつらがまた奇跡を起こして細胞を作り,細胞が遺伝子をごちゃごちゃいじっていたら偶然が偶然で重なっていつの間にか我々一人一人ができていたという感じらしい.

もちろん,生物が進化していったのは単に遺伝子に変異を重ねたからだけではなく,自然淘汰が重要な役割を果たす.遺伝子を改変した結果があまりに無茶苦茶であるとその生物はその命を維持することもできない.また,環境が急変した時には特定の表現型を持つ個体しか生き残ることができない.このように生存,生殖に優れた個体が生き残りやすいように自然淘汰という原理が進化を大いに加速させているのである.

だが,自然淘汰が優れた個体を残すとしても,そのシステムが功を奏するにはそもそも優れた個体がランダムな変異の中から発生していなくてはならない.そのような最適者はいつも生まれてくるのだろうか?その最適者は毎回変わってしまうのだろうか?地球と人間で話を置き換えると,もう一度地球を生まれさせた時,人間のような高度な文明を築き上げる生命体は現れるだろうか?また,そのもうひとつの地球に生まれた文明的生命体は人間なのだろうか?

続きを読む

これはもう別種と言っていいだろう

ご覧になっていない方は,まずかつて見たような気がしたのははらぺこあおむしの亜種だったか?を見ていただきたい.


前回の記事からしばらくして,とある筋から地球を飲み込むあおむしについての情報を得た.やはり,どうやら「はらぺこあおむし」とは別で蛹にならずにそのまま地球を飲み込む種がいるらしい.しかも話が速いことに,そのあおむしの(標)本まで保管されているという.私は早速そのおぞましいあおむしを見せていただいた.

f:id:End01nojo:20150510173713j:plain
表紙:和名は「くいしんぼうのあおむしくん」というらしい.文字通りマジで青い.

f:id:End01nojo:20150510173849j:plain
はらぺこあおむし同様雑食である.

f:id:End01nojo:20150510173951j:plain
巨大化:雑食なんて言うものではない.あおむしくんは文明に重篤な災害をもたらす.

f:id:End01nojo:20150510174036j:plain
何年か前なら販売が自粛されるレベル

f:id:End01nojo:20150510174118j:plain
END(裏表紙):地球ごと食べ尽くした後と推測される


間違いない.これが私の記憶にあったあおむしである.「はらぺこあおむし」と「くいしんぼうのあおむしくん」と,名前が相当酷似しているが,その形態も生態も全く似て非なるものである.

たしかに両者とも雑食ではあるが,「はらぺこあおむし」が食糧のうちほんの一部分しか齧らないのに対して「あおむしくん」は丸呑みである.また,「はらぺこあおむし」は金属,コンクリートまでは食べていなかった.さらに,「あおむしくん」は変態しない.「はらぺこあおむし」はかろうじて蝶の一種と考えられなくもないが,「あおむしくん」は一般的な青虫の一種であるとは到底考えられないだろう.

おそらく,「あおむし」と「あおむしくん」は全然違う生物なのである.ほら,「さかなクン」だって魚類ではないではないか.

かつて見たような気がしたのははらぺこあおむしの亜種だったか?

先日この本を買った.

f:id:End01nojo:20150221231001j:plain

これはドイツ語版なのだが日本語版としては「はらぺこあおむし」というタイトルでよく知られた絵本である.この独特な絵に見覚えがある人はかなりいるのではないだろうか?私も保育所の時にたしかこの絵本を見たと思う.そして私の購買履歴を知り尽くしたamazonにこのドイツ語版をサジェストされてまんまと買ってしまったのである.ちなみに,ドイツ語版をサジェストされたので「ああこれ原著はドイツ語だったのか」と思って買ってしまったのであるが,実際には原著は英語である(原題:The Very Hungry Caterpillar).作者はアメリカ生まれのドイツ育ちであるが絵本作家となったのはアメリカに戻ってからのようである.

さて,この「はらぺこあおむし」がどのようなお話かと言うと,フードファイターとしての運命を背負って生まれてきた青虫が満ちることのない食欲を満たすべく延々とありとあらゆるものを食べ続けるお話である.やや乱暴な説明であるが少なくとも私はそういう話だったと記憶していた.

f:id:End01nojo:20150221231700j:plain
そんなちょびっとずつしか食わないなら腹が減って当然だろ!

そして私の記憶ではたしかこの食欲の化身は巨大化しながらなおも食べ続け,最後には地球を飲み込んでしまって終わりというシュールな結末を迎えるのであった.

しかし,今回改めて読んでみるとその結末は全く違っていた.こんな薄い絵本にネタバレもクソもないであろうから書くが,青虫はいろいろ食い漁った結果結局葉っぱを食べて落ち着き,巨大化はするもののそのまま大きな蛹になって羽化して「きれいな蝶になりましたチャンチャン」である.これはこれでシュールであるが私の記憶とは異なる.

まあ幼いころの記憶であるし幼少期の出来事を正確に記憶に保持することはなかなか難しい.私の記憶が違っていたのだろうと思った.だが,調べて見ると次の知恵袋のQ&Aがヒットした.

腹ペコ青虫さんてどんなお話ですか?お恥ずかしながら絵本だという事も... - Yahoo!知恵袋

はらぺこあおむし」ってどんな話ですか?という質問であり,青虫がいろいろ食べて蝶になるお話ですという正答がいくつかよせられている.しかし,回答者のトップバッターであるbaglecompanyさんは違った.

歌は知りませんでしたが、絵本は子供の頃に読みました。お腹ぺこぺこの青虫くんが、おなかすいたよ~ってそこらじゅうの物を食べながら歩いて行くんですが、食べるたびに身体が大きくなっていって、いくら食べてもきりもなくお腹がぺこぺこで食べ続けて大きくなり続けて、地球のあらゆる物は青虫くんが食べて無くなっていっちゃって、何も無くなった地球に巨大化した青虫くんがひとりぼっちで泣いて…最後どうなるんだったか忘れちゃった(>_<)中途半端ですみません(ToT)

おお・・・なんということだ.この人も私と同じ記憶を持っているようだ.ただの記憶違いかと思いきや,「満腹を知りたい」というシンクロニシティが起こっているのかもしれない.(結局何がこの勘違いを生んでいるのかわからなかった.誰か教えてほしい.→解決しました.

ところで,このはらぺこあおむしにはThe Very Hungover Caterpillarという新種が出たようである.和名案は「ゲロゲロあおむし」といったところか.なお,私の度重なる経験から言うと二日酔いのときはひたすら水を飲んで放尿しまくるのが一番おススメである.

ドラクエの世界が見たい

ドラクエの世界は地球のような球ではなく,ドーナツ型をしている.」という話は豆知識としてしばしば聞く話である.聞いたことがない方はこのような説明を見ると納得できるだろう.だがしかしドーナツ型というのも実はおかしな話である.地図が正確すぎるのだ.(偶然にもつい最近某掲示板でスレッドが立っていたようだ.

我々が住んでいる地球は球体(正確には回転楕円体)であり,全世界をひずみなく平面に移すこと,つまり完璧な世界地図を作ることは不可能である.微分幾何の分野では正確な地図を書くことができる曲面のことを可展面というが,可展面であるための必要十分条件ガウス曲率が恒等的に0であることが知られている.ガウス曲率が恒等的に0な面は円柱の側面,円錐の面,そして曲線の接線で構成される面(接線曲面)の3パターンとその貼り合わせであり,半径 rの球面のガウス曲率は 1/r^2であるため完全な地図は作れないのである.

そしてこれはドーナツも例外ではなく,そのガウス曲率は非零であるため完全な地図は作れない.よってドーナツ世界の地図上の場所によって実際の距離は変化しているはずであるが,ドラクエはそうなっていない.どこでも1マスの大きさは一定のドット数で表されている.

では,ドラクエの世界は曲面として全くありえないのかというとそうでもない.ここまであえて「トーラス」という言葉を使わず「ドーナツ」と言ってきたが,ドラクエの世界は平坦トーラスというトーラスの一種と考えることができるのである.だが,この平坦トーラスというやつは厄介なやつでなんと4次元空間の曲面である.4次元空間を考えるのはとても難しいが,なんとか平坦トーラスがどんな形か考えてみよう.


(以下,難しければ最後だけ読めばよい)


4次元空間は3次元空間+時間と考えることができる.つまり4次元空間の物体は時間的に形が変化する3次元物体ととらえることができる.よってある時刻で4次元物体を見れば3次元のものとして我々にも想像できる.これはつまりある時間で断面を作ることになるが,断面を作るとその物体の次元は1つ小さくなる.よって4次元空間の曲面である平坦トーラスをある時刻で見ると曲線になっているはずである.

このことは平坦トーラスを考えるうえで大きなヒントになる.それでは,この世界地図がどのように閉曲面をなしているのかを説明しよう.

f:id:End01nojo:20150204155018p:plain

この地図上で閉曲線を書くとそれは当然4次元曲面上で閉曲線をなしているはずである.例えば下図の赤線のような線を考える.上と下はつながっているためこの線は閉曲線である.

f:id:End01nojo:20150204160123p:plain

地図上に (s,t) \in [ -1, 1 ]^2による座標をつけ,今考えている空間を (x,y,z) \in [ -1, 1 ]^3の3次元空間+ w \in [ -1, 1 ]の時間からなるものとしよう.そしてとりあえずこの赤線に対応する閉曲線はある時刻の xy平面内の閉曲線であるとし,原点は (x,y,z)=(0,-1,0)に写っているとする.

f:id:End01nojo:20150204182742p:plain

この赤線は st平面上で動いても平坦トーラス上では閉曲線を保つ.今は赤線は s=0上にいるが,これを s=0 \rightarrow 1(右端) \rightarrow -1(左端) \rightarrow 0と移動させると元の位置に連続的に戻るはずである.さらに地図と平坦トーラスの場所は1対1に対応しているため赤線は4次元空間の座標として同じところを通らない.要するに輪っかが動いて元に戻ればよい.4次元空間の一筆書きのようなものである.

f:id:End01nojo:20150204172224p:plain

初期時刻を w=-1とし,とりあえず時刻とともに z=1の高さまで赤線を z軸正の方向に動かす.ここで時刻は w=0になったとしよう.

f:id:End01nojo:20150204173233p:plain

元の位置に戻さないといけないので,今度は z軸負の方向に移動させる.さっき通ったところであるが,時刻が異なるので4次元空間的には違う場所である z=0までおろした時点で時刻は w=1になったとする.

f:id:End01nojo:20150204173547p:plain

 (x,y,z)的には輪っかはもとに戻ったが,時刻が異なるので4次元空間的には違う場所である.なのでこれでゴールではない.元に戻るためには時間を戻さなくてはならない.しかし単に今までの運動を逆回しにするのでは4次元空間的に同じ場所を辿ることになるのでNGである.そこで,時間を遡りながら z軸負の方向に輪っかを動かす z=-1までおろしたところで時刻は w=0まで戻っているとする.さっき時刻 w=0 z=1の高さに動かしていた赤線が見える.

f:id:End01nojo:20150204174334p:plain

このまま時間を遡りながら w=-1 z=0の位置まで赤線をあげる.さっきのやつと徐々に距離が縮まり,最後に合流して終了である.

f:id:End01nojo:20150204174855p:plain

つまり,平坦トーラスを3次元+時間で捉えると,最初は一つの輪っかであり,2つに分裂してまた戻るというふうになる. st平面上での xyzwの対応を書くと,次のようになる.

f:id:End01nojo:20150204180508p:plainf:id:End01nojo:20150204180517p:plain



ここまで時間の断面で4次元空間を捉えたが,もっと直接的に4次元を見ることができる「4次元図形の表示」というそのままなタイトルのフリーソフトがあった.4次元空間上の座標をテキストファイルにして入力するとワイヤーで結び,3次元空間に射影したものを見ることができる.断面ではなく射影なのでこれまで見てきたものとは異なるが, st平面を走査した線を4次元座標に変換したファイルを入力してみた.まあしかしこれで平坦トーラスを把握できる人はこの次元の人ではないであろう.

f:id:End01nojo:20150204181349p:plain
f:id:End01nojo:20150204181647p:plain
f:id:End01nojo:20150204181657p:plain
f:id:End01nojo:20150204181708p:plain
f:id:End01nojo:20150204181716p:plain




実は,最後に読み返していて気づいたが,紙で四角い筒(円筒でもよい)を作り, w=-1 \rightarrow 0はこの紙の表側を, w=0 \rightarrow 1は裏側をなぞっていると考えれば紙で平坦トーラスを表現できる.つまり地図を半分に折ってから筒にすればよい.ただ,こんな記事を書いておいてなんであるが微分幾何にそれほど詳しくないので数学的にこのような向きつけ面への写像をどう取り扱うのか私はわからない.とにかく,ドラクエの世界は球でもドーナツでもなく向きつきの筒であると捉えるのが考えやすいのではないだろうか(めっちゃ図を作ったのは何だったのか).