長さ n のすべてのビット配列のセットを考えてみましょう。ここで、このセットからこのセットにマップされるすべての 1 対 1 関数のセットを考えます。
次に、後者のセットから 1 つの関数を選択します。この関数を実装する「最小限の」方法を見つけるアルゴリズムはありますか? AND OR XOR NOT や左右のビットシフトなどの基本的なビット配列演算子にしかアクセスできないと仮定します。
ご参考までに、これが必要な理由は、ビットの z 曲線順序からビットのヒルベルト曲線順序に変換するアルゴリズムを作成しているためです。私の現在の方法はルックアップ テーブルを作成することですが、もっと良いオプションがあるに違いありません。
簡単な例として、次のような真理値表があるとします。
00 -> 10
01 -> 01
10 -> 00
11 -> 11
input
次に、入力ビット文字列が与えられた場合、出力ビット文字列output
は(Java構文で)あると推測できるはずです
output = ((~input) << 1) ^ input
この場合の証明は次のとおりです。
00 -> 11 -> 10 -> 10
01 -> 10 -> 00 -> 01
10 -> 01 -> 10 -> 00
11 -> 00 -> 00 -> 11