イントロダクション

1987年、高校を卒業して受験浪人をしていたころ、サイエンスという雑誌の連載コラムをまとめた コンピューターレクリエーション I 遊びの発想 という本が出た。 話題の中心はコンピュータに関連した数学なのだが、パソコンでプログラムを作るときのネタにも最適という楽しい本だ。 マンデルブロ集合は、この本で紹介されているネタのひとつだ。 ちょっとしたプログラミングで、すばらしいグラフィック画像が得られるというのが興味を引いて、さっそく自分でも試してみることにした。

当時僕が持っていたパソコンは、すでに古くさくなっていた PC-8001 だった。 CPU は Z-80(の NEC が作ったコンパチ・チップ)で、クロックは 4MHz、RAM が 32KB、HDD はもちろん FD さえついていなくて、カセットテープでプログラムを保存するという、今考えると恐ろしくなるようなシロモノだ (これでも本体価格16万8千円)。 グラフィック表示性能も話にならないほど低く、目的のためには使えないパソコンだった。 そこでPC-8801 を持っている友人を頼って、プログラムを書いてみることにした。 PC-8801 だって、せいぜい 320 x 200 ドット RGB 8 色といったような性能しかないのだが、それでも当時はずっとよいパソコンだった。

マンデルブロ集合の画像を得るには、単純な割に多量の計算を必要とする。 PC-8801 で最初に作った BASIC のプログラムでは、最初の画面(後で紹介する)を得るだけで丸2日間、次に作ったマシン語版のプログラムが20時間、 そこからさらに工夫して速度を上げても、5時間から10時間ぐらいかかっていた。 朝方友人宅に行ってプログラムを走らせておき、外で遊んで帰ってくると1枚できているという具合だ。 しかし夏のさなかには温度が熱くなり過ぎて、戻ってみると暴走していたということもよくあった。 グラフィック性能も満足できるレベルではなく、もっと性能のよいコンピュータが必要だった。

その後大学に入学し、新しいパソコンを手にいれたのが1988年の夏だった。 エプソンの 98 互換機、PC-286v だ。 CPU は 80286、クロックが 10MHz、メモリが 640KB、とりあえず FD もついていたが、HDD は外付けでやっと 40MB だった。 それでも計算速度は飛躍的に向上し、寝る前に設定して計算させておき、翌日1枚の絵を得るというぐらいのことはなんとかやっていくことができた。

もっと速い計算機はないかと、次に目を付けたのが大学にあった大型計算機 ACOS-4 だった。 こいつは NEC 製のメインフレームで、レンタル料が月に何百万円とかいう話をうわさに聞くほどの凄いマシンである。 が、もちろん学生は無料で使い放題だ。 さっそく端末室に入り浸り、プログラムを作成して計算をやらせてみた。 こいつは確かにパワフルで、パソコンで10時間ぐらいかかる計算が、せいぜい20秒ぐらいで終わった。 大型計算機にはグラフィック表示端末がまったくないので、 計算結果だけパソコンにダウンロードし (端末の FD ドライブは効率が悪く、1MB ダウンロードするのに20分もかかった)、 それをグラフィック表示するプログラムを書き、 ようやく満足できるクオリティの画像が得られるようになったのである 。

そんな「景勝ハンティング」に凝っていたのは、すでに10年近く前の話だ。 コンピュータの分野では、10年前といったら化石時代といってもいいぐらい昔である。 現に、自分で使っている CPU のクロックだけとってみても、そのスピードは 100 倍になっている。 グラフィック表示性能も飛躍的に向上し、目では見分けがつかないようなグラデーションさえ可能だ。 今回久しぶりにマンデルブロ計算プログラムを Windows で作ってみたのだが、 特別な工夫なしに昔の ACOS よりも短い時間でゆうゆう作画してみせた。 以前なら何週間もかかって取ってきたような画像が、30分もあれば一覧にして見せられるほどなのである。 いやはや、これほどのパワーを持った計算機が、せいぜい net-surf と web ページの更新にしか使われていないというのは恐ろしい話である。 当時はデータの保存や座標取りなどにも大変神経を使ったものなのだが、こんな風に簡単に計算できてしまうことから、保存やデータの再利用などはほとんど気にしなくてもよくなってしまった。

プログラムは quick-hack のため、ブラッシュアップしないと実用に耐えないので、公開は先にする。

名所案内





マンデルブロ集合とは

定義は単純で、高校生の頃まじめに数学をやっていれば理解できるはずだ。 ごく簡単にではあるが、説明しておこう。

数直線とは、線を引いて真ん中をゼロとし、右へ正の数、左へ負の数を伸ばしていったものだ。

---------+---------+---------+---------+---------+--------->
        -2        -1         0         1         2

数直線では実数のみを扱うが、一方で自乗すると -1 になる虚数単位 i というものもある。 虚数は、数直線上にはポイントできない、実数とは性質の異なる数だ。 実数と虚数を合わせた数を複素数と呼ぶ。 この複素数に合わせて、数直線を平面に拡張する。

                             ^
                             |
                             |
                             |
                             +2
                             |
                             |
                             |
                             |
                             |
                             +1                  x (2 + 1i)
                             |
                             |
                             |
                             |
                             |
---------+---------+---------+---------+---------+--------->
        -2        -1         |0        1         2
                             |
                             |
                             |
                             |
                           -1+
                             |
                             |
                             |
                             |
                             |
                           -2+
                             |
                             |
                             |
                             |

これを複素平面と呼ぶ。 たとえば 2 + 1i という数は、座標でいえば (2, 1) の部分、 3 - 4i ならば (3, -4) の部分となる。

このような複素平面上のある点 C について、次の漸化式を考えてみる。

Zn+1 ← Zn2 + C

たとえば、1 + i という点から計算してみよう。

1回目 1 + 3i ← (1 + i)2 + 1 + i
2回目 -7 + 7i ← (1 + 3i)2 + 1 + i
3回目 1 + 97i ← (-7 + 7i)2 + 1 + i

このケースでは、繰り返すほど数字が大きくなっていくのが分かる。 複素数の「大きさ」は、原点 0 からの距離で測ることにする。 つまり実部と虚部を自乗して足したものの平方根が、その複素数の大きさだ。 -7 + 7i ならば、約 9.9 ということになる。

点 C の選び方によって、Z の増え方はさまざまに変わる。 ほとんどすべての数は、あっという間に大きな数になってしまい、すぐに計算できなくなる。 しかし原点に近い狭い範囲では、ある値を決して超えない C が存在する。 そのような点 C の集合を、マンデルブロ集合と呼ぶ。


[Mandelbrot]

この図で、マンデルブロ集合に属する点は黒で表示されている。 全体としては、8の字を横に寝かせたような形をしているが、周囲には同じような形の小さなミニチュアがびっしりと並んでいるのが伺える。 回りの、黄色から緑、青から紫へと変化していく色の付いた部分は、実はマンデルブロ集合に属していない点である。 しかし本体の形以上に、印象的な雰囲気を画面にもたらしている。 試しにマンデルブロ集合だけを抜き出してみよう。


[Mandelbrot Set]

周囲の色は、どのようにして決まるのだろうか。 マンデルブロ集合に属さない点は、計算を繰り返すうちにある値を超えて大きくなってしまうと述べた。 このときの発散の度合いはすべての点で同じではなく、数回のうちに超えてしまうものもあれば、数百回計算してもなかなか超えないものもある。 そこである値を超えるまでに何回計算を必要としたのかをカウントしておき、その数が少ないものに暗い色、多いものに明るい色を割り当てる。 するとマンデルブロ集合から遠い点は暗く、近い点においてはあざやかな明るい色になるのだ。 また、このように違いを色にして示すと、マンデルブロ集合の周囲にもさまざまな正確を持った点の分布が潜んでいることが分かるのだ。


[back to home]