C++ でのブルート フォース アプローチ O(2^(2k)):
int n = 32 // or any other power of 2
for(int i = 0; i < n; i++){
// we check with which vertices is it connected
for(int j = 0; j < i; j++){
// we stop when j >= i, because we want to output each unordered pair once
int u = i ^ j;
// we check if U is a power of 2, by rounding it up to next power of two and
// checking if it changed
int k = u - 1;
k |= k >> 1;
k |= k >> 2;
k |= k >> 4;
k |= k >> 8;
k |= k >> 16;
if(k + 1 == u)
cout << i << " " << j << endl;
}
}
より高速なソリューションが必要な場合は、再帰を試すことをお勧めします。これは、ハイパーキューブの構造自体が再帰的であるためです。n 次元のハイパーキューブは、1 つの座標のみが異なる 2 つの n-1 次元のハイパーキューブから作成されます。正方形を例にとると、正確に 1 つの座標が異なる 2 つのセグメント (1 次元) で構成されます。
再帰的なソリューションのアルゴリズムは、多かれ少なかれ次のようになります (python):
# outputs pair (list of vertices, list of connections beetween them), for n
# dimensional hypercube with vertices starting at x
def hypercube(n, i):
if n == 1:
return (i, [])
v1, e1 = hypercube(n-1, i)
v2, e2 = hypercube(n-1, i + len(v1))
return(v1 + v2, zip(v1, v2) + e1 + e2)