mandelbrot

2022/09/24

このところハマっているマンデルブロの世界。


マンデルブロにハマっているのか、プログラミングにハマっているのか。とにかくそんなことで、今回は超拡大にチャレンジしてみた。


この拡大を動画にしているので、興味のある人は、以下のyoutubeを御覧ください。



フラクタルは何倍に拡大しても同じような画像


下の画像は渦巻きの一部を38溝倍(3.8×1033)という倍率にまで拡大したもの。画像を見ただけではこれが10倍なのか一兆倍なのか、38溝倍なのか区別がつかない。これがフラクタル!



参考:大きな数字(万から順に1万倍していった単位)

万(まん)、億(おく)、兆(ちょう)、京(けい、きょう)、垓(がい)、𥝱(じょ)、穣(じょう)、溝(こう)、澗(かん)、正(せい)、載(さい)、極(ごく)、恒河沙(ごうがしゃ)、阿僧祇(あそうぎ)、那由他(なゆた)、不可思議(ふかしぎ)、無量大数(むりょうたいすう)


繰り返し計算


マンデルブロは無限に拡大できるという。それならということで、プログラムを作成し、拡大して行くと、途中で図形がなまってくる。 


マンデルブロでは繰り返し計算をしてznが無限大になるかどうかを判定する。

zn+1=zn2+c

z0=0

とはいっても実際に無限回の計算はできないので、適当な回数、たとえば200回とかで打ち切っている。ところが拡大していくと、200回では発散せずにもっと大きな繰り返しで発散するというケースが多くなってくる。このため正確に描画するためには、この繰り返し数を大きくしていかねばならない。


今回の超拡大では一つの点について最大4700万回の繰り返し計算を行っている。このため、倍率を上げるとともに、計算時間がどんどん長くなっていく。今回の拡大では速く発散する領域を選択した。別の領域で同じことをしようとすると、一つの画像を描画するのに何時間も待たされることになる。


倍精度浮動小数点演算の限界


そして次の課題が計算誤差。拡大するということは、非常に小さな領域について計算することであるが、拡大率があまりに大きいと、画像の隣の点と区別ができなくなる。

倍精度浮動小数点の仮数部は52ビット。十進数では15桁しかない。拡大率が1015になると、画像全体について座標値が同じになって区別できなくなってしまう。1000x1000程度の画像を正確に描写するための拡大率は1012、つまり一兆倍程度が限界ということになる。


そこで一兆倍の限界を突破するために、マンデルブロ専用の数値クラスを作成した。2つのlong整数を使って小数点以下を120ビットまで表現できるようにしたのである。結果として、1033という拡大が可能となったが、その代償として計算時間が50倍以上もかかることになった。


最初に掲載した動画で、スムーズな拡大が一兆倍どまりなのはこのためである。それ以降は、専用数値クラスを使って演算したため、一枚の画像に5分も10分もかかり、動画にすることはできなかった。


渦巻きギャラリー


ということで一兆倍を超える渦をギャラリーにしてみた。

一兆倍


千兆倍


百京倍


十垓倍


一𥝱倍


千𥝱倍


百穣倍


十溝倍


38溝倍


この倍率がどれくらい大きいのか

兆、京、垓、𥝱、穣、溝などといってもピンとこない。

最初のマンデルブロの画像(下)の大きさが20cm程度だとして、38溝倍の画像の大きさがどれくらいか考えてみる。


この画像の大きさが20cm(0.2m)だとすると


この画像の大きさは、5.2×1035m

あまりに小さい。ものすごく小さいと思う電子の大きさは2.8×1015m。20桁も違う!

これだけ小さな長さとして思いつくのは、これ以上小さな距離はないとされるプランク長さの1.6×1035mである。

あまりにイメージがつかめないので、今度は逆に20cmのマンデルブロを38溝倍に拡大してみる。

その長さは7.6×1032m。光が一年で進む距離である一光年の長さが9.46×1015mなので、光年に換算すると8×1016光年

今の宇宙に入り切らない! 宇宙って意外に小さいのだ。