以前の記事で書いたように、ドラゴン曲線を4つの方向に伸ばすと、それにより平面を覆うことができる。具体的には、平面を座標軸に平行な直線で区切って格子を作るときに、隣接格子点を結ぶ線分をどれもちょうど1回だけ通るように、4つの曲線を伸ばしていくことができる。こんな風に。
ドラゴン充填1
このことを証明したい。それには、この形式だと具合が悪いので、
ドラゴン充填2
座標軸はこのように取り、原点から4つの方向に伸ばすとする。長さについては軸との交わりが偶数の整数点
という点の全体が1対1に対応することを示せば証明が終わる。すなわち、このような点は必ずいずれかのドラゴン曲線のいずれかのセグメントの中点であり、その表し方は一通りしかないことを言えばよい。
ドラゴン曲線は方向列
のように変化していくもの。数字はモジュロ
である。すなわち逆にたどって
作品ページ
ソースコード:
let a = 0;
let b = 0;
let f = 0;
const SEG_SIZE = 40;
let palette = [[255, 255, 255], [120, 120, 255], [120, 255, 120], [255, 120, 120]];
function setup(){
createCanvas(640, 640);
background(0);
strokeWeight(2);
}
function draw(){
translate(320, 320);
let e = f & 1;
let h = 1;
while(f >= h){
if(!(f & h) && (f & (h * 2))){ e += 2; }
h *= 2;
}
c = SEG_SIZE * cos(e * PI / 2 - PI / 4);
s = SEG_SIZE * sin(e * PI / 2 - PI / 4);
let r = 4;
while(r--){
rotate(PI / 2);
stroke(...palette[r]);
line(a, b, a + c, b + s);
}
a += c;
b += s;
f++;
}
逆にたどって
説明
これらの
この点を中心にそれまでの部分を
に移る。特に
になる。だから区切り点は
この白いドラゴン曲線のセグメントの中点の座標をこれから調べる。最初は
回転の中心を
を繰り返し適用する。
最初は
次の基準点は
次の基準点は
次は
ただし
これらはすべて
ただし
原点から
ここに
であり、
示すことは、すべての奇数点:
がこの形式で書けて、その書き方が一意であることである。
このままだと証明しづらいのでちょっといじる。
一意性の証明。帰納法による。
だとする。まず両辺に
だから、
となる。
と書ける。これよりモジュロ
となる。このことからどっちかの
次に、たとえば
となるが、
これを繰り返す。すると、
次を示す。
複素数
このとき、
まず
とおくと、
が取れる。このうち実部と虚部のパリティが異なるものが同値となるのはもちろん後者
と書けて、
と書ける。これより、
だから、あとは
なお、
任意の
ただし
次のように示される:
を満たす整数組
最後に
注意:ガウス整数
もまた目的の表示で書ける。証明は容易。
とでき、いずれもドットの後ろを表記で書き換えればよい。次に、
とできるから成り立つ。
はじめに
なので
次にパリティが異なるとき。この場合
のように書ける。ここで、
だから、
において
を適用して
ここで
多分うまくいったのはガウス整数環