de Bruijn 시퀀스를 사용하여 정수


11

숀 앤더슨 공개 비트 해킹 만지작 찾을 에릭 콜의 알고리즘을 포함 ⌈log2⁡v⌉ 의 N 비트 정수 v 에서 O(lg⁡(N)) 룩업 곱셈과 함께 동작한다.

이 알고리즘은 De Bruijn 시퀀스의 "마법"숫자를 사용합니다. 아무도 여기에 사용 된 시퀀스의 기본 수학 속성을 설명 할 수 있습니까?

uint32_t v; // find the log base 2 of 32-bit v
int r;      // result goes here

static const int MultiplyDeBruijnBitPosition[32] = 
{
  0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
  8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};

v |= v >> 1; // first round down to one less than a power of 2 
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;

r = MultiplyDeBruijnBitPosition[(uint32_t)(v * 0x07C4ACDDU) >> 27];

2
아이디어는이 논문 supertech.csail.mit.edu/papers/debruijn.pdf 에서 나옵니다 . 크기의 디 Brujn 서열 크기의 모든 비트 열을 표현하는 방법은 K를 매우 간결 각 가능한 문자열 연속 시퀀스로서 회만 나타난다. 따라서 de Bruijn 시퀀스를 n ≤ 2 k 비트만큼 이동하고 마지막 k 비트를 읽으면 n에 대한 고유 식별자가 있습니다. 2kkn≤2kkn
— Sasho Nikolov

1
그런데 이것은 만 계산합니다 . 작성된대로 32 비트 정수에서만 작동합니다. ⌈log2⁡v⌉
— Sasho Nikolov

1
@Sasho 답으로 바꾸시겠습니까?
— Yuval Filmus

@SashoNikolov 감사합니다, 질문에 천장 기능을 추가했습니다
— Yury Bayda

답변:


9

알고리즘은 ⌈ log 2 v ⌉ 만 계산 하고 코드를 작성할 때 32 비트 단어에 맞는 v에 대해서만 작동합니다 .⌈log2⁡v⌉v32

가장 먼저 나타나는 시프트 및 / 또는 시퀀스에는 선행 1 비트 최하위 비트까지 전파하는 기능이 있습니다. 수치 적으로, 이것은 2 ⌈ log 2 v ⌉ − 1을 제공 합니다.v2⌈log2⁡v⌉−1

흥미로운 부분은 Leiserson, Prokop 및 Randall의 논문에서 나온 Bruijn 트릭입니다 (MIT 교수는 비트 해킹을하는 데 시간을 보냅니다). 브루 인 시퀀스 에 대해 알아야 할 것은 가능한 한 압축 된 방식으로 주어진 길이의 모든 가능한 시퀀스를 나타냅니다. 정확하게, 알파벳 에 대한 브루 인 시퀀스 는 길이가 2 k 인 이진 문자열 s 이므로 각 길이 k 이진 문자열은 연속 서브 스트링으로 정확히 한 번만 나타납니다 (랩이 허용됨). 이것이 유용한 이유는 X 가 있다면{0,1}s2kkX그 비트 표현이다 드 브루 인 서열 (패딩 제로)이면 상위 k 개의 비트 2 나 X가 고유하게 식별 I를 (만큼 I < K ).kk2나는엑스나는나는<케이


3
이 방식으로 어떤 드 브루 인 시퀀스를 사용할 수 있음을 참고 계산하기 위해 주어진 이에게 난을 . 그러나 계산 브루 순서 드 임의 사용할 수 없습니다 내가 주어진 2 전 - 1 . 여기 0x07C4ACDD = 00000111110001001010110011011101는 추가되는 추가 등록, 감사와 드 브루 인 순서 것 같다 - (1) 이 방법을 파괴하지 않습니다. i2ii2i−1−1
— Jukka Suomela

@ JukaSuomela에게 감사드립니다. 나는 그것에 대해 약간 혼란 스러웠습니다. 그래도 항상 에 1을 추가 할 수 있다고 생각합니다 . V
— Sasho Nikolov

5

씨

  • 씨

    11111011100110101100010100100000
    
  • 2나는⋅씨나는=0,1,...,31

    00000100011001010011101011011111
    00001111101110011010110001010010
    
  • (2나는+1−1)⋅씨나는=0,1,...,31

    00000111110001001010110011011101  (07C4ACDD)
    10000111110001001010110011011101
    01111000001110110101001100100011
    11111000001110110101001100100011
    

빠른 실험을 기반으로 한 몇 가지 관찰 (이것이 옳았기를 바랍니다) :

  1. X 유형의 정수는 65536입니다.

  2. X + Y 유형의 정수는 4096 개입니다. 이들은 정확히 '0000 ...'시퀀스로 시작하는 X 유형의 정수입니다.

    • 직감 : 선행 0, 회전 = 이동?
  3. X + Y + Z 유형의 256 개 정수가 있습니다. 이들은 정확히 '0000011111 ...'시퀀스로 시작하는 X 유형의 정수입니다.

    • 직감 : ??
  4. Y 유형의 모든 정수도 X 유형입니다.

  5. 그러나 X 유형이나 Y 유형이 아닌 Z 유형의 정수도 768 개입니다. 이들은 '1000011111 ...', '0111100000 ...'또는 '1111100000 ...'으로 시작합니다.


1
이것은 단지 2 ^ n과 반대로 De Bruijn과 2 ^ n-1의 곱셈이 작동하는 이유를 다루는 유일한 대답입니다. 누군가 위의 # 3의 "직관"을 확장 할 수 있다면 좋을 것입니다. 에릭 콜은 어떻게이 일을 했습니까? 시행 착오? 또는 2 ^ n-1을 곱하면 실제로 비트에 어떤 일이 발생하는지 이해하고 있습니까?
— FarmerBob

1
  • 이 상수는 어디에서 오는가?

인용 : "2009 년 12 월 10 일, Mark Dickinson은 v를 2의 거듭 제곱이 아니라 다음 2의 거듭 제곱보다 1보다 작게 반올림하여 몇 가지 작업을 줄였습니다." [graphics.stanford.edu/~seander/bithacks.html]

이 Particullar 상수는 이진 알파벳이지만 추가 속성을 가진 De Bruijn 시퀀스입니다. 이 특별한 DB 시퀀스없이 원래 알고리즘을 구현할 수 있기 때문에 이것을 'Marc Dickinson Property'라고 부를 것입니다. 2 개의 추가 작업을 추가하면 일반적인 DB 시퀀스를 사용할 수 있습니다. 조작 : v ^ = (v >> 1); // 계단식 또는 시프트 후 설정된 MSB를 제외한 모든 비트를 clr합니다.

  • 결과 (bruteforce)

시퀀스 타입 | 아니요. 정수 | 아니요. DBSeq. 와 | 회전없이 | 디킨슨 속성
B 와 함께 (2, 3) | 256 | 16 | 2 | 1
B (2, 4) | 64Ki | 256 | 16 | 4
B (2, 5) | 04 기 | 64Ki | 02 기 | 256
B (2, 6) | 16Ei | 04 기 | 64Mi | ??

  • 특별한 재산

0엑스7씨4ㅏ씨디디 ※2케이1(모드232)2 k 132≥케이≥1여기에 이미지 설명을 입력하십시오2케이1

  • Dickinson 속성이있는 사 전적으로 가장 작은 이진 de Bruijn 시퀀스

    [B (2,3) : 0x1D] [B (2,4) : 0x0F2D] [B (2,5) : 0x7C4ACDD] [B (2,6) : 계속 검색]

당신이 그것들 또는 그와 유사한 것을 만들어 내기 위해 그것들이나 정리를 설명하기 위해 우아한 수학 공식을 원한다면, 이것이 숫자 이론과 아마도 내 기술 범위를 벗어난 다른 분야에 대한 깊은 통찰력이 필요할 것이라고 생각합니다. 내가 야생의 추측을 할 수있는 곳이라면 셀룰러 오토 마타에 의해 생성 될 수 있다고 생각합니다. 이것은 왜 대답이 아닙니까? 엄격한 기반을 가지고 있지만 그것이 왜 작동하는지 왜 제대로 작동하는지 직관적으로 이해하려고 노력하므로 안심하고 사용할 수 있습니다.

추신 : 나는 LUT 구조를 다루지 않았는데, 알고리즘의 작동 원리를 이해하면 쉽게 추론됩니다.


마지막으로 발견 : B (2,6) 0x3f08a4c6acb9dbd- 'dickinson 속성'이있는 64 비트 de bruijn 시퀀스. 나는 적어도 122K의 그러한 서열을 발견했다.
— FranG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.