複利最終利回りの近似式

金利に単利と複利があることを知っている方は多いだろうが,今回述べる最終利回りはもう少し複雑な概念であり,債券投資をする上ではなくてはならないものである.

債券はいうなれば借金のようなもので,発行者は利子と元本を支払う義務が発生し,債券の保有者はそれらを受け取ることができる.債券については利子と元本をそれぞれクーポン,額面と言うのが普通である.いつ,どれだけのクーポンが支払われるのかについては様々な形式があるが,以下では次のような債券 Bを考えよう.

債券 B保有者は,毎年年末にクーポン C円が支払われ, T年後の年末にはクーポン C円と合わせて額面 F円が支払われる.

この債券 B P円で買うことができるとして,この投資で得られる金利(これを利回りという)は年率いくらなのかというのがここで考える問題である.

ごく単純に考えると, P円の投資で合計 TC+F円を得ることができるため,全体として \frac{TC+(F-P)}{P}の収益率となる.これを単利で年率換算すると r_s = \frac{C+(F-P)/T}{P}となる.この利回りは単利最終利回りと呼ばれており,日本では幅広く用いられている(国が発行する債券である国債の紹介ページにも利回りとして単利最終利回りが用いられている:ご存知ですか?国債 : 財務省).

一方,海外で主に用いられているのは複利最終利回りであると言われている(どの国でどちらがよく使われているというようなリストを私は見たことがないが).ただし,複利最終利回りは上の収益率を複利で年率換算した \left( \frac{TC+F}{P} \right)^{1/T} -1のことではない.複利最終利回りでは再投資による収益も考慮する.つまり,スタート時点で投資した債券 B_0(投資時点を添え字にしている)により1年後にクーポン C円が支払われるが,それをそのまま持っておくのではなく,さらに債券 B_1 C円分投資するのである.2年後には B_0により C円, B_1により C^2/P円が支払われ,それらもさらに債券 B_2に投資して…というように得られた収入を債券 Bに再投資していくのである.このように債券のクーポンをそのまま同じ債券に再投資するとして得られる利回りを複利最終利回りというのである.

複利最終利回りが rであるということは,最初に投資した P円は T年後に P(1+r)^T円になっているということである.一方,投資に対して受け取る金額で考えると,1年後に支払われたクーポン C円は再投資により T-1年間債券 B_1で投資されることになるので, T年後時点では C(1+r)^{T-1}円になっている.同様に,2年後に支払わたクーポン C円は T年後時点で C(1+r)^{T-2}円になっている.この調子で話が進み,ちょうど T年後には最後のクーポン C円と額面 F円が支払われる.どちらも債券 B P円投資した際の T年後の金額を表しているので,
 P(1+r)^T = C(1+r)^{T-1} + C(1+r)^{T-2} + \cdots + C + F = C \frac{(1+r)^T - 1}{r} + F
となる.この式はいわゆる将来価値による式表現であり,ファイナンスの教科書によく書いてあるのは将来の受け取り金額を割り引いて現在価値に置き直した以下の同値な式である.
 P = C \frac{1 - (1+r)^{-T}}{r} + F(1+r)^{-T}

いずれにせよ,これを rについて解析的に解くことは一般的に不可能である.そのため,簡易的な計算方法として以下の近似式が知られている.
 r \sim \frac{C-(P-F)/T}{(P+F)/2}
近似式というからには,「〜は非常に小さいとみなせるから〜」とか,「テーラー展開して〜次以上の項を無視して〜」とかいう数学的な導出があるのだろうと思ったが,ざっと調べても見当たらない.ネットで探すとこの近似式自体はかなり見つかるが,その数学的な説明はほぼない.単利最終利回りの式と比較すると分母が異なっており,債券価格 Pと額面 Fの平均になっている.ここでうまく補正しているのだろうが,ぱっと思いつく近似ではこうはならない.


いろいろ探してみた結果,HawawiniとVoraのYield Approximations: A Historical Perspectiveという1982年の論文が見つかった.タイトルの通り最終利回りの近似式の歴史を辿っており,古くは1556年のFontana(三次方程式で有名な人)まで遡るという.この論文によれば,上の近似式は経験的に生み出されたものであり,数学的に導かれたよりよい近似式がいくつも提案されている.その中でも上の近似式に近いものは,1897年のTodhunterによる以下のものである(数式中の変数は適宜置き換えている).
 r \sim \frac{C-(P-F)/T}{F+\frac{T+1}{2T}(P-F)}
この近似式は以下のように導かれる.
 \begin{align} P &= C \frac{1 - (1+r)^{-T}}{r} + F(1+r)^{-T} \\
P - F &= (C - rF) \frac{1 - (1+r)^{-T}}{r} \\
rF + \frac{r}{1-(1+r)^{-T}}(P-F) &= C \\
rF + \frac{r}{1-(1+r)^{-T}}(P-F) - \frac{1}{T}(P-F) &= C - \frac{P-F}{T} \\
r &= \frac{C-(P-F)/T}{F + \left( \frac{1}{1-(1+r)^{-T}} - \frac{1}{Tr} \right) (P-F)}
\end{align}
ここで,下から2行目の分母で r \sim 0の近似を行うことでTodhunterの近似式になる. \theta = 1/(1-(1+r)^T) - 1/Trとすると,HawawiniとVoraの数値的な検証では, \thetaは0.5よりも大きく,また,Todhunterの近似式を使用しても \thetaを過小評価している.つまり,近似式としてはごく簡易なものに過ぎないということになる.


そもそも現在は数値計算で最終利回りを簡単に短時間に求めることができるので,近似式の重要性は小さくなっているかもしれない.だが,経験則による近似式が未だに教科書(例えば証券アナリストの通信講座)に生き残っており,その他の式がほとんど知られていないのは驚くべきことだろう.1982年のHawawiniとVoraですらそう述べているのだから.

It is indeed surprising that the rich history of approximation formulas has remained unnoticed and that it never reached the textbook audience.

内積の本質

この記事は 日曜数学 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という新種が出たようである.和名案は「ゲロゲロあおむし」といったところか.なお,私の度重なる経験から言うと二日酔いのときはひたすら水を飲んで放尿しまくるのが一番おススメである.