
シェルピンスキーの三角形は何次元か。「1.58次元」を自分のコードで実測する
直線は1次元、平面は2次元。次元とは整数である——と、特に疑ったことがなかった。でもフラクタルの世界には「1.58次元」のような中途半端な次元を持つ図形が存在するという。有名なシェルピンスキーの三角形だ。
次元が整数でないとはどういうことか。そして、その「1.58」は本当に測れるのか。理屈を読むだけでは腑に落ちなかったので、生成から測定まで全部自分のコードでやってみた。
結果は1.568。理論値1.585に対して、0.017ずれた。
最初はこのズレを「点の数もマス目の細かさも有限だから」と説明して済ませていた。もっともらしいが、確かめてはいなかった。後から確かめたら、その説明は間違っていた。0.017の出どころは、測られるシェルピンスキーの三角形の側ではなく、それを測る方眼紙の側にあった。
実験に使ったコードの全文はGitHubに置いています。
2026-08-22 追記: 誤差0.017の原因を追跡する実験(
step3_alignment.py)を追加し、記事の後半を書き直した。当初書いていた「有限の点数・解像度の限界」という説明は誤りだったので、その訂正も含んでいる。
カオスゲーム: サイコロを振るだけで三角形が生まれる
シェルピンスキーの三角形の生成法として、一番不思議なのが「カオスゲーム」だ。ルールはこれだけ。
- 三角形の頂点を3つ決める
- 適当な点から出発する
- サイコロで頂点をランダムに1つ選び、今の点とその頂点の中点に移動して、点を打つ
- 3を延々繰り返す
完全にランダムな手続きなのに、点を打ち続けるとこうなる。

200万点打った。乱数で動き回っているだけの点が、なぜか整然とした入れ子模様を描く。どの点も「穴」の領域には決して入れない(中点移動というルールが、穴に入る軌道を持たない)ためで、ランダムさは模様を壊すのではなく、模様の上をまんべんなく訪れるための手段になっている。「ランダム=無秩序」という直感は、ルール付きのランダムには通用しない。
できあがった三角形は、どこまで拡大しても同じ模様が現れる。

次元を「測る」とは、方眼紙を半分にすること
「次元を測る」と言われても、最初は何をすればいいのか分からなかった。box-counting(ボックスカウント)法という手続きが、その答えになっている。やることは、方眼紙の塗り絵だ。
- 図形の上に方眼紙を重ねる
- 図形が通っているマスを塗って、塗ったマスの数を数える
- マス目を半分の大きさにして、もう一度塗って数える
- 塗るマスは、何倍に増えたか
この「何倍」が次元の正体になる。
直線で考える。マス目を半分にすると、直線が通るマスはちょうど2倍になる。長さ方向にだけ分割が増えるからだ。
塗りつぶした正方形なら、マス目を半分にすると縦が2倍・横が2倍で、4倍になる。
つまり「2倍なら1次元、4倍なら2次元」。この2つをまとめて言い直すと、次元 の図形は、マス目を半分にすると 倍になる。 なら2倍、 なら4倍で、ちゃんと合っている。
ここで大事なのは、逆から読めることだ。何倍になったかを測れば、 が決まる。
では、3倍だったら何次元か。 を満たす を求めればよくて、。整数である必然性は、どこにもなかった。
そしてシェルピンスキーの三角形は、まさに3倍になるはずの図形だ。作り方を思い出すと、大きい三角形1つが、半分のサイズの三角形3つでできている。スケールを半分にすると、自分のコピーが3個。だから理論値は1.585になる。
ここで、次元の見方が一つ変わった。次元とは部屋の縦・横・高さのような「その図形がもともと持っている数」ではなく、物差しの目盛りを細かくしたとき、見える量がどう増えるかという応答だった。海岸線の長さが物差しの細かさで変わってしまう話(海岸線パラドックス)も、同じ現象の別の顔だ。複雑さは「量」ではなく「増え方」に宿っている。
まず、答えの分かっている図形で物差しを確かめる
いきなりシェルピンスキーを測っても、出てきた数字が正しいのか判断できない。なので答えを知っている図形を、同じコードに通すことから始めた。直線(1.0のはず)、塗りつぶした正方形(2.0のはず)、そしてもう1つのフラクタルであるコッホ曲線( のはず)。

結果: 1.568 (理論値1.585)
4×4から256×256までのマス目で数え上げ、log-logプロットの傾きを最小二乗で求めた。

| 図形 | 実測 | 理論 | 誤差 |
|---|---|---|---|
| 直線 | 0.970 | 1.000 | 0.030 |
| 塗りつぶし正方形 | 1.939 | 2.000 | 0.061 |
| コッホ曲線 | 1.255 | 1.262 | 0.007 |
| シェルピンスキー | 1.568 | 1.585 | 0.017 |
シェルピンスキーの三角形は、確かに1と2の間にいた。マス目を細かくしていくと、直線より速く、平面より遅くマスが増えていく。「線で描かれているのに、線よりは平面寄りの埋まり方をする」という中間的な存在であることが、傾きという形でそのまま数字になった。
ただし、4つとも理論値より少しずつ小さい。この記事は当初、ここを「点の数もマス目の細かさも有限なので、細かいスケールでは図形の隙間を拾いきれないため」と説明して終わっていた。
以下は、その説明が正しいかどうかを後から確かめた記録になる。
その0.017は、どこから来たのか
犯人の候補を4つ立てて、1つずつ潰していく。
候補1: カオスゲームの乱数のブレ
点をランダムに打っているのだから、たまたま今回のサイコロの目で1.568が出ただけかもしれない。乱数のシードを10通り変えて測り直した。
平均1.5645、標準偏差0.00028。幅は1.5638〜1.5648に収まった。
理論値との差0.02に対して、ブレは2桁小さい。何度やっても、きれいに同じだけずれる。偶然ではなく、毎回同じ方向に押されている。
候補2: 点の数が足りない
| 点の数 | 実測 | 誤差 |
|---|---|---|
| 2万 | 1.5234 | 0.0616 |
| 20万 | 1.5626 | 0.0224 |
| 400万 | 1.5684 | 0.0166 |
増やせば近づく。ただし20万点あたりで頭打ちで、そこから20倍に増やしても0.017は残った。
候補3: マス目が粗い
| 使ったマス目 | 実測 | 誤差 |
|---|---|---|
| 4×4 〜 256×256 | 1.5684 | 0.0166 |
| 4×4 〜 1024×1024 | 1.5701 | 0.0149 |
| 4×4 〜 4096×4096 | 1.5675 | 0.0174 |
16倍細かいマス目まで使っても、動かない。近づくどころか、上下にふらついているだけだ。
3つとも外れた。「有限だから」という当初の説明は、有限性を実際に減らしても症状が消えないので、成り立たない。
候補4: 三角形と方眼のズレ
残ったのは、測られる側ではなく測る側だ。
方眼紙のマス目は正方形で、縦と横に走っている。一方、私が測っていたシェルピンスキーの三角形は正三角形で、その斜辺は方眼に対して斜めに走っている。
方眼に辺を揃えて置き直したら、ぴったり合った
シェルピンスキーの三角形は、正三角形で描かなければいけない決まりはない。直角二等辺三角形——正方形の左下・右下・左上を頂点にした三角形——でも、まったく同じ規則で同じ入れ子模様ができる。そしてこの形なら、三角形の辺が方眼の線の上に乗る。
カオスゲームも、box-countingのコードも、点の数もそのまま。三角形の頂点座標だけを変えて測り直した。

16×16の方眼で塗れたマスは、81。理論の と一致した。正三角形のほうは106マスで、25マスも余分に塗っている。
図を見ると理由が分かる。正三角形の斜辺は方眼に対して斜めなので、小さい三角形1つが2つ3つのマスにまたがってしまう。まだ図形が来ていないところまで塗ってしまうわけだ。直角二等辺のほうは辺が方眼の線に乗っているので、はみ出しがゼロになる。
マス目を細かくしても、はみ出しは消えなかった。
| マス目 | 4×4 | 8×8 | 16×16 | 32×32 | 64×64 | 128×128 | 256×256 |
|---|---|---|---|---|---|---|---|
| 理論 () | 9 | 27 | 81 | 243 | 729 | 2187 | 6561 |
| 正三角形 | 12 | 36 | 106 | 310 | 900 | 2763 | 8304 |
| 直角二等辺 | 9 | 27 | 81 | 243 | 729 | 2187 | 6561 |
下の行は、理論値と1つも違わない。9, 27, 81, 243, 729, 2187, 6561。ちょうど3倍ずつ増えている。
前の節で「シェルピンスキーはマス目を半分にすると3倍になるはず」と書いたが、それが整数の列としてそのまま出てきた。傾きを取ると1.5850で、理論値1.584963との誤差は0.0000。

下のグラフが一番はっきりしている。塗れたマス数を理論の で割った比を、マス目の細かさごとに並べたものだ。直角二等辺(青)は1.000に完全に貼りついたまま動かない。正三角形(赤)は1.21〜1.33のあたりを漂っていて、マス目を細かくしても1.0には降りてこない。
ついでに、正三角形を別の位置に置いただけのもの(黄)も測った。形は同じで場所だけ変えると、今度は比が1.48まで上がり、次元は1.6141と理論値より大きく出る。誤差の向きすら、置き方で変わってしまう。
上のグラフも面白い。3本とも同じくらいきれいな直線に乗っていて、目で見ただけではどれが正しいのか分からない。傾きの違いは、数字にして初めて見える。
0.017はシェルピンスキーの三角形の性質ではなかった。三角形と方眼紙の間の、角度の話だった。
較正用の直線と正方形も、同じ原因だった
そうなると、直線の0.030と正方形の0.061も怪しい。あの4図形は全部、単位正方形の中に少し余白をとって 0.05 から 0.95 の範囲に置いてあった。方眼の端と合っていない。
端を 0 から 1 に揃えるだけで、測り直してみる。
| 図形 | 0.05〜0.95 (当初) | 0〜1 (方眼に整列) | 理論 |
|---|---|---|---|
| 直線 | 0.9696 | 1.0000 | 1.0 |
| 塗りつぶし正方形 | 1.9391 | 2.0000 | 2.0 |
こちらも誤差が消えた。塗れたマス数を見ると、直線は 4, 8, 16, 32, 64, 128, 256 とちょうど2倍ずつ、正方形は 16, 64, 256, 1024, 4096, 16384, 65536 とちょうど4倍ずつ。最初の節で「直線は2倍、正方形は4倍」と書いた通りの数列が出てくる。
当初「4つとも理論より小さいのは有限だからだ」と一括りにしていたズレのうち、直線・正方形・シェルピンスキーの3つは、同じ1つの原因だった。図形を方眼の外枠に合わせていなかった、それだけ。
揃えれば必ず合う、というわけでもない
では「方眼に揃えれば正しい値が出る」のかというと、そう単純でもなかった。
三角形も置き方もそのまま(直角二等辺・方眼に整列)にして、マス目の刻み方だけを変えてみる。半分ずつ細かくするのをやめて、1/3ずつにする。3×3、9×9、27×27、81×81…と数えていく。
結果は1.6345。誤差0.05で、正三角形で測ったときよりむしろ悪い。塗れたマスも42, 273, 1581, 9760と、きれいな整数列にはならなかった。
つまり効いていたのは「三角形の向きを揃えたこと」そのものではない。シェルピンスキーの三角形が半分ずつ縮む図形で、方眼も半分ずつ細かくしていたから、両者の刻みが噛み合った、ということだった。
では1/3ずつ縮むコッホ曲線を、1/3刻みの方眼で測れば揃うのか。試したが、揃わない(1/2刻みで1.2962、1/3刻みで1.3421と、むしろ悪化した)。コッホ曲線は線分が60度に走っていて、どの方眼とも平行にならないからだ。刻みが合っても、向きが合わなければ届かない。
4図形のうち残ったコッホ曲線の誤差0.007が、実は4つの中で一番小さかったのは、揃っていたからではなく偶然だったことになる。
同じ物差しで、マンデルブロ集合は直せなかった
このシリーズではマンデルブロ集合の境界次元も同じbox-countingで測っている。理論値は2(1998年に証明されている)なのに、実測は1.090。誤差0.9という、桁違いのズレだった。
同じ物差しなのに、なぜシェルピンスキーは直せて、マンデルブロは直せないのか。
あちらの記事で解像度を256倍・反復回数を4,000倍にしても値が動かなかった理由は、次元を担っている枝が1画素より細いことだった。マンデルブロ集合の境界の複雑さは、画面の解像度より下の階層にある。方眼をどう置き直しても、マス目より細いものは数えられない。
対してシェルピンスキーの三角形は、測っているスケール全部に構造がある。16×16の方眼にも81マスぶんの模様が、256×256の方眼にも6561マスぶんの模様が、ちゃんと乗っている。だから方眼の置き方を直すだけで届いた。
同じ「理論値に届かない」でも、物差しを直せば届くズレと、答えが物差しの目盛りより細かいところにあって原理的に届かないズレは、別物だった。
この実験で言えないこと
3つ、正直に線を引いておく。
「正三角形では測れない」という話ではない。box-counting次元は、理論上はアフィン変換(伸ばす・傾ける)で変わらないことが知られている。だから正三角形の配置でも、マス目を無限に細かくしていけば1.585に行き着くはずだ。ただし今回測れた 2048×2048 分割の時点で、比はまだ1.21で動き続けていた。「有限のスケール範囲で測る限り」という条件つきの話として読んでほしい。
誤差0.0000は「刻みが噛み合った」ご褒美であって、精度が上がったわけではない。直角二等辺の測定が返しているのは、実質「 を数えました」に近い。むしろ噛み合っていないときに何が起きるか(1.5684、1.6141、1.6345)のほうが、次元測定という行為の実態をよく表している。
答えを知らない図形では、この検算はできない。今回「合った」と判定できたのは、理論値1.585を先に知っていたからだ。未知の図形の次元を測るときに手元に残るのは、「値は方眼の置き方と刻みでこれだけ動く」という事実のほうになる。だからマンデルブロの記事でやったように、答えの分かっている図形を同じコードに通して較正する手順から離れられない。
測っていたのは三角形ではなく、三角形と方眼紙の関係だった
この記事は当初、1.568という値を出して「有限だから少しずれる」で終わっていた。もっともらしい説明だったし、ズレも小さかったので、それ以上疑わなかった。
でも0.017は、方眼紙を斜めに使ったことの責任を、三角形のほうに押しつけていた数字だった。置き方を直したら誤差は0.0000になり、しかも塗れたマスが9・27・81・243と、理論の「3倍ずつ」がそのまま整数で並んだ。ズレていたのは対象でも物差しでもなく、対象と物差しの間だった。
仕事の複雑さにも似たところがある。遠目には単純に見えるのに、ズームするたびに同じ密度でタスクが湧いてくるプロジェクトがある。あれはたぶん1次元の仕事ではなくて、1.5次元くらいの仕事なのだ。どこまで拡大しても構造が尽きないものに対しては、「全部数え上げてから着手する」戦略は原理的に破綻する。どの解像度で切り上げるかを先に決めるほうが正しい。
ただ今回いちばん効いたのは、そこではなかった。もっともらしい説明を1つ思いついた時点で、確かめるのをやめてしまったことのほうだ。「有限だから」は正しそうに聞こえたし、実際そういう現象も存在する。だから疑わなかった。潰してみたら3つとも違って、残った1つは自分がコードに書いた頂点座標だった。
このブログでは、機械学習の仕組みを実際にコードで実装して確かめた実験をテーマ別に整理しています(拡散モデル・Transformer・強化学習・多様体学習・過学習など)。


