目標は、整数nが与えられた整数の範囲のビットを反転する関数またはプログラムを作成することです。言い換えると、インデックスがゼロの2 n個のアイテムの範囲のビット反転順列を検索する必要があります。これは、OEISシーケンスA030109でもあります。このプロセスは、FFTのインプレースCooley-Tukeyアルゴリズムなど、高速フーリエ変換の計算でよく使用されます。また、長さが2の累乗であるシーケンスのFFTの計算にも課題があります。
このプロセスでは、範囲[0、2 n -1] を反復処理し、各値をバイナリに変換し、その値のビットを反転する必要があります。各値を基数2のn桁の数値として処理します。つまり、反転は最後のnビットの間でのみ発生します。
たとえば、n = 3の場合、整数の範囲はです[0, 1, 2, 3, 4, 5, 6, 7]
。これらは
i Regular Bit-Reversed j
0 000 000 0
1 001 100 4
2 010 010 2
3 011 110 6
4 100 001 1
5 101 101 5
6 110 011 3
7 111 111 7
ここで、各インデックスiはビット反転を使用してインデックスjに変換されます。これは、出力がであることを意味します[0, 4, 2, 6, 1, 5, 3, 7]
。
0から4までのnの出力は次のとおりです。
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
パターンの形成に気づいたかもしれません。与えられたnは、あなたがのために前のシーケンスを取ることができ、N -1とそれを倍増します。次に、その二重リストを同じ二重リストに連結しますが、1ずつ増加します。示すために、
[0, 2, 1, 3] * 2 = [0, 4, 2, 6]
[0, 4, 2, 6] + 1 = [1, 5, 3, 7]
[0, 4, 2, 6] ⊕ [1, 5, 3, 7] = [0, 4, 2, 6, 1, 5, 3, 7]
ここで⊕
連結を表します。
ソリューションを形成するには、上記の2つの方法のいずれかを使用できます。より良い方法を知っていれば、それも自由に使用できます。正しい結果を出力する限り、どの方法でも問題ありません。
ルール
- これはコードゴルフなので、最短のソリューションが勝ちます。
- この課題を全体として解決する組み込み関数と、値のビット反転を計算する組み込み関数は許可されていません。これには、バイナリ変換またはその他のビット演算を実行する組み込み関数は含まれません。
- ソリューションは、少なくとも0〜31のnに対して有効でなければなりません。
0
代わりに印刷できますか、[0]
それともリストにする必要がありますか?
IntegerReverse[Range[2^#]-1,2,#]&
。(なぜ Mathematicaにその組み込みが必要なのかわかりませんが、それはそれほど奇妙ではないと思いSunset
ます...)