マンデルブロ集合の境界は「2次元」だと証明されている。同じコードで測ったら1.09にしかならなかった
約12分で読めます

マンデルブロ集合の境界は「2次元」だと証明されている。同じコードで測ったら1.09にしかならなかった


シェルピンスキーの三角形の回で、フラクタル次元を自分のコードで測った。理論値log3/log2=1.585\log 3/\log 2 = 1.585に対して実測1.568。box-counting法という、箱のサイズを変えながら「対象を覆うのに何個必要か」を数えるだけの素朴な方法で、小数点以下2桁まで合った。

だったら、もっと有名なフラクタルでも同じことができるはずだ。マンデルブロ集合。

この集合には、私がずっと不思議に思っていた性質がある。面積は有限(数値評価で約1.5065)なのに、境界のハウスドルフ次元は厳密に2であることが証明されている。1998年、Shishikuraによる結果だ(Annals of Mathematics 147, 225-267)。次元2というのは平面と同じ次元で、「線」であるはずの境界が平面と同じだけ込み入っている、という意味になる。

シェルピンスキーで1.585を当てられたコードなら、マンデルブロでも2に近い数字が出るだろう。そう思って測った。出なかった。

実験に使ったコードの全文はGitHubに置いています

測る対象を確認する

まず対象を描く。マンデルブロ集合は「zn+1=zn2+cz_{n+1} = z_n^2 + cz0=0z_0=0から反復したとき、無限大に発散しないccの集合」だ。実装は反復してz>2|z| > 2になったら脱出、というだけで済む。

マンデルブロ集合の全体像。暗い紺色から白へのグラデーションの背景に、集合内部が黒く塗られたカージオイド(心臓形)と、その左に接する円、周囲に無数の小さな球と細い触角状の枝が広がっている。境界上の3地点に色付きの丸印と、カージオイドの縁、Misiurewicz点、シーホースバレーというラベルが付いている

4096×40964096 \times 4096の格子で、反復を打ち切る上限(以下、最大反復回数)を変えながら面積を数えた。集合内と判定された画素数×1画素あたりの面積、という単純な計算だ。

最大反復回数面積の推定値
52.79654
501.58770
5001.51350
5,0001.50659
20,0001.50603

きれいに収束した。数値評価による文献値は約1.5065なので、4桁目まで合っている。面積は確かに有限で、しかも素朴な画素数え上げでちゃんと測れる。

ここまでは順調だった。

コードを較正する

次元の測定に入る前に、box-countingのコードが正しいことを確かめておく。フラクタル次元は「箱を細かくしたとき、覆うのに必要な箱の数N(ε)N(\varepsilon)がどれくらいの勢いで増えるか」で、N(ε)εDN(\varepsilon) \propto \varepsilon^{-D}DDがそれにあたる。log-logプロットの傾きを読むだけだ。

答えが分かっている図形を2つ用意した。(境界は普通の曲線なので次元は厳密に1)と、コッホ雪片(境界の次元はlog4/log3=1.2619\log 4/\log 3 = 1.2619)。マンデルブロと全く同じ関数に通す。

ここで一度失敗している。最初は箱サイズを1〜2画素から使っていたのだが、それだと円が0.880にしかならなかった。画素の階段状のギザギザが、最小サイズの箱では拾いきれないためだ。箱サイズを4〜64画素に絞ったら、円は0.976、コッホ雪片は1.249。測り方の妥当性は、答えを知っている図形で先に確認しておかないと、後で出た数字が本物か分からなくなる。

box-countingのlog-logプロット。横軸が1/ε、縦軸が境界を覆うのに必要な箱の数N(ε)で、3本の直線が右上がりに伸びている。灰色の円は傾き0.976、黄色のコッホ雪片は傾き1.249で最も急、赤のマンデルブロ集合は傾き1.090でコッホ雪片より緩やかな傾きになっている

較正は通った。そして同じ図に、マンデルブロ集合の測定結果も入っている。

1.090。

コッホ雪片(1.249)より低い。あの、見るからに複雑な図形が、雪の結晶よりなめらかだと出た。理論値2との差は0.9以上ある。

解像度を上げても、反復回数を増やしても動かない

測定が粗いのだろうと思い、解像度を上げた。最大反復回数は20,000で固定。

解像度測定された次元
512×5121.0955
1,024×1,0241.1091
2,048×2,0481.1142
4,096×4,0961.0904
8,192×8,1921.0681

画素数にして256倍。上がらないどころか、最後はわずかに下がっている。

反復回数のほうも振ってみた。こちらで妙なことが起きた。

上下2段のグラフ。上段は最大反復回数(対数軸)に対する面積の推定値で、2.8から急降下して1.5065の破線にぴたりと収束する。下段は同じ横軸に対するbox-countingで測った次元で、反復5回の0.98から上昇して反復50回で1.364の山を作り、その後は下降して反復1000回以降は1.09前後で平らになる。理論値2を示す破線ははるか上にある

面積(上段)はきれいに収束するのに、次元(下段)は反復50回のところで1.364という山を作り、そこから下がって1.09で止まる。反復回数を4,000倍にしても、その先はもう動かない。

計算が甘いから低く出ているのではなかった。計算を丁寧にするほど、低い値に落ち着いていく。

何が起きているのかを見る

この山は何だったのか。box-countingが実際に数えている「境界画素」そのものを描いてみた。上のカージオイドに乗っている球のあたりを、反復50回と2000回で比べる。

2行2列の白黒図。上段左は最大反復50回のときの集合内画素で、球のまわりに毛羽立ったもやのような黒い領域が広がっている。上段右はそこから抽出した境界画素で、29,020個の点が球を取り巻く雲のように散らばっている。下段左は最大反復2000回で、同じ球がなめらかな円と小さな装飾だけになっている。下段右はその境界画素で、9,219個が細い一本の輪郭線としてなぞられている

反復を50回で打ち切ると、輪郭は「まだ逃げ切っていない点」で太る。その太った輪郭が、細かい枝のあいだを縫うように走るので、境界画素は29,020個にもなり、次元は高く出る。

反復2000回まで回すと、その脂肪が落ちて9,219個になる。残ったのは、ほぼなめらかな円だ。

つまりこういうことだった。マンデルブロ集合の複雑さを担っている細い枝は、1画素より細い。反復を増やすほど枝は正しく細くなり、正しく細くなった結果、画面から消える。手元に残るのは大きな球のなめらかな縁ばかりで、それを測れば次元は1に近づく。連結成分の数を数えると、2048×20482048\times2048・反復2000回の画像でマンデルブロ集合は333個の破片にちぎれている。この集合が連結であることはDouadyとHubbardが1982年に証明しているので、333という数字は集合の性質ではなく、私の画面の解像度の性質でしかない。

次元が見つからないのは、そこに無いからではない。私の物差しの目盛りより細いところに畳み込まれているからだ。

細さを、目で確かめる

境界上のMisiurewicz点c=0.1011+0.9563ic = -0.1011 + 0.9563iへ、140万倍まで寄っていく。

マンデルブロ集合の境界上の1点へ連続的にズームインするアニメーション。全体像から始まり、倍率が上がるにつれて渦を巻いた触角、稲妻のような分岐、そして拡大の途中で何度も現れる小さなマンデルブロ集合そっくりの島が次々に画面を横切る。左上に倍率と最大反復回数が表示され、×1から×1,400,000近くまで増えていく

拡大しても、新しい構造が尽きない。倍率を上げるたびに枝が枝を生み、途中で何度も「小さなマンデルブロ集合」そのものが顔を出す。1画素の中に、まだこれだけ入っている。

脱出までの反復回数を高さにして3次元で見ると、境界が絶壁になっているのが分かりやすい。回転させてみてほしい。

台地が集合の内側、谷が外側で、そのあいだの崖が境界だ。崖はなめらかな壁ではなく、細かいひだが刻まれた岩肌になっている。

場所を選んで測り直す

集合全体をまとめて測ると、面積の大部分を占める大きな球のなめらかな縁に平均が引っ張られる。ならば、境界の一点だけを拡大して測ればどうなるか。窓の半幅を10110^{-1}から10610^{-6}まで縮めながら、同じbox-countingをかけた。

横軸が窓の半幅(右へ行くほど拡大)、縦軸が測定された次元のグラフ。カージオイドの縁(橙)は1.18から1.35、1.76、1.85と右肩上がりに上昇し、理論値2の破線に近づく。シーホースバレー(緑)も1.17から1.64まで上がる。集合全体の値1.090を示す点線ははるか下にある。グラフ下端の灰色の帯には測定不能を示す×印が並ぶ

上がった。カージオイドの縁で1.85、シーホースバレーで1.64。全体で測ったときの1.090とは別物の数字が出る。

ここでも予想が外れている。私は「メインカージオイドの縁は数式で書ける解析曲線なのだから、そこを拡大すれば次元1.0が出るはずだ」と思って、この地点を対照群のつもりで選んでいた。実際には一番高い1.85が出た。カージオイドの縁には、あらゆる有理角の位置に小さな球がびっしり生えている。カージオイドという曲線はなめらかでも、マンデルブロ集合の境界としてのカージオイドの縁は、まったくなめらかではない

そして、さらに拡大すると測定は壊れる(グラフ下端の×印)。半幅10610^{-6}の窓では、Misiurewicz点のまわりで「集合内」と判定される画素が0%になった。境界の上にいるはずなのに、集合が画面から消える。ここでも同じことが起きている——構造は無いのではなく、細すぎて画素に乗らない。

まとめ

  • マンデルブロ集合の面積は素朴な画素数え上げで測れた(1.50603、文献値約1.5065)
  • 同じbox-countingコードは円で0.976、コッホ雪片で1.249を返す。較正は通っている
  • そのコードでマンデルブロ集合の境界を測ると1.090。理論値2には遠く、解像度256倍・反復回数4,000倍でも動かない
  • 反復50回のとき1.364という山が出るが、これは輪郭が太っていただけで、丁寧に計算するほど1.09へ落ちる
  • 理由は、次元を担う細い枝が1画素より細いこと。連結なはずの集合が333個にちぎれて見えるのが、その証拠
  • 境界の一点を拡大して測り直すと1.85まで上がる。ただしさらに拡大すると集合が画面から消えて測定が壊れる

理論値が出せなかった実験だが、出なかったこと自体が答えだった。この境界は、私が用意したどの解像度よりも細かいところに複雑さを畳み込んでいる。


数字が動かないとき、私はつい対象のほうを疑ってきた。「思ったほど複雑じゃなかったのかもしれない」と。今回もそうで、1.09という値を見た最初の反応は「マンデルブロ集合、意外と大したことないのでは」だった。

でも動かなかったのは対象ではなく、物差しのほうだった。しかも厄介なことに、丁寧に測るほど——反復回数を増やして計算を正確にするほど——数字は理論値から遠ざかっていった。精度を上げる作業が、そのまま見落としを増やす作業になっていた。

測って出てきた数字は、対象の性質と物差しの性質が混ざったものだ。1.09はマンデルブロ集合の次元ではなく、「解像度81928192の画面で見たマンデルブロ集合の次元」でしかない。どちらの性質を見ているのかを切り分けるには、答えを知っている何か——円やコッホ雪片——を同じ物差しで測ってみるしかない。それをやっていなかったら、私は1.09を集合の性質だと信じていたと思う。