Su objetivo es crear una función o un programa para invertir los bits en un rango de enteros dado un entero n . En otras palabras, desea encontrar la permutación de inversión de bits de un rango de 2 n elementos, indexados a cero. Esta es también la secuencia OEIS A030109 . Este proceso a menudo se usa en la computación de transformaciones rápidas de Fourier, como el algoritmo Cooley-Tukey en el lugar para FFT. También hay un desafío para calcular la FFT para secuencias donde la longitud es una potencia de 2.
Este proceso requiere que itere sobre el rango [0, 2 n -1] y que convierta cada valor en binario e invierta los bits en ese valor. Tratará cada valor como un número de n dígitos en la base 2, lo que significa que la inversión solo ocurrirá entre los últimos n bits.
Por ejemplo, si n = 3, el rango de enteros es [0, 1, 2, 3, 4, 5, 6, 7]
. Estos son
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
donde cada índice i se convierte en un índice j usando la inversión de bits. Esto significa que la salida es [0, 4, 2, 6, 1, 5, 3, 7]
.
La salida para n de 0 a 4 son
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Es posible que haya notado que se forma un patrón. Dado n , puede tomar la secuencia anterior para n -1 y duplicarla. Luego concatena esa lista duplicada a la misma lista doble pero incrementada en una. Mostrar,
[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]
donde ⊕
representa la concatenación.
Puede utilizar cualquiera de los dos métodos anteriores para formar su solución. Si conoce una mejor manera, también puede usarla. Cualquier método está bien siempre que genere los resultados correctos.
Reglas
- Este es el código de golf, por lo que gana la solución más corta.
- No se permiten las construcciones que resuelven este desafío como un todo y las construcciones que calculan la inversión de bits de un valor. Esto no incluye las incorporaciones que realizan la conversión binaria u otras operaciones bit a bit.
- Su solución debe ser, como mínimo, válida para n de 0 a 31.
0
lugar de [0]
o tiene que ser una lista?
IntegerReverse[Range[2^#]-1,2,#]&
. (No sé por qué Mathematica necesita esa función, pero supongo que no es mucho más raro queSunset
...)