■この門くぐるべからず(その5)

 n次元立方体は,

  頂点数: 2^n,

  稜数:  2^(n-1)n,

  四角形数:2^(n-3)n(n−1)

からなっている.このうち,頂点は(±1,±1,・・・,±1)であるから,確かに2^n個あることがわかるだろう.

 今回のコラムでは,n次元立方体を2次元平面上に複数の頂点がなるべく重ならないように座標軸をとって,実際に描くことを試みたい.

===================================

 しかし,実際のプログラミングにあたっては,2^n個ある頂点すべてを作業用配列に積んで記録しておくようなダサイ手は避けたいと思う.その代わり,すべての頂点を重複なく,遺漏なく数え上げるために,2進数を用いることにした.

 たとえば,8ビットのデータがあって,それらのON/OFF状態が,

  (b7  b6  b5  b4  b3  b2  b1  b0 ) 

    1  0  1  1  0  0  1  0

という状態にあるとしよう.このとき,2進数10110010が,頂点

  (+1,−1,+1,+1,−1,−1,+1,−1)

あるいは

  (−1,+1,−1,−1,+1,+1,−1,+1)

に対応していると見なすことにすると,すべての頂点を重複も遺漏もなく数え上げることができるのである(4710,4720行).

 次に考えるべきことは,n次元立方体の各頂点からはn本の稜がでるということである.頂点

  (+1,−1,+1,+1,−1,−1,+1,−1)

の場合,稜の対蹠点の座標は

  (−1,−1,+1,+1,−1,−1,+1,−1)

  (+1,+1,+1,+1,−1,−1,+1,−1)

  (+1,−1,−1,+1,−1,−1,+1,−1)

  (+1,−1,+1,−1,−1,−1,+1,−1)

  (+1,−1,+1,+1,+1,−1,+1,−1)

  (+1,−1,+1,+1,−1,+1,+1,−1)

  (+1,−1,+1,+1,−1,−1,−1,−1)

  (+1,−1,+1,+1,−1,−1,+1,+1)

となる.

 したがって,ビットのON/OFF状態を検査して,bxビットだけを反転(0→1,1→0)できれば,稜を描くことが可能となるだろう.そのためにはビット演算を行うが,たとえば,b6ビットのON/OFF状態を検査するために,2進数

   0 1 0 0 0 0 0 0

(すなわち10進数で2^6)と対応するビット毎に論理積演算を行うと,

   1 0 1 1 0 0 1 0

   × × × × × × × ×

   0 1 0 0 0 0 0 0

   ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

   0 0 0 0 0 0 0 0

のように,上位ビットから下位ビットまですべてのビットが0になる.

 もし,b6ビットが1の2進数であれば,

   1 1 1 1 0 0 1 0

   × × × × × × × ×

   0 1 0 0 0 0 0 0

   ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

   0 1 0 0 0 0 0 0

のように0とはならないから,10進数の2^xとの論理積の関係を利用して,ビットの状態を判定することができるというわけである(+1→−1,−1→+1の反転).

 このようにして2^n個の頂点からでるすべての稜を求めることができる.ひとつの稜を2回ずつなぞることになるが,それくらいの無駄は許容範囲であろう.

===================================