ルービックキューブの状態を表すために必要な最小ビット数を決定しようとしています。 (編集:キューブは変更されていない有効なルービックキューブであり、有効な回転のみが実行されていると想定しています。また、面は均一で均一な色であると想定しています。センターキューブレットの回転に関係します。)
コーナーについては、8つのコーナー(3ビット)のどれであるか、回転(3つのオプション-> 2ビット)と位置(6つの側面-> 3ビット)を知る必要があります。
エッジについては、12(4ビット)、回転(2オプション-> 1ビット)、位置(6サイド-> 3ビット)のどれを知る必要があります。
真ん中の色に基づいて場所を指定した場合、すべてが中心を基準にしているため、真ん中の部分をまったく追跡する必要はありません。
コーナー:8 x(3b + 2b + 3b)= 64ビット
エッジ:12 x(3b + 1b + 3b)= 84ビット
合計:148ビット
別の方法は、20の配列で所定の順序を持つことです(最初の8はコーナー、最後の12はエッジ)。それぞれがどの部分(5ビット)と回転(コーナーに2ビット、エッジに1ビット)を知る必要があります。
コーナー:8 x(3b + 2b)= 40ビット
エッジ:12 x(4b + 1b)= 60ビット
合計:100ビット
8つのコーナーのうち7つがわかっている場合は、最後のコーナーを推測できます。エッジについても同じ...
コーナー:7 x(3b + 2b)= 35ビット
エッジ:11 x(4b + 1b)= 55ビット
合計:90ビット
これをさらに減らす方法はありますか?
編集済み:キューブの状態を表す方法を示すWebサイトを見つけましたが、この方法を使用するために必要なビット数がわかりません。実際のウェブサイトはダウンしているように見えますが、インターネットアーカイブにはここにあります。 https://web.archive.org/web/20190706141807/http://kociemba.org/cube.htm
8をエンコードできます! 16ビットでのコーナーの可能な順列、そして12ビット! 1から8までの順列に番号を付けることにより、29ビットで可能な順列! (または1から12!)、および番号を格納します。 Lehmerコード を使用して、このエンコーディングを効率的にする方法の説明 here を見つけました。
同様に、コーナーの3 ^ 8 = 6561方向を13ビットにパックできます(「無効な」キューブを格納できるようにしたいと思います)。エッジの2 ^ 12方向には12ビットが必要です。これを減らす方法はありません。合計すると、これは
16 + 29 + 13 + 12 = 70 bits
これは理論的に可能なものより1ビットだけ多くなります。ピジョンホールの原理は、ビットの総数を下回ることはできないことを示しています
log_2(8! * 12! * 3^8 * 2^12) = 68.814 ...
これは、69ビットが理論的に最小の値であることを意味します。これは、順列の4つのグループすべてを1つの69ビット値にエンコードすることで実現できます。
注:キューブの「有効な」順列のみを保存したい場合、3 ^ 7の有効なコーナー方向、2 ^ 11の有効なエッジ方向、および8!/ 2のみの有効なコーナー順列があります。
log_2(8!/2 * 12! * 3^7 * 2^11) = 65.22 ...
したがって、この場合、66ビットが可能な最小値です。